diff -Nru matplotlib-0.99.3/agg24/include/agg_rasterizer_cells_aa.h matplotlib-1.0.1/agg24/include/agg_rasterizer_cells_aa.h --- matplotlib-0.99.3/agg24/include/agg_rasterizer_cells_aa.h 2009-07-31 15:14:43.000000000 +0000 +++ matplotlib-1.0.1/agg24/include/agg_rasterizer_cells_aa.h 2010-12-13 15:27:29.000000000 +0000 @@ -29,16 +29,15 @@ #ifndef AGG_RASTERIZER_CELLS_AA_INCLUDED #define AGG_RASTERIZER_CELLS_AA_INCLUDED +#include "CXX/Exception.hxx" #include #include #include #include "agg_math.h" #include "agg_array.h" - namespace agg { - //-----------------------------------------------------rasterizer_cells_aa // An internal class that implements the main rasterization algorithm. // Used in the rasterizer. Should not be used direcly. @@ -185,10 +184,8 @@ if((m_num_cells & cell_block_mask) == 0) { if(m_num_blocks >= cell_block_limit) { - /* If this exception is thrown too often, one can - increase cell_block_limit */ - throw "Agg rendering complexity exceeded. " - "Consider downsampling or decimating your data."; + throw Py::OverflowError( + "Agg rendering complexity exceeded. Consider downsampling or decimating your data."); } allocate_block(); } diff -Nru matplotlib-0.99.3/agg24/include/agg_scanline_u.h matplotlib-1.0.1/agg24/include/agg_scanline_u.h --- matplotlib-0.99.3/agg24/include/agg_scanline_u.h 2009-07-31 15:14:43.000000000 +0000 +++ matplotlib-1.0.1/agg24/include/agg_scanline_u.h 2010-07-07 01:41:53.000000000 +0000 @@ -2,8 +2,8 @@ // Anti-Grain Geometry - Version 2.4 // Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) // -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. +// Permission to copy, use, modify, sell and distribute this software +// is granted provided this copyright notice appears in all copies. // This software is provided "as is" without express or implied // warranty, and with no claim as to its suitability for any purpose. // @@ -13,12 +13,12 @@ // http://www.antigrain.com //---------------------------------------------------------------------------- // -// Adaptation for 32-bit screen coordinates (scanline32_u) has been sponsored by +// Adaptation for 32-bit screen coordinates (scanline32_u) has been sponsored by // Liberty Technology Systems, Inc., visit http://lib-sys.com // // Liberty Technology Systems, Inc. is the provider of // PostScript and PDF technology for software developers. -// +// //---------------------------------------------------------------------------- #ifndef AGG_SCANLINE_U_INCLUDED @@ -32,22 +32,22 @@ // // Unpacked scanline container class // - // This class is used to transfer data from a scanline rasterizer - // to the rendering buffer. It's organized very simple. The class stores - // information of horizontal spans to render it into a pixel-map buffer. - // Each span has staring X, length, and an array of bytes that determine the - // cover-values for each pixel. - // Before using this class you should know the minimal and maximal pixel + // This class is used to transfer data from a scanline rasterizer + // to the rendering buffer. It's organized very simple. The class stores + // information of horizontal spans to render it into a pixel-map buffer. + // Each span has staring X, length, and an array of bytes that determine the + // cover-values for each pixel. + // Before using this class you should know the minimal and maximal pixel // coordinates of your scanline. The protocol of using is: // 1. reset(min_x, max_x) - // 2. add_cell() / add_span() - accumulate scanline. + // 2. add_cell() / add_span() - accumulate scanline. // When forming one scanline the next X coordinate must be always greater // than the last stored one, i.e. it works only with ordered coordinates. // 3. Call finalize(y) and render the scanline. // 3. Call reset_spans() to prepare for the new scanline. - // + // // 4. Rendering: - // + // // Scanline provides an iterator class that allows you to extract // the spans and the cover values for each pixel. Be aware that clipping // has not been done yet, so you should perform it yourself. @@ -61,10 +61,10 @@ // ************************************ // // scanline_u8::const_iterator span = sl.begin(); - // - // unsigned char* row = m_rbuf->row(y); // The the address of the beginning + // + // unsigned char* row = m_rbuf->row(y); // The the address of the beginning // // of the current row - // + // // unsigned num_spans = sl.num_spans(); // Number of spans. It's guaranteed that // // num_spans is always greater than 0. // @@ -75,7 +75,7 @@ // // int num_pix = span->len; // Number of pixels of the span. // // Always greater than 0, still it's - // // better to use "int" instead of + // // better to use "int" instead of // // "unsigned" because it's more // // convenient for clipping // int x = span->x; @@ -86,24 +86,24 @@ // ************************************** // // unsigned char* dst = row + x; // Calculate the start address of the row. - // // In this case we assume a simple + // // In this case we assume a simple // // grayscale image 1-byte per pixel. // do // { - // *dst++ = *covers++; // Hypotetical rendering. + // *dst++ = *covers++; // Hypotetical rendering. // } // while(--num_pix); // // ++span; - // } + // } // while(--num_spans); // num_spans cannot be 0, so this loop is quite safe //------------------------------------------------------------------------ // // The question is: why should we accumulate the whole scanline when we // could render just separate spans when they're ready? - // That's because using the scanline is generally faster. When is consists + // That's because using the scanline is generally faster. When is consists // of more than one span the conditions for the processor cash system - // are better, because switching between two different areas of memory + // are better, because switching between two different areas of memory // (that can be very large) occurs less frequently. //------------------------------------------------------------------------ class scanline_u8 @@ -203,9 +203,9 @@ } //-------------------------------------------------------------------- - void finalize(int y) - { - m_y = y; + void finalize(int y) + { + m_y = y; } //-------------------------------------------------------------------- @@ -238,11 +238,11 @@ //==========================================================scanline_u8_am - // + // // The scanline container with alpha-masking - // + // //------------------------------------------------------------------------ - template + template class scanline_u8_am : public scanline_u8 { public: @@ -264,9 +264,9 @@ unsigned count = base_type::num_spans(); do { - m_alpha_mask->combine_hspan(span->x, - base_type::y(), - span->covers, + m_alpha_mask->combine_hspan(span->x, + base_type::y(), + span->covers, span->len); ++span; } @@ -390,8 +390,8 @@ } else { - m_spans.add(span(coord_type(x + m_min_x), - coord_type(len), + m_spans.add(span(coord_type(x + m_min_x), + coord_type(len), &m_covers[x])); } m_last_x = x + len - 1; @@ -408,17 +408,17 @@ } else { - m_spans.add(span(coord_type(x + m_min_x), - coord_type(len), + m_spans.add(span(coord_type(x + m_min_x), + coord_type(len), &m_covers[x])); } m_last_x = x + len - 1; } //-------------------------------------------------------------------- - void finalize(int y) - { - m_y = y; + void finalize(int y) + { + m_y = y; } //-------------------------------------------------------------------- @@ -450,15 +450,15 @@ //========================================================scanline32_u8_am - // + // // The scanline container with alpha-masking - // + // //------------------------------------------------------------------------ - template + template class scanline32_u8_am : public scanline32_u8 { public: - typedef scanline_u8 base_type; + typedef scanline32_u8 base_type; typedef AlphaMask alpha_mask_type; typedef base_type::cover_type cover_type; typedef base_type::coord_type coord_type; @@ -477,9 +477,9 @@ unsigned count = base_type::num_spans(); do { - m_alpha_mask->combine_hspan(span->x, - base_type::y(), - span->covers, + m_alpha_mask->combine_hspan(span->x, + base_type::y(), + span->covers, span->len); ++span; } diff -Nru matplotlib-0.99.3/CHANGELOG matplotlib-1.0.1/CHANGELOG --- matplotlib-0.99.3/CHANGELOG 2010-05-30 20:31:09.000000000 +0000 +++ matplotlib-1.0.1/CHANGELOG 2011-01-06 13:50:14.000000000 +0000 @@ -1,47 +1,426 @@ -2010-03-13 fix the bug that handles for scatter are incorrectly set when - dpi!=72. Thanks to Ray Speth for the bug report. -JJL +2011-01-04 Tag 1.0.1 for release at r8897 + +2010-11-22 Fixed error with Hammer projection. - BVR + +2010-11-12 Fixed the placement and angle of axis labels in 3D plots. - BVR + +2010-11-07 New rc parameters examples.download and examples.directory + allow bypassing the download mechanism in get_sample_data. + - JKS + +2010-08-21 Change Axis.set_view_interval() so that when updating an + existing interval, it respects the orientation of that + interval, and can enlarge but not reduce the interval. + This fixes a bug in which Axis.set_ticks would + change the view limits of an inverted axis. Whether + set_ticks should be affecting the viewLim at all remains + an open question. - EF + +2010-08-16 Handle NaN's correctly in path analysis routines. Fixes a + bug where the best location for a legend was not calculated + correctly when the line contains NaNs. - MGD + +2010-08-14 Fix bug in patch alpha handling, and in bar color kwarg - EF + +2010-07-20 Return Qt4's default cursor when leaving the canvas - DSD + +2010-07-06 Tagging for mpl 1.0 at r8502 + + +2010-07-05 Added Ben Root's patch to put 3D plots in arbitrary axes, + allowing you to mix 3d and 2d in different axes/subplots or + to have multiple 3D plots in one figure. See + examples/mplot3d/subplot3d_demo.py - JDH + +2010-07-05 Preferred kwarg names in set_xlim are now 'left' and + 'right'; in set_ylim, 'bottom' and 'top'; original + kwargs are still accepted without complaint. - EF + +2010-07-05 TkAgg and FltkAgg backends are now consistent with other + interactive backends: when used in scripts from the + command line (not from ipython -pylab), show blocks, + and can be called more than once. - EF + +2010-07-02 Modified CXX/WrapPython.h to fix "swab bug" on solaris so + mpl can compile on Solaris with CXX6 in the trunk. Closes + tracker bug 3022815 - JDH + +2010-06-30 Added autoscale convenience method and corresponding + pyplot function for simplified control of autoscaling; + and changed axis, set_xlim, and set_ylim so that by + default, they turn off the autoscaling on the relevent + axis or axes. Therefore one can call set_xlim before + plotting a line, for example, and the limits will be + retained. - EF + +2010-06-20 Added Axes.tick_params and corresponding pyplot function + to control tick and tick label appearance after an Axes + has been created. - EF + +2010-06-09 Allow Axes.grid to control minor gridlines; allow + Axes.grid and Axis.grid to control major and minor + gridlines in the same method call. - EF + +2010-06-06 Change the way we do split/dividend adjustments in + finance.py to handle dividends and fix the zero division bug reported + in sf bug 2949906 and 2123566. Note that volume is not adjusted + because the Yahoo CSV does not distinguish between share + split and dividend adjustments making it near impossible to + get volume adjustement right (unless we want to guess based + on the size of the adjustment or scrape the html tables, + which we don't) - JDH + +2010-06-06 Updated dateutil to 1.5 and pytz to 2010h. + +2010-06-02 Add error_kw kwarg to Axes.bar(). - EF + +2010-06-01 Fix pcolormesh() and QuadMesh to pass on kwargs as + appropriate. - RM + +2010-05-18 Merge mpl_toolkits.gridspec into the main tree. - JJL + +2010-05-04 Improve backend_qt4 so it displays figures with the + correct size - DSD + +2010-04-20 Added generic support for connecting to a timer for events. This + adds TimerBase, TimerGTK, TimerQT, TimerWx, and TimerTk to + the backends and a new_timer() method to each backend's + canvas to allow ease of creating a new timer. - RM + +2010-04-20 Added margins() Axes method and pyplot function. - EF + +2010-04-18 update the axes_grid documentation. -JJL + +2010-04-18 Control MaxNLocator parameters after instantiation, + and via Axes.locator_params method, with corresponding + pyplot function. -EF + +2010-04-18 Control ScalarFormatter offsets directly and via the + Axes.ticklabel_format() method, and add that to pyplot. -EF + +2010-04-16 Add a close_event to the backends. -RM + +2010-04-06 modify axes_grid examples to use axes_grid1 and axisartist. -JJL + +2010-04-06 rebase axes_grid using axes_grid1 and axisartist modules. -JJL + +2010-04-06 axes_grid toolkit is splitted into two separate modules, + axes_grid1 and axisartist. -JJL + +2010-04-05 Speed up import: import pytz only if and when it is + needed. It is not needed if the rc timezone is UTC. - EF + +2010-04-03 Added color kwarg to Axes.hist(), based on work by + Jeff Klukas. - EF + +2010-03-24 refactor colorbar code so that no cla() is necessary when + mappable is changed. -JJL + +2010-03-22 fix incorrect rubber band during the zoom mode when mouse + leaves the axes. -JJL + +2010-03-21 x/y key during the zoom mode only changes the x/y limits. -JJL + +2010-03-20 Added pyplot.sca() function suggested by JJL. - EF + +2010-03-20 Added conditional support for new Tooltip API in gtk backend. - EF + +2010-03-20 Changed plt.fig_subplot() to plt.subplots() after discussion on + list, and changed its API to return axes as a numpy object array + (with control of dimensions via squeeze keyword). FP. + +2010-03-13 Manually brought in commits from branch + + ------------------------------------------------------------------------ + r8191 | leejjoon | 2010-03-13 17:27:57 -0500 (Sat, 13 Mar 2010) | 1 line + + fix the bug that handles for scatter are incorrectly set when dpi!=72. + Thanks to Ray Speth for the bug report. + + +2010-03-03 Manually brought in commits from branch via diff/patch + (svnmerge is broken) + + ------------------------------------------------------------------------ + r8175 | leejjoon | 2010-03-03 10:03:30 -0800 (Wed, 03 Mar 2010) | 1 line + + fix arguments of allow_rasterization.draw_wrapper + ------------------------------------------------------------------------ + r8174 | jdh2358 | 2010-03-03 09:15:58 -0800 (Wed, 03 Mar 2010) | 1 line + + added support for favicon in docs build + ------------------------------------------------------------------------ + r8173 | jdh2358 | 2010-03-03 08:56:16 -0800 (Wed, 03 Mar 2010) | 1 line + + applied Mattias get_bounds patch + ------------------------------------------------------------------------ + r8172 | jdh2358 | 2010-03-03 08:31:42 -0800 (Wed, 03 Mar 2010) | 1 line + + fix svnmerge download instructions + ------------------------------------------------------------------------ + r8171 | jdh2358 | 2010-03-03 07:47:48 -0800 (Wed, 03 Mar 2010) | 1 line + + + +2010-02-25 add annotation_demo3.py that demonstrates new functionality. -JJL + +2010-02-25 refactor Annotation to support arbitrary Transform as xycoords + or textcoords. Also, if a tuple of two coordinates is provided, + they are interpreted as coordinates for each x and y position. + -JJL + +2010-02-24 Added pyplot.fig_subplot(), to create a figure and a group of + subplots in a single call. This offers an easier pattern than + manually making figures and calling add_subplot() multiple times. FP + +2010-02-17 Added Gokhan's and Mattias' customizable keybindings patch + for the toolbar. You can now set the keymap.* properties + in the matplotlibrc file. Newbindings were added for + toggling log scaling on the x-axis. JDH + +2010-02-16 Committed TJ's filled marker patch for + left|right|bottom|top|full filled markers. See + examples/pylab_examples/filledmarker_demo.py. JDH + +2010-02-11 Added 'bootstrap' option to boxplot. This allows bootstrap + estimates of median confidence intervals. Based on an + initial patch by Paul Hobson. - ADS + +2010-02-06 Added setup.cfg "basedirlist" option to override setting + in setupext.py "basedir" dictionary; added "gnu0" + platform requested by Benjamin Drung. - EF + +2010-02-06 Added 'xy' scaling option to EllipseCollection. - EF + +2010-02-03 Made plot_directive use a custom PlotWarning category, so that + warnings can be turned into fatal errors easily if desired. - FP + +2010-01-29 Added draggable method to Legend to allow mouse drag + placement. Thanks Adam Fraser. JDH + +2010-01-25 Fixed a bug reported by Olle Engdegard, when using + histograms with stepfilled and log=True - MM + +2010-01-16 Upgraded CXX to 6.1.1 - JDH + +2009-01-16 Don't create minor ticks on top of existing major + ticks. Patch by Neil Crighton. -ADS + +2009-01-16 Ensure three minor ticks always drawn (SF# 2924245). Patch + by Neil Crighton. -ADS + +2010-01-16 Applied patch by Ian Thomas to fix two contouring + problems: now contourf handles interior masked regions, + and the boundaries of line and filled contours coincide. - EF + +2009-01-11 The color of legend patch follows the rc parameters + axes.facecolor and axes.edgecolor. -JJL + +2009-01-11 adjustable of Axes can be "box-forced" which allow + sharing axes. -JJL + +2009-01-11 Add add_click and pop_click methods in + BlockingContourLabeler. -JJL + + +2010-01-03 Added rcParams['axes.color_cycle'] - EF + +2010-01-03 Added Pierre's qt4 formlayout editor and toolbar button - JDH + +2009-12-31 Add support for using math text as marker symbols (Thanks to tcb) + - MGD + +2009-12-31 Commit a workaround for a regression in PyQt4-4.6.{0,1} - DSD + +2009-12-22 Fix cmap data for gist_earth_r, etc. -JJL + +2009-12-20 spines: put spines in data coordinates, add set_bounds() + call. -ADS + +2009-12-18 Don't limit notch size in boxplot to q1-q3 range, as this + is effectively making the data look better than it is. - ADS + +2009-12-18 mlab.prctile handles even-length data, such that the median + is the mean of the two middle values. - ADS + +2009-12-15 Add raw-image (unsampled) support for the ps backend. - JJL + +2009-12-14 Add patch_artist kwarg to boxplot, but keep old default. + Convert boxplot_demo2.py to use the new patch_artist. - ADS + +2009-12-06 axes_grid: reimplemented AxisArtist with FloatingAxes support. + Added new examples. - JJL + +2009-12-01 Applied Laurent Dufrechou's patch to improve blitting with + the qt4 backend - DSD + +2009-11-13 The pdf backend now allows changing the contents of + a pdf file's information dictionary via PdfPages.infodict. - JKS + +2009-11-12 font_manager.py should no longer cause EINTR on Python 2.6 + (but will on the 2.5 version of subprocess). Also the + fc-list command in that file was fixed so now it should + actually find the list of fontconfig fonts. - JKS + +2009-11-10 Single images, and all images in renderers with + option_image_nocomposite (i.e. agg, macosx and the svg + backend when rcParams['svg.image_noscale'] is True), are + now drawn respecting the zorder relative to other + artists. (Note that there may now be inconsistencies across + backends when more than one image is drawn at varying + zorders, but this change introduces correct behavior for + the backends in which it's easy to do so.) + +2009-10-21 Make AutoDateLocator more configurable by adding options + to control the maximum and minimum number of ticks. Also + add control of the intervals to be used for ticking. This + does not change behavior but opens previously hard-coded + behavior to runtime modification`. - RMM + +2009-10-19 Add "path_effects" support for Text and Patch. See + examples/pylab_examples/patheffect_demo.py -JJL + +2009-10-19 Add "use_clabeltext" option to clabel. If True, clabels + will be created with ClabelText class, which recalculates + rotation angle of the label during the drawing time. -JJL + +2009-10-16 Make AutoDateFormatter actually use any specified + timezone setting.This was only working correctly + when no timezone was specified. - RMM + +2009-09-27 Beginnings of a capability to test the pdf backend. - JKS + +2009-09-27 Add a savefig.extension rcparam to control the default + filename extension used by savefig. - JKS =============================================== 2009-09-21 Tagged for release 0.99.1 2009-09-20 Fix usetex spacing errors in pdf backend. - JKS +2009-09-20 Add Sphinx extension to highlight IPython console sessions, + originally authored (I think) by Michael Droetboom. - FP + 2009-09-20 Fix off-by-one error in dviread.Tfm, and additionally protect against exceptions in case a dvi font is missing some metrics. - JKS +2009-09-15 Implement draw_text and draw_tex method of backend_base using + the textpath module. Implement draw_tex method of the svg + backend. - JJL + 2009-09-15 Don't fail on AFM files containing floating-point bounding boxes - JKS +2009-09-13 AxesGrid : add modified version of colorbar. Add colorbar + location howto. - JJL + +2009-09-07 AxesGrid : implemented axisline style. + Added a demo examples/axes_grid/demo_axisline_style.py- JJL + +2009-09-04 Make the textpath class as a separate moduel + (textpath.py). Add support for mathtext and tex.- JJL + +2009-09-01 Added support for Gouraud interpolated triangles. + pcolormesh now accepts shading='gouraud' as an option. - MGD + +2009-08-29 Added matplotlib.testing package, which contains a Nose + plugin and a decorator that lets tests be marked as + KnownFailures - ADS + +2009-08-20 Added scaled dict to AutoDateFormatter for customized + scales - JDH + +2009-08-15 Pyplot interface: the current image is now tracked at the + figure and axes level, addressing tracker item 1656374. - EF + +2009-08-15 Docstrings are now manipulated with decorators defined + in a new module, docstring.py, thanks to Jason Coombs. - EF + +2009-08-14 Add support for image filtering for agg back end. See the example + demo_agg_filter.py. -JJL + +2009-08-09 AnnotationBbox added. Similar to Annotation, but works with + OffsetBox instead of Text. See the example + demo_annotation_box.py. -JJL + +2009-08-07 BboxImage implemented. Two examples, demo_bboximage.py and + demo_ribbon_box.py added. - JJL + +2009-08-07 In an effort to simplify the backend API, all clipping rectangles + and paths are now passed in using GraphicsContext objects, even + on collections and images. Therefore: + + draw_path_collection(self, master_transform, cliprect, clippath, + clippath_trans, paths, all_transforms, offsets, + offsetTrans, facecolors, edgecolors, linewidths, + linestyles, antialiaseds, urls) + + becomes: + + draw_path_collection(self, gc, master_transform, paths, all_transforms, + offsets, offsetTrans, facecolors, edgecolors, + linewidths, linestyles, antialiaseds, urls) + + + + draw_quad_mesh(self, master_transform, cliprect, clippath, + clippath_trans, meshWidth, meshHeight, coordinates, + offsets, offsetTrans, facecolors, antialiased, + showedges) + + becomes: + + draw_quad_mesh(self, gc, master_transform, meshWidth, meshHeight, + coordinates, offsets, offsetTrans, facecolors, + antialiased, showedges) + + + + draw_image(self, x, y, im, bbox, clippath=None, clippath_trans=None) + + becomes: + + draw_image(self, gc, x, y, im) + + - MGD + 2009-08-06 Tagging the 0.99.0 release at svn r7397 - JDH - * fixed an alpha colormapping bug posted on sf 2832575 + * fixed an alpha colormapping bug posted on sf 2832575 - * fix typo in axes_divider.py. use nanmin, nanmax in angle_helper.py + * fix typo in axes_divider.py. use nanmin, nanmax in angle_helper.py (patch by Christoph Gohlke) - * remove dup gui event in enter/leave events in gtk + * remove dup gui event in enter/leave events in gtk - * lots of fixes for os x binaries (Thanks Russell Owen) + * lots of fixes for os x binaries (Thanks Russell Owen) - * attach gtk events to mpl events -- fixes sf bug 2816580 + * attach gtk events to mpl events -- fixes sf bug 2816580 - * applied sf patch 2815064 (middle button events for wx) and + * applied sf patch 2815064 (middle button events for wx) and patch 2818092 (resize events for wx) - * fixed boilerplate.py so it doesn't break the ReST docs. + * fixed boilerplate.py so it doesn't break the ReST docs. - * removed a couple of cases of mlab.load + * removed a couple of cases of mlab.load - * fixed rec2csv win32 file handle bug from sf patch 2831018 + * fixed rec2csv win32 file handle bug from sf patch 2831018 - * added two examples from Josh Hemann: examples/pylab_examples/barchart_demo2.py + * added two examples from Josh Hemann: examples/pylab_examples/barchart_demo2.py and examples/pylab_examples/boxplot_demo2.py - * handled sf bugs 2831556 and 2830525; better bar error messages and + * handled sf bugs 2831556 and 2830525; better bar error messages and backend driver configs - * added miktex win32 patch from sf patch 2820194 + * added miktex win32 patch from sf patch 2820194 + + * apply sf patches 2830233 and 2823885 for osx setup and 64 bit; thanks Michiel + +2009-08-04 Made cbook.get_sample_data make use of the ETag and Last-Modified + headers of mod_dav_svn. - JKS + +2009-08-03 Add PathCollection; modify contourf to use complex + paths instead of simple paths with cuts. - EF - * apply sf patches 2830233 and 2823885 for osx setup and 64 bit; thanks Michiel 2009-08-03 Fixed boilerplate.py so it doesn't break the ReST docs. - JKS @@ -50,6 +429,10 @@ numpy.loadtxt and numpy.savetxt for text files, or np.save and np.load for binary numpy arrays. - JDH +2009-07-31 Added cbook.get_sample_data for urllib enabled fetching and + cacheing of data needed for examples. See + examples/misc/sample_data_demo.py - JDH + 2009-07-31 Tagging 0.99.0.rc1 at 7314 - MGD 2009-07-30 Add set_cmap and register_cmap, and improve get_cmap, diff -Nru matplotlib-0.99.3/CXX/Config.hxx matplotlib-1.0.1/CXX/Config.hxx --- matplotlib-0.99.3/CXX/Config.hxx 2009-07-31 15:14:42.000000000 +0000 +++ matplotlib-1.0.1/CXX/Config.hxx 2010-07-07 01:41:53.000000000 +0000 @@ -34,101 +34,10 @@ // DAMAGE. // //----------------------------------------------------------------------------- +#include "CXX/WrapPython.h" -#ifndef __PyCXX_config_hh__ -#define __PyCXX_config_hh__ - -// -// Microsoft VC++ 6.0 has no traits -// -#if defined( _MSC_VER ) - -# define STANDARD_LIBRARY_HAS_ITERATOR_TRAITS 1 - -#elif defined( __GNUC__ ) -# if __GNUC__ >= 3 -# define STANDARD_LIBRARY_HAS_ITERATOR_TRAITS 1 -# else -# define STANDARD_LIBRARY_HAS_ITERATOR_TRAITS 0 -#endif - -// -// Assume all other compilers do -// -#else - -// Macros to deal with deficiencies in compilers -# define STANDARD_LIBRARY_HAS_ITERATOR_TRAITS 1 -#endif - -#if STANDARD_LIBRARY_HAS_ITERATOR_TRAITS -# define random_access_iterator_parent(itemtype) std::iterator +#if PY_MAJOR_VERSION == 2 +#include "CXX/Python2/Config.hxx" #else -# define random_access_iterator_parent(itemtype) std::random_access_iterator +#include "CXX/Python3/Config.hxx" #endif - -// -// Which C++ standard is in use? -// -#if defined( _MSC_VER ) -# if _MSC_VER <= 1200 -// MSVC++ 6.0 -# define PYCXX_ISO_CPP_LIB 0 -# define STR_STREAM -# define TEMPLATE_TYPENAME class -# else -# define PYCXX_ISO_CPP_LIB 1 -# define STR_STREAM -# define TEMPLATE_TYPENAME typename -# endif -#elif defined( __GNUC__ ) -# if __GNUC__ >= 3 -# define PYCXX_ISO_CPP_LIB 1 -# define STR_STREAM -# define TEMPLATE_TYPENAME typename -# else -# define PYCXX_ISO_CPP_LIB 0 -# define STR_STREAM -# define TEMPLATE_TYPENAME class -# endif -#endif - -#if PYCXX_ISO_CPP_LIB -# define STR_STREAM -# define OSTRSTREAM ostringstream -# define EXPLICIT_TYPENAME typename -# define EXPLICIT_CLASS class -# define TEMPLATE_TYPENAME typename -#else -# define STR_STREAM -# define OSTRSTREAM ostrstream -# define EXPLICIT_TYPENAME -# define EXPLICIT_CLASS -# define TEMPLATE_TYPENAME class -#endif - -// before 2.5 Py_ssize_t was missing -#ifndef PY_MAJOR_VERSION -#error not defined PY_MAJOR_VERSION -#endif -#if PY_MAJOR_VERSION < 2 || (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION < 5) -typedef int Py_ssize_t; -#endif - -// hash_map container usage selection -// 1) if PYCXX_USING_STD_MAP is defined PyCXX will be using std::map<> container -// implementation only. -// 2) if compilers are used other than MS Visual Studio (7.1+) or GCC 3.x -// STANDARD_LIBRARY_HAS_HASH_MAP must be defined before compilation to -// make PyCXX using hash_map container. -#if !defined( PYCXX_USING_STD_MAP ) - #if defined( _MSC_VER ) || defined( __INTEL_COMPILER ) || defined ( __ICC ) || (defined( __GNUC__ ) && ( __GNUC__ > 3 )) - # define PYCXX_USING_HASH_MAP - #else - # if defined( STANDARD_LIBRARY_HAS_HASH_MAP ) && !defined( PYCXX_USING_HASH_MAP ) - # define PYCXX_USING_HASH_MAP - # endif - #endif -#endif - -#endif // __PyCXX_config_hh__ diff -Nru matplotlib-0.99.3/CXX/cxxextensions.c matplotlib-1.0.1/CXX/cxxextensions.c --- matplotlib-0.99.3/CXX/cxxextensions.c 2009-07-31 15:14:42.000000000 +0000 +++ matplotlib-1.0.1/CXX/cxxextensions.c 2010-07-07 01:41:53.000000000 +0000 @@ -1,4 +1,4 @@ -/*---------------------------------------------------------------------------- +//----------------------------------------------------------------------------- // // Copyright (c) 1998 - 2007, The Regents of the University of California // Produced at the Lawrence Livermore National Laboratory @@ -33,17 +33,11 @@ // OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH // DAMAGE. // -//---------------------------------------------------------------------------*/ - +//----------------------------------------------------------------------------- #include "CXX/WrapPython.h" -#ifdef __cplusplus -extern "C" -{ -#endif - -PyObject py_object_initializer = {PyObject_HEAD_INIT(0)}; - -#ifdef __cplusplus -} +#if PY_MAJOR_VERSION == 2 +#include "Python2/cxxextensions.c" +#else +#include "Python3/cxxextensions.c" #endif diff -Nru matplotlib-0.99.3/CXX/cxx_extensions.cxx matplotlib-1.0.1/CXX/cxx_extensions.cxx --- matplotlib-0.99.3/CXX/cxx_extensions.cxx 2009-07-31 15:14:42.000000000 +0000 +++ matplotlib-1.0.1/CXX/cxx_extensions.cxx 2010-07-07 01:41:53.000000000 +0000 @@ -34,1431 +34,10 @@ // DAMAGE. // //----------------------------------------------------------------------------- -#include "CXX/Extensions.hxx" -#include "CXX/Exception.hxx" +#include "CXX/WrapPython.h" -#include - -namespace Py -{ - -void Object::validate() -{ - // release pointer if not the right type - if( !accepts( p ) ) - { -#if defined( _CPPRTTI ) || defined( __GNUG__ ) - std::string s( "PyCXX: Error creating object of type " ); - s += (typeid( *this )).name(); - - if( p != 0 ) - { - String from_repr = repr(); - s += " from "; - s += from_repr.as_std_string(); - } - else - { - s += " from (nil)"; - } -#endif - release(); - if( PyErr_Occurred() ) - { // Error message already set - throw Exception(); - } - // Better error message if RTTI available -#if defined( _CPPRTTI ) || defined( __GNUG__ ) - throw TypeError( s ); +#if PY_MAJOR_VERSION == 2 +#include "Python2/cxx_extensions.cxx" #else - throw TypeError( "PyCXX: type error." ); -#endif - } -} - -//================================================================================ -// -// Implementation of MethodTable -// -//================================================================================ - -PyMethodDef MethodTable::method( const char* method_name, PyCFunction f, int flags, const char* doc ) -{ - PyMethodDef m; - m.ml_name = const_cast( method_name ); - m.ml_meth = f; - m.ml_flags = flags; - m.ml_doc = const_cast( doc ); - return m; -} - -MethodTable::MethodTable() -{ - t.push_back( method( 0, 0, 0, 0 ) ); - mt = 0; -} - -MethodTable::~MethodTable() -{ - delete [] mt; -} - -void MethodTable::add( const char* method_name, PyCFunction f, const char* doc, int flag ) -{ - if( !mt ) - { - t.insert( t.end()-1, method( method_name, f, flag, doc ) ); - } - else - { - throw RuntimeError( "Too late to add a module method!" ); - } -} - -PyMethodDef* MethodTable::table() -{ - if( !mt ) - { - Py_ssize_t t1size = t.size(); - mt = new PyMethodDef[t1size]; - int j = 0; - for( std::vector::iterator i = t.begin(); i != t.end(); i++ ) - { - mt[j++] = *i; - } - } - return mt; -} - -//================================================================================ -// -// Implementation of ExtensionModule -// -//================================================================================ -ExtensionModuleBase::ExtensionModuleBase( const char *name ) - : module_name( name ) - , full_module_name( __Py_PackageContext() != NULL ? std::string( __Py_PackageContext() ) : module_name ) - , method_table() -{} - -ExtensionModuleBase::~ExtensionModuleBase() -{} - -const std::string &ExtensionModuleBase::name() const -{ - return module_name; -} - -const std::string &ExtensionModuleBase::fullName() const -{ - return full_module_name; -} - -class ExtensionModuleBasePtr : public PythonExtension -{ -public: - ExtensionModuleBasePtr( ExtensionModuleBase *_module ) - : module( _module ) - {} - virtual ~ExtensionModuleBasePtr() - {} - - ExtensionModuleBase *module; -}; - - -void ExtensionModuleBase::initialize( const char *module_doc ) -{ - PyObject *module_ptr = new ExtensionModuleBasePtr( this ); - - Py_InitModule4 - ( - const_cast( module_name.c_str() ), // name - method_table.table(), // methods - const_cast( module_doc ), // docs - module_ptr, // pass to functions as "self" - PYTHON_API_VERSION // API version - ); -} - -Py::Module ExtensionModuleBase::module(void) const -{ - return Module( full_module_name ); -} - -Py::Dict ExtensionModuleBase::moduleDictionary(void) const -{ - return module().getDict(); -} - -//-------------------------------------------------------------------------------- - -//================================================================================ -// -// Implementation of PythonType -// -//================================================================================ - -extern "C" -{ - static void standard_dealloc(PyObject* p); - // - // All the following functions redirect the call from Python - // onto the matching virtual function in PythonExtensionBase - // - static int print_handler (PyObject*, FILE *, int); - static PyObject* getattr_handler (PyObject*, char*); - static int setattr_handler (PyObject*, char*, PyObject*); - static PyObject* getattro_handler (PyObject*, PyObject*); - static int setattro_handler (PyObject*, PyObject*, PyObject*); - static int compare_handler (PyObject*, PyObject*); - static PyObject* richcompare_handler (PyObject*, PyObject*, int op); - static PyObject* repr_handler (PyObject*); - static PyObject* str_handler (PyObject*); - static long hash_handler (PyObject*); - static PyObject* call_handler (PyObject*, PyObject*, PyObject*); - static PyObject* iter_handler (PyObject*); - static PyObject* iternext_handler (PyObject*); - - // Sequence methods - static Py_ssize_t sequence_length_handler(PyObject*); - static PyObject* sequence_concat_handler(PyObject*,PyObject*); - static PyObject* sequence_repeat_handler(PyObject*, Py_ssize_t); - static PyObject* sequence_item_handler(PyObject*, Py_ssize_t); - static PyObject* sequence_slice_handler(PyObject*, Py_ssize_t, Py_ssize_t); - static int sequence_ass_item_handler(PyObject*, Py_ssize_t, PyObject*); - static int sequence_ass_slice_handler(PyObject*, Py_ssize_t, Py_ssize_t, PyObject*); - // Mapping - static Py_ssize_t mapping_length_handler(PyObject*); - static PyObject* mapping_subscript_handler(PyObject*, PyObject*); - static int mapping_ass_subscript_handler(PyObject*, PyObject*, PyObject*); - - // Numeric methods - static int number_nonzero_handler (PyObject*); - static PyObject* number_negative_handler (PyObject*); - static PyObject* number_positive_handler (PyObject*); - static PyObject* number_absolute_handler (PyObject*); - static PyObject* number_invert_handler (PyObject*); - static PyObject* number_int_handler (PyObject*); - static PyObject* number_float_handler (PyObject*); - static PyObject* number_long_handler (PyObject*); - static PyObject* number_oct_handler (PyObject*); - static PyObject* number_hex_handler (PyObject*); - static PyObject* number_add_handler (PyObject*, PyObject*); - static PyObject* number_subtract_handler (PyObject*, PyObject*); - static PyObject* number_multiply_handler (PyObject*, PyObject*); - static PyObject* number_divide_handler (PyObject*, PyObject*); - static PyObject* number_remainder_handler (PyObject*, PyObject*); - static PyObject* number_divmod_handler (PyObject*, PyObject*); - static PyObject* number_lshift_handler (PyObject*, PyObject*); - static PyObject* number_rshift_handler (PyObject*, PyObject*); - static PyObject* number_and_handler (PyObject*, PyObject*); - static PyObject* number_xor_handler (PyObject*, PyObject*); - static PyObject* number_or_handler (PyObject*, PyObject*); - static PyObject* number_power_handler(PyObject*, PyObject*, PyObject*); - - // Buffer - static Py_ssize_t buffer_getreadbuffer_handler (PyObject*, Py_ssize_t, void**); - static Py_ssize_t buffer_getwritebuffer_handler (PyObject*, Py_ssize_t, void**); - static Py_ssize_t buffer_getsegcount_handler (PyObject*, Py_ssize_t*); -} - - -extern "C" void standard_dealloc( PyObject* p ) -{ - PyMem_DEL( p ); -} - -PythonType & PythonType::supportSequenceType() -{ - if( !sequence_table ) - { - sequence_table = new PySequenceMethods; - memset( sequence_table, 0, sizeof( PySequenceMethods ) ); // ensure new fields are 0 - table->tp_as_sequence = sequence_table; - sequence_table->sq_length = sequence_length_handler; - sequence_table->sq_concat = sequence_concat_handler; - sequence_table->sq_repeat = sequence_repeat_handler; - sequence_table->sq_item = sequence_item_handler; - sequence_table->sq_slice = sequence_slice_handler; - - sequence_table->sq_ass_item = sequence_ass_item_handler; // BAS setup seperately? - sequence_table->sq_ass_slice = sequence_ass_slice_handler; // BAS setup seperately? - } - return *this; -} - -PythonType & PythonType::supportMappingType() -{ - if( !mapping_table ) - { - mapping_table = new PyMappingMethods; - memset( mapping_table, 0, sizeof( PyMappingMethods ) ); // ensure new fields are 0 - table->tp_as_mapping = mapping_table; - mapping_table->mp_length = mapping_length_handler; - mapping_table->mp_subscript = mapping_subscript_handler; - mapping_table->mp_ass_subscript = mapping_ass_subscript_handler; // BAS setup seperately? - } - return *this; -} - -PythonType & PythonType::supportNumberType() -{ - if( !number_table ) - { - number_table = new PyNumberMethods; - memset( number_table, 0, sizeof( PyNumberMethods ) ); // ensure new fields are 0 - table->tp_as_number = number_table; - number_table->nb_add = number_add_handler; - number_table->nb_subtract = number_subtract_handler; - number_table->nb_multiply = number_multiply_handler; - number_table->nb_divide = number_divide_handler; - number_table->nb_remainder = number_remainder_handler; - number_table->nb_divmod = number_divmod_handler; - number_table->nb_power = number_power_handler; - number_table->nb_negative = number_negative_handler; - number_table->nb_positive = number_positive_handler; - number_table->nb_absolute = number_absolute_handler; - number_table->nb_nonzero = number_nonzero_handler; - number_table->nb_invert = number_invert_handler; - number_table->nb_lshift = number_lshift_handler; - number_table->nb_rshift = number_rshift_handler; - number_table->nb_and = number_and_handler; - number_table->nb_xor = number_xor_handler; - number_table->nb_or = number_or_handler; - number_table->nb_coerce = 0; - number_table->nb_int = number_int_handler; - number_table->nb_long = number_long_handler; - number_table->nb_float = number_float_handler; - number_table->nb_oct = number_oct_handler; - number_table->nb_hex = number_hex_handler; - } - return *this; -} - -PythonType & PythonType::supportBufferType() -{ - if( !buffer_table ) - { - buffer_table = new PyBufferProcs; - memset( buffer_table, 0, sizeof( PyBufferProcs ) ); // ensure new fields are 0 - table->tp_as_buffer = buffer_table; - buffer_table->bf_getreadbuffer = buffer_getreadbuffer_handler; - buffer_table->bf_getwritebuffer = buffer_getwritebuffer_handler; - buffer_table->bf_getsegcount = buffer_getsegcount_handler; - } - return *this; -} - -// if you define one sequence method you must define -// all of them except the assigns - -PythonType::PythonType( size_t basic_size, int itemsize, const char *default_name ) - : table( new PyTypeObject ) - , sequence_table( NULL ) - , mapping_table( NULL ) - , number_table( NULL ) - , buffer_table( NULL ) -{ - memset( table, 0, sizeof( PyTypeObject ) ); // ensure new fields are 0 - *reinterpret_cast( table ) = py_object_initializer; - table->ob_type = _Type_Type(); - table->ob_size = 0; - table->tp_name = const_cast( default_name ); - table->tp_basicsize = basic_size; - table->tp_itemsize = itemsize; - table->tp_dealloc = ( destructor ) standard_dealloc; - table->tp_print = 0; - table->tp_getattr = 0; - table->tp_setattr = 0; - table->tp_compare = 0; - table->tp_repr = 0; - table->tp_as_number = 0; - table->tp_as_sequence = 0; - table->tp_as_mapping = 0; - table->tp_hash = 0; - table->tp_call = 0; - table->tp_str = 0; - table->tp_getattro = 0; - table->tp_setattro = 0; - table->tp_as_buffer = 0; - table->tp_flags = Py_TPFLAGS_DEFAULT; - table->tp_doc = 0; -#if PY_MAJOR_VERSION > 2 || (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION >= 0) - // first use in 2.0 - table->tp_traverse = 0L; - table->tp_clear = 0L; -#else - table->tp_xxx5 = 0L; - table->tp_xxx6 = 0L; -#endif -#if PY_MAJOR_VERSION > 2 || (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION >= 1) - // first defined in 2.1 - table->tp_richcompare = 0L; - table->tp_weaklistoffset = 0L; -#else - table->tp_xxx7 = 0L; - table->tp_xxx8 = 0L; -#endif - -#if PY_MAJOR_VERSION > 2 || (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION >= 2) - // first defined in 2.3 - table->tp_iter = 0L; - table->tp_iternext = 0L; -#endif - -#ifdef COUNT_ALLOCS - table->tp_alloc = 0; - table->tp_free = 0; - table->tp_maxalloc = 0; - table->tp_next = 0; -#endif -} - -PythonType::~PythonType( ) -{ - delete table; - delete sequence_table; - delete mapping_table; - delete number_table; - delete buffer_table; -} - -PyTypeObject* PythonType::type_object( ) const -{return table;} - -PythonType & PythonType::name( const char* nam ) -{ - table->tp_name = const_cast( nam ); - return *this; -} - -const char *PythonType::getName() const -{ - return table->tp_name; -} - -PythonType & PythonType::doc( const char* d ) -{ - table->tp_doc = const_cast( d ); - return *this; -} - -const char *PythonType::getDoc() const -{ - return table->tp_doc; -} - -PythonType & PythonType::dealloc( void( *f )( PyObject* )) -{ - table->tp_dealloc = f; - return *this; -} - -PythonType & PythonType::supportPrint() -{ - table->tp_print = print_handler; - return *this; -} - -PythonType & PythonType::supportGetattr() -{ - table->tp_getattr = getattr_handler; - return *this; -} - -PythonType & PythonType::supportSetattr() -{ - table->tp_setattr = setattr_handler; - return *this; -} - -PythonType & PythonType::supportGetattro() -{ - table->tp_getattro = getattro_handler; - return *this; -} - -PythonType & PythonType::supportSetattro() -{ - table->tp_setattro = setattro_handler; - return *this; -} - -PythonType & PythonType::supportCompare() -{ - table->tp_compare = compare_handler; - return *this; -} - -#if PY_MAJOR_VERSION > 2 || (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION >= 1) -PythonType & PythonType::supportRichCompare() -{ - table->tp_richcompare = richcompare_handler; - return *this; -} -#endif - -PythonType & PythonType::supportRepr() -{ - table->tp_repr = repr_handler; - return *this; -} - -PythonType & PythonType::supportStr() -{ - table->tp_str = str_handler; - return *this; -} - -PythonType & PythonType::supportHash() -{ - table->tp_hash = hash_handler; - return *this; -} - -PythonType & PythonType::supportCall() -{ - table->tp_call = call_handler; - return *this; -} - -PythonType & PythonType::supportIter() -{ - table->tp_iter = iter_handler; - table->tp_iternext = iternext_handler; - return *this; -} - -//-------------------------------------------------------------------------------- -// -// Handlers -// -//-------------------------------------------------------------------------------- -extern "C" int print_handler( PyObject *self, FILE *fp, int flags ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return p->print( fp, flags ); - } - catch( Py::Exception & ) - { - return -1; // indicate error - } -} - -extern "C" PyObject* getattr_handler( PyObject *self, char *name ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return new_reference_to( p->getattr( name ) ); - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} - -extern "C" int setattr_handler( PyObject *self, char *name, PyObject *value ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return p->setattr( name, Py::Object( value ) ); - } - catch( Py::Exception & ) - { - return -1; // indicate error - } -} - -extern "C" PyObject* getattro_handler( PyObject *self, PyObject *name ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return new_reference_to( p->getattro( Py::Object( name ) ) ); - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} - -extern "C" int setattro_handler( PyObject *self, PyObject *name, PyObject *value ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return p->setattro( Py::Object( name ), Py::Object( value ) ); - } - catch( Py::Exception & ) - { - return -1; // indicate error - } -} - -extern "C" int compare_handler( PyObject *self, PyObject *other ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return p->compare( Py::Object( other ) ); - } - catch( Py::Exception & ) - { - return -1; // indicate error - } -} - -#if PY_MAJOR_VERSION > 2 || (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION >= 1) -extern "C" PyObject* richcompare_handler( PyObject *self, PyObject *other, int op ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return new_reference_to( p->rich_compare( Py::Object( other ), op ) ); - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} -#endif - -extern "C" PyObject* repr_handler( PyObject *self ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return new_reference_to( p->repr() ); - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} - -extern "C" PyObject* str_handler( PyObject *self ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return new_reference_to( p->str() ); - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} - -extern "C" long hash_handler( PyObject *self ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return p->hash(); - } - catch( Py::Exception & ) - { - return -1; // indicate error - } -} - -extern "C" PyObject* call_handler( PyObject *self, PyObject *args, PyObject *kw ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - if( kw != NULL ) - return new_reference_to( p->call( Py::Object( args ), Py::Object( kw ) ) ); - else - return new_reference_to( p->call( Py::Object( args ), Py::Object() ) ); - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} - -extern "C" PyObject* iter_handler( PyObject *self ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return new_reference_to( p->iter() ); - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} - -extern "C" PyObject* iternext_handler( PyObject *self ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return p->iternext(); // might be a NULL ptr on end of iteration - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} - - -// Sequence methods -extern "C" Py_ssize_t sequence_length_handler( PyObject *self ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return p->sequence_length(); - } - catch( Py::Exception & ) - { - return -1; // indicate error - } -} - -extern "C" PyObject* sequence_concat_handler( PyObject *self, PyObject *other ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return new_reference_to( p->sequence_concat( Py::Object( other ) ) ); - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} - -extern "C" PyObject* sequence_repeat_handler( PyObject *self, Py_ssize_t count ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return new_reference_to( p->sequence_repeat( count ) ); - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} - -extern "C" PyObject* sequence_item_handler( PyObject *self, Py_ssize_t index ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return new_reference_to( p->sequence_item( index ) ); - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} - -extern "C" PyObject* sequence_slice_handler( PyObject *self, Py_ssize_t first, Py_ssize_t last ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return new_reference_to( p->sequence_slice( first, last ) ); - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} - -extern "C" int sequence_ass_item_handler( PyObject *self, Py_ssize_t index, PyObject *value ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return p->sequence_ass_item( index, Py::Object( value ) ); - } - catch( Py::Exception & ) - { - return -1; // indicate error - } -} - -extern "C" int sequence_ass_slice_handler( PyObject *self, Py_ssize_t first, Py_ssize_t last, PyObject *value ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return p->sequence_ass_slice( first, last, Py::Object( value ) ); - } - catch( Py::Exception & ) - { - return -1; // indicate error - } -} - -// Mapping -extern "C" Py_ssize_t mapping_length_handler( PyObject *self ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return p->mapping_length(); - } - catch( Py::Exception & ) - { - return -1; // indicate error - } -} - -extern "C" PyObject* mapping_subscript_handler( PyObject *self, PyObject *key ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return new_reference_to( p->mapping_subscript( Py::Object( key ) ) ); - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} - -extern "C" int mapping_ass_subscript_handler( PyObject *self, PyObject *key, PyObject *value ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return p->mapping_ass_subscript( Py::Object( key ), Py::Object( value ) ); - } - catch( Py::Exception & ) - { - return -1; // indicate error - } -} - -// Number -extern "C" int number_nonzero_handler( PyObject *self ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return p->number_nonzero(); - } - catch( Py::Exception & ) - { - return -1; // indicate error - } -} - -extern "C" PyObject* number_negative_handler( PyObject *self ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return new_reference_to( p->number_negative() ); - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} - -extern "C" PyObject* number_positive_handler( PyObject *self ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return new_reference_to( p->number_positive() ); - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} - -extern "C" PyObject* number_absolute_handler( PyObject *self ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return new_reference_to( p->number_absolute() ); - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} - -extern "C" PyObject* number_invert_handler( PyObject *self ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return new_reference_to( p->number_invert() ); - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} - -extern "C" PyObject* number_int_handler( PyObject *self ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return new_reference_to( p->number_int() ); - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} - -extern "C" PyObject* number_float_handler( PyObject *self ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return new_reference_to( p->number_float() ); - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} - -extern "C" PyObject* number_long_handler( PyObject *self ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return new_reference_to( p->number_long() ); - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} - -extern "C" PyObject* number_oct_handler( PyObject *self ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return new_reference_to( p->number_oct() ); - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} - -extern "C" PyObject* number_hex_handler( PyObject *self ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return new_reference_to( p->number_hex() ); - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} - -extern "C" PyObject* number_add_handler( PyObject *self, PyObject *other ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return new_reference_to( p->number_add( Py::Object( other ) ) ); - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} - -extern "C" PyObject* number_subtract_handler( PyObject *self, PyObject *other ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return new_reference_to( p->number_subtract( Py::Object( other ) ) ); - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} - -extern "C" PyObject* number_multiply_handler( PyObject *self, PyObject *other ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return new_reference_to( p->number_multiply( Py::Object( other ) ) ); - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} - -extern "C" PyObject* number_divide_handler( PyObject *self, PyObject *other ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return new_reference_to( p->number_divide( Py::Object( other ) ) ); - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} - -extern "C" PyObject* number_remainder_handler( PyObject *self, PyObject *other ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return new_reference_to( p->number_remainder( Py::Object( other ) ) ); - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} - -extern "C" PyObject* number_divmod_handler( PyObject *self, PyObject *other ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return new_reference_to( p->number_divmod( Py::Object( other ) ) ); - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} - -extern "C" PyObject* number_lshift_handler( PyObject *self, PyObject *other ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return new_reference_to( p->number_lshift( Py::Object( other ) ) ); - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} - -extern "C" PyObject* number_rshift_handler( PyObject *self, PyObject *other ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return new_reference_to( p->number_rshift( Py::Object( other ) ) ); - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} - -extern "C" PyObject* number_and_handler( PyObject *self, PyObject *other ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return new_reference_to( p->number_and( Py::Object( other ) ) ); - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} - -extern "C" PyObject* number_xor_handler( PyObject *self, PyObject *other ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return new_reference_to( p->number_xor( Py::Object( other ) ) ); - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} - -extern "C" PyObject* number_or_handler( PyObject *self, PyObject *other ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return new_reference_to( p->number_or( Py::Object( other ) ) ); - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} - -extern "C" PyObject* number_power_handler( PyObject *self, PyObject *x1, PyObject *x2 ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return new_reference_to( p->number_power( Py::Object( x1 ), Py::Object( x2 ) ) ); - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} - -// Buffer -extern "C" Py_ssize_t buffer_getreadbuffer_handler( PyObject *self, Py_ssize_t index, void **pp ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return p->buffer_getreadbuffer( index, pp ); - } - catch( Py::Exception & ) - { - return -1; // indicate error - } -} - -extern "C" Py_ssize_t buffer_getwritebuffer_handler( PyObject *self, Py_ssize_t index, void **pp ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return p->buffer_getwritebuffer( index, pp ); - } - catch( Py::Exception & ) - { - return -1; // indicate error - } -} - -extern "C" Py_ssize_t buffer_getsegcount_handler( PyObject *self, Py_ssize_t *count ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return p->buffer_getsegcount( count ); - } - catch( Py::Exception & ) - { - return -1; // indicate error - } -} - - -//================================================================================ -// -// Implementation of PythonExtensionBase -// -//================================================================================ -#define missing_method( method ) \ -throw RuntimeError( "Extension object does not support method " #method ); - -PythonExtensionBase::PythonExtensionBase() -{ -} - -PythonExtensionBase::~PythonExtensionBase() -{ - assert( ob_refcnt == 0 ); -} - -int PythonExtensionBase::print( FILE *, int ) -{ missing_method( print ); return -1; } - -int PythonExtensionBase::setattr( const char*, const Py::Object & ) -{ missing_method( setattr ); return -1; } - -Py::Object PythonExtensionBase::getattro( const Py::Object & ) -{ missing_method( getattro ); return Py::Nothing(); } - -int PythonExtensionBase::setattro( const Py::Object &, const Py::Object & ) -{ missing_method( setattro ); return -1; } - -int PythonExtensionBase::compare( const Py::Object & ) -{ missing_method( compare ); return -1; } - -#if PY_MAJOR_VERSION > 2 || (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION >= 1) -Py::Object PythonExtensionBase::rich_compare( const Py::Object &, int op ) -{ missing_method( rich_compare ); return Py::None(); } +#include "Python3/cxx_extensions.cxx" #endif - -Py::Object PythonExtensionBase::repr() -{ missing_method( repr ); return Py::Nothing(); } - -Py::Object PythonExtensionBase::str() -{ missing_method( str ); return Py::Nothing(); } - -long PythonExtensionBase::hash() -{ missing_method( hash ); return -1; } - -Py::Object PythonExtensionBase::call( const Py::Object &, const Py::Object & ) -{ missing_method( call ); return Py::Nothing(); } - -Py::Object PythonExtensionBase::iter() -{ missing_method( iter ); return Py::Nothing(); } - -PyObject* PythonExtensionBase::iternext() -{ missing_method( iternext ); return NULL; } - - -// Sequence methods -int PythonExtensionBase::sequence_length() -{ missing_method( sequence_length ); return -1; } - -Py::Object PythonExtensionBase::sequence_concat( const Py::Object & ) -{ missing_method( sequence_concat ); return Py::Nothing(); } - -Py::Object PythonExtensionBase::sequence_repeat( Py_ssize_t ) -{ missing_method( sequence_repeat ); return Py::Nothing(); } - -Py::Object PythonExtensionBase::sequence_item( Py_ssize_t ) -{ missing_method( sequence_item ); return Py::Nothing(); } - -Py::Object PythonExtensionBase::sequence_slice( Py_ssize_t, Py_ssize_t ) -{ missing_method( sequence_slice ); return Py::Nothing(); } - -int PythonExtensionBase::sequence_ass_item( Py_ssize_t, const Py::Object & ) -{ missing_method( sequence_ass_item ); return -1; } - -int PythonExtensionBase::sequence_ass_slice( Py_ssize_t, Py_ssize_t, const Py::Object & ) -{ missing_method( sequence_ass_slice ); return -1; } - - -// Mapping -int PythonExtensionBase::mapping_length() -{ missing_method( mapping_length ); return -1; } - -Py::Object PythonExtensionBase::mapping_subscript( const Py::Object & ) -{ missing_method( mapping_subscript ); return Py::Nothing(); } - -int PythonExtensionBase::mapping_ass_subscript( const Py::Object &, const Py::Object & ) -{ missing_method( mapping_ass_subscript ); return -1; } - - -// Number -int PythonExtensionBase::number_nonzero() -{ missing_method( number_nonzero ); return -1; } - -Py::Object PythonExtensionBase::number_negative() -{ missing_method( number_negative ); return Py::Nothing(); } - -Py::Object PythonExtensionBase::number_positive() -{ missing_method( number_positive ); return Py::Nothing(); } - -Py::Object PythonExtensionBase::number_absolute() -{ missing_method( number_absolute ); return Py::Nothing(); } - -Py::Object PythonExtensionBase::number_invert() -{ missing_method( number_invert ); return Py::Nothing(); } - -Py::Object PythonExtensionBase::number_int() -{ missing_method( number_int ); return Py::Nothing(); } - -Py::Object PythonExtensionBase::number_float() -{ missing_method( number_float ); return Py::Nothing(); } - -Py::Object PythonExtensionBase::number_long() -{ missing_method( number_long ); return Py::Nothing(); } - -Py::Object PythonExtensionBase::number_oct() -{ missing_method( number_oct ); return Py::Nothing(); } - -Py::Object PythonExtensionBase::number_hex() -{ missing_method( number_hex ); return Py::Nothing(); } - -Py::Object PythonExtensionBase::number_add( const Py::Object & ) -{ missing_method( number_add ); return Py::Nothing(); } - -Py::Object PythonExtensionBase::number_subtract( const Py::Object & ) -{ missing_method( number_subtract ); return Py::Nothing(); } - -Py::Object PythonExtensionBase::number_multiply( const Py::Object & ) -{ missing_method( number_multiply ); return Py::Nothing(); } - -Py::Object PythonExtensionBase::number_divide( const Py::Object & ) -{ missing_method( number_divide ); return Py::Nothing(); } - -Py::Object PythonExtensionBase::number_remainder( const Py::Object & ) -{ missing_method( number_remainder ); return Py::Nothing(); } - -Py::Object PythonExtensionBase::number_divmod( const Py::Object & ) -{ missing_method( number_divmod ); return Py::Nothing(); } - -Py::Object PythonExtensionBase::number_lshift( const Py::Object & ) -{ missing_method( number_lshift ); return Py::Nothing(); } - -Py::Object PythonExtensionBase::number_rshift( const Py::Object & ) -{ missing_method( number_rshift ); return Py::Nothing(); } - -Py::Object PythonExtensionBase::number_and( const Py::Object & ) -{ missing_method( number_and ); return Py::Nothing(); } - -Py::Object PythonExtensionBase::number_xor( const Py::Object & ) -{ missing_method( number_xor ); return Py::Nothing(); } - -Py::Object PythonExtensionBase::number_or( const Py::Object & ) -{ missing_method( number_or ); return Py::Nothing(); } - -Py::Object PythonExtensionBase::number_power( const Py::Object &, const Py::Object & ) -{ missing_method( number_power ); return Py::Nothing(); } - - -// Buffer -Py_ssize_t PythonExtensionBase::buffer_getreadbuffer( Py_ssize_t, void** ) -{ missing_method( buffer_getreadbuffer ); return -1; } - -Py_ssize_t PythonExtensionBase::buffer_getwritebuffer( Py_ssize_t, void** ) -{ missing_method( buffer_getwritebuffer ); return -1; } - -Py_ssize_t PythonExtensionBase::buffer_getsegcount( Py_ssize_t* ) -{ missing_method( buffer_getsegcount ); return -1; } - -//-------------------------------------------------------------------------------- -// -// Method call handlers for -// PythonExtensionBase -// ExtensionModuleBase -// -//-------------------------------------------------------------------------------- - -extern "C" PyObject *method_keyword_call_handler( PyObject *_self_and_name_tuple, PyObject *_args, PyObject *_keywords ) -{ - try - { - Tuple self_and_name_tuple( _self_and_name_tuple ); - - PyObject *self_in_cobject = self_and_name_tuple[0].ptr(); - void *self_as_void = PyCObject_AsVoidPtr( self_in_cobject ); - if( self_as_void == NULL ) - return NULL; - - ExtensionModuleBase *self = static_cast( self_as_void ); - - String py_name( self_and_name_tuple[1] ); - std::string name( py_name.as_std_string() ); - - Tuple args( _args ); - if( _keywords == NULL ) - { - Dict keywords; // pass an empty dict - - Object result( self->invoke_method_keyword( name, args, keywords ) ); - return new_reference_to( result.ptr() ); - } - - Dict keywords( _keywords ); - - Object result( self->invoke_method_keyword( name, args, keywords ) ); - return new_reference_to( result.ptr() ); - } - catch( Exception & ) - { - return 0; - } -} - -extern "C" PyObject *method_varargs_call_handler( PyObject *_self_and_name_tuple, PyObject *_args ) -{ - try - { - Tuple self_and_name_tuple( _self_and_name_tuple ); - - PyObject *self_in_cobject = self_and_name_tuple[0].ptr(); - void *self_as_void = PyCObject_AsVoidPtr( self_in_cobject ); - if( self_as_void == NULL ) - return NULL; - - ExtensionModuleBase *self = static_cast( self_as_void ); - - String py_name( self_and_name_tuple[1] ); - std::string name( py_name.as_std_string() ); - - Tuple args( _args ); - - Object result( self->invoke_method_varargs( name, args ) ); - - return new_reference_to( result.ptr() ); - } - catch( Exception & ) - { - return 0; - } -} - -extern "C" void do_not_dealloc( void * ) -{} - - -//-------------------------------------------------------------------------------- -// -// ExtensionExceptionType -// -//-------------------------------------------------------------------------------- -ExtensionExceptionType::ExtensionExceptionType() - : Py::Object() -{ -} - -void ExtensionExceptionType::init( ExtensionModuleBase &module, const std::string& name ) -{ - std::string module_name( module.fullName() ); - module_name += "."; - module_name += name; - - set( PyErr_NewException( const_cast( module_name.c_str() ), NULL, NULL ), true ); -} - -void ExtensionExceptionType::init( ExtensionModuleBase &module, const std::string& name, ExtensionExceptionType &parent) - { - std::string module_name( module.fullName() ); - module_name += "."; - module_name += name; - - set( PyErr_NewException( const_cast( module_name.c_str() ), parent.ptr(), NULL ), true ); -} - -ExtensionExceptionType::~ExtensionExceptionType() -{ -} - -Exception::Exception( ExtensionExceptionType &exception, const std::string& reason ) -{ - PyErr_SetString (exception.ptr(), reason.c_str()); -} - -Exception::Exception( ExtensionExceptionType &exception, Object &reason ) -{ - PyErr_SetObject (exception.ptr(), reason.ptr()); -} - -Exception::Exception( PyObject* exception, Object &reason ) -{ - PyErr_SetObject (exception, reason.ptr()); -} - -} // end of namespace Py diff -Nru matplotlib-0.99.3/CXX/cxxsupport.cxx matplotlib-1.0.1/CXX/cxxsupport.cxx --- matplotlib-0.99.3/CXX/cxxsupport.cxx 2009-07-31 15:14:42.000000000 +0000 +++ matplotlib-1.0.1/CXX/cxxsupport.cxx 2010-07-07 01:41:53.000000000 +0000 @@ -34,141 +34,10 @@ // DAMAGE. // //----------------------------------------------------------------------------- +#include "CXX/WrapPython.h" -#include "CXX/Objects.hxx" -namespace Py { - -Py_UNICODE unicode_null_string[1] = { 0 }; - -Type Object::type () const -{ - return Type (PyObject_Type (p), true); -} - -String Object::str () const -{ - return String (PyObject_Str (p), true); -} - -String Object::repr () const -{ - return String (PyObject_Repr (p), true); -} - -std::string Object::as_string() const -{ - return static_cast(str()); -} - -List Object::dir () const - { - return List (PyObject_Dir (p), true); - } - -bool Object::isType (const Type& t) const -{ - return type ().ptr() == t.ptr(); -} - -Char::operator String() const -{ - return String(ptr()); -} - -// TMM: non-member operaters for iterators - see above -// I've also made a bug fix in respect to the cxx code -// (dereffed the left.seq and right.seq comparison) -bool operator==(const Sequence::iterator& left, const Sequence::iterator& right) -{ - return left.eql( right ); -} - -bool operator!=(const Sequence::iterator& left, const Sequence::iterator& right) -{ - return left.neq( right ); -} - -bool operator< (const Sequence::iterator& left, const Sequence::iterator& right) -{ - return left.lss( right ); -} - -bool operator> (const Sequence::iterator& left, const Sequence::iterator& right) -{ - return left.gtr( right ); -} - -bool operator<=(const Sequence::iterator& left, const Sequence::iterator& right) -{ - return left.leq( right ); -} - -bool operator>=(const Sequence::iterator& left, const Sequence::iterator& right) -{ - return left.geq( right ); -} - -// now for const_iterator -bool operator==(const Sequence::const_iterator& left, const Sequence::const_iterator& right) -{ - return left.eql( right ); -} - -bool operator!=(const Sequence::const_iterator& left, const Sequence::const_iterator& right) -{ - return left.neq( right ); -} - -bool operator< (const Sequence::const_iterator& left, const Sequence::const_iterator& right) -{ - return left.lss( right ); -} - -bool operator> (const Sequence::const_iterator& left, const Sequence::const_iterator& right) -{ - return left.gtr( right ); -} - -bool operator<=(const Sequence::const_iterator& left, const Sequence::const_iterator& right) -{ - return left.leq( right ); -} - -bool operator>=(const Sequence::const_iterator& left, const Sequence::const_iterator& right) -{ - return left.geq( right ); -} - -// For mappings: -bool operator==(const Mapping::iterator& left, const Mapping::iterator& right) -{ - return left.eql( right ); -} - -bool operator!=(const Mapping::iterator& left, const Mapping::iterator& right) -{ - return left.neq( right ); -} - -// now for const_iterator -bool operator==(const Mapping::const_iterator& left, const Mapping::const_iterator& right) -{ - return left.eql( right ); -} - -bool operator!=(const Mapping::const_iterator& left, const Mapping::const_iterator& right) -{ - return left.neq( right ); -} - -// TMM: 31May'01 - Added the #ifndef so I can exclude iostreams. -#ifndef CXX_NO_IOSTREAMS -// output - -std::ostream& operator<< (std::ostream& os, const Object& ob) -{ - return (os << static_cast(ob.str())); -} +#if PY_MAJOR_VERSION == 2 +#include "Python2/cxxsupport.cxx" +#else +#include "Python3/cxxsupport.cxx" #endif - -} // Py diff -Nru matplotlib-0.99.3/CXX/Exception.hxx matplotlib-1.0.1/CXX/Exception.hxx --- matplotlib-0.99.3/CXX/Exception.hxx 2009-07-31 15:14:42.000000000 +0000 +++ matplotlib-1.0.1/CXX/Exception.hxx 2010-07-07 01:41:53.000000000 +0000 @@ -34,216 +34,10 @@ // DAMAGE. // //----------------------------------------------------------------------------- - -#ifndef __CXX_Exception_h -#define __CXX_Exception_h - #include "CXX/WrapPython.h" -#include "CXX/Version.hxx" -#include "CXX/Config.hxx" -#include "CXX/IndirectPythonInterface.hxx" - -#include -#include - -// This mimics the Python structure, in order to minimize confusion -namespace Py -{ - class ExtensionExceptionType; - - class Object; - - class Exception - { - public: - Exception( ExtensionExceptionType &exception, const std::string& reason ); - Exception( ExtensionExceptionType &exception, Object &reason ); - - explicit Exception () - {} - - Exception (const std::string& reason) - { - PyErr_SetString (Py::_Exc_RuntimeError(), reason.c_str()); - } - - Exception (PyObject* exception, const std::string& reason) - { - PyErr_SetString (exception, reason.c_str()); - } - - Exception (PyObject* exception, Object &reason); - - void clear() // clear the error - // technically but not philosophically const - { - PyErr_Clear(); - } - }; - - - // Abstract - class StandardError: public Exception - { - protected: - explicit StandardError() - {} - }; - - class LookupError: public StandardError - { - protected: - explicit LookupError() - {} - }; - - class ArithmeticError: public StandardError - { - protected: - explicit ArithmeticError() - {} - }; - - class EnvironmentError: public StandardError - { - protected: - explicit EnvironmentError() - {} - }; - - // Concrete - - class TypeError: public StandardError - { - public: - TypeError (const std::string& reason) - : StandardError() - { - PyErr_SetString (Py::_Exc_TypeError(),reason.c_str()); - } - }; - - class IndexError: public LookupError - { - public: - IndexError (const std::string& reason) - : LookupError() - { - PyErr_SetString (Py::_Exc_IndexError(), reason.c_str()); - } - }; - - class AttributeError: public StandardError - { - public: - AttributeError (const std::string& reason) - : StandardError() - { - PyErr_SetString (Py::_Exc_AttributeError(), reason.c_str()); - } - }; - - class NameError: public StandardError - { - public: - NameError (const std::string& reason) - : StandardError() - { - PyErr_SetString (Py::_Exc_NameError(), reason.c_str()); - } - }; - - class RuntimeError: public StandardError - { - public: - RuntimeError (const std::string& reason) - : StandardError() - { - PyErr_SetString (Py::_Exc_RuntimeError(), reason.c_str()); - } - }; - - class SystemError: public StandardError - { - public: - SystemError (const std::string& reason) - : StandardError() - { - PyErr_SetString (Py::_Exc_SystemError(),reason.c_str()); - } - }; - - class KeyError: public LookupError - { - public: - KeyError (const std::string& reason) - : LookupError() - { - PyErr_SetString (Py::_Exc_KeyError(),reason.c_str()); - } - }; - - - class ValueError: public StandardError - { - public: - ValueError (const std::string& reason) - : StandardError() - { - PyErr_SetString (Py::_Exc_ValueError(), reason.c_str()); - } - }; - - class OverflowError: public ArithmeticError - { - public: - OverflowError (const std::string& reason) - : ArithmeticError() - { - PyErr_SetString (Py::_Exc_OverflowError(), reason.c_str()); - } - }; - - class ZeroDivisionError: public ArithmeticError - { - public: - ZeroDivisionError (const std::string& reason) - : ArithmeticError() - { - PyErr_SetString (Py::_Exc_ZeroDivisionError(), reason.c_str()); - } - }; - - class FloatingPointError: public ArithmeticError - { - public: - FloatingPointError (const std::string& reason) - : ArithmeticError() - { - PyErr_SetString (Py::_Exc_FloatingPointError(), reason.c_str()); - } - }; - - class MemoryError: public StandardError - { - public: - MemoryError (const std::string& reason) - : StandardError() - { - PyErr_SetString (Py::_Exc_MemoryError(), reason.c_str()); - } - }; - - class SystemExit: public StandardError - { - public: - SystemExit (const std::string& reason) - : StandardError() - { - PyErr_SetString (Py::_Exc_SystemExit(),reason.c_str()); - } - }; - -}// Py +#if PY_MAJOR_VERSION == 2 +#include "CXX/Python2/Exception.hxx" +#else +#include "CXX/Python3/Exception.hxx" #endif diff -Nru matplotlib-0.99.3/CXX/Extensions.hxx matplotlib-1.0.1/CXX/Extensions.hxx --- matplotlib-0.99.3/CXX/Extensions.hxx 2009-07-31 15:14:42.000000000 +0000 +++ matplotlib-1.0.1/CXX/Extensions.hxx 2010-07-07 01:41:53.000000000 +0000 @@ -34,895 +34,10 @@ // DAMAGE. // //----------------------------------------------------------------------------- - -#ifndef __CXX_Extensions__h -#define __CXX_Extensions__h - - -#ifdef _MSC_VER -// disable warning C4786: symbol greater than 255 character, -// okay to ignore -#pragma warning(disable: 4786) -#endif - #include "CXX/WrapPython.h" -#include "CXX/Version.hxx" -#include "CXX/Config.hxx" -#include "CXX/Objects.hxx" - -extern "C" -{ - extern PyObject py_object_initializer; -} - -#include - -// std::map / hash_map selection and declarations ---------------------------- -#if !defined( PYCXX_USING_HASH_MAP ) - -#include +#if PY_MAJOR_VERSION == 2 +#include "CXX/Python2/Extensions.hxx" #else - -#if defined( __GNUC__) && !defined( _STLPORT_VERSION ) - #include -#else - #include -#endif -#if defined( _STLPORT_VERSION ) - #define __PYCXX_HASHMAP_NAMESPACE std - using namespace std; -#elif defined ( _MSC_VER ) && !defined( __INTEL_COMPILER ) && !defined( __ICC ) && !defined( __ICL ) && !defined( __ECC ) - #define __PYCXX_HASHMAP_NAMESPACE stdext - using namespace stdext; -#elif defined( __INTEL_COMPILER ) || defined( __ICC ) || defined( __ICL ) || defined( __ECC ) - #define __PYCXX_HASHMAP_NAMESPACE stdext - using namespace stdext; -#elif defined( __GNUC__ ) - #define __PYCXX_HASHMAP_NAMESPACE __gnu_cxx - using namespace __gnu_cxx; -#else - #define __PYCXX_HASHMAP_NAMESPACE std - using namespace std; -#endif - -class __pycxx_str_hash_func -{ -public: - enum - { - // parameters for hash table - bucket_size = 4, // 0 < bucket_size - min_buckets = 8 // min_buckets = 2 ^^ N, 0 < N - }; - - // http://www.azillionmonkeys.com/qed/hash.html - size_t operator()( const std::string &str ) const - { - const unsigned char * data = reinterpret_cast( str.c_str() ); - int len = (int)str.length(); - unsigned int hash = len; - unsigned int tmp; - int rem; - - if (len <= 0 || data == NULL) - return 0; - - rem = len & 3; - len >>= 2; - - /* Main loop */ - for (;len > 0; len--) - { - hash += (data[1] << 8) | data[0]; - tmp = (((data[3] << 8) | data[2]) << 11) ^ hash; - hash = (hash << 16) ^ tmp; - data += 2*sizeof (unsigned short); - hash += hash >> 11; - } - - /* Handle end cases */ - switch (rem) - { - case 3: hash += (data[1] << 8) | data[0]; - hash ^= hash << 16; - hash ^= data[sizeof (unsigned short)] << 18; - hash += hash >> 11; - break; - case 2: hash += (data[1] << 8) | data[0]; - hash ^= hash << 11; - hash += hash >> 17; - break; - case 1: hash += *data; - hash ^= hash << 10; - hash += hash >> 1; - } - - /* Force "avalanching" of final 127 bits */ - hash ^= hash << 3; - hash += hash >> 5; - hash ^= hash << 4; - hash += hash >> 17; - hash ^= hash << 25; - hash += hash >> 6; - - return hash; - } - - bool operator()(const std::string &str_1, const std::string &str_2) const - { - // test if str_1 ordered before str_2 - return str_1 < str_2; - } -}; -#endif // PYCXX_USING_HASH_MAP -// ---------------------------------------------------------------------- - -namespace Py -{ - class ExtensionModuleBase; - - // Make an Exception Type for use in raising custom exceptions - class ExtensionExceptionType : public Object - { - public: - ExtensionExceptionType(); - virtual ~ExtensionExceptionType(); - - // call init to create the type - void init( ExtensionModuleBase &module, const std::string& name, ExtensionExceptionType &parent ); - void init( ExtensionModuleBase &module, const std::string& name ); - }; - - - class MethodTable - { - public: - MethodTable(); - virtual ~MethodTable(); - - void add(const char* method_name, PyCFunction f, const char* doc="", int flag=1); - PyMethodDef* table(); - - protected: - std::vector t; // accumulator of PyMethodDef's - PyMethodDef *mt; // Actual method table produced when full - - static PyMethodDef method (const char* method_name, PyCFunction f, int flags = 1, const char* doc=""); - - private: - // - // prevent the compiler generating these unwanted functions - // - MethodTable(const MethodTable& m); //unimplemented - void operator=(const MethodTable& m); //unimplemented - - }; // end class MethodTable - - extern "C" - { - typedef PyObject *(*method_varargs_call_handler_t)( PyObject *_self, PyObject *_args ); - typedef PyObject *(*method_keyword_call_handler_t)( PyObject *_self, PyObject *_args, PyObject *_dict ); - } - - template - class MethodDefExt : public PyMethodDef - { - public: - typedef Object (T::*method_varargs_function_t)( const Tuple &args ); - typedef Object (T::*method_keyword_function_t)( const Tuple &args, const Dict &kws ); - - MethodDefExt - ( - const char *_name, - method_varargs_function_t _function, - method_varargs_call_handler_t _handler, - const char *_doc - ) - { - ext_meth_def.ml_name = const_cast(_name); - ext_meth_def.ml_meth = _handler; - ext_meth_def.ml_flags = METH_VARARGS; - ext_meth_def.ml_doc = const_cast(_doc); - - ext_varargs_function = _function; - ext_keyword_function = NULL; - } - - MethodDefExt - ( - const char *_name, - method_keyword_function_t _function, - method_keyword_call_handler_t _handler, - const char *_doc - ) - { - ext_meth_def.ml_name = const_cast(_name); - ext_meth_def.ml_meth = method_varargs_call_handler_t( _handler ); - ext_meth_def.ml_flags = METH_VARARGS|METH_KEYWORDS; - ext_meth_def.ml_doc = const_cast(_doc); - - ext_varargs_function = NULL; - ext_keyword_function = _function; - } - - ~MethodDefExt() - {} - - PyMethodDef ext_meth_def; - method_varargs_function_t ext_varargs_function; - method_keyword_function_t ext_keyword_function; - }; - - class ExtensionModuleBase - { - public: - ExtensionModuleBase( const char *name ); - virtual ~ExtensionModuleBase(); - - Module module(void) const; // only valid after initialize() has been called - Dict moduleDictionary(void) const; // only valid after initialize() has been called - - virtual Object invoke_method_keyword( const std::string &_name, const Tuple &_args, const Dict &_keywords ) = 0; - virtual Object invoke_method_varargs( const std::string &_name, const Tuple &_args ) = 0; - - const std::string &name() const; - const std::string &fullName() const; - - protected: - // Initialize the module - void initialize( const char *module_doc ); - - const std::string module_name; - const std::string full_module_name; - MethodTable method_table; - - private: - - // - // prevent the compiler generating these unwanted functions - // - ExtensionModuleBase( const ExtensionModuleBase & ); //unimplemented - void operator=( const ExtensionModuleBase & ); //unimplemented - - }; - - extern "C" PyObject *method_keyword_call_handler( PyObject *_self_and_name_tuple, PyObject *_args, PyObject *_keywords ); - extern "C" PyObject *method_varargs_call_handler( PyObject *_self_and_name_tuple, PyObject *_args ); - extern "C" void do_not_dealloc( void * ); - - - template - class ExtensionModule : public ExtensionModuleBase - { - public: - ExtensionModule( const char *name ) - : ExtensionModuleBase( name ) - {} - virtual ~ExtensionModule() - {} - - protected: - typedef Object (T::*method_varargs_function_t)( const Tuple &args ); - typedef Object (T::*method_keyword_function_t)( const Tuple &args, const Dict &kws ); - -#if defined( PYCXX_USING_HASH_MAP ) - typedef __PYCXX_HASHMAP_NAMESPACE::hash_map *, __pycxx_str_hash_func> method_map_t; -#else - typedef std::map *> method_map_t; -#endif - - static void add_varargs_method( const char *name, method_varargs_function_t function, const char *doc="" ) - { - method_map_t &mm = methods(); - - MethodDefExt *method_definition = new MethodDefExt - ( - name, - function, - method_varargs_call_handler, - doc - ); - - mm[std::string( name )] = method_definition; - } - - static void add_keyword_method( const char *name, method_keyword_function_t function, const char *doc="" ) - { - method_map_t &mm = methods(); - - MethodDefExt *method_definition = new MethodDefExt - ( - name, - function, - method_keyword_call_handler, - doc - ); - - mm[std::string( name )] = method_definition; - } - - void initialize( const char *module_doc="" ) - { - ExtensionModuleBase::initialize( module_doc ); - Dict dict( moduleDictionary() ); - - // - // put each of the methods into the modules dictionary - // so that we get called back at the function in T. - // - method_map_t &mm = methods(); - EXPLICIT_TYPENAME method_map_t::const_iterator i; - - for( i=mm.begin(); i != mm.end(); ++i ) - { - MethodDefExt *method_definition = (*i).second; - - static PyObject *self = PyCObject_FromVoidPtr( this, do_not_dealloc ); - - Tuple args( 2 ); - args[0] = Object( self ); - args[1] = String( (*i).first ); - - PyObject *func = PyCFunction_New - ( - &method_definition->ext_meth_def, - new_reference_to( args ) - ); - - dict[ (*i).first ] = Object( func ); - } - } - - protected: // Tom Malcolmson reports that derived classes need access to these - - static method_map_t &methods(void) - { - static method_map_t *map_of_methods = NULL; - if( map_of_methods == NULL ) - map_of_methods = new method_map_t; - - return *map_of_methods; - } - - - // this invoke function must be called from within a try catch block - virtual Object invoke_method_keyword( const std::string &name, const Tuple &args, const Dict &keywords ) - { - method_map_t &mm = methods(); - MethodDefExt *meth_def = mm[ name ]; - if( meth_def == NULL ) - { - std::string error_msg( "CXX - cannot invoke keyword method named " ); - error_msg += name; - throw RuntimeError( error_msg ); - } - - // cast up to the derived class - T *self = static_cast(this); - - return (self->*meth_def->ext_keyword_function)( args, keywords ); - } - - // this invoke function must be called from within a try catch block - virtual Object invoke_method_varargs( const std::string &name, const Tuple &args ) - { - method_map_t &mm = methods(); - MethodDefExt *meth_def = mm[ name ]; - if( meth_def == NULL ) - { - std::string error_msg( "CXX - cannot invoke varargs method named " ); - error_msg += name; - throw RuntimeError( error_msg ); - } - - // cast up to the derived class - T *self = static_cast(this); - - return (self->*meth_def->ext_varargs_function)( args ); - } - - private: - // - // prevent the compiler generating these unwanted functions - // - ExtensionModule( const ExtensionModule & ); //unimplemented - void operator=( const ExtensionModule & ); //unimplemented - }; - - - class PythonType - { - public: - // if you define one sequence method you must define - // all of them except the assigns - - PythonType (size_t base_size, int itemsize, const char *default_name ); - virtual ~PythonType (); - - const char *getName () const; - const char *getDoc () const; - - PyTypeObject* type_object () const; - PythonType & name (const char* nam); - PythonType & doc (const char* d); - PythonType & dealloc(void (*f)(PyObject*)); - - PythonType & supportPrint(void); - PythonType & supportGetattr(void); - PythonType & supportSetattr(void); - PythonType & supportGetattro(void); - PythonType & supportSetattro(void); - PythonType & supportCompare(void); -#if PY_MAJOR_VERSION > 2 || (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION >= 1) - PythonType & supportRichCompare(void); -#endif - PythonType & supportRepr(void); - PythonType & supportStr(void); - PythonType & supportHash(void); - PythonType & supportCall(void); - PythonType & supportIter(void); - - PythonType & supportSequenceType(void); - PythonType & supportMappingType(void); - PythonType & supportNumberType(void); - PythonType & supportBufferType(void); - - protected: - PyTypeObject *table; - PySequenceMethods *sequence_table; - PyMappingMethods *mapping_table; - PyNumberMethods *number_table; - PyBufferProcs *buffer_table; - - void init_sequence(); - void init_mapping(); - void init_number(); - void init_buffer(); - - private: - // - // prevent the compiler generating these unwanted functions - // - PythonType (const PythonType& tb); // unimplemented - void operator=(const PythonType& t); // unimplemented - - }; // end of PythonType - - - - // Class PythonExtension is what you inherit from to create - // a new Python extension type. You give your class itself - // as the template paramter. - - // There are two ways that extension objects can get destroyed. - // 1. Their reference count goes to zero - // 2. Someone does an explicit delete on a pointer. - // In (1) the problem is to get the destructor called - // We register a special deallocator in the Python type object - // (see behaviors()) to do this. - // In (2) there is no problem, the dtor gets called. - - // PythonExtension does not use the usual Python heap allocator, - // instead using new/delete. We do the setting of the type object - // and reference count, usually done by PyObject_New, in the - // base class ctor. - - // This special deallocator does a delete on the pointer. - - - class PythonExtensionBase : public PyObject - { - public: - PythonExtensionBase(); - virtual ~PythonExtensionBase(); - - public: - virtual int print( FILE *, int ); - virtual Object getattr( const char * ) = 0; - virtual int setattr( const char *, const Object & ); - virtual Object getattro( const Object & ); - virtual int setattro( const Object &, const Object & ); - virtual int compare( const Object & ); - virtual Object rich_compare( const Object &, int op ); - virtual Object repr(); - virtual Object str(); - virtual long hash(); - virtual Object call( const Object &, const Object & ); - virtual Object iter(); - virtual PyObject* iternext(); - - // Sequence methods - virtual int sequence_length(); - virtual Object sequence_concat( const Object & ); - virtual Object sequence_repeat( Py_ssize_t ); - virtual Object sequence_item( Py_ssize_t ); - virtual Object sequence_slice( Py_ssize_t, Py_ssize_t ); - virtual int sequence_ass_item( Py_ssize_t, const Object & ); - virtual int sequence_ass_slice( Py_ssize_t, Py_ssize_t, const Object & ); - - // Mapping - virtual int mapping_length(); - virtual Object mapping_subscript( const Object & ); - virtual int mapping_ass_subscript( const Object &, const Object & ); - - // Number - virtual int number_nonzero(); - virtual Object number_negative(); - virtual Object number_positive(); - virtual Object number_absolute(); - virtual Object number_invert(); - virtual Object number_int(); - virtual Object number_float(); - virtual Object number_long(); - virtual Object number_oct(); - virtual Object number_hex(); - virtual Object number_add( const Object & ); - virtual Object number_subtract( const Object & ); - virtual Object number_multiply( const Object & ); - virtual Object number_divide( const Object & ); - virtual Object number_remainder( const Object & ); - virtual Object number_divmod( const Object & ); - virtual Object number_lshift( const Object & ); - virtual Object number_rshift( const Object & ); - virtual Object number_and( const Object & ); - virtual Object number_xor( const Object & ); - virtual Object number_or( const Object & ); - virtual Object number_power( const Object &, const Object & ); - - // Buffer - virtual Py_ssize_t buffer_getreadbuffer( Py_ssize_t, void** ); - virtual Py_ssize_t buffer_getwritebuffer( Py_ssize_t, void** ); - virtual Py_ssize_t buffer_getsegcount( Py_ssize_t* ); - - private: - void missing_method( void ); - static PyObject *method_call_handler( PyObject *self, PyObject *args ); - }; - - template - class PythonExtension: public PythonExtensionBase - { - public: - static PyTypeObject* type_object() - { - return behaviors().type_object(); - } - - static int check( PyObject *p ) - { - // is p like me? - return p->ob_type == type_object(); - } - - static int check( const Object& ob ) - { - return check( ob.ptr()); - } - - - // - // every object needs getattr implemented - // to support methods - // - virtual Object getattr( const char *name ) - { - return getattr_methods( name ); - } - - protected: - explicit PythonExtension() - : PythonExtensionBase() - { - #ifdef PyObject_INIT - (void)PyObject_INIT( this, type_object() ); - #else - ob_refcnt = 1; - ob_type = type_object(); - #endif - - // every object must support getattr - behaviors().supportGetattr(); - } - - virtual ~PythonExtension() - {} - - static PythonType &behaviors() - { - static PythonType* p; - if( p == NULL ) - { -#if defined( _CPPRTTI ) || defined(__GNUG__) - const char *default_name = (typeid ( T )).name(); -#else - const char *default_name = "unknown"; -#endif - p = new PythonType( sizeof( T ), 0, default_name ); - p->dealloc( extension_object_deallocator ); - } - - return *p; - } - - - typedef Object (T::*method_varargs_function_t)( const Tuple &args ); - typedef Object (T::*method_keyword_function_t)( const Tuple &args, const Dict &kws ); - -#if defined( PYCXX_USING_HASH_MAP ) - typedef __PYCXX_HASHMAP_NAMESPACE::hash_map *, __pycxx_str_hash_func> method_map_t; -#else - typedef std::map *> method_map_t; -#endif - - // support the default attributes, __name__, __doc__ and methods - virtual Object getattr_default( const char *_name ) - { - std::string name( _name ); - - if( name == "__name__" && type_object()->tp_name != NULL ) - { - return Py::String( type_object()->tp_name ); - } - if( name == "__doc__" && type_object()->tp_doc != NULL ) - { - return Py::String( type_object()->tp_doc ); - } - -// trying to fake out being a class for help() -// else if( name == "__bases__" ) -// { -// return Py::Tuple(0); -// } -// else if( name == "__module__" ) -// { -// return Py::Nothing(); -// } -// else if( name == "__dict__" ) -// { -// return Py::Dict(); -// } - - return getattr_methods( _name ); - } - - // turn a name into function object - virtual Object getattr_methods( const char *_name ) - { - std::string name( _name ); - - method_map_t &mm = methods(); - - EXPLICIT_TYPENAME method_map_t::const_iterator i; - - if( name == "__methods__" ) - { - List methods; - - for( i = mm.begin(); i != mm.end(); ++i ) - methods.append( String( (*i).first ) ); - - return methods; - } - - // see if name exists and get entry with method - i = mm.find( name ); - if( i == mm.end() ) - throw AttributeError( name ); - - Tuple self( 2 ); - - self[0] = Object( this ); - self[1] = String( name ); - - MethodDefExt *method_definition = i->second; - - PyObject *func = PyCFunction_New( &method_definition->ext_meth_def, self.ptr() ); - - return Object(func, true); - } - - static void add_varargs_method( const char *name, method_varargs_function_t function, const char *doc="" ) - { - method_map_t &mm = methods(); - - // check that all methods added are unique - EXPLICIT_TYPENAME method_map_t::const_iterator i; - i = mm.find( name ); - if( i != mm.end() ) - throw AttributeError( name ); - - MethodDefExt *method_definition = new MethodDefExt - ( - name, - function, - method_varargs_call_handler, - doc - ); - - mm[std::string( name )] = method_definition; - } - - static void add_keyword_method( const char *name, method_keyword_function_t function, const char *doc="" ) - { - method_map_t &mm = methods(); - - // check that all methods added are unique - EXPLICIT_TYPENAME method_map_t::const_iterator i; - i = mm.find( name ); - if( i != mm.end() ) - throw AttributeError( name ); - - MethodDefExt *method_definition = new MethodDefExt - ( - name, - function, - method_keyword_call_handler, - doc - ); - - mm[std::string( name )] = method_definition; - } - - private: - static method_map_t &methods(void) - { - static method_map_t *map_of_methods = NULL; - if( map_of_methods == NULL ) - map_of_methods = new method_map_t; - - return *map_of_methods; - } - - static PyObject *method_keyword_call_handler( PyObject *_self_and_name_tuple, PyObject *_args, PyObject *_keywords ) - { - try - { - Tuple self_and_name_tuple( _self_and_name_tuple ); - - PyObject *self_in_cobject = self_and_name_tuple[0].ptr(); - T *self = static_cast( self_in_cobject ); - - String name( self_and_name_tuple[1] ); - - method_map_t &mm = methods(); - - EXPLICIT_TYPENAME method_map_t::const_iterator i; - i = mm.find( name ); - if( i == mm.end() ) - return 0; - - MethodDefExt *meth_def = i->second; - - Tuple args( _args ); - - // _keywords may be NULL so be careful about the way the dict is created - Dict keywords; - if( _keywords != NULL ) - keywords = Dict( _keywords ); - - Object result( (self->*meth_def->ext_keyword_function)( args, keywords ) ); - - return new_reference_to( result.ptr() ); - } - catch( Exception & ) - { - return 0; - } - } - - static PyObject *method_varargs_call_handler( PyObject *_self_and_name_tuple, PyObject *_args ) - { - try - { - Tuple self_and_name_tuple( _self_and_name_tuple ); - - PyObject *self_in_cobject = self_and_name_tuple[0].ptr(); - T *self = static_cast( self_in_cobject ); - - String name( self_and_name_tuple[1] ); - - method_map_t &mm = methods(); - - EXPLICIT_TYPENAME method_map_t::const_iterator i; - i = mm.find( name ); - if( i == mm.end() ) - return 0; - - MethodDefExt *meth_def = i->second; - - Tuple args( _args ); - - Object result; - - // TMM: 7Jun'01 - Adding try & catch in case of STL debug-mode exceptions. - #ifdef _STLP_DEBUG - try - { - result = (self->*meth_def->ext_varargs_function)( args ); - } - catch (std::__stl_debug_exception) - { - // throw cxx::RuntimeError( sErrMsg ); - throw cxx::RuntimeError( "Error message not set yet." ); - } - #else - result = (self->*meth_def->ext_varargs_function)( args ); - #endif // _STLP_DEBUG - - return new_reference_to( result.ptr() ); - } - catch( Exception & ) - { - return 0; - } - } - - static void extension_object_deallocator ( PyObject* t ) - { - delete (T *)( t ); - } - - // - // prevent the compiler generating these unwanted functions - // - explicit PythonExtension( const PythonExtension& other ); - void operator=( const PythonExtension& rhs ); - }; - - // - // ExtensionObject is an Object that will accept only T's. - // - template - class ExtensionObject: public Object - { - public: - - explicit ExtensionObject ( PyObject *pyob ) - : Object( pyob ) - { - validate(); - } - - ExtensionObject( const ExtensionObject& other ) - : Object( *other ) - { - validate(); - } - - ExtensionObject( const Object& other ) - : Object( *other ) - { - validate(); - } - - ExtensionObject& operator= ( const Object& rhs ) - { - return (*this = *rhs ); - } - - ExtensionObject& operator= ( PyObject* rhsp ) - { - if( ptr() == rhsp ) - return *this; - set( rhsp ); - return *this; - } - - virtual bool accepts ( PyObject *pyob ) const - { - return ( pyob && T::check( pyob )); - } - - // - // Obtain a pointer to the PythonExtension object - // - T *extensionObject(void) - { - return static_cast( ptr() ); - } - }; - -} // Namespace Py -// End of CXX_Extensions.h +#include "CXX/Python3/Extensions.hxx" #endif diff -Nru matplotlib-0.99.3/CXX/IndirectPythonInterface.cxx matplotlib-1.0.1/CXX/IndirectPythonInterface.cxx --- matplotlib-0.99.3/CXX/IndirectPythonInterface.cxx 2009-07-31 15:14:42.000000000 +0000 +++ matplotlib-1.0.1/CXX/IndirectPythonInterface.cxx 2010-07-07 01:41:53.000000000 +0000 @@ -34,564 +34,10 @@ // DAMAGE. // //----------------------------------------------------------------------------- +#include "CXX/WrapPython.h" -#include "CXX/IndirectPythonInterface.hxx" - -namespace Py -{ -bool _Buffer_Check( PyObject *op ) { return (op)->ob_type == _Buffer_Type(); } -bool _CFunction_Check( PyObject *op ) { return (op)->ob_type == _CFunction_Type(); } -bool _Class_Check( PyObject *op ) { return (op)->ob_type == _Class_Type(); } -bool _CObject_Check( PyObject *op ) { return (op)->ob_type == _CObject_Type(); } -bool _Complex_Check( PyObject *op ) { return (op)->ob_type == _Complex_Type(); } -bool _Dict_Check( PyObject *op ) { return (op)->ob_type == _Dict_Type(); } -bool _File_Check( PyObject *op ) { return (op)->ob_type == _File_Type(); } -bool _Float_Check( PyObject *op ) { return (op)->ob_type == _Float_Type(); } -bool _Function_Check( PyObject *op ) { return (op)->ob_type == _Function_Type(); } -bool _Instance_Check( PyObject *op ) { return (op)->ob_type == _Instance_Type(); } -bool _Boolean_Check( PyObject *op ) { return (op)->ob_type == _Bool_Type(); } -bool _Int_Check( PyObject *op ) { return (op)->ob_type == _Int_Type(); } -bool _List_Check( PyObject *o ) { return o->ob_type == _List_Type(); } -bool _Long_Check( PyObject *op ) { return (op)->ob_type == _Long_Type(); } -bool _Method_Check( PyObject *op ) { return (op)->ob_type == _Method_Type(); } -bool _Module_Check( PyObject *op ) { return (op)->ob_type == _Module_Type(); } -bool _Range_Check( PyObject *op ) { return (op)->ob_type == _Range_Type(); } -bool _Slice_Check( PyObject *op ) { return (op)->ob_type == _Slice_Type(); } -bool _String_Check( PyObject *o ) { return o->ob_type == _String_Type(); } -bool _TraceBack_Check( PyObject *v ) { return (v)->ob_type == _TraceBack_Type(); } -bool _Tuple_Check( PyObject *op ) { return (op)->ob_type == _Tuple_Type(); } -bool _Type_Check( PyObject *op ) { return (op)->ob_type == _Type_Type(); } - -#if PY_MAJOR_VERSION >= 2 -bool _Unicode_Check( PyObject *op ) { return (op)->ob_type == _Unicode_Type(); } -#endif - - - -#if defined(PY_WIN32_DELAYLOAD_PYTHON_DLL) - -#if defined(MS_WINDOWS) -#include - - -static HMODULE python_dll; - -static PyObject *ptr__Exc_ArithmeticError = NULL; -static PyObject *ptr__Exc_AssertionError = NULL; -static PyObject *ptr__Exc_AttributeError = NULL; -static PyObject *ptr__Exc_EnvironmentError = NULL; -static PyObject *ptr__Exc_EOFError = NULL; -static PyObject *ptr__Exc_Exception = NULL; -static PyObject *ptr__Exc_FloatingPointError = NULL; -static PyObject *ptr__Exc_ImportError = NULL; -static PyObject *ptr__Exc_IndexError = NULL; -static PyObject *ptr__Exc_IOError = NULL; -static PyObject *ptr__Exc_KeyboardInterrupt = NULL; -static PyObject *ptr__Exc_KeyError = NULL; -static PyObject *ptr__Exc_LookupError = NULL; -static PyObject *ptr__Exc_MemoryError = NULL; -static PyObject *ptr__Exc_MemoryErrorInst = NULL; -static PyObject *ptr__Exc_NameError = NULL; -static PyObject *ptr__Exc_NotImplementedError = NULL; -static PyObject *ptr__Exc_OSError = NULL; -static PyObject *ptr__Exc_OverflowError = NULL; -static PyObject *ptr__Exc_RuntimeError = NULL; -static PyObject *ptr__Exc_StandardError = NULL; -static PyObject *ptr__Exc_SyntaxError = NULL; -static PyObject *ptr__Exc_SystemError = NULL; -static PyObject *ptr__Exc_SystemExit = NULL; -static PyObject *ptr__Exc_TypeError = NULL; -static PyObject *ptr__Exc_ValueError = NULL; -static PyObject *ptr__Exc_ZeroDivisionError = NULL; - -#ifdef MS_WINDOWS -static PyObject *ptr__Exc_WindowsError = NULL; -#endif - -#if PY_MAJOR_VERSION >= 2 -static PyObject *ptr__Exc_IndentationError = NULL; -static PyObject *ptr__Exc_TabError = NULL; -static PyObject *ptr__Exc_UnboundLocalError = NULL; -static PyObject *ptr__Exc_UnicodeError = NULL; -#endif - -static PyObject *ptr__PyNone = NULL; - -static PyObject *ptr__PyFalse = NULL; -static PyObject *ptr__PyTrue = NULL; - -static PyTypeObject *ptr__Buffer_Type = NULL; -static PyTypeObject *ptr__CFunction_Type = NULL; -static PyTypeObject *ptr__Class_Type = NULL; -static PyTypeObject *ptr__CObject_Type = NULL; -static PyTypeObject *ptr__Complex_Type = NULL; -static PyTypeObject *ptr__Dict_Type = NULL; -static PyTypeObject *ptr__File_Type = NULL; -static PyTypeObject *ptr__Float_Type = NULL; -static PyTypeObject *ptr__Function_Type = NULL; -static PyTypeObject *ptr__Instance_Type = NULL; -static PyTypeObject *ptr__Int_Type = NULL; -static PyTypeObject *ptr__List_Type = NULL; -static PyTypeObject *ptr__Long_Type = NULL; -static PyTypeObject *ptr__Method_Type = NULL; -static PyTypeObject *ptr__Module_Type = NULL; -static PyTypeObject *ptr__Range_Type = NULL; -static PyTypeObject *ptr__Slice_Type = NULL; -static PyTypeObject *ptr__String_Type = NULL; -static PyTypeObject *ptr__TraceBack_Type = NULL; -static PyTypeObject *ptr__Tuple_Type = NULL; -static PyTypeObject *ptr__Type_Type = NULL; - -#if PY_MAJOR_VERSION >= 2 -static PyTypeObject *ptr__Unicode_Type = NULL; -#endif - -static int *ptr_Py_DebugFlag = NULL; -static int *ptr_Py_InteractiveFlag = NULL; -static int *ptr_Py_OptimizeFlag = NULL; -static int *ptr_Py_NoSiteFlag = NULL; -static int *ptr_Py_TabcheckFlag = NULL; -static int *ptr_Py_VerboseFlag = NULL; - -#if PY_MAJOR_VERSION >= 2 -static int *ptr_Py_UnicodeFlag = NULL; -#endif - -static char **ptr__Py_PackageContext = NULL; - -#ifdef Py_REF_DEBUG -int *ptr_Py_RefTotal; -#endif - - -//-------------------------------------------------------------------------------- -class GetAddressException -{ -public: - GetAddressException( const char *_name ) - : name( _name ) - {} - virtual ~GetAddressException() {} - const char *name; -}; - - -//-------------------------------------------------------------------------------- -static PyObject *GetPyObjectPointer_As_PyObjectPointer( const char *name ) -{ - FARPROC addr = GetProcAddress( python_dll, name ); - if( addr == NULL ) - throw GetAddressException( name ); - - return *(PyObject **)addr; -} - -static PyObject *GetPyObject_As_PyObjectPointer( const char *name ) -{ - FARPROC addr = GetProcAddress( python_dll, name ); - if( addr == NULL ) - throw GetAddressException( name ); - - return (PyObject *)addr; -} - -static PyTypeObject *GetPyTypeObjectPointer_As_PyTypeObjectPointer( const char *name ) -{ - FARPROC addr = GetProcAddress( python_dll, name ); - if( addr == NULL ) - throw GetAddressException( name ); - - return *(PyTypeObject **)addr; -} - -static PyTypeObject *GetPyTypeObject_As_PyTypeObjectPointer( const char *name ) -{ - FARPROC addr = GetProcAddress( python_dll, name ); - if( addr == NULL ) - throw GetAddressException( name ); - - return (PyTypeObject *)addr; -} - -static int *GetInt_as_IntPointer( const char *name ) -{ - FARPROC addr = GetProcAddress( python_dll, name ); - if( addr == NULL ) - throw GetAddressException( name ); - - return (int *)addr; -} - -static char **GetCharPointer_as_CharPointerPointer( const char *name ) -{ - FARPROC addr = GetProcAddress( python_dll, name ); - if( addr == NULL ) - throw GetAddressException( name ); - - return (char **)addr; -} - - -#ifdef _DEBUG -static const char python_dll_name_format[] = "PYTHON%1.1d%1.1d_D.DLL"; +#if PY_MAJOR_VERSION == 2 +#include "Python2/IndirectPythonInterface.cxx" #else -static const char python_dll_name_format[] = "PYTHON%1.1d%1.1d.DLL"; -#endif - -//-------------------------------------------------------------------------------- -bool InitialisePythonIndirectInterface() -{ - char python_dll_name[sizeof(python_dll_name_format)]; - - sprintf( python_dll_name, python_dll_name_format, PY_MAJOR_VERSION, PY_MINOR_VERSION ); - - python_dll = LoadLibrary( python_dll_name ); - if( python_dll == NULL ) - return false; - - try -{ -#ifdef Py_REF_DEBUG - ptr_Py_RefTotal = GetInt_as_IntPointer( "_Py_RefTotal" ); -#endif - ptr_Py_DebugFlag = GetInt_as_IntPointer( "Py_DebugFlag" ); - ptr_Py_InteractiveFlag = GetInt_as_IntPointer( "Py_InteractiveFlag" ); - ptr_Py_OptimizeFlag = GetInt_as_IntPointer( "Py_OptimizeFlag" ); - ptr_Py_NoSiteFlag = GetInt_as_IntPointer( "Py_NoSiteFlag" ); - ptr_Py_TabcheckFlag = GetInt_as_IntPointer( "Py_TabcheckFlag" ); - ptr_Py_VerboseFlag = GetInt_as_IntPointer( "Py_VerboseFlag" ); -#if PY_MAJOR_VERSION >= 2 - ptr_Py_UnicodeFlag = GetInt_as_IntPointer( "Py_UnicodeFlag" ); -#endif - ptr__Py_PackageContext = GetCharPointer_as_CharPointerPointer( "_Py_PackageContext" ); - - ptr__Exc_ArithmeticError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_ArithmeticError" ); - ptr__Exc_AssertionError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_AssertionError" ); - ptr__Exc_AttributeError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_AttributeError" ); - ptr__Exc_EnvironmentError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_EnvironmentError" ); - ptr__Exc_EOFError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_EOFError" ); - ptr__Exc_Exception = GetPyObjectPointer_As_PyObjectPointer( "PyExc_Exception" ); - ptr__Exc_FloatingPointError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_FloatingPointError" ); - ptr__Exc_ImportError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_ImportError" ); - ptr__Exc_IndexError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_IndexError" ); - ptr__Exc_IOError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_IOError" ); - ptr__Exc_KeyboardInterrupt = GetPyObjectPointer_As_PyObjectPointer( "PyExc_KeyboardInterrupt" ); - ptr__Exc_KeyError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_KeyError" ); - ptr__Exc_LookupError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_LookupError" ); - ptr__Exc_MemoryError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_MemoryError" ); - ptr__Exc_MemoryErrorInst = GetPyObjectPointer_As_PyObjectPointer( "PyExc_MemoryErrorInst" ); - ptr__Exc_NameError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_NameError" ); - ptr__Exc_NotImplementedError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_NotImplementedError" ); - ptr__Exc_OSError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_OSError" ); - ptr__Exc_OverflowError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_OverflowError" ); - ptr__Exc_RuntimeError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_RuntimeError" ); - ptr__Exc_StandardError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_StandardError" ); - ptr__Exc_SyntaxError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_SyntaxError" ); - ptr__Exc_SystemError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_SystemError" ); - ptr__Exc_SystemExit = GetPyObjectPointer_As_PyObjectPointer( "PyExc_SystemExit" ); - ptr__Exc_TypeError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_TypeError" ); - ptr__Exc_ValueError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_ValueError" ); -#ifdef MS_WINDOWS - ptr__Exc_WindowsError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_WindowsError" ); -#endif - ptr__Exc_ZeroDivisionError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_ZeroDivisionError" ); - -#if PY_MAJOR_VERSION >= 2 - ptr__Exc_IndentationError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_IndentationError" ); - ptr__Exc_TabError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_TabError" ); - ptr__Exc_UnboundLocalError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_UnboundLocalError" ); - ptr__Exc_UnicodeError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_UnicodeError" ); -#endif - ptr__PyNone = GetPyObject_As_PyObjectPointer( "_Py_NoneStruct" ); - - ptr__PyFalse = GetPyObject_As_PyObjectPointer( "_Py_ZeroStruct" ); - ptr__PyTrue = GetPyObject_As_PyObjectPointer( "_Py_TrueStruct" ); - - ptr__Buffer_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyBuffer_Type" ); - ptr__CFunction_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyCFunction_Type" ); - ptr__Class_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyClass_Type" ); - ptr__CObject_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyCObject_Type" ); - ptr__Complex_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyComplex_Type" ); - ptr__Dict_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyDict_Type" ); - ptr__File_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyFile_Type" ); - ptr__Float_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyFloat_Type" ); - ptr__Function_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyFunction_Type" ); - ptr__Instance_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyInstance_Type" ); - ptr__Int_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyInt_Type" ); - ptr__List_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyList_Type" ); - ptr__Long_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyLong_Type" ); - ptr__Method_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyMethod_Type" ); - ptr__Module_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyModule_Type" ); - ptr__Range_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyRange_Type" ); - ptr__Slice_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PySlice_Type" ); - ptr__String_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyString_Type" ); - ptr__TraceBack_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyTraceBack_Type" ); - ptr__Tuple_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyTuple_Type" ); - ptr__Type_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyType_Type" ); - -#if PY_MAJOR_VERSION >= 2 - ptr__Unicode_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyUnicode_Type" ); -#endif -} - catch( GetAddressException &e ) - { - OutputDebugString( python_dll_name ); - OutputDebugString( " does not contain symbol "); - OutputDebugString( e.name ); - OutputDebugString( "\n" ); - - return false; - } - - return true; -} - -// -// Wrap variables as function calls -// -PyObject * _Exc_ArithmeticError(){ return ptr__Exc_ArithmeticError; } -PyObject * _Exc_AssertionError(){ return ptr__Exc_AssertionError; } -PyObject * _Exc_AttributeError(){ return ptr__Exc_AttributeError; } -PyObject * _Exc_EnvironmentError(){ return ptr__Exc_EnvironmentError; } -PyObject * _Exc_EOFError() { return ptr__Exc_EOFError; } -PyObject * _Exc_Exception() { return ptr__Exc_Exception; } -PyObject * _Exc_FloatingPointError(){ return ptr__Exc_FloatingPointError; } -PyObject * _Exc_ImportError() { return ptr__Exc_ImportError; } -PyObject * _Exc_IndexError() { return ptr__Exc_IndexError; } -PyObject * _Exc_IOError() { return ptr__Exc_IOError; } -PyObject * _Exc_KeyboardInterrupt(){ return ptr__Exc_KeyboardInterrupt; } -PyObject * _Exc_KeyError() { return ptr__Exc_KeyError; } -PyObject * _Exc_LookupError() { return ptr__Exc_LookupError; } -PyObject * _Exc_MemoryError() { return ptr__Exc_MemoryError; } -PyObject * _Exc_MemoryErrorInst(){ return ptr__Exc_MemoryErrorInst; } -PyObject * _Exc_NameError() { return ptr__Exc_NameError; } -PyObject * _Exc_NotImplementedError(){ return ptr__Exc_NotImplementedError; } -PyObject * _Exc_OSError() { return ptr__Exc_OSError; } -PyObject * _Exc_OverflowError() { return ptr__Exc_OverflowError; } -PyObject * _Exc_RuntimeError() { return ptr__Exc_RuntimeError; } -PyObject * _Exc_StandardError() { return ptr__Exc_StandardError; } -PyObject * _Exc_SyntaxError() { return ptr__Exc_SyntaxError; } -PyObject * _Exc_SystemError() { return ptr__Exc_SystemError; } -PyObject * _Exc_SystemExit() { return ptr__Exc_SystemExit; } -PyObject * _Exc_TypeError() { return ptr__Exc_TypeError; } -PyObject * _Exc_ValueError() { return ptr__Exc_ValueError; } -#ifdef MS_WINDOWS -PyObject * _Exc_WindowsError() { return ptr__Exc_WindowsError; } -#endif -PyObject * _Exc_ZeroDivisionError(){ return ptr__Exc_ZeroDivisionError; } - -#if PY_MAJOR_VERSION >= 2 -PyObject * _Exc_IndentationError(){ return ptr__Exc_IndentationError; } -PyObject * _Exc_TabError() { return ptr__Exc_TabError; } -PyObject * _Exc_UnboundLocalError(){ return ptr__Exc_UnboundLocalError; } -PyObject * _Exc_UnicodeError() { return ptr__Exc_UnicodeError; } -#endif - -// -// wrap items in Object.h -// -PyObject * _None() { return ptr__PyNone; } - -PyObject * _False() { return ptr__PyFalse; } -PyObject * _True() { return ptr__PyTrue; } - -PyTypeObject * _Buffer_Type() { return ptr__Buffer_Type; } -PyTypeObject * _CFunction_Type(){ return ptr__CFunction_Type; } -PyTypeObject * _Class_Type() { return ptr__Class_Type; } -PyTypeObject * _CObject_Type() { return ptr__CObject_Type; } -PyTypeObject * _Complex_Type() { return ptr__Complex_Type; } -PyTypeObject * _Dict_Type() { return ptr__Dict_Type; } -PyTypeObject * _File_Type() { return ptr__File_Type; } -PyTypeObject * _Float_Type() { return ptr__Float_Type; } -PyTypeObject * _Function_Type() { return ptr__Function_Type; } -PyTypeObject * _Instance_Type() { return ptr__Instance_Type; } -PyTypeObject * _Bool_Type() { return ptr__Bool_Type; } -PyTypeObject * _Int_Type() { return ptr__Int_Type; } -PyTypeObject * _List_Type() { return ptr__List_Type; } -PyTypeObject * _Long_Type() { return ptr__Long_Type; } -PyTypeObject * _Method_Type() { return ptr__Method_Type; } -PyTypeObject * _Module_Type() { return ptr__Module_Type; } -PyTypeObject * _Range_Type() { return ptr__Range_Type; } -PyTypeObject * _Slice_Type() { return ptr__Slice_Type; } -PyTypeObject * _String_Type() { return ptr__String_Type; } -PyTypeObject * _TraceBack_Type(){ return ptr__TraceBack_Type; } -PyTypeObject * _Tuple_Type() { return ptr__Tuple_Type; } -PyTypeObject * _Type_Type() { return ptr__Type_Type; } - -#if PY_MAJOR_VERSION >= 2 -PyTypeObject * _Unicode_Type() { return ptr__Unicode_Type; } -#endif - -char *__Py_PackageContext() { return *ptr__Py_PackageContext; } - - -// -// wrap the Python Flag variables -// -int &_Py_DebugFlag() { return *ptr_Py_DebugFlag; } -int &_Py_InteractiveFlag() { return *ptr_Py_InteractiveFlag; } -int &_Py_OptimizeFlag() { return *ptr_Py_OptimizeFlag; } -int &_Py_NoSiteFlag() { return *ptr_Py_NoSiteFlag; } -int &_Py_TabcheckFlag() { return *ptr_Py_TabcheckFlag; } -int &_Py_VerboseFlag() { return *ptr_Py_VerboseFlag; } -#if PY_MAJOR_VERSION >= 2 -int &_Py_UnicodeFlag() { return *ptr_Py_UnicodeFlag; } -#endif - -void _XINCREF( PyObject *op ) -{ - // This function must match the contents of Py_XINCREF(op) - if( op == NULL ) - return; - -#ifdef Py_REF_DEBUG - (*ptr_Py_RefTotal)++; -#endif - (op)->ob_refcnt++; - -} - -void _XDECREF( PyObject *op ) -{ - // This function must match the contents of Py_XDECREF(op); - if( op == NULL ) - return; - -#ifdef Py_REF_DEBUG - (*ptr_Py_RefTotal)--; -#endif - - if (--(op)->ob_refcnt == 0) - _Py_Dealloc((PyObject *)(op)); -} - - -#else -#error "Can only delay load under Win32" -#endif - -#else - -// -// Duplicated these declarations from rangeobject.h which is missing the -// extern "C". This has been reported as a bug upto and include 2.1 -// -extern "C" DL_IMPORT(PyTypeObject) PyRange_Type; -extern "C" DL_IMPORT(PyObject *) PyRange_New(long, long, long, int); - - -//================================================================================ -// -// Map onto Macros -// -//================================================================================ - -// -// Wrap variables as function calls -// - -PyObject * _Exc_ArithmeticError() { return ::PyExc_ArithmeticError; } -PyObject * _Exc_AssertionError() { return ::PyExc_AssertionError; } -PyObject * _Exc_AttributeError() { return ::PyExc_AttributeError; } -PyObject * _Exc_EnvironmentError() { return ::PyExc_EnvironmentError; } -PyObject * _Exc_EOFError() { return ::PyExc_EOFError; } -PyObject * _Exc_Exception() { return ::PyExc_Exception; } -PyObject * _Exc_FloatingPointError() { return ::PyExc_FloatingPointError; } -PyObject * _Exc_ImportError() { return ::PyExc_ImportError; } -PyObject * _Exc_IndexError() { return ::PyExc_IndexError; } -PyObject * _Exc_IOError() { return ::PyExc_IOError; } -PyObject * _Exc_KeyboardInterrupt() { return ::PyExc_KeyboardInterrupt; } -PyObject * _Exc_KeyError() { return ::PyExc_KeyError; } -PyObject * _Exc_LookupError() { return ::PyExc_LookupError; } -PyObject * _Exc_MemoryError() { return ::PyExc_MemoryError; } -PyObject * _Exc_MemoryErrorInst() { return ::PyExc_MemoryErrorInst; } -PyObject * _Exc_NameError() { return ::PyExc_NameError; } -PyObject * _Exc_NotImplementedError() { return ::PyExc_NotImplementedError; } -PyObject * _Exc_OSError() { return ::PyExc_OSError; } -PyObject * _Exc_OverflowError() { return ::PyExc_OverflowError; } -PyObject * _Exc_RuntimeError() { return ::PyExc_RuntimeError; } -PyObject * _Exc_StandardError() { return ::PyExc_StandardError; } -PyObject * _Exc_SyntaxError() { return ::PyExc_SyntaxError; } -PyObject * _Exc_SystemError() { return ::PyExc_SystemError; } -PyObject * _Exc_SystemExit() { return ::PyExc_SystemExit; } -PyObject * _Exc_TypeError() { return ::PyExc_TypeError; } -PyObject * _Exc_ValueError() { return ::PyExc_ValueError; } -PyObject * _Exc_ZeroDivisionError() { return ::PyExc_ZeroDivisionError; } - -#ifdef MS_WINDOWS -PyObject * _Exc_WindowsError() { return ::PyExc_WindowsError; } -#endif - - -#if PY_MAJOR_VERSION >= 2 -PyObject * _Exc_IndentationError() { return ::PyExc_IndentationError; } -PyObject * _Exc_TabError() { return ::PyExc_TabError; } -PyObject * _Exc_UnboundLocalError() { return ::PyExc_UnboundLocalError; } -PyObject * _Exc_UnicodeError() { return ::PyExc_UnicodeError; } -#endif - - -// -// wrap items in Object.h -// -PyObject * _None() { return &::_Py_NoneStruct; } - -PyObject * _False() { return Py_False; } -PyObject * _True() { return Py_True; } - -PyTypeObject * _Buffer_Type() { return &PyBuffer_Type; } -PyTypeObject * _CFunction_Type() { return &PyCFunction_Type; } -PyTypeObject * _Class_Type() { return &PyClass_Type; } -PyTypeObject * _CObject_Type() { return &PyCObject_Type; } -PyTypeObject * _Complex_Type() { return &PyComplex_Type; } -PyTypeObject * _Dict_Type() { return &PyDict_Type; } -PyTypeObject * _File_Type() { return &PyFile_Type; } -PyTypeObject * _Float_Type() { return &PyFloat_Type; } -PyTypeObject * _Function_Type() { return &PyFunction_Type; } -PyTypeObject * _Instance_Type() { return &PyInstance_Type; } -PyTypeObject * _Bool_Type() { return &PyBool_Type; } -PyTypeObject * _Int_Type() { return &PyInt_Type; } -PyTypeObject * _List_Type() { return &PyList_Type; } -PyTypeObject * _Long_Type() { return &PyLong_Type; } -PyTypeObject * _Method_Type() { return &PyMethod_Type; } -PyTypeObject * _Module_Type() { return &PyModule_Type; } -PyTypeObject * _Range_Type() { return &PyRange_Type; } -PyTypeObject * _Slice_Type() { return &PySlice_Type; } -PyTypeObject * _String_Type() { return &PyString_Type; } -PyTypeObject * _TraceBack_Type() { return &PyTraceBack_Type; } -PyTypeObject * _Tuple_Type() { return &PyTuple_Type; } -PyTypeObject * _Type_Type() { return &PyType_Type; } - -#if PY_MAJOR_VERSION >= 2 -PyTypeObject * _Unicode_Type() { return &PyUnicode_Type; } -#endif - -// -// wrap flags -// -int &_Py_DebugFlag() { return Py_DebugFlag; } -int &_Py_InteractiveFlag(){ return Py_InteractiveFlag; } -int &_Py_OptimizeFlag() { return Py_OptimizeFlag; } -int &_Py_NoSiteFlag() { return Py_NoSiteFlag; } -int &_Py_TabcheckFlag() { return Py_TabcheckFlag; } -int &_Py_VerboseFlag() { return Py_VerboseFlag; } -#if PY_MAJOR_VERSION >= 2 -int &_Py_UnicodeFlag() { return Py_UnicodeFlag; } -#endif -char *__Py_PackageContext(){ return _Py_PackageContext; } - -// -// Needed to keep the abstactions for delayload interface -// -void _XINCREF( PyObject *op ) -{ - Py_XINCREF(op); -} - -void _XDECREF( PyObject *op ) -{ - Py_XDECREF(op); -} - +#include "Python3/IndirectPythonInterface.cxx" #endif -} diff -Nru matplotlib-0.99.3/CXX/IndirectPythonInterface.hxx matplotlib-1.0.1/CXX/IndirectPythonInterface.hxx --- matplotlib-0.99.3/CXX/IndirectPythonInterface.hxx 2009-08-22 21:06:13.000000000 +0000 +++ matplotlib-1.0.1/CXX/IndirectPythonInterface.hxx 2010-07-07 01:41:53.000000000 +0000 @@ -1,198 +1,7 @@ -//----------------------------------------------------------------------------- -// -// Copyright (c) 1998 - 2007, The Regents of the University of California -// Produced at the Lawrence Livermore National Laboratory -// All rights reserved. -// -// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The -// full copyright notice is contained in the file COPYRIGHT located at the root -// of the PyCXX distribution. -// -// 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 disclaimer below. -// - Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the disclaimer (as noted below) in the -// documentation and/or materials provided with the distribution. -// - Neither the name of the UC/LLNL nor the names of its contributors may be -// used to endorse or promote products derived from this software without -// specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED 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 REGENTS OF THE UNIVERSITY OF -// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY 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. -// -//----------------------------------------------------------------------------- - -#ifndef __CXX_INDIRECT_PYTHON_INTERFACE__HXX__ -#define __CXX_INDIRECT_PYTHON_INTERFACE__HXX__ - #include "CXX/WrapPython.h" -namespace Py -{ -bool InitialisePythonIndirectInterface(); - -// -// Wrap Exception variables as function calls -// -PyObject * _Exc_Exception(); -PyObject * _Exc_StandardError(); -PyObject * _Exc_ArithmeticError(); -PyObject * _Exc_LookupError(); - -PyObject * _Exc_AssertionError(); -PyObject * _Exc_AttributeError(); -PyObject * _Exc_EOFError(); -PyObject * _Exc_FloatingPointError(); -PyObject * _Exc_EnvironmentError(); -PyObject * _Exc_IOError(); -PyObject * _Exc_OSError(); -PyObject * _Exc_ImportError(); -PyObject * _Exc_IndexError(); -PyObject * _Exc_KeyError(); -PyObject * _Exc_KeyboardInterrupt(); -PyObject * _Exc_MemoryError(); -PyObject * _Exc_NameError(); -PyObject * _Exc_OverflowError(); -PyObject * _Exc_RuntimeError(); -PyObject * _Exc_NotImplementedError(); -PyObject * _Exc_SyntaxError(); -PyObject * _Exc_SystemError(); -PyObject * _Exc_SystemExit(); -PyObject * _Exc_TypeError(); -PyObject * _Exc_ValueError(); -PyObject * _Exc_ZeroDivisionError(); -#ifdef MS_WINDOWS -PyObject * _Exc_WindowsError(); -#endif - -PyObject * _Exc_MemoryErrorInst(); - -#if PY_MAJOR_VERSION >= 2 -PyObject * _Exc_IndentationError(); -PyObject * _Exc_TabError(); -PyObject * _Exc_UnboundLocalError(); -PyObject * _Exc_UnicodeError(); -#endif - -// -// Wrap Object variables as function calls -// -PyObject * _None(); - -PyObject * _False(); -PyObject * _True(); - -// -// Wrap Type variables as function calls -// -PyTypeObject * _List_Type(); -bool _List_Check( PyObject *o ); - -PyTypeObject * _Buffer_Type(); -bool _Buffer_Check( PyObject *op ); - -PyTypeObject * _Class_Type(); -bool _Class_Check( PyObject *op ); - -PyTypeObject * _Instance_Type(); -bool _Instance_Check( PyObject *op ); - -PyTypeObject * _Method_Type(); -bool _Method_Check( PyObject *op ); - -PyTypeObject * _CObject_Type(); -bool _CObject_Check( PyObject *op ); - -PyTypeObject * _Complex_Type(); -bool _Complex_Check( PyObject *op ); - -PyTypeObject * _Dict_Type(); -bool _Dict_Check( PyObject *op ); - -PyTypeObject * _File_Type(); -bool _File_Check( PyObject *op ); - -PyTypeObject * _Float_Type(); -bool _Float_Check( PyObject *op ); - -PyTypeObject * _Frame_Type(); -bool _Frame_Check( PyObject *op ); - -PyTypeObject * _Function_Type(); -bool _Function_Check( PyObject *op ); - -PyTypeObject * _Bool_Type(); -bool _Boolean_Check( PyObject *op ); - -PyTypeObject * _Int_Type(); -bool _Int_Check( PyObject *op ); - -PyTypeObject * _List_Type(); -bool _List_Check( PyObject *op ); - -PyTypeObject * _Long_Type(); -bool _Long_Check( PyObject *op ); - -PyTypeObject * _CFunction_Type(); -bool _CFunction_Check( PyObject *op ); - -PyTypeObject * _Module_Type(); -bool _Module_Check( PyObject *op ); - -PyTypeObject * _Type_Type(); -bool _Type_Check( PyObject *op ); - -PyTypeObject * _Range_Type(); -bool _Range_Check( PyObject *op ); - -PyTypeObject * _Slice_Type(); -bool _Slice_Check( PyObject *op ); - -PyTypeObject * _String_Type(); -bool _String_Check( PyObject *op ); - -PyTypeObject * _Unicode_Type(); -bool _Unicode_Check( PyObject *op ); - -PyTypeObject * _TraceBack_Type(); -bool _TraceBack_Check( PyObject *v ); - -PyTypeObject * _Tuple_Type(); -bool _Tuple_Check( PyObject *op ); - -#if PY_MAJOR_VERSION >= 2 -PyTypeObject * _Unicode_Type(); -bool _Unicode_Check( PyObject *op ); -#endif - -int &_Py_DebugFlag(); -int &_Py_InteractiveFlag(); -int &_Py_OptimizeFlag(); -int &_Py_NoSiteFlag(); -int &_Py_TabcheckFlag(); -int &_Py_VerboseFlag(); - -#if PY_MAJOR_VERSION >= 2 -int &_Py_UnicodeFlag(); +#if PY_MAJOR_VERSION == 2 +#include "CXX/Python2/IndirectPythonInterface.hxx" +#else +#include "CXX/Python3/IndirectPythonInterface.hxx" #endif - -void _XINCREF( PyObject *op ); -void _XDECREF( PyObject *op ); - -char *__Py_PackageContext(); -} - -#endif // __CXX_INDIRECT_PYTHON_INTERFACE__HXX__ diff -Nru matplotlib-0.99.3/CXX/Objects.hxx matplotlib-1.0.1/CXX/Objects.hxx --- matplotlib-0.99.3/CXX/Objects.hxx 2009-07-31 15:14:42.000000000 +0000 +++ matplotlib-1.0.1/CXX/Objects.hxx 2010-07-07 01:41:53.000000000 +0000 @@ -34,3007 +34,10 @@ // DAMAGE. // //----------------------------------------------------------------------------- - -#ifndef __CXX_Objects__h -#define __CXX_Objects__h - #include "CXX/WrapPython.h" -#include "CXX/Version.hxx" -#include "CXX/Config.hxx" -#include "CXX/Exception.hxx" - -#include -#include STR_STREAM -#include -#include -#include -#include - -namespace Py -{ - typedef int sequence_index_type; // type of an index into a sequence - - // Forward declarations - class Object; - class Type; - template class SeqBase; - class String; - class List; - template class MapBase; - - // new_reference_to also overloaded below on Object - inline PyObject* new_reference_to(PyObject* p) - { - Py::_XINCREF(p); - return p; - } - - // returning Null() from an extension method triggers a - // Python exception - inline PyObject* Null() - { - return (static_cast(0)); - } - - //===========================================================================// - // class Object - // The purpose of this class is to serve as the most general kind of - // Python object, for the purpose of writing C++ extensions in Python - // Objects hold a PyObject* which they own. This pointer is always a - // valid pointer to a Python object. In children we must maintain this behavior. - // - // Instructions on how to make your own class MyType descended from Object: - // (0) Pick a base class, either Object or perhaps SeqBase or MapBase. - // This example assumes Object. - - // (1) Write a routine int MyType_Check (PyObject *) modeled after PyInt_Check, - // PyFloat_Check, etc. - - // (2) Add method accepts: - // virtual bool accepts (PyObject *pyob) const { - // return pyob && MyType_Check (pyob); - // } - - // (3) Include the following constructor and copy constructor - // - /* - explicit MyType (PyObject *pyob): Object(pyob) { - validate(); -} - - MyType(const Object& other): Object(other.ptr()) { - validate(); -} - */ - - // Alernate version for the constructor to allow for construction from owned pointers: - /* - explicit MyType (PyObject *pyob): Object(pyob) { - validate(); -} - */ - - // You may wish to add other constructors; see the classes below for examples. - // Each constructor must use "set" to set the pointer - // and end by validating the pointer you have created. - - // (4) Each class needs at least these two assignment operators: - /* - MyType& operator= (const Object& rhs) { - return (*this = *rhs); -} - - Mytype& operator= (PyObject* rhsp) { - if(ptr() == rhsp) return *this; - set(rhsp); - return *this; -} - */ - // Note on accepts: constructors call the base class - // version of a virtual when calling the base class constructor, - // so the test has to be done explicitly in a descendent. - - // If you are inheriting from PythonExtension to define an object - // note that it contains PythonExtension::check - // which you can use in accepts when writing a wrapper class. - // See Demo/range.h and Demo/range.cxx for an example. - - class Object - { - private: - // the pointer to the Python object - // Only Object sets this directly. - // The default constructor for Object sets it to Py_None and - // child classes must use "set" to set it - // - PyObject* p; - - protected: - - void set (PyObject* pyob, bool owned = false) - { - release(); - p = pyob; - if (!owned) - { - Py::_XINCREF (p); - } - validate(); - } - - void release () - { - Py::_XDECREF (p); - p = 0; - } - - void validate(); - - public: - // Constructor acquires new ownership of pointer unless explicitly told not to. - explicit Object (PyObject* pyob=Py::_None(), bool owned = false): p (pyob) - { - if(!owned) - { - Py::_XINCREF (p); - } - validate(); - } - - // Copy constructor acquires new ownership of pointer - Object (const Object& ob): p(ob.p) - { - Py::_XINCREF (p); - validate(); - } - - // Assignment acquires new ownership of pointer - Object& operator= (const Object& rhs) - { - set(rhs.p); - return *this; - } - - Object& operator= (PyObject* rhsp) - { - if(ptr() == rhsp) return *this; - set (rhsp); - return *this; - } - - // Destructor - virtual ~Object () - { - release (); - } - - // Loaning the pointer to others, retain ownership - PyObject* operator* () const - { - return p; - } - - // Explicit reference_counting changes - void increment_reference_count() - { - Py::_XINCREF(p); - } - - void decrement_reference_count() - { - // not allowed to commit suicide, however - if(reference_count() == 1) - throw RuntimeError("Object::decrement_reference_count error."); - Py::_XDECREF(p); - } - // Would like to call this pointer() but messes up STL in SeqBase - PyObject* ptr () const - { - return p; - } - - // - // Queries - // - - // Can pyob be used in this object's constructor? - virtual bool accepts (PyObject *pyob) const - { - return (pyob != 0); - } - - Py_ssize_t reference_count () const - { // the reference count - return p ? p->ob_refcnt : 0; - } - - Type type () const; // the type object associated with this one - - String str () const; // the str() representation - - std::string as_string() const; - - String repr () const; // the repr () representation - - List dir () const; // the dir() list - - bool hasAttr (const std::string& s) const - { - return PyObject_HasAttrString (p, const_cast(s.c_str())) ? true: false; - } - - Object getAttr (const std::string& s) const - { - return Object (PyObject_GetAttrString (p, const_cast(s.c_str())), true); - } - - Object getItem (const Object& key) const - { - return Object (PyObject_GetItem(p, *key), true); - } - - long hashValue () const - { - return PyObject_Hash (p); - } - - // - // int print (FILE* fp, int flags=Py_Print_RAW) - //{ - // return PyObject_Print (p, fp, flags); - //} - // - bool is(PyObject *pother) const - { // identity test - return p == pother; - } - - bool is(const Object& other) const - { // identity test - return p == other.p; - } - - bool isNone() const - { - return p == _None(); - } - - bool isCallable () const - { - return PyCallable_Check (p) != 0; - } - - bool isInstance () const - { - return PyInstance_Check (p) != 0; - } - - bool isDict () const - { - return Py::_Dict_Check (p); - } - - bool isList () const - { - return Py::_List_Check (p); - } - - bool isMapping () const - { - return PyMapping_Check (p) != 0; - } - - bool isNumeric () const - { - return PyNumber_Check (p) != 0; - } - - bool isSequence () const - { - return PySequence_Check (p) != 0; - } - - bool isTrue () const - { - return PyObject_IsTrue (p) != 0; - } - - bool isType (const Type& t) const; - bool isTuple() const - { - return Py::_Tuple_Check(p); - } - - bool isString() const - { - return Py::_String_Check(p) || Py::_Unicode_Check(p); - } - - bool isUnicode() const - { - return Py::_Unicode_Check(p); - } - - // Commands - void setAttr (const std::string& s, const Object& value) - { - if(PyObject_SetAttrString (p, const_cast(s.c_str()), *value) == -1) - throw AttributeError ("getAttr failed."); - } - - void delAttr (const std::string& s) - { - if(PyObject_DelAttrString (p, const_cast(s.c_str())) == -1) - throw AttributeError ("delAttr failed."); - } - - // PyObject_SetItem is too weird to be using from C++ - // so it is intentionally omitted. - - void delItem (const Object& key) - { - //if(PyObject_DelItem(p, *key) == -1) - // failed to link on Windows? - throw KeyError("delItem failed."); - } - - // Equality and comparison use PyObject_RichCompareBool - - bool operator==(const Object& o2) const - { - int k = PyObject_RichCompareBool (p, *o2, Py_EQ); - if (PyErr_Occurred()) throw Exception(); - return k != 0; - } - - bool operator!=(const Object& o2) const - { - int k = PyObject_RichCompareBool (p, *o2, Py_NE); - if (PyErr_Occurred()) throw Exception(); - return k != 0; - - } - - bool operator>=(const Object& o2) const - { - int k = PyObject_RichCompareBool (p, *o2, Py_GE); - if (PyErr_Occurred()) throw Exception(); - return k != 0; - } - - bool operator<=(const Object& o2) const - { - int k = PyObject_RichCompareBool (p, *o2, Py_LE); - if (PyErr_Occurred()) throw Exception(); - return k != 0; - } - - bool operator<(const Object& o2) const - { - int k = PyObject_RichCompareBool (p, *o2, Py_LT); - if (PyErr_Occurred()) throw Exception(); - return k != 0; - } - - bool operator>(const Object& o2) const - { - int k = PyObject_RichCompareBool (p, *o2, Py_GT); - if (PyErr_Occurred()) throw Exception(); - return k != 0; - } - }; - // End of class Object - inline PyObject* new_reference_to(const Object& g) - { - PyObject* p = g.ptr(); - Py::_XINCREF(p); - return p; - } - - // Nothing() is what an extension method returns if - // there is no other return value. - inline Object Nothing() - { - return Object(Py::_None()); - } - - // Python special None value - inline Object None() - { - return Object(Py::_None()); - } - - // Python special Boolean values - inline Object False() - { - return Object(Py::_False()); - } - - inline Object True() - { - return Object(Py::_True()); - } - - // TMM: 31May'01 - Added the #ifndef so I can exlude iostreams. -#ifndef CXX_NO_IOSTREAMS - std::ostream& operator<< (std::ostream& os, const Object& ob); -#endif - - // Class Type - class Type: public Object - { - public: - explicit Type (PyObject* pyob, bool owned = false): Object(pyob, owned) - { - validate(); - } - - Type (const Object& ob): Object(*ob) - { - validate(); - } - - Type(const Type& t): Object(t) - { - validate(); - } - - Type& operator= (const Object& rhs) - { - return (*this = *rhs); - } - - Type& operator= (PyObject* rhsp) - { - if(ptr() == rhsp) return *this; - set (rhsp); - return *this; - } - virtual bool accepts (PyObject *pyob) const - { - return pyob && Py::_Type_Check (pyob); - } - }; - - - // - // Convert an owned Python pointer into a CXX Object - // - inline Object asObject (PyObject *p) - { - return Object(p, true); - } - - // =============================================== - // class boolean - class Boolean: public Object - { - public: - // Constructor - Boolean (PyObject *pyob, bool owned = false): Object (pyob, owned) - { - validate(); - } - - Boolean (const Boolean& ob): Object(*ob) - { - validate(); - } - - // create from bool - Boolean (bool v=false) - { - set(PyBool_FromLong(v ? 1 : 0), true); - validate(); - } - - explicit Boolean (const Object& ob) - { - set(*ob, true); - validate(); - } - - // Assignment acquires new ownership of pointer - - Boolean& operator= (const Object& rhs) - { - return (*this = *rhs); - } - - Boolean& operator= (PyObject* rhsp) - { - if(ptr() == rhsp) return *this; - set (rhsp, true); - return *this; - } - - // Membership - virtual bool accepts (PyObject *pyob) const - { - return pyob && Py::_Boolean_Check (pyob); - } - - // convert to long - operator bool() const - { - return PyObject_IsTrue (ptr()) != 0; - } - - Boolean& operator= (bool v) - { - set (PyBool_FromLong (v ? 1 : 0), true); - return *this; - } - }; - - // =============================================== - // class Int - class Int: public Object - { - public: - // Constructor - Int (PyObject *pyob, bool owned = false): Object (pyob, owned) - { - validate(); - } - - Int (const Int& ob): Object(*ob) - { - validate(); - } - - // create from long - Int (long v = 0L): Object(PyInt_FromLong(v), true) - { - validate(); - } - - // create from int - Int (int v) - { - long w = v; - set(PyInt_FromLong(w), true); - validate(); - } - - // create from bool - Int (bool v) - { - long w = v ? 1 : 0; - set(PyInt_FromLong(w), true); - validate(); - } - - explicit Int (const Object& ob) - { - set(PyNumber_Int(*ob), true); - validate(); - } - - // Assignment acquires new ownership of pointer - - Int& operator= (const Object& rhs) - { - return (*this = *rhs); - } - - Int& operator= (PyObject* rhsp) - { - if(ptr() == rhsp) return *this; - set (PyNumber_Int(rhsp), true); - return *this; - } - - // Membership - virtual bool accepts (PyObject *pyob) const - { - return pyob && Py::_Int_Check (pyob); - } - - // convert to long - operator long() const - { - return PyInt_AsLong (ptr()); - } - -#ifdef HAVE_LONG_LONG - // convert to long long - PY_LONG_LONG asLongLong() const - { - return PyLong_AsLongLong (ptr()); - } - // convert to unsigned long long - unsigned PY_LONG_LONG asUnsignedLongLong() const - { - return PyLong_AsUnsignedLongLong (ptr()); - } -#endif - - // assign from an int - Int& operator= (int v) - { - set (PyInt_FromLong (long(v)), true); - return *this; - } - - // assign from long - Int& operator= (long v) - { - set (PyInt_FromLong (v), true); - return *this; - } - -#ifdef HAVE_LONG_LONG - // assign from long long - Int& operator= (PY_LONG_LONG v) - { - set (PyLong_FromLongLong (v), true); - return *this; - } - // assign from unsigned long long - Int& operator= (unsigned PY_LONG_LONG v) - { - set (PyLong_FromUnsignedLongLong (v), true); - return *this; - } +#if PY_MAJOR_VERSION == 2 +#include "CXX/Python2/Objects.hxx" +#else +#include "CXX/Python3/Objects.hxx" #endif - }; - - // =============================================== - // class Long - class Long: public Object - { - public: - // Constructor - explicit Long (PyObject *pyob, bool owned = false): Object (pyob, owned) - { - validate(); - } - - Long (const Long& ob): Object(ob.ptr()) - { - validate(); - } - - // create from long - explicit Long (long v = 0L) - : Object(PyLong_FromLong(v), true) - { - validate(); - } - // create from unsigned long - explicit Long (unsigned long v) - : Object(PyLong_FromUnsignedLong(v), true) - { - validate(); - } - // create from int - explicit Long (int v) - : Object(PyLong_FromLong(static_cast(v)), true) - { - validate(); - } - - // try to create from any object - Long (const Object& ob) - : Object(PyNumber_Long(*ob), true) - { - validate(); - } - - // Assignment acquires new ownership of pointer - - Long& operator= (const Object& rhs) - { - return (*this = *rhs); - } - - Long& operator= (PyObject* rhsp) - { - if(ptr() == rhsp) return *this; - set (PyNumber_Long(rhsp), true); - return *this; - } - // Membership - virtual bool accepts (PyObject *pyob) const - { - return pyob && Py::_Long_Check (pyob); - } - // convert to long - operator long() const - { - return PyLong_AsLong (ptr()); - } - // convert to unsigned - operator unsigned long() const - { - return PyLong_AsUnsignedLong (ptr()); - } - operator double() const - { - return PyLong_AsDouble (ptr()); - } - // assign from an int - Long& operator= (int v) - { - set(PyLong_FromLong (long(v)), true); - return *this; - } - // assign from long - Long& operator= (long v) - { - set(PyLong_FromLong (v), true); - return *this; - } - // assign from unsigned long - Long& operator= (unsigned long v) - { - set(PyLong_FromUnsignedLong (v), true); - return *this; - } - }; - -#ifdef HAVE_LONG_LONG - // =============================================== - // class LongLong - class LongLong: public Object - { - public: - // Constructor - explicit LongLong (PyObject *pyob, bool owned = false): Object (pyob, owned) - { - validate(); - } - - LongLong (const LongLong& ob): Object(ob.ptr()) - { - validate(); - } - // create from long long - explicit LongLong (PY_LONG_LONG v = 0L) - : Object(PyLong_FromLongLong(v), true) - { - validate(); - } - // create from unsigned long long - explicit LongLong (unsigned PY_LONG_LONG v) - : Object(PyLong_FromUnsignedLongLong(v), true) - { - validate(); - } - // create from long - explicit LongLong (long v) - : Object(PyLong_FromLongLong(v), true) - { - validate(); - } - // create from unsigned long - explicit LongLong (unsigned long v) - : Object(PyLong_FromUnsignedLongLong(v), true) - { - validate(); - } - // create from int - explicit LongLong (int v) - : Object(PyLong_FromLongLong(static_cast(v)), true) - { - validate(); - } - - // try to create from any object - LongLong (const Object& ob) - : Object(PyNumber_Long(*ob), true) - { - validate(); - } - - // Assignment acquires new ownership of pointer - - LongLong& operator= (const Object& rhs) - { - return (*this = *rhs); - } - - LongLong& operator= (PyObject* rhsp) - { - if(ptr() == rhsp) return *this; - set (PyNumber_Long(rhsp), true); - return *this; - } - // Membership - virtual bool accepts (PyObject *pyob) const - { - return pyob && Py::_Long_Check (pyob); - } - // convert to long long - operator PY_LONG_LONG() const - { - return PyLong_AsLongLong (ptr()); - } - // convert to unsigned long - operator unsigned PY_LONG_LONG() const - { - return PyLong_AsUnsignedLongLong (ptr()); - } - // convert to long - operator long() const - { - return PyLong_AsLong (ptr()); - } - // convert to unsigned - operator unsigned long() const - { - return PyLong_AsUnsignedLong (ptr()); - } - operator double() const - { - return PyLong_AsDouble (ptr()); - } - // assign from an int - LongLong& operator= (int v) - { - set(PyLong_FromLongLong (long(v)), true); - return *this; - } - // assign from long long - LongLong& operator= (PY_LONG_LONG v) - { - set(PyLong_FromLongLong (v), true); - return *this; - } - // assign from unsigned long long - LongLong& operator= (unsigned PY_LONG_LONG v) - { - set(PyLong_FromUnsignedLongLong (v), true); - return *this; - } - // assign from long - LongLong& operator= (long v) - { - set(PyLong_FromLongLong (v), true); - return *this; - } - // assign from unsigned long - LongLong& operator= (unsigned long v) - { - set(PyLong_FromUnsignedLongLong (v), true); - return *this; - } - }; -#endif - - // =============================================== - // class Float - // - class Float: public Object - { - public: - // Constructor - explicit Float (PyObject *pyob, bool owned = false): Object(pyob, owned) - { - validate(); - } - - Float (const Float& f): Object(f) - { - validate(); - } - - // make from double - explicit Float (double v=0.0) - : Object(PyFloat_FromDouble (v), true) - { - validate(); - } - - // try to make from any object - Float (const Object& ob) - : Object(PyNumber_Float(*ob), true) - { - validate(); - } - - Float& operator= (const Object& rhs) - { - return (*this = *rhs); - } - - Float& operator= (PyObject* rhsp) - { - if(ptr() == rhsp) return *this; - set (PyNumber_Float(rhsp), true); - return *this; - } - // Membership - virtual bool accepts (PyObject *pyob) const - { - return pyob && Py::_Float_Check (pyob); - } - // convert to double - operator double () const - { - return PyFloat_AsDouble (ptr()); - } - // assign from a double - Float& operator= (double v) - { - set(PyFloat_FromDouble (v), true); - return *this; - } - // assign from an int - Float& operator= (int v) - { - set(PyFloat_FromDouble (double(v)), true); - return *this; - } - // assign from long - Float& operator= (long v) - { - set(PyFloat_FromDouble (double(v)), true); - return *this; - } - // assign from an Int - Float& operator= (const Int& iob) - { - set(PyFloat_FromDouble (double(long(iob))), true); - return *this; - } - }; - - // =============================================== - // class Complex - class Complex: public Object - { - public: - // Constructor - explicit Complex (PyObject *pyob, bool owned = false): Object(pyob, owned) - { - validate(); - } - - Complex (const Complex& f): Object(f) - { - validate(); - } - - // make from double - explicit Complex (double v=0.0, double w=0.0) - :Object(PyComplex_FromDoubles (v, w), true) - { - validate(); - } - - Complex& operator= (const Object& rhs) - { - return (*this = *rhs); - } - - Complex& operator= (PyObject* rhsp) - { - if(ptr() == rhsp) return *this; - set (rhsp); - return *this; - } - // Membership - virtual bool accepts (PyObject *pyob) const - { - return pyob && Py::_Complex_Check (pyob); - } - // convert to Py_complex - operator Py_complex () const - { - return PyComplex_AsCComplex (ptr()); - } - // assign from a Py_complex - Complex& operator= (const Py_complex& v) - { - set(PyComplex_FromCComplex (v), true); - return *this; - } - // assign from a double - Complex& operator= (double v) - { - set(PyComplex_FromDoubles (v, 0.0), true); - return *this; - } - // assign from an int - Complex& operator= (int v) - { - set(PyComplex_FromDoubles (double(v), 0.0), true); - return *this; - } - // assign from long - Complex& operator= (long v) - { - set(PyComplex_FromDoubles (double(v), 0.0), true); - return *this; - } - // assign from an Int - Complex& operator= (const Int& iob) - { - set(PyComplex_FromDoubles (double(long(iob)), 0.0), true); - return *this; - } - - double real() const - { - return PyComplex_RealAsDouble(ptr()); - } - - double imag() const - { - return PyComplex_ImagAsDouble(ptr()); - } - }; - // Sequences - // Sequences are here represented as sequences of items of type T. - // The base class SeqBase represents that. - // In basic Python T is always "Object". - - // seqref is what you get if you get elements from a non-const SeqBase. - // Note: seqref could probably be a nested class in SeqBase but that might stress - // some compilers needlessly. Simlarly for mapref later. - - // While this class is not intended for enduser use, it needs some public - // constructors for the benefit of the STL. - - // See Scott Meyer's More Essential C++ for a description of proxies. - // This application is even more complicated. We are doing an unusual thing - // in having a double proxy. If we want the STL to work - // properly we have to compromise by storing the rvalue inside. The - // entire Object API is repeated so that things like s[i].isList() will - // work properly. - - // Still, once in a while a weird compiler message may occur using expressions like x[i] - // Changing them to Object(x[i]) helps the compiler to understand that the - // conversion of a seqref to an Object is wanted. - - template - class seqref - { - protected: - SeqBase& s; // the sequence - int offset; // item number - T the_item; // lvalue - public: - - seqref (SeqBase& seq, sequence_index_type j) - : s(seq), offset(j), the_item (s.getItem(j)) - {} - - seqref (const seqref& range) - : s(range.s), offset(range.offset), the_item(range.the_item) - {} - - // TMM: added this seqref ctor for use with STL algorithms - seqref (Object& obj) - : s(dynamic_cast< SeqBase&>(obj)) - , offset( NULL ) - , the_item(s.getItem(offset)) - {} - ~seqref() - {} - - operator T() const - { // rvalue - return the_item; - } - - seqref& operator=(const seqref& rhs) - { //used as lvalue - the_item = rhs.the_item; - s.setItem(offset, the_item); - return *this; - } - - seqref& operator=(const T& ob) - { // used as lvalue - the_item = ob; - s.setItem(offset, ob); - return *this; - } - - // forward everything else to the item - PyObject* ptr () const - { - return the_item.ptr(); - } - - int reference_count () const - { // the reference count - return the_item.reference_count(); - } - - Type type () const - { - return the_item.type(); - } - - String str () const; - - String repr () const; - - bool hasAttr (const std::string& attr_name) const - { - return the_item.hasAttr(attr_name); - } - - Object getAttr (const std::string& attr_name) const - { - return the_item.getAttr(attr_name); - } - - Object getItem (const Object& key) const - { - return the_item.getItem(key); - } - - long hashValue () const - { - return the_item.hashValue(); - } - - bool isCallable () const - { - return the_item.isCallable(); - } - - bool isInstance () const - { - return the_item.isInstance(); - } - - bool isDict () const - { - return the_item.isDict(); - } - - bool isList () const - { - return the_item.isList(); - } - - bool isMapping () const - { - return the_item.isMapping(); - } - - bool isNumeric () const - { - return the_item.isNumeric(); - } - - bool isSequence () const - { - return the_item.isSequence(); - } - - bool isTrue () const - { - return the_item.isTrue(); - } - - bool isType (const Type& t) const - { - return the_item.isType (t); - } - - bool isTuple() const - { - return the_item.isTuple(); - } - - bool isString() const - { - return the_item.isString(); - } - // Commands - void setAttr (const std::string& attr_name, const Object& value) - { - the_item.setAttr(attr_name, value); - } - - void delAttr (const std::string& attr_name) - { - the_item.delAttr(attr_name); - } - - void delItem (const Object& key) - { - the_item.delItem(key); - } - - bool operator==(const Object& o2) const - { - return the_item == o2; - } - - bool operator!=(const Object& o2) const - { - return the_item != o2; - } - - bool operator>=(const Object& o2) const - { - return the_item >= o2; - } - - bool operator<=(const Object& o2) const - { - return the_item <= o2; - } - - bool operator<(const Object& o2) const - { - return the_item < o2; - } - - bool operator>(const Object& o2) const - { - return the_item > o2; - } - }; // end of seqref - - - // class SeqBase - // ...the base class for all sequence types - - template - class SeqBase: public Object - { - public: - // STL definitions - typedef size_t size_type; - typedef seqref reference; - typedef T const_reference; - typedef seqref* pointer; - typedef int difference_type; - typedef T value_type; // TMM: 26Jun'01 - - virtual size_type max_size() const - { - return std::string::npos; // ? - } - - virtual size_type capacity() const - { - return size(); - } - - virtual void swap(SeqBase& c) - { - SeqBase temp = c; - c = ptr(); - set(temp.ptr()); - } - - virtual size_type size () const - { - return PySequence_Length (ptr()); - } - - explicit SeqBase () - :Object(PyTuple_New(0), true) - { - validate(); - } - - explicit SeqBase (PyObject* pyob, bool owned=false) - : Object(pyob, owned) - { - validate(); - } - - SeqBase (const Object& ob): Object(ob) - { - validate(); - } - - // Assignment acquires new ownership of pointer - - SeqBase& operator= (const Object& rhs) - { - return (*this = *rhs); - } - - SeqBase& operator= (PyObject* rhsp) - { - if(ptr() == rhsp) return *this; - set (rhsp); - return *this; - } - - virtual bool accepts (PyObject *pyob) const - { - return pyob && PySequence_Check (pyob); - } - - size_type length () const - { - return PySequence_Length (ptr()); - } - - // Element access - const T operator[](sequence_index_type index) const - { - return getItem(index); - } - - seqref operator[](sequence_index_type index) - { - return seqref(*this, index); - } - - virtual T getItem (sequence_index_type i) const - { - return T(asObject(PySequence_GetItem (ptr(), i))); - } - - virtual void setItem (sequence_index_type i, const T& ob) - { - if (PySequence_SetItem (ptr(), i, *ob) == -1) - { - throw Exception(); - } - } - - SeqBase repeat (int count) const - { - return SeqBase (PySequence_Repeat (ptr(), count), true); - } - - SeqBase concat (const SeqBase& other) const - { - return SeqBase (PySequence_Concat(ptr(), *other), true); - } - - // more STL compatability - const T front () const - { - return getItem(0); - } - - seqref front() - { - return seqref(this, 0); - } - - const T back () const - { - return getItem(size()-1); - } - - seqref back() - { - return seqref(this, size()-1); - } - - void verify_length(size_type required_size) const - { - if (size() != required_size) - throw IndexError ("Unexpected SeqBase length."); - } - - void verify_length(size_type min_size, size_type max_size) const - { - size_type n = size(); - if (n < min_size || n > max_size) - throw IndexError ("Unexpected SeqBase length."); - } - - class iterator - : public random_access_iterator_parent(seqref) - { - protected: - friend class SeqBase; - SeqBase* seq; - int count; - - public: - ~iterator () - {} - - iterator () - : seq( 0 ) - , count( 0 ) - {} - - iterator (SeqBase* s, int where) - : seq( s ) - , count( where ) - {} - - iterator (const iterator& other) - : seq( other.seq ) - , count( other.count ) - {} - - bool eql (const iterator& other) const - { - return (seq->ptr() == other.seq->ptr()) && (count == other.count); - } - - bool neq (const iterator& other) const - { - return (seq->ptr() != other.seq->ptr()) || (count != other.count); - } - - bool lss (const iterator& other) const - { - return (count < other.count); - } - - bool gtr (const iterator& other) const - { - return (count > other.count); - } - - bool leq (const iterator& other) const - { - return (count <= other.count); - } - - bool geq (const iterator& other) const - { - return (count >= other.count); - } - - seqref operator*() - { - return seqref(*seq, count); - } - - seqref operator[] (sequence_index_type i) - { - return seqref(*seq, count + i); - } - - iterator& operator=(const iterator& other) - { - if (this == &other) return *this; - seq = other.seq; - count = other.count; - return *this; - } - - iterator operator+(int n) const - { - return iterator(seq, count + n); - } - - iterator operator-(int n) const - { - return iterator(seq, count - n); - } - - iterator& operator+=(int n) - { - count = count + n; - return *this; - } - - iterator& operator-=(int n) - { - count = count - n; - return *this; - } - - int operator-(const iterator& other) const - { - if (*seq != *other.seq) - throw RuntimeError ("SeqBase::iterator comparison error"); - return count - other.count; - } - - // prefix ++ - iterator& operator++ () - { count++; return *this;} - // postfix ++ - iterator operator++ (int) - { return iterator(seq, count++);} - // prefix -- - iterator& operator-- () - { count--; return *this;} - // postfix -- - iterator operator-- (int) - { return iterator(seq, count--);} - - std::string diagnose() const - { - std::OSTRSTREAM oss; - oss << "iterator diagnosis " << seq << ", " << count << std::ends; - return std::string(oss.str()); - } - }; // end of class SeqBase::iterator - - iterator begin () - { - return iterator(this, 0); - } - - iterator end () - { - return iterator(this, length()); - } - - class const_iterator - : public random_access_iterator_parent(const Object) - { - protected: - friend class SeqBase; - const SeqBase* seq; - sequence_index_type count; - - private: - const_iterator (const SeqBase* s, int where) - : seq( s ) - , count( where ) - {} - - public: - ~const_iterator () - {} - - const_iterator () - : seq( 0 ) - , count( 0 ) - {} - - const_iterator(const const_iterator& other) - : seq( other.seq ) - , count( other.count ) - {} - - const T operator*() const - { - return seq->getItem(count); - } - - const T operator[] (sequence_index_type i) const - { - return seq->getItem(count + i); - } - - const_iterator& operator=(const const_iterator& other) - { - if (this == &other) return *this; - seq = other.seq; - count = other.count; - return *this; - } - - const_iterator operator+(int n) const - { - return const_iterator(seq, count + n); - } - - bool eql (const const_iterator& other) const - { - return (seq->ptr() == other.seq->ptr()) && (count == other.count); - } - - bool neq (const const_iterator& other) const - { - return (seq->ptr() != other.seq->ptr()) || (count != other.count); - } - - bool lss (const const_iterator& other) const - { - return (count < other.count); - } - - bool gtr (const const_iterator& other) const - { - return (count > other.count); - } - - bool leq (const const_iterator& other) const - { - return (count <= other.count); - } - - bool geq (const const_iterator& other) const - { - return (count >= other.count); - } - - const_iterator operator-(int n) - { - return const_iterator(seq, count - n); - } - - const_iterator& operator+=(int n) - { - count = count + n; - return *this; - } - - const_iterator& operator-=(int n) - { - count = count - n; - return *this; - } - - int operator-(const const_iterator& other) const - { - if (*seq != *other.seq) - throw RuntimeError ("SeqBase::const_iterator::- error"); - return count - other.count; - } - // prefix ++ - const_iterator& operator++ () - { count++; return *this;} - // postfix ++ - const_iterator operator++ (int) - { return const_iterator(seq, count++);} - // prefix -- - const_iterator& operator-- () - { count--; return *this;} - // postfix -- - const_iterator operator-- (int) - { return const_iterator(seq, count--);} - }; // end of class SeqBase::const_iterator - - const_iterator begin () const - { - return const_iterator(this, 0); - } - - const_iterator end () const - { - return const_iterator(this, length()); - } - }; - - // Here's an important typedef you might miss if reading too fast... - typedef SeqBase Sequence; - - template bool operator==(const EXPLICIT_TYPENAME SeqBase::iterator& left, const EXPLICIT_TYPENAME SeqBase::iterator& right); - template bool operator!=(const EXPLICIT_TYPENAME SeqBase::iterator& left, const EXPLICIT_TYPENAME SeqBase::iterator& right); - template bool operator< (const EXPLICIT_TYPENAME SeqBase::iterator& left, const EXPLICIT_TYPENAME SeqBase::iterator& right); - template bool operator> (const EXPLICIT_TYPENAME SeqBase::iterator& left, const EXPLICIT_TYPENAME SeqBase::iterator& right); - template bool operator<=(const EXPLICIT_TYPENAME SeqBase::iterator& left, const EXPLICIT_TYPENAME SeqBase::iterator& right); - template bool operator>=(const EXPLICIT_TYPENAME SeqBase::iterator& left, const EXPLICIT_TYPENAME SeqBase::iterator& right); - - template bool operator==(const EXPLICIT_TYPENAME SeqBase::const_iterator& left, const EXPLICIT_TYPENAME SeqBase::const_iterator& right); - template bool operator!=(const EXPLICIT_TYPENAME SeqBase::const_iterator& left, const EXPLICIT_TYPENAME SeqBase::const_iterator& right); - template bool operator< (const EXPLICIT_TYPENAME SeqBase::const_iterator& left, const EXPLICIT_TYPENAME SeqBase::const_iterator& right); - template bool operator> (const EXPLICIT_TYPENAME SeqBase::const_iterator& left, const EXPLICIT_TYPENAME SeqBase::const_iterator& right); - template bool operator<=(const EXPLICIT_TYPENAME SeqBase::const_iterator& left, const EXPLICIT_TYPENAME SeqBase::const_iterator& right); - template bool operator>=(const EXPLICIT_TYPENAME SeqBase::const_iterator& left, const EXPLICIT_TYPENAME SeqBase::const_iterator& right); - - - extern bool operator==(const Sequence::iterator& left, const Sequence::iterator& right); - extern bool operator!=(const Sequence::iterator& left, const Sequence::iterator& right); - extern bool operator< (const Sequence::iterator& left, const Sequence::iterator& right); - extern bool operator> (const Sequence::iterator& left, const Sequence::iterator& right); - extern bool operator<=(const Sequence::iterator& left, const Sequence::iterator& right); - extern bool operator>=(const Sequence::iterator& left, const Sequence::iterator& right); - - extern bool operator==(const Sequence::const_iterator& left, const Sequence::const_iterator& right); - extern bool operator!=(const Sequence::const_iterator& left, const Sequence::const_iterator& right); - extern bool operator< (const Sequence::const_iterator& left, const Sequence::const_iterator& right); - extern bool operator> (const Sequence::const_iterator& left, const Sequence::const_iterator& right); - extern bool operator<=(const Sequence::const_iterator& left, const Sequence::const_iterator& right); - extern bool operator>=(const Sequence::const_iterator& left, const Sequence::const_iterator& right); - - // ================================================== - // class Char - // Python strings return strings as individual elements. - // I'll try having a class Char which is a String of length 1 - // - typedef std::basic_string unicodestring; - extern Py_UNICODE unicode_null_string[1]; - - class Char: public Object - { - public: - explicit Char (PyObject *pyob, bool owned = false): Object(pyob, owned) - { - validate(); - } - - Char (const Object& ob): Object(ob) - { - validate(); - } - - Char (const std::string& v = "") - :Object(PyString_FromStringAndSize (const_cast(v.c_str()),1), true) - { - validate(); - } - - Char (char v) - : Object(PyString_FromStringAndSize (&v, 1), true) - { - validate(); - } - - Char (Py_UNICODE v) - : Object(PyUnicode_FromUnicode (&v, 1), true) - { - validate(); - } - // Assignment acquires new ownership of pointer - Char& operator= (const Object& rhs) - { - return (*this = *rhs); - } - - Char& operator= (PyObject* rhsp) - { - if(ptr() == rhsp) return *this; - set (rhsp); - return *this; - } - - // Membership - virtual bool accepts (PyObject *pyob) const - { - return pyob && (Py::_String_Check(pyob) || Py::_Unicode_Check(pyob)) && PySequence_Length (pyob) == 1; - } - - // Assignment from C string - Char& operator= (const std::string& v) - { - set(PyString_FromStringAndSize (const_cast(v.c_str()),1), true); - return *this; - } - - Char& operator= (char v) - { - set(PyString_FromStringAndSize (&v, 1), true); - return *this; - } - - Char& operator= (const unicodestring& v) - { - set(PyUnicode_FromUnicode (const_cast(v.data()),1), true); - return *this; - } - - Char& operator= (Py_UNICODE v) - { - set(PyUnicode_FromUnicode (&v, 1), true); - return *this; - } - - // Conversion - operator String() const; - - operator std::string () const - { - return std::string(PyString_AsString (ptr())); - } - }; - - class String: public SeqBase - { - public: - virtual size_type capacity() const - { - return max_size(); - } - - explicit String (PyObject *pyob, bool owned = false): SeqBase(pyob, owned) - { - validate(); - } - - String (const Object& ob): SeqBase(ob) - { - validate(); - } - - String() - : SeqBase( PyString_FromStringAndSize( "", 0 ), true ) - { - validate(); - } - - String( const std::string& v ) - : SeqBase( PyString_FromStringAndSize( const_cast(v.data()), - static_cast( v.length() ) ), true ) - { - validate(); - } - - String( const char *s, const char *encoding, const char *error="strict" ) - : SeqBase( PyUnicode_Decode( s, strlen( s ), encoding, error ), true ) - { - validate(); - } - - String( const char *s, int len, const char *encoding, const char *error="strict" ) - : SeqBase( PyUnicode_Decode( s, len, encoding, error ), true ) - { - validate(); - } - - String( const std::string &s, const char *encoding, const char *error="strict" ) - : SeqBase( PyUnicode_Decode( s.c_str(), s.length(), encoding, error ), true ) - { - validate(); - } - - String( const std::string& v, std::string::size_type vsize ) - : SeqBase(PyString_FromStringAndSize( const_cast(v.data()), - static_cast( vsize ) ), true) - { - validate(); - } - - String( const char *v, int vsize ) - : SeqBase(PyString_FromStringAndSize( const_cast(v), vsize ), true ) - { - validate(); - } - - String( const char* v ) - : SeqBase( PyString_FromString( v ), true ) - { - validate(); - } - - // Assignment acquires new ownership of pointer - String& operator= ( const Object& rhs ) - { - return *this = *rhs; - } - - String& operator= (PyObject* rhsp) - { - if( ptr() == rhsp ) - return *this; - set (rhsp); - return *this; - } - // Membership - virtual bool accepts (PyObject *pyob) const - { - return pyob && (Py::_String_Check(pyob) || Py::_Unicode_Check(pyob)); - } - - // Assignment from C string - String& operator= (const std::string& v) - { - set( PyString_FromStringAndSize( const_cast( v.data() ), - static_cast( v.length() ) ), true ); - return *this; - } - String& operator= (const unicodestring& v) - { - set( PyUnicode_FromUnicode( const_cast( v.data() ), - static_cast( v.length() ) ), true ); - return *this; - } - - - // Encode - String encode( const char *encoding, const char *error="strict" ) - { - if( isUnicode() ) - { - return String( PyUnicode_AsEncodedString( ptr(), encoding, error ) ); - } - else - { - return String( PyString_AsEncodedObject( ptr(), encoding, error ) ); - } - } - - String decode( const char *encoding, const char *error="strict" ) - { - return Object( PyString_AsDecodedObject( ptr(), encoding, error ) ); - } - - // Queries - virtual size_type size () const - { - if( isUnicode() ) - { - return static_cast( PyUnicode_GET_SIZE (ptr()) ); - } - else - { - return static_cast( PyString_Size (ptr()) ); - } - } - - operator std::string () const - { - return as_std_string(); - } - - std::string as_std_string() const - { - if( isUnicode() ) - { - throw TypeError("cannot return std::string from Unicode object"); - } - else - { - return std::string( PyString_AsString( ptr() ), static_cast( PyString_Size( ptr() ) ) ); - } - } - - unicodestring as_unicodestring() const - { - if( isUnicode() ) - { - return unicodestring( PyUnicode_AS_UNICODE( ptr() ), - static_cast( PyUnicode_GET_SIZE( ptr() ) ) ); - } - else - { - throw TypeError("can only return unicodestring from Unicode object"); - } - } - }; - - // ================================================== - // class Tuple - class Tuple: public Sequence - { - public: - virtual void setItem (sequence_index_type offset, const Object&ob) - { - // note PyTuple_SetItem is a thief... - if(PyTuple_SetItem (ptr(), offset, new_reference_to(ob)) == -1) - { - throw Exception(); - } - } - - // Constructor - explicit Tuple (PyObject *pyob, bool owned = false): Sequence (pyob, owned) - { - validate(); - } - - Tuple (const Object& ob): Sequence(ob) - { - validate(); - } - - // New tuple of a given size - explicit Tuple (int size = 0) - { - set(PyTuple_New (size), true); - validate (); - for (sequence_index_type i=0; i < size; i++) - { - if(PyTuple_SetItem (ptr(), i, new_reference_to(Py::_None())) == -1) - { - throw Exception(); - } - } - } - // Tuple from any sequence - explicit Tuple (const Sequence& s) - { - sequence_index_type limit( sequence_index_type( s.length() ) ); - - set(PyTuple_New (limit), true); - validate(); - - for(sequence_index_type i=0; i < limit; i++) - { - if(PyTuple_SetItem (ptr(), i, new_reference_to(s[i])) == -1) - { - throw Exception(); - } - } - } - // Assignment acquires new ownership of pointer - - Tuple& operator= (const Object& rhs) - { - return (*this = *rhs); - } - - Tuple& operator= (PyObject* rhsp) - { - if(ptr() == rhsp) return *this; - set (rhsp); - return *this; - } - // Membership - virtual bool accepts (PyObject *pyob) const - { - return pyob && Py::_Tuple_Check (pyob); - } - - Tuple getSlice (int i, int j) const - { - return Tuple (PySequence_GetSlice (ptr(), i, j), true); - } - - }; - - // ================================================== - // class List - - class List: public Sequence - { - public: - // Constructor - explicit List (PyObject *pyob, bool owned = false): Sequence(pyob, owned) - { - validate(); - } - List (const Object& ob): Sequence(ob) - { - validate(); - } - // Creation at a fixed size - List (int size = 0) - { - set(PyList_New (size), true); - validate(); - for (sequence_index_type i=0; i < size; i++) - { - if(PyList_SetItem (ptr(), i, new_reference_to(Py::_None())) == -1) - { - throw Exception(); - } - } - } - - // List from a sequence - List (const Sequence& s): Sequence() - { - int n = (int)s.length(); - set(PyList_New (n), true); - validate(); - for (sequence_index_type i=0; i < n; i++) - { - if(PyList_SetItem (ptr(), i, new_reference_to(s[i])) == -1) - { - throw Exception(); - } - } - } - - virtual size_type capacity() const - { - return max_size(); - } - // Assignment acquires new ownership of pointer - - List& operator= (const Object& rhs) - { - return (*this = *rhs); - } - - List& operator= (PyObject* rhsp) - { - if(ptr() == rhsp) return *this; - set (rhsp); - return *this; - } - // Membership - virtual bool accepts (PyObject *pyob) const - { - return pyob && Py::_List_Check (pyob); - } - - List getSlice (int i, int j) const - { - return List (PyList_GetSlice (ptr(), i, j), true); - } - - void setSlice (int i, int j, const Object& v) - { - if(PyList_SetSlice (ptr(), i, j, *v) == -1) - { - throw Exception(); - } - } - - void append (const Object& ob) - { - if(PyList_Append (ptr(), *ob) == -1) - { - throw Exception(); - } - } - - void insert (int i, const Object& ob) - { - if(PyList_Insert (ptr(), i, *ob) == -1) - { - throw Exception(); - } - } - - void sort () - { - if(PyList_Sort(ptr()) == -1) - { - throw Exception(); - } - } - - void reverse () - { - if(PyList_Reverse(ptr()) == -1) - { - throw Exception(); - } - } - }; - - - // Mappings - // ================================================== - template - class mapref - { - protected: - MapBase& s; // the map - Object key; // item key - T the_item; - - public: - mapref (MapBase& map, const std::string& k) - : s(map), the_item() - { - key = String(k); - if(map.hasKey(key)) the_item = map.getItem(key); - } - - mapref (MapBase& map, const Object& k) - : s(map), key(k), the_item() - { - if(map.hasKey(key)) the_item = map.getItem(key); - } - - virtual ~mapref() - {} - - // MapBase stuff - // lvalue - mapref& operator=(const mapref& other) - { - if(this == &other) return *this; - the_item = other.the_item; - s.setItem(key, other.the_item); - return *this; - } - - mapref& operator= (const T& ob) - { - the_item = ob; - s.setItem (key, ob); - return *this; - } - - // rvalue - operator T() const - { - return the_item; - } - - // forward everything else to the_item - PyObject* ptr () const - { - return the_item.ptr(); - } - - int reference_count () const - { // the mapref count - return the_item.reference_count(); - } - - Type type () const - { - return the_item.type(); - } - - String str () const - { - return the_item.str(); - } - - String repr () const - { - return the_item.repr(); - } - - bool hasAttr (const std::string& attr_name) const - { - return the_item.hasAttr(attr_name); - } - - Object getAttr (const std::string& attr_name) const - { - return the_item.getAttr(attr_name); - } - - Object getItem (const Object& k) const - { - return the_item.getItem(k); - } - - long hashValue () const - { - return the_item.hashValue(); - } - - bool isCallable () const - { - return the_item.isCallable(); - } - - bool isInstance () const - { - return the_item.isInstance(); - } - - bool isList () const - { - return the_item.isList(); - } - - bool isMapping () const - { - return the_item.isMapping(); - } - - bool isNumeric () const - { - return the_item.isNumeric(); - } - - bool isSequence () const - { - return the_item.isSequence(); - } - - bool isTrue () const - { - return the_item.isTrue(); - } - - bool isType (const Type& t) const - { - return the_item.isType (t); - } - - bool isTuple() const - { - return the_item.isTuple(); - } - - bool isString() const - { - return the_item.isString(); - } - - // Commands - void setAttr (const std::string& attr_name, const Object& value) - { - the_item.setAttr(attr_name, value); - } - - void delAttr (const std::string& attr_name) - { - the_item.delAttr(attr_name); - } - - void delItem (const Object& k) - { - the_item.delItem(k); - } - }; // end of mapref - - // TMM: now for mapref - template< class T > - bool operator==(const mapref& left, const mapref& right) - { - return true; // NOT completed. - } - - template< class T > - bool operator!=(const mapref& left, const mapref& right) - { - return true; // not completed. - } - - template - class MapBase: public Object - { - protected: - explicit MapBase() - {} - public: - // reference: proxy class for implementing [] - // TMM: 26Jun'01 - the types - // If you assume that Python mapping is a hash_map... - // hash_map::value_type is not assignable, but - // (*it).second = data must be a valid expression - typedef size_t size_type; - typedef Object key_type; - typedef mapref data_type; - typedef std::pair< const T, T > value_type; - typedef std::pair< const T, mapref > reference; - typedef const std::pair< const T, const T > const_reference; - typedef std::pair< const T, mapref > pointer; - - // Constructor - explicit MapBase (PyObject *pyob, bool owned = false): Object(pyob, owned) - { - validate(); - } - - // TMM: 02Jul'01 - changed MapBase to Object in next line - MapBase (const Object& ob): Object(ob) - { - validate(); - } - - // Assignment acquires new ownership of pointer - MapBase& operator= (const Object& rhs) - { - return (*this = *rhs); - } - - MapBase& operator= (PyObject* rhsp) - { - if(ptr() == rhsp) return *this; - set (rhsp); - return *this; - } - // Membership - virtual bool accepts (PyObject *pyob) const - { - return pyob && PyMapping_Check(pyob); - } - - // Clear -- PyMapping Clear is missing - // - - void clear () - { - List k = keys(); - for(List::iterator i = k.begin(); i != k.end(); i++) - { - delItem(*i); - } - } - - virtual size_type size() const - { - return PyMapping_Length (ptr()); - } - - // Element Access - T operator[](const std::string& key) const - { - return getItem(key); - } - - T operator[](const Object& key) const - { - return getItem(key); - } - - mapref operator[](const std::string& key) - { - return mapref(*this, key); - } - - mapref operator[](const Object& key) - { - return mapref(*this, key); - } - - int length () const - { - return PyMapping_Length (ptr()); - } - - bool hasKey (const std::string& s) const - { - return PyMapping_HasKeyString (ptr(),const_cast(s.c_str())) != 0; - } - - bool hasKey (const Object& s) const - { - return PyMapping_HasKey (ptr(), s.ptr()) != 0; - } - - T getItem (const std::string& s) const - { - return T( - asObject(PyMapping_GetItemString (ptr(),const_cast(s.c_str()))) - ); - } - - T getItem (const Object& s) const - { - return T( - asObject(PyObject_GetItem (ptr(), s.ptr())) - ); - } - - virtual void setItem (const char *s, const Object& ob) - { - if (PyMapping_SetItemString (ptr(), const_cast(s), *ob) == -1) - { - throw Exception(); - } - } - - virtual void setItem (const std::string& s, const Object& ob) - { - if (PyMapping_SetItemString (ptr(), const_cast(s.c_str()), *ob) == -1) - { - throw Exception(); - } - } - - virtual void setItem (const Object& s, const Object& ob) - { - if (PyObject_SetItem (ptr(), s.ptr(), ob.ptr()) == -1) - { - throw Exception(); - } - } - - void delItem (const std::string& s) - { - if (PyMapping_DelItemString (ptr(), const_cast(s.c_str())) == -1) - { - throw Exception(); - } - } - - void delItem (const Object& s) - { - if (PyMapping_DelItem (ptr(), *s) == -1) - { - throw Exception(); - } - } - // Queries - List keys () const - { - return List(PyMapping_Keys(ptr()), true); - } - - List values () const - { // each returned item is a (key, value) pair - return List(PyMapping_Values(ptr()), true); - } - - List items () const - { - return List(PyMapping_Items(ptr()), true); - } - - class iterator - { - // : public forward_iterator_parent( std::pair ) { - protected: - typedef std::forward_iterator_tag iterator_category; - typedef std::pair< const T, T > value_type; - typedef int difference_type; - typedef std::pair< const T, mapref > pointer; - typedef std::pair< const T, mapref > reference; - - friend class MapBase; - // - MapBase* map; - List keys; // for iterating over the map - int pos; // index into the keys - - private: - iterator( MapBase* m, List k, int p ) - : map( m ) - , keys( k ) - , pos( p ) - {} - - public: - ~iterator () - {} - - iterator () - : map( 0 ) - , keys() - , pos() - {} - - iterator (MapBase* m, bool end = false ) - : map( m ) - , keys( m->keys() ) - , pos( end ? keys.length() : 0 ) - {} - - iterator (const iterator& other) - : map( other.map ) - , keys( other.keys ) - , pos( other.pos ) - {} - - reference operator*() - { - Object key = keys[ pos ]; - return std::make_pair(key, mapref(*map,key)); - } - - iterator& operator=(const iterator& other) - { - if (this == &other) - return *this; - map = other.map; - keys = other.keys; - pos = other.pos; - return *this; - } - - bool eql(const iterator& right) const - { - return map->ptr() == right.map->ptr() && pos == right.pos; - } - bool neq( const iterator& right ) const - { - return map->ptr() != right.map->ptr() || pos != right.pos; - } - - // pointer operator->() { - // return ; - // } - - // prefix ++ - iterator& operator++ () - { pos++; return *this;} - // postfix ++ - iterator operator++ (int) - { return iterator(map, keys, pos++);} - // prefix -- - iterator& operator-- () - { pos--; return *this;} - // postfix -- - iterator operator-- (int) - { return iterator(map, keys, pos--);} - - std::string diagnose() const - { - std::OSTRSTREAM oss; - oss << "iterator diagnosis " << map << ", " << pos << std::ends; - return std::string(oss.str()); - } - }; // end of class MapBase::iterator - - iterator begin () - { - return iterator(this); - } - - iterator end () - { - return iterator(this, true); - } - - class const_iterator - { - protected: - typedef std::forward_iterator_tag iterator_category; - typedef const std::pair< const T, T > value_type; - typedef int difference_type; - typedef const std::pair< const T, T > pointer; - typedef const std::pair< const T, T > reference; - - friend class MapBase; - const MapBase* map; - List keys; // for iterating over the map - int pos; // index into the keys - - private: - const_iterator( MapBase* m, List k, int p ) - : map( m ) - , keys( k ) - , pos( p ) - {} - - public: - ~const_iterator () - {} - - const_iterator () - : map( 0 ) - , keys() - , pos() - {} - - const_iterator (MapBase* m, bool end = false ) - : map( m ) - , keys( m->keys() ) - , pos( end ? keys.length() : 0 ) - {} - - const_iterator(const const_iterator& other) - : map( other.map ) - , keys( other.keys ) - , pos( other.pos ) - {} - - bool eql(const const_iterator& right) const - { - return map->ptr() == right.map->ptr() && pos == right.pos; - } - - bool neq( const const_iterator& right ) const - { - return map->ptr() != right.map->ptr() || pos != right.pos; - } - - const_reference operator*() - { - Object key = keys[ pos ]; - return std::make_pair( key, mapref( *map, key ) ); - } - - const_iterator& operator=(const const_iterator& other) - { - if (this == &other) return *this; - map = other.map; - keys = other.keys; - pos = other.pos; - return *this; - } - - // prefix ++ - const_iterator& operator++ () - { pos++; return *this;} - // postfix ++ - const_iterator operator++ (int) - { return const_iterator(map, keys, pos++);} - // prefix -- - const_iterator& operator-- () - { pos--; return *this;} - // postfix -- - const_iterator operator-- (int) - { return const_iterator(map, keys, pos--);} - }; // end of class MapBase::const_iterator - - const_iterator begin () const - { - return const_iterator(this); - } - - const_iterator end () const - { - return const_iterator(this, true); - } - - }; // end of MapBase - - typedef MapBase Mapping; - - template bool operator==(const EXPLICIT_TYPENAME MapBase::iterator& left, const EXPLICIT_TYPENAME MapBase::iterator& right); - template bool operator!=(const EXPLICIT_TYPENAME MapBase::iterator& left, const EXPLICIT_TYPENAME MapBase::iterator& right); - template bool operator==(const EXPLICIT_TYPENAME MapBase::const_iterator& left, const EXPLICIT_TYPENAME MapBase::const_iterator& right); - template bool operator!=(const EXPLICIT_TYPENAME MapBase::const_iterator& left, const EXPLICIT_TYPENAME MapBase::const_iterator& right); - - extern bool operator==(const Mapping::iterator& left, const Mapping::iterator& right); - extern bool operator!=(const Mapping::iterator& left, const Mapping::iterator& right); - extern bool operator==(const Mapping::const_iterator& left, const Mapping::const_iterator& right); - extern bool operator!=(const Mapping::const_iterator& left, const Mapping::const_iterator& right); - - - // ================================================== - // class Dict - class Dict: public Mapping - { - public: - // Constructor - explicit Dict (PyObject *pyob, bool owned=false): Mapping (pyob, owned) - { - validate(); - } - Dict (const Object& ob): Mapping(ob) - { - validate(); - } - // Creation - Dict () - { - set(PyDict_New (), true); - validate(); - } - // Assignment acquires new ownership of pointer - - Dict& operator= (const Object& rhs) - { - return (*this = *rhs); - } - - Dict& operator= (PyObject* rhsp) - { - if(ptr() == rhsp) return *this; - set(rhsp); - return *this; - } - // Membership - virtual bool accepts (PyObject *pyob) const - { - return pyob && Py::_Dict_Check (pyob); - } - }; - - class Callable: public Object - { - public: - // Constructor - explicit Callable (): Object() {} - explicit Callable (PyObject *pyob, bool owned = false): Object (pyob, owned) - { - validate(); - } - - Callable (const Object& ob): Object(ob) - { - validate(); - } - - // Assignment acquires new ownership of pointer - - Callable& operator= (const Object& rhs) - { - return (*this = *rhs); - } - - Callable& operator= (PyObject* rhsp) - { - if(ptr() == rhsp) return *this; - set (rhsp); - return *this; - } - - // Membership - virtual bool accepts (PyObject *pyob) const - { - return pyob && PyCallable_Check (pyob); - } - - // Call - Object apply(const Tuple& args) const - { - return asObject(PyObject_CallObject(ptr(), args.ptr())); - } - - // Call with keywords - Object apply(const Tuple& args, const Dict& kw) const - { - return asObject( PyEval_CallObjectWithKeywords( ptr(), args.ptr(), kw.ptr() ) ); - } - - Object apply(PyObject* pargs = 0) const - { - return apply (Tuple(pargs)); - } - }; - - class Module: public Object - { - public: - explicit Module (PyObject* pyob, bool owned = false): Object (pyob, owned) - { - validate(); - } - - // Construct from module name - explicit Module (const std::string&s): Object() - { - PyObject *m = PyImport_AddModule( const_cast(s.c_str()) ); - set( m, false ); - validate (); - } - - // Copy constructor acquires new ownership of pointer - Module (const Module& ob): Object(*ob) - { - validate(); - } - - Module& operator= (const Object& rhs) - { - return (*this = *rhs); - } - - Module& operator= (PyObject* rhsp) - { - if(ptr() == rhsp) return *this; - set(rhsp); - return *this; - } - - Dict getDict() - { - return Dict(PyModule_GetDict(ptr())); - // Caution -- PyModule_GetDict returns borrowed reference! - } - }; - - // Numeric interface - inline Object operator+ (const Object& a) - { - return asObject(PyNumber_Positive(*a)); - } - inline Object operator- (const Object& a) - { - return asObject(PyNumber_Negative(*a)); - } - - inline Object abs(const Object& a) - { - return asObject(PyNumber_Absolute(*a)); - } - - inline std::pair coerce(const Object& a, const Object& b) - { - PyObject *p1, *p2; - p1 = *a; - p2 = *b; - if(PyNumber_Coerce(&p1,&p2) == -1) - { - throw Exception(); - } - return std::pair(asObject(p1), asObject(p2)); - } - - inline Object operator+ (const Object& a, const Object& b) - { - return asObject(PyNumber_Add(*a, *b)); - } - inline Object operator+ (const Object& a, int j) - { - return asObject(PyNumber_Add(*a, *Int(j))); - } - inline Object operator+ (const Object& a, double v) - { - return asObject(PyNumber_Add(*a, *Float(v))); - } - inline Object operator+ (int j, const Object& b) - { - return asObject(PyNumber_Add(*Int(j), *b)); - } - inline Object operator+ (double v, const Object& b) - { - return asObject(PyNumber_Add(*Float(v), *b)); - } - - inline Object operator- (const Object& a, const Object& b) - { - return asObject(PyNumber_Subtract(*a, *b)); - } - inline Object operator- (const Object& a, int j) - { - return asObject(PyNumber_Subtract(*a, *Int(j))); - } - inline Object operator- (const Object& a, double v) - { - return asObject(PyNumber_Subtract(*a, *Float(v))); - } - inline Object operator- (int j, const Object& b) - { - return asObject(PyNumber_Subtract(*Int(j), *b)); - } - inline Object operator- (double v, const Object& b) - { - return asObject(PyNumber_Subtract(*Float(v), *b)); - } - - inline Object operator* (const Object& a, const Object& b) - { - return asObject(PyNumber_Multiply(*a, *b)); - } - inline Object operator* (const Object& a, int j) - { - return asObject(PyNumber_Multiply(*a, *Int(j))); - } - inline Object operator* (const Object& a, double v) - { - return asObject(PyNumber_Multiply(*a, *Float(v))); - } - inline Object operator* (int j, const Object& b) - { - return asObject(PyNumber_Multiply(*Int(j), *b)); - } - inline Object operator* (double v, const Object& b) - { - return asObject(PyNumber_Multiply(*Float(v), *b)); - } - - inline Object operator/ (const Object& a, const Object& b) - { - return asObject(PyNumber_Divide(*a, *b)); - } - inline Object operator/ (const Object& a, int j) - { - return asObject(PyNumber_Divide(*a, *Int(j))); - } - inline Object operator/ (const Object& a, double v) - { - return asObject(PyNumber_Divide(*a, *Float(v))); - } - inline Object operator/ (int j, const Object& b) - { - return asObject(PyNumber_Divide(*Int(j), *b)); - } - inline Object operator/ (double v, const Object& b) - { - return asObject(PyNumber_Divide(*Float(v), *b)); - } - - inline Object operator% (const Object& a, const Object& b) - { - return asObject(PyNumber_Remainder(*a, *b)); - } - inline Object operator% (const Object& a, int j) - { - return asObject(PyNumber_Remainder(*a, *Int(j))); - } - inline Object operator% (const Object& a, double v) - { - return asObject(PyNumber_Remainder(*a, *Float(v))); - } - inline Object operator% (int j, const Object& b) - { - return asObject(PyNumber_Remainder(*Int(j), *b)); - } - inline Object operator% (double v, const Object& b) - { - return asObject(PyNumber_Remainder(*Float(v), *b)); - } - - inline Object type(const Exception&) // return the type of the error - { - PyObject *ptype, *pvalue, *ptrace; - PyErr_Fetch(&ptype, &pvalue, &ptrace); - Object result; - if(ptype) result = ptype; - PyErr_Restore(ptype, pvalue, ptrace); - return result; - } - - inline Object value(const Exception&) // return the value of the error - { - PyObject *ptype, *pvalue, *ptrace; - PyErr_Fetch(&ptype, &pvalue, &ptrace); - Object result; - if(pvalue) result = pvalue; - PyErr_Restore(ptype, pvalue, ptrace); - return result; - } - - inline Object trace(const Exception&) // return the traceback of the error - { - PyObject *ptype, *pvalue, *ptrace; - PyErr_Fetch(&ptype, &pvalue, &ptrace); - Object result; - if(ptrace) result = ptrace; - PyErr_Restore(ptype, pvalue, ptrace); - return result; - } - -template -String seqref::str () const -{ - return the_item.str(); -} - -template -String seqref::repr () const -{ - return the_item.repr(); -} - -} // namespace Py -#endif // __CXX_Objects__h diff -Nru matplotlib-0.99.3/CXX/Python2/Config.hxx matplotlib-1.0.1/CXX/Python2/Config.hxx --- matplotlib-0.99.3/CXX/Python2/Config.hxx 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/CXX/Python2/Config.hxx 2010-07-07 01:41:52.000000000 +0000 @@ -0,0 +1,118 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// 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 disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED 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 REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY 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. +// +//----------------------------------------------------------------------------- + +#ifndef __PyCXX_config_hh__ +#define __PyCXX_config_hh__ + +// +// Microsoft VC++ 6.0 has no traits +// +#if defined( _MSC_VER ) + +# define STANDARD_LIBRARY_HAS_ITERATOR_TRAITS 1 + +#elif defined( __GNUC__ ) +# if __GNUC__ >= 3 +# define STANDARD_LIBRARY_HAS_ITERATOR_TRAITS 1 +# else +# define STANDARD_LIBRARY_HAS_ITERATOR_TRAITS 0 +#endif + +// +// Assume all other compilers do +// +#else + +// Macros to deal with deficiencies in compilers +# define STANDARD_LIBRARY_HAS_ITERATOR_TRAITS 1 +#endif + +#if STANDARD_LIBRARY_HAS_ITERATOR_TRAITS +# define random_access_iterator_parent(itemtype) std::iterator +#else +# define random_access_iterator_parent(itemtype) std::random_access_iterator +#endif + +// +// Which C++ standard is in use? +// +#if defined( _MSC_VER ) +# if _MSC_VER <= 1200 +// MSVC++ 6.0 +# define PYCXX_ISO_CPP_LIB 0 +# define STR_STREAM +# define TEMPLATE_TYPENAME class +# else +# define PYCXX_ISO_CPP_LIB 1 +# define STR_STREAM +# define TEMPLATE_TYPENAME typename +# endif +#elif defined( __GNUC__ ) +# if __GNUC__ >= 3 +# define PYCXX_ISO_CPP_LIB 1 +# define STR_STREAM +# define TEMPLATE_TYPENAME typename +# else +# define PYCXX_ISO_CPP_LIB 0 +# define STR_STREAM +# define TEMPLATE_TYPENAME class +# endif +#endif + +#if PYCXX_ISO_CPP_LIB +# define STR_STREAM +# define OSTRSTREAM ostringstream +# define EXPLICIT_TYPENAME typename +# define EXPLICIT_CLASS class +# define TEMPLATE_TYPENAME typename +#else +# define STR_STREAM +# define OSTRSTREAM ostrstream +# define EXPLICIT_TYPENAME +# define EXPLICIT_CLASS +# define TEMPLATE_TYPENAME class +#endif + +// before 2.5 Py_ssize_t was missing +#ifndef PY_MAJOR_VERSION +#error not defined PY_MAJOR_VERSION +#endif +#if PY_MAJOR_VERSION < 2 || (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION < 5) +typedef int Py_ssize_t; +#endif + +#endif // __PyCXX_config_hh__ diff -Nru matplotlib-0.99.3/CXX/Python2/CxxDebug.hxx matplotlib-1.0.1/CXX/Python2/CxxDebug.hxx --- matplotlib-0.99.3/CXX/Python2/CxxDebug.hxx 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/CXX/Python2/CxxDebug.hxx 2010-07-07 01:41:52.000000000 +0000 @@ -0,0 +1,17 @@ +// +// CxxDebug.hxx +// +// Copyright (c) 2008 Barry A. Scott +// +#ifndef __CXX_Debug_hxx +#define __CXX_Debug_hxx + +// +// Functions useful when debugging PyCXX +// +#ifdef PYCXX_DEBUG +extern void bpt(); +extern void printRefCount( PyObject *obj ); +#endif + +#endif diff -Nru matplotlib-0.99.3/CXX/Python2/cxxextensions.c matplotlib-1.0.1/CXX/Python2/cxxextensions.c --- matplotlib-0.99.3/CXX/Python2/cxxextensions.c 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/CXX/Python2/cxxextensions.c 2010-07-07 01:41:52.000000000 +0000 @@ -0,0 +1,49 @@ +/*---------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// 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 disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED 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 REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY 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. +// +//---------------------------------------------------------------------------*/ + +#include "CXX/WrapPython.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +PyObject py_object_initializer = {PyObject_HEAD_INIT(0)}; + +#ifdef __cplusplus +} +#endif diff -Nru matplotlib-0.99.3/CXX/Python2/cxx_extensions.cxx matplotlib-1.0.1/CXX/Python2/cxx_extensions.cxx --- matplotlib-0.99.3/CXX/Python2/cxx_extensions.cxx 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/CXX/Python2/cxx_extensions.cxx 2010-07-07 01:41:52.000000000 +0000 @@ -0,0 +1,1772 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// 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 disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED 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 REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY 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. +// +//----------------------------------------------------------------------------- +#include "CXX/Extensions.hxx" +#include "CXX/Exception.hxx" +#include + +#ifdef PYCXX_DEBUG +// +// Functions useful when debugging PyCXX +// +void bpt( void ) +{ +} + +void printRefCount( PyObject *obj ) +{ + std::cout << "RefCount of 0x" << std::hex << reinterpret_cast< unsigned int >( obj ) << std::dec << " is " << Py_REFCNT( obj ) << std::endl; +} +#endif + +namespace Py +{ +#ifdef PYCXX_PYTHON_2TO3 +std::string String::as_std_string( const char *encoding, const char *error ) const +{ + if( isUnicode() ) + { + Bytes encoded( encode( encoding, error ) ); + return encoded.as_std_string(); + } + else + { + return std::string( PyString_AsString( ptr() ), static_cast( PyString_Size( ptr() ) ) ); + } +} + +Bytes String::encode( const char *encoding, const char *error ) const +{ + if( isUnicode() ) + { + return Bytes( PyUnicode_AsEncodedString( ptr(), encoding, error ) ); + } + else + { + return Bytes( PyString_AsEncodedObject( ptr(), encoding, error ) ); + } +} + +#else +std::string String::as_std_string( const char *encoding, const char *error ) const +{ + if( isUnicode() ) + { + String encoded( encode( encoding, error ) ); + return encoded.as_std_string(); + } + else + { + return std::string( PyString_AsString( ptr() ), static_cast( PyString_Size( ptr() ) ) ); + } +} +#endif + +void Object::validate() +{ + // release pointer if not the right type + if( !accepts( p ) ) + { +#if defined( _CPPRTTI ) || defined( __GNUG__ ) + std::string s( "PyCXX: Error creating object of type " ); + s += (typeid( *this )).name(); + + if( p != NULL ) + { + String from_repr = repr(); + s += " from "; + s += from_repr.as_std_string( "utf-8" ); + } + else + { + s += " from (nil)"; + } +#endif + release(); + if( PyErr_Occurred() ) + { // Error message already set + throw Exception(); + } + // Better error message if RTTI available +#if defined( _CPPRTTI ) || defined( __GNUG__ ) + throw TypeError( s ); +#else + throw TypeError( "PyCXX: type error." ); +#endif + } +} + +//================================================================================ +// +// Implementation of MethodTable +// +//================================================================================ +PyMethodDef MethodTable::method( const char *method_name, PyCFunction f, int flags, const char *doc ) +{ + PyMethodDef m; + m.ml_name = const_cast( method_name ); + m.ml_meth = f; + m.ml_flags = flags; + m.ml_doc = const_cast( doc ); + return m; +} + +MethodTable::MethodTable() +{ + t.push_back( method( 0, 0, 0, 0 ) ); + mt = NULL; +} + +MethodTable::~MethodTable() +{ + delete [] mt; +} + +void MethodTable::add( const char *method_name, PyCFunction f, const char *doc, int flag ) +{ + if( !mt ) + { + t.insert( t.end()-1, method( method_name, f, flag, doc ) ); + } + else + { + throw RuntimeError( "Too late to add a module method!" ); + } +} + +PyMethodDef *MethodTable::table() +{ + if( !mt ) + { + Py_ssize_t t1size = t.size(); + mt = new PyMethodDef[ t1size ]; + int j = 0; + for( std::vector::iterator i = t.begin(); i != t.end(); i++ ) + { + mt[ j++ ] = *i; + } + } + return mt; +} + +//================================================================================ +// +// Implementation of ExtensionModule +// +//================================================================================ +ExtensionModuleBase::ExtensionModuleBase( const char *name ) +: m_module_name( name ) +, m_full_module_name( __Py_PackageContext() != NULL ? std::string( __Py_PackageContext() ) : m_module_name ) +, m_method_table() +{} + +ExtensionModuleBase::~ExtensionModuleBase() +{} + +const std::string &ExtensionModuleBase::name() const +{ + return m_module_name; +} + +const std::string &ExtensionModuleBase::fullName() const +{ + return m_full_module_name; +} + +class ExtensionModuleBasePtr : public PythonExtension +{ +public: + ExtensionModuleBasePtr( ExtensionModuleBase *_module ) + : module( _module ) + {} + + virtual ~ExtensionModuleBasePtr() + {} + + ExtensionModuleBase *module; +}; + +void ExtensionModuleBase::initialize( const char *module_doc ) +{ + PyObject *module_ptr = new ExtensionModuleBasePtr( this ); + Py_InitModule4 + ( + const_cast( m_module_name.c_str() ), // name + m_method_table.table(), // methods + const_cast( module_doc ), // docs + module_ptr, // pass to functions as "self" + PYTHON_API_VERSION // API version + ); +} + +Py::Module ExtensionModuleBase::module( void ) const +{ + return Module( m_full_module_name ); +} + +Py::Dict ExtensionModuleBase::moduleDictionary( void ) const +{ + return module().getDict(); +} + +//================================================================================ +// +// Implementation of PythonType +// +//================================================================================ +extern "C" +{ + static void standard_dealloc( PyObject *p ); + // + // All the following functions redirect the call from Python + // onto the matching virtual function in PythonExtensionBase + // + static int print_handler( PyObject *, FILE *, int ); + static PyObject *getattr_handler( PyObject *, char * ); + static int setattr_handler( PyObject *, char *, PyObject * ); + static PyObject *getattro_handler( PyObject *, PyObject * ); + static int setattro_handler( PyObject *, PyObject *, PyObject * ); + static int compare_handler( PyObject *, PyObject * ); + static PyObject *rich_compare_handler( PyObject *, PyObject *, int ); + static PyObject *repr_handler( PyObject * ); + static PyObject *str_handler( PyObject * ); + static long hash_handler( PyObject * ); + static PyObject *call_handler( PyObject *, PyObject *, PyObject * ); + static PyObject *iter_handler( PyObject * ); + static PyObject *iternext_handler( PyObject * ); + + // Sequence methods + static Py_ssize_t sequence_length_handler( PyObject * ); + static PyObject *sequence_concat_handler( PyObject *,PyObject * ); + static PyObject *sequence_repeat_handler( PyObject *, Py_ssize_t ); + static PyObject *sequence_item_handler( PyObject *, Py_ssize_t ); + static PyObject *sequence_slice_handler( PyObject *, Py_ssize_t, Py_ssize_t ); + static int sequence_ass_item_handler( PyObject *, Py_ssize_t, PyObject * ); + static int sequence_ass_slice_handler( PyObject *, Py_ssize_t, Py_ssize_t, PyObject * ); + + // Mapping + static Py_ssize_t mapping_length_handler( PyObject * ); + static PyObject *mapping_subscript_handler( PyObject *, PyObject * ); + static int mapping_ass_subscript_handler( PyObject *, PyObject *, PyObject * ); + + // Numeric methods + static int number_nonzero_handler( PyObject * ); + static PyObject *number_negative_handler( PyObject * ); + static PyObject *number_positive_handler( PyObject * ); + static PyObject *number_absolute_handler( PyObject * ); + static PyObject *number_invert_handler( PyObject * ); + static PyObject *number_int_handler( PyObject * ); + static PyObject *number_float_handler( PyObject * ); +#if !defined( PY3 ) + static PyObject *number_long_handler( PyObject * ); +#endif + static PyObject *number_oct_handler( PyObject * ); + static PyObject *number_hex_handler( PyObject * ); + static PyObject *number_add_handler( PyObject *, PyObject * ); + static PyObject *number_subtract_handler( PyObject *, PyObject * ); + static PyObject *number_multiply_handler( PyObject *, PyObject * ); + static PyObject *number_divide_handler( PyObject *, PyObject * ); + static PyObject *number_remainder_handler( PyObject *, PyObject * ); + static PyObject *number_divmod_handler( PyObject *, PyObject * ); + static PyObject *number_lshift_handler( PyObject *, PyObject * ); + static PyObject *number_rshift_handler( PyObject *, PyObject * ); + static PyObject *number_and_handler( PyObject *, PyObject * ); + static PyObject *number_xor_handler( PyObject *, PyObject * ); + static PyObject *number_or_handler( PyObject *, PyObject * ); + static PyObject *number_power_handler( PyObject *, PyObject *, PyObject * ); + + // Buffer + static Py_ssize_t buffer_getreadbuffer_handler( PyObject *, Py_ssize_t, void ** ); + static Py_ssize_t buffer_getwritebuffer_handler( PyObject *, Py_ssize_t, void ** ); + static Py_ssize_t buffer_getsegcount_handler( PyObject *, Py_ssize_t * ); +} + +extern "C" void standard_dealloc( PyObject *p ) +{ + PyMem_DEL( p ); +} + +bool PythonType::readyType() +{ + return PyType_Ready( table ) >= 0; +} + +PythonType &PythonType::supportSequenceType() +{ + if( !sequence_table ) + { + sequence_table = new PySequenceMethods; + memset( sequence_table, 0, sizeof( PySequenceMethods ) ); // ensure new fields are 0 + table->tp_as_sequence = sequence_table; + sequence_table->sq_length = sequence_length_handler; + sequence_table->sq_concat = sequence_concat_handler; + sequence_table->sq_repeat = sequence_repeat_handler; + sequence_table->sq_item = sequence_item_handler; +#if !defined( PY3 ) + sequence_table->sq_slice = sequence_slice_handler; +#endif + sequence_table->sq_ass_item = sequence_ass_item_handler; // BAS setup seperately? +#if !defined( PY3 ) + sequence_table->sq_ass_slice = sequence_ass_slice_handler; // BAS setup seperately? +#endif + } + return *this; +} + +PythonType &PythonType::supportMappingType() +{ + if( !mapping_table ) + { + mapping_table = new PyMappingMethods; + memset( mapping_table, 0, sizeof( PyMappingMethods ) ); // ensure new fields are 0 + table->tp_as_mapping = mapping_table; + mapping_table->mp_length = mapping_length_handler; + mapping_table->mp_subscript = mapping_subscript_handler; + mapping_table->mp_ass_subscript = mapping_ass_subscript_handler; // BAS setup seperately? + } + return *this; +} + +PythonType &PythonType::supportNumberType() +{ + if( !number_table ) + { + number_table = new PyNumberMethods; + memset( number_table, 0, sizeof( PyNumberMethods ) ); // ensure new fields are 0 + table->tp_as_number = number_table; + number_table->nb_add = number_add_handler; + number_table->nb_subtract = number_subtract_handler; + number_table->nb_multiply = number_multiply_handler; +#if !defined( PY3 ) + number_table->nb_divide = number_divide_handler; +#endif + number_table->nb_remainder = number_remainder_handler; + number_table->nb_divmod = number_divmod_handler; + number_table->nb_power = number_power_handler; + number_table->nb_negative = number_negative_handler; + number_table->nb_positive = number_positive_handler; + number_table->nb_absolute = number_absolute_handler; +#if !defined( PY3 ) + number_table->nb_nonzero = number_nonzero_handler; +#endif + number_table->nb_invert = number_invert_handler; + number_table->nb_lshift = number_lshift_handler; + number_table->nb_rshift = number_rshift_handler; + number_table->nb_and = number_and_handler; + number_table->nb_xor = number_xor_handler; + number_table->nb_or = number_or_handler; +#if !defined( PY3 ) + number_table->nb_coerce = 0; +#endif + number_table->nb_int = number_int_handler; +#if !defined( PY3 ) + number_table->nb_long = number_long_handler; +#endif + number_table->nb_float = number_float_handler; +#if !defined( PY3 ) + number_table->nb_oct = number_oct_handler; + number_table->nb_hex = number_hex_handler; +#endif + } + return *this; +} + +PythonType &PythonType::supportBufferType() +{ + if( !buffer_table ) + { + buffer_table = new PyBufferProcs; + memset( buffer_table, 0, sizeof( PyBufferProcs ) ); // ensure new fields are 0 + table->tp_as_buffer = buffer_table; +#if !defined( PY3 ) + buffer_table->bf_getreadbuffer = buffer_getreadbuffer_handler; + buffer_table->bf_getwritebuffer = buffer_getwritebuffer_handler; + buffer_table->bf_getsegcount = buffer_getsegcount_handler; +#endif + } + return *this; +} + +// if you define one sequence method you must define +// all of them except the assigns + +PythonType::PythonType( size_t basic_size, int itemsize, const char *default_name ) +: table( new PyTypeObject ) +, sequence_table( NULL ) +, mapping_table( NULL ) +, number_table( NULL ) +, buffer_table( NULL ) +{ + // PyTypeObject is defined in /Include/object.h + + memset( table, 0, sizeof( PyTypeObject ) ); // ensure new fields are 0 + *reinterpret_cast( table ) = py_object_initializer; +#if !defined( PY3 ) + table->ob_type = _Type_Type(); + table->ob_size = 0; +#endif + table->tp_name = const_cast( default_name ); + table->tp_basicsize = basic_size; + table->tp_itemsize = itemsize; + + // Methods to implement standard operations + table->tp_dealloc = (destructor)standard_dealloc; + table->tp_print = 0; + table->tp_getattr = 0; + table->tp_setattr = 0; + table->tp_compare = 0; + table->tp_repr = 0; + + // Method suites for standard classes + table->tp_as_number = 0; + table->tp_as_sequence = 0; + table->tp_as_mapping = 0; + + // More standard operations (here for binary compatibility) + table->tp_hash = 0; + table->tp_call = 0; + table->tp_str = 0; + table->tp_getattro = 0; + table->tp_setattro = 0; + + // Functions to access object as input/output buffer + table->tp_as_buffer = 0; + + // Flags to define presence of optional/expanded features + table->tp_flags = Py_TPFLAGS_DEFAULT; + + // Documentation string + table->tp_doc = 0; + +#if PY_MAJOR_VERSION > 2 || (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION >= 0) + table->tp_traverse = 0L; + + // delete references to contained objects + table->tp_clear = 0L; +#else + table->tp_xxx5 = 0L; + table->tp_xxx6 = 0L; +#endif +#if PY_MAJOR_VERSION > 2 || (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION >= 1) + // first defined in 2.1 + table->tp_richcompare = 0L; + // weak reference enabler + table->tp_weaklistoffset = 0L; +#else + table->tp_xxx7 = 0L; + table->tp_xxx8 = 0L; +#endif +#if PY_MAJOR_VERSION > 2 || (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION >= 2) + // first defined in 2.3 + // Iterators + table->tp_iter = 0L; + table->tp_iternext = 0L; +#endif +#ifdef COUNT_ALLOCS + table->tp_alloc = 0; + table->tp_free = 0; + table->tp_maxalloc = 0; + table->tp_next = 0; +#endif +} + +PythonType::~PythonType() +{ + delete table; + delete sequence_table; + delete mapping_table; + delete number_table; + delete buffer_table; +} + +PyTypeObject *PythonType::type_object() const +{ + return table; +} + +PythonType &PythonType::name( const char *nam ) +{ + table->tp_name = const_cast( nam ); + return *this; +} + +const char *PythonType::getName() const +{ + return table->tp_name; +} + +PythonType &PythonType::doc( const char *d ) +{ + table->tp_doc = const_cast( d ); + return *this; +} + +const char *PythonType::getDoc() const +{ + return table->tp_doc; +} + +PythonType &PythonType::set_tp_dealloc( void (*tp_dealloc)( PyObject *self ) ) +{ + table->tp_dealloc = tp_dealloc; + return *this; +} + +PythonType &PythonType::set_tp_init( int (*tp_init)( PyObject *self, PyObject *args, PyObject *kwds ) ) +{ + table->tp_init = tp_init; + return *this; +} + +PythonType &PythonType::set_tp_new( PyObject *(*tp_new)( PyTypeObject *subtype, PyObject *args, PyObject *kwds ) ) +{ + table->tp_new = tp_new; + return *this; +} + +PythonType &PythonType::set_methods( PyMethodDef *methods ) +{ + table->tp_methods = methods; + return *this; +} + +PythonType &PythonType::supportClass() +{ + table->tp_flags |= Py_TPFLAGS_BASETYPE; + return *this; +} + +PythonType &PythonType::dealloc( void( *f )( PyObject * )) +{ + table->tp_dealloc = f; + return *this; +} + +PythonType &PythonType::supportPrint() +{ + table->tp_print = print_handler; + return *this; +} + +PythonType &PythonType::supportGetattr() +{ + table->tp_getattr = getattr_handler; + return *this; +} + +PythonType &PythonType::supportSetattr() +{ + table->tp_setattr = setattr_handler; + return *this; +} + +PythonType &PythonType::supportGetattro() +{ + table->tp_getattro = getattro_handler; + return *this; +} + +PythonType &PythonType::supportSetattro() +{ + table->tp_setattro = setattro_handler; + return *this; +} + +PythonType &PythonType::supportCompare() +{ + table->tp_compare = compare_handler; + return *this; +} + +#if PY_MAJOR_VERSION > 2 || (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION >= 1) +PythonType &PythonType::supportRichCompare() +{ + table->tp_richcompare = rich_compare_handler; + return *this; +} +#endif + +PythonType &PythonType::supportRepr() +{ + table->tp_repr = repr_handler; + return *this; +} + +PythonType &PythonType::supportStr() +{ + table->tp_str = str_handler; + return *this; +} + +PythonType &PythonType::supportHash() +{ + table->tp_hash = hash_handler; + return *this; +} + +PythonType &PythonType::supportCall() +{ + table->tp_call = call_handler; + return *this; +} + +PythonType &PythonType::supportIter() +{ + table->tp_iter = iter_handler; + table->tp_iternext = iternext_handler; + return *this; +} + +//-------------------------------------------------------------------------------- +// +// Handlers +// +//-------------------------------------------------------------------------------- +PythonExtensionBase *getPythonExtensionBase( PyObject *self ) +{ + if( self->ob_type->tp_flags&Py_TPFLAGS_BASETYPE ) + { + PythonClassInstance *instance = reinterpret_cast( self ); + return instance->m_pycxx_object; + } + else + { + return static_cast( self ); + } +} + + +extern "C" int print_handler( PyObject *self, FILE *fp, int flags ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return p->print( fp, flags ); + } + catch( Py::Exception &) + { + return -1; // indicate error + } +} + +extern "C" PyObject *getattr_handler( PyObject *self, char *name ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->getattr( name ) ); + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} + +extern "C" int setattr_handler( PyObject *self, char *name, PyObject *value ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return p->setattr( name, Py::Object( value ) ); + } + catch( Py::Exception &) + { + return -1; // indicate error + } +} + +extern "C" PyObject *getattro_handler( PyObject *self, PyObject *name ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->getattro( Py::String( name ) ) ); + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} + +extern "C" int setattro_handler( PyObject *self, PyObject *name, PyObject *value ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return p->setattro( Py::String( name ), Py::Object( value ) ); + } + catch( Py::Exception &) + { + return -1; // indicate error + } +} + +extern "C" int compare_handler( PyObject *self, PyObject *other ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return p->compare( Py::Object( other ) ); + } + catch( Py::Exception &) + { + return -1; // indicate error + } +} + +#if PY_MAJOR_VERSION > 2 || (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION >= 1) +extern "C" PyObject *rich_compare_handler( PyObject *self, PyObject *other, int op ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->rich_compare( Py::Object( other ), op ) ); + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} +#endif + +extern "C" PyObject *repr_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->repr() ); + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *str_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->str() ); + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} + +extern "C" long hash_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return p->hash(); + } + catch( Py::Exception &) + { + return -1; // indicate error + } +} + +extern "C" PyObject *call_handler( PyObject *self, PyObject *args, PyObject *kw ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + if( kw != NULL ) + return new_reference_to( p->call( Py::Object( args ), Py::Object( kw ) ) ); + else + return new_reference_to( p->call( Py::Object( args ), Py::Object() ) ); + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *iter_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->iter() ); + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *iternext_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return p->iternext(); // might be a NULL ptr on end of iteration + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} + +// Sequence methods +extern "C" Py_ssize_t sequence_length_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return p->sequence_length(); + } + catch( Py::Exception &) + { + return -1; // indicate error + } +} + +extern "C" PyObject *sequence_concat_handler( PyObject *self, PyObject *other ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->sequence_concat( Py::Object( other ) ) ); + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *sequence_repeat_handler( PyObject *self, Py_ssize_t count ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->sequence_repeat( count ) ); + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *sequence_item_handler( PyObject *self, Py_ssize_t index ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->sequence_item( index ) ); + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *sequence_slice_handler( PyObject *self, Py_ssize_t first, Py_ssize_t last ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->sequence_slice( first, last ) ); + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} + +extern "C" int sequence_ass_item_handler( PyObject *self, Py_ssize_t index, PyObject *value ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return p->sequence_ass_item( index, Py::Object( value ) ); + } + catch( Py::Exception &) + { + return -1; // indicate error + } +} + +extern "C" int sequence_ass_slice_handler( PyObject *self, Py_ssize_t first, Py_ssize_t last, PyObject *value ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return p->sequence_ass_slice( first, last, Py::Object( value ) ); + } + catch( Py::Exception &) + { + return -1; // indicate error + } +} + +// Mapping +extern "C" Py_ssize_t mapping_length_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return p->mapping_length(); + } + catch( Py::Exception &) + { + return -1; // indicate error + } +} + +extern "C" PyObject *mapping_subscript_handler( PyObject *self, PyObject *key ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->mapping_subscript( Py::Object( key ) ) ); + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} + +extern "C" int mapping_ass_subscript_handler( PyObject *self, PyObject *key, PyObject *value ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return p->mapping_ass_subscript( Py::Object( key ), Py::Object( value ) ); + } + catch( Py::Exception &) + { + return -1; // indicate error + } +} + +// Number +extern "C" int number_nonzero_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return p->number_nonzero(); + } + catch( Py::Exception &) + { + return -1; // indicate error + } +} + +extern "C" PyObject *number_negative_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_negative() ); + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_positive_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_positive() ); + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_absolute_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_absolute() ); + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_invert_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_invert() ); + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_int_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_int() ); + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_float_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_float() ); + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_long_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_long() ); + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_oct_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_oct() ); + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_hex_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_hex() ); + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_add_handler( PyObject *self, PyObject *other ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_add( Py::Object( other ) ) ); + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_subtract_handler( PyObject *self, PyObject *other ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_subtract( Py::Object( other ) ) ); + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_multiply_handler( PyObject *self, PyObject *other ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_multiply( Py::Object( other ) ) ); + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_divide_handler( PyObject *self, PyObject *other ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_divide( Py::Object( other ) ) ); + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_remainder_handler( PyObject *self, PyObject *other ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_remainder( Py::Object( other ) ) ); + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_divmod_handler( PyObject *self, PyObject *other ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_divmod( Py::Object( other ) ) ); + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_lshift_handler( PyObject *self, PyObject *other ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_lshift( Py::Object( other ) ) ); + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_rshift_handler( PyObject *self, PyObject *other ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_rshift( Py::Object( other ) ) ); + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_and_handler( PyObject *self, PyObject *other ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_and( Py::Object( other ) ) ); + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_xor_handler( PyObject *self, PyObject *other ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_xor( Py::Object( other ) ) ); + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_or_handler( PyObject *self, PyObject *other ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_or( Py::Object( other ) ) ); + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_power_handler( PyObject *self, PyObject *x1, PyObject *x2 ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_power( Py::Object( x1 ), Py::Object( x2 ) ) ); + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} + +// Buffer +extern "C" Py_ssize_t buffer_getreadbuffer_handler( PyObject *self, Py_ssize_t index, void **pp ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return p->buffer_getreadbuffer( index, pp ); + } + catch( Py::Exception &) + { + return -1; // indicate error + } +} + +extern "C" Py_ssize_t buffer_getwritebuffer_handler( PyObject *self, Py_ssize_t index, void **pp ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return p->buffer_getwritebuffer( index, pp ); + } + catch( Py::Exception &) + { + return -1; // indicate error + } +} + +extern "C" Py_ssize_t buffer_getsegcount_handler( PyObject *self, Py_ssize_t *count ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return p->buffer_getsegcount( count ); + } + catch( Py::Exception &) + { + return -1; // indicate error + } +} + +//================================================================================ +// +// Implementation of PythonExtensionBase +// +//================================================================================ +#define missing_method( method ) \ + throw RuntimeError( "Extension object missing implement of " #method ); + +PythonExtensionBase::PythonExtensionBase() +{ + ob_refcnt = 0; +} + +PythonExtensionBase::~PythonExtensionBase() +{ + assert( ob_refcnt == 0 ); +} + +void PythonExtensionBase::reinit( Tuple &args, Dict &kwds ) +{ + throw RuntimeError( "Must not call __init__ twice on this class" ); +} + +Py::Object PythonExtensionBase::genericGetAttro( const Py::String &name ) +{ + return asObject( PyObject_GenericGetAttr( selfPtr(), name.ptr() ) ); +} + +int PythonExtensionBase::genericSetAttro( const Py::String &name, const Py::Object &value ) +{ + return PyObject_GenericSetAttr( selfPtr(), name.ptr(), value.ptr() ); +} + +int PythonExtensionBase::print( FILE *, int ) +{ + missing_method( print ); + return -1; +} + +Py::Object PythonExtensionBase::getattr( const char * ) +{ + missing_method( getattr ); + return Py::None(); +} + +int PythonExtensionBase::setattr( const char *, const Py::Object &) +{ + missing_method( setattr ); + return -1; +} + +Py::Object PythonExtensionBase::getattro( const Py::String &) +{ + missing_method( getattro ); + return Py::None(); +} + +int PythonExtensionBase::setattro( const Py::String &, const Py::Object &) +{ + missing_method( setattro ); + return -1; +} + +int PythonExtensionBase::compare( const Py::Object &) +{ + missing_method( compare ); + return -1; +} + +#if PY_MAJOR_VERSION > 2 || (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION >= 1) +Py::Object PythonExtensionBase::rich_compare( const Py::Object &, int op ) +{ + missing_method( rich_compare ); + return Py::None(); +} + +#endif +Py::Object PythonExtensionBase::repr() +{ + missing_method( repr ); + return Py::None(); +} + +Py::Object PythonExtensionBase::str() +{ + missing_method( str ); + return Py::None(); +} + +long PythonExtensionBase::hash() +{ + missing_method( hash ); + return -1; +} + +Py::Object PythonExtensionBase::call( const Py::Object &, const Py::Object &) +{ + missing_method( call ); + return Py::None(); +} + +Py::Object PythonExtensionBase::iter() +{ + missing_method( iter ); + return Py::None(); +} + +PyObject *PythonExtensionBase::iternext() +{ + missing_method( iternext ); + return NULL; +} + +// Sequence methods +int PythonExtensionBase::sequence_length() +{ + missing_method( sequence_length ); + return -1; +} + +Py::Object PythonExtensionBase::sequence_concat( const Py::Object &) +{ + missing_method( sequence_concat ); + return Py::None(); +} + +Py::Object PythonExtensionBase::sequence_repeat( Py_ssize_t ) +{ + missing_method( sequence_repeat ); + return Py::None(); +} + +Py::Object PythonExtensionBase::sequence_item( Py_ssize_t ) +{ + missing_method( sequence_item ); + return Py::None(); +} + +Py::Object PythonExtensionBase::sequence_slice( Py_ssize_t, Py_ssize_t ) +{ + missing_method( sequence_slice ); + return Py::None(); +} + +int PythonExtensionBase::sequence_ass_item( Py_ssize_t, const Py::Object &) +{ + missing_method( sequence_ass_item ); + return -1; +} + +int PythonExtensionBase::sequence_ass_slice( Py_ssize_t, Py_ssize_t, const Py::Object &) +{ + missing_method( sequence_ass_slice ); + return -1; +} + +// Mapping +int PythonExtensionBase::mapping_length() +{ + missing_method( mapping_length ); + return -1; +} + +Py::Object PythonExtensionBase::mapping_subscript( const Py::Object &) +{ + missing_method( mapping_subscript ); + return Py::None(); +} + +int PythonExtensionBase::mapping_ass_subscript( const Py::Object &, const Py::Object &) +{ + missing_method( mapping_ass_subscript ); + return -1; +} + +// Number +int PythonExtensionBase::number_nonzero() +{ + missing_method( number_nonzero ); + return -1; +} + +Py::Object PythonExtensionBase::number_negative() +{ + missing_method( number_negative ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_positive() +{ + missing_method( number_positive ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_absolute() +{ + missing_method( number_absolute ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_invert() +{ + missing_method( number_invert ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_int() +{ + missing_method( number_int ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_float() +{ + missing_method( number_float ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_long() +{ + missing_method( number_long ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_oct() +{ + missing_method( number_oct ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_hex() +{ + missing_method( number_hex ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_add( const Py::Object &) +{ + missing_method( number_add ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_subtract( const Py::Object &) +{ + missing_method( number_subtract ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_multiply( const Py::Object &) +{ + missing_method( number_multiply ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_divide( const Py::Object &) +{ + missing_method( number_divide ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_remainder( const Py::Object &) +{ + missing_method( number_remainder ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_divmod( const Py::Object &) +{ + missing_method( number_divmod ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_lshift( const Py::Object &) +{ + missing_method( number_lshift ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_rshift( const Py::Object &) +{ + missing_method( number_rshift ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_and( const Py::Object &) +{ + missing_method( number_and ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_xor( const Py::Object &) +{ + missing_method( number_xor ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_or( const Py::Object &) +{ + missing_method( number_or ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_power( const Py::Object &, const Py::Object &) +{ + missing_method( number_power ); + return Py::None(); +} + +// Buffer +Py_ssize_t PythonExtensionBase::buffer_getreadbuffer( Py_ssize_t, void** ) +{ + missing_method( buffer_getreadbuffer ); + return -1; +} + +Py_ssize_t PythonExtensionBase::buffer_getwritebuffer( Py_ssize_t, void** ) +{ + missing_method( buffer_getwritebuffer ); + return -1; +} + +Py_ssize_t PythonExtensionBase::buffer_getsegcount( Py_ssize_t* ) +{ + missing_method( buffer_getsegcount ); + return -1; +} + +//-------------------------------------------------------------------------------- +// +// Method call handlers for +// PythonExtensionBase +// ExtensionModuleBase +// +//-------------------------------------------------------------------------------- +extern "C" PyObject *method_keyword_call_handler( PyObject *_self_and_name_tuple, PyObject *_args, PyObject *_keywords ) +{ + try + { + Tuple self_and_name_tuple( _self_and_name_tuple ); + + PyObject *self_in_cobject = self_and_name_tuple[0].ptr(); + void *self_as_void = PyCObject_AsVoidPtr( self_in_cobject ); + if( self_as_void == NULL ) + return NULL; + + ExtensionModuleBase *self = static_cast( self_as_void ); + + Tuple args( _args ); + + if( _keywords == NULL ) + { + Dict keywords; // pass an empty dict + + Object result + ( + self->invoke_method_keyword + ( + PyCObject_AsVoidPtr( self_and_name_tuple[1].ptr() ), + args, + keywords + ) + ); + + return new_reference_to( result.ptr() ); + } + else + { + Dict keywords( _keywords ); // make dict + + Object result + ( + self->invoke_method_keyword + ( + PyCObject_AsVoidPtr( self_and_name_tuple[1].ptr() ), + args, + keywords + ) + ); + + return new_reference_to( result.ptr() ); + } + } + catch( Exception & ) + { + return 0; + } +} + +extern "C" PyObject *method_varargs_call_handler( PyObject *_self_and_name_tuple, PyObject *_args ) +{ + try + { + Tuple self_and_name_tuple( _self_and_name_tuple ); + + PyObject *self_in_cobject = self_and_name_tuple[0].ptr(); + void *self_as_void = PyCObject_AsVoidPtr( self_in_cobject ); + if( self_as_void == NULL ) + return NULL; + + ExtensionModuleBase *self = static_cast( self_as_void ); + Tuple args( _args ); + + Object result + ( + self->invoke_method_varargs + ( + PyCObject_AsVoidPtr( self_and_name_tuple[1].ptr() ), + args + ) + ); + + return new_reference_to( result.ptr() ); + } + catch( Exception & ) + { + return 0; + } +} + +extern "C" void do_not_dealloc( void * ) +{} + +//-------------------------------------------------------------------------------- +// +// ExtensionExceptionType +// +//-------------------------------------------------------------------------------- +ExtensionExceptionType::ExtensionExceptionType() +: Py::Object() +{ +} + +void ExtensionExceptionType::init( ExtensionModuleBase &module, const std::string& name ) +{ + std::string module_name( module.fullName() ); + module_name += "."; + module_name += name; + set( PyErr_NewException( const_cast( module_name.c_str() ), NULL, NULL ), true ); +} + +void ExtensionExceptionType::init( ExtensionModuleBase &module, const std::string& name, ExtensionExceptionType &parent) +{ + std::string module_name( module.fullName() ); + module_name += "."; + module_name += name; + set( PyErr_NewException( const_cast( module_name.c_str() ), parent.ptr(), NULL ), true ); +} + +ExtensionExceptionType::~ExtensionExceptionType() +{ +} + +Exception::Exception( ExtensionExceptionType &exception, const std::string& reason ) +{ + PyErr_SetString( exception.ptr(), reason.c_str() ); +} + +Exception::Exception( ExtensionExceptionType &exception, Object &reason ) +{ + PyErr_SetObject( exception.ptr(), reason.ptr() ); +} + +Exception::Exception( PyObject *exception, Object &reason ) +{ + PyErr_SetObject( exception, reason.ptr() ); +} + +} // end of namespace Py diff -Nru matplotlib-0.99.3/CXX/Python2/cxxsupport.cxx matplotlib-1.0.1/CXX/Python2/cxxsupport.cxx --- matplotlib-0.99.3/CXX/Python2/cxxsupport.cxx 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/CXX/Python2/cxxsupport.cxx 2010-07-07 01:41:52.000000000 +0000 @@ -0,0 +1,174 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// 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 disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED 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 REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY 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. +// +//----------------------------------------------------------------------------- + +#include "CXX/Objects.hxx" +namespace Py { + +Py_UNICODE unicode_null_string[1] = { 0 }; + +Type Object::type () const +{ + return Type (PyObject_Type (p), true); +} + +String Object::str () const +{ + return String (PyObject_Str (p), true); +} + +String Object::repr () const +{ + return String (PyObject_Repr (p), true); +} + +std::string Object::as_string() const +{ + return static_cast(str()); +} + +List Object::dir () const + { + return List (PyObject_Dir (p), true); + } + +bool Object::isType (const Type& t) const +{ + return type ().ptr() == t.ptr(); +} + +Char::operator String() const +{ + return String(ptr()); +} + +// TMM: non-member operaters for iterators - see above +// I've also made a bug fix in respect to the cxx code +// (dereffed the left.seq and right.seq comparison) +bool operator==(const Sequence::iterator& left, const Sequence::iterator& right) +{ + return left.eql( right ); +} + +bool operator!=(const Sequence::iterator& left, const Sequence::iterator& right) +{ + return left.neq( right ); +} + +bool operator< (const Sequence::iterator& left, const Sequence::iterator& right) +{ + return left.lss( right ); +} + +bool operator> (const Sequence::iterator& left, const Sequence::iterator& right) +{ + return left.gtr( right ); +} + +bool operator<=(const Sequence::iterator& left, const Sequence::iterator& right) +{ + return left.leq( right ); +} + +bool operator>=(const Sequence::iterator& left, const Sequence::iterator& right) +{ + return left.geq( right ); +} + +// now for const_iterator +bool operator==(const Sequence::const_iterator& left, const Sequence::const_iterator& right) +{ + return left.eql( right ); +} + +bool operator!=(const Sequence::const_iterator& left, const Sequence::const_iterator& right) +{ + return left.neq( right ); +} + +bool operator< (const Sequence::const_iterator& left, const Sequence::const_iterator& right) +{ + return left.lss( right ); +} + +bool operator> (const Sequence::const_iterator& left, const Sequence::const_iterator& right) +{ + return left.gtr( right ); +} + +bool operator<=(const Sequence::const_iterator& left, const Sequence::const_iterator& right) +{ + return left.leq( right ); +} + +bool operator>=(const Sequence::const_iterator& left, const Sequence::const_iterator& right) +{ + return left.geq( right ); +} + +// For mappings: +bool operator==(const Mapping::iterator& left, const Mapping::iterator& right) +{ + return left.eql( right ); +} + +bool operator!=(const Mapping::iterator& left, const Mapping::iterator& right) +{ + return left.neq( right ); +} + +// now for const_iterator +bool operator==(const Mapping::const_iterator& left, const Mapping::const_iterator& right) +{ + return left.eql( right ); +} + +bool operator!=(const Mapping::const_iterator& left, const Mapping::const_iterator& right) +{ + return left.neq( right ); +} + +// TMM: 31May'01 - Added the #ifndef so I can exclude iostreams. +#ifndef CXX_NO_IOSTREAMS +// output + +std::ostream& operator<< (std::ostream& os, const Object& ob) +{ + return (os << static_cast(ob.str())); +} +#endif + +} // Py diff -Nru matplotlib-0.99.3/CXX/Python2/Exception.hxx matplotlib-1.0.1/CXX/Python2/Exception.hxx --- matplotlib-0.99.3/CXX/Python2/Exception.hxx 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/CXX/Python2/Exception.hxx 2010-07-07 01:41:52.000000000 +0000 @@ -0,0 +1,249 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// 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 disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED 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 REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY 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. +// +//----------------------------------------------------------------------------- + +#ifndef __CXX_Exception_h +#define __CXX_Exception_h + +#include "CXX/WrapPython.h" +#include "CXX/Version.hxx" +#include "CXX/Config.hxx" +#include "CXX/IndirectPythonInterface.hxx" + +#include +#include + +// This mimics the Python structure, in order to minimize confusion +namespace Py +{ + class ExtensionExceptionType; + + class Object; + + class Exception + { + public: + Exception( ExtensionExceptionType &exception, const std::string& reason ); + Exception( ExtensionExceptionType &exception, Object &reason ); + + explicit Exception () + {} + + Exception (const std::string& reason) + { + PyErr_SetString (Py::_Exc_RuntimeError(), reason.c_str()); + } + + Exception (PyObject* exception, const std::string& reason) + { + PyErr_SetString (exception, reason.c_str()); + } + + Exception (PyObject* exception, Object &reason); + + void clear() // clear the error + // technically but not philosophically const + { + PyErr_Clear(); + } + }; + + + // Abstract + class StandardError: public Exception + { + protected: + explicit StandardError() + {} + }; + + class LookupError: public StandardError + { + protected: + explicit LookupError() + {} + }; + + class ArithmeticError: public StandardError + { + protected: + explicit ArithmeticError() + {} + }; + + class EnvironmentError: public StandardError + { + protected: + explicit EnvironmentError() + {} + }; + + // Concrete + + class TypeError: public StandardError + { + public: + TypeError (const std::string& reason) + : StandardError() + { + PyErr_SetString (Py::_Exc_TypeError(),reason.c_str()); + } + }; + + class IndexError: public LookupError + { + public: + IndexError (const std::string& reason) + : LookupError() + { + PyErr_SetString (Py::_Exc_IndexError(), reason.c_str()); + } + }; + + class AttributeError: public StandardError + { + public: + AttributeError (const std::string& reason) + : StandardError() + { + PyErr_SetString (Py::_Exc_AttributeError(), reason.c_str()); + } + }; + + class NameError: public StandardError + { + public: + NameError (const std::string& reason) + : StandardError() + { + PyErr_SetString (Py::_Exc_NameError(), reason.c_str()); + } + }; + + class RuntimeError: public StandardError + { + public: + RuntimeError (const std::string& reason) + : StandardError() + { + PyErr_SetString (Py::_Exc_RuntimeError(), reason.c_str()); + } + }; + + class SystemError: public StandardError + { + public: + SystemError (const std::string& reason) + : StandardError() + { + PyErr_SetString (Py::_Exc_SystemError(),reason.c_str()); + } + }; + + class KeyError: public LookupError + { + public: + KeyError (const std::string& reason) + : LookupError() + { + PyErr_SetString (Py::_Exc_KeyError(),reason.c_str()); + } + }; + + + class ValueError: public StandardError + { + public: + ValueError (const std::string& reason) + : StandardError() + { + PyErr_SetString (Py::_Exc_ValueError(), reason.c_str()); + } + }; + + class OverflowError: public ArithmeticError + { + public: + OverflowError (const std::string& reason) + : ArithmeticError() + { + PyErr_SetString (Py::_Exc_OverflowError(), reason.c_str()); + } + }; + + class ZeroDivisionError: public ArithmeticError + { + public: + ZeroDivisionError (const std::string& reason) + : ArithmeticError() + { + PyErr_SetString (Py::_Exc_ZeroDivisionError(), reason.c_str()); + } + }; + + class FloatingPointError: public ArithmeticError + { + public: + FloatingPointError (const std::string& reason) + : ArithmeticError() + { + PyErr_SetString (Py::_Exc_FloatingPointError(), reason.c_str()); + } + }; + + class MemoryError: public StandardError + { + public: + MemoryError (const std::string& reason) + : StandardError() + { + PyErr_SetString (Py::_Exc_MemoryError(), reason.c_str()); + } + }; + + class SystemExit: public StandardError + { + public: + SystemExit (const std::string& reason) + : StandardError() + { + PyErr_SetString (Py::_Exc_SystemExit(),reason.c_str()); + } + }; + +}// Py + +#endif diff -Nru matplotlib-0.99.3/CXX/Python2/ExtensionModule.hxx matplotlib-1.0.1/CXX/Python2/ExtensionModule.hxx --- matplotlib-0.99.3/CXX/Python2/ExtensionModule.hxx 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/CXX/Python2/ExtensionModule.hxx 2010-07-07 01:41:52.000000000 +0000 @@ -0,0 +1,208 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// 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 disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED 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 REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY 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. +// +//----------------------------------------------------------------------------- + +#ifndef __CXX_ExtensionModule__h +#define __CXX_ExtensionModule__h + +namespace Py +{ + class ExtensionModuleBase + { + public: + ExtensionModuleBase( const char *name ); + virtual ~ExtensionModuleBase(); + + Module module( void ) const; // only valid after initialize() has been called + Dict moduleDictionary( void ) const; // only valid after initialize() has been called + + virtual Object invoke_method_noargs( void *method_def ) = 0; + virtual Object invoke_method_keyword( void *method_def, const Tuple &_args, const Dict &_keywords ) = 0; + virtual Object invoke_method_varargs( void *method_def, const Tuple &_args ) = 0; + + const std::string &name() const; + const std::string &fullName() const; + + // what is returned from PyInit_ function + Object moduleObject( void ) const; + + protected: + // Initialize the module + void initialize( const char *module_doc ); + + const std::string m_module_name; + const std::string m_full_module_name; + MethodTable m_method_table; +#if PY3 + PyModuleDef m_module_def; +#endif + PyObject *m_module; + + private: + // + // prevent the compiler generating these unwanted functions + // + ExtensionModuleBase( const ExtensionModuleBase & ); //unimplemented + void operator=( const ExtensionModuleBase & ); //unimplemented + }; + + // Note: Python calls noargs as varargs buts args==NULL + extern "C" PyObject *method_noargs_call_handler( PyObject *_self_and_name_tuple, PyObject * ); + extern "C" PyObject *method_varargs_call_handler( PyObject *_self_and_name_tuple, PyObject *_args ); + extern "C" PyObject *method_keyword_call_handler( PyObject *_self_and_name_tuple, PyObject *_args, PyObject *_keywords ); + + extern "C" void do_not_dealloc( void * ); + + template + class ExtensionModule : public ExtensionModuleBase + { + public: + ExtensionModule( const char *name ) + : ExtensionModuleBase( name ) + {} + virtual ~ExtensionModule() + {} + + protected: + typedef Object (T::*method_noargs_function_t)(); + typedef Object (T::*method_varargs_function_t)( const Tuple &args ); + typedef Object (T::*method_keyword_function_t)( const Tuple &args, const Dict &kws ); + typedef std::map *> method_map_t; + + static void add_noargs_method( const char *name, method_noargs_function_t function, const char *doc="" ) + { + method_map_t &mm = methods(); + mm[ std::string( name ) ] = new MethodDefExt( name, function, method_noargs_call_handler, doc ); + } + + static void add_varargs_method( const char *name, method_varargs_function_t function, const char *doc="" ) + { + method_map_t &mm = methods(); + mm[ std::string( name ) ] = new MethodDefExt( name, function, method_varargs_call_handler, doc ); + } + + static void add_keyword_method( const char *name, method_keyword_function_t function, const char *doc="" ) + { + method_map_t &mm = methods(); + mm[ std::string( name ) ] = new MethodDefExt( name, function, method_keyword_call_handler, doc ); + } + + void initialize( const char *module_doc="" ) + { + ExtensionModuleBase::initialize( module_doc ); + Dict dict( moduleDictionary() ); + + // + // put each of the methods into the modules dictionary + // so that we get called back at the function in T. + // + method_map_t &mm = methods(); + EXPLICIT_TYPENAME method_map_t::const_iterator i = mm.begin(); + EXPLICIT_TYPENAME method_map_t::const_iterator i_end = mm.end(); + for ( ; i != i_end; ++i ) + { + MethodDefExt *method_def = (*i).second; + + static PyObject *self = PyCObject_FromVoidPtr( this, do_not_dealloc ); + + Tuple args( 2 ); + args[0] = Object( self ); + args[1] = Object( PyCObject_FromVoidPtr( method_def, do_not_dealloc ) ); + + PyObject *func = PyCFunction_New + ( + &method_def->ext_meth_def, + new_reference_to( args ) + ); + + method_def->py_method = Object( func, true ); + + dict[ (*i).first ] = method_def->py_method; + } + } + + protected: // Tom Malcolmson reports that derived classes need access to these + static method_map_t &methods( void ) + { + static method_map_t *map_of_methods = NULL; + if( map_of_methods == NULL ) + map_of_methods = new method_map_t; + + return *map_of_methods; + } + + // this invoke function must be called from within a try catch block + virtual Object invoke_method_noargs( void *method_def ) + { + // cast up to the derived class, method_def and call + T *self = static_cast( this ); + MethodDefExt *meth_def = reinterpret_cast *>( method_def ); + + return (self->*meth_def->ext_noargs_function)(); + } + + // this invoke function must be called from within a try catch block + virtual Object invoke_method_varargs( void *method_def, const Tuple &args ) + { + // cast up to the derived class, method_def and call + T *self = static_cast( this ); + MethodDefExt *meth_def = reinterpret_cast *>( method_def ); + + return (self->*meth_def->ext_varargs_function)( args ); + } + + // this invoke function must be called from within a try catch block + virtual Object invoke_method_keyword( void *method_def, const Tuple &args, const Dict &keywords ) + { + // cast up to the derived class, method_def and call + T *self = static_cast( this ); + MethodDefExt *meth_def = reinterpret_cast *>( method_def ); + + return (self->*meth_def->ext_keyword_function)( args, keywords ); + } + + private: + // + // prevent the compiler generating these unwanted functions + // + ExtensionModule( const ExtensionModule & ); //unimplemented + void operator=( const ExtensionModule & ); //unimplemented + }; +} // Namespace Py + + +// End of __CXX_ExtensionModule__h +#endif diff -Nru matplotlib-0.99.3/CXX/Python2/ExtensionOldType.hxx matplotlib-1.0.1/CXX/Python2/ExtensionOldType.hxx --- matplotlib-0.99.3/CXX/Python2/ExtensionOldType.hxx 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/CXX/Python2/ExtensionOldType.hxx 2010-12-13 15:27:29.000000000 +0000 @@ -0,0 +1,392 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// 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 disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED 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 REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY 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. +// +//----------------------------------------------------------------------------- + +#ifndef __CXX_ExtensionOldType__h +#define __CXX_ExtensionOldType__h + +namespace Py +{ + template class PythonExtension + : public PythonExtensionBase + { + public: + static PyTypeObject *type_object() + { + return behaviors().type_object(); + } + + static bool check( PyObject *p ) + { + // is p like me? + return p->ob_type == type_object(); + } + + static bool check( const Object &ob ) + { + return check( ob.ptr() ); + } + + // + // every object needs getattr implemented + // to support methods + // + virtual Object getattr( const char *name ) + { + return getattr_methods( name ); + } + + PyObject *selfPtr() + { + return this; + } + + protected: + explicit PythonExtension() + : PythonExtensionBase() + { + PyObject_Init( this, type_object() ); + + // every object must support getattr + behaviors().supportGetattr(); + } + + virtual ~PythonExtension() + {} + + static PythonType &behaviors() + { + static PythonType* p; + if( p == NULL ) + { +#if defined( _CPPRTTI ) || defined( __GNUG__ ) + const char *default_name =( typeid( T ) ).name(); +#else + const char *default_name = "unknown"; +#endif + p = new PythonType( sizeof( T ), 0, default_name ); + p->set_tp_dealloc( extension_object_deallocator ); + } + + return *p; + } + + typedef Object (T::*method_noargs_function_t)(); + typedef Object (T::*method_varargs_function_t)( const Tuple &args ); + typedef Object (T::*method_keyword_function_t)( const Tuple &args, const Dict &kws ); + typedef std::map *> method_map_t; + + // support the default attributes, __name__, __doc__ and methods + virtual Object getattr_default( const char *_name ) + { + std::string name( _name ); + + if( name == "__name__" && type_object()->tp_name != NULL ) + { + return Py::String( type_object()->tp_name ); + } + + if( name == "__doc__" && type_object()->tp_doc != NULL ) + { + return Py::String( type_object()->tp_doc ); + } + +// trying to fake out being a class for help() +// else if( name == "__bases__" ) +// { +// return Py::Tuple( 0 ); +// } +// else if( name == "__module__" ) +// { +// return Py::Nothing(); +// } +// else if( name == "__dict__" ) +// { +// return Py::Dict(); +// } + + return getattr_methods( _name ); + } + + // turn a name into function object + virtual Object getattr_methods( const char *_name ) + { + std::string name( _name ); + + method_map_t &mm = methods(); + + // see if name exists and get entry with method + EXPLICIT_TYPENAME method_map_t::const_iterator i = mm.find( name ); + if( i == mm.end() ) + { + if( name == "__methods__" ) + { + List methods; + + i = mm.begin(); + EXPLICIT_TYPENAME method_map_t::const_iterator i_end = mm.end(); + + for( ; i != i_end; ++i ) + methods.append( String( (*i).first ) ); + + return methods; + } + + throw AttributeError( name ); + } + + MethodDefExt *method_def = i->second; + + Tuple self( 2 ); + + self[0] = Object( this ); + self[1] = Object( PyCObject_FromVoidPtr( method_def, do_not_dealloc ), true ); + + PyObject *func = PyCFunction_New( &method_def->ext_meth_def, self.ptr() ); + + return Object(func, true); + } + + // check that all methods added are unique + static void check_unique_method_name( const char *name ) + { + method_map_t &mm = methods(); + EXPLICIT_TYPENAME method_map_t::const_iterator i; + i = mm.find( name ); + if( i != mm.end() ) + throw AttributeError( name ); + } + + static void add_noargs_method( const char *name, method_noargs_function_t function, const char *doc="" ) + { + check_unique_method_name( name ); + method_map_t &mm = methods(); + mm[ std::string( name ) ] = new MethodDefExt( name, function, method_noargs_call_handler, doc ); + } + + static void add_varargs_method( const char *name, method_varargs_function_t function, const char *doc="" ) + { + check_unique_method_name( name ); + method_map_t &mm = methods(); + mm[ std::string( name ) ] = new MethodDefExt( name, function, method_varargs_call_handler, doc ); + } + + static void add_keyword_method( const char *name, method_keyword_function_t function, const char *doc="" ) + { + check_unique_method_name( name ); + method_map_t &mm = methods(); + mm[ std::string( name ) ] = new MethodDefExt( name, function, method_keyword_call_handler, doc ); + } + + private: + static method_map_t &methods( void ) + { + static method_map_t *map_of_methods = NULL; + if( map_of_methods == NULL ) + map_of_methods = new method_map_t; + + return *map_of_methods; + } + + // Note: Python calls noargs as varargs buts args==NULL + static PyObject *method_noargs_call_handler( PyObject *_self_and_name_tuple, PyObject * ) + { + try + { + Tuple self_and_name_tuple( _self_and_name_tuple ); + + PyObject *self_in_cobject = self_and_name_tuple[0].ptr(); + T *self = static_cast( self_in_cobject ); + MethodDefExt *meth_def = reinterpret_cast *>( + PyCObject_AsVoidPtr( self_and_name_tuple[1].ptr() ) ); + Object result; + + // Adding try & catch in case of STL debug-mode exceptions. + #ifdef _STLP_DEBUG + try + { + result = (self->*meth_def->ext_noargs_function)(); + } + catch( std::__stl_debug_exception ) + { + // throw cxx::RuntimeError( sErrMsg ); + throw RuntimeError( "Error message not set yet." ); + } + #else + result = (self->*meth_def->ext_noargs_function)(); + #endif // _STLP_DEBUG + + return new_reference_to( result.ptr() ); + } + catch( Exception & ) + { + return 0; + } + } + + static PyObject *method_varargs_call_handler( PyObject *_self_and_name_tuple, PyObject *_args ) + { + try + { + Tuple self_and_name_tuple( _self_and_name_tuple ); + + PyObject *self_in_cobject = self_and_name_tuple[0].ptr(); + T *self = static_cast( self_in_cobject ); + + MethodDefExt *meth_def = reinterpret_cast *>( + PyCObject_AsVoidPtr( self_and_name_tuple[1].ptr() ) ); + Tuple args( _args ); + + Object result; + + // Adding try & catch in case of STL debug-mode exceptions. + #ifdef _STLP_DEBUG + try + { + result = (self->*meth_def->ext_varargs_function)( args ); + } + catch( std::__stl_debug_exception ) + { + throw RuntimeError( "Error message not set yet." ); + } + #else + result = (self->*meth_def->ext_varargs_function)( args ); + #endif // _STLP_DEBUG + + return new_reference_to( result.ptr() ); + } + catch( Exception & ) + { + return 0; + } + } + + static PyObject *method_keyword_call_handler( PyObject *_self_and_name_tuple, PyObject *_args, PyObject *_keywords ) + { + try + { + Tuple self_and_name_tuple( _self_and_name_tuple ); + + PyObject *self_in_cobject = self_and_name_tuple[0].ptr(); + T *self = static_cast( self_in_cobject ); + + MethodDefExt *meth_def = reinterpret_cast *>( + PyCObject_AsVoidPtr( self_and_name_tuple[1].ptr() ) ); + + Tuple args( _args ); + + // _keywords may be NULL so be careful about the way the dict is created + Dict keywords; + if( _keywords != NULL ) + keywords = Dict( _keywords ); + + Object result( ( self->*meth_def->ext_keyword_function )( args, keywords ) ); + + return new_reference_to( result.ptr() ); + } + catch( Exception & ) + { + return 0; + } + } + + static void extension_object_deallocator( PyObject* t ) + { + delete (T *)( t ); + } + + // + // prevent the compiler generating these unwanted functions + // + explicit PythonExtension( const PythonExtension &other ); + void operator=( const PythonExtension &rhs ); + }; + + // + // ExtensionObject is an Object that will accept only T's. + // + template + class ExtensionObject: public Object + { + public: + + explicit ExtensionObject( PyObject *pyob ) + : Object( pyob ) + { + validate(); + } + + ExtensionObject( const ExtensionObject &other ) + : Object( *other ) + { + validate(); + } + + ExtensionObject( const Object &other ) + : Object( *other ) + { + validate(); + } + + ExtensionObject &operator=( const Object &rhs ) + { + return( *this = *rhs ); + } + + ExtensionObject &operator=( PyObject *rhsp ) + { + if( ptr() != rhsp ) + set( rhsp ); + return *this; + } + + virtual bool accepts( PyObject *pyob ) const + { + return( pyob && T::check( pyob ) ); + } + + // + // Obtain a pointer to the PythonExtension object + // + T *extensionObject( void ) + { + return static_cast( ptr() ); + } + }; +} // Namespace Py + +// End of __CXX_ExtensionOldType__h +#endif diff -Nru matplotlib-0.99.3/CXX/Python2/Extensions.hxx matplotlib-1.0.1/CXX/Python2/Extensions.hxx --- matplotlib-0.99.3/CXX/Python2/Extensions.hxx 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/CXX/Python2/Extensions.hxx 2010-07-07 01:41:52.000000000 +0000 @@ -0,0 +1,189 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// 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 disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED 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 REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY 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. +// +//----------------------------------------------------------------------------- + +#ifndef __CXX_Extensions__h +#define __CXX_Extensions__h + + +#ifdef _MSC_VER +// disable warning C4786: symbol greater than 255 character, +// okay to ignore +#pragma warning( disable: 4786 ) +#endif + +#include "CXX/WrapPython.h" +#include "CXX/Version.hxx" +#include "CXX/Python2/Config.hxx" +#include "CXX/Python2/CxxDebug.hxx" +#include "CXX/Python2/Objects.hxx" + +extern "C" { extern PyObject py_object_initializer; } + +#include +#include + +// ---------------------------------------------------------------------- + +namespace Py +{ + class ExtensionModuleBase; + + // Make an Exception Type for use in raising custom exceptions + class ExtensionExceptionType : public Object + { + public: + ExtensionExceptionType(); + virtual ~ExtensionExceptionType(); + + // call init to create the type + void init( ExtensionModuleBase &module, const std::string &name, ExtensionExceptionType &parent ); + void init( ExtensionModuleBase &module, const std::string &name ); + }; + + class MethodTable + { + public: + MethodTable(); + virtual ~MethodTable(); + + void add( const char *method_name, PyCFunction f, const char *doc="", int flag=1 ); + PyMethodDef *table(); + + protected: + std::vector t; // accumulator of PyMethodDef's + PyMethodDef *mt; // Actual method table produced when full + + static PyMethodDef method( const char* method_name, PyCFunction f, int flags=1, const char* doc="" ); + + private: + // + // prevent the compiler generating these unwanted functions + // + MethodTable( const MethodTable &m ); //unimplemented + void operator=( const MethodTable &m ); //unimplemented + + }; // end class MethodTable + + // Note: Python calls noargs as varargs buts args==NULL + extern "C" typedef PyObject *(*method_noargs_call_handler_t)( PyObject *_self, PyObject * ); + extern "C" typedef PyObject *(*method_varargs_call_handler_t)( PyObject *_self, PyObject *_args ); + extern "C" typedef PyObject *(*method_keyword_call_handler_t)( PyObject *_self, PyObject *_args, PyObject *_dict ); + + template + class MethodDefExt : public PyMethodDef + { + public: + typedef Object (T::*method_noargs_function_t)(); + typedef Object (T::*method_varargs_function_t)( const Tuple &args ); + typedef Object (T::*method_keyword_function_t)( const Tuple &args, const Dict &kws ); + + // NOARGS + MethodDefExt + ( + const char *_name, + method_noargs_function_t _function, + method_noargs_call_handler_t _handler, + const char *_doc + ) + { + ext_meth_def.ml_name = const_cast( _name ); + ext_meth_def.ml_meth = reinterpret_cast( _handler ); + ext_meth_def.ml_flags = METH_NOARGS; + ext_meth_def.ml_doc = const_cast( _doc ); + + ext_noargs_function = _function; + ext_varargs_function = NULL; + ext_keyword_function = NULL; + } + + // VARARGS + MethodDefExt + ( + const char *_name, + method_varargs_function_t _function, + method_varargs_call_handler_t _handler, + const char *_doc + ) + { + ext_meth_def.ml_name = const_cast( _name ); + ext_meth_def.ml_meth = reinterpret_cast( _handler ); + ext_meth_def.ml_flags = METH_VARARGS; + ext_meth_def.ml_doc = const_cast( _doc ); + + ext_noargs_function = NULL; + ext_varargs_function = _function; + ext_keyword_function = NULL; + } + + // VARARGS + KEYWORD + MethodDefExt + ( + const char *_name, + method_keyword_function_t _function, + method_keyword_call_handler_t _handler, + const char *_doc + ) + { + ext_meth_def.ml_name = const_cast( _name ); + ext_meth_def.ml_meth = reinterpret_cast( _handler ); + ext_meth_def.ml_flags = METH_VARARGS|METH_KEYWORDS; + ext_meth_def.ml_doc = const_cast( _doc ); + + ext_noargs_function = NULL; + ext_varargs_function = NULL; + ext_keyword_function = _function; + } + + ~MethodDefExt() + {} + + PyMethodDef ext_meth_def; + method_noargs_function_t ext_noargs_function; + method_varargs_function_t ext_varargs_function; + method_keyword_function_t ext_keyword_function; + Object py_method; + }; +} // Namespace Py + +#include "CXX/Python2/ExtensionModule.hxx" +#include "CXX/Python2/PythonType.hxx" +#include "CXX/Python2/ExtensionTypeBase.hxx" +#include "CXX/Python2/ExtensionOldType.hxx" +#include "CXX/Python2/ExtensionType.hxx" + +// End of CXX_Extensions.h +#endif diff -Nru matplotlib-0.99.3/CXX/Python2/ExtensionTypeBase.hxx matplotlib-1.0.1/CXX/Python2/ExtensionTypeBase.hxx --- matplotlib-0.99.3/CXX/Python2/ExtensionTypeBase.hxx 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/CXX/Python2/ExtensionTypeBase.hxx 2010-07-07 01:41:52.000000000 +0000 @@ -0,0 +1,145 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// 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 disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED 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 REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY 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. +// +//----------------------------------------------------------------------------- + +#ifndef __CXX_ExtensionTypeBase__h +#define __CXX_ExtensionTypeBase__h + +namespace Py +{ + // Class PythonExtension is what you inherit from to create + // a new Python extension type. You give your class itself + // as the template paramter. + + // There are two ways that extension objects can get destroyed. + // 1. Their reference count goes to zero + // 2. Someone does an explicit delete on a pointer. + // In(1) the problem is to get the destructor called + // We register a special deallocator in the Python type object + // (see behaviors()) to do this. + // In(2) there is no problem, the dtor gets called. + + // PythonExtension does not use the usual Python heap allocator, + // instead using new/delete. We do the setting of the type object + // and reference count, usually done by PyObject_New, in the + // base class ctor. + + // This special deallocator does a delete on the pointer. + + class PythonExtensionBase : public PyObject + { + public: + PythonExtensionBase(); + virtual ~PythonExtensionBase(); + + public: + // object + virtual void reinit( Tuple &args, Dict &kwds ); + + // object basics +#if defined( PYCXX_PYTHON_2TO3 ) || !defined( PY3 ) + virtual int print( FILE *, int ); +#endif + virtual Object getattr( const char * ); + virtual int setattr( const char *, const Object & ); + virtual Object getattro( const String & ); + Object genericGetAttro( const String & ); + virtual int setattro( const String &, const Object & ); + int genericSetAttro( const String &, const Object & ); + virtual int compare( const Object & ); + virtual Object rich_compare( const Object &, int ); + virtual Object repr(); + virtual Object str(); + virtual long hash(); + virtual Object call( const Object &, const Object & ); + virtual Object iter(); + virtual PyObject *iternext(); + + // Sequence methods + virtual int sequence_length(); + virtual Object sequence_concat( const Object & ); + virtual Object sequence_repeat( Py_ssize_t ); + virtual Object sequence_item( Py_ssize_t ); + virtual Object sequence_slice( Py_ssize_t, Py_ssize_t ); + virtual int sequence_ass_item( Py_ssize_t, const Object & ); + virtual int sequence_ass_slice( Py_ssize_t, Py_ssize_t, const Object & ); + + // Mapping + virtual int mapping_length(); + virtual Object mapping_subscript( const Object & ); + virtual int mapping_ass_subscript( const Object &, const Object & ); + + // Number + virtual int number_nonzero(); + virtual Object number_negative(); + virtual Object number_positive(); + virtual Object number_absolute(); + virtual Object number_invert(); + virtual Object number_int(); + virtual Object number_float(); + virtual Object number_long(); + virtual Object number_oct(); + virtual Object number_hex(); + virtual Object number_add( const Object & ); + virtual Object number_subtract( const Object & ); + virtual Object number_multiply( const Object & ); + virtual Object number_divide( const Object & ); + virtual Object number_remainder( const Object & ); + virtual Object number_divmod( const Object & ); + virtual Object number_lshift( const Object & ); + virtual Object number_rshift( const Object & ); + virtual Object number_and( const Object & ); + virtual Object number_xor( const Object & ); + virtual Object number_or( const Object & ); + virtual Object number_power( const Object &, const Object & ); + + // Buffer + virtual Py_ssize_t buffer_getreadbuffer( Py_ssize_t, void** ); + virtual Py_ssize_t buffer_getwritebuffer( Py_ssize_t, void** ); + virtual Py_ssize_t buffer_getsegcount( Py_ssize_t* ); + + public: + virtual PyObject *selfPtr() = 0; + + private: + void missing_method( void ); + static PyObject *method_call_handler( PyObject *self, PyObject *args ); + }; + +} // Namespace Py + +// End of __CXX_ExtensionTypeBase__h +#endif diff -Nru matplotlib-0.99.3/CXX/Python2/ExtensionType.hxx matplotlib-1.0.1/CXX/Python2/ExtensionType.hxx --- matplotlib-0.99.3/CXX/Python2/ExtensionType.hxx 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/CXX/Python2/ExtensionType.hxx 2010-07-07 01:41:52.000000000 +0000 @@ -0,0 +1,370 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// 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 disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED 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 REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY 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. +// +//----------------------------------------------------------------------------- + +#ifndef __CXX_ExtensionClass__h +#define __CXX_ExtensionClass__h + +#define PYCXX_NOARGS_METHOD_NAME( NAME ) _callNoArgsMethod__##NAME +#define PYCXX_VARARGS_METHOD_NAME( NAME ) _callVarArgsMethod__##NAME +#define PYCXX_KEYWORDS_METHOD_NAME( NAME ) _callKeywordsMethod__##NAME + +#define PYCXX_NOARGS_METHOD_DECL( CLS, NAME ) \ + static PyObject *PYCXX_NOARGS_METHOD_NAME( NAME )( PyObject *_self, PyObject *, PyObject * ) \ + { \ + Py::PythonClassInstance *self_python = reinterpret_cast< Py::PythonClassInstance * >( _self ); \ + CLS *self = reinterpret_cast< CLS * >( self_python->m_pycxx_object ); \ + Py::Object r( (self->NAME)() ); \ + return Py::new_reference_to( r.ptr() ); \ + } +#define PYCXX_VARARGS_METHOD_DECL( CLS, NAME ) \ + static PyObject *PYCXX_VARARGS_METHOD_NAME( NAME )( PyObject *_self, PyObject *_a, PyObject * ) \ + { \ + Py::PythonClassInstance *self_python = reinterpret_cast< Py::PythonClassInstance * >( _self ); \ + CLS *self = reinterpret_cast< CLS * >( self_python->m_pycxx_object ); \ + Py::Tuple a( _a ); \ + Py::Object r( (self->NAME)( a ) ); \ + return Py::new_reference_to( r.ptr() ); \ + } +#define PYCXX_KEYWORDS_METHOD_DECL( CLS, NAME ) \ + static PyObject *PYCXX_KEYWORDS_METHOD_NAME( NAME )( PyObject *_self, PyObject *_a, PyObject *_k ) \ + { \ + Py::PythonClassInstance *self_python = reinterpret_cast< Py::PythonClassInstance * >( _self ); \ + CLS *self = reinterpret_cast< CLS * >( self_python->m_pycxx_object ); \ + Py::Tuple a( _a ); \ + Py::Dict k; \ + if( _k != NULL ) \ + k = _k; \ + Py::Object r( (self->NAME)( a, k ) ); \ + return Py::new_reference_to( r.ptr() ); \ + } + +// need to support METH_STATIC and METH_CLASS + +#define PYCXX_ADD_NOARGS_METHOD( NAME, docs ) \ + add_method( #NAME, (PyCFunction)PYCXX_NOARGS_METHOD_NAME( NAME ), METH_NOARGS, docs ) +#define PYCXX_ADD_VARARGS_METHOD( NAME, docs ) \ + add_method( #NAME, (PyCFunction)PYCXX_VARARGS_METHOD_NAME( NAME ), METH_VARARGS, docs ) +#define PYCXX_ADD_KEYWORDS_METHOD( NAME, docs ) \ + add_method( #NAME, (PyCFunction)PYCXX_KEYWORDS_METHOD_NAME( NAME ), METH_VARARGS | METH_KEYWORDS, docs ) + +namespace Py +{ + struct PythonClassInstance + { + PyObject_HEAD + PythonExtensionBase *m_pycxx_object; + }; + + + class ExtensionClassMethodsTable + { + public: + ExtensionClassMethodsTable() + : m_methods_table( new PyMethodDef[ METHOD_TABLE_SIZE_INCREMENT ] ) + , m_methods_used( 0 ) + , m_methods_size( METHOD_TABLE_SIZE_INCREMENT ) + { + } + + ~ExtensionClassMethodsTable() + { + delete m_methods_table; + } + + // check that all methods added are unique + void check_unique_method_name( const char *_name ) + { + std::string name( _name ); + for( int i=0; iml_name = const_cast( name ); + p->ml_meth = function; + p->ml_flags = flags; + p->ml_doc = const_cast( doc ); + + m_methods_used++; + p++; + + // add the sentinel marking the table end + p->ml_name = NULL; + p->ml_meth = NULL; + p->ml_flags = 0; + p->ml_doc = NULL; + + return m_methods_table; + } + + private: + enum {METHOD_TABLE_SIZE_INCREMENT = 1}; + PyMethodDef *m_methods_table; + int m_methods_used; + int m_methods_size; + }; + + template class PythonClass + : public PythonExtensionBase + { + protected: + explicit PythonClass( PythonClassInstance *self, Tuple &args, Dict &kwds ) + : PythonExtensionBase() + , m_self( self ) + { + // we are a class + behaviors().supportClass(); + } + + virtual ~PythonClass() + {} + + static ExtensionClassMethodsTable &methodTable() + { + static ExtensionClassMethodsTable *method_table; + if( method_table == NULL ) + method_table = new ExtensionClassMethodsTable; + return *method_table; + } + + static void add_method( const char *name, PyCFunction function, int flags, const char *doc=NULL ) + { + behaviors().set_methods( methodTable().add_method( name, function, flags, doc ) ); + } + + static PythonType &behaviors() + { + static PythonType *p; + if( p == NULL ) + { +#if defined( _CPPRTTI ) || defined( __GNUG__ ) + const char *default_name = (typeid( T )).name(); +#else + const char *default_name = "unknown"; +#endif + p = new PythonType( sizeof( T ), 0, default_name ); + p->set_tp_new( extension_object_new ); + p->set_tp_init( extension_object_init ); + p->set_tp_dealloc( extension_object_deallocator ); + } + + return *p; + } + + static PyObject *extension_object_new( PyTypeObject *subtype, PyObject *args, PyObject *kwds ) + { +#ifdef PYCXX_DEBUG + std::cout << "extension_object_new()" << std::endl; +#endif + PythonClassInstance *o = reinterpret_cast( subtype->tp_alloc( subtype, 0 ) ); + if( o == NULL ) + return NULL; + + o->m_pycxx_object = NULL; + + PyObject *self = reinterpret_cast( o ); +#ifdef PYCXX_DEBUG + std::cout << "extension_object_new() => self=0x" << std::hex << reinterpret_cast< unsigned int >( self ) << std::dec << std::endl; +#endif + return self; + } + + static int extension_object_init( PyObject *_self, PyObject *args_, PyObject *kwds_ ) + { + try + { + Py::Tuple args( args_ ); + Py::Dict kwds; + if( kwds_ != NULL ) + kwds = kwds_; + + PythonClassInstance *self = reinterpret_cast( _self ); +#ifdef PYCXX_DEBUG + std::cout << "extension_object_init( self=0x" << std::hex << reinterpret_cast< unsigned int >( self ) << std::dec << " )" << std::endl; + std::cout << " self->cxx_object=0x" << std::hex << reinterpret_cast< unsigned int >( self->cxx_object ) << std::dec << std::endl; +#endif + + if( self->m_pycxx_object == NULL ) + { + self->m_pycxx_object = new T( self, args, kwds ); +#ifdef PYCXX_DEBUG + std::cout << " self->m_pycxx_object=0x" << std::hex << reinterpret_cast< unsigned int >( self->m_pycxx_object ) << std::dec << std::endl; +#endif + } + else + { +#ifdef PYCXX_DEBUG + std::cout << " reinit - self->m_pycxx_object=0x" << std::hex << reinterpret_cast< unsigned int >( self->m_pycxx_object ) << std::dec << std::endl; +#endif + self->m_pycxx_object->reinit( args, kwds ); + } + } + catch( Exception & ) + { + return -1; + } + return 0; + } + + static void extension_object_deallocator( PyObject *_self ) + { + PythonClassInstance *self = reinterpret_cast< PythonClassInstance * >( _self ); +#ifdef PYCXX_DEBUG + std::cout << "extension_object_deallocator( self=0x" << std::hex << reinterpret_cast< unsigned int >( self ) << std::dec << " )" << std::endl; + std::cout << " self->cxx_object=0x" << std::hex << reinterpret_cast< unsigned int >( self->cxx_object ) << std::dec << std::endl; +#endif + delete self->m_pycxx_object; + } + + public: + static PyTypeObject *type_object() + { + return behaviors().type_object(); + } + + static Object type() + { + return Object( reinterpret_cast( behaviors().type_object() ) ); + } + + static bool check( PyObject *p ) + { + // is p like me? + return p->ob_type == type_object(); + } + + static bool check( const Object &ob ) + { + return check( ob.ptr() ); + } + + PyObject *selfPtr() + { + return reinterpret_cast( m_self ); + } + + protected: + private: + PythonClassInstance *m_self; + + private: + // + // prevent the compiler generating these unwanted functions + // + explicit PythonClass( const PythonClass &other ); + void operator=( const PythonClass &rhs ); + }; + + // + // ExtensionObject is an Object that will accept only T's. + // + template + class PythonClassObject: public Object + { + public: + + explicit PythonClassObject( PyObject *pyob ) + : Object( pyob ) + { + validate(); + } + + PythonClassObject( const PythonClassObject &other ) + : Object( *other ) + { + validate(); + } + + PythonClassObject( const Object &other ) + : Object( *other ) + { + validate(); + } + + PythonClassObject &operator=( const Object &rhs ) + { + *this = *rhs; + return *this; + } + + PythonClassObject &operator=( PyObject *rhsp ) + { + if( ptr() != rhsp ) + set( rhsp ); + return *this; + } + + virtual bool accepts( PyObject *pyob ) const + { + return( pyob && T::check( pyob ) ); + } + + // + // Obtain a pointer to the PythonExtension object + // + T *getCxxObject( void ) + { + return static_cast( ptr() ); + } + }; +} // Namespace Py + +// End of __CXX_ExtensionClass__h +#endif diff -Nru matplotlib-0.99.3/CXX/Python2/IndirectPythonInterface.cxx matplotlib-1.0.1/CXX/Python2/IndirectPythonInterface.cxx --- matplotlib-0.99.3/CXX/Python2/IndirectPythonInterface.cxx 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/CXX/Python2/IndirectPythonInterface.cxx 2010-07-07 01:41:52.000000000 +0000 @@ -0,0 +1,597 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// 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 disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED 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 REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY 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. +// +//----------------------------------------------------------------------------- + +#include "CXX/IndirectPythonInterface.hxx" + +namespace Py +{ +bool _Buffer_Check( PyObject *op ) { return (op)->ob_type == _Buffer_Type(); } +bool _CFunction_Check( PyObject *op ) { return (op)->ob_type == _CFunction_Type(); } +bool _Class_Check( PyObject *op ) { return (op)->ob_type == _Class_Type(); } +bool _CObject_Check( PyObject *op ) { return (op)->ob_type == _CObject_Type(); } +bool _Complex_Check( PyObject *op ) { return (op)->ob_type == _Complex_Type(); } +bool _Dict_Check( PyObject *op ) { return (op)->ob_type == _Dict_Type(); } +bool _File_Check( PyObject *op ) { return (op)->ob_type == _File_Type(); } +bool _Float_Check( PyObject *op ) { return (op)->ob_type == _Float_Type(); } +bool _Function_Check( PyObject *op ) { return (op)->ob_type == _Function_Type(); } +bool _Instance_Check( PyObject *op ) { return (op)->ob_type == _Instance_Type(); } +bool _Boolean_Check( PyObject *op ) { return (op)->ob_type == _Bool_Type(); } +bool _Int_Check( PyObject *op ) { return (op)->ob_type == _Int_Type(); } +bool _List_Check( PyObject *o ) { return o->ob_type == _List_Type(); } +bool _Long_Check( PyObject *op ) { return (op)->ob_type == _Long_Type(); } +bool _Method_Check( PyObject *op ) { return (op)->ob_type == _Method_Type(); } +bool _Module_Check( PyObject *op ) { return (op)->ob_type == _Module_Type(); } +bool _Range_Check( PyObject *op ) { return (op)->ob_type == _Range_Type(); } +bool _Slice_Check( PyObject *op ) { return (op)->ob_type == _Slice_Type(); } +bool _String_Check( PyObject *o ) { return o->ob_type == _String_Type(); } +bool _TraceBack_Check( PyObject *v ) { return (v)->ob_type == _TraceBack_Type(); } +bool _Tuple_Check( PyObject *op ) { return (op)->ob_type == _Tuple_Type(); } +bool _Type_Check( PyObject *op ) { return (op)->ob_type == _Type_Type(); } + +#if PY_MAJOR_VERSION >= 2 +bool _Unicode_Check( PyObject *op ) { return (op)->ob_type == _Unicode_Type(); } +#endif + + + +#if defined(PY_WIN32_DELAYLOAD_PYTHON_DLL) + +#if defined(MS_WINDOWS) +#include + + +static HMODULE python_dll; + +static PyObject *ptr__Exc_ArithmeticError = NULL; +static PyObject *ptr__Exc_AssertionError = NULL; +static PyObject *ptr__Exc_AttributeError = NULL; +static PyObject *ptr__Exc_EnvironmentError = NULL; +static PyObject *ptr__Exc_EOFError = NULL; +static PyObject *ptr__Exc_Exception = NULL; +static PyObject *ptr__Exc_FloatingPointError = NULL; +static PyObject *ptr__Exc_ImportError = NULL; +static PyObject *ptr__Exc_IndexError = NULL; +static PyObject *ptr__Exc_IOError = NULL; +static PyObject *ptr__Exc_KeyboardInterrupt = NULL; +static PyObject *ptr__Exc_KeyError = NULL; +static PyObject *ptr__Exc_LookupError = NULL; +static PyObject *ptr__Exc_MemoryError = NULL; +static PyObject *ptr__Exc_MemoryErrorInst = NULL; +static PyObject *ptr__Exc_NameError = NULL; +static PyObject *ptr__Exc_NotImplementedError = NULL; +static PyObject *ptr__Exc_OSError = NULL; +static PyObject *ptr__Exc_OverflowError = NULL; +static PyObject *ptr__Exc_RuntimeError = NULL; +static PyObject *ptr__Exc_StandardError = NULL; +static PyObject *ptr__Exc_SyntaxError = NULL; +static PyObject *ptr__Exc_SystemError = NULL; +static PyObject *ptr__Exc_SystemExit = NULL; +static PyObject *ptr__Exc_TypeError = NULL; +static PyObject *ptr__Exc_ValueError = NULL; +static PyObject *ptr__Exc_ZeroDivisionError = NULL; + +#ifdef MS_WINDOWS +static PyObject *ptr__Exc_WindowsError = NULL; +#endif + +#if PY_MAJOR_VERSION >= 2 +static PyObject *ptr__Exc_IndentationError = NULL; +static PyObject *ptr__Exc_TabError = NULL; +static PyObject *ptr__Exc_UnboundLocalError = NULL; +static PyObject *ptr__Exc_UnicodeError = NULL; +#endif + +static PyObject *ptr__PyNone = NULL; + +static PyObject *ptr__PyFalse = NULL; +static PyObject *ptr__PyTrue = NULL; + +static PyTypeObject *ptr__Buffer_Type = NULL; +static PyTypeObject *ptr__CFunction_Type = NULL; +static PyTypeObject *ptr__Class_Type = NULL; +static PyTypeObject *ptr__CObject_Type = NULL; +static PyTypeObject *ptr__Complex_Type = NULL; +static PyTypeObject *ptr__Dict_Type = NULL; +static PyTypeObject *ptr__File_Type = NULL; +static PyTypeObject *ptr__Float_Type = NULL; +static PyTypeObject *ptr__Function_Type = NULL; +static PyTypeObject *ptr__Instance_Type = NULL; +static PyTypeObject *ptr__Int_Type = NULL; +static PyTypeObject *ptr__List_Type = NULL; +static PyTypeObject *ptr__Long_Type = NULL; +static PyTypeObject *ptr__Method_Type = NULL; +static PyTypeObject *ptr__Module_Type = NULL; +static PyTypeObject *ptr__Range_Type = NULL; +static PyTypeObject *ptr__Slice_Type = NULL; +static PyTypeObject *ptr__String_Type = NULL; +static PyTypeObject *ptr__TraceBack_Type = NULL; +static PyTypeObject *ptr__Tuple_Type = NULL; +static PyTypeObject *ptr__Type_Type = NULL; + +#if PY_MAJOR_VERSION >= 2 +static PyTypeObject *ptr__Unicode_Type = NULL; +#endif + +static int *ptr_Py_DebugFlag = NULL; +static int *ptr_Py_InteractiveFlag = NULL; +static int *ptr_Py_OptimizeFlag = NULL; +static int *ptr_Py_NoSiteFlag = NULL; +static int *ptr_Py_TabcheckFlag = NULL; +static int *ptr_Py_VerboseFlag = NULL; + +#if PY_MAJOR_VERSION >= 2 +static int *ptr_Py_UnicodeFlag = NULL; +#endif + +static char **ptr__Py_PackageContext = NULL; + +#ifdef Py_REF_DEBUG +int *ptr_Py_RefTotal; +#endif + + +//-------------------------------------------------------------------------------- +class GetAddressException +{ +public: + GetAddressException( const char *_name ) + : name( _name ) + {} + virtual ~GetAddressException() {} + const char *name; +}; + + +//-------------------------------------------------------------------------------- +static PyObject *GetPyObjectPointer_As_PyObjectPointer( const char *name ) +{ + FARPROC addr = GetProcAddress( python_dll, name ); + if( addr == NULL ) + throw GetAddressException( name ); + + return *(PyObject **)addr; +} + +static PyObject *GetPyObject_As_PyObjectPointer( const char *name ) +{ + FARPROC addr = GetProcAddress( python_dll, name ); + if( addr == NULL ) + throw GetAddressException( name ); + + return (PyObject *)addr; +} + +static PyTypeObject *GetPyTypeObjectPointer_As_PyTypeObjectPointer( const char *name ) +{ + FARPROC addr = GetProcAddress( python_dll, name ); + if( addr == NULL ) + throw GetAddressException( name ); + + return *(PyTypeObject **)addr; +} + +static PyTypeObject *GetPyTypeObject_As_PyTypeObjectPointer( const char *name ) +{ + FARPROC addr = GetProcAddress( python_dll, name ); + if( addr == NULL ) + throw GetAddressException( name ); + + return (PyTypeObject *)addr; +} + +static int *GetInt_as_IntPointer( const char *name ) +{ + FARPROC addr = GetProcAddress( python_dll, name ); + if( addr == NULL ) + throw GetAddressException( name ); + + return (int *)addr; +} + +static char **GetCharPointer_as_CharPointerPointer( const char *name ) +{ + FARPROC addr = GetProcAddress( python_dll, name ); + if( addr == NULL ) + throw GetAddressException( name ); + + return (char **)addr; +} + + +#ifdef _DEBUG +static const char python_dll_name_format[] = "PYTHON%1.1d%1.1d_D.DLL"; +#else +static const char python_dll_name_format[] = "PYTHON%1.1d%1.1d.DLL"; +#endif + +//-------------------------------------------------------------------------------- +bool InitialisePythonIndirectInterface() +{ + char python_dll_name[sizeof(python_dll_name_format)]; + + sprintf( python_dll_name, python_dll_name_format, PY_MAJOR_VERSION, PY_MINOR_VERSION ); + + python_dll = LoadLibrary( python_dll_name ); + if( python_dll == NULL ) + return false; + + try +{ +#ifdef Py_REF_DEBUG + ptr_Py_RefTotal = GetInt_as_IntPointer( "_Py_RefTotal" ); +#endif + ptr_Py_DebugFlag = GetInt_as_IntPointer( "Py_DebugFlag" ); + ptr_Py_InteractiveFlag = GetInt_as_IntPointer( "Py_InteractiveFlag" ); + ptr_Py_OptimizeFlag = GetInt_as_IntPointer( "Py_OptimizeFlag" ); + ptr_Py_NoSiteFlag = GetInt_as_IntPointer( "Py_NoSiteFlag" ); + ptr_Py_TabcheckFlag = GetInt_as_IntPointer( "Py_TabcheckFlag" ); + ptr_Py_VerboseFlag = GetInt_as_IntPointer( "Py_VerboseFlag" ); +#if PY_MAJOR_VERSION >= 2 + ptr_Py_UnicodeFlag = GetInt_as_IntPointer( "Py_UnicodeFlag" ); +#endif + ptr__Py_PackageContext = GetCharPointer_as_CharPointerPointer( "_Py_PackageContext" ); + + ptr__Exc_ArithmeticError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_ArithmeticError" ); + ptr__Exc_AssertionError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_AssertionError" ); + ptr__Exc_AttributeError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_AttributeError" ); + ptr__Exc_EnvironmentError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_EnvironmentError" ); + ptr__Exc_EOFError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_EOFError" ); + ptr__Exc_Exception = GetPyObjectPointer_As_PyObjectPointer( "PyExc_Exception" ); + ptr__Exc_FloatingPointError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_FloatingPointError" ); + ptr__Exc_ImportError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_ImportError" ); + ptr__Exc_IndexError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_IndexError" ); + ptr__Exc_IOError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_IOError" ); + ptr__Exc_KeyboardInterrupt = GetPyObjectPointer_As_PyObjectPointer( "PyExc_KeyboardInterrupt" ); + ptr__Exc_KeyError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_KeyError" ); + ptr__Exc_LookupError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_LookupError" ); + ptr__Exc_MemoryError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_MemoryError" ); + ptr__Exc_MemoryErrorInst = GetPyObjectPointer_As_PyObjectPointer( "PyExc_MemoryErrorInst" ); + ptr__Exc_NameError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_NameError" ); + ptr__Exc_NotImplementedError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_NotImplementedError" ); + ptr__Exc_OSError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_OSError" ); + ptr__Exc_OverflowError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_OverflowError" ); + ptr__Exc_RuntimeError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_RuntimeError" ); + ptr__Exc_StandardError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_StandardError" ); + ptr__Exc_SyntaxError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_SyntaxError" ); + ptr__Exc_SystemError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_SystemError" ); + ptr__Exc_SystemExit = GetPyObjectPointer_As_PyObjectPointer( "PyExc_SystemExit" ); + ptr__Exc_TypeError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_TypeError" ); + ptr__Exc_ValueError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_ValueError" ); +#ifdef MS_WINDOWS + ptr__Exc_WindowsError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_WindowsError" ); +#endif + ptr__Exc_ZeroDivisionError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_ZeroDivisionError" ); + +#if PY_MAJOR_VERSION >= 2 + ptr__Exc_IndentationError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_IndentationError" ); + ptr__Exc_TabError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_TabError" ); + ptr__Exc_UnboundLocalError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_UnboundLocalError" ); + ptr__Exc_UnicodeError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_UnicodeError" ); +#endif + ptr__PyNone = GetPyObject_As_PyObjectPointer( "_Py_NoneStruct" ); + + ptr__PyFalse = GetPyObject_As_PyObjectPointer( "_Py_ZeroStruct" ); + ptr__PyTrue = GetPyObject_As_PyObjectPointer( "_Py_TrueStruct" ); + + ptr__Buffer_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyBuffer_Type" ); + ptr__CFunction_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyCFunction_Type" ); + ptr__Class_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyClass_Type" ); + ptr__CObject_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyCObject_Type" ); + ptr__Complex_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyComplex_Type" ); + ptr__Dict_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyDict_Type" ); + ptr__File_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyFile_Type" ); + ptr__Float_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyFloat_Type" ); + ptr__Function_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyFunction_Type" ); + ptr__Instance_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyInstance_Type" ); + ptr__Int_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyInt_Type" ); + ptr__List_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyList_Type" ); + ptr__Long_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyLong_Type" ); + ptr__Method_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyMethod_Type" ); + ptr__Module_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyModule_Type" ); + ptr__Range_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyRange_Type" ); + ptr__Slice_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PySlice_Type" ); + ptr__String_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyString_Type" ); + ptr__TraceBack_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyTraceBack_Type" ); + ptr__Tuple_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyTuple_Type" ); + ptr__Type_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyType_Type" ); + +#if PY_MAJOR_VERSION >= 2 + ptr__Unicode_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyUnicode_Type" ); +#endif +} + catch( GetAddressException &e ) + { + OutputDebugString( python_dll_name ); + OutputDebugString( " does not contain symbol "); + OutputDebugString( e.name ); + OutputDebugString( "\n" ); + + return false; + } + + return true; +} + +// +// Wrap variables as function calls +// +PyObject * _Exc_ArithmeticError(){ return ptr__Exc_ArithmeticError; } +PyObject * _Exc_AssertionError(){ return ptr__Exc_AssertionError; } +PyObject * _Exc_AttributeError(){ return ptr__Exc_AttributeError; } +PyObject * _Exc_EnvironmentError(){ return ptr__Exc_EnvironmentError; } +PyObject * _Exc_EOFError() { return ptr__Exc_EOFError; } +PyObject * _Exc_Exception() { return ptr__Exc_Exception; } +PyObject * _Exc_FloatingPointError(){ return ptr__Exc_FloatingPointError; } +PyObject * _Exc_ImportError() { return ptr__Exc_ImportError; } +PyObject * _Exc_IndexError() { return ptr__Exc_IndexError; } +PyObject * _Exc_IOError() { return ptr__Exc_IOError; } +PyObject * _Exc_KeyboardInterrupt(){ return ptr__Exc_KeyboardInterrupt; } +PyObject * _Exc_KeyError() { return ptr__Exc_KeyError; } +PyObject * _Exc_LookupError() { return ptr__Exc_LookupError; } +PyObject * _Exc_MemoryError() { return ptr__Exc_MemoryError; } +PyObject * _Exc_MemoryErrorInst(){ return ptr__Exc_MemoryErrorInst; } +PyObject * _Exc_NameError() { return ptr__Exc_NameError; } +PyObject * _Exc_NotImplementedError(){ return ptr__Exc_NotImplementedError; } +PyObject * _Exc_OSError() { return ptr__Exc_OSError; } +PyObject * _Exc_OverflowError() { return ptr__Exc_OverflowError; } +PyObject * _Exc_RuntimeError() { return ptr__Exc_RuntimeError; } +PyObject * _Exc_StandardError() { return ptr__Exc_StandardError; } +PyObject * _Exc_SyntaxError() { return ptr__Exc_SyntaxError; } +PyObject * _Exc_SystemError() { return ptr__Exc_SystemError; } +PyObject * _Exc_SystemExit() { return ptr__Exc_SystemExit; } +PyObject * _Exc_TypeError() { return ptr__Exc_TypeError; } +PyObject * _Exc_ValueError() { return ptr__Exc_ValueError; } +#ifdef MS_WINDOWS +PyObject * _Exc_WindowsError() { return ptr__Exc_WindowsError; } +#endif +PyObject * _Exc_ZeroDivisionError(){ return ptr__Exc_ZeroDivisionError; } + +#if PY_MAJOR_VERSION >= 2 +PyObject * _Exc_IndentationError(){ return ptr__Exc_IndentationError; } +PyObject * _Exc_TabError() { return ptr__Exc_TabError; } +PyObject * _Exc_UnboundLocalError(){ return ptr__Exc_UnboundLocalError; } +PyObject * _Exc_UnicodeError() { return ptr__Exc_UnicodeError; } +#endif + +// +// wrap items in Object.h +// +PyObject * _None() { return ptr__PyNone; } + +PyObject * _False() { return ptr__PyFalse; } +PyObject * _True() { return ptr__PyTrue; } + +PyTypeObject * _Buffer_Type() { return ptr__Buffer_Type; } +PyTypeObject * _CFunction_Type(){ return ptr__CFunction_Type; } +PyTypeObject * _Class_Type() { return ptr__Class_Type; } +PyTypeObject * _CObject_Type() { return ptr__CObject_Type; } +PyTypeObject * _Complex_Type() { return ptr__Complex_Type; } +PyTypeObject * _Dict_Type() { return ptr__Dict_Type; } +PyTypeObject * _File_Type() { return ptr__File_Type; } +PyTypeObject * _Float_Type() { return ptr__Float_Type; } +PyTypeObject * _Function_Type() { return ptr__Function_Type; } +PyTypeObject * _Instance_Type() { return ptr__Instance_Type; } +PyTypeObject * _Bool_Type() { return ptr__Bool_Type; } +PyTypeObject * _Int_Type() { return ptr__Int_Type; } +PyTypeObject * _List_Type() { return ptr__List_Type; } +PyTypeObject * _Long_Type() { return ptr__Long_Type; } +PyTypeObject * _Method_Type() { return ptr__Method_Type; } +PyTypeObject * _Module_Type() { return ptr__Module_Type; } +PyTypeObject * _Range_Type() { return ptr__Range_Type; } +PyTypeObject * _Slice_Type() { return ptr__Slice_Type; } +PyTypeObject * _String_Type() { return ptr__String_Type; } +PyTypeObject * _TraceBack_Type(){ return ptr__TraceBack_Type; } +PyTypeObject * _Tuple_Type() { return ptr__Tuple_Type; } +PyTypeObject * _Type_Type() { return ptr__Type_Type; } + +#if PY_MAJOR_VERSION >= 2 +PyTypeObject * _Unicode_Type() { return ptr__Unicode_Type; } +#endif + +char *__Py_PackageContext() { return *ptr__Py_PackageContext; } + + +// +// wrap the Python Flag variables +// +int &_Py_DebugFlag() { return *ptr_Py_DebugFlag; } +int &_Py_InteractiveFlag() { return *ptr_Py_InteractiveFlag; } +int &_Py_OptimizeFlag() { return *ptr_Py_OptimizeFlag; } +int &_Py_NoSiteFlag() { return *ptr_Py_NoSiteFlag; } +int &_Py_TabcheckFlag() { return *ptr_Py_TabcheckFlag; } +int &_Py_VerboseFlag() { return *ptr_Py_VerboseFlag; } +#if PY_MAJOR_VERSION >= 2 +int &_Py_UnicodeFlag() { return *ptr_Py_UnicodeFlag; } +#endif + +void _XINCREF( PyObject *op ) +{ + // This function must match the contents of Py_XINCREF(op) + if( op == NULL ) + return; + +#ifdef Py_REF_DEBUG + (*ptr_Py_RefTotal)++; +#endif + (op)->ob_refcnt++; + +} + +void _XDECREF( PyObject *op ) +{ + // This function must match the contents of Py_XDECREF(op); + if( op == NULL ) + return; + +#ifdef Py_REF_DEBUG + (*ptr_Py_RefTotal)--; +#endif + + if (--(op)->ob_refcnt == 0) + _Py_Dealloc((PyObject *)(op)); +} + + +#else +#error "Can only delay load under Win32" +#endif + +#else + +// +// Duplicated these declarations from rangeobject.h which is missing the +// extern "C". This has been reported as a bug upto and include 2.1 +// +extern "C" DL_IMPORT(PyTypeObject) PyRange_Type; +extern "C" DL_IMPORT(PyObject *) PyRange_New(long, long, long, int); + + +//================================================================================ +// +// Map onto Macros +// +//================================================================================ + +// +// Wrap variables as function calls +// + +PyObject * _Exc_ArithmeticError() { return ::PyExc_ArithmeticError; } +PyObject * _Exc_AssertionError() { return ::PyExc_AssertionError; } +PyObject * _Exc_AttributeError() { return ::PyExc_AttributeError; } +PyObject * _Exc_EnvironmentError() { return ::PyExc_EnvironmentError; } +PyObject * _Exc_EOFError() { return ::PyExc_EOFError; } +PyObject * _Exc_Exception() { return ::PyExc_Exception; } +PyObject * _Exc_FloatingPointError() { return ::PyExc_FloatingPointError; } +PyObject * _Exc_ImportError() { return ::PyExc_ImportError; } +PyObject * _Exc_IndexError() { return ::PyExc_IndexError; } +PyObject * _Exc_IOError() { return ::PyExc_IOError; } +PyObject * _Exc_KeyboardInterrupt() { return ::PyExc_KeyboardInterrupt; } +PyObject * _Exc_KeyError() { return ::PyExc_KeyError; } +PyObject * _Exc_LookupError() { return ::PyExc_LookupError; } +PyObject * _Exc_MemoryError() { return ::PyExc_MemoryError; } +PyObject * _Exc_MemoryErrorInst() { return ::PyExc_MemoryErrorInst; } +PyObject * _Exc_NameError() { return ::PyExc_NameError; } +PyObject * _Exc_NotImplementedError() { return ::PyExc_NotImplementedError; } +PyObject * _Exc_OSError() { return ::PyExc_OSError; } +PyObject * _Exc_OverflowError() { return ::PyExc_OverflowError; } +PyObject * _Exc_RuntimeError() { return ::PyExc_RuntimeError; } +PyObject * _Exc_StandardError() { return ::PyExc_StandardError; } +PyObject * _Exc_SyntaxError() { return ::PyExc_SyntaxError; } +PyObject * _Exc_SystemError() { return ::PyExc_SystemError; } +PyObject * _Exc_SystemExit() { return ::PyExc_SystemExit; } +PyObject * _Exc_TypeError() { return ::PyExc_TypeError; } +PyObject * _Exc_ValueError() { return ::PyExc_ValueError; } +PyObject * _Exc_ZeroDivisionError() { return ::PyExc_ZeroDivisionError; } + +#ifdef MS_WINDOWS +PyObject * _Exc_WindowsError() { return ::PyExc_WindowsError; } +#endif + + +#if PY_MAJOR_VERSION >= 2 +PyObject * _Exc_IndentationError() { return ::PyExc_IndentationError; } +PyObject * _Exc_TabError() { return ::PyExc_TabError; } +PyObject * _Exc_UnboundLocalError() { return ::PyExc_UnboundLocalError; } +PyObject * _Exc_UnicodeError() { return ::PyExc_UnicodeError; } +#endif + + +// +// wrap items in Object.h +// +PyObject * _None() { return &::_Py_NoneStruct; } + +PyObject * _False() { return Py_False; } +PyObject * _True() { return Py_True; } + +PyTypeObject * _Buffer_Type() { return &PyBuffer_Type; } +PyTypeObject * _CFunction_Type() { return &PyCFunction_Type; } +PyTypeObject * _Class_Type() { return &PyClass_Type; } +PyTypeObject * _CObject_Type() { return &PyCObject_Type; } +PyTypeObject * _Complex_Type() { return &PyComplex_Type; } +PyTypeObject * _Dict_Type() { return &PyDict_Type; } +PyTypeObject * _File_Type() { return &PyFile_Type; } +PyTypeObject * _Float_Type() { return &PyFloat_Type; } +PyTypeObject * _Function_Type() { return &PyFunction_Type; } +PyTypeObject * _Instance_Type() { return &PyInstance_Type; } +PyTypeObject * _Bool_Type() { return &PyBool_Type; } +PyTypeObject * _Int_Type() { return &PyInt_Type; } +PyTypeObject * _List_Type() { return &PyList_Type; } +PyTypeObject * _Long_Type() { return &PyLong_Type; } +PyTypeObject * _Method_Type() { return &PyMethod_Type; } +PyTypeObject * _Module_Type() { return &PyModule_Type; } +PyTypeObject * _Range_Type() { return &PyRange_Type; } +PyTypeObject * _Slice_Type() { return &PySlice_Type; } +PyTypeObject * _String_Type() { return &PyString_Type; } +PyTypeObject * _TraceBack_Type() { return &PyTraceBack_Type; } +PyTypeObject * _Tuple_Type() { return &PyTuple_Type; } +PyTypeObject * _Type_Type() { return &PyType_Type; } + +#if PY_MAJOR_VERSION >= 2 +PyTypeObject * _Unicode_Type() { return &PyUnicode_Type; } +#endif + +// +// wrap flags +// +int &_Py_DebugFlag() { return Py_DebugFlag; } +int &_Py_InteractiveFlag(){ return Py_InteractiveFlag; } +int &_Py_OptimizeFlag() { return Py_OptimizeFlag; } +int &_Py_NoSiteFlag() { return Py_NoSiteFlag; } +int &_Py_TabcheckFlag() { return Py_TabcheckFlag; } +int &_Py_VerboseFlag() { return Py_VerboseFlag; } +#if PY_MAJOR_VERSION >= 2 +int &_Py_UnicodeFlag() { return Py_UnicodeFlag; } +#endif +char *__Py_PackageContext(){ return _Py_PackageContext; } + +// +// Needed to keep the abstactions for delayload interface +// +void _XINCREF( PyObject *op ) +{ + Py_XINCREF(op); +} + +void _XDECREF( PyObject *op ) +{ + Py_XDECREF(op); +} + +#endif +} diff -Nru matplotlib-0.99.3/CXX/Python2/IndirectPythonInterface.hxx matplotlib-1.0.1/CXX/Python2/IndirectPythonInterface.hxx --- matplotlib-0.99.3/CXX/Python2/IndirectPythonInterface.hxx 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/CXX/Python2/IndirectPythonInterface.hxx 2010-07-07 01:41:52.000000000 +0000 @@ -0,0 +1,198 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// 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 disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED 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 REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY 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. +// +//----------------------------------------------------------------------------- + +#ifndef __CXX_INDIRECT_PYTHON_INTERFACE__HXX__ +#define __CXX_INDIRECT_PYTHON_INTERFACE__HXX__ + +#include "CXX/WrapPython.h" + +namespace Py +{ +bool InitialisePythonIndirectInterface(); + +// +// Wrap Exception variables as function calls +// +PyObject * _Exc_Exception(); +PyObject * _Exc_StandardError(); +PyObject * _Exc_ArithmeticError(); +PyObject * _Exc_LookupError(); + +PyObject * _Exc_AssertionError(); +PyObject * _Exc_AttributeError(); +PyObject * _Exc_EOFError(); +PyObject * _Exc_FloatingPointError(); +PyObject * _Exc_EnvironmentError(); +PyObject * _Exc_IOError(); +PyObject * _Exc_OSError(); +PyObject * _Exc_ImportError(); +PyObject * _Exc_IndexError(); +PyObject * _Exc_KeyError(); +PyObject * _Exc_KeyboardInterrupt(); +PyObject * _Exc_MemoryError(); +PyObject * _Exc_NameError(); +PyObject * _Exc_OverflowError(); +PyObject * _Exc_RuntimeError(); +PyObject * _Exc_NotImplementedError(); +PyObject * _Exc_SyntaxError(); +PyObject * _Exc_SystemError(); +PyObject * _Exc_SystemExit(); +PyObject * _Exc_TypeError(); +PyObject * _Exc_ValueError(); +PyObject * _Exc_ZeroDivisionError(); +#ifdef MS_WINDOWS +PyObject * _Exc_WindowsError(); +#endif + +PyObject * _Exc_MemoryErrorInst(); + +#if PY_MAJOR_VERSION >= 2 +PyObject * _Exc_IndentationError(); +PyObject * _Exc_TabError(); +PyObject * _Exc_UnboundLocalError(); +PyObject * _Exc_UnicodeError(); +#endif + +// +// Wrap Object variables as function calls +// +PyObject * _None(); + +PyObject * _False(); +PyObject * _True(); + +// +// Wrap Type variables as function calls +// +PyTypeObject * _List_Type(); +bool _List_Check( PyObject *o ); + +PyTypeObject * _Buffer_Type(); +bool _Buffer_Check( PyObject *op ); + +PyTypeObject * _Class_Type(); +bool _Class_Check( PyObject *op ); + +PyTypeObject * _Instance_Type(); +bool _Instance_Check( PyObject *op ); + +PyTypeObject * _Method_Type(); +bool _Method_Check( PyObject *op ); + +PyTypeObject * _CObject_Type(); +bool _CObject_Check( PyObject *op ); + +PyTypeObject * _Complex_Type(); +bool _Complex_Check( PyObject *op ); + +PyTypeObject * _Dict_Type(); +bool _Dict_Check( PyObject *op ); + +PyTypeObject * _File_Type(); +bool _File_Check( PyObject *op ); + +PyTypeObject * _Float_Type(); +bool _Float_Check( PyObject *op ); + +PyTypeObject * _Frame_Type(); +bool _Frame_Check( PyObject *op ); + +PyTypeObject * _Function_Type(); +bool _Function_Check( PyObject *op ); + +PyTypeObject * _Bool_Type(); +bool _Boolean_Check( PyObject *op ); + +PyTypeObject * _Int_Type(); +bool _Int_Check( PyObject *op ); + +PyTypeObject * _List_Type(); +bool _List_Check( PyObject *op ); + +PyTypeObject * _Long_Type(); +bool _Long_Check( PyObject *op ); + +PyTypeObject * _CFunction_Type(); +bool _CFunction_Check( PyObject *op ); + +PyTypeObject * _Module_Type(); +bool _Module_Check( PyObject *op ); + +PyTypeObject * _Type_Type(); +bool _Type_Check( PyObject *op ); + +PyTypeObject * _Range_Type(); +bool _Range_Check( PyObject *op ); + +PyTypeObject * _Slice_Type(); +bool _Slice_Check( PyObject *op ); + +PyTypeObject * _String_Type(); +bool _String_Check( PyObject *op ); + +PyTypeObject * _Unicode_Type(); +bool _Unicode_Check( PyObject *op ); + +PyTypeObject * _TraceBack_Type(); +bool _TraceBack_Check( PyObject *v ); + +PyTypeObject * _Tuple_Type(); +bool _Tuple_Check( PyObject *op ); + +#if PY_MAJOR_VERSION >= 2 +PyTypeObject * _Unicode_Type(); +bool _Unicode_Check( PyObject *op ); +#endif + +int &_Py_DebugFlag(); +int &_Py_InteractiveFlag(); +int &_Py_OptimizeFlag(); +int &_Py_NoSiteFlag(); +int &_Py_TabcheckFlag(); +int &_Py_VerboseFlag(); + +#if PY_MAJOR_VERSION >= 2 +int &_Py_UnicodeFlag(); +#endif + +void _XINCREF( PyObject *op ); +void _XDECREF( PyObject *op ); + +char *__Py_PackageContext(); +} + +#endif // __CXX_INDIRECT_PYTHON_INTERFACE__HXX__ diff -Nru matplotlib-0.99.3/CXX/Python2/Objects.hxx matplotlib-1.0.1/CXX/Python2/Objects.hxx --- matplotlib-0.99.3/CXX/Python2/Objects.hxx 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/CXX/Python2/Objects.hxx 2010-07-07 01:41:52.000000000 +0000 @@ -0,0 +1,3332 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// 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 disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED 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 REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY 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. +// +//----------------------------------------------------------------------------- + +#ifndef __CXX_Objects__h +#define __CXX_Objects__h + +#include "CXX/WrapPython.h" +#include "CXX/Version.hxx" +#include "CXX/Config.hxx" +#include "CXX/Exception.hxx" + +#include +#include STR_STREAM +#include +#include +#include +#include + +namespace Py +{ + typedef int sequence_index_type; // type of an index into a sequence + + // Forward declarations + class Object; + class Type; + template class SeqBase; + class String; + class List; + template class MapBase; + + // new_reference_to also overloaded below on Object + inline PyObject* new_reference_to(PyObject* p) + { + Py::_XINCREF(p); + return p; + } + + // returning Null() from an extension method triggers a + // Python exception + inline PyObject* Null() + { + return (static_cast(0)); + } + + //===========================================================================// + // class Object + // The purpose of this class is to serve as the most general kind of + // Python object, for the purpose of writing C++ extensions in Python + // Objects hold a PyObject* which they own. This pointer is always a + // valid pointer to a Python object. In children we must maintain this behavior. + // + // Instructions on how to make your own class MyType descended from Object: + // (0) Pick a base class, either Object or perhaps SeqBase or MapBase. + // This example assumes Object. + + // (1) Write a routine int MyType_Check (PyObject *) modeled after PyInt_Check, + // PyFloat_Check, etc. + + // (2) Add method accepts: + // virtual bool accepts (PyObject *pyob) const { + // return pyob && MyType_Check (pyob); + // } + + // (3) Include the following constructor and copy constructor + // + /* + explicit MyType (PyObject *pyob): Object(pyob) { + validate(); +} + + MyType(const Object& other): Object(other.ptr()) { + validate(); +} + */ + + // Alernate version for the constructor to allow for construction from owned pointers: + /* + explicit MyType (PyObject *pyob): Object(pyob) { + validate(); +} + */ + + // You may wish to add other constructors; see the classes below for examples. + // Each constructor must use "set" to set the pointer + // and end by validating the pointer you have created. + + // (4) Each class needs at least these two assignment operators: + /* + MyType& operator= (const Object& rhs) { + return (*this = *rhs); +} + + Mytype& operator= (PyObject* rhsp) { + if(ptr() == rhsp) return *this; + set(rhsp); + return *this; +} + */ + // Note on accepts: constructors call the base class + // version of a virtual when calling the base class constructor, + // so the test has to be done explicitly in a descendent. + + // If you are inheriting from PythonExtension to define an object + // note that it contains PythonExtension::check + // which you can use in accepts when writing a wrapper class. + // See Demo/range.h and Demo/range.cxx for an example. + + class Object + { + private: + // the pointer to the Python object + // Only Object sets this directly. + // The default constructor for Object sets it to Py_None and + // child classes must use "set" to set it + // + PyObject* p; + + protected: + + void set (PyObject* pyob, bool owned = false) + { + release(); + p = pyob; + if (!owned) + { + Py::_XINCREF (p); + } + validate(); + } + + void release () + { + Py::_XDECREF (p); + p = 0; + } + + void validate(); + + public: + // Constructor acquires new ownership of pointer unless explicitly told not to. + explicit Object (PyObject* pyob=Py::_None(), bool owned = false): p (pyob) + { + if(!owned) + { + Py::_XINCREF (p); + } + validate(); + } + + // Copy constructor acquires new ownership of pointer + Object (const Object& ob): p(ob.p) + { + Py::_XINCREF (p); + validate(); + } + + // Assignment acquires new ownership of pointer + Object& operator= (const Object& rhs) + { + set(rhs.p); + return *this; + } + + Object& operator= (PyObject* rhsp) + { + if(ptr() == rhsp) return *this; + set (rhsp); + return *this; + } + + // Destructor + virtual ~Object () + { + release (); + } + + // Loaning the pointer to others, retain ownership + PyObject* operator* () const + { + return p; + } + + // Explicit reference_counting changes + void increment_reference_count() + { + Py::_XINCREF(p); + } + + void decrement_reference_count() + { + // not allowed to commit suicide, however + if(reference_count() == 1) + throw RuntimeError("Object::decrement_reference_count error."); + Py::_XDECREF(p); + } + // Would like to call this pointer() but messes up STL in SeqBase + PyObject* ptr () const + { + return p; + } + + // + // Queries + // + + // Can pyob be used in this object's constructor? + virtual bool accepts (PyObject *pyob) const + { + return (pyob != 0); + } + + Py_ssize_t reference_count () const + { // the reference count + return p ? p->ob_refcnt : 0; + } + + Type type () const; // the type object associated with this one + + String str () const; // the str() representation + + std::string as_string() const; + + String repr () const; // the repr () representation + + List dir () const; // the dir() list + + bool hasAttr (const std::string& s) const + { + return PyObject_HasAttrString (p, const_cast(s.c_str())) ? true: false; + } + + Object getAttr (const std::string& s) const + { + return Object (PyObject_GetAttrString (p, const_cast(s.c_str())), true); + } + + Object getItem (const Object& key) const + { + return Object (PyObject_GetItem(p, *key), true); + } + + long hashValue () const + { + return PyObject_Hash (p); + } + + // + // int print (FILE* fp, int flags=Py_Print_RAW) + //{ + // return PyObject_Print (p, fp, flags); + //} + // + bool is(PyObject *pother) const + { // identity test + return p == pother; + } + + bool is(const Object& other) const + { // identity test + return p == other.p; + } + + bool isNone() const + { + return p == _None(); + } + + bool isCallable () const + { + return PyCallable_Check (p) != 0; + } + + bool isInstance () const + { + return PyInstance_Check (p) != 0; + } + + bool isDict () const + { + return Py::_Dict_Check (p); + } + + bool isList () const + { + return Py::_List_Check (p); + } + + bool isMapping () const + { + return PyMapping_Check (p) != 0; + } + + bool isNumeric () const + { + return PyNumber_Check (p) != 0; + } + + bool isSequence () const + { + return PySequence_Check (p) != 0; + } + + bool isTrue () const + { + return PyObject_IsTrue (p) != 0; + } + + bool isType (const Type& t) const; + + bool isTuple() const + { + return Py::_Tuple_Check(p); + } + + bool isString() const + { + return Py::_String_Check(p) || Py::_Unicode_Check(p); + } + + bool isUnicode() const + { + return Py::_Unicode_Check( p ); + } + + bool isBoolean() const + { + return Py::_Boolean_Check( p ); + } + + // Commands + void setAttr (const std::string& s, const Object& value) + { + if(PyObject_SetAttrString (p, const_cast(s.c_str()), *value) == -1) + throw AttributeError ("getAttr failed."); + } + + void delAttr (const std::string& s) + { + if(PyObject_DelAttrString (p, const_cast(s.c_str())) == -1) + throw AttributeError ("delAttr failed."); + } + + // PyObject_SetItem is too weird to be using from C++ + // so it is intentionally omitted. + + void delItem (const Object& key) + { + //if(PyObject_DelItem(p, *key) == -1) + // failed to link on Windows? + throw KeyError("delItem failed."); + } + + // Equality and comparison use PyObject_RichCompareBool + + bool operator==(const Object& o2) const + { + int k = PyObject_RichCompareBool (p, *o2, Py_EQ); + if (PyErr_Occurred()) throw Exception(); + return k != 0; + } + + bool operator!=(const Object& o2) const + { + int k = PyObject_RichCompareBool (p, *o2, Py_NE); + if (PyErr_Occurred()) throw Exception(); + return k != 0; + + } + + bool operator>=(const Object& o2) const + { + int k = PyObject_RichCompareBool (p, *o2, Py_GE); + if (PyErr_Occurred()) throw Exception(); + return k != 0; + } + + bool operator<=(const Object& o2) const + { + int k = PyObject_RichCompareBool (p, *o2, Py_LE); + if (PyErr_Occurred()) throw Exception(); + return k != 0; + } + + bool operator<(const Object& o2) const + { + int k = PyObject_RichCompareBool (p, *o2, Py_LT); + if (PyErr_Occurred()) throw Exception(); + return k != 0; + } + + bool operator>(const Object& o2) const + { + int k = PyObject_RichCompareBool (p, *o2, Py_GT); + if (PyErr_Occurred()) throw Exception(); + return k != 0; + } + }; + // End of class Object + inline PyObject* new_reference_to(const Object& g) + { + PyObject* p = g.ptr(); + Py::_XINCREF(p); + return p; + } + + // Nothing() is what an extension method returns if + // there is no other return value. + inline Object Nothing() + { + return Object(Py::_None()); + } + + // Python special None value + inline Object None() + { + return Object(Py::_None()); + } + + // Python special Boolean values + inline Object False() + { + return Object(Py::_False()); + } + + inline Object True() + { + return Object(Py::_True()); + } + + // TMM: 31May'01 - Added the #ifndef so I can exlude iostreams. +#ifndef CXX_NO_IOSTREAMS + std::ostream& operator<< (std::ostream& os, const Object& ob); +#endif + + // Class Type + class Type: public Object + { + public: + explicit Type (PyObject* pyob, bool owned = false): Object(pyob, owned) + { + validate(); + } + + Type (const Object& ob): Object(*ob) + { + validate(); + } + + Type(const Type& t): Object(t) + { + validate(); + } + + Type& operator= (const Object& rhs) + { + return (*this = *rhs); + } + + Type& operator= (PyObject* rhsp) + { + if(ptr() == rhsp) return *this; + set (rhsp); + return *this; + } + virtual bool accepts (PyObject *pyob) const + { + return pyob && Py::_Type_Check (pyob); + } + }; + + + // + // Convert an owned Python pointer into a CXX Object + // + inline Object asObject (PyObject *p) + { + return Object(p, true); + } + + // =============================================== + // class boolean + class Boolean: public Object + { + public: + // Constructor + Boolean (PyObject *pyob, bool owned = false) + : Object (pyob, owned) + { + validate(); + } + + Boolean (const Boolean& ob): Object(*ob) + { + validate(); + } + + // create from bool + Boolean (bool v=false) + { + set(PyBool_FromLong(v ? 1 : 0), true); + validate(); + } + + explicit Boolean (const Object& ob) + : Object( *ob ) + { + validate(); + } + + // Assignment increases reference count on pointer + + Boolean& operator= (const Object& rhs) + { + return (*this = *rhs); + } + + Boolean& operator= (PyObject* rhsp) + { + if(ptr() == rhsp) return *this; + set (rhsp); + return *this; + } + + // Membership + virtual bool accepts (PyObject *pyob) const + { + return pyob && PyObject_IsTrue(pyob) != -1; + } + + // convert to long + operator bool() const + { + return PyObject_IsTrue (ptr()) != 0; + } + + Boolean& operator= (bool v) + { + set (PyBool_FromLong (v ? 1 : 0), true); + return *this; + } + }; + + // =============================================== + // class Int + class Int: public Object + { + public: + // Constructor + Int (PyObject *pyob, bool owned = false): Object (pyob, owned) + { + validate(); + } + + Int (const Int& ob): Object(*ob) + { + validate(); + } + + // create from long + Int (long v = 0L): Object(PyInt_FromLong(v), true) + { + validate(); + } + + // create from int + Int (int v) + { + long w = v; + set(PyInt_FromLong(w), true); + validate(); + } + + // create from bool + Int (bool v) + { + long w = v ? 1 : 0; + set(PyInt_FromLong(w), true); + validate(); + } + + explicit Int (const Object& ob) + { + set(PyNumber_Int(*ob), true); + validate(); + } + + // Assignment acquires new ownership of pointer + + Int& operator= (const Object& rhs) + { + return (*this = *rhs); + } + + Int& operator= (PyObject* rhsp) + { + if(ptr() == rhsp) return *this; + set (PyNumber_Int(rhsp), true); + return *this; + } + + // Membership + virtual bool accepts (PyObject *pyob) const + { + return pyob && Py::_Int_Check (pyob); + } + + // convert to long + operator long() const + { + return PyInt_AsLong (ptr()); + } + +#ifdef HAVE_LONG_LONG + // convert to long long + PY_LONG_LONG asLongLong() const + { + return PyLong_AsLongLong (ptr()); + } + // convert to unsigned long long + unsigned PY_LONG_LONG asUnsignedLongLong() const + { + return PyLong_AsUnsignedLongLong (ptr()); + } +#endif + + // assign from an int + Int& operator= (int v) + { + set (PyInt_FromLong (long(v)), true); + return *this; + } + + // assign from long + Int& operator= (long v) + { + set (PyInt_FromLong (v), true); + return *this; + } + +#ifdef HAVE_LONG_LONG + // assign from long long + Int& operator= (PY_LONG_LONG v) + { + set (PyLong_FromLongLong (v), true); + return *this; + } + // assign from unsigned long long + Int& operator= (unsigned PY_LONG_LONG v) + { + set (PyLong_FromUnsignedLongLong (v), true); + return *this; + } +#endif + }; + + // =============================================== + // class Long + class Long: public Object + { + public: + // Constructor + explicit Long (PyObject *pyob, bool owned = false): Object (pyob, owned) + { + validate(); + } + + Long (const Long& ob): Object(ob.ptr()) + { + validate(); + } + + // create from long + explicit Long (long v = 0L) + : Object(PyLong_FromLong(v), true) + { + validate(); + } + // create from unsigned long + explicit Long (unsigned long v) + : Object(PyLong_FromUnsignedLong(v), true) + { + validate(); + } + // create from int + explicit Long (int v) + : Object(PyLong_FromLong(static_cast(v)), true) + { + validate(); + } + + // try to create from any object + Long (const Object& ob) + : Object(PyNumber_Long(*ob), true) + { + validate(); + } + + // Assignment acquires new ownership of pointer + + Long& operator= (const Object& rhs) + { + return (*this = *rhs); + } + + Long& operator= (PyObject* rhsp) + { + if(ptr() == rhsp) return *this; + set (PyNumber_Long(rhsp), true); + return *this; + } + // Membership + virtual bool accepts (PyObject *pyob) const + { + return pyob && Py::_Long_Check (pyob); + } + + // convert to long + long as_long() const + { + return PyLong_AsLong( ptr() ); + } + + // convert to long + operator long() const + { + return as_long(); + } + + // convert to unsigned + operator unsigned long() const + { + return PyLong_AsUnsignedLong (ptr()); + } + operator double() const + { + return PyLong_AsDouble (ptr()); + } + // assign from an int + Long& operator= (int v) + { + set(PyLong_FromLong (long(v)), true); + return *this; + } + // assign from long + Long& operator= (long v) + { + set(PyLong_FromLong (v), true); + return *this; + } + // assign from unsigned long + Long& operator= (unsigned long v) + { + set(PyLong_FromUnsignedLong (v), true); + return *this; + } + }; + +#ifdef HAVE_LONG_LONG + // =============================================== + // class LongLong + class LongLong: public Object + { + public: + // Constructor + explicit LongLong (PyObject *pyob, bool owned = false): Object (pyob, owned) + { + validate(); + } + + LongLong (const LongLong& ob): Object(ob.ptr()) + { + validate(); + } + // create from long long + explicit LongLong (PY_LONG_LONG v = 0L) + : Object(PyLong_FromLongLong(v), true) + { + validate(); + } + // create from unsigned long long + explicit LongLong (unsigned PY_LONG_LONG v) + : Object(PyLong_FromUnsignedLongLong(v), true) + { + validate(); + } + // create from long + explicit LongLong (long v) + : Object(PyLong_FromLongLong(v), true) + { + validate(); + } + // create from unsigned long + explicit LongLong (unsigned long v) + : Object(PyLong_FromUnsignedLongLong(v), true) + { + validate(); + } + // create from int + explicit LongLong (int v) + : Object(PyLong_FromLongLong(static_cast(v)), true) + { + validate(); + } + + // try to create from any object + LongLong (const Object& ob) + : Object(PyNumber_Long(*ob), true) + { + validate(); + } + + // Assignment acquires new ownership of pointer + + LongLong& operator= (const Object& rhs) + { + return (*this = *rhs); + } + + LongLong& operator= (PyObject* rhsp) + { + if(ptr() == rhsp) return *this; + set (PyNumber_Long(rhsp), true); + return *this; + } + // Membership + virtual bool accepts (PyObject *pyob) const + { + return pyob && Py::_Long_Check (pyob); + } + // convert to long long + operator PY_LONG_LONG() const + { + return PyLong_AsLongLong (ptr()); + } + // convert to unsigned long + operator unsigned PY_LONG_LONG() const + { + return PyLong_AsUnsignedLongLong (ptr()); + } + // convert to long + operator long() const + { + return PyLong_AsLong (ptr()); + } + // convert to unsigned + operator unsigned long() const + { + return PyLong_AsUnsignedLong (ptr()); + } + operator double() const + { + return PyLong_AsDouble (ptr()); + } + // assign from an int + LongLong& operator= (int v) + { + set(PyLong_FromLongLong (long(v)), true); + return *this; + } + // assign from long long + LongLong& operator= (PY_LONG_LONG v) + { + set(PyLong_FromLongLong (v), true); + return *this; + } + // assign from unsigned long long + LongLong& operator= (unsigned PY_LONG_LONG v) + { + set(PyLong_FromUnsignedLongLong (v), true); + return *this; + } + // assign from long + LongLong& operator= (long v) + { + set(PyLong_FromLongLong (v), true); + return *this; + } + // assign from unsigned long + LongLong& operator= (unsigned long v) + { + set(PyLong_FromUnsignedLongLong (v), true); + return *this; + } + }; +#endif + + // =============================================== + // class Float + // + class Float: public Object + { + public: + // Constructor + explicit Float (PyObject *pyob, bool owned = false): Object(pyob, owned) + { + validate(); + } + + Float (const Float& f): Object(f) + { + validate(); + } + + // make from double + explicit Float (double v=0.0) + : Object(PyFloat_FromDouble (v), true) + { + validate(); + } + + // try to make from any object + Float (const Object& ob) + : Object(PyNumber_Float(*ob), true) + { + validate(); + } + + Float& operator= (const Object& rhs) + { + return (*this = *rhs); + } + + Float& operator= (PyObject* rhsp) + { + if(ptr() == rhsp) return *this; + set (PyNumber_Float(rhsp), true); + return *this; + } + // Membership + virtual bool accepts (PyObject *pyob) const + { + return pyob && Py::_Float_Check (pyob); + } + // convert to double + operator double () const + { + return PyFloat_AsDouble (ptr()); + } + // assign from a double + Float& operator= (double v) + { + set(PyFloat_FromDouble (v), true); + return *this; + } + // assign from an int + Float& operator= (int v) + { + set(PyFloat_FromDouble (double(v)), true); + return *this; + } + // assign from long + Float& operator= (long v) + { + set(PyFloat_FromDouble (double(v)), true); + return *this; + } + // assign from an Int + Float& operator= (const Int& iob) + { + set(PyFloat_FromDouble (double(long(iob))), true); + return *this; + } + }; + + // =============================================== + // class Complex + class Complex: public Object + { + public: + // Constructor + explicit Complex (PyObject *pyob, bool owned = false): Object(pyob, owned) + { + validate(); + } + + Complex (const Complex& f): Object(f) + { + validate(); + } + + // make from double + explicit Complex (double v=0.0, double w=0.0) + :Object(PyComplex_FromDoubles (v, w), true) + { + validate(); + } + + Complex& operator= (const Object& rhs) + { + return (*this = *rhs); + } + + Complex& operator= (PyObject* rhsp) + { + if(ptr() == rhsp) return *this; + set (rhsp); + return *this; + } + // Membership + virtual bool accepts (PyObject *pyob) const + { + return pyob && Py::_Complex_Check (pyob); + } + // convert to Py_complex + operator Py_complex () const + { + return PyComplex_AsCComplex (ptr()); + } + // assign from a Py_complex + Complex& operator= (const Py_complex& v) + { + set(PyComplex_FromCComplex (v), true); + return *this; + } + // assign from a double + Complex& operator= (double v) + { + set(PyComplex_FromDoubles (v, 0.0), true); + return *this; + } + // assign from an int + Complex& operator= (int v) + { + set(PyComplex_FromDoubles (double(v), 0.0), true); + return *this; + } + // assign from long + Complex& operator= (long v) + { + set(PyComplex_FromDoubles (double(v), 0.0), true); + return *this; + } + // assign from an Int + Complex& operator= (const Int& iob) + { + set(PyComplex_FromDoubles (double(long(iob)), 0.0), true); + return *this; + } + + double real() const + { + return PyComplex_RealAsDouble(ptr()); + } + + double imag() const + { + return PyComplex_ImagAsDouble(ptr()); + } + }; + // Sequences + // Sequences are here represented as sequences of items of type T. + // The base class SeqBase represents that. + // In basic Python T is always "Object". + + // seqref is what you get if you get elements from a non-const SeqBase. + // Note: seqref could probably be a nested class in SeqBase but that might stress + // some compilers needlessly. Simlarly for mapref later. + + // While this class is not intended for enduser use, it needs some public + // constructors for the benefit of the STL. + + // See Scott Meyer's More Essential C++ for a description of proxies. + // This application is even more complicated. We are doing an unusual thing + // in having a double proxy. If we want the STL to work + // properly we have to compromise by storing the rvalue inside. The + // entire Object API is repeated so that things like s[i].isList() will + // work properly. + + // Still, once in a while a weird compiler message may occur using expressions like x[i] + // Changing them to Object(x[i]) helps the compiler to understand that the + // conversion of a seqref to an Object is wanted. + + template + class seqref + { + protected: + SeqBase& s; // the sequence + int offset; // item number + T the_item; // lvalue + public: + + seqref (SeqBase& seq, sequence_index_type j) + : s(seq), offset(j), the_item (s.getItem(j)) + {} + + seqref (const seqref& range) + : s(range.s), offset(range.offset), the_item(range.the_item) + {} + + // TMM: added this seqref ctor for use with STL algorithms + seqref (Object& obj) + : s(dynamic_cast< SeqBase&>(obj)) + , offset( NULL ) + , the_item(s.getItem(offset)) + {} + ~seqref() + {} + + operator T() const + { // rvalue + return the_item; + } + + seqref& operator=(const seqref& rhs) + { //used as lvalue + the_item = rhs.the_item; + s.setItem(offset, the_item); + return *this; + } + + seqref& operator=(const T& ob) + { // used as lvalue + the_item = ob; + s.setItem(offset, ob); + return *this; + } + + // forward everything else to the item + PyObject* ptr () const + { + return the_item.ptr(); + } + + int reference_count () const + { // the reference count + return the_item.reference_count(); + } + + Type type () const + { + return the_item.type(); + } + + String str () const; + + String repr () const; + + bool hasAttr (const std::string& attr_name) const + { + return the_item.hasAttr(attr_name); + } + + Object getAttr (const std::string& attr_name) const + { + return the_item.getAttr(attr_name); + } + + Object getItem (const Object& key) const + { + return the_item.getItem(key); + } + + long hashValue () const + { + return the_item.hashValue(); + } + + bool isCallable () const + { + return the_item.isCallable(); + } + + bool isInstance () const + { + return the_item.isInstance(); + } + + bool isDict () const + { + return the_item.isDict(); + } + + bool isList () const + { + return the_item.isList(); + } + + bool isMapping () const + { + return the_item.isMapping(); + } + + bool isNumeric () const + { + return the_item.isNumeric(); + } + + bool isSequence () const + { + return the_item.isSequence(); + } + + bool isTrue () const + { + return the_item.isTrue(); + } + + bool isType (const Type& t) const + { + return the_item.isType (t); + } + + bool isTuple() const + { + return the_item.isTuple(); + } + + bool isString() const + { + return the_item.isString(); + } + // Commands + void setAttr (const std::string& attr_name, const Object& value) + { + the_item.setAttr(attr_name, value); + } + + void delAttr (const std::string& attr_name) + { + the_item.delAttr(attr_name); + } + + void delItem (const Object& key) + { + the_item.delItem(key); + } + + bool operator==(const Object& o2) const + { + return the_item == o2; + } + + bool operator!=(const Object& o2) const + { + return the_item != o2; + } + + bool operator>=(const Object& o2) const + { + return the_item >= o2; + } + + bool operator<=(const Object& o2) const + { + return the_item <= o2; + } + + bool operator<(const Object& o2) const + { + return the_item < o2; + } + + bool operator>(const Object& o2) const + { + return the_item > o2; + } + }; // end of seqref + + + // class SeqBase + // ...the base class for all sequence types + + template + class SeqBase: public Object + { + public: + // STL definitions + typedef size_t size_type; + typedef seqref reference; + typedef T const_reference; + typedef seqref* pointer; + typedef int difference_type; + typedef T value_type; // TMM: 26Jun'01 + + virtual size_type max_size() const + { + return std::string::npos; // ? + } + + virtual size_type capacity() const + { + return size(); + } + + virtual void swap(SeqBase& c) + { + SeqBase temp = c; + c = ptr(); + set(temp.ptr()); + } + + virtual size_type size () const + { + return PySequence_Length (ptr()); + } + + explicit SeqBase () + :Object(PyTuple_New(0), true) + { + validate(); + } + + explicit SeqBase (PyObject* pyob, bool owned=false) + : Object(pyob, owned) + { + validate(); + } + + SeqBase (const Object& ob): Object(ob) + { + validate(); + } + + // Assignment acquires new ownership of pointer + + SeqBase& operator= (const Object& rhs) + { + return (*this = *rhs); + } + + SeqBase& operator= (PyObject* rhsp) + { + if(ptr() == rhsp) return *this; + set (rhsp); + return *this; + } + + virtual bool accepts (PyObject *pyob) const + { + return pyob && PySequence_Check (pyob); + } + + size_type length () const + { + return PySequence_Length (ptr()); + } + + // Element access + const T operator[](sequence_index_type index) const + { + return getItem(index); + } + + seqref operator[](sequence_index_type index) + { + return seqref(*this, index); + } + + virtual T getItem (sequence_index_type i) const + { + return T(asObject(PySequence_GetItem (ptr(), i))); + } + + virtual void setItem (sequence_index_type i, const T& ob) + { + if (PySequence_SetItem (ptr(), i, *ob) == -1) + { + throw Exception(); + } + } + + SeqBase repeat (int count) const + { + return SeqBase (PySequence_Repeat (ptr(), count), true); + } + + SeqBase concat (const SeqBase& other) const + { + return SeqBase (PySequence_Concat(ptr(), *other), true); + } + + // more STL compatability + const T front () const + { + return getItem(0); + } + + seqref front() + { + return seqref(*this, 0); + } + + const T back() const + { + return getItem(size()-1); + } + + seqref back() + { + return seqref(*this, size()-1); + } + + void verify_length(size_type required_size) const + { + if (size() != required_size) + throw IndexError ("Unexpected SeqBase length."); + } + + void verify_length(size_type min_size, size_type max_size) const + { + size_type n = size(); + if (n < min_size || n > max_size) + throw IndexError ("Unexpected SeqBase length."); + } + + class iterator + : public random_access_iterator_parent(seqref) + { + protected: + friend class SeqBase; + SeqBase* seq; + int count; + + public: + ~iterator () + {} + + iterator () + : seq( 0 ) + , count( 0 ) + {} + + iterator (SeqBase* s, int where) + : seq( s ) + , count( where ) + {} + + iterator (const iterator& other) + : seq( other.seq ) + , count( other.count ) + {} + + bool eql (const iterator& other) const + { + return (seq->ptr() == other.seq->ptr()) && (count == other.count); + } + + bool neq (const iterator& other) const + { + return (seq->ptr() != other.seq->ptr()) || (count != other.count); + } + + bool lss (const iterator& other) const + { + return (count < other.count); + } + + bool gtr (const iterator& other) const + { + return (count > other.count); + } + + bool leq (const iterator& other) const + { + return (count <= other.count); + } + + bool geq (const iterator& other) const + { + return (count >= other.count); + } + + seqref operator*() + { + return seqref(*seq, count); + } + + seqref operator[] (sequence_index_type i) + { + return seqref(*seq, count + i); + } + + iterator& operator=(const iterator& other) + { + if (this == &other) return *this; + seq = other.seq; + count = other.count; + return *this; + } + + iterator operator+(int n) const + { + return iterator(seq, count + n); + } + + iterator operator-(int n) const + { + return iterator(seq, count - n); + } + + iterator& operator+=(int n) + { + count = count + n; + return *this; + } + + iterator& operator-=(int n) + { + count = count - n; + return *this; + } + + int operator-(const iterator& other) const + { + if (*seq != *other.seq) + throw RuntimeError ("SeqBase::iterator comparison error"); + return count - other.count; + } + + // prefix ++ + iterator& operator++ () + { count++; return *this;} + // postfix ++ + iterator operator++ (int) + { return iterator(seq, count++);} + // prefix -- + iterator& operator-- () + { count--; return *this;} + // postfix -- + iterator operator-- (int) + { return iterator(seq, count--);} + + std::string diagnose() const + { + std::OSTRSTREAM oss; + oss << "iterator diagnosis " << seq << ", " << count << std::ends; + return std::string(oss.str()); + } + }; // end of class SeqBase::iterator + + iterator begin () + { + return iterator(this, 0); + } + + iterator end () + { + return iterator(this, length()); + } + + class const_iterator + : public random_access_iterator_parent(const Object) + { + protected: + friend class SeqBase; + const SeqBase* seq; + sequence_index_type count; + + private: + const_iterator (const SeqBase* s, int where) + : seq( s ) + , count( where ) + {} + + public: + ~const_iterator () + {} + + const_iterator () + : seq( 0 ) + , count( 0 ) + {} + + const_iterator(const const_iterator& other) + : seq( other.seq ) + , count( other.count ) + {} + + const T operator*() const + { + return seq->getItem(count); + } + + const T operator[] (sequence_index_type i) const + { + return seq->getItem(count + i); + } + + const_iterator& operator=(const const_iterator& other) + { + if (this == &other) return *this; + seq = other.seq; + count = other.count; + return *this; + } + + const_iterator operator+(int n) const + { + return const_iterator(seq, count + n); + } + + bool eql (const const_iterator& other) const + { + return (seq->ptr() == other.seq->ptr()) && (count == other.count); + } + + bool neq (const const_iterator& other) const + { + return (seq->ptr() != other.seq->ptr()) || (count != other.count); + } + + bool lss (const const_iterator& other) const + { + return (count < other.count); + } + + bool gtr (const const_iterator& other) const + { + return (count > other.count); + } + + bool leq (const const_iterator& other) const + { + return (count <= other.count); + } + + bool geq (const const_iterator& other) const + { + return (count >= other.count); + } + + const_iterator operator-(int n) + { + return const_iterator(seq, count - n); + } + + const_iterator& operator+=(int n) + { + count = count + n; + return *this; + } + + const_iterator& operator-=(int n) + { + count = count - n; + return *this; + } + + int operator-(const const_iterator& other) const + { + if (*seq != *other.seq) + throw RuntimeError ("SeqBase::const_iterator::- error"); + return count - other.count; + } + // prefix ++ + const_iterator& operator++ () + { count++; return *this;} + // postfix ++ + const_iterator operator++ (int) + { return const_iterator(seq, count++);} + // prefix -- + const_iterator& operator-- () + { count--; return *this;} + // postfix -- + const_iterator operator-- (int) + { return const_iterator(seq, count--);} + }; // end of class SeqBase::const_iterator + + const_iterator begin () const + { + return const_iterator(this, 0); + } + + const_iterator end () const + { + return const_iterator(this, length()); + } + }; + + // Here's an important typedef you might miss if reading too fast... + typedef SeqBase Sequence; + + template bool operator==(const EXPLICIT_TYPENAME SeqBase::iterator& left, const EXPLICIT_TYPENAME SeqBase::iterator& right); + template bool operator!=(const EXPLICIT_TYPENAME SeqBase::iterator& left, const EXPLICIT_TYPENAME SeqBase::iterator& right); + template bool operator< (const EXPLICIT_TYPENAME SeqBase::iterator& left, const EXPLICIT_TYPENAME SeqBase::iterator& right); + template bool operator> (const EXPLICIT_TYPENAME SeqBase::iterator& left, const EXPLICIT_TYPENAME SeqBase::iterator& right); + template bool operator<=(const EXPLICIT_TYPENAME SeqBase::iterator& left, const EXPLICIT_TYPENAME SeqBase::iterator& right); + template bool operator>=(const EXPLICIT_TYPENAME SeqBase::iterator& left, const EXPLICIT_TYPENAME SeqBase::iterator& right); + + template bool operator==(const EXPLICIT_TYPENAME SeqBase::const_iterator& left, const EXPLICIT_TYPENAME SeqBase::const_iterator& right); + template bool operator!=(const EXPLICIT_TYPENAME SeqBase::const_iterator& left, const EXPLICIT_TYPENAME SeqBase::const_iterator& right); + template bool operator< (const EXPLICIT_TYPENAME SeqBase::const_iterator& left, const EXPLICIT_TYPENAME SeqBase::const_iterator& right); + template bool operator> (const EXPLICIT_TYPENAME SeqBase::const_iterator& left, const EXPLICIT_TYPENAME SeqBase::const_iterator& right); + template bool operator<=(const EXPLICIT_TYPENAME SeqBase::const_iterator& left, const EXPLICIT_TYPENAME SeqBase::const_iterator& right); + template bool operator>=(const EXPLICIT_TYPENAME SeqBase::const_iterator& left, const EXPLICIT_TYPENAME SeqBase::const_iterator& right); + + + extern bool operator==(const Sequence::iterator& left, const Sequence::iterator& right); + extern bool operator!=(const Sequence::iterator& left, const Sequence::iterator& right); + extern bool operator< (const Sequence::iterator& left, const Sequence::iterator& right); + extern bool operator> (const Sequence::iterator& left, const Sequence::iterator& right); + extern bool operator<=(const Sequence::iterator& left, const Sequence::iterator& right); + extern bool operator>=(const Sequence::iterator& left, const Sequence::iterator& right); + + extern bool operator==(const Sequence::const_iterator& left, const Sequence::const_iterator& right); + extern bool operator!=(const Sequence::const_iterator& left, const Sequence::const_iterator& right); + extern bool operator< (const Sequence::const_iterator& left, const Sequence::const_iterator& right); + extern bool operator> (const Sequence::const_iterator& left, const Sequence::const_iterator& right); + extern bool operator<=(const Sequence::const_iterator& left, const Sequence::const_iterator& right); + extern bool operator>=(const Sequence::const_iterator& left, const Sequence::const_iterator& right); + + // ================================================== + // class Char + // Python strings return strings as individual elements. + // I'll try having a class Char which is a String of length 1 + // + typedef std::basic_string unicodestring; + extern Py_UNICODE unicode_null_string[1]; + + class Char: public Object + { + public: + explicit Char (PyObject *pyob, bool owned = false): Object(pyob, owned) + { + validate(); + } + + Char (const Object& ob): Object(ob) + { + validate(); + } + + Char (const std::string& v = "") + :Object(PyString_FromStringAndSize (const_cast(v.c_str()),1), true) + { + validate(); + } + + Char (char v) + : Object(PyString_FromStringAndSize (&v, 1), true) + { + validate(); + } + + Char (Py_UNICODE v) + : Object(PyUnicode_FromUnicode (&v, 1), true) + { + validate(); + } + // Assignment acquires new ownership of pointer + Char& operator= (const Object& rhs) + { + return (*this = *rhs); + } + + Char& operator= (PyObject* rhsp) + { + if(ptr() == rhsp) return *this; + set (rhsp); + return *this; + } + + // Membership + virtual bool accepts (PyObject *pyob) const + { + return pyob && (Py::_String_Check(pyob) || Py::_Unicode_Check(pyob)) && PySequence_Length (pyob) == 1; + } + + // Assignment from C string + Char& operator= (const std::string& v) + { + set(PyString_FromStringAndSize (const_cast(v.c_str()),1), true); + return *this; + } + + Char& operator= (char v) + { + set(PyString_FromStringAndSize (&v, 1), true); + return *this; + } + + Char& operator= (const unicodestring& v) + { + set(PyUnicode_FromUnicode (const_cast(v.data()),1), true); + return *this; + } + + Char& operator= (Py_UNICODE v) + { + set(PyUnicode_FromUnicode (&v, 1), true); + return *this; + } + + // Conversion + operator String() const; + + operator std::string () const + { + return std::string(PyString_AsString (ptr())); + } + }; + +#ifdef PYCXX_PYTHON_2TO3 + // String and Bytes compatible with Python3 version in 6.0.0 PyCXX + class Bytes; + + class String: public SeqBase + { + public: + virtual size_type capacity() const + { + return max_size(); + } + + explicit String( PyObject *pyob, bool owned = false) + : SeqBase( pyob, owned ) + { + validate(); + } + + String( const Object& ob): SeqBase(ob) + { + validate(); + } + + String() + : SeqBase( PyString_FromStringAndSize( "", 0 ), true ) + { + validate(); + } + + String( const std::string& v ) + : SeqBase( PyString_FromStringAndSize( const_cast(v.data()), + static_cast( v.length() ) ), true ) + { + validate(); + } + + String( const char *s, const char *encoding, const char *error="strict" ) + : SeqBase( PyUnicode_Decode( s, strlen( s ), encoding, error ), true ) + { + validate(); + } + + String( const char *s, int len, const char *encoding, const char *error="strict" ) + : SeqBase( PyUnicode_Decode( s, len, encoding, error ), true ) + { + validate(); + } + + String( const std::string &s, const char *encoding, const char *error="strict" ) + : SeqBase( PyUnicode_Decode( s.c_str(), s.length(), encoding, error ), true ) + { + validate(); + } + + String( const std::string& v, std::string::size_type vsize ) + : SeqBase(PyString_FromStringAndSize( const_cast(v.data()), + static_cast( vsize ) ), true) + { + validate(); + } + + String( const char *v, int vsize ) + : SeqBase(PyString_FromStringAndSize( const_cast(v), vsize ), true ) + { + validate(); + } + + String( const char* v ) + : SeqBase( PyString_FromString( v ), true ) + { + validate(); + } + + // Assignment acquires new ownership of pointer + String& operator= ( const Object& rhs ) + { + return *this = *rhs; + } + + String& operator= (PyObject* rhsp) + { + if( ptr() == rhsp ) + return *this; + set (rhsp); + return *this; + } + // Membership + virtual bool accepts (PyObject *pyob) const + { + return pyob && (Py::_String_Check(pyob) || Py::_Unicode_Check(pyob)); + } + + // Assignment from C string + String& operator= (const std::string& v) + { + set( PyString_FromStringAndSize( const_cast( v.data() ), + static_cast( v.length() ) ), true ); + return *this; + } + String& operator= (const unicodestring& v) + { + set( PyUnicode_FromUnicode( const_cast( v.data() ), + static_cast( v.length() ) ), true ); + return *this; + } + + + // Encode + Bytes encode( const char *encoding, const char *error="strict" ) const; + + // Queries + virtual size_type size () const + { + if( isUnicode() ) + { + return static_cast( PyUnicode_GET_SIZE (ptr()) ); + } + else + { + return static_cast( PyString_Size (ptr()) ); + } + } + + operator std::string () const + { + return as_std_string( "utf-8" ); + } + + std::string as_std_string( const char *encoding, const char *error="strict" ) const; + + unicodestring as_unicodestring() const + { + if( isUnicode() ) + { + return unicodestring( PyUnicode_AS_UNICODE( ptr() ), + static_cast( PyUnicode_GET_SIZE( ptr() ) ) ); + } + else + { + throw TypeError("can only return unicodestring from Unicode object"); + } + } + }; + class Bytes: public SeqBase + { + public: + virtual size_type capacity() const + { + return max_size(); + } + + explicit Bytes (PyObject *pyob, bool owned = false): SeqBase(pyob, owned) + { + validate(); + } + + Bytes (const Object& ob): SeqBase(ob) + { + validate(); + } + + Bytes() + : SeqBase( PyString_FromStringAndSize( "", 0 ), true ) + { + validate(); + } + + Bytes( const std::string& v ) + : SeqBase( PyString_FromStringAndSize( const_cast(v.data()), static_cast( v.length() ) ), true ) + { + validate(); + } + + Bytes( const std::string& v, std::string::size_type vsize ) + : SeqBase(PyString_FromStringAndSize( const_cast(v.data()), static_cast( vsize ) ), true) + { + validate(); + } + + Bytes( const char *v, int vsize ) + : SeqBase(PyString_FromStringAndSize( const_cast(v), vsize ), true ) + { + validate(); + } + + Bytes( const char *v ) + : SeqBase( PyString_FromString( v ), true ) + { + validate(); + } + + // Assignment acquires new ownership of pointer + Bytes &operator= ( const Object& rhs ) + { + return *this = *rhs; + } + + Bytes &operator= (PyObject *rhsp) + { + if( ptr() == rhsp ) + return *this; + set (rhsp); + return *this; + } + // Membership + virtual bool accepts( PyObject *pyob ) const + { + return pyob && (Py::_String_Check( pyob ) || Py::_Unicode_Check( pyob )); + } + + // Assignment from C string + Bytes &operator= (const std::string& v) + { + set( PyString_FromStringAndSize( const_cast( v.data() ), + static_cast( v.length() ) ), true ); + return *this; + } + Bytes &operator= (const unicodestring& v) + { + set( PyUnicode_FromUnicode( const_cast( v.data() ), + static_cast( v.length() ) ), true ); + return *this; + } + + String decode( const char *encoding, const char *error="strict" ) + { + return Object( PyString_AsDecodedObject( ptr(), encoding, error ) ); + } + + // Queries + virtual size_type size () const + { + if( isUnicode() ) + { + return static_cast( PyUnicode_GET_SIZE (ptr()) ); + } + else + { + return static_cast( PyString_Size (ptr()) ); + } + } + + operator std::string () const + { + return as_std_string(); + } + + std::string as_std_string() const + { + if( isUnicode() ) + { + throw TypeError("cannot return std::string from Unicode object"); + } + else + { + return std::string( PyString_AsString( ptr() ), static_cast( PyString_Size( ptr() ) ) ); + } + } + + unicodestring as_unicodestring() const + { + if( isUnicode() ) + { + return unicodestring( PyUnicode_AS_UNICODE( ptr() ), + static_cast( PyUnicode_GET_SIZE( ptr() ) ) ); + } + else + { + throw TypeError("can only return unicodestring from Unicode object"); + } + } + }; + +#else + // original PyCXX 5.4.x version of String + class String: public SeqBase + { + public: + virtual size_type capacity() const + { + return max_size(); + } + + explicit String (PyObject *pyob, bool owned = false): SeqBase(pyob, owned) + { + validate(); + } + + String (const Object& ob): SeqBase(ob) + { + validate(); + } + + String() + : SeqBase( PyString_FromStringAndSize( "", 0 ), true ) + { + validate(); + } + + String( const std::string& v ) + : SeqBase( PyString_FromStringAndSize( const_cast(v.data()), + static_cast( v.length() ) ), true ) + { + validate(); + } + + String( const char *s, const char *encoding, const char *error="strict" ) + : SeqBase( PyUnicode_Decode( s, strlen( s ), encoding, error ), true ) + { + validate(); + } + + String( const char *s, int len, const char *encoding, const char *error="strict" ) + : SeqBase( PyUnicode_Decode( s, len, encoding, error ), true ) + { + validate(); + } + + String( const std::string &s, const char *encoding, const char *error="strict" ) + : SeqBase( PyUnicode_Decode( s.c_str(), s.length(), encoding, error ), true ) + { + validate(); + } + + String( const std::string& v, std::string::size_type vsize ) + : SeqBase(PyString_FromStringAndSize( const_cast(v.data()), + static_cast( vsize ) ), true) + { + validate(); + } + + String( const char *v, int vsize ) + : SeqBase(PyString_FromStringAndSize( const_cast(v), vsize ), true ) + { + validate(); + } + + String( const char* v ) + : SeqBase( PyString_FromString( v ), true ) + { + validate(); + } + + // Assignment acquires new ownership of pointer + String& operator= ( const Object& rhs ) + { + return *this = *rhs; + } + + String& operator= (PyObject* rhsp) + { + if( ptr() == rhsp ) + return *this; + set (rhsp); + return *this; + } + // Membership + virtual bool accepts (PyObject *pyob) const + { + return pyob && (Py::_String_Check(pyob) || Py::_Unicode_Check(pyob)); + } + + // Assignment from C string + String& operator= (const std::string& v) + { + set( PyString_FromStringAndSize( const_cast( v.data() ), + static_cast( v.length() ) ), true ); + return *this; + } + String& operator= (const unicodestring& v) + { + set( PyUnicode_FromUnicode( const_cast( v.data() ), + static_cast( v.length() ) ), true ); + return *this; + } + + + // Encode + String encode( const char *encoding, const char *error="strict" ) const + { + if( isUnicode() ) + { + return String( PyUnicode_AsEncodedString( ptr(), encoding, error ) ); + } + else + { + return String( PyString_AsEncodedObject( ptr(), encoding, error ) ); + } + } + + String decode( const char *encoding, const char *error="strict" ) + { + return Object( PyString_AsDecodedObject( ptr(), encoding, error ) ); + } + + // Queries + virtual size_type size () const + { + if( isUnicode() ) + { + return static_cast( PyUnicode_GET_SIZE (ptr()) ); + } + else + { + return static_cast( PyString_Size (ptr()) ); + } + } + + operator std::string () const + { + return as_std_string(); + } + + std::string as_std_string() const + { + if( isUnicode() ) + { + throw TypeError("cannot return std::string from Unicode object"); + } + else + { + return std::string( PyString_AsString( ptr() ), static_cast( PyString_Size( ptr() ) ) ); + } + } + + std::string as_std_string( const char *encoding, const char *error="strict" ) const; + + unicodestring as_unicodestring() const + { + if( isUnicode() ) + { + return unicodestring( PyUnicode_AS_UNICODE( ptr() ), + static_cast( PyUnicode_GET_SIZE( ptr() ) ) ); + } + else + { + throw TypeError("can only return unicodestring from Unicode object"); + } + } + }; +#endif + + // ================================================== + // class Tuple + class Tuple: public Sequence + { + public: + virtual void setItem (sequence_index_type offset, const Object&ob) + { + // note PyTuple_SetItem is a thief... + if(PyTuple_SetItem (ptr(), offset, new_reference_to(ob)) == -1) + { + throw Exception(); + } + } + + // Constructor + explicit Tuple (PyObject *pyob, bool owned = false): Sequence (pyob, owned) + { + validate(); + } + + Tuple (const Object& ob): Sequence(ob) + { + validate(); + } + + // New tuple of a given size + explicit Tuple (int size = 0) + { + set(PyTuple_New (size), true); + validate (); + for (sequence_index_type i=0; i < size; i++) + { + if(PyTuple_SetItem (ptr(), i, new_reference_to(Py::_None())) == -1) + { + throw Exception(); + } + } + } + // Tuple from any sequence + explicit Tuple (const Sequence& s) + { + sequence_index_type limit( sequence_index_type( s.length() ) ); + + set(PyTuple_New (limit), true); + validate(); + + for(sequence_index_type i=0; i < limit; i++) + { + if(PyTuple_SetItem (ptr(), i, new_reference_to(s[i])) == -1) + { + throw Exception(); + } + } + } + // Assignment acquires new ownership of pointer + + Tuple& operator= (const Object& rhs) + { + return (*this = *rhs); + } + + Tuple& operator= (PyObject* rhsp) + { + if(ptr() == rhsp) return *this; + set (rhsp); + return *this; + } + // Membership + virtual bool accepts (PyObject *pyob) const + { + return pyob && Py::_Tuple_Check (pyob); + } + + Tuple getSlice (int i, int j) const + { + return Tuple (PySequence_GetSlice (ptr(), i, j), true); + } + + }; + + // ================================================== + // class List + + class List: public Sequence + { + public: + // Constructor + explicit List (PyObject *pyob, bool owned = false): Sequence(pyob, owned) + { + validate(); + } + List (const Object& ob): Sequence(ob) + { + validate(); + } + // Creation at a fixed size + List (int size = 0) + { + set(PyList_New (size), true); + validate(); + for (sequence_index_type i=0; i < size; i++) + { + if(PyList_SetItem (ptr(), i, new_reference_to(Py::_None())) == -1) + { + throw Exception(); + } + } + } + + // List from a sequence + List (const Sequence& s): Sequence() + { + int n = (int)s.length(); + set(PyList_New (n), true); + validate(); + for (sequence_index_type i=0; i < n; i++) + { + if(PyList_SetItem (ptr(), i, new_reference_to(s[i])) == -1) + { + throw Exception(); + } + } + } + + virtual size_type capacity() const + { + return max_size(); + } + // Assignment acquires new ownership of pointer + + List& operator= (const Object& rhs) + { + return (*this = *rhs); + } + + List& operator= (PyObject* rhsp) + { + if(ptr() == rhsp) return *this; + set (rhsp); + return *this; + } + // Membership + virtual bool accepts (PyObject *pyob) const + { + return pyob && Py::_List_Check (pyob); + } + + List getSlice (int i, int j) const + { + return List (PyList_GetSlice (ptr(), i, j), true); + } + + void setSlice (int i, int j, const Object& v) + { + if(PyList_SetSlice (ptr(), i, j, *v) == -1) + { + throw Exception(); + } + } + + void append (const Object& ob) + { + if(PyList_Append (ptr(), *ob) == -1) + { + throw Exception(); + } + } + + void insert (int i, const Object& ob) + { + if(PyList_Insert (ptr(), i, *ob) == -1) + { + throw Exception(); + } + } + + void sort () + { + if(PyList_Sort(ptr()) == -1) + { + throw Exception(); + } + } + + void reverse () + { + if(PyList_Reverse(ptr()) == -1) + { + throw Exception(); + } + } + }; + + + // Mappings + // ================================================== + template + class mapref + { + protected: + MapBase& s; // the map + Object key; // item key + T the_item; + + public: + mapref (MapBase& map, const std::string& k) + : s(map), the_item() + { + key = String(k); + if(map.hasKey(key)) the_item = map.getItem(key); + } + + mapref (MapBase& map, const Object& k) + : s(map), key(k), the_item() + { + if(map.hasKey(key)) the_item = map.getItem(key); + } + + virtual ~mapref() + {} + + // MapBase stuff + // lvalue + mapref& operator=(const mapref& other) + { + if(this == &other) return *this; + the_item = other.the_item; + s.setItem(key, other.the_item); + return *this; + } + + mapref& operator= (const T& ob) + { + the_item = ob; + s.setItem (key, ob); + return *this; + } + + // rvalue + operator T() const + { + return the_item; + } + + // forward everything else to the_item + PyObject* ptr () const + { + return the_item.ptr(); + } + + int reference_count () const + { // the mapref count + return the_item.reference_count(); + } + + Type type () const + { + return the_item.type(); + } + + String str () const + { + return the_item.str(); + } + + String repr () const + { + return the_item.repr(); + } + + bool hasAttr (const std::string& attr_name) const + { + return the_item.hasAttr(attr_name); + } + + Object getAttr (const std::string& attr_name) const + { + return the_item.getAttr(attr_name); + } + + Object getItem (const Object& k) const + { + return the_item.getItem(k); + } + + long hashValue () const + { + return the_item.hashValue(); + } + + bool isCallable () const + { + return the_item.isCallable(); + } + + bool isInstance () const + { + return the_item.isInstance(); + } + + bool isList () const + { + return the_item.isList(); + } + + bool isMapping () const + { + return the_item.isMapping(); + } + + bool isNumeric () const + { + return the_item.isNumeric(); + } + + bool isSequence () const + { + return the_item.isSequence(); + } + + bool isTrue () const + { + return the_item.isTrue(); + } + + bool isType (const Type& t) const + { + return the_item.isType (t); + } + + bool isTuple() const + { + return the_item.isTuple(); + } + + bool isString() const + { + return the_item.isString(); + } + + // Commands + void setAttr (const std::string& attr_name, const Object& value) + { + the_item.setAttr(attr_name, value); + } + + void delAttr (const std::string& attr_name) + { + the_item.delAttr(attr_name); + } + + void delItem (const Object& k) + { + the_item.delItem(k); + } + }; // end of mapref + + // TMM: now for mapref + template< class T > + bool operator==(const mapref& left, const mapref& right) + { + return true; // NOT completed. + } + + template< class T > + bool operator!=(const mapref& left, const mapref& right) + { + return true; // not completed. + } + + template + class MapBase: public Object + { + protected: + explicit MapBase() + {} + public: + // reference: proxy class for implementing [] + // TMM: 26Jun'01 - the types + // If you assume that Python mapping is a hash_map... + // hash_map::value_type is not assignable, but + // (*it).second = data must be a valid expression + typedef size_t size_type; + typedef Object key_type; + typedef mapref data_type; + typedef std::pair< const T, T > value_type; + typedef std::pair< const T, mapref > reference; + typedef const std::pair< const T, const T > const_reference; + typedef std::pair< const T, mapref > pointer; + + // Constructor + explicit MapBase (PyObject *pyob, bool owned = false): Object(pyob, owned) + { + validate(); + } + + // TMM: 02Jul'01 - changed MapBase to Object in next line + MapBase (const Object& ob): Object(ob) + { + validate(); + } + + // Assignment acquires new ownership of pointer + MapBase& operator= (const Object& rhs) + { + return (*this = *rhs); + } + + MapBase& operator= (PyObject* rhsp) + { + if(ptr() == rhsp) return *this; + set (rhsp); + return *this; + } + // Membership + virtual bool accepts (PyObject *pyob) const + { + return pyob && PyMapping_Check(pyob); + } + + // Clear -- PyMapping Clear is missing + // + + void clear () + { + List k = keys(); + for(List::iterator i = k.begin(); i != k.end(); i++) + { + delItem(*i); + } + } + + virtual size_type size() const + { + return PyMapping_Length (ptr()); + } + + // Element Access + T operator[](const std::string& key) const + { + return getItem(key); + } + + T operator[](const Object& key) const + { + return getItem(key); + } + + mapref operator[](const std::string& key) + { + return mapref(*this, key); + } + + mapref operator[](const Object& key) + { + return mapref(*this, key); + } + + int length () const + { + return PyMapping_Length (ptr()); + } + + bool hasKey (const std::string& s) const + { + return PyMapping_HasKeyString (ptr(),const_cast(s.c_str())) != 0; + } + + bool hasKey (const Object& s) const + { + return PyMapping_HasKey (ptr(), s.ptr()) != 0; + } + + T getItem (const std::string& s) const + { + return T( + asObject(PyMapping_GetItemString (ptr(),const_cast(s.c_str()))) + ); + } + + T getItem (const Object& s) const + { + return T( + asObject(PyObject_GetItem (ptr(), s.ptr())) + ); + } + + virtual void setItem (const char *s, const Object& ob) + { + if (PyMapping_SetItemString (ptr(), const_cast(s), *ob) == -1) + { + throw Exception(); + } + } + + virtual void setItem (const std::string& s, const Object& ob) + { + if (PyMapping_SetItemString (ptr(), const_cast(s.c_str()), *ob) == -1) + { + throw Exception(); + } + } + + virtual void setItem (const Object& s, const Object& ob) + { + if (PyObject_SetItem (ptr(), s.ptr(), ob.ptr()) == -1) + { + throw Exception(); + } + } + + void delItem (const std::string& s) + { + if (PyMapping_DelItemString (ptr(), const_cast(s.c_str())) == -1) + { + throw Exception(); + } + } + + void delItem (const Object& s) + { + if (PyMapping_DelItem (ptr(), *s) == -1) + { + throw Exception(); + } + } + // Queries + List keys () const + { + return List(PyMapping_Keys(ptr()), true); + } + + List values () const + { // each returned item is a (key, value) pair + return List(PyMapping_Values(ptr()), true); + } + + List items () const + { + return List(PyMapping_Items(ptr()), true); + } + + class iterator + { + // : public forward_iterator_parent( std::pair ) { + protected: + typedef std::forward_iterator_tag iterator_category; + typedef std::pair< const T, T > value_type; + typedef int difference_type; + typedef std::pair< const T, mapref > pointer; + typedef std::pair< const T, mapref > reference; + + friend class MapBase; + // + MapBase* map; + List keys; // for iterating over the map + int pos; // index into the keys + + private: + iterator( MapBase* m, List k, int p ) + : map( m ) + , keys( k ) + , pos( p ) + {} + + public: + ~iterator () + {} + + iterator () + : map( 0 ) + , keys() + , pos() + {} + + iterator (MapBase* m, bool end = false ) + : map( m ) + , keys( m->keys() ) + , pos( end ? keys.length() : 0 ) + {} + + iterator (const iterator& other) + : map( other.map ) + , keys( other.keys ) + , pos( other.pos ) + {} + + reference operator*() + { + Object key = keys[ pos ]; + return std::make_pair(key, mapref(*map,key)); + } + + iterator& operator=(const iterator& other) + { + if (this == &other) + return *this; + map = other.map; + keys = other.keys; + pos = other.pos; + return *this; + } + + bool eql(const iterator& right) const + { + return map->ptr() == right.map->ptr() && pos == right.pos; + } + bool neq( const iterator& right ) const + { + return map->ptr() != right.map->ptr() || pos != right.pos; + } + + // pointer operator->() { + // return ; + // } + + // prefix ++ + iterator& operator++ () + { pos++; return *this;} + // postfix ++ + iterator operator++ (int) + { return iterator(map, keys, pos++);} + // prefix -- + iterator& operator-- () + { pos--; return *this;} + // postfix -- + iterator operator-- (int) + { return iterator(map, keys, pos--);} + + std::string diagnose() const + { + std::OSTRSTREAM oss; + oss << "iterator diagnosis " << map << ", " << pos << std::ends; + return std::string(oss.str()); + } + }; // end of class MapBase::iterator + + iterator begin () + { + return iterator(this); + } + + iterator end () + { + return iterator(this, true); + } + + class const_iterator + { + protected: + typedef std::forward_iterator_tag iterator_category; + typedef const std::pair< const T, T > value_type; + typedef int difference_type; + typedef const std::pair< const T, T > pointer; + typedef const std::pair< const T, T > reference; + + friend class MapBase; + const MapBase* map; + List keys; // for iterating over the map + int pos; // index into the keys + + private: + const_iterator( const MapBase* m, List k, int p ) + : map( m ) + , keys( k ) + , pos( p ) + {} + + public: + ~const_iterator () + {} + + const_iterator () + : map( 0 ) + , keys() + , pos() + {} + + const_iterator (const MapBase* m, bool end = false ) + : map( m ) + , keys( m->keys() ) + , pos( end ? keys.length() : 0 ) + {} + + const_iterator(const const_iterator& other) + : map( other.map ) + , keys( other.keys ) + , pos( other.pos ) + {} + + bool eql(const const_iterator& right) const + { + return map->ptr() == right.map->ptr() && pos == right.pos; + } + + bool neq( const const_iterator& right ) const + { + return map->ptr() != right.map->ptr() || pos != right.pos; + } + + const_reference operator*() + { + Object key = keys[ pos ]; + return std::make_pair( key, mapref( *map, key ) ); + } + + const_iterator& operator=(const const_iterator& other) + { + if (this == &other) return *this; + map = other.map; + keys = other.keys; + pos = other.pos; + return *this; + } + + // prefix ++ + const_iterator& operator++ () + { pos++; return *this;} + // postfix ++ + const_iterator operator++ (int) + { return const_iterator(map, keys, pos++);} + // prefix -- + const_iterator& operator-- () + { pos--; return *this;} + // postfix -- + const_iterator operator-- (int) + { return const_iterator(map, keys, pos--);} + }; // end of class MapBase::const_iterator + + const_iterator begin () const + { + return const_iterator(this); + } + + const_iterator end () const + { + return const_iterator(this, true); + } + + }; // end of MapBase + + typedef MapBase Mapping; + + template bool operator==(const EXPLICIT_TYPENAME MapBase::iterator& left, const EXPLICIT_TYPENAME MapBase::iterator& right); + template bool operator!=(const EXPLICIT_TYPENAME MapBase::iterator& left, const EXPLICIT_TYPENAME MapBase::iterator& right); + template bool operator==(const EXPLICIT_TYPENAME MapBase::const_iterator& left, const EXPLICIT_TYPENAME MapBase::const_iterator& right); + template bool operator!=(const EXPLICIT_TYPENAME MapBase::const_iterator& left, const EXPLICIT_TYPENAME MapBase::const_iterator& right); + + extern bool operator==(const Mapping::iterator& left, const Mapping::iterator& right); + extern bool operator!=(const Mapping::iterator& left, const Mapping::iterator& right); + extern bool operator==(const Mapping::const_iterator& left, const Mapping::const_iterator& right); + extern bool operator!=(const Mapping::const_iterator& left, const Mapping::const_iterator& right); + + + // ================================================== + // class Dict + class Dict: public Mapping + { + public: + // Constructor + explicit Dict (PyObject *pyob, bool owned=false): Mapping (pyob, owned) + { + validate(); + } + Dict (const Object& ob): Mapping(ob) + { + validate(); + } + // Creation + Dict () + { + set(PyDict_New (), true); + validate(); + } + // Assignment acquires new ownership of pointer + + Dict& operator= (const Object& rhs) + { + return (*this = *rhs); + } + + Dict& operator= (PyObject* rhsp) + { + if(ptr() == rhsp) return *this; + set(rhsp); + return *this; + } + // Membership + virtual bool accepts (PyObject *pyob) const + { + return pyob && Py::_Dict_Check (pyob); + } + }; + + class Callable: public Object + { + public: + // Constructor + explicit Callable (): Object() {} + explicit Callable (PyObject *pyob, bool owned = false): Object (pyob, owned) + { + validate(); + } + + Callable (const Object& ob): Object(ob) + { + validate(); + } + + // Assignment acquires new ownership of pointer + + Callable& operator= (const Object& rhs) + { + return (*this = *rhs); + } + + Callable& operator= (PyObject* rhsp) + { + if(ptr() == rhsp) return *this; + set (rhsp); + return *this; + } + + // Membership + virtual bool accepts (PyObject *pyob) const + { + return pyob && PyCallable_Check (pyob); + } + + // Call + Object apply(const Tuple& args) const + { + return asObject(PyObject_CallObject(ptr(), args.ptr())); + } + + // Call with keywords + Object apply(const Tuple& args, const Dict& kw) const + { + return asObject( PyEval_CallObjectWithKeywords( ptr(), args.ptr(), kw.ptr() ) ); + } + + Object apply(PyObject* pargs = 0) const + { + return apply (Tuple(pargs)); + } + }; + + class Module: public Object + { + public: + explicit Module (PyObject* pyob, bool owned = false): Object (pyob, owned) + { + validate(); + } + + // Construct from module name + explicit Module (const std::string&s): Object() + { + PyObject *m = PyImport_AddModule( const_cast(s.c_str()) ); + set( m, false ); + validate (); + } + + // Copy constructor acquires new ownership of pointer + Module (const Module& ob): Object(*ob) + { + validate(); + } + + Module& operator= (const Object& rhs) + { + return (*this = *rhs); + } + + Module& operator= (PyObject* rhsp) + { + if(ptr() == rhsp) return *this; + set(rhsp); + return *this; + } + + Dict getDict() + { + return Dict(PyModule_GetDict(ptr())); + // Caution -- PyModule_GetDict returns borrowed reference! + } + }; + + // Numeric interface + inline Object operator+ (const Object& a) + { + return asObject(PyNumber_Positive(*a)); + } + inline Object operator- (const Object& a) + { + return asObject(PyNumber_Negative(*a)); + } + + inline Object abs(const Object& a) + { + return asObject(PyNumber_Absolute(*a)); + } + + inline std::pair coerce(const Object& a, const Object& b) + { + PyObject *p1, *p2; + p1 = *a; + p2 = *b; + if(PyNumber_Coerce(&p1,&p2) == -1) + { + throw Exception(); + } + return std::pair(asObject(p1), asObject(p2)); + } + + inline Object operator+ (const Object& a, const Object& b) + { + return asObject(PyNumber_Add(*a, *b)); + } + inline Object operator+ (const Object& a, int j) + { + return asObject(PyNumber_Add(*a, *Int(j))); + } + inline Object operator+ (const Object& a, double v) + { + return asObject(PyNumber_Add(*a, *Float(v))); + } + inline Object operator+ (int j, const Object& b) + { + return asObject(PyNumber_Add(*Int(j), *b)); + } + inline Object operator+ (double v, const Object& b) + { + return asObject(PyNumber_Add(*Float(v), *b)); + } + + inline Object operator- (const Object& a, const Object& b) + { + return asObject(PyNumber_Subtract(*a, *b)); + } + inline Object operator- (const Object& a, int j) + { + return asObject(PyNumber_Subtract(*a, *Int(j))); + } + inline Object operator- (const Object& a, double v) + { + return asObject(PyNumber_Subtract(*a, *Float(v))); + } + inline Object operator- (int j, const Object& b) + { + return asObject(PyNumber_Subtract(*Int(j), *b)); + } + inline Object operator- (double v, const Object& b) + { + return asObject(PyNumber_Subtract(*Float(v), *b)); + } + + inline Object operator* (const Object& a, const Object& b) + { + return asObject(PyNumber_Multiply(*a, *b)); + } + inline Object operator* (const Object& a, int j) + { + return asObject(PyNumber_Multiply(*a, *Int(j))); + } + inline Object operator* (const Object& a, double v) + { + return asObject(PyNumber_Multiply(*a, *Float(v))); + } + inline Object operator* (int j, const Object& b) + { + return asObject(PyNumber_Multiply(*Int(j), *b)); + } + inline Object operator* (double v, const Object& b) + { + return asObject(PyNumber_Multiply(*Float(v), *b)); + } + + inline Object operator/ (const Object& a, const Object& b) + { + return asObject(PyNumber_Divide(*a, *b)); + } + inline Object operator/ (const Object& a, int j) + { + return asObject(PyNumber_Divide(*a, *Int(j))); + } + inline Object operator/ (const Object& a, double v) + { + return asObject(PyNumber_Divide(*a, *Float(v))); + } + inline Object operator/ (int j, const Object& b) + { + return asObject(PyNumber_Divide(*Int(j), *b)); + } + inline Object operator/ (double v, const Object& b) + { + return asObject(PyNumber_Divide(*Float(v), *b)); + } + + inline Object operator% (const Object& a, const Object& b) + { + return asObject(PyNumber_Remainder(*a, *b)); + } + inline Object operator% (const Object& a, int j) + { + return asObject(PyNumber_Remainder(*a, *Int(j))); + } + inline Object operator% (const Object& a, double v) + { + return asObject(PyNumber_Remainder(*a, *Float(v))); + } + inline Object operator% (int j, const Object& b) + { + return asObject(PyNumber_Remainder(*Int(j), *b)); + } + inline Object operator% (double v, const Object& b) + { + return asObject(PyNumber_Remainder(*Float(v), *b)); + } + + inline Object type(const Exception&) // return the type of the error + { + PyObject *ptype, *pvalue, *ptrace; + PyErr_Fetch(&ptype, &pvalue, &ptrace); + Object result; + if(ptype) result = ptype; + PyErr_Restore(ptype, pvalue, ptrace); + return result; + } + + inline Object value(const Exception&) // return the value of the error + { + PyObject *ptype, *pvalue, *ptrace; + PyErr_Fetch(&ptype, &pvalue, &ptrace); + Object result; + if(pvalue) result = pvalue; + PyErr_Restore(ptype, pvalue, ptrace); + return result; + } + + inline Object trace(const Exception&) // return the traceback of the error + { + PyObject *ptype, *pvalue, *ptrace; + PyErr_Fetch(&ptype, &pvalue, &ptrace); + Object result; + if(ptrace) result = ptrace; + PyErr_Restore(ptype, pvalue, ptrace); + return result; + } + +template +String seqref::str () const +{ + return the_item.str(); +} + +template +String seqref::repr () const +{ + return the_item.repr(); +} + +} // namespace Py +#endif // __CXX_Objects__h diff -Nru matplotlib-0.99.3/CXX/Python2/PythonType.hxx matplotlib-1.0.1/CXX/Python2/PythonType.hxx --- matplotlib-0.99.3/CXX/Python2/PythonType.hxx 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/CXX/Python2/PythonType.hxx 2010-07-07 01:41:52.000000000 +0000 @@ -0,0 +1,117 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// 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 disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED 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 REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY 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. +// +//----------------------------------------------------------------------------- + +#ifndef __CXX_PythonType__h +#define __CXX_PythonType__h + +namespace Py +{ + class PythonType + { + public: + // if you define one sequence method you must define + // all of them except the assigns + + PythonType( size_t base_size, int itemsize, const char *default_name ); + virtual ~PythonType(); + + const char *getName() const; + const char *getDoc() const; + + PyTypeObject *type_object() const; + PythonType &name( const char *nam ); + PythonType &doc( const char *d ); + + PythonType &supportClass( void ); +#if !defined( PY3 ) + PythonType &dealloc( void (*f)( PyObject* ) ); +#endif +#if defined( PYCXX_PYTHON_2TO3 ) || !defined( PY3 ) + PythonType &supportPrint( void ); +#endif + PythonType &supportGetattr( void ); + PythonType &supportSetattr( void ); + PythonType &supportGetattro( void ); + PythonType &supportSetattro( void ); +#if defined( PYCXX_PYTHON_2TO3 ) || !defined( PY3 ) + PythonType &supportCompare( void ); +#endif + PythonType &supportRichCompare( void ); + PythonType &supportRepr( void ); + PythonType &supportStr( void ); + PythonType &supportHash( void ); + PythonType &supportCall( void ); + PythonType &supportIter( void ); + + PythonType &supportSequenceType( void ); + PythonType &supportMappingType( void ); + PythonType &supportNumberType( void ); + PythonType &supportBufferType( void ); + + PythonType &set_tp_dealloc( void (*tp_dealloc)( PyObject * ) ); + PythonType &set_tp_init( int (*tp_init)( PyObject *self, PyObject *args, PyObject *kwds ) ); + PythonType &set_tp_new( PyObject *(*tp_new)( PyTypeObject *subtype, PyObject *args, PyObject *kwds ) ); + PythonType &set_methods( PyMethodDef *methods ); + + // call once all support functions have been called to ready the type + bool readyType(); + + protected: + void init_sequence(); + void init_mapping(); + void init_number(); + void init_buffer(); + + PyTypeObject *table; + PySequenceMethods *sequence_table; + PyMappingMethods *mapping_table; + PyNumberMethods *number_table; + PyBufferProcs *buffer_table; + + private: + // + // prevent the compiler generating these unwanted functions + // + PythonType( const PythonType &tb ); // unimplemented + void operator=( const PythonType &t ); // unimplemented + + }; + +} // Namespace Py + +// End of __CXX_PythonType__h +#endif diff -Nru matplotlib-0.99.3/CXX/Python3/Config.hxx matplotlib-1.0.1/CXX/Python3/Config.hxx --- matplotlib-0.99.3/CXX/Python3/Config.hxx 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/CXX/Python3/Config.hxx 2010-07-07 01:41:53.000000000 +0000 @@ -0,0 +1,110 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// 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 disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED 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 REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY 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. +// +//----------------------------------------------------------------------------- + +#ifndef __PyCXX_config_hh__ +#define __PyCXX_config_hh__ + +// +// Microsoft VC++ 6.0 has no traits +// +#if defined( _MSC_VER ) + +# define STANDARD_LIBRARY_HAS_ITERATOR_TRAITS 1 + +#elif defined( __GNUC__ ) +# if __GNUC__ >= 3 +# define STANDARD_LIBRARY_HAS_ITERATOR_TRAITS 1 +# else +# define STANDARD_LIBRARY_HAS_ITERATOR_TRAITS 0 +#endif + +// +// Assume all other compilers do +// +#else + +// Macros to deal with deficiencies in compilers +# define STANDARD_LIBRARY_HAS_ITERATOR_TRAITS 1 +#endif + +#if STANDARD_LIBRARY_HAS_ITERATOR_TRAITS +# define random_access_iterator_parent(itemtype) std::iterator +#else +# define random_access_iterator_parent(itemtype) std::random_access_iterator +#endif + +// +// Which C++ standard is in use? +// +#if defined( _MSC_VER ) +# if _MSC_VER <= 1200 +// MSVC++ 6.0 +# define PYCXX_ISO_CPP_LIB 0 +# define STR_STREAM +# define TEMPLATE_TYPENAME class +# else +# define PYCXX_ISO_CPP_LIB 1 +# define STR_STREAM +# define TEMPLATE_TYPENAME typename +# endif +#elif defined( __GNUC__ ) +# if __GNUC__ >= 3 +# define PYCXX_ISO_CPP_LIB 1 +# define STR_STREAM +# define TEMPLATE_TYPENAME typename +# else +# define PYCXX_ISO_CPP_LIB 0 +# define STR_STREAM +# define TEMPLATE_TYPENAME class +# endif +#endif + +#if PYCXX_ISO_CPP_LIB +# define STR_STREAM +# define OSTRSTREAM ostringstream +# define EXPLICIT_TYPENAME typename +# define EXPLICIT_CLASS class +# define TEMPLATE_TYPENAME typename +#else +# define STR_STREAM +# define OSTRSTREAM ostrstream +# define EXPLICIT_TYPENAME +# define EXPLICIT_CLASS +# define TEMPLATE_TYPENAME class +#endif + +#endif // __PyCXX_config_hh__ diff -Nru matplotlib-0.99.3/CXX/Python3/CxxDebug.hxx matplotlib-1.0.1/CXX/Python3/CxxDebug.hxx --- matplotlib-0.99.3/CXX/Python3/CxxDebug.hxx 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/CXX/Python3/CxxDebug.hxx 2010-07-07 01:41:53.000000000 +0000 @@ -0,0 +1,17 @@ +// +// CxxDebug.hxx +// +// Copyright (c) 2008 Barry A. Scott +// +#ifndef __CXX_Debug_hxx +#define __CXX_Debug_hxx + +// +// Functions useful when debugging PyCXX +// +#ifdef PYCXX_DEBUG +extern void bpt(); +extern void printRefCount( PyObject *obj ); +#endif + +#endif diff -Nru matplotlib-0.99.3/CXX/Python3/cxxextensions.c matplotlib-1.0.1/CXX/Python3/cxxextensions.c --- matplotlib-0.99.3/CXX/Python3/cxxextensions.c 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/CXX/Python3/cxxextensions.c 2010-07-07 01:41:53.000000000 +0000 @@ -0,0 +1,54 @@ +/*---------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// 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 disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED 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 REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY 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. +// +//---------------------------------------------------------------------------*/ + +#include "CXX/WrapPython.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +PyObject py_object_initializer = + { + _PyObject_EXTRA_INIT + 1, + NULL // type must be init'ed by user + }; + +#ifdef __cplusplus +} +#endif diff -Nru matplotlib-0.99.3/CXX/Python3/cxx_extensions.cxx matplotlib-1.0.1/CXX/Python3/cxx_extensions.cxx --- matplotlib-0.99.3/CXX/Python3/cxx_extensions.cxx 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/CXX/Python3/cxx_extensions.cxx 2010-07-07 01:41:53.000000000 +0000 @@ -0,0 +1,1873 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// 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 disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED 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 REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY 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. +// +//----------------------------------------------------------------------------- +#include "CXX/Extensions.hxx" +#include "CXX/Exception.hxx" + +#include + +#ifdef PYCXX_DEBUG +// +// Functions useful when debugging PyCXX +// +void bpt( void ) +{ +} + +void printRefCount( PyObject *obj ) +{ + std::cout << "RefCount of 0x" << std::hex << reinterpret_cast< unsigned int >( obj ) << std::dec << " is " << Py_REFCNT( obj ) << std::endl; +} +#endif + +namespace Py +{ + +void Object::validate() +{ + // release pointer if not the right type + if( !accepts( p ) ) + { +#if defined( _CPPRTTI ) || defined( __GNUG__ ) + std::string s( "PyCXX: Error creating object of type " ); + s += (typeid( *this )).name(); + + if( p != NULL ) + { + String from_repr = repr(); + s += " from "; + s += from_repr.as_std_string(); + } + else + { + s += " from (nil)"; + } +#endif + release(); + if( PyErr_Occurred() ) + { // Error message already set + throw Exception(); + } + // Better error message if RTTI available +#if defined( _CPPRTTI ) || defined( __GNUG__ ) + throw TypeError( s ); +#else + throw TypeError( "PyCXX: type error." ); +#endif + } +} + +//================================================================================ +// +// Implementation of MethodTable +// +//================================================================================ + +PyMethodDef MethodTable::method( const char *method_name, PyCFunction f, int flags, const char *doc ) +{ + PyMethodDef m; + m.ml_name = const_cast( method_name ); + m.ml_meth = f; + m.ml_flags = flags; + m.ml_doc = const_cast( doc ); + return m; +} + +MethodTable::MethodTable() +{ + t.push_back( method( 0, 0, 0, 0 ) ); + mt = NULL; +} + +MethodTable::~MethodTable() +{ + delete [] mt; +} + +void MethodTable::add( const char *method_name, PyCFunction f, const char *doc, int flag ) +{ + if( !mt ) + { + t.insert( t.end()-1, method( method_name, f, flag, doc ) ); + } + else + { + throw RuntimeError( "Too late to add a module method!" ); + } +} + +PyMethodDef *MethodTable::table() +{ + if( !mt ) + { + Py_ssize_t t1size = t.size(); + mt = new PyMethodDef[ t1size ]; + int j = 0; + for( std::vector::iterator i = t.begin(); i != t.end(); i++ ) + { + mt[ j++ ] = *i; + } + } + return mt; +} + +//================================================================================ +// +// Implementation of ExtensionModule +// +//================================================================================ +ExtensionModuleBase::ExtensionModuleBase( const char *name ) +: m_module_name( name ) +, m_full_module_name( __Py_PackageContext() != NULL ? std::string( __Py_PackageContext() ) : m_module_name ) +, m_method_table() +//m_module_def +, m_module( NULL ) +{} + +ExtensionModuleBase::~ExtensionModuleBase() +{} + +const std::string &ExtensionModuleBase::name() const +{ + return m_module_name; +} + +const std::string &ExtensionModuleBase::fullName() const +{ + return m_full_module_name; +} + +class ExtensionModuleBasePtr : public PythonExtension +{ +public: + ExtensionModuleBasePtr( ExtensionModuleBase *_module ) + : module( _module ) + {} + + virtual ~ExtensionModuleBasePtr() + {} + + ExtensionModuleBase *module; +}; + +void ExtensionModuleBase::initialize( const char *module_doc ) +{ + memset( &m_module_def, 0, sizeof( m_module_def ) ); + + m_module_def.m_name = const_cast( m_module_name.c_str() ); + m_module_def.m_doc = const_cast( module_doc ); + m_module_def.m_methods = m_method_table.table(); + // where does module_ptr get passed in? + + m_module = PyModule_Create( &m_module_def ); +} + +Py::Module ExtensionModuleBase::module( void ) const +{ + return Module( m_module ); +} + +Py::Dict ExtensionModuleBase::moduleDictionary( void ) const +{ + return module().getDict(); +} + +//================================================================================ +// +// Implementation of PythonType +// +//================================================================================ +extern "C" +{ + static void standard_dealloc( PyObject *p ); + // + // All the following functions redirect the call from Python + // onto the matching virtual function in PythonExtensionBase + // + static int print_handler( PyObject *, FILE *, int ); + static PyObject *getattr_handler( PyObject *, char * ); + static int setattr_handler( PyObject *, char *, PyObject * ); + static PyObject *getattro_handler( PyObject *, PyObject * ); + static int setattro_handler( PyObject *, PyObject *, PyObject * ); + static PyObject *rich_compare_handler( PyObject *, PyObject *, int ); + static PyObject *repr_handler( PyObject * ); + static PyObject *str_handler( PyObject * ); + static long hash_handler( PyObject * ); + static PyObject *call_handler( PyObject *, PyObject *, PyObject * ); + static PyObject *iter_handler( PyObject * ); + static PyObject *iternext_handler( PyObject * ); + + // Sequence methods + static Py_ssize_t sequence_length_handler( PyObject * ); + static PyObject *sequence_concat_handler( PyObject *,PyObject * ); + static PyObject *sequence_repeat_handler( PyObject *, Py_ssize_t ); + static PyObject *sequence_item_handler( PyObject *, Py_ssize_t ); + static int sequence_ass_item_handler( PyObject *, Py_ssize_t, PyObject * ); + + // Mapping + static Py_ssize_t mapping_length_handler( PyObject * ); + static PyObject *mapping_subscript_handler( PyObject *, PyObject * ); + static int mapping_ass_subscript_handler( PyObject *, PyObject *, PyObject * ); + + // Numeric methods + static PyObject *number_negative_handler( PyObject * ); + static PyObject *number_positive_handler( PyObject * ); + static PyObject *number_absolute_handler( PyObject * ); + static PyObject *number_invert_handler( PyObject * ); + static PyObject *number_int_handler( PyObject * ); + static PyObject *number_float_handler( PyObject * ); + static PyObject *number_add_handler( PyObject *, PyObject * ); + static PyObject *number_subtract_handler( PyObject *, PyObject * ); + static PyObject *number_multiply_handler( PyObject *, PyObject * ); + static PyObject *number_remainder_handler( PyObject *, PyObject * ); + static PyObject *number_divmod_handler( PyObject *, PyObject * ); + static PyObject *number_lshift_handler( PyObject *, PyObject * ); + static PyObject *number_rshift_handler( PyObject *, PyObject * ); + static PyObject *number_and_handler( PyObject *, PyObject * ); + static PyObject *number_xor_handler( PyObject *, PyObject * ); + static PyObject *number_or_handler( PyObject *, PyObject * ); + static PyObject *number_power_handler( PyObject *, PyObject *, PyObject * ); + + // Buffer + // QQQ +} + +extern "C" void standard_dealloc( PyObject *p ) +{ + PyMem_DEL( p ); +} + +bool PythonType::readyType() +{ + return PyType_Ready( table ) >= 0; +} + +PythonType &PythonType::supportSequenceType() +{ + if( !sequence_table ) + { + sequence_table = new PySequenceMethods; + memset( sequence_table, 0, sizeof( PySequenceMethods ) ); // ensure new fields are 0 + table->tp_as_sequence = sequence_table; + sequence_table->sq_length = sequence_length_handler; + sequence_table->sq_concat = sequence_concat_handler; + sequence_table->sq_repeat = sequence_repeat_handler; + sequence_table->sq_item = sequence_item_handler; + + sequence_table->sq_ass_item = sequence_ass_item_handler; // BAS setup seperately? + // QQQ sq_inplace_concat + // QQQ sq_inplace_repeat + } + return *this; +} + +PythonType &PythonType::supportMappingType() +{ + if( !mapping_table ) + { + mapping_table = new PyMappingMethods; + memset( mapping_table, 0, sizeof( PyMappingMethods ) ); // ensure new fields are 0 + table->tp_as_mapping = mapping_table; + mapping_table->mp_length = mapping_length_handler; + mapping_table->mp_subscript = mapping_subscript_handler; + mapping_table->mp_ass_subscript = mapping_ass_subscript_handler; // BAS setup seperately? + } + return *this; +} + +PythonType &PythonType::supportNumberType() +{ + if( !number_table ) + { + number_table = new PyNumberMethods; + memset( number_table, 0, sizeof( PyNumberMethods ) ); // ensure new fields are 0 + table->tp_as_number = number_table; + number_table->nb_add = number_add_handler; + number_table->nb_subtract = number_subtract_handler; + number_table->nb_multiply = number_multiply_handler; + number_table->nb_remainder = number_remainder_handler; + number_table->nb_divmod = number_divmod_handler; + number_table->nb_power = number_power_handler; + number_table->nb_negative = number_negative_handler; + number_table->nb_positive = number_positive_handler; + number_table->nb_absolute = number_absolute_handler; + number_table->nb_invert = number_invert_handler; + number_table->nb_lshift = number_lshift_handler; + number_table->nb_rshift = number_rshift_handler; + number_table->nb_and = number_and_handler; + number_table->nb_xor = number_xor_handler; + number_table->nb_or = number_or_handler; + number_table->nb_int = number_int_handler; + number_table->nb_float = number_float_handler; + + // QQQ lots of new methods to add + } + return *this; +} + +PythonType &PythonType::supportBufferType() +{ + if( !buffer_table ) + { + buffer_table = new PyBufferProcs; + memset( buffer_table, 0, sizeof( PyBufferProcs ) ); // ensure new fields are 0 + table->tp_as_buffer = buffer_table; + // QQQ bf_getbuffer + // QQQ bf_releasebuffer + } + return *this; +} + +// if you define one sequence method you must define +// all of them except the assigns + +PythonType::PythonType( size_t basic_size, int itemsize, const char *default_name ) +: table( new PyTypeObject ) +, sequence_table( NULL ) +, mapping_table( NULL ) +, number_table( NULL ) +, buffer_table( NULL ) +{ + // PyTypeObject is defined in /Include/object.h + + memset( table, 0, sizeof( PyTypeObject ) ); // ensure new fields are 0 + *reinterpret_cast( table ) = py_object_initializer; + // QQQ table->ob_type = _Type_Type(); + // QQQ table->ob_size = 0; + table->tp_name = const_cast( default_name ); + table->tp_basicsize = basic_size; + table->tp_itemsize = itemsize; + + // Methods to implement standard operations + table->tp_dealloc = (destructor)standard_dealloc; + table->tp_print = 0; + table->tp_getattr = 0; + table->tp_setattr = 0; + table->tp_repr = 0; + + // Method suites for standard classes + table->tp_as_number = 0; + table->tp_as_sequence = 0; + table->tp_as_mapping = 0; + + // More standard operations (here for binary compatibility) + table->tp_hash = 0; + table->tp_call = 0; + table->tp_str = 0; + table->tp_getattro = 0; + table->tp_setattro = 0; + + // Functions to access object as input/output buffer + table->tp_as_buffer = 0; + + // Flags to define presence of optional/expanded features + table->tp_flags = Py_TPFLAGS_DEFAULT; + + // Documentation string + table->tp_doc = 0; + + table->tp_traverse = 0; + + // delete references to contained objects + table->tp_clear = 0; + + // Assigned meaning in release 2.1 + // rich comparisons + table->tp_richcompare = 0; + // weak reference enabler + table->tp_weaklistoffset = 0; + + // Iterators + table->tp_iter = 0; + table->tp_iternext = 0; + + // Attribute descriptor and subclassing stuff + table->tp_methods = 0; + table->tp_members = 0; + table->tp_getset = 0; + table->tp_base = 0; + table->tp_dict = 0; + table->tp_descr_get = 0; + table->tp_descr_set = 0; + table->tp_dictoffset = 0; + table->tp_init = 0; + table->tp_alloc = 0; + table->tp_new = 0; + table->tp_free = 0; // Low-level free-memory routine + table->tp_is_gc = 0; // For PyObject_IS_GC + table->tp_bases = 0; + table->tp_mro = 0; // method resolution order + table->tp_cache = 0; + table->tp_subclasses = 0; + table->tp_weaklist = 0; + table->tp_del = 0; + + // Type attribute cache version tag. Added in version 2.6 + table->tp_version_tag = 0; + +#ifdef COUNT_ALLOCS + table->tp_alloc = 0; + table->tp_free = 0; + table->tp_maxalloc = 0; + table->tp_orev = 0; + table->tp_next = 0; +#endif +} + +PythonType::~PythonType() +{ + delete table; + delete sequence_table; + delete mapping_table; + delete number_table; + delete buffer_table; +} + +PyTypeObject *PythonType::type_object() const +{ + return table; +} + +PythonType &PythonType::name( const char *nam ) +{ + table->tp_name = const_cast( nam ); + return *this; +} + +const char *PythonType::getName() const +{ + return table->tp_name; +} + +PythonType &PythonType::doc( const char *d ) +{ + table->tp_doc = const_cast( d ); + return *this; +} + +const char *PythonType::getDoc() const +{ + return table->tp_doc; +} + +PythonType &PythonType::set_tp_dealloc( void (*tp_dealloc)( PyObject *self ) ) +{ + table->tp_dealloc = tp_dealloc; + return *this; +} + +PythonType &PythonType::set_tp_init( int (*tp_init)( PyObject *self, PyObject *args, PyObject *kwds ) ) +{ + table->tp_init = tp_init; + return *this; +} + +PythonType &PythonType::set_tp_new( PyObject *(*tp_new)( PyTypeObject *subtype, PyObject *args, PyObject *kwds ) ) +{ + table->tp_new = tp_new; + return *this; +} + +PythonType &PythonType::set_methods( PyMethodDef *methods ) +{ + table->tp_methods = methods; + return *this; +} + +PythonType &PythonType::supportClass() +{ + table->tp_flags |= Py_TPFLAGS_BASETYPE; + return *this; +} + +#ifdef PYCXX_PYTHON_2TO3 +PythonType &PythonType::supportPrint() +{ + table->tp_print = print_handler; + return *this; +} +#endif + +PythonType &PythonType::supportGetattr() +{ + table->tp_getattr = getattr_handler; + return *this; +} + +PythonType &PythonType::supportSetattr() +{ + table->tp_setattr = setattr_handler; + return *this; +} + +PythonType &PythonType::supportGetattro() +{ + table->tp_getattro = getattro_handler; + return *this; +} + +PythonType &PythonType::supportSetattro() +{ + table->tp_setattro = setattro_handler; + return *this; +} + +#ifdef PYCXX_PYTHON_2TO3 +PythonType &PythonType::supportCompare( void ) +{ + return *this; +} +#endif + + +PythonType &PythonType::supportRichCompare() +{ + table->tp_richcompare = rich_compare_handler; + return *this; +} + +PythonType &PythonType::supportRepr() +{ + table->tp_repr = repr_handler; + return *this; +} + +PythonType &PythonType::supportStr() +{ + table->tp_str = str_handler; + return *this; +} + +PythonType &PythonType::supportHash() +{ + table->tp_hash = hash_handler; + return *this; +} + +PythonType &PythonType::supportCall() +{ + table->tp_call = call_handler; + return *this; +} + +PythonType &PythonType::supportIter() +{ + table->tp_iter = iter_handler; + table->tp_iternext = iternext_handler; + return *this; +} + +//-------------------------------------------------------------------------------- +// +// Handlers +// +//-------------------------------------------------------------------------------- +PythonExtensionBase *getPythonExtensionBase( PyObject *self ) +{ + if( self->ob_type->tp_flags&Py_TPFLAGS_BASETYPE ) + { + PythonClassInstance *instance = reinterpret_cast( self ); + return instance->m_pycxx_object; + } + else + { + return static_cast( self ); + } +} + +#ifdef PYCXX_PYTHON_2TO3 +extern "C" int print_handler( PyObject *self, FILE *fp, int flags ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return p->print( fp, flags ); + } + catch( Py::Exception & ) + { + return -1; // indicate error + } +} +#endif + +extern "C" PyObject *getattr_handler( PyObject *self, char *name ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->getattr( name ) ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" int setattr_handler( PyObject *self, char *name, PyObject *value ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return p->setattr( name, Py::Object( value ) ); + } + catch( Py::Exception & ) + { + return -1; // indicate error + } +} + +extern "C" PyObject *getattro_handler( PyObject *self, PyObject *name ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->getattro( Py::String( name ) ) ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" int setattro_handler( PyObject *self, PyObject *name, PyObject *value ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return p->setattro( Py::String( name ), Py::Object( value ) ); + } + catch( Py::Exception & ) + { + return -1; // indicate error + } +} + +extern "C" PyObject *rich_compare_handler( PyObject *self, PyObject *other, int op ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->rich_compare( Py::Object( other ), op ) ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *repr_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->repr() ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *str_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->str() ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" long hash_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return p->hash(); + } + catch( Py::Exception & ) + { + return -1; // indicate error + } +} + +extern "C" PyObject *call_handler( PyObject *self, PyObject *args, PyObject *kw ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + if( kw != NULL ) + return new_reference_to( p->call( Py::Object( args ), Py::Object( kw ) ) ); + else + return new_reference_to( p->call( Py::Object( args ), Py::Object() ) ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *iter_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->iter() ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *iternext_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return p->iternext(); // might be a NULL ptr on end of iteration + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + + +// Sequence methods +extern "C" Py_ssize_t sequence_length_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return p->sequence_length(); + } + catch( Py::Exception & ) + { + return -1; // indicate error + } +} + +extern "C" PyObject *sequence_concat_handler( PyObject *self, PyObject *other ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->sequence_concat( Py::Object( other ) ) ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *sequence_repeat_handler( PyObject *self, Py_ssize_t count ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->sequence_repeat( count ) ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *sequence_item_handler( PyObject *self, Py_ssize_t index ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->sequence_item( index ) ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" int sequence_ass_item_handler( PyObject *self, Py_ssize_t index, PyObject *value ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return p->sequence_ass_item( index, Py::Object( value ) ); + } + catch( Py::Exception & ) + { + return -1; // indicate error + } +} + +// Mapping +extern "C" Py_ssize_t mapping_length_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return p->mapping_length(); + } + catch( Py::Exception & ) + { + return -1; // indicate error + } +} + +extern "C" PyObject *mapping_subscript_handler( PyObject *self, PyObject *key ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->mapping_subscript( Py::Object( key ) ) ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" int mapping_ass_subscript_handler( PyObject *self, PyObject *key, PyObject *value ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return p->mapping_ass_subscript( Py::Object( key ), Py::Object( value ) ); + } + catch( Py::Exception & ) + { + return -1; // indicate error + } +} + +// Number +extern "C" PyObject *number_negative_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_negative() ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_positive_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_positive() ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_absolute_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_absolute() ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_invert_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_invert() ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_int_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_int() ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_float_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_float() ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_add_handler( PyObject *self, PyObject *other ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_add( Py::Object( other ) ) ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_subtract_handler( PyObject *self, PyObject *other ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_subtract( Py::Object( other ) ) ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_multiply_handler( PyObject *self, PyObject *other ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_multiply( Py::Object( other ) ) ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_remainder_handler( PyObject *self, PyObject *other ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_remainder( Py::Object( other ) ) ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_divmod_handler( PyObject *self, PyObject *other ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_divmod( Py::Object( other ) ) ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_lshift_handler( PyObject *self, PyObject *other ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_lshift( Py::Object( other ) ) ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_rshift_handler( PyObject *self, PyObject *other ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_rshift( Py::Object( other ) ) ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_and_handler( PyObject *self, PyObject *other ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_and( Py::Object( other ) ) ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_xor_handler( PyObject *self, PyObject *other ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_xor( Py::Object( other ) ) ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_or_handler( PyObject *self, PyObject *other ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_or( Py::Object( other ) ) ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_power_handler( PyObject *self, PyObject *x1, PyObject *x2 ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_power( Py::Object( x1 ), Py::Object( x2 ) ) ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +// Buffer + +//================================================================================ +// +// Implementation of PythonExtensionBase +// +//================================================================================ +#define missing_method( method ) \ + throw RuntimeError( "Extension object missing implement of " #method ); + +PythonExtensionBase::PythonExtensionBase() +{ + ob_refcnt = 0; +} + +PythonExtensionBase::~PythonExtensionBase() +{ + assert( ob_refcnt == 0 ); +} + +void PythonExtensionBase::reinit( Tuple &args, Dict &kwds ) +{ + throw RuntimeError( "Must not call __init__ twice on this class" ); +} + + +Py::Object PythonExtensionBase::genericGetAttro( const Py::String &name ) +{ + return asObject( PyObject_GenericGetAttr( selfPtr(), name.ptr() ) ); +} + +int PythonExtensionBase::genericSetAttro( const Py::String &name, const Py::Object &value ) +{ + return PyObject_GenericSetAttr( selfPtr(), name.ptr(), value.ptr() ); +} + +#ifdef PYCXX_PYTHON_2TO3 +int PythonExtensionBase::print( FILE *, int ) +{ + missing_method( print ); + return -1; +} +#endif + +Py::Object PythonExtensionBase::getattr( const char * ) +{ + missing_method( getattr ); + return Py::None(); +} + +int PythonExtensionBase::setattr( const char *, const Py::Object & ) +{ + missing_method( setattr ); + return -1; +} + +Py::Object PythonExtensionBase::getattro( const Py::String & ) +{ + missing_method( getattro ); + return Py::None(); +} + +int PythonExtensionBase::setattro( const Py::String &, const Py::Object & ) +{ + missing_method( setattro ); + return -1; +} + + +int PythonExtensionBase::compare( const Py::Object & ) +{ + missing_method( compare ); + return -1; +} + +Py::Object PythonExtensionBase::rich_compare( const Py::Object &, int ) +{ + missing_method( rich_compare ); + return Py::None(); +} + +Py::Object PythonExtensionBase::repr() +{ + missing_method( repr ); + return Py::None(); +} + +Py::Object PythonExtensionBase::str() +{ + missing_method( str ); + return Py::None(); +} + +long PythonExtensionBase::hash() +{ + missing_method( hash ); + return -1; } + + +Py::Object PythonExtensionBase::call( const Py::Object &, const Py::Object & ) +{ + missing_method( call ); + return Py::None(); +} + +Py::Object PythonExtensionBase::iter() +{ + missing_method( iter ); + return Py::None(); +} + +PyObject *PythonExtensionBase::iternext() +{ + missing_method( iternext ); + return NULL; } + + + +// Sequence methods +int PythonExtensionBase::sequence_length() +{ + missing_method( sequence_length ); + return -1; } + + +Py::Object PythonExtensionBase::sequence_concat( const Py::Object & ) +{ + missing_method( sequence_concat ); + return Py::None(); +} + +Py::Object PythonExtensionBase::sequence_repeat( Py_ssize_t ) +{ + missing_method( sequence_repeat ); + return Py::None(); +} + +Py::Object PythonExtensionBase::sequence_item( Py_ssize_t ) +{ + missing_method( sequence_item ); + return Py::None(); +} + +int PythonExtensionBase::sequence_ass_item( Py_ssize_t, const Py::Object & ) +{ + missing_method( sequence_ass_item ); + return -1; +} + + +// Mapping +int PythonExtensionBase::mapping_length() +{ + missing_method( mapping_length ); + return -1; +} + + +Py::Object PythonExtensionBase::mapping_subscript( const Py::Object & ) +{ + missing_method( mapping_subscript ); + return Py::None(); +} + +int PythonExtensionBase::mapping_ass_subscript( const Py::Object &, const Py::Object & ) +{ + missing_method( mapping_ass_subscript ); + return -1; +} + +Py::Object PythonExtensionBase::number_negative() +{ + missing_method( number_negative ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_positive() +{ + missing_method( number_positive ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_absolute() +{ + missing_method( number_absolute ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_invert() +{ + missing_method( number_invert ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_int() +{ + missing_method( number_int ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_float() +{ + missing_method( number_float ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_long() +{ + missing_method( number_long ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_add( const Py::Object & ) +{ + missing_method( number_add ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_subtract( const Py::Object & ) +{ + missing_method( number_subtract ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_multiply( const Py::Object & ) +{ + missing_method( number_multiply ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_remainder( const Py::Object & ) +{ + missing_method( number_remainder ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_divmod( const Py::Object & ) +{ + missing_method( number_divmod ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_lshift( const Py::Object & ) +{ + missing_method( number_lshift ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_rshift( const Py::Object & ) +{ + missing_method( number_rshift ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_and( const Py::Object & ) +{ + missing_method( number_and ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_xor( const Py::Object & ) +{ + missing_method( number_xor ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_or( const Py::Object & ) +{ + missing_method( number_or ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_power( const Py::Object &, const Py::Object & ) +{ + missing_method( number_power ); + return Py::None(); +} + + +// Buffer +// QQQ + +//-------------------------------------------------------------------------------- +// +// Method call handlers for +// PythonExtensionBase +// ExtensionModuleBase +// +//-------------------------------------------------------------------------------- +// Note: Python calls noargs as varargs buts args==NULL +extern "C" PyObject *method_noargs_call_handler( PyObject *_self_and_name_tuple, PyObject * ) +{ + try + { + Tuple self_and_name_tuple( _self_and_name_tuple ); + + PyObject *self_in_cobject = self_and_name_tuple[0].ptr(); + void *self_as_void = PyCObject_AsVoidPtr( self_in_cobject ); + if( self_as_void == NULL ) + return NULL; + + ExtensionModuleBase *self = static_cast( self_as_void ); + + Object result( self->invoke_method_noargs( PyCObject_AsVoidPtr( self_and_name_tuple[1].ptr() ) ) ); + + return new_reference_to( result.ptr() ); + } + catch( Exception & ) + { + return 0; + } +} + +extern "C" PyObject *method_varargs_call_handler( PyObject *_self_and_name_tuple, PyObject *_args ) +{ + try + { + Tuple self_and_name_tuple( _self_and_name_tuple ); + + PyObject *self_in_cobject = self_and_name_tuple[0].ptr(); + void *self_as_void = PyCObject_AsVoidPtr( self_in_cobject ); + if( self_as_void == NULL ) + return NULL; + + ExtensionModuleBase *self = static_cast( self_as_void ); + Tuple args( _args ); + Object result + ( + self->invoke_method_varargs + ( + PyCObject_AsVoidPtr( self_and_name_tuple[1].ptr() ), + args + ) + ); + + return new_reference_to( result.ptr() ); + } + catch( Exception & ) + { + return 0; + } +} + +extern "C" PyObject *method_keyword_call_handler( PyObject *_self_and_name_tuple, PyObject *_args, PyObject *_keywords ) +{ + try + { + Tuple self_and_name_tuple( _self_and_name_tuple ); + + PyObject *self_in_cobject = self_and_name_tuple[0].ptr(); + void *self_as_void = PyCObject_AsVoidPtr( self_in_cobject ); + if( self_as_void == NULL ) + return NULL; + + ExtensionModuleBase *self = static_cast( self_as_void ); + + Tuple args( _args ); + + if( _keywords == NULL ) + { + Dict keywords; // pass an empty dict + + Object result + ( + self->invoke_method_keyword + ( + PyCObject_AsVoidPtr( self_and_name_tuple[1].ptr() ), + args, + keywords + ) + ); + + return new_reference_to( result.ptr() ); + } + else + { + Dict keywords( _keywords ); // make dict + + Object result + ( + self->invoke_method_keyword + ( + PyCObject_AsVoidPtr( self_and_name_tuple[1].ptr() ), + args, + keywords + ) + ); + + return new_reference_to( result.ptr() ); + } + } + catch( Exception & ) + { + return 0; + } +} + +extern "C" void do_not_dealloc( void * ) +{} + + +//-------------------------------------------------------------------------------- +// +// ExtensionExceptionType +// +//-------------------------------------------------------------------------------- +ExtensionExceptionType::ExtensionExceptionType() + : Py::Object() +{ +} + +void ExtensionExceptionType::init( ExtensionModuleBase &module, const std::string& name ) +{ + std::string module_name( module.fullName() ); + module_name += "."; + module_name += name; + + set( PyErr_NewException( const_cast( module_name.c_str() ), NULL, NULL ), true ); +} + +void ExtensionExceptionType::init( ExtensionModuleBase &module, const std::string& name, ExtensionExceptionType &parent ) + { + std::string module_name( module.fullName() ); + module_name += "."; + module_name += name; + + set( PyErr_NewException( const_cast( module_name.c_str() ), parent.ptr(), NULL ), true ); +} + +ExtensionExceptionType::~ExtensionExceptionType() +{ +} + +Exception::Exception( ExtensionExceptionType &exception, const std::string& reason ) +{ + PyErr_SetString( exception.ptr(), reason.c_str() ); +} + +Exception::Exception( ExtensionExceptionType &exception, Object &reason ) +{ + PyErr_SetObject( exception.ptr(), reason.ptr() ); +} + +Exception::Exception( PyObject *exception, Object &reason ) +{ + PyErr_SetObject( exception, reason.ptr() ); +} + +#if 1 +//------------------------------------------------------------ +// compare operators +bool operator!=( const Long &a, const Long &b ) +{ + return a.as_long() != b.as_long(); +} + +bool operator!=( const Long &a, int b ) +{ + return a.as_long() != b; +} + +bool operator!=( const Long &a, long b ) +{ + return a.as_long() != b; +} + +bool operator!=( int a, const Long &b ) +{ + return a != b.as_long(); +} + +bool operator!=( long a, const Long &b ) +{ + return a != b.as_long(); +} + +//------------------------------ +bool operator==( const Long &a, const Long &b ) +{ + return a.as_long() == b.as_long(); +} + +bool operator==( const Long &a, int b ) +{ + return a.as_long() == b; +} + +bool operator==( const Long &a, long b ) +{ + return a.as_long() == b; +} + +bool operator==( int a, const Long &b ) +{ + return a == b.as_long(); +} + +bool operator==( long a, const Long &b ) +{ + return a == b.as_long(); +} + +//------------------------------ +bool operator>( const Long &a, const Long &b ) +{ + return a.as_long() > b.as_long(); +} + +bool operator>( const Long &a, int b ) +{ + return a.as_long() > b; +} + +bool operator>( const Long &a, long b ) +{ + return a.as_long() > b; +} + +bool operator>( int a, const Long &b ) +{ + return a > b.as_long(); +} + +bool operator>( long a, const Long &b ) +{ + return a > b.as_long(); +} + +//------------------------------ +bool operator>=( const Long &a, const Long &b ) +{ + return a.as_long() >= b.as_long(); +} + +bool operator>=( const Long &a, int b ) +{ + return a.as_long() >= b; +} + +bool operator>=( const Long &a, long b ) +{ + return a.as_long() >= b; +} + +bool operator>=( int a, const Long &b ) +{ + return a >= b.as_long(); +} + +bool operator>=( long a, const Long &b ) +{ + return a >= b.as_long(); +} + +//------------------------------ +bool operator<( const Long &a, const Long &b ) +{ + return a.as_long() < b.as_long(); +} + +bool operator<( const Long &a, int b ) +{ + return a.as_long() < b; +} + +bool operator<( const Long &a, long b ) +{ + return a.as_long() < b; +} + +bool operator<( int a, const Long &b ) +{ + return a < b.as_long(); +} + +bool operator<( long a, const Long &b ) +{ + return a < b.as_long(); +} + +//------------------------------ +bool operator<=( const Long &a, const Long &b ) +{ + return a.as_long() <= b.as_long(); +} + +bool operator<=( int a, const Long &b ) +{ + return a <= b.as_long(); +} + +bool operator<=( long a, const Long &b ) +{ + return a <= b.as_long(); +} + +bool operator<=( const Long &a, int b ) +{ + return a.as_long() <= b; +} + +bool operator<=( const Long &a, long b ) +{ + return a.as_long() <= b; +} + +#ifdef HAVE_LONG_LONG +//------------------------------ +bool operator!=( const Long &a, PY_LONG_LONG b ) +{ + return a.as_long_long() != b; +} + +bool operator!=( PY_LONG_LONG a, const Long &b ) +{ + return a != b.as_long_long(); +} + +//------------------------------ +bool operator==( const Long &a, PY_LONG_LONG b ) +{ + return a.as_long_long() == b; +} + +bool operator==( PY_LONG_LONG a, const Long &b ) +{ + return a == b.as_long_long(); +} + +//------------------------------ +bool operator>( const Long &a, PY_LONG_LONG b ) +{ + return a.as_long_long() > b; +} + +bool operator>( PY_LONG_LONG a, const Long &b ) +{ + return a > b.as_long_long(); +} + +//------------------------------ +bool operator>=( const Long &a, PY_LONG_LONG b ) +{ + return a.as_long_long() >= b; +} + +bool operator>=( PY_LONG_LONG a, const Long &b ) +{ + return a >= b.as_long_long(); +} + +//------------------------------ +bool operator<( const Long &a, PY_LONG_LONG b ) +{ + return a.as_long_long() < b; +} + +bool operator<( PY_LONG_LONG a, const Long &b ) +{ + return a < b.as_long_long(); +} + +//------------------------------ +bool operator<=( const Long &a, PY_LONG_LONG b ) +{ + return a.as_long_long() <= b; +} + +bool operator<=( PY_LONG_LONG a, const Long &b ) +{ + return a <= b.as_long_long(); +} +#endif +#endif + +//------------------------------------------------------------ +// compare operators +bool operator!=( const Float &a, const Float &b ) +{ + return a.as_double() != b.as_double(); +} + +bool operator!=( const Float &a, double b ) +{ + return a.as_double() != b; +} + +bool operator!=( double a, const Float &b ) +{ + return a != b.as_double(); +} + +//------------------------------ +bool operator==( const Float &a, const Float &b ) +{ + return a.as_double() == b.as_double(); +} + +bool operator==( const Float &a, double b ) +{ + return a.as_double() == b; +} + +bool operator==( double a, const Float &b ) +{ + return a == b.as_double(); +} + +//------------------------------ +bool operator>( const Float &a, const Float &b ) +{ + return a.as_double() > b.as_double(); +} + +bool operator>( const Float &a, double b ) +{ + return a.as_double() > b; +} + +bool operator>( double a, const Float &b ) +{ + return a > b.as_double(); +} + +//------------------------------ +bool operator>=( const Float &a, const Float &b ) +{ + return a.as_double() >= b.as_double(); +} + +bool operator>=( const Float &a, double b ) +{ + return a.as_double() >= b; +} + +bool operator>=( double a, const Float &b ) +{ + return a >= b.as_double(); +} + +//------------------------------ +bool operator<( const Float &a, const Float &b ) +{ + return a.as_double() < b.as_double(); +} + +bool operator<( const Float &a, double b ) +{ + return a.as_double() < b; +} + +bool operator<( double a, const Float &b ) +{ + return a < b.as_double(); +} + +//------------------------------ +bool operator<=( const Float &a, const Float &b ) +{ + return a.as_double() <= b.as_double(); +} + +bool operator<=( double a, const Float &b ) +{ + return a <= b.as_double(); +} + +bool operator<=( const Float &a, double b ) +{ + return a.as_double() <= b; +} + +} // end of namespace Py diff -Nru matplotlib-0.99.3/CXX/Python3/cxxsupport.cxx matplotlib-1.0.1/CXX/Python3/cxxsupport.cxx --- matplotlib-0.99.3/CXX/Python3/cxxsupport.cxx 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/CXX/Python3/cxxsupport.cxx 2010-07-07 01:41:53.000000000 +0000 @@ -0,0 +1,228 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// 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 disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED 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 REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY 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. +// +//----------------------------------------------------------------------------- + +#include "CXX/Objects.hxx" +namespace Py +{ + +Py_UNICODE unicode_null_string[1] = { 0 }; + +Type Object::type() const +{ + return Type( PyObject_Type( p ), true ); +} + +String Object::str() const +{ + return String( PyObject_Str( p ), true ); +} + +String Object::repr() const +{ + return String( PyObject_Repr( p ), true ); +} + +std::string Object::as_string() const +{ + return static_cast( str() ); +} + +List Object::dir() const +{ + return List( PyObject_Dir( p ), true ); +} + +bool Object::isType( const Type &t ) const +{ + return type().ptr() == t.ptr(); +} + +Char::operator String() const +{ + return String( ptr() ); +} + +String Bytes::decode( const char *encoding, const char *error ) +{ + return String( PyUnicode_FromEncodedObject( ptr(), encoding, error ), true ); +} + +// Object compares +bool operator==( const Object &o1, const Object &o2 ) +{ + int k = PyObject_RichCompareBool( *o1, *o2, Py_EQ ); + if( PyErr_Occurred() ) + throw Exception(); + return k != 0; +} + +bool operator!=( const Object &o1, const Object &o2 ) +{ + int k = PyObject_RichCompareBool( *o1, *o2, Py_NE ); + if( PyErr_Occurred() ) + throw Exception(); + return k != 0; + +} + +bool operator>=( const Object &o1, const Object &o2 ) +{ + int k = PyObject_RichCompareBool( *o1, *o2, Py_GE ); + if( PyErr_Occurred() ) + throw Exception(); + return k != 0; +} + +bool operator<=( const Object &o1, const Object &o2 ) +{ + int k = PyObject_RichCompareBool( *o1, *o2, Py_LE ); + if( PyErr_Occurred() ) + throw Exception(); + return k != 0; +} + +bool operator<( const Object &o1, const Object &o2 ) +{ + int k = PyObject_RichCompareBool( *o1, *o2, Py_LT ); + if( PyErr_Occurred() ) + throw Exception(); + return k != 0; +} + +bool operator>( const Object &o1, const Object &o2 ) +{ + int k = PyObject_RichCompareBool( *o1, *o2, Py_GT ); + if( PyErr_Occurred() ) + throw Exception(); + return k != 0; +} + +// iterator compares +bool operator==( const Sequence::iterator &left, const Sequence::iterator &right ) +{ + return left.eql( right ); +} + +bool operator!=( const Sequence::iterator &left, const Sequence::iterator &right ) +{ + return left.neq( right ); +} + +bool operator<( const Sequence::iterator &left, const Sequence::iterator &right ) +{ + return left.lss( right ); +} + +bool operator>( const Sequence::iterator &left, const Sequence::iterator &right ) +{ + return left.gtr( right ); +} + +bool operator<=( const Sequence::iterator &left, const Sequence::iterator &right ) +{ + return left.leq( right ); +} + +bool operator>=( const Sequence::iterator &left, const Sequence::iterator &right ) +{ + return left.geq( right ); +} + +// const_iterator compares +bool operator==( const Sequence::const_iterator &left, const Sequence::const_iterator &right ) +{ + return left.eql( right ); +} + +bool operator!=( const Sequence::const_iterator &left, const Sequence::const_iterator &right ) +{ + return left.neq( right ); +} + +bool operator<( const Sequence::const_iterator &left, const Sequence::const_iterator &right ) +{ + return left.lss( right ); +} + +bool operator>( const Sequence::const_iterator &left, const Sequence::const_iterator &right ) +{ + return left.gtr( right ); +} + +bool operator<=( const Sequence::const_iterator &left, const Sequence::const_iterator &right ) +{ + return left.leq( right ); +} + +bool operator>=( const Sequence::const_iterator &left, const Sequence::const_iterator &right ) +{ + return left.geq( right ); +} + +// For mappings: +bool operator==( const Mapping::iterator &left, const Mapping::iterator &right ) +{ + return left.eql( right ); +} + +bool operator!=( const Mapping::iterator &left, const Mapping::iterator &right ) +{ + return left.neq( right ); +} + +// now for const_iterator +bool operator==( const Mapping::const_iterator &left, const Mapping::const_iterator &right ) +{ + return left.eql( right ); +} + +bool operator!=( const Mapping::const_iterator &left, const Mapping::const_iterator &right ) +{ + return left.neq( right ); +} + +// TMM: 31May'01 - Added the #ifndef so I can exclude iostreams. +#ifndef CXX_NO_IOSTREAMS +// output + +std::ostream &operator<<( std::ostream &os, const Object &ob ) +{ + return( os << static_cast( ob.str() ) ); +} +#endif + +} // Py diff -Nru matplotlib-0.99.3/CXX/Python3/Exception.hxx matplotlib-1.0.1/CXX/Python3/Exception.hxx --- matplotlib-0.99.3/CXX/Python3/Exception.hxx 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/CXX/Python3/Exception.hxx 2010-07-07 01:41:53.000000000 +0000 @@ -0,0 +1,250 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// 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 disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED 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 REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY 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. +// +//----------------------------------------------------------------------------- + +#ifndef __CXX_Exception_h +#define __CXX_Exception_h + +#include "CXX/WrapPython.h" +#include "CXX/Version.hxx" +#include "CXX/Python3/Config.hxx" +#include "CXX/Python3/CxxDebug.hxx" +#include "CXX/Python3/IndirectPythonInterface.hxx" + +#include +#include + +// This mimics the Python structure, in order to minimize confusion +namespace Py +{ + class ExtensionExceptionType; + + class Object; + + class Exception + { + public: + Exception( ExtensionExceptionType &exception, const std::string &reason ); + Exception( ExtensionExceptionType &exception, Object &reason ); + + explicit Exception () + {} + + Exception (const std::string &reason) + { + PyErr_SetString( Py::_Exc_RuntimeError(), reason.c_str() ); + } + + Exception( PyObject *exception, const std::string &reason ) + { + PyErr_SetString( exception, reason.c_str() ); + } + + Exception( PyObject *exception, Object &reason ); + + void clear() // clear the error + // technically but not philosophically const + { + PyErr_Clear(); + } + }; + + + // Abstract + class StandardError: public Exception + { + protected: + explicit StandardError() + {} + }; + + class LookupError: public StandardError + { + protected: + explicit LookupError() + {} + }; + + class ArithmeticError: public StandardError + { + protected: + explicit ArithmeticError() + {} + }; + + class EnvironmentError: public StandardError + { + protected: + explicit EnvironmentError() + {} + }; + + // Concrete + + class TypeError: public StandardError + { + public: + TypeError (const std::string& reason) + : StandardError() + { + PyErr_SetString( Py::_Exc_TypeError(),reason.c_str() ); + } + }; + + class IndexError: public LookupError + { + public: + IndexError (const std::string& reason) + : LookupError() + { + PyErr_SetString( Py::_Exc_IndexError(), reason.c_str() ); + } + }; + + class AttributeError: public StandardError + { + public: + AttributeError (const std::string& reason) + : StandardError() + { + PyErr_SetString( Py::_Exc_AttributeError(), reason.c_str() ); + } + }; + + class NameError: public StandardError + { + public: + NameError (const std::string& reason) + : StandardError() + { + PyErr_SetString( Py::_Exc_NameError(), reason.c_str() ); + } + }; + + class RuntimeError: public StandardError + { + public: + RuntimeError (const std::string& reason) + : StandardError() + { + PyErr_SetString( Py::_Exc_RuntimeError(), reason.c_str() ); + } + }; + + class SystemError: public StandardError + { + public: + SystemError (const std::string& reason) + : StandardError() + { + PyErr_SetString( Py::_Exc_SystemError(),reason.c_str() ); + } + }; + + class KeyError: public LookupError + { + public: + KeyError (const std::string& reason) + : LookupError() + { + PyErr_SetString( Py::_Exc_KeyError(),reason.c_str() ); + } + }; + + + class ValueError: public StandardError + { + public: + ValueError (const std::string& reason) + : StandardError() + { + PyErr_SetString( Py::_Exc_ValueError(), reason.c_str() ); + } + }; + + class OverflowError: public ArithmeticError + { + public: + OverflowError (const std::string& reason) + : ArithmeticError() + { + PyErr_SetString( Py::_Exc_OverflowError(), reason.c_str() ); + } + }; + + class ZeroDivisionError: public ArithmeticError + { + public: + ZeroDivisionError (const std::string& reason) + : ArithmeticError() + { + PyErr_SetString( Py::_Exc_ZeroDivisionError(), reason.c_str() ); + } + }; + + class FloatingPointError: public ArithmeticError + { + public: + FloatingPointError (const std::string& reason) + : ArithmeticError() + { + PyErr_SetString( Py::_Exc_FloatingPointError(), reason.c_str() ); + } + }; + + class MemoryError: public StandardError + { + public: + MemoryError (const std::string& reason) + : StandardError() + { + PyErr_SetString( Py::_Exc_MemoryError(), reason.c_str() ); + } + }; + + class SystemExit: public StandardError + { + public: + SystemExit (const std::string& reason) + : StandardError() + { + PyErr_SetString( Py::_Exc_SystemExit(),reason.c_str() ); + } + }; + +}// Py + +#endif diff -Nru matplotlib-0.99.3/CXX/Python3/ExtensionModule.hxx matplotlib-1.0.1/CXX/Python3/ExtensionModule.hxx --- matplotlib-0.99.3/CXX/Python3/ExtensionModule.hxx 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/CXX/Python3/ExtensionModule.hxx 2010-07-07 01:41:53.000000000 +0000 @@ -0,0 +1,206 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// 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 disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED 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 REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY 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. +// +//----------------------------------------------------------------------------- + +#ifndef __CXX_ExtensionModule__h +#define __CXX_ExtensionModule__h + +namespace Py +{ + class ExtensionModuleBase + { + public: + ExtensionModuleBase( const char *name ); + virtual ~ExtensionModuleBase(); + + Module module( void ) const; // only valid after initialize() has been called + Dict moduleDictionary( void ) const; // only valid after initialize() has been called + + virtual Object invoke_method_noargs( void *method_def ) = 0; + virtual Object invoke_method_keyword( void *method_def, const Tuple &_args, const Dict &_keywords ) = 0; + virtual Object invoke_method_varargs( void *method_def, const Tuple &_args ) = 0; + + const std::string &name() const; + const std::string &fullName() const; + + // what is returned from PyInit_ function + Object moduleObject( void ) const; + + protected: + // Initialize the module + void initialize( const char *module_doc ); + + const std::string m_module_name; + const std::string m_full_module_name; + MethodTable m_method_table; + PyModuleDef m_module_def; + PyObject *m_module; + + private: + // + // prevent the compiler generating these unwanted functions + // + ExtensionModuleBase( const ExtensionModuleBase & ); //unimplemented + void operator=( const ExtensionModuleBase & ); //unimplemented + }; + + // Note: Python calls noargs as varargs buts args==NULL + extern "C" PyObject *method_noargs_call_handler( PyObject *_self_and_name_tuple, PyObject * ); + extern "C" PyObject *method_varargs_call_handler( PyObject *_self_and_name_tuple, PyObject *_args ); + extern "C" PyObject *method_keyword_call_handler( PyObject *_self_and_name_tuple, PyObject *_args, PyObject *_keywords ); + + extern "C" void do_not_dealloc( void * ); + + template + class ExtensionModule : public ExtensionModuleBase + { + public: + ExtensionModule( const char *name ) + : ExtensionModuleBase( name ) + {} + virtual ~ExtensionModule() + {} + + protected: + typedef Object (T::*method_noargs_function_t)(); + typedef Object (T::*method_varargs_function_t)( const Tuple &args ); + typedef Object (T::*method_keyword_function_t)( const Tuple &args, const Dict &kws ); + typedef std::map *> method_map_t; + + static void add_noargs_method( const char *name, method_noargs_function_t function, const char *doc="" ) + { + method_map_t &mm = methods(); + mm[ std::string( name ) ] = new MethodDefExt( name, function, method_noargs_call_handler, doc ); + } + + static void add_varargs_method( const char *name, method_varargs_function_t function, const char *doc="" ) + { + method_map_t &mm = methods(); + mm[ std::string( name ) ] = new MethodDefExt( name, function, method_varargs_call_handler, doc ); + } + + static void add_keyword_method( const char *name, method_keyword_function_t function, const char *doc="" ) + { + method_map_t &mm = methods(); + mm[ std::string( name ) ] = new MethodDefExt( name, function, method_keyword_call_handler, doc ); + } + + void initialize( const char *module_doc="" ) + { + ExtensionModuleBase::initialize( module_doc ); + Dict dict( moduleDictionary() ); + + // + // put each of the methods into the modules dictionary + // so that we get called back at the function in T. + // + method_map_t &mm = methods(); + EXPLICIT_TYPENAME method_map_t::const_iterator i = mm.begin(); + EXPLICIT_TYPENAME method_map_t::const_iterator i_end = mm.end(); + for ( ; i != i_end; ++i ) + { + MethodDefExt *method_def = (*i).second; + + static PyObject *self = PyCObject_FromVoidPtr( this, do_not_dealloc ); + + Tuple args( 2 ); + args[0] = Object( self ); + args[1] = Object( PyCObject_FromVoidPtr( method_def, do_not_dealloc ) ); + + PyObject *func = PyCFunction_New + ( + &method_def->ext_meth_def, + new_reference_to( args ) + ); + + method_def->py_method = Object( func, true ); + + dict[ (*i).first ] = method_def->py_method; + } + } + + protected: // Tom Malcolmson reports that derived classes need access to these + static method_map_t &methods( void ) + { + static method_map_t *map_of_methods = NULL; + if( map_of_methods == NULL ) + map_of_methods = new method_map_t; + + return *map_of_methods; + } + + // this invoke function must be called from within a try catch block + virtual Object invoke_method_noargs( void *method_def ) + { + // cast up to the derived class, method_def and call + T *self = static_cast( this ); + MethodDefExt *meth_def = reinterpret_cast *>( method_def ); + + return (self->*meth_def->ext_noargs_function)(); + } + + // this invoke function must be called from within a try catch block + virtual Object invoke_method_varargs( void *method_def, const Tuple &args ) + { + // cast up to the derived class, method_def and call + T *self = static_cast( this ); + MethodDefExt *meth_def = reinterpret_cast *>( method_def ); + + return (self->*meth_def->ext_varargs_function)( args ); + } + + // this invoke function must be called from within a try catch block + virtual Object invoke_method_keyword( void *method_def, const Tuple &args, const Dict &keywords ) + { + // cast up to the derived class, method_def and call + T *self = static_cast( this ); + MethodDefExt *meth_def = reinterpret_cast *>( method_def ); + + return (self->*meth_def->ext_keyword_function)( args, keywords ); + } + + private: + // + // prevent the compiler generating these unwanted functions + // + ExtensionModule( const ExtensionModule & ); //unimplemented + void operator=( const ExtensionModule & ); //unimplemented + }; +} // Namespace Py + + +// End of __CXX_ExtensionModule__h +#endif diff -Nru matplotlib-0.99.3/CXX/Python3/ExtensionOldType.hxx matplotlib-1.0.1/CXX/Python3/ExtensionOldType.hxx --- matplotlib-0.99.3/CXX/Python3/ExtensionOldType.hxx 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/CXX/Python3/ExtensionOldType.hxx 2010-07-07 01:41:53.000000000 +0000 @@ -0,0 +1,393 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// 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 disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED 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 REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY 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. +// +//----------------------------------------------------------------------------- + +#ifndef __CXX_ExtensionOldType__h +#define __CXX_ExtensionOldType__h + +namespace Py +{ + template class PythonExtension + : public PythonExtensionBase + { + public: + static PyTypeObject *type_object() + { + return behaviors().type_object(); + } + + static bool check( PyObject *p ) + { + // is p like me? + return p->ob_type == type_object(); + } + + static bool check( const Object &ob ) + { + return check( ob.ptr() ); + } + + // + // every object needs getattr implemented + // to support methods + // + virtual Object getattr( const char *name ) + { + return getattr_methods( name ); + } + + PyObject *selfPtr() + { + return this; + } + + protected: + explicit PythonExtension() + : PythonExtensionBase() + { + PyObject_Init( this, type_object() ); + + // every object must support getattr + behaviors().supportGetattr(); + } + + virtual ~PythonExtension() + {} + + static PythonType &behaviors() + { + static PythonType* p; + if( p == NULL ) + { +#if defined( _CPPRTTI ) || defined( __GNUG__ ) + const char *default_name =( typeid( T ) ).name(); +#else + const char *default_name = "unknown"; +#endif + p = new PythonType( sizeof( T ), 0, default_name ); + p->set_tp_dealloc( extension_object_deallocator ); + } + + return *p; + } + + typedef Object (T::*method_noargs_function_t)(); + typedef Object (T::*method_varargs_function_t)( const Tuple &args ); + typedef Object (T::*method_keyword_function_t)( const Tuple &args, const Dict &kws ); + typedef std::map *> method_map_t; + + // support the default attributes, __name__, __doc__ and methods + virtual Object getattr_default( const char *_name ) + { + std::string name( _name ); + + if( name == "__name__" && type_object()->tp_name != NULL ) + { + return Py::String( type_object()->tp_name ); + } + + if( name == "__doc__" && type_object()->tp_doc != NULL ) + { + return Py::String( type_object()->tp_doc ); + } + +// trying to fake out being a class for help() +// else if( name == "__bases__" ) +// { +// return Py::Tuple( 0 ); +// } +// else if( name == "__module__" ) +// { +// return Py::Nothing(); +// } +// else if( name == "__dict__" ) +// { +// return Py::Dict(); +// } + + return getattr_methods( _name ); + } + + // turn a name into function object + virtual Object getattr_methods( const char *_name ) + { + std::string name( _name ); + + method_map_t &mm = methods(); + + // see if name exists and get entry with method + EXPLICIT_TYPENAME method_map_t::const_iterator i = mm.find( name ); + if( i == mm.end() ) + { + if( name == "__methods__" ) + { + List methods; + + i = mm.begin(); + EXPLICIT_TYPENAME method_map_t::const_iterator i_end = mm.end(); + + for( ; i != i_end; ++i ) + methods.append( String( (*i).first ) ); + + return methods; + } + + throw AttributeError( name ); + } + + MethodDefExt *method_def = i->second; + + Tuple self( 2 ); + + self[0] = Object( this ); + self[1] = Object( PyCObject_FromVoidPtr( method_def, do_not_dealloc ) ); + + PyObject *func = PyCFunction_New( &method_def->ext_meth_def, self.ptr() ); + + return Object(func, true); + } + + // check that all methods added are unique + static void check_unique_method_name( const char *name ) + { + method_map_t &mm = methods(); + EXPLICIT_TYPENAME method_map_t::const_iterator i; + i = mm.find( name ); + if( i != mm.end() ) + throw AttributeError( name ); + } + + static void add_noargs_method( const char *name, method_noargs_function_t function, const char *doc="" ) + { + check_unique_method_name( name ); + method_map_t &mm = methods(); + mm[ std::string( name ) ] = new MethodDefExt( name, function, method_noargs_call_handler, doc ); + } + + static void add_varargs_method( const char *name, method_varargs_function_t function, const char *doc="" ) + { + check_unique_method_name( name ); + method_map_t &mm = methods(); + mm[ std::string( name ) ] = new MethodDefExt( name, function, method_varargs_call_handler, doc ); + } + + static void add_keyword_method( const char *name, method_keyword_function_t function, const char *doc="" ) + { + check_unique_method_name( name ); + method_map_t &mm = methods(); + mm[ std::string( name ) ] = new MethodDefExt( name, function, method_keyword_call_handler, doc ); + } + + private: + static method_map_t &methods( void ) + { + static method_map_t *map_of_methods = NULL; + if( map_of_methods == NULL ) + map_of_methods = new method_map_t; + + return *map_of_methods; + } + + // Note: Python calls noargs as varargs buts args==NULL + static PyObject *method_noargs_call_handler( PyObject *_self_and_name_tuple, PyObject * ) + { + try + { + Tuple self_and_name_tuple( _self_and_name_tuple ); + + PyObject *self_in_cobject = self_and_name_tuple[0].ptr(); + T *self = static_cast( self_in_cobject ); + + MethodDefExt *meth_def = reinterpret_cast *>( + PyCObject_AsVoidPtr( self_and_name_tuple[1].ptr() ) ); + + Object result; + + // Adding try & catch in case of STL debug-mode exceptions. + #ifdef _STLP_DEBUG + try + { + result = (self->*meth_def->ext_noargs_function)(); + } + catch( std::__stl_debug_exception ) + { + // throw cxx::RuntimeError( sErrMsg ); + throw RuntimeError( "Error message not set yet." ); + } + #else + result = (self->*meth_def->ext_noargs_function)(); + #endif // _STLP_DEBUG + + return new_reference_to( result.ptr() ); + } + catch( Exception & ) + { + return 0; + } + } + + static PyObject *method_varargs_call_handler( PyObject *_self_and_name_tuple, PyObject *_args ) + { + try + { + Tuple self_and_name_tuple( _self_and_name_tuple ); + + PyObject *self_in_cobject = self_and_name_tuple[0].ptr(); + T *self = static_cast( self_in_cobject ); + MethodDefExt *meth_def = reinterpret_cast *>( + PyCObject_AsVoidPtr( self_and_name_tuple[1].ptr() ) ); + + Tuple args( _args ); + + Object result; + + // Adding try & catch in case of STL debug-mode exceptions. + #ifdef _STLP_DEBUG + try + { + result = (self->*meth_def->ext_varargs_function)( args ); + } + catch( std::__stl_debug_exception ) + { + throw RuntimeError( "Error message not set yet." ); + } + #else + result = (self->*meth_def->ext_varargs_function)( args ); + #endif // _STLP_DEBUG + + return new_reference_to( result.ptr() ); + } + catch( Exception & ) + { + return 0; + } + } + + static PyObject *method_keyword_call_handler( PyObject *_self_and_name_tuple, PyObject *_args, PyObject *_keywords ) + { + try + { + Tuple self_and_name_tuple( _self_and_name_tuple ); + + PyObject *self_in_cobject = self_and_name_tuple[0].ptr(); + T *self = static_cast( self_in_cobject ); + MethodDefExt *meth_def = reinterpret_cast *>( + PyCObject_AsVoidPtr( self_and_name_tuple[1].ptr() ) ); + + Tuple args( _args ); + + // _keywords may be NULL so be careful about the way the dict is created + Dict keywords; + if( _keywords != NULL ) + keywords = Dict( _keywords ); + + Object result( ( self->*meth_def->ext_keyword_function )( args, keywords ) ); + + return new_reference_to( result.ptr() ); + } + catch( Exception & ) + { + return 0; + } + } + + static void extension_object_deallocator( PyObject* t ) + { + delete (T *)( t ); + } + + // + // prevent the compiler generating these unwanted functions + // + explicit PythonExtension( const PythonExtension &other ); + void operator=( const PythonExtension &rhs ); + }; + + // + // ExtensionObject is an Object that will accept only T's. + // + template + class ExtensionObject: public Object + { + public: + + explicit ExtensionObject( PyObject *pyob ) + : Object( pyob ) + { + validate(); + } + + ExtensionObject( const ExtensionObject &other ) + : Object( *other ) + { + validate(); + } + + ExtensionObject( const Object &other ) + : Object( *other ) + { + validate(); + } + + ExtensionObject &operator=( const Object &rhs ) + { + return( *this = *rhs ); + } + + ExtensionObject &operator=( PyObject *rhsp ) + { + if( ptr() != rhsp ) + set( rhsp ); + return *this; + } + + virtual bool accepts( PyObject *pyob ) const + { + return( pyob && T::check( pyob ) ); + } + + // + // Obtain a pointer to the PythonExtension object + // + T *extensionObject( void ) + { + return static_cast( ptr() ); + } + }; +} // Namespace Py + +// End of __CXX_ExtensionOldType__h +#endif diff -Nru matplotlib-0.99.3/CXX/Python3/Extensions.hxx matplotlib-1.0.1/CXX/Python3/Extensions.hxx --- matplotlib-0.99.3/CXX/Python3/Extensions.hxx 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/CXX/Python3/Extensions.hxx 2010-07-07 01:41:53.000000000 +0000 @@ -0,0 +1,189 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// 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 disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED 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 REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY 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. +// +//----------------------------------------------------------------------------- + +#ifndef __CXX_Extensions__h +#define __CXX_Extensions__h + + +#ifdef _MSC_VER +// disable warning C4786: symbol greater than 255 character, +// okay to ignore +#pragma warning( disable: 4786 ) +#endif + +#include "CXX/WrapPython.h" +#include "CXX/Version.hxx" +#include "CXX/Python3/Config.hxx" +#include "CXX/Python3/CxxDebug.hxx" +#include "CXX/Python3/Objects.hxx" + +extern "C" { extern PyObject py_object_initializer; } + +#include +#include + +// ---------------------------------------------------------------------- + +namespace Py +{ + class ExtensionModuleBase; + + // Make an Exception Type for use in raising custom exceptions + class ExtensionExceptionType : public Object + { + public: + ExtensionExceptionType(); + virtual ~ExtensionExceptionType(); + + // call init to create the type + void init( ExtensionModuleBase &module, const std::string &name, ExtensionExceptionType &parent ); + void init( ExtensionModuleBase &module, const std::string &name ); + }; + + class MethodTable + { + public: + MethodTable(); + virtual ~MethodTable(); + + void add( const char *method_name, PyCFunction f, const char *doc="", int flag=1 ); + PyMethodDef *table(); + + protected: + std::vector t; // accumulator of PyMethodDef's + PyMethodDef *mt; // Actual method table produced when full + + static PyMethodDef method( const char* method_name, PyCFunction f, int flags=1, const char* doc="" ); + + private: + // + // prevent the compiler generating these unwanted functions + // + MethodTable( const MethodTable &m ); //unimplemented + void operator=( const MethodTable &m ); //unimplemented + + }; // end class MethodTable + + // Note: Python calls noargs as varargs buts args==NULL + extern "C" typedef PyObject *(*method_noargs_call_handler_t)( PyObject *_self, PyObject * ); + extern "C" typedef PyObject *(*method_varargs_call_handler_t)( PyObject *_self, PyObject *_args ); + extern "C" typedef PyObject *(*method_keyword_call_handler_t)( PyObject *_self, PyObject *_args, PyObject *_dict ); + + template + class MethodDefExt : public PyMethodDef + { + public: + typedef Object (T::*method_noargs_function_t)(); + typedef Object (T::*method_varargs_function_t)( const Tuple &args ); + typedef Object (T::*method_keyword_function_t)( const Tuple &args, const Dict &kws ); + + // NOARGS + MethodDefExt + ( + const char *_name, + method_noargs_function_t _function, + method_noargs_call_handler_t _handler, + const char *_doc + ) + { + ext_meth_def.ml_name = const_cast( _name ); + ext_meth_def.ml_meth = reinterpret_cast( _handler ); + ext_meth_def.ml_flags = METH_NOARGS; + ext_meth_def.ml_doc = const_cast( _doc ); + + ext_noargs_function = _function; + ext_varargs_function = NULL; + ext_keyword_function = NULL; + } + + // VARARGS + MethodDefExt + ( + const char *_name, + method_varargs_function_t _function, + method_varargs_call_handler_t _handler, + const char *_doc + ) + { + ext_meth_def.ml_name = const_cast( _name ); + ext_meth_def.ml_meth = reinterpret_cast( _handler ); + ext_meth_def.ml_flags = METH_VARARGS; + ext_meth_def.ml_doc = const_cast( _doc ); + + ext_noargs_function = NULL; + ext_varargs_function = _function; + ext_keyword_function = NULL; + } + + // VARARGS + KEYWORD + MethodDefExt + ( + const char *_name, + method_keyword_function_t _function, + method_keyword_call_handler_t _handler, + const char *_doc + ) + { + ext_meth_def.ml_name = const_cast( _name ); + ext_meth_def.ml_meth = reinterpret_cast( _handler ); + ext_meth_def.ml_flags = METH_VARARGS|METH_KEYWORDS; + ext_meth_def.ml_doc = const_cast( _doc ); + + ext_noargs_function = NULL; + ext_varargs_function = NULL; + ext_keyword_function = _function; + } + + ~MethodDefExt() + {} + + PyMethodDef ext_meth_def; + method_noargs_function_t ext_noargs_function; + method_varargs_function_t ext_varargs_function; + method_keyword_function_t ext_keyword_function; + Object py_method; + }; +} // Namespace Py + +#include "CXX/Python3/ExtensionModule.hxx" +#include "CXX/Python3/PythonType.hxx" +#include "CXX/Python3/ExtensionTypeBase.hxx" +#include "CXX/Python3/ExtensionOldType.hxx" +#include "CXX/Python3/ExtensionType.hxx" + +// End of CXX_Extensions.h +#endif diff -Nru matplotlib-0.99.3/CXX/Python3/ExtensionTypeBase.hxx matplotlib-1.0.1/CXX/Python3/ExtensionTypeBase.hxx --- matplotlib-0.99.3/CXX/Python3/ExtensionTypeBase.hxx 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/CXX/Python3/ExtensionTypeBase.hxx 2010-07-07 01:41:53.000000000 +0000 @@ -0,0 +1,137 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// 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 disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED 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 REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY 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. +// +//----------------------------------------------------------------------------- + +#ifndef __CXX_ExtensionTypeBase__h +#define __CXX_ExtensionTypeBase__h + +namespace Py +{ + // Class PythonExtension is what you inherit from to create + // a new Python extension type. You give your class itself + // as the template paramter. + + // There are two ways that extension objects can get destroyed. + // 1. Their reference count goes to zero + // 2. Someone does an explicit delete on a pointer. + // In(1) the problem is to get the destructor called + // We register a special deallocator in the Python type object + // (see behaviors()) to do this. + // In(2) there is no problem, the dtor gets called. + + // PythonExtension does not use the usual Python heap allocator, + // instead using new/delete. We do the setting of the type object + // and reference count, usually done by PyObject_New, in the + // base class ctor. + + // This special deallocator does a delete on the pointer. + + class PythonExtensionBase : public PyObject + { + public: + PythonExtensionBase(); + virtual ~PythonExtensionBase(); + + public: + // object + virtual void reinit( Tuple &args, Dict &kwds ); + + // object basics +#ifdef PYCXX_PYTHON_2TO3 + virtual int print( FILE *, int ); +#endif + virtual Object getattr( const char * ); + virtual int setattr( const char *, const Object & ); + virtual Object getattro( const String & ); + Object genericGetAttro( const String & ); + virtual int setattro( const String &, const Object & ); + int genericSetAttro( const String &, const Object & ); + virtual int compare( const Object & ); + virtual Object rich_compare( const Object &, int ); + virtual Object repr(); + virtual Object str(); + virtual long hash(); + virtual Object call( const Object &, const Object & ); + virtual Object iter(); + virtual PyObject *iternext(); + + // Sequence methods + virtual int sequence_length(); + virtual Object sequence_concat( const Object & ); + virtual Object sequence_repeat( Py_ssize_t ); + virtual Object sequence_item( Py_ssize_t ); + virtual int sequence_ass_item( Py_ssize_t, const Object & ); + + // Mapping + virtual int mapping_length(); + virtual Object mapping_subscript( const Object & ); + virtual int mapping_ass_subscript( const Object &, const Object & ); + + // Number + virtual Object number_negative(); + virtual Object number_positive(); + virtual Object number_absolute(); + virtual Object number_invert(); + virtual Object number_int(); + virtual Object number_float(); + virtual Object number_long(); + virtual Object number_add( const Object & ); + virtual Object number_subtract( const Object & ); + virtual Object number_multiply( const Object & ); + virtual Object number_remainder( const Object & ); + virtual Object number_divmod( const Object & ); + virtual Object number_lshift( const Object & ); + virtual Object number_rshift( const Object & ); + virtual Object number_and( const Object & ); + virtual Object number_xor( const Object & ); + virtual Object number_or( const Object & ); + virtual Object number_power( const Object &, const Object & ); + + // Buffer + // QQQ need to add py3 interface + + public: + virtual PyObject *selfPtr() = 0; + + private: + void missing_method( void ); + static PyObject *method_call_handler( PyObject *self, PyObject *args ); + }; + +} // Namespace Py + +// End of __CXX_ExtensionTypeBase__h +#endif diff -Nru matplotlib-0.99.3/CXX/Python3/ExtensionType.hxx matplotlib-1.0.1/CXX/Python3/ExtensionType.hxx --- matplotlib-0.99.3/CXX/Python3/ExtensionType.hxx 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/CXX/Python3/ExtensionType.hxx 2010-07-07 01:41:53.000000000 +0000 @@ -0,0 +1,370 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// 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 disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED 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 REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY 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. +// +//----------------------------------------------------------------------------- + +#ifndef __CXX_ExtensionClass__h +#define __CXX_ExtensionClass__h + +#define PYCXX_NOARGS_METHOD_NAME( NAME ) _callNoArgsMethod__##NAME +#define PYCXX_VARARGS_METHOD_NAME( NAME ) _callVarArgsMethod__##NAME +#define PYCXX_KEYWORDS_METHOD_NAME( NAME ) _callKeywordsMethod__##NAME + +#define PYCXX_NOARGS_METHOD_DECL( CLS, NAME ) \ + static PyObject *PYCXX_NOARGS_METHOD_NAME( NAME )( PyObject *_self, PyObject *, PyObject * ) \ + { \ + Py::PythonClassInstance *self_python = reinterpret_cast< Py::PythonClassInstance * >( _self ); \ + CLS *self = reinterpret_cast< CLS * >( self_python->m_pycxx_object ); \ + Py::Object r( (self->NAME)() ); \ + return Py::new_reference_to( r.ptr() ); \ + } +#define PYCXX_VARARGS_METHOD_DECL( CLS, NAME ) \ + static PyObject *PYCXX_VARARGS_METHOD_NAME( NAME )( PyObject *_self, PyObject *_a, PyObject * ) \ + { \ + Py::PythonClassInstance *self_python = reinterpret_cast< Py::PythonClassInstance * >( _self ); \ + CLS *self = reinterpret_cast< CLS * >( self_python->m_pycxx_object ); \ + Py::Tuple a( _a ); \ + Py::Object r( (self->NAME)( a ) ); \ + return Py::new_reference_to( r.ptr() ); \ + } +#define PYCXX_KEYWORDS_METHOD_DECL( CLS, NAME ) \ + static PyObject *PYCXX_KEYWORDS_METHOD_NAME( NAME )( PyObject *_self, PyObject *_a, PyObject *_k ) \ + { \ + Py::PythonClassInstance *self_python = reinterpret_cast< Py::PythonClassInstance * >( _self ); \ + CLS *self = reinterpret_cast< CLS * >( self_python->m_pycxx_object ); \ + Py::Tuple a( _a ); \ + Py::Dict k; \ + if( _k != NULL ) \ + k = _k; \ + Py::Object r( (self->NAME)( a, k ) ); \ + return Py::new_reference_to( r.ptr() ); \ + } + +// need to support METH_STATIC and METH_CLASS + +#define PYCXX_ADD_NOARGS_METHOD( NAME, docs ) \ + add_method( #NAME, (PyCFunction)PYCXX_NOARGS_METHOD_NAME( NAME ), METH_NOARGS, docs ) +#define PYCXX_ADD_VARARGS_METHOD( NAME, docs ) \ + add_method( #NAME, (PyCFunction)PYCXX_VARARGS_METHOD_NAME( NAME ), METH_VARARGS, docs ) +#define PYCXX_ADD_KEYWORDS_METHOD( NAME, docs ) \ + add_method( #NAME, (PyCFunction)PYCXX_KEYWORDS_METHOD_NAME( NAME ), METH_VARARGS | METH_KEYWORDS, docs ) + +namespace Py +{ + struct PythonClassInstance + { + PyObject_HEAD + PythonExtensionBase *m_pycxx_object; + }; + + + class ExtensionClassMethodsTable + { + public: + ExtensionClassMethodsTable() + : m_methods_table( new PyMethodDef[ METHOD_TABLE_SIZE_INCREMENT ] ) + , m_methods_used( 0 ) + , m_methods_size( METHOD_TABLE_SIZE_INCREMENT ) + { + } + + ~ExtensionClassMethodsTable() + { + delete m_methods_table; + } + + // check that all methods added are unique + void check_unique_method_name( const char *_name ) + { + std::string name( _name ); + for( int i=0; iml_name = name; + p->ml_meth = function; + p->ml_flags = flags; + p->ml_doc = doc; + + m_methods_used++; + p++; + + // add the sentinel marking the table end + p->ml_name = NULL; + p->ml_meth = NULL; + p->ml_flags = 0; + p->ml_doc = NULL; + + return m_methods_table; + } + + private: + enum {METHOD_TABLE_SIZE_INCREMENT = 1}; + PyMethodDef *m_methods_table; + int m_methods_used; + int m_methods_size; + }; + + template class PythonClass + : public PythonExtensionBase + { + protected: + explicit PythonClass( PythonClassInstance *self, Tuple &args, Dict &kwds ) + : PythonExtensionBase() + , m_self( self ) + { + // we are a class + behaviors().supportClass(); + } + + virtual ~PythonClass() + {} + + static ExtensionClassMethodsTable &methodTable() + { + static ExtensionClassMethodsTable *method_table; + if( method_table == NULL ) + method_table = new ExtensionClassMethodsTable; + return *method_table; + } + + static void add_method( const char *name, PyCFunction function, int flags, const char *doc=NULL ) + { + behaviors().set_methods( methodTable().add_method( name, function, flags, doc ) ); + } + + static PythonType &behaviors() + { + static PythonType *p; + if( p == NULL ) + { +#if defined( _CPPRTTI ) || defined( __GNUG__ ) + const char *default_name = (typeid( T )).name(); +#else + const char *default_name = "unknown"; +#endif + p = new PythonType( sizeof( T ), 0, default_name ); + p->set_tp_new( extension_object_new ); + p->set_tp_init( extension_object_init ); + p->set_tp_dealloc( extension_object_deallocator ); + } + + return *p; + } + + static PyObject *extension_object_new( PyTypeObject *subtype, PyObject *args, PyObject *kwds ) + { +#ifdef PYCXX_DEBUG + std::cout << "extension_object_new()" << std::endl; +#endif + PythonClassInstance *o = reinterpret_cast( subtype->tp_alloc( subtype, 0 ) ); + if( o == NULL ) + return NULL; + + o->m_pycxx_object = NULL; + + PyObject *self = reinterpret_cast( o ); +#ifdef PYCXX_DEBUG + std::cout << "extension_object_new() => self=0x" << std::hex << reinterpret_cast< unsigned int >( self ) << std::dec << std::endl; +#endif + return self; + } + + static int extension_object_init( PyObject *_self, PyObject *args_, PyObject *kwds_ ) + { + try + { + Py::Tuple args( args_ ); + Py::Dict kwds; + if( kwds_ != NULL ) + kwds = kwds_; + + PythonClassInstance *self = reinterpret_cast( _self ); +#ifdef PYCXX_DEBUG + std::cout << "extension_object_init( self=0x" << std::hex << reinterpret_cast< unsigned int >( self ) << std::dec << " )" << std::endl; + std::cout << " self->cxx_object=0x" << std::hex << reinterpret_cast< unsigned int >( self->cxx_object ) << std::dec << std::endl; +#endif + + if( self->m_pycxx_object == NULL ) + { + self->m_pycxx_object = new T( self, args, kwds ); +#ifdef PYCXX_DEBUG + std::cout << " self->m_pycxx_object=0x" << std::hex << reinterpret_cast< unsigned int >( self->m_pycxx_object ) << std::dec << std::endl; +#endif + } + else + { +#ifdef PYCXX_DEBUG + std::cout << " reinit - self->m_pycxx_object=0x" << std::hex << reinterpret_cast< unsigned int >( self->m_pycxx_object ) << std::dec << std::endl; +#endif + self->m_pycxx_object->reinit( args, kwds ); + } + } + catch( Exception & ) + { + return -1; + } + return 0; + } + + static void extension_object_deallocator( PyObject *_self ) + { + PythonClassInstance *self = reinterpret_cast< PythonClassInstance * >( _self ); +#ifdef PYCXX_DEBUG + std::cout << "extension_object_deallocator( self=0x" << std::hex << reinterpret_cast< unsigned int >( self ) << std::dec << " )" << std::endl; + std::cout << " self->cxx_object=0x" << std::hex << reinterpret_cast< unsigned int >( self->cxx_object ) << std::dec << std::endl; +#endif + delete self->m_pycxx_object; + } + + public: + static PyTypeObject *type_object() + { + return behaviors().type_object(); + } + + static Object type() + { + return Object( reinterpret_cast( behaviors().type_object() ) ); + } + + static bool check( PyObject *p ) + { + // is p like me? + return p->ob_type == type_object(); + } + + static bool check( const Object &ob ) + { + return check( ob.ptr() ); + } + + PyObject *selfPtr() + { + return reinterpret_cast( m_self ); + } + + protected: + private: + PythonClassInstance *m_self; + + private: + // + // prevent the compiler generating these unwanted functions + // + explicit PythonClass( const PythonClass &other ); + void operator=( const PythonClass &rhs ); + }; + + // + // ExtensionObject is an Object that will accept only T's. + // + template + class PythonClassObject: public Object + { + public: + + explicit PythonClassObject( PyObject *pyob ) + : Object( pyob ) + { + validate(); + } + + PythonClassObject( const PythonClassObject &other ) + : Object( *other ) + { + validate(); + } + + PythonClassObject( const Object &other ) + : Object( *other ) + { + validate(); + } + + PythonClassObject &operator=( const Object &rhs ) + { + *this = *rhs; + return *this; + } + + PythonClassObject &operator=( PyObject *rhsp ) + { + if( ptr() != rhsp ) + set( rhsp ); + return *this; + } + + virtual bool accepts( PyObject *pyob ) const + { + return( pyob && T::check( pyob ) ); + } + + // + // Obtain a pointer to the PythonExtension object + // + T *getCxxObject( void ) + { + return static_cast( ptr() ); + } + }; +} // Namespace Py + +// End of __CXX_ExtensionClass__h +#endif diff -Nru matplotlib-0.99.3/CXX/Python3/IndirectPythonInterface.cxx matplotlib-1.0.1/CXX/Python3/IndirectPythonInterface.cxx --- matplotlib-0.99.3/CXX/Python3/IndirectPythonInterface.cxx 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/CXX/Python3/IndirectPythonInterface.cxx 2010-07-07 01:41:53.000000000 +0000 @@ -0,0 +1,527 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// 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 disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED 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 REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY 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. +// +//----------------------------------------------------------------------------- + +#include "CXX/IndirectPythonInterface.hxx" + +namespace Py +{ +bool _CFunction_Check( PyObject *op ) { return op->ob_type == _CFunction_Type(); } +bool _CObject_Check( PyObject *op ) { return op->ob_type == _CObject_Type(); } +bool _Complex_Check( PyObject *op ) { return op->ob_type == _Complex_Type(); } +bool _Dict_Check( PyObject *op ) { return op->ob_type == _Dict_Type(); } +bool _Float_Check( PyObject *op ) { return op->ob_type == _Float_Type(); } +bool _Function_Check( PyObject *op ) { return op->ob_type == _Function_Type(); } +bool _Boolean_Check( PyObject *op ) { return op->ob_type == _Bool_Type(); } +bool _List_Check( PyObject *op ) { return op->ob_type == _List_Type(); } +bool _Long_Check( PyObject *op ) { return op->ob_type == _Long_Type(); } +bool _Method_Check( PyObject *op ) { return op->ob_type == _Method_Type(); } +bool _Module_Check( PyObject *op ) { return op->ob_type == _Module_Type(); } +bool _Range_Check( PyObject *op ) { return op->ob_type == _Range_Type(); } +bool _Slice_Check( PyObject *op ) { return op->ob_type == _Slice_Type(); } +bool _TraceBack_Check( PyObject *op ) { return op->ob_type == _TraceBack_Type(); } +bool _Tuple_Check( PyObject *op ) { return op->ob_type == _Tuple_Type(); } +bool _Type_Check( PyObject *op ) { return op->ob_type == _Type_Type(); } +bool _Unicode_Check( PyObject *op ) { return op->ob_type == _Unicode_Type(); } +bool _Bytes_Check( PyObject *op ) { return op->ob_type == _Bytes_Type(); } + +#if defined(PY_WIN32_DELAYLOAD_PYTHON_DLL) + +#if defined(MS_WINDOWS) +#include + + +static HMODULE python_dll; + +static PyObject *ptr__Exc_ArithmeticError = NULL; +static PyObject *ptr__Exc_AssertionError = NULL; +static PyObject *ptr__Exc_AttributeError = NULL; +static PyObject *ptr__Exc_EnvironmentError = NULL; +static PyObject *ptr__Exc_EOFError = NULL; +static PyObject *ptr__Exc_Exception = NULL; +static PyObject *ptr__Exc_FloatingPointError = NULL; +static PyObject *ptr__Exc_ImportError = NULL; +static PyObject *ptr__Exc_IndexError = NULL; +static PyObject *ptr__Exc_IOError = NULL; +static PyObject *ptr__Exc_KeyboardInterrupt = NULL; +static PyObject *ptr__Exc_KeyError = NULL; +static PyObject *ptr__Exc_LookupError = NULL; +static PyObject *ptr__Exc_MemoryError = NULL; +static PyObject *ptr__Exc_MemoryErrorInst = NULL; +static PyObject *ptr__Exc_NameError = NULL; +static PyObject *ptr__Exc_NotImplementedError = NULL; +static PyObject *ptr__Exc_OSError = NULL; +static PyObject *ptr__Exc_OverflowError = NULL; +static PyObject *ptr__Exc_RuntimeError = NULL; +static PyObject *ptr__Exc_StandardError = NULL; +static PyObject *ptr__Exc_SyntaxError = NULL; +static PyObject *ptr__Exc_SystemError = NULL; +static PyObject *ptr__Exc_SystemExit = NULL; +static PyObject *ptr__Exc_TypeError = NULL; +static PyObject *ptr__Exc_ValueError = NULL; +static PyObject *ptr__Exc_ZeroDivisionError = NULL; + +#ifdef MS_WINDOWS +static PyObject *ptr__Exc_WindowsError = NULL; +#endif + +static PyObject *ptr__Exc_IndentationError = NULL; +static PyObject *ptr__Exc_TabError = NULL; +static PyObject *ptr__Exc_UnboundLocalError = NULL; +static PyObject *ptr__Exc_UnicodeError = NULL; +static PyObject *ptr__PyNone = NULL; +static PyObject *ptr__PyFalse = NULL; +static PyObject *ptr__PyTrue = NULL; +static PyTypeObject *ptr__CFunction_Type = NULL; +static PyTypeObject *ptr__CObject_Type = NULL; +static PyTypeObject *ptr__Complex_Type = NULL; +static PyTypeObject *ptr__Dict_Type = NULL; +static PyTypeObject *ptr__Float_Type = NULL; +static PyTypeObject *ptr__Function_Type = NULL; +static PyTypeObject *ptr__List_Type = NULL; +static PyTypeObject *ptr__Long_Type = NULL; +static PyTypeObject *ptr__Method_Type = NULL; +static PyTypeObject *ptr__Module_Type = NULL; +static PyTypeObject *ptr__Range_Type = NULL; +static PyTypeObject *ptr__Slice_Type = NULL; +static PyTypeObject *ptr__TraceBack_Type = NULL; +static PyTypeObject *ptr__Tuple_Type = NULL; +static PyTypeObject *ptr__Type_Type = NULL; + +static int *ptr_Py_DebugFlag = NULL; +static int *ptr_Py_InteractiveFlag = NULL; +static int *ptr_Py_OptimizeFlag = NULL; +static int *ptr_Py_NoSiteFlag = NULL; +static int *ptr_Py_VerboseFlag = NULL; + +static char **ptr__Py_PackageContext = NULL; + +#ifdef Py_REF_DEBUG +int *ptr_Py_RefTotal; +#endif + + +//-------------------------------------------------------------------------------- +class GetAddressException +{ +public: + GetAddressException( const char *_name ) + : name( _name ) + {} + virtual ~GetAddressException() {} + const char *name; +}; + + +//-------------------------------------------------------------------------------- +static PyObject *GetPyObjectPointer_As_PyObjectPointer( const char *name ) +{ + FARPROC addr = GetProcAddress( python_dll, name ); + if( addr == NULL ) + throw GetAddressException( name ); + + return *(PyObject **)addr; +} + +static PyObject *GetPyObject_As_PyObjectPointer( const char *name ) +{ + FARPROC addr = GetProcAddress( python_dll, name ); + if( addr == NULL ) + throw GetAddressException( name ); + + return (PyObject *)addr; +} + +static PyTypeObject *GetPyTypeObjectPointer_As_PyTypeObjectPointer( const char *name ) +{ + FARPROC addr = GetProcAddress( python_dll, name ); + if( addr == NULL ) + throw GetAddressException( name ); + + return *(PyTypeObject **)addr; +} + +static PyTypeObject *GetPyTypeObject_As_PyTypeObjectPointer( const char *name ) +{ + FARPROC addr = GetProcAddress( python_dll, name ); + if( addr == NULL ) + throw GetAddressException( name ); + + return (PyTypeObject *)addr; +} + +static int *GetInt_as_IntPointer( const char *name ) +{ + FARPROC addr = GetProcAddress( python_dll, name ); + if( addr == NULL ) + throw GetAddressException( name ); + + return (int *)addr; +} + +static char **GetCharPointer_as_CharPointerPointer( const char *name ) +{ + FARPROC addr = GetProcAddress( python_dll, name ); + if( addr == NULL ) + throw GetAddressException( name ); + + return (char **)addr; +} + + +#ifdef _DEBUG +static const char python_dll_name_format[] = "PYTHON%1.1d%1.1d_D.DLL"; +#else +static const char python_dll_name_format[] = "PYTHON%1.1d%1.1d.DLL"; +#endif + +//-------------------------------------------------------------------------------- +bool InitialisePythonIndirectInterface() +{ + char python_dll_name[sizeof(python_dll_name_format)]; + + sprintf( python_dll_name, python_dll_name_format, PY_MAJOR_VERSION, PY_MINOR_VERSION ); + + python_dll = LoadLibrary( python_dll_name ); + if( python_dll == NULL ) + return false; + + try + { +#ifdef Py_REF_DEBUG + ptr_Py_RefTotal = GetInt_as_IntPointer( "_Py_RefTotal" ); +#endif + ptr_Py_DebugFlag = GetInt_as_IntPointer( "Py_DebugFlag" ); + ptr_Py_InteractiveFlag = GetInt_as_IntPointer( "Py_InteractiveFlag" ); + ptr_Py_OptimizeFlag = GetInt_as_IntPointer( "Py_OptimizeFlag" ); + ptr_Py_NoSiteFlag = GetInt_as_IntPointer( "Py_NoSiteFlag" ); + ptr_Py_VerboseFlag = GetInt_as_IntPointer( "Py_VerboseFlag" ); + ptr__Py_PackageContext = GetCharPointer_as_CharPointerPointer( "_Py_PackageContext" ); + + ptr__Exc_ArithmeticError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_ArithmeticError" ); + ptr__Exc_AssertionError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_AssertionError" ); + ptr__Exc_AttributeError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_AttributeError" ); + ptr__Exc_EnvironmentError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_EnvironmentError" ); + ptr__Exc_EOFError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_EOFError" ); + ptr__Exc_Exception = GetPyObjectPointer_As_PyObjectPointer( "PyExc_Exception" ); + ptr__Exc_FloatingPointError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_FloatingPointError" ); + ptr__Exc_ImportError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_ImportError" ); + ptr__Exc_IndexError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_IndexError" ); + ptr__Exc_IOError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_IOError" ); + ptr__Exc_KeyboardInterrupt = GetPyObjectPointer_As_PyObjectPointer( "PyExc_KeyboardInterrupt" ); + ptr__Exc_KeyError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_KeyError" ); + ptr__Exc_LookupError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_LookupError" ); + ptr__Exc_MemoryError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_MemoryError" ); + ptr__Exc_MemoryErrorInst = GetPyObjectPointer_As_PyObjectPointer( "PyExc_MemoryErrorInst" ); + ptr__Exc_NameError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_NameError" ); + ptr__Exc_NotImplementedError= GetPyObjectPointer_As_PyObjectPointer( "PyExc_NotImplementedError" ); + ptr__Exc_OSError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_OSError" ); + ptr__Exc_OverflowError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_OverflowError" ); + ptr__Exc_RuntimeError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_RuntimeError" ); + ptr__Exc_StandardError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_StandardError" ); + ptr__Exc_SyntaxError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_SyntaxError" ); + ptr__Exc_SystemError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_SystemError" ); + ptr__Exc_SystemExit = GetPyObjectPointer_As_PyObjectPointer( "PyExc_SystemExit" ); + ptr__Exc_TypeError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_TypeError" ); + ptr__Exc_ValueError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_ValueError" ); +#ifdef MS_WINDOWS + ptr__Exc_WindowsError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_WindowsError" ); +#endif + ptr__Exc_ZeroDivisionError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_ZeroDivisionError" ); + ptr__Exc_IndentationError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_IndentationError" ); + ptr__Exc_TabError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_TabError" ); + ptr__Exc_UnboundLocalError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_UnboundLocalError" ); + ptr__Exc_UnicodeError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_UnicodeError" ); + ptr__PyNone = GetPyObject_As_PyObjectPointer( "_Py_NoneStruct" ); + + ptr__PyFalse = GetPyObject_As_PyObjectPointer( "_Py_ZeroStruct" ); + ptr__PyTrue = GetPyObject_As_PyObjectPointer( "_Py_TrueStruct" ); + + ptr__CFunction_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyCFunction_Type" ); + ptr__CObject_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyCObject_Type" ); + ptr__Complex_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyComplex_Type" ); + ptr__Dict_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyDict_Type" ); + ptr__Float_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyFloat_Type" ); + ptr__Function_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyFunction_Type" ); + ptr__List_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyList_Type" ); + ptr__Long_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyLong_Type" ); + ptr__Method_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyMethod_Type" ); + ptr__Module_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyModule_Type" ); + ptr__Range_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyRange_Type" ); + ptr__Slice_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PySlice_Type" ); + ptr__TraceBack_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyTraceBack_Type" ); + ptr__Tuple_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyTuple_Type" ); + ptr__Type_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyType_Type" ); + ptr__Unicode_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyUnicode_Type" ); + ptr__Bytes_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyBytes_Type" ); + } + catch( GetAddressException &e ) + { + OutputDebugString( python_dll_name ); + OutputDebugString( " does not contain symbol "); + OutputDebugString( e.name ); + OutputDebugString( "\n" ); + + return false; + } + + return true; +} + +// +// Wrap variables as function calls +// +PyObject *_Exc_ArithmeticError() { return ptr__Exc_ArithmeticError; } +PyObject *_Exc_AssertionError() { return ptr__Exc_AssertionError; } +PyObject *_Exc_AttributeError() { return ptr__Exc_AttributeError; } +PyObject *_Exc_EnvironmentError() { return ptr__Exc_EnvironmentError; } +PyObject *_Exc_EOFError() { return ptr__Exc_EOFError; } +PyObject *_Exc_Exception() { return ptr__Exc_Exception; } +PyObject *_Exc_FloatingPointError() { return ptr__Exc_FloatingPointError; } +PyObject *_Exc_ImportError() { return ptr__Exc_ImportError; } +PyObject *_Exc_IndexError() { return ptr__Exc_IndexError; } +PyObject *_Exc_IOError() { return ptr__Exc_IOError; } +PyObject *_Exc_KeyboardInterrupt() { return ptr__Exc_KeyboardInterrupt; } +PyObject *_Exc_KeyError() { return ptr__Exc_KeyError; } +PyObject *_Exc_LookupError() { return ptr__Exc_LookupError; } +PyObject *_Exc_MemoryError() { return ptr__Exc_MemoryError; } +PyObject *_Exc_MemoryErrorInst() { return ptr__Exc_MemoryErrorInst; } +PyObject *_Exc_NameError() { return ptr__Exc_NameError; } +PyObject *_Exc_NotImplementedError() { return ptr__Exc_NotImplementedError; } +PyObject *_Exc_OSError() { return ptr__Exc_OSError; } +PyObject *_Exc_OverflowError() { return ptr__Exc_OverflowError; } +PyObject *_Exc_RuntimeError() { return ptr__Exc_RuntimeError; } +PyObject *_Exc_StandardError() { return ptr__Exc_StandardError; } +PyObject *_Exc_SyntaxError() { return ptr__Exc_SyntaxError; } +PyObject *_Exc_SystemError() { return ptr__Exc_SystemError; } +PyObject *_Exc_SystemExit() { return ptr__Exc_SystemExit; } +PyObject *_Exc_TypeError() { return ptr__Exc_TypeError; } +PyObject *_Exc_ValueError() { return ptr__Exc_ValueError; } +#ifdef MS_WINDOWS +PyObject *_Exc_WindowsError() { return ptr__Exc_WindowsError; } +#endif +PyObject *_Exc_ZeroDivisionError() { return ptr__Exc_ZeroDivisionError; } +PyObject *_Exc_IndentationError() { return ptr__Exc_IndentationError; } +PyObject *_Exc_TabError() { return ptr__Exc_TabError; } +PyObject *_Exc_UnboundLocalError() { return ptr__Exc_UnboundLocalError; } +PyObject *_Exc_UnicodeError() { return ptr__Exc_UnicodeError; } + +// +// wrap items in Object.h +// +PyObject *_None() { return ptr__PyNone; } + +PyObject *_False() { return ptr__PyFalse; } +PyObject *_True() { return ptr__PyTrue; } + +PyTypeObject *_CFunction_Type() { return ptr__CFunction_Type; } +PyTypeObject *_CObject_Type() { return ptr__CObject_Type; } +PyTypeObject *_Complex_Type() { return ptr__Complex_Type; } +PyTypeObject *_Dict_Type() { return ptr__Dict_Type; } +PyTypeObject *_Float_Type() { return ptr__Float_Type; } +PyTypeObject *_Function_Type() { return ptr__Function_Type; } +PyTypeObject *_Bool_Type() { return ptr__Bool_Type; } +PyTypeObject *_List_Type() { return ptr__List_Type; } +PyTypeObject *_Long_Type() { return ptr__Long_Type; } +PyTypeObject *_Method_Type() { return ptr__Method_Type; } +PyTypeObject *_Module_Type() { return ptr__Module_Type; } +PyTypeObject *_Range_Type() { return ptr__Range_Type; } +PyTypeObject *_Slice_Type() { return ptr__Slice_Type; } +PyTypeObject *_TraceBack_Type() { return ptr__TraceBack_Type; } +PyTypeObject *_Tuple_Type() { return ptr__Tuple_Type; } +PyTypeObject *_Type_Type() { return ptr__Type_Type; } +PyTypeObject *_Unicode_Type() { return ptr__Unicode_Type; } +PyTypeObject *_Bytes_Type() { return ptr__Bytes_Type; } + +char *__Py_PackageContext() { return *ptr__Py_PackageContext; } + + +// +// wrap the Python Flag variables +// +int &_Py_DebugFlag() { return *ptr_Py_DebugFlag; } +int &_Py_InteractiveFlag() { return *ptr_Py_InteractiveFlag; } +int &_Py_OptimizeFlag() { return *ptr_Py_OptimizeFlag; } +int &_Py_NoSiteFlag() { return *ptr_Py_NoSiteFlag; } +int &_Py_VerboseFlag() { return *ptr_Py_VerboseFlag; } + +#if 0 +#define Py_INCREF(op) ( \ + _Py_INC_REFTOTAL _Py_REF_DEBUG_COMMA \ + ((PyObject*)(op))->ob_refcnt++) + +#define Py_DECREF(op) \ + if (_Py_DEC_REFTOTAL _Py_REF_DEBUG_COMMA \ + --((PyObject*)(op))->ob_refcnt != 0) \ + _Py_CHECK_REFCNT(op) \ + else \ + _Py_Dealloc((PyObject *)(op)) +#endif + +void _XINCREF( PyObject *op ) +{ + // This function must match the contents of Py_XINCREF(op) + if( op == NULL ) + return; + +#ifdef Py_REF_DEBUG + (*ptr_Py_RefTotal)++; +#endif + (op)->ob_refcnt++; + +} + +void _XDECREF( PyObject *op ) +{ + // This function must match the contents of Py_XDECREF(op); + if( op == NULL ) + return; + +#ifdef Py_REF_DEBUG + (*ptr_Py_RefTotal)--; +#endif + + if (--(op)->ob_refcnt == 0) + _Py_Dealloc((PyObject *)(op)); +} + + +#else +#error "Can only delay load under Win32" +#endif + +#else + +//================================================================================ +// +// Map onto Macros +// +//================================================================================ + +// +// Wrap variables as function calls +// + +PyObject *_Exc_ArithmeticError() { return ::PyExc_ArithmeticError; } +PyObject *_Exc_AssertionError() { return ::PyExc_AssertionError; } +PyObject *_Exc_AttributeError() { return ::PyExc_AttributeError; } +PyObject *_Exc_EnvironmentError() { return ::PyExc_EnvironmentError; } +PyObject *_Exc_EOFError() { return ::PyExc_EOFError; } +PyObject *_Exc_Exception() { return ::PyExc_Exception; } +PyObject *_Exc_FloatingPointError() { return ::PyExc_FloatingPointError; } +PyObject *_Exc_ImportError() { return ::PyExc_ImportError; } +PyObject *_Exc_IndexError() { return ::PyExc_IndexError; } +PyObject *_Exc_IOError() { return ::PyExc_IOError; } +PyObject *_Exc_KeyboardInterrupt() { return ::PyExc_KeyboardInterrupt; } +PyObject *_Exc_KeyError() { return ::PyExc_KeyError; } +PyObject *_Exc_LookupError() { return ::PyExc_LookupError; } +PyObject *_Exc_MemoryError() { return ::PyExc_MemoryError; } +PyObject *_Exc_MemoryErrorInst() { return ::PyExc_MemoryErrorInst; } +PyObject *_Exc_NameError() { return ::PyExc_NameError; } +PyObject *_Exc_NotImplementedError() { return ::PyExc_NotImplementedError; } +PyObject *_Exc_OSError() { return ::PyExc_OSError; } +PyObject *_Exc_OverflowError() { return ::PyExc_OverflowError; } +PyObject *_Exc_RuntimeError() { return ::PyExc_RuntimeError; } +PyObject *_Exc_SyntaxError() { return ::PyExc_SyntaxError; } +PyObject *_Exc_SystemError() { return ::PyExc_SystemError; } +PyObject *_Exc_SystemExit() { return ::PyExc_SystemExit; } +PyObject *_Exc_TypeError() { return ::PyExc_TypeError; } +PyObject *_Exc_ValueError() { return ::PyExc_ValueError; } +PyObject *_Exc_ZeroDivisionError() { return ::PyExc_ZeroDivisionError; } +PyObject *_Exc_IndentationError() { return ::PyExc_IndentationError; } +PyObject *_Exc_TabError() { return ::PyExc_TabError; } +PyObject *_Exc_UnboundLocalError() { return ::PyExc_UnboundLocalError; } +PyObject *_Exc_UnicodeError() { return ::PyExc_UnicodeError; } + +#ifdef MS_WINDOWS +PyObject *_Exc_WindowsError() { return ::PyExc_WindowsError; } +#endif + + + + +// +// wrap items in Object.h +// +PyObject *_None() { return &::_Py_NoneStruct; } + +PyObject *_False() { return Py_False; } +PyObject *_True() { return Py_True; } + +PyTypeObject *_CFunction_Type() { return &PyCFunction_Type; } +PyTypeObject *_CObject_Type() { return &PyCObject_Type; } +PyTypeObject *_Complex_Type() { return &PyComplex_Type; } +PyTypeObject *_Dict_Type() { return &PyDict_Type; } +PyTypeObject *_Float_Type() { return &PyFloat_Type; } +PyTypeObject *_Function_Type() { return &PyFunction_Type; } +PyTypeObject *_Bool_Type() { return &PyBool_Type; } +PyTypeObject *_List_Type() { return &PyList_Type; } +PyTypeObject *_Long_Type() { return &PyLong_Type; } +PyTypeObject *_Method_Type() { return &PyMethod_Type; } +PyTypeObject *_Module_Type() { return &PyModule_Type; } +PyTypeObject *_Range_Type() { return &PyRange_Type; } +PyTypeObject *_Slice_Type() { return &PySlice_Type; } +PyTypeObject *_TraceBack_Type() { return &PyTraceBack_Type; } +PyTypeObject *_Tuple_Type() { return &PyTuple_Type; } +PyTypeObject *_Type_Type() { return &PyType_Type; } +PyTypeObject *_Unicode_Type() { return &PyUnicode_Type; } +PyTypeObject *_Bytes_Type() { return &PyBytes_Type; } + +// +// wrap flags +// +int &_Py_DebugFlag() { return Py_DebugFlag; } +int &_Py_InteractiveFlag() { return Py_InteractiveFlag; } +int &_Py_OptimizeFlag() { return Py_OptimizeFlag; } +int &_Py_NoSiteFlag() { return Py_NoSiteFlag; } +int &_Py_VerboseFlag() { return Py_VerboseFlag; } +char *__Py_PackageContext() { return _Py_PackageContext; } + +// +// Needed to keep the abstactions for delayload interface +// +void _XINCREF( PyObject *op ) +{ + Py_XINCREF( op ); +} + +void _XDECREF( PyObject *op ) +{ + Py_XDECREF( op ); +} + +#endif +} diff -Nru matplotlib-0.99.3/CXX/Python3/IndirectPythonInterface.hxx matplotlib-1.0.1/CXX/Python3/IndirectPythonInterface.hxx --- matplotlib-0.99.3/CXX/Python3/IndirectPythonInterface.hxx 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/CXX/Python3/IndirectPythonInterface.hxx 2010-07-07 01:41:53.000000000 +0000 @@ -0,0 +1,188 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// 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 disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED 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 REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY 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. +// +//----------------------------------------------------------------------------- + +#ifndef __CXX_INDIRECT_PYTHON_INTERFACE__HXX__ +#define __CXX_INDIRECT_PYTHON_INTERFACE__HXX__ + +#include "CXX/WrapPython.h" + +namespace Py +{ +bool InitialisePythonIndirectInterface(); + +// +// Wrap Exception variables as function calls +// +PyObject * _Exc_Exception(); +PyObject * _Exc_StandardError(); +PyObject * _Exc_ArithmeticError(); +PyObject * _Exc_LookupError(); + +PyObject * _Exc_AssertionError(); +PyObject * _Exc_AttributeError(); +PyObject * _Exc_EOFError(); +PyObject * _Exc_FloatingPointError(); +PyObject * _Exc_EnvironmentError(); +PyObject * _Exc_IOError(); +PyObject * _Exc_OSError(); +PyObject * _Exc_ImportError(); +PyObject * _Exc_IndexError(); +PyObject * _Exc_KeyError(); +PyObject * _Exc_KeyboardInterrupt(); +PyObject * _Exc_MemoryError(); +PyObject * _Exc_NameError(); +PyObject * _Exc_OverflowError(); +PyObject * _Exc_RuntimeError(); +PyObject * _Exc_NotImplementedError(); +PyObject * _Exc_SyntaxError(); +PyObject * _Exc_SystemError(); +PyObject * _Exc_SystemExit(); +PyObject * _Exc_TypeError(); +PyObject * _Exc_ValueError(); +PyObject * _Exc_ZeroDivisionError(); +#ifdef MS_WINDOWS +PyObject * _Exc_WindowsError(); +#endif + +PyObject * _Exc_MemoryErrorInst(); + +PyObject * _Exc_IndentationError(); +PyObject * _Exc_TabError(); +PyObject * _Exc_UnboundLocalError(); +PyObject * _Exc_UnicodeError(); + +// +// Wrap Object variables as function calls +// +PyObject * _None(); + +PyObject * _False(); +PyObject * _True(); + +// +// Wrap Type variables as function calls +// +PyTypeObject * _List_Type(); +bool _List_Check( PyObject *o ); + +PyTypeObject * _Buffer_Type(); +bool _Buffer_Check( PyObject *op ); + +PyTypeObject * _Class_Type(); +bool _Class_Check( PyObject *op ); + +PyTypeObject * _Instance_Type(); +bool _Instance_Check( PyObject *op ); + +PyTypeObject * _Method_Type(); +bool _Method_Check( PyObject *op ); + +PyTypeObject * _CObject_Type(); +bool _CObject_Check( PyObject *op ); + +PyTypeObject * _Complex_Type(); +bool _Complex_Check( PyObject *op ); + +PyTypeObject * _Dict_Type(); +bool _Dict_Check( PyObject *op ); + +PyTypeObject * _File_Type(); +bool _File_Check( PyObject *op ); + +PyTypeObject * _Float_Type(); +bool _Float_Check( PyObject *op ); + +PyTypeObject * _Frame_Type(); +bool _Frame_Check( PyObject *op ); + +PyTypeObject * _Function_Type(); +bool _Function_Check( PyObject *op ); + +PyTypeObject * _Bool_Type(); +bool _Boolean_Check( PyObject *op ); + +PyTypeObject * _Int_Type(); +bool _Int_Check( PyObject *op ); + +PyTypeObject * _List_Type(); +bool _List_Check( PyObject *op ); + +PyTypeObject * _Long_Type(); +bool _Long_Check( PyObject *op ); + +PyTypeObject * _CFunction_Type(); +bool _CFunction_Check( PyObject *op ); + +PyTypeObject * _Module_Type(); +bool _Module_Check( PyObject *op ); + +PyTypeObject * _Type_Type(); +bool _Type_Check( PyObject *op ); + +PyTypeObject * _Range_Type(); +bool _Range_Check( PyObject *op ); + +PyTypeObject * _Slice_Type(); +bool _Slice_Check( PyObject *op ); + +PyTypeObject * _Unicode_Type(); +bool _Unicode_Check( PyObject *op ); + +PyTypeObject * _Bytes_Type(); +bool _Bytes_Check( PyObject *op ); + +PyTypeObject * _TraceBack_Type(); +bool _TraceBack_Check( PyObject *v ); + +PyTypeObject * _Tuple_Type(); +bool _Tuple_Check( PyObject *op ); + +int &_Py_DebugFlag(); +int &_Py_InteractiveFlag(); +int &_Py_OptimizeFlag(); +int &_Py_NoSiteFlag(); +int &_Py_TabcheckFlag(); +int &_Py_VerboseFlag(); +int &_Py_UnicodeFlag(); + +void _XINCREF( PyObject *op ); +void _XDECREF( PyObject *op ); + +char *__Py_PackageContext(); +}; + +#endif // __CXX_INDIRECT_PYTHON_INTERFACE__HXX__ diff -Nru matplotlib-0.99.3/CXX/Python3/Objects.hxx matplotlib-1.0.1/CXX/Python3/Objects.hxx --- matplotlib-0.99.3/CXX/Python3/Objects.hxx 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/CXX/Python3/Objects.hxx 2010-07-07 01:41:53.000000000 +0000 @@ -0,0 +1,3279 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// 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 disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED 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 REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY 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. +// +//----------------------------------------------------------------------------- + +#ifndef __CXX_Objects__h +#define __CXX_Objects__h + +#include "CXX/WrapPython.h" +#include "CXX/Version.hxx" +#include "CXX/Python3/Config.hxx" +#include "CXX/Python3/CxxDebug.hxx" +#include "CXX/Python3/Exception.hxx" + +#include +#include STR_STREAM +#include +#include +#include +#include + +namespace Py +{ + typedef int sequence_index_type; // type of an index into a sequence + + // Forward declarations + class Object; + class Type; + template class SeqBase; + class Bytes; + class String; + class List; + template class MapBase; + + //===========================================================================// + // class Object + // The purpose of this class is to serve as the most general kind of + // Python object, for the purpose of writing C++ extensions in Python + // Objects hold a PyObject* which they own. This pointer is always a + // valid pointer to a Python object. In children we must maintain this behavior. + // + // Instructions on how to make your own class MyType descended from Object: + // (0) Pick a base class, either Object or perhaps SeqBase or MapBase. + // This example assumes Object. + + // (1) Write a routine int MyType_Check( PyObject * ) modeled after PyInt_Check, + // PyFloat_Check, etc. + + // (2) Add method accepts: + // virtual bool accepts( PyObject *pyob ) const { + // return pyob && MyType_Check( pyob ); + // } + + // (3) Include the following constructor and copy constructor + // + /* + explicit MyType( PyObject *pyob ): Object( pyob ) + { + validate(); + } + + MyType( const Object &other ): Object( other.ptr() ) + { + validate(); + } + */ + + // Alernate version for the constructor to allow for construction from owned pointers: + /* + explicit MyType( PyObject *pyob ): Object( pyob ) + { + validate(); + } + */ + + // You may wish to add other constructors; see the classes below for examples. + // Each constructor must use "set" to set the pointer + // and end by validating the pointer you have created. + + //( 4 ) Each class needs at least these two assignment operators: + /* + MyType &operator=( const Object &rhs ) + { + return *this = *rhs; + } + + Mytype &operator=( PyObject *rhsp ) + { + if( ptr() != rhsp ) + set( rhsp ); + return *this; + } + */ + // Note on accepts: constructors call the base class + // version of a virtual when calling the base class constructor, + // so the test has to be done explicitly in a descendent. + + // If you are inheriting from PythonExtension to define an object + // note that it contains PythonExtension::check + // which you can use in accepts when writing a wrapper class. + // See Demo/range.h and Demo/range.cxx for an example. + + class Object + { + private: + // the pointer to the Python object + // Only Object sets this directly. + // The default constructor for Object sets it to Py_None and + // child classes must use "set" to set it + // + PyObject *p; + + protected: + void set( PyObject *pyob, bool owned = false ) + { + release(); + p = pyob; + if( !owned ) + { + Py::_XINCREF( p ); + } + validate(); + } + + void release() + { + Py::_XDECREF( p ); + p = NULL; + } + + void validate(); + + public: + // Constructor acquires new ownership of pointer unless explicitly told not to. + explicit Object( PyObject *pyob=Py::_None(), bool owned = false ) + : p( pyob ) + { + if( !owned ) + { + Py::_XINCREF( p ); + } + validate(); + } + + // Copy constructor acquires new ownership of pointer + Object( const Object &ob ) + : p( ob.p ) + { + Py::_XINCREF( p ); + validate(); + } + + // Assignment acquires new ownership of pointer + Object &operator=( const Object &rhs ) + { + set( rhs.p ); + return *this; + } + + Object &operator=( PyObject *rhsp ) + { + if( ptr() != rhsp ) + set( rhsp ); + + return *this; + } + + // Destructor + virtual ~Object() + { + release(); + } + + // Loaning the pointer to others, retain ownership + PyObject *operator*() const + { + return p; + } + + // Explicit reference_counting changes + void increment_reference_count() + { + Py::_XINCREF( p ); + } + + void decrement_reference_count() + { + // not allowed to commit suicide, however + if( reference_count() == 1 ) + throw RuntimeError( "Object::decrement_reference_count error." ); + Py::_XDECREF( p ); + } + + // Would like to call this pointer() but messes up STL in SeqBase + PyObject *ptr() const + { + return p; + } + + // + // Queries + // + + // Can pyob be used in this object's constructor? + virtual bool accepts( PyObject *pyob ) const + { + // allow any object or NULL + return true; + } + + Py_ssize_t reference_count() const + { // the reference count + return p ? p->ob_refcnt : 0; + } + + Type type() const; // the type object associated with this one + + String str() const; // the str() representation + + std::string as_string() const; + + String repr() const; // the repr() representation + + List dir() const; // the dir() list + + bool hasAttr( const std::string &s ) const + { + return PyObject_HasAttrString( p, const_cast( s.c_str() ) ) ? true: false; + } + + Object getAttr( const std::string &s ) const + { + return Object( PyObject_GetAttrString( p, const_cast( s.c_str() ) ), true ); + } + + Object getItem( const Object &key ) const + { + return Object( PyObject_GetItem( p, *key ), true ); + } + + long hashValue() const + { + return PyObject_Hash( p ); + } + + // convert to bool + bool as_bool() const + { + return PyObject_IsTrue( ptr() ) != 0; + } + + //operator bool() const + //{ + // return as_bool(); + //} + + // int print( FILE *fp, int flags=Py_Print_RAW ) + //{ + // return PyObject_Print( p, fp, flags ); + //} + + bool is( PyObject *pother ) const + { // identity test + return p == pother; + } + + bool is( const Object &other ) const + { // identity test + return p == other.p; + } + + bool isNull() const + { + return p == NULL; + } + + bool isNone() const + { + return p == _None(); + } + + bool isCallable() const + { + return PyCallable_Check( p ) != 0; + } + + bool isDict() const + { + return Py::_Dict_Check( p ); + } + + bool isList() const + { + return Py::_List_Check( p ); + } + + bool isMapping() const + { + return PyMapping_Check( p ) != 0; + } + + bool isNumeric() const + { + return PyNumber_Check( p ) != 0; + } + + bool isSequence() const + { + return PySequence_Check( p ) != 0; + } + + bool isTrue() const + { + return PyObject_IsTrue( p ) != 0; + } + + bool isType( const Type &t ) const; + + bool isTuple() const + { + return Py::_Tuple_Check( p ); + } + + bool isString() const + { + return Py::_Unicode_Check( p ); + } + + bool isBytes() const + { + return Py::_Bytes_Check( p ); + } + + bool isBoolean() const + { + return Py::_Boolean_Check( p ); + } + + // Commands + void setAttr( const std::string &s, const Object &value ) + { + if( PyObject_SetAttrString( p, const_cast( s.c_str() ), *value ) == -1 ) + throw AttributeError( "getAttr failed." ); + } + + void delAttr( const std::string &s ) + { + if( PyObject_DelAttrString( p, const_cast( s.c_str() ) ) == -1 ) + throw AttributeError( "delAttr failed." ); + } + + // PyObject_SetItem is too weird to be using from C++ + // so it is intentionally omitted. + + void delItem( const Object &key ) + { + //if( PyObject_DelItem( p, *key ) == -1 ) + // failed to link on Windows? + throw KeyError( "delItem failed." ); + } + // Equality and comparison use PyObject_Compare + + }; + // End of class Object + + // Null can be return from when it is require to return NULL to Python from a method + class Null: public Object + { + public: + Null() + : Object( NULL ) + { + } + virtual ~Null() + { + } + + bool accepts( PyObject *pyob ) + { + return pyob == NULL; + } + }; + + //------------------------------------------------------------ + bool operator==( const Object &o1, const Object &o2 ); + bool operator!=( const Object &o1, const Object &o2 ); + bool operator>=( const Object &o1, const Object &o2 ); + bool operator<=( const Object &o1, const Object &o2 ); + bool operator<( const Object &o1, const Object &o2 ); + bool operator>( const Object &o1, const Object &o2 ); + + //------------------------------------------------------------ + + + // + // Convert an owned Python pointer into a PyCXX Object + // + inline Object asObject( PyObject *p ) + { + return Object( p, true ); + } + + // new_reference_to also overloaded below on Object + inline PyObject *new_reference_to( PyObject *p ) + { + Py::_XINCREF( p ); + return p; + } + + inline PyObject *new_reference_to( const Object &g ) + { + PyObject *p = g.ptr(); + Py::_XINCREF( p ); + return p; + } + + // Python special None value + inline Object None() + { + return Object( Py::_None() ); + } + + // Python special Boolean values + inline Object False() + { + return Object( Py::_False() ); + } + + inline Object True() + { + return Object( Py::_True() ); + } + + // TMM: 31May'01 - Added the #ifndef so I can exlude iostreams. +#ifndef CXX_NO_IOSTREAMS + std::ostream &operator<<( std::ostream &os, const Object &ob ); +#endif + + // Class Type + class Type: public Object + { + public: + explicit Type( PyObject *pyob, bool owned = false ) + : Object( pyob, owned ) + { + validate(); + } + + Type( const Object &ob ) + : Object( *ob ) + { + validate(); + } + + Type( const Type &t ) + : Object( t ) + { + validate(); + } + + Type &operator=( const Object &rhs ) + { + return *this = *rhs; + } + + Type &operator=( PyObject *rhsp ) + { + if( ptr() != rhsp ) + set( rhsp ); + return *this; + } + + virtual bool accepts( PyObject *pyob ) const + { + return pyob && Py::_Type_Check( pyob ); + } + }; + + // =============================================== + // class boolean + class Boolean: public Object + { + public: + // Constructor + Boolean( PyObject *pyob, bool owned = false ) + : Object( pyob, owned ) + { + validate(); + } + + Boolean( const Boolean &ob ) + : Object( *ob ) + { + validate(); + } + + // create from bool + Boolean( bool v=false ) + { + set( PyBool_FromLong( v ? 1 : 0 ), true ); + validate(); + } + + explicit Boolean( const Object &ob ) + : Object( *ob ) + { + validate(); + } + + // Assignment acquires new ownership of pointer + Boolean &operator=( const Object &rhs ) + { + return *this = *rhs; + } + + Boolean &operator=( PyObject *rhsp ) + { + if( ptr() != rhsp ) + set( rhsp ); + return *this; + } + + // Membership + virtual bool accepts( PyObject *pyob ) const + { + // accepts any object that can be converted to a boolean + return pyob && PyObject_IsTrue( pyob ) != -1; + } + + Boolean &operator=( bool v ) + { + set( PyBool_FromLong( v ? 1 : 0 ), true ); + return *this; + } + + operator bool() const + { + return as_bool(); + } + }; + + // =============================================== + // class Long + class Long: public Object + { + public: + // Constructor + explicit Long( PyObject *pyob, bool owned = false ) + : Object( pyob, owned ) + { + validate(); + } + + Long( const Long &ob ) + : Object( ob.ptr() ) + { + validate(); + } + + // try to create from any object + explicit Long( const Object &ob ) + : Object( PyNumber_Long( *ob ), true ) + { + validate(); + } + + // create from long + explicit Long( long v = 0L ) + : Object( PyLong_FromLong( v ), true ) + { + validate(); + } + + // create from unsigned long + explicit Long( unsigned long v ) + : Object( PyLong_FromUnsignedLong( v ), true ) + { + validate(); + } + + // create from int + explicit Long( int v ) + : Object( PyLong_FromLong( static_cast( v ) ), true ) + { + validate(); + } + +#ifdef HAVE_LONG_LONG + // create from long long + explicit Long( PY_LONG_LONG v ) + : Object( PyLong_FromLongLong( v ), true ) + { + validate(); + } + + // create from unsigned long long + explicit Long( unsigned PY_LONG_LONG v ) + : Object( PyLong_FromUnsignedLongLong( v ), true ) + { + validate(); + } +#endif + + // Membership + virtual bool accepts( PyObject *pyob ) const + { + return pyob && Py::_Long_Check( pyob ); + } + + // Assignment acquires new ownership of pointer + Long &operator=( const Object &rhs ) + { + return *this = *rhs; + } + + Long &operator=( PyObject *rhsp ) + { + if( ptr() != rhsp ) + set( PyNumber_Long( rhsp ), true ); + return *this; + } + + // assign from an int + Long &operator=( int v ) + { + set( PyLong_FromLong( long( v ) ), true ); + return *this; + } + + // assign from long + Long &operator=( long v ) + { + set( PyLong_FromLong( v ), true ); + return *this; + } + + // assign from unsigned long + Long &operator=( unsigned long v ) + { + set( PyLong_FromUnsignedLong( v ), true ); + return *this; + } + +#ifdef HAVE_LONG_LONG + Long &operator=( PY_LONG_LONG v ) + { + set( PyLong_FromLongLong( v ), true ); + return *this; + } + + Long &operator=( unsigned PY_LONG_LONG v ) + { + set( PyLong_FromUnsignedLongLong( v ), true ); + return *this; + } +#endif + + //operator bool() const + //{ + // return as_bool(); + //} + + // convert to long + long as_long() const + { + return PyLong_AsLong( ptr() ); + } + + operator long() const + { + return as_long(); + } + + operator int() const + { + return static_cast( as_long() ); + } + + // convert to unsigned + long as_unsigned_long() const + { + return PyLong_AsUnsignedLong( ptr() ); + } + + operator unsigned long() const + { + return as_unsigned_long(); + } + + double as_double() const + { + return PyLong_AsDouble( ptr() ); + } + + operator double() const + { + return as_double(); + } + +#ifdef HAVE_LONG_LONG + PY_LONG_LONG as_long_long() const + { + return PyLong_AsLongLong( ptr() ); + } + + operator PY_LONG_LONG() const + { + return as_long_long(); + } + + unsigned PY_LONG_LONG as_unsigned_long_long() const + { + return PyLong_AsUnsignedLongLong( ptr() ); + } + + operator unsigned PY_LONG_LONG() const + { + return as_unsigned_long_long(); + } +#endif + + // prefix ++ + Long operator++() + { + set( PyNumber_Add( ptr(), *Long( 1 ) ) ); + return *this; + } + + // postfix ++ + Long operator++( int ) + { + Long a = *this; + set( PyNumber_Add( ptr(), *Long( 1 ) ) ); + return a; + } + + // prefix -- + Long operator--() + { + set( PyNumber_Subtract( ptr(), *Long( 1 ) ) ); + return *this; + } + + // postfix -- + Long operator--( int ) + { + Long a = *this; + set( PyNumber_Subtract( ptr(), *Long( 1 ) ) ); + return a; + } + }; + +#ifdef PYCXX_PYTHON_2TO3 + // PyCXX for Python2 had an Int and LongLong classes + typedef Long Int; +#ifdef HAVE_LONG_LONG + typedef Long LongLong; +#endif +#endif + +#if 1 + //------------------------------------------------------------ + // compare operators + bool operator!=( const Long &a, const Long &b ); + bool operator!=( const Long &a, int b ); + bool operator!=( const Long &a, long b ); + bool operator!=( int a, const Long &b ); + bool operator!=( long a, const Long &b ); + //------------------------------ + bool operator==( const Long &a, const Long &b ); + bool operator==( const Long &a, int b ); + bool operator==( const Long &a, long b ); + bool operator==( int a, const Long &b ); + bool operator==( long a, const Long &b ); + //------------------------------ + bool operator>( const Long &a, const Long &b ); + bool operator>( const Long &a, int b ); + bool operator>( const Long &a, long b ); + bool operator>( int a, const Long &b ); + bool operator>( long a, const Long &b ); + //------------------------------ + bool operator>=( const Long &a, const Long &b ); + bool operator>=( const Long &a, int b ); + bool operator>=( const Long &a, long b ); + bool operator>=( int a, const Long &b ); + bool operator>=( long a, const Long &b ); + //------------------------------ + bool operator<( const Long &a, const Long &b ); + bool operator<( const Long &a, int b ); + bool operator<( const Long &a, long b ); + bool operator<( int a, const Long &b ); + bool operator<( long a, const Long &b ); + //------------------------------ + bool operator<=( const Long &a, const Long &b ); + bool operator<=( int a, const Long &b ); + bool operator<=( long a, const Long &b ); + bool operator<=( const Long &a, int b ); + bool operator<=( const Long &a, long b ); + +#ifdef HAVE_LONG_LONG + //------------------------------ + bool operator!=( const Long &a, PY_LONG_LONG b ); + bool operator!=( PY_LONG_LONG a, const Long &b ); + //------------------------------ + bool operator==( const Long &a, PY_LONG_LONG b ); + bool operator==( PY_LONG_LONG a, const Long &b ); + //------------------------------ + bool operator>( const Long &a, PY_LONG_LONG b ); + bool operator>( PY_LONG_LONG a, const Long &b ); + //------------------------------ + bool operator>=( const Long &a, PY_LONG_LONG b ); + bool operator>=( PY_LONG_LONG a, const Long &b ); + //------------------------------ + bool operator<( const Long &a, PY_LONG_LONG b ); + bool operator<( PY_LONG_LONG a, const Long &b ); + //------------------------------ + bool operator<=( const Long &a, PY_LONG_LONG b ); + bool operator<=( PY_LONG_LONG a, const Long &b ); +#endif +#endif + + // =============================================== + // class Float + // + class Float: public Object + { + public: + // Constructor + explicit Float( PyObject *pyob, bool owned = false ) + : Object( pyob, owned ) + { + validate(); + } + + Float( const Float &f ) + : Object( f ) + { + validate(); + } + + // make from double + explicit Float( double v=0.0 ) + : Object( PyFloat_FromDouble( v ), true ) + { + validate(); + } + + // try to make from any object + Float( const Object &ob ) + : Object( PyNumber_Float( *ob ), true ) + { + validate(); + } + + Float &operator=( const Object &rhs ) + { + return *this = *rhs; + } + + Float &operator=( PyObject *rhsp ) + { + if( ptr() != rhsp ) + set( PyNumber_Float( rhsp ), true ); + return *this; + } + + // Membership + virtual bool accepts( PyObject *pyob ) const + { + return pyob && Py::_Float_Check( pyob ); + } + + double as_double() const + { + return PyFloat_AsDouble( ptr() ); + } + + // convert to double + operator double() const + { + return as_double(); + } + + // assign from a double + Float &operator=( double v ) + { + set( PyFloat_FromDouble( v ), true ); + return *this; + } + // assign from an int + Float &operator=( int v ) + { + set( PyFloat_FromDouble( double( v ) ), true ); + return *this; + } + // assign from long + Float &operator=( long v ) + { + set( PyFloat_FromDouble( double( v ) ), true ); + return *this; + } + // assign from an Long + Float &operator=( const Long &iob ) + { + set( PyFloat_FromDouble( double( iob.as_long() ) ), true ); + return *this; + } + }; + + //------------------------------------------------------------ + // compare operators + bool operator!=( const Float &a, const Float &b ); + bool operator!=( const Float &a, double b ); + bool operator!=( double a, const Float &b ); + //------------------------------ + bool operator==( const Float &a, const Float &b ); + bool operator==( const Float &a, double b ); + bool operator==( double a, const Float &b ); + //------------------------------ + bool operator>( const Float &a, const Float &b ); + bool operator>( const Float &a, double b ); + bool operator>( double a, const Float &b ); + //------------------------------ + bool operator>=( const Float &a, const Float &b ); + bool operator>=( const Float &a, double b ); + bool operator>=( double a, const Float &b ); + //------------------------------ + bool operator<( const Float &a, const Float &b ); + bool operator<( const Float &a, double b ); + bool operator<( double a, const Float &b ); + //------------------------------ + bool operator<=( const Float &a, const Float &b ); + bool operator<=( double a, const Float &b ); + bool operator<=( const Float &a, double b ); + + // =============================================== + // class Complex + class Complex: public Object + { + public: + // Constructor + explicit Complex( PyObject *pyob, bool owned = false ) + : Object( pyob, owned ) + { + validate(); + } + + Complex( const Complex &f ) + : Object( f ) + { + validate(); + } + + // make from double + explicit Complex( double v=0.0, double w=0.0 ) + :Object( PyComplex_FromDoubles( v, w ), true ) + { + validate(); + } + + Complex &operator=( const Object &rhs ) + { + return *this = *rhs; + } + + Complex &operator=( PyObject *rhsp ) + { + if( ptr() != rhsp ) + set( rhsp ); + return *this; + } + // Membership + virtual bool accepts( PyObject *pyob ) const + { + return pyob && Py::_Complex_Check( pyob ); + } + // convert to Py_complex + operator Py_complex() const + { + return PyComplex_AsCComplex( ptr() ); + } + // assign from a Py_complex + Complex &operator=( const Py_complex &v ) + { + set( PyComplex_FromCComplex( v ), true ); + return *this; + } + // assign from a double + Complex &operator=( double v ) + { + set( PyComplex_FromDoubles( v, 0.0 ), true ); + return *this; + } + // assign from an int + Complex &operator=( int v ) + { + set( PyComplex_FromDoubles( double( v ), 0.0 ), true ); + return *this; + } + // assign from long + Complex &operator=( long v ) + { + set( PyComplex_FromDoubles( double( v ), 0.0 ), true ); + return *this; + } + // assign from an Long + Complex &operator=( const Long &iob ) + { + set( PyComplex_FromDoubles( double( iob.as_long() ), 0.0 ), true ); + return *this; + } + + double real() const + { + return PyComplex_RealAsDouble( ptr() ); + } + + double imag() const + { + return PyComplex_ImagAsDouble( ptr() ); + } + }; + // Sequences + // Sequences are here represented as sequences of items of type T. + // The base class SeqBase represents that. + // In basic Python T is always "Object". + + // seqref is what you get if you get elements from a non-const SeqBase. + // Note: seqref could probably be a nested class in SeqBase but that might stress + // some compilers needlessly. Simlarly for mapref later. + + // While this class is not intended for enduser use, it needs some public + // constructors for the benefit of the STL. + + // See Scott Meyer's More Essential C++ for a description of proxies. + // This application is even more complicated. We are doing an unusual thing + // in having a double proxy. If we want the STL to work + // properly we have to compromise by storing the rvalue inside. The + // entire Object API is repeated so that things like s[i].isList() will + // work properly. + + // Still, once in a while a weird compiler message may occur using expressions like x[i] + // Changing them to Object( x[i] ) helps the compiler to understand that the + // conversion of a seqref to an Object is wanted. + + template + class seqref + { + protected: + SeqBase &s; // the sequence + int offset; // item number + T the_item; // lvalue + + public: + seqref( SeqBase &seq, sequence_index_type j ) + : s( seq ) + , offset( j ) + , the_item( s.getItem( j ) ) + {} + + seqref( const seqref &range ) + : s( range.s ) + , offset( range.offset ) + , the_item( range.the_item ) + {} + + // TMM: added this seqref ctor for use with STL algorithms + seqref( Object &obj ) + : s( dynamic_cast< SeqBase&>( obj ) ) + , offset( NULL ) + , the_item( s.getItem( offset ) ) + {} + + ~seqref() + {} + + operator T() const + { // rvalue + return the_item; + } + + seqref &operator=( const seqref &rhs ) + { //used as lvalue + the_item = rhs.the_item; + s.setItem( offset, the_item ); + return *this; + } + + seqref &operator=( const T &ob ) + { // used as lvalue + the_item = ob; + s.setItem( offset, ob ); + return *this; + } + + // forward everything else to the item + PyObject *ptr() const + { + return the_item.ptr(); + } + + int reference_count() const + { // the reference count + return the_item.reference_count(); + } + + Type type() const + { + return the_item.type(); + } + + String str() const; + String repr() const; + + bool hasAttr( const std::string &attr_name ) const + { + return the_item.hasAttr( attr_name ); + } + + Object getAttr( const std::string &attr_name ) const + { + return the_item.getAttr( attr_name ); + } + + Object getItem( const Object &key ) const + { + return the_item.getItem( key ); + } + + long hashValue() const + { + return the_item.hashValue(); + } + + bool isCallable() const + { + return the_item.isCallable(); + } + + bool isInstance() const + { + return the_item.isInstance(); + } + + bool isDict() const + { + return the_item.isDict(); + } + + bool isList() const + { + return the_item.isList(); + } + + bool isMapping() const + { + return the_item.isMapping(); + } + + bool isNumeric() const + { + return the_item.isNumeric(); + } + + bool isSequence() const + { + return the_item.isSequence(); + } + + bool isTrue() const + { + return the_item.isTrue(); + } + + bool isType( const Type &t ) const + { + return the_item.isType( t ); + } + + bool isTuple() const + { + return the_item.isTuple(); + } + + bool isString() const + { + return the_item.isString(); + } + // Commands + void setAttr( const std::string &attr_name, const Object &value ) + { + the_item.setAttr( attr_name, value ); + } + + void delAttr( const std::string &attr_name ) + { + the_item.delAttr( attr_name ); + } + + void delItem( const Object &key ) + { + the_item.delItem( key ); + } + + bool operator==( const Object &o2 ) const + { + return the_item == o2; + } + + bool operator!=( const Object &o2 ) const + { + return the_item != o2; + } + + bool operator>=( const Object &o2 ) const + { + return the_item >= o2; + } + + bool operator<=( const Object &o2 ) const + { + return the_item <= o2; + } + + bool operator<( const Object &o2 ) const + { + return the_item < o2; + } + + bool operator>( const Object &o2 ) const + { + return the_item > o2; + } + }; // end of seqref + + + // class SeqBase + // ...the base class for all sequence types + + template + class SeqBase: public Object + { + public: + // STL definitions + typedef size_t size_type; + typedef seqref reference; + typedef T const_reference; + typedef seqref *pointer; + typedef int difference_type; + typedef T value_type; // TMM: 26Jun'01 + + virtual size_type max_size() const + { + return std::string::npos; // ? + } + + virtual size_type capacity() const + { + return size(); + } + + virtual void swap( SeqBase &c ) + { + SeqBase temp = c; + c = ptr(); + set( temp.ptr() ); + } + + virtual size_type size() const + { + return PySequence_Length( ptr() ); + } + + explicit SeqBase() + :Object( PyTuple_New( 0 ), true ) + { + validate(); + } + + explicit SeqBase( PyObject *pyob, bool owned=false ) + : Object( pyob, owned ) + { + validate(); + } + + SeqBase( const Object &ob ) + : Object( ob ) + { + validate(); + } + + // Assignment acquires new ownership of pointer + + SeqBase &operator=( const Object &rhs ) + { + return *this = *rhs; + } + + SeqBase &operator=( PyObject *rhsp ) + { + if( ptr() != rhsp ) + set( rhsp ); + return *this; + } + + virtual bool accepts( PyObject *pyob ) const + { + return pyob && PySequence_Check( pyob ); + } + + size_type length() const + { + return PySequence_Length( ptr() ); + } + + // Element access + const T operator[]( sequence_index_type index ) const + { + return getItem( index ); + } + + seqref operator[]( sequence_index_type index ) + { + return seqref( *this, index ); + } + + virtual T getItem( sequence_index_type i ) const + { + return T( asObject( PySequence_GetItem( ptr(), i ) ) ); + } + + virtual void setItem( sequence_index_type i, const T &ob ) + { + if( PySequence_SetItem( ptr(), i, *ob ) == -1 ) + { + throw Exception(); + } + } + + SeqBase repeat( int count ) const + { + return SeqBase( PySequence_Repeat( ptr(), count ), true ); + } + + SeqBase concat( const SeqBase &other ) const + { + return SeqBase( PySequence_Concat( ptr(), *other ), true ); + } + + // more STL compatability + const T front() const + { + return getItem( 0 ); + } + + seqref front() + { + return seqref( *this, 0 ); + } + + const T back() const + { + return getItem( size()-1 ); + } + + seqref back() + { + return seqref( *this, size()-1 ); + } + + void verify_length( size_type required_size ) const + { + if( size() != required_size ) + throw IndexError( "Unexpected SeqBase length." ); + } + + void verify_length( size_type min_size, size_type max_size ) const + { + size_type n = size(); + if( n < min_size || n > max_size ) + throw IndexError( "Unexpected SeqBase length." ); + } + + class iterator + : public random_access_iterator_parent( seqref ) + { + protected: + friend class SeqBase; + SeqBase *seq; + int count; + + public: + ~iterator() + {} + + iterator() + : seq( 0 ) + , count( 0 ) + {} + + iterator( SeqBase *s, int where ) + : seq( s ) + , count( where ) + {} + + iterator( const iterator &other ) + : seq( other.seq ) + , count( other.count ) + {} + + bool eql( const iterator &other ) const + { + return seq->ptr() == other.seq->ptr() && count == other.count; + } + + bool neq( const iterator &other ) const + { + return seq->ptr() != other.seq->ptr() || count != other.count; + } + + bool lss( const iterator &other ) const + { + return count < other.count; + } + + bool gtr( const iterator &other ) const + { + return count > other.count; + } + + bool leq( const iterator &other ) const + { + return count <= other.count; + } + + bool geq( const iterator &other ) const + { + return count >= other.count; + } + + seqref operator*() + { + return seqref( *seq, count ); + } + + seqref operator[]( sequence_index_type i ) + { + return seqref( *seq, count + i ); + } + + iterator &operator=( const iterator &other ) + { + if( this != &other ) + { + seq = other.seq; + count = other.count; + } + return *this; + } + + iterator operator+( int n ) const + { + return iterator( seq, count + n ); + } + + iterator operator-( int n ) const + { + return iterator( seq, count - n ); + } + + iterator &operator+=( int n ) + { + count = count + n; + return *this; + } + + iterator &operator-=( int n ) + { + count = count - n; + return *this; + } + + int operator-( const iterator &other ) const + { + if( seq.ptr() != other.seq.ptr() ) + throw RuntimeError( "SeqBase::iterator comparison error" ); + + return count - other.count; + } + + // prefix ++ + iterator &operator++() + { + count++; + return *this; + } + + // postfix ++ + iterator operator++( int ) + { + return iterator( seq, count++ ); + } + + // prefix -- + iterator &operator--() + { + count--; + return *this; + } + + // postfix -- + iterator operator--( int ) + { + return iterator( seq, count-- ); + } + + std::string diagnose() const + { + std::OSTRSTREAM oss; + oss << "iterator diagnosis " << seq << ", " << count << std::ends; + return std::string( oss.str() ); + } + + }; // end of class SeqBase::iterator + + iterator begin() + { + return iterator( this, 0 ); + } + + iterator end() + { + return iterator( this, length() ); + } + + class const_iterator + : public random_access_iterator_parent( const Object ) + { + protected: + friend class SeqBase; + const SeqBase *seq; + sequence_index_type count; + + public: + ~const_iterator() + {} + + const_iterator() + : seq( 0 ) + , count( 0 ) + {} + + const_iterator( const SeqBase *s, int where ) + : seq( s ) + , count( where ) + {} + + const_iterator( const const_iterator &other ) + : seq( other.seq ) + , count( other.count ) + {} + + const T operator*() const + { + return seq->getItem( count ); + } + + const T operator[]( sequence_index_type i ) const + { + return seq->getItem( count + i ); + } + + const_iterator &operator=( const const_iterator &other ) + { + if( this != &other ) + { + seq = other.seq; + count = other.count; + } + return *this; + } + + const_iterator operator+( int n ) const + { + return const_iterator( seq, count + n ); + } + + bool eql( const const_iterator &other ) const + { + return seq->ptr() == other.seq->ptr() && count == other.count; + } + + bool neq( const const_iterator &other ) const + { + return seq->ptr() != other.seq->ptr() || count != other.count; + } + + bool lss( const const_iterator &other ) const + { + return count < other.count; + } + + bool gtr( const const_iterator &other ) const + { + return count > other.count; + } + + bool leq( const const_iterator &other ) const + { + return count <= other.count; + } + + bool geq( const const_iterator &other ) const + { + return count >= other.count; + } + + const_iterator operator-( int n ) + { + return const_iterator( seq, count - n ); + } + + const_iterator &operator+=( int n ) + { + count = count + n; + return *this; + } + + const_iterator &operator-=( int n ) + { + count = count - n; + return *this; + } + + int operator-( const const_iterator &other ) const + { + if( *seq != *other.seq ) + throw RuntimeError( "SeqBase::const_iterator::- error" ); + return count - other.count; + } + + // prefix ++ + const_iterator &operator++() + { + count++; + return *this; + } + + // postfix ++ + const_iterator operator++( int ) + { + return const_iterator( seq, count++ ); + } + + // prefix -- + const_iterator &operator--() + { + count--; + return *this; + } + + // postfix -- + const_iterator operator--( int ) + { + return const_iterator( seq, count-- ); + } + + }; // end of class SeqBase::const_iterator + + const_iterator begin() const + { + return const_iterator( this, 0 ); + } + + const_iterator end() const + { + return const_iterator( this, length() ); + } + }; + + // Here's an important typedef you might miss if reading too fast... + typedef SeqBase Sequence; + + template bool operator==( const EXPLICIT_TYPENAME SeqBase::iterator &left, const EXPLICIT_TYPENAME SeqBase::iterator &right ); + template bool operator!=( const EXPLICIT_TYPENAME SeqBase::iterator &left, const EXPLICIT_TYPENAME SeqBase::iterator &right ); + template bool operator< ( const EXPLICIT_TYPENAME SeqBase::iterator &left, const EXPLICIT_TYPENAME SeqBase::iterator &right ); + template bool operator> ( const EXPLICIT_TYPENAME SeqBase::iterator &left, const EXPLICIT_TYPENAME SeqBase::iterator &right ); + template bool operator<=( const EXPLICIT_TYPENAME SeqBase::iterator &left, const EXPLICIT_TYPENAME SeqBase::iterator &right ); + template bool operator>=( const EXPLICIT_TYPENAME SeqBase::iterator &left, const EXPLICIT_TYPENAME SeqBase::iterator &right ); + + template bool operator==( const EXPLICIT_TYPENAME SeqBase::const_iterator &left, const EXPLICIT_TYPENAME SeqBase::const_iterator &right ); + template bool operator!=( const EXPLICIT_TYPENAME SeqBase::const_iterator &left, const EXPLICIT_TYPENAME SeqBase::const_iterator &right ); + template bool operator< ( const EXPLICIT_TYPENAME SeqBase::const_iterator &left, const EXPLICIT_TYPENAME SeqBase::const_iterator &right ); + template bool operator> ( const EXPLICIT_TYPENAME SeqBase::const_iterator &left, const EXPLICIT_TYPENAME SeqBase::const_iterator &right ); + template bool operator<=( const EXPLICIT_TYPENAME SeqBase::const_iterator &left, const EXPLICIT_TYPENAME SeqBase::const_iterator &right ); + template bool operator>=( const EXPLICIT_TYPENAME SeqBase::const_iterator &left, const EXPLICIT_TYPENAME SeqBase::const_iterator &right ); + + + extern bool operator==( const Sequence::iterator &left, const Sequence::iterator &right ); + extern bool operator!=( const Sequence::iterator &left, const Sequence::iterator &right ); + extern bool operator< ( const Sequence::iterator &left, const Sequence::iterator &right ); + extern bool operator> ( const Sequence::iterator &left, const Sequence::iterator &right ); + extern bool operator<=( const Sequence::iterator &left, const Sequence::iterator &right ); + extern bool operator>=( const Sequence::iterator &left, const Sequence::iterator &right ); + + extern bool operator==( const Sequence::const_iterator &left, const Sequence::const_iterator &right ); + extern bool operator!=( const Sequence::const_iterator &left, const Sequence::const_iterator &right ); + extern bool operator< ( const Sequence::const_iterator &left, const Sequence::const_iterator &right ); + extern bool operator> ( const Sequence::const_iterator &left, const Sequence::const_iterator &right ); + extern bool operator<=( const Sequence::const_iterator &left, const Sequence::const_iterator &right ); + extern bool operator>=( const Sequence::const_iterator &left, const Sequence::const_iterator &right ); + + // ================================================== + // class Char + // Python strings return strings as individual elements. + // I'll try having a class Char which is a String of length 1 + // + typedef std::basic_string unicodestring; + extern Py_UNICODE unicode_null_string[1]; + + class Byte: public Object + { + public: + // Membership + virtual bool accepts( PyObject *pyob ) const + { + return pyob != NULL + && Py::_Unicode_Check( pyob ) + && PySequence_Length( pyob ) == 1; + } + + explicit Byte( PyObject *pyob, bool owned = false ) + : Object( pyob, owned ) + { + validate(); + } + + Byte( const Object &ob ) + : Object( ob ) + { + validate(); + } + + Byte( const std::string &v = "" ) + : Object( PyBytes_FromStringAndSize( const_cast( v.c_str() ), 1 ), true ) + { + validate(); + } + + Byte( char v ) + : Object( PyBytes_FromStringAndSize( &v, 1 ), true ) + { + validate(); + } + + // Assignment acquires new ownership of pointer + Byte &operator=( const Object &rhs ) + { + return *this = *rhs; + } + + Byte &operator=( PyObject *rhsp ) + { + if( ptr() != rhsp ) + set( rhsp ); + return *this; + } + + // Assignment from C string + Byte &operator=( const std::string &v ) + { + set( PyBytes_FromStringAndSize( const_cast( v.c_str() ),1 ), true ); + return *this; + } + + Byte &operator=( char v ) + { + set( PyUnicode_FromStringAndSize( &v, 1 ), true ); + return *this; + } + + // Conversion + operator Bytes() const; + }; + + class Bytes: public SeqBase + { + public: + // Membership + virtual bool accepts( PyObject *pyob ) const + { + return pyob != NULL && Py::_Bytes_Check( pyob ); + } + + virtual size_type capacity() const + { + return max_size(); + } + + explicit Bytes( PyObject *pyob, bool owned = false ) + : SeqBase( pyob, owned ) + { + validate(); + } + + Bytes( const Object &ob ) + : SeqBase( ob ) + { + validate(); + } + + Bytes() + : SeqBase( PyBytes_FromStringAndSize( "", 0 ), true ) + { + validate(); + } + + Bytes( const std::string &v ) + : SeqBase( PyBytes_FromStringAndSize( const_cast( v.data() ), static_cast( v.length() ) ), true ) + { + validate(); + } + + Bytes( const std::string &v, Py_ssize_t vsize ) + : SeqBase( PyBytes_FromStringAndSize( const_cast( v.data() ), static_cast( vsize ) ), true ) + { + validate(); + } + + Bytes( const char *v ) + : SeqBase( PyBytes_FromString( v ), true ) + { + validate(); + } + + Bytes( const char *v, Py_ssize_t vsize ) + : SeqBase( PyBytes_FromStringAndSize( const_cast( v ), vsize ), true ) + { + validate(); + } + + // Assignment acquires new ownership of pointer + Bytes &operator=( const Object &rhs ) + { + return *this = *rhs; + } + + Bytes &operator=( PyObject *rhsp ) + { + if( ptr() != rhsp ) + set( rhsp ); + return *this; + } + + // Assignment from C string + Bytes &operator=( const std::string &v ) + { + set( PyBytes_FromStringAndSize( const_cast( v.data() ), static_cast( v.length() ) ), true ); + return *this; + } + + String decode( const char *encoding, const char *error="strict" ); + + // Queries + virtual size_type size() const + { + return static_cast( PyBytes_Size( ptr() ) ); + } + + operator std::string() const + { + return as_std_string(); + } + + std::string as_std_string() const + { + return std::string( PyBytes_AsString( ptr() ), static_cast( PyBytes_Size( ptr() ) ) ); + } + }; + + class Char: public Object + { + public: + // Membership + virtual bool accepts( PyObject *pyob ) const + { + return pyob != 0 &&( Py::_Unicode_Check( pyob ) ) && PySequence_Length( pyob ) == 1; + } + + explicit Char( PyObject *pyob, bool owned = false ) + : Object( pyob, owned ) + { + validate(); + } + + Char( const Object &ob ) + : Object( ob ) + { + validate(); + } + + Char( int v ) + : Object( PyUnicode_FromOrdinal( v ), true ) + { + validate(); + } + + Char( Py_UNICODE v ) + : Object( PyUnicode_FromOrdinal( v ), true ) + { + validate(); + } + + Char( const unicodestring &v ) + : Object( PyUnicode_FromUnicode( const_cast( v.data() ),1 ), true ) + { + validate(); + } + + // Assignment acquires new ownership of pointer + Char &operator=( const Object &rhs ) + { + return *this = *rhs; + } + + Char &operator=( PyObject *rhsp ) + { + if( ptr() != rhsp ) + set( rhsp ); + return *this; + } + + Char &operator=( const unicodestring &v ) + { + set( PyUnicode_FromUnicode( const_cast( v.data() ), 1 ), true ); + return *this; + } + + Char &operator=( int v_ ) + { + Py_UNICODE v( v_ ); + set( PyUnicode_FromUnicode( &v, 1 ), true ); + return *this; + } + + Char &operator=( Py_UNICODE v ) + { + set( PyUnicode_FromUnicode( &v, 1 ), true ); + return *this; + } + + // Conversion + operator String() const; + }; + + class String: public SeqBase + { + public: + virtual size_type capacity() const + { + return max_size(); + } + + // Membership + virtual bool accepts( PyObject *pyob ) const + { + return pyob != NULL && Py::_Unicode_Check( pyob ); + } + + explicit String( PyObject *pyob, bool owned = false ) + : SeqBase( pyob, owned ) + { + validate(); + } + + String( const Object &ob ) + : SeqBase( ob ) + { + validate(); + } + + String() + : SeqBase( PyUnicode_FromString( "" ), true ) + { + validate(); + } + + String( const char *latin1 ) + : SeqBase( PyUnicode_FromString( latin1 ) ) + { + validate(); + } + + String( const std::string &latin1 ) + : SeqBase( PyUnicode_FromStringAndSize( latin1.c_str(), latin1.size() ) ) + { + validate(); + } + + String( const char *latin1, Py_ssize_t size ) + : SeqBase( PyUnicode_FromStringAndSize( latin1, size ) ) + { + validate(); + } + + /* [Taken from Pythons's unicode.h] + + Many of these APIs take two arguments encoding and errors. These + parameters encoding and errors have the same semantics as the ones + of the builtin unicode() API. + + Setting encoding to NULL causes the default encoding to be used. + + Error handling is set by errors which may also be set to NULL + meaning to use the default handling defined for the codec. Default + error handling for all builtin codecs is "strict" (ValueErrors are + raised). + + The codecs all use a similar interface. Only deviation from the + generic ones are documented. + + */ + String( const std::string &s, const char *encoding, const char *errors=NULL ) + : SeqBase( PyUnicode_Decode( s.c_str(), s.size(), encoding, errors ) ) + { + validate(); + } + + String( const char *s, const char *encoding, const char *errors=NULL ) + : SeqBase( PyUnicode_Decode( s, strlen(s), encoding, errors ) ) + { + validate(); + } + + String( const char *s, Py_ssize_t size, const char *encoding, const char *errors=NULL ) + : SeqBase( PyUnicode_Decode( s, size, encoding, errors ) ) + { + validate(); + } + + // Assignment acquires new ownership of pointer + String &operator=( const Object &rhs ) + { + return *this = *rhs; + } + + String &operator=( PyObject *rhsp ) + { + if( ptr() != rhsp ) + set( rhsp ); + return *this; + } + + String &operator=( const unicodestring &v ) + { + set( PyUnicode_FromUnicode( const_cast( v.data() ), static_cast( v.length() ) ), true ); + return *this; + } + + // Encode + Bytes encode( const char *encoding, const char *error="strict" ) const + { + return Bytes( PyUnicode_AsEncodedString( ptr(), encoding, error ) ); + } + + // Queries + virtual size_type size() const + { + return static_cast( PyUnicode_GET_SIZE( ptr() ) ); + } + + unicodestring as_unicodestring() const + { + return unicodestring( PyUnicode_AS_UNICODE( ptr() ), static_cast( PyUnicode_GET_SIZE( ptr() ) ) ); + } + + operator std::string() const + { + // use the default encoding + return as_std_string( NULL ); + } + + std::string as_std_string( const char *encoding=NULL, const char *error="strict" ) const + { + Bytes b( encode( encoding, error ) ); + return b.as_std_string(); + } + }; + + // ================================================== + // class Tuple + class Tuple: public Sequence + { + public: + virtual void setItem( sequence_index_type offset, const Object&ob ) + { + // note PyTuple_SetItem is a thief... + if( PyTuple_SetItem( ptr(), offset, new_reference_to( ob ) ) == -1 ) + { + throw Exception(); + } + } + + // Constructor + explicit Tuple( PyObject *pyob, bool owned = false ) + : Sequence( pyob, owned ) + { + validate(); + } + + Tuple( const Object &ob ) + : Sequence( ob ) + { + validate(); + } + + // New tuple of a given size + explicit Tuple( int size = 0 ) + { + set( PyTuple_New( size ), true ); + validate(); + for( sequence_index_type i=0; i < size; i++ ) + { + if( PyTuple_SetItem( ptr(), i, new_reference_to( Py::_None() ) ) == -1 ) + { + throw Exception(); + } + } + } + // Tuple from any sequence + explicit Tuple( const Sequence &s ) + { + sequence_index_type limit( sequence_index_type( s.length() ) ); + + set( PyTuple_New( limit ), true ); + validate(); + + for( sequence_index_type i=0; i < limit; i++ ) + { + if( PyTuple_SetItem( ptr(), i, new_reference_to( s[i] ) ) == -1 ) + { + throw Exception(); + } + } + } + // Assignment acquires new ownership of pointer + + Tuple &operator=( const Object &rhs ) + { + return *this = *rhs; + } + + Tuple &operator=( PyObject *rhsp ) + { + if( ptr() != rhsp ) + set( rhsp ); + return *this; + } + // Membership + virtual bool accepts( PyObject *pyob ) const + { + return pyob && Py::_Tuple_Check( pyob ); + } + + Tuple getSlice( int i, int j ) const + { + return Tuple( PySequence_GetSlice( ptr(), i, j ), true ); + } + + }; + + // ================================================== + // class List + + class List: public Sequence + { + public: + // Constructor + explicit List( PyObject *pyob, bool owned = false ) + : Sequence( pyob, owned ) + { + validate(); + } + List( const Object &ob ) + : Sequence( ob ) + { + validate(); + } + // Creation at a fixed size + List( int size = 0 ) + { + set( PyList_New( size ), true ); + validate(); + for( sequence_index_type i=0; i < size; i++ ) + { + if( PyList_SetItem( ptr(), i, new_reference_to( Py::_None() ) ) == -1 ) + { + throw Exception(); + } + } + } + + // List from a sequence + List( const Sequence &s ) + : Sequence() + { + int n =( int )s.length(); + set( PyList_New( n ), true ); + validate(); + for( sequence_index_type i=0; i < n; i++ ) + { + if( PyList_SetItem( ptr(), i, new_reference_to( s[i] ) ) == -1 ) + { + throw Exception(); + } + } + } + + virtual size_type capacity() const + { + return max_size(); + } + // Assignment acquires new ownership of pointer + + List &operator=( const Object &rhs ) + { + return *this = *rhs; + } + + List &operator=( PyObject *rhsp ) + { + if( ptr() != rhsp ) + set( rhsp ); + return *this; + } + + // Membership + virtual bool accepts( PyObject *pyob ) const + { + return pyob && Py::_List_Check( pyob ); + } + + List getSlice( int i, int j ) const + { + return List( PyList_GetSlice( ptr(), i, j ), true ); + } + + void setSlice( int i, int j, const Object &v ) + { + if( PyList_SetSlice( ptr(), i, j, *v ) == -1 ) + { + throw Exception(); + } + } + + void append( const Object &ob ) + { + if( PyList_Append( ptr(), *ob ) == -1 ) + { + throw Exception(); + } + } + + void extend( const Object &ob ) + { + setSlice( size(), size(), ob ); + } + + void insert( int i, const Object &ob ) + { + if( PyList_Insert( ptr(), i, *ob ) == -1 ) + { + throw Exception(); + } + } + + void sort() + { + if( PyList_Sort( ptr() ) == -1 ) + { + throw Exception(); + } + } + + void reverse() + { + if( PyList_Reverse( ptr() ) == -1 ) + { + throw Exception(); + } + } + }; + + + // Mappings + // ================================================== + template + class mapref + { + protected: + MapBase &s; // the map + Object key; // item key + T the_item; + + public: + mapref( MapBase &map, const std::string &k ) + : s( map ), the_item() + { + key = String( k ); + if( map.hasKey( key ) ) the_item = map.getItem( key ); + } + + mapref( MapBase &map, const Object &k ) + : s( map ), key( k ), the_item() + { + if( map.hasKey( key ) ) the_item = map.getItem( key ); + } + + virtual ~mapref() + {} + + // MapBase stuff + // lvalue + mapref &operator=( const mapref &other ) + { + if( this != &other ) + { + the_item = other.the_item; + s.setItem( key, other.the_item ); + } + return *this; + } + + mapref &operator=( const T &ob ) + { + the_item = ob; + s.setItem( key, ob ); + return *this; + } + + // rvalue + operator T() const + { + return the_item; + } + + // forward everything else to the_item + PyObject *ptr() const + { + return the_item.ptr(); + } + + int reference_count() const + { // the mapref count + return the_item.reference_count(); + } + + Type type() const + { + return the_item.type(); + } + + String str() const + { + return the_item.str(); + } + + String repr() const + { + return the_item.repr(); + } + + bool hasAttr( const std::string &attr_name ) const + { + return the_item.hasAttr( attr_name ); + } + + Object getAttr( const std::string &attr_name ) const + { + return the_item.getAttr( attr_name ); + } + + Object getItem( const Object &k ) const + { + return the_item.getItem( k ); + } + + long hashValue() const + { + return the_item.hashValue(); + } + + bool isCallable() const + { + return the_item.isCallable(); + } + + bool isInstance() const + { + return the_item.isInstance(); + } + + bool isList() const + { + return the_item.isList(); + } + + bool isMapping() const + { + return the_item.isMapping(); + } + + bool isNumeric() const + { + return the_item.isNumeric(); + } + + bool isSequence() const + { + return the_item.isSequence(); + } + + bool isTrue() const + { + return the_item.isTrue(); + } + + bool isType( const Type &t ) const + { + return the_item.isType( t ); + } + + bool isTuple() const + { + return the_item.isTuple(); + } + + bool isString() const + { + return the_item.isString(); + } + + // Commands + void setAttr( const std::string &attr_name, const Object &value ) + { + the_item.setAttr( attr_name, value ); + } + + void delAttr( const std::string &attr_name ) + { + the_item.delAttr( attr_name ); + } + + void delItem( const Object &k ) + { + the_item.delItem( k ); + } + }; // end of mapref + +#if 0 + // TMM: now for mapref + template< class T > + bool operator==( const mapref &left, const mapref &right ) + { + return true; // NOT completed. + } + + template< class T > + bool operator!=( const mapref &left, const mapref &right ) + { + return true; // not completed. + } +#endif + + template + class MapBase: public Object + { + protected: + explicit MapBase() + {} + public: + // reference: proxy class for implementing [] + // TMM: 26Jun'01 - the types + // If you assume that Python mapping is a hash_map... + // hash_map::value_type is not assignable, but + //( *it ).second = data must be a valid expression + typedef size_t size_type; + typedef Object key_type; + typedef mapref data_type; + typedef std::pair< const T, T > value_type; + typedef std::pair< const T, mapref > reference; + typedef const std::pair< const T, const T > const_reference; + typedef std::pair< const T, mapref > pointer; + + // Constructor + explicit MapBase( PyObject *pyob, bool owned = false ) + : Object( pyob, owned ) + { + validate(); + } + + // TMM: 02Jul'01 - changed MapBase to Object in next line + MapBase( const Object &ob ) + : Object( ob ) + { + validate(); + } + + // Assignment acquires new ownership of pointer + MapBase &operator=( const Object &rhs ) + { + return *this = *rhs; + } + + MapBase &operator=( PyObject *rhsp ) + { + if( ptr() != rhsp ) + set( rhsp ); + return *this; + } + // Membership + virtual bool accepts( PyObject *pyob ) const + { + return pyob && PyMapping_Check( pyob ); + } + + // Clear -- PyMapping Clear is missing + // + + void clear() + { + List k = keys(); + for( List::iterator i = k.begin(); i != k.end(); i++ ) + { + delItem( *i ); + } + } + + virtual size_type size() const + { + return PyMapping_Length( ptr() ); + } + + // Element Access + T operator[]( const std::string &key ) const + { + return getItem( key ); + } + + T operator[]( const Object &key ) const + { + return getItem( key ); + } + + mapref operator[]( const char *key ) + { + return mapref( *this, key ); + } + + mapref operator[]( const std::string &key ) + { + return mapref( *this, key ); + } + + mapref operator[]( const Object &key ) + { + return mapref( *this, key ); + } + + int length() const + { + return PyMapping_Length( ptr() ); + } + + bool hasKey( const std::string &s ) const + { + return PyMapping_HasKeyString( ptr(),const_cast( s.c_str() ) ) != 0; + } + + bool hasKey( const Object &s ) const + { + return PyMapping_HasKey( ptr(), s.ptr() ) != 0; + } + + T getItem( const std::string &s ) const + { + return T( asObject( PyMapping_GetItemString( ptr(),const_cast( s.c_str() ) ) ) ); + } + + T getItem( const Object &s ) const + { + return T( asObject( PyObject_GetItem( ptr(), s.ptr() ) ) ); + } + + virtual void setItem( const char *s, const Object &ob ) + { + if( PyMapping_SetItemString( ptr(), const_cast( s ), *ob ) == -1 ) + { + throw Exception(); + } + } + + virtual void setItem( const std::string &s, const Object &ob ) + { + if( PyMapping_SetItemString( ptr(), const_cast( s.c_str() ), *ob ) == -1 ) + { + throw Exception(); + } + } + + virtual void setItem( const Object &s, const Object &ob ) + { + if( PyObject_SetItem( ptr(), s.ptr(), ob.ptr() ) == -1 ) + { + throw Exception(); + } + } + + void delItem( const std::string &s ) + { + if( PyMapping_DelItemString( ptr(), const_cast( s.c_str() ) ) == -1 ) + { + throw Exception(); + } + } + + void delItem( const Object &s ) + { + if( PyMapping_DelItem( ptr(), *s ) == -1 ) + { + throw Exception(); + } + } + + // Queries + List keys() const + { + return List( PyMapping_Keys( ptr() ), true ); + } + + List values() const + { + // each returned item is a (key, value) pair + return List( PyMapping_Values( ptr() ), true ); + } + + List items() const + { + return List( PyMapping_Items( ptr() ), true ); + } + + class iterator + { + // : public forward_iterator_parent( std::pair ) { + protected: + typedef std::forward_iterator_tag iterator_category; + typedef std::pair< const T, T > value_type; + typedef int difference_type; + typedef std::pair< const T, mapref > pointer; + typedef std::pair< const T, mapref > reference; + + friend class MapBase; + // + MapBase *map; + List keys; // for iterating over the map + int pos; // index into the keys + + public: + ~iterator() + {} + + iterator() + : map( 0 ) + , keys() + , pos( 0 ) + {} + + iterator( MapBase *m, bool end = false ) + : map( m ) + , keys( m->keys() ) + , pos( end ? keys.length() : 0 ) + {} + + iterator( const iterator &other ) + : map( other.map ) + , keys( other.keys ) + , pos( other.pos ) + {} + + iterator( MapBase *map_, List keys_, int pos_ ) + : map( map_ ) + , keys( keys_ ) + , pos( pos_ ) + {} + + reference operator*() + { + Object key = keys[ pos ]; + return std::make_pair( key, mapref( *map, key ) ); + } + + iterator &operator=( const iterator &other ) + { + if( this != &other ) + { + map = other.map; + keys = other.keys; + pos = other.pos; + } + return *this; + } + + bool eql( const iterator &other ) const + { + return map->ptr() == other.map->ptr() && pos == other.pos; + } + + bool neq( const iterator &other ) const + { + return map->ptr() != other.map->ptr() || pos != other.pos; + } + + // pointer operator->() { + // return ; + // } + + // prefix ++ + iterator &operator++() + { + pos++; + return *this; + } + + // postfix ++ + iterator operator++( int ) + { + return iterator( map, keys, pos++ ); + } + + // prefix -- + iterator &operator--() + { + pos--; + return *this; + } + + // postfix -- + iterator operator--( int ) + { + return iterator( map, keys, pos-- ); + } + + std::string diagnose() const + { + std::OSTRSTREAM oss; + oss << "iterator diagnosis " << map << ", " << pos << std::ends; + return std::string( oss.str() ); + } + }; // end of class MapBase::iterator + + iterator begin() + { + return iterator( this, false ); + } + + iterator end() + { + return iterator( this, true ); + } + + class const_iterator + { + protected: + typedef std::forward_iterator_tag iterator_category; + typedef const std::pair< const T, T > value_type; + typedef int difference_type; + typedef const std::pair< const T, T > pointer; + typedef const std::pair< const T, T > reference; + + friend class MapBase; + const MapBase *map; + List keys; // for iterating over the map + int pos; // index into the keys + + public: + ~const_iterator() + {} + + const_iterator() + : map( 0 ) + , keys() + , pos() + {} + + const_iterator( const MapBase *m, List k, int p ) + : map( m ) + , keys( k ) + , pos( p ) + {} + + const_iterator( const const_iterator &other ) + : map( other.map ) + , keys( other.keys ) + , pos( other.pos ) + {} + + bool eql( const const_iterator &other ) const + { + return map->ptr() == other.map->ptr() && pos == other.pos; + } + + bool neq( const const_iterator &other ) const + { + return map->ptr() != other.map->ptr() || pos != other.pos; + } + + + // const_reference operator*() { + // Object key = *pos; + // return std::make_pair( key, map->[key] ); + // GCC < 3 barfes on this line at the '['. + // } + + const_reference operator*() + { + Object key = keys[ pos ]; + return std::make_pair( key, mapref( *map, key ) ); + } + + const_iterator &operator=( const const_iterator &other ) + { + if( this != &other ) + { + map = other.map; + keys = other.keys; + pos = other.pos; + } + return *this; + } + + // prefix ++ + const_iterator &operator++() + { + pos++; + return *this; + } + + // postfix ++ + const_iterator operator++( int ) + { + return const_iterator( map, keys, pos++ ); + } + + // prefix -- + const_iterator &operator--() + { + pos--; + return *this; + } + + // postfix -- + const_iterator operator--( int ) + { + return const_iterator( map, keys, pos-- ); + } + }; // end of class MapBase::const_iterator + + const_iterator begin() const + { + return const_iterator( this, keys(), 0 ); + } + + const_iterator end() const + { + return const_iterator( this, keys(), length() ); + } + + }; // end of MapBase + + typedef MapBase Mapping; + + template bool operator==( const EXPLICIT_TYPENAME MapBase::iterator &left, const EXPLICIT_TYPENAME MapBase::iterator &right ); + template bool operator!=( const EXPLICIT_TYPENAME MapBase::iterator &left, const EXPLICIT_TYPENAME MapBase::iterator &right ); + template bool operator==( const EXPLICIT_TYPENAME MapBase::const_iterator &left, const EXPLICIT_TYPENAME MapBase::const_iterator &right ); + template bool operator!=( const EXPLICIT_TYPENAME MapBase::const_iterator &left, const EXPLICIT_TYPENAME MapBase::const_iterator &right ); + + extern bool operator==( const Mapping::iterator &left, const Mapping::iterator &right ); + extern bool operator!=( const Mapping::iterator &left, const Mapping::iterator &right ); + extern bool operator==( const Mapping::const_iterator &left, const Mapping::const_iterator &right ); + extern bool operator!=( const Mapping::const_iterator &left, const Mapping::const_iterator &right ); + + + // ================================================== + // class Dict + class Dict: public Mapping + { + public: + // Constructor + explicit Dict( PyObject *pyob, bool owned=false ) + : Mapping( pyob, owned ) + { + validate(); + } + + Dict( const Object &ob ) + : Mapping( ob ) + { + validate(); + } + + // Creation + Dict() + { + set( PyDict_New(), true ); + validate(); + } + // Assignment acquires new ownership of pointer + + Dict &operator=( const Object &rhs ) + { + return *this = *rhs; + } + + Dict &operator=( PyObject *rhsp ) + { + if( ptr() != rhsp ) + set( rhsp ); + return *this; + } + // Membership + virtual bool accepts( PyObject *pyob ) const + { + return pyob && Py::_Dict_Check( pyob ); + } + }; + + class Callable: public Object + { + public: + // Constructor + explicit Callable() + : Object() + {} + + explicit Callable( PyObject *pyob, bool owned = false ) + : Object( pyob, owned ) + { + validate(); + } + + Callable( const Object &ob ) + : Object( ob ) + { + validate(); + } + + // Assignment acquires new ownership of pointer + Callable &operator=( const Object &rhs ) + { + return *this = *rhs; + } + + Callable &operator=( PyObject *rhsp ) + { + if( ptr() != rhsp ) + set( rhsp ); + return *this; + } + + // Membership + virtual bool accepts( PyObject *pyob ) const + { + return pyob && PyCallable_Check( pyob ); + } + + // Call + Object apply( const Tuple &args ) const + { + return asObject( PyObject_CallObject( ptr(), args.ptr() ) ); + } + + // Call with keywords + Object apply( const Tuple &args, const Dict &kw ) const + { + return asObject( PyEval_CallObjectWithKeywords( ptr(), args.ptr(), kw.ptr() ) ); + } + + Object apply( PyObject *pargs = 0 ) const + { + return apply( Tuple( pargs ) ); + } + }; + + class Module: public Object + { + public: + explicit Module( PyObject *pyob, bool owned = false ) + : Object( pyob, owned ) + { + validate(); + } + + // Construct from module name + explicit Module( const std::string &s ) + : Object() + { + PyObject *m = PyImport_AddModule( const_cast( s.c_str() ) ); + set( m, false ); + validate(); + } + + // Copy constructor acquires new ownership of pointer + Module( const Module &ob ) + : Object( *ob ) + { + validate(); + } + + Module &operator=( const Object &rhs ) + { + return *this = *rhs; + } + + Module &operator=( PyObject *rhsp ) + { + if( ptr() != rhsp ) + set( rhsp ); + return *this; + } + + Dict getDict() const + { + return Dict( PyModule_GetDict( ptr() ) ); + // Caution -- PyModule_GetDict returns borrowed reference! + } + }; + + // Numeric interface + inline Object operator+( const Object &a ) + { + return asObject( PyNumber_Positive( *a ) ); + } + + inline Object operator-( const Object &a ) + { + return asObject( PyNumber_Negative( *a ) ); + } + + inline Object abs( const Object &a ) + { + return asObject( PyNumber_Absolute( *a ) ); + } + + //------------------------------------------------------------ + // operator + + inline Object operator+( const Object &a, const Object &b ) + { + return asObject( PyNumber_Add( *a, *b ) ); + } + + inline Object operator+( const Object &a, int j ) + { + return asObject( PyNumber_Add( *a, *Long( j ) ) ); + } + + inline Object operator+( const Object &a, long j ) + { + return asObject( PyNumber_Add( *a, *Long( j ) ) ); + } + + inline Object operator+( const Object &a, double v ) + { + return asObject( PyNumber_Add( *a, *Float( v ) ) ); + } + + inline Object operator+( int j, const Object &b ) + { + return asObject( PyNumber_Add( *Long( j ), *b ) ); + } + + inline Object operator+( long j, const Object &b ) + { + return asObject( PyNumber_Add( *Long( j ), *b ) ); + } + + inline Object operator+( double v, const Object &b ) + { + return asObject( PyNumber_Add( *Float( v ), *b ) ); + } + + //------------------------------------------------------------ + // operator - + inline Object operator-( const Object &a, const Object &b ) + { + return asObject( PyNumber_Subtract( *a, *b ) ); + } + + inline Object operator-( const Object &a, int j ) + { + return asObject( PyNumber_Subtract( *a, *Long( j ) ) ); + } + + inline Object operator-( const Object &a, double v ) + { + return asObject( PyNumber_Subtract( *a, *Float( v ) ) ); + } + + inline Object operator-( int j, const Object &b ) + { + return asObject( PyNumber_Subtract( *Long( j ), *b ) ); + } + + inline Object operator-( double v, const Object &b ) + { + return asObject( PyNumber_Subtract( *Float( v ), *b ) ); + } + + //------------------------------------------------------------ + // operator * + inline Object operator*( const Object &a, const Object &b ) + { + return asObject( PyNumber_Multiply( *a, *b ) ); + } + + inline Object operator*( const Object &a, int j ) + { + return asObject( PyNumber_Multiply( *a, *Long( j ) ) ); + } + + inline Object operator*( const Object &a, double v ) + { + return asObject( PyNumber_Multiply( *a, *Float( v ) ) ); + } + + inline Object operator*( int j, const Object &b ) + { + return asObject( PyNumber_Multiply( *Long( j ), *b ) ); + } + + inline Object operator*( double v, const Object &b ) + { + return asObject( PyNumber_Multiply( *Float( v ), *b ) ); + } + + //------------------------------------------------------------ + // operator / + inline Object operator/( const Object &a, const Object &b ) + { + return asObject( PyNumber_TrueDivide( *a, *b ) ); + } + + inline Object operator/( const Object &a, int j ) + { + return asObject( PyNumber_TrueDivide( *a, *Long( j ) ) ); + } + + inline Object operator/( const Object &a, double v ) + { + return asObject( PyNumber_TrueDivide( *a, *Float( v ) ) ); + } + + inline Object operator/( int j, const Object &b ) + { + return asObject( PyNumber_TrueDivide( *Long( j ), *b ) ); + } + + inline Object operator/( double v, const Object &b ) + { + return asObject( PyNumber_TrueDivide( *Float( v ), *b ) ); + } + + //------------------------------------------------------------ + // operator % + inline Object operator%( const Object &a, const Object &b ) + { + return asObject( PyNumber_Remainder( *a, *b ) ); + } + + inline Object operator%( const Object &a, int j ) + { + return asObject( PyNumber_Remainder( *a, *Long( j ) ) ); + } + + inline Object operator%( const Object &a, double v ) + { + return asObject( PyNumber_Remainder( *a, *Float( v ) ) ); + } + + inline Object operator%( int j, const Object &b ) + { + return asObject( PyNumber_Remainder( *Long( j ), *b ) ); + } + + inline Object operator%( double v, const Object &b ) + { + return asObject( PyNumber_Remainder( *Float( v ), *b ) ); + } + + //------------------------------------------------------------ + // type + inline Object type( const Exception &) // return the type of the error + { + PyObject *ptype, *pvalue, *ptrace; + PyErr_Fetch( &ptype, &pvalue, &ptrace ); + Object result; + if( ptype ) + result = ptype; + PyErr_Restore( ptype, pvalue, ptrace ); + return result; + } + + inline Object value( const Exception &) // return the value of the error + { + PyObject *ptype, *pvalue, *ptrace; + PyErr_Fetch( &ptype, &pvalue, &ptrace ); + Object result; + if( pvalue ) + result = pvalue; + PyErr_Restore( ptype, pvalue, ptrace ); + return result; + } + + inline Object trace( const Exception &) // return the traceback of the error + { + PyObject *ptype, *pvalue, *ptrace; + PyErr_Fetch( &ptype, &pvalue, &ptrace ); + Object result; + if( ptrace ) + result = ptrace; + PyErr_Restore( ptype, pvalue, ptrace ); + return result; + } + + template + String seqref::str() const + { + return the_item.str(); + } + + template + String seqref::repr() const + { + return the_item.repr(); + } + +} // namespace Py +#endif // __CXX_Objects__h diff -Nru matplotlib-0.99.3/CXX/Python3/PythonType.hxx matplotlib-1.0.1/CXX/Python3/PythonType.hxx --- matplotlib-0.99.3/CXX/Python3/PythonType.hxx 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/CXX/Python3/PythonType.hxx 2010-07-07 01:41:53.000000000 +0000 @@ -0,0 +1,114 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// 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 disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED 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 REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY 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. +// +//----------------------------------------------------------------------------- + +#ifndef __CXX_PythonType__h +#define __CXX_PythonType__h + +namespace Py +{ + class PythonType + { + public: + // if you define one sequence method you must define + // all of them except the assigns + + PythonType( size_t base_size, int itemsize, const char *default_name ); + virtual ~PythonType(); + + const char *getName() const; + const char *getDoc() const; + + PyTypeObject *type_object() const; + PythonType &name( const char *nam ); + PythonType &doc( const char *d ); + + PythonType &supportClass( void ); +#ifdef PYCXX_PYTHON_2TO3 + PythonType &supportPrint( void ); +#endif + PythonType &supportGetattr( void ); + PythonType &supportSetattr( void ); + PythonType &supportGetattro( void ); + PythonType &supportSetattro( void ); +#ifdef PYCXX_PYTHON_2TO3 + PythonType &supportCompare( void ); +#endif + PythonType &supportRichCompare( void ); + PythonType &supportRepr( void ); + PythonType &supportStr( void ); + PythonType &supportHash( void ); + PythonType &supportCall( void ); + PythonType &supportIter( void ); + + PythonType &supportSequenceType( void ); + PythonType &supportMappingType( void ); + PythonType &supportNumberType( void ); + PythonType &supportBufferType( void ); + + PythonType &set_tp_dealloc( void (*tp_dealloc)( PyObject * ) ); + PythonType &set_tp_init( int (*tp_init)( PyObject *self, PyObject *args, PyObject *kwds ) ); + PythonType &set_tp_new( PyObject *(*tp_new)( PyTypeObject *subtype, PyObject *args, PyObject *kwds ) ); + PythonType &set_methods( PyMethodDef *methods ); + + // call once all support functions have been called to ready the type + bool readyType(); + + protected: + void init_sequence(); + void init_mapping(); + void init_number(); + void init_buffer(); + + PyTypeObject *table; + PySequenceMethods *sequence_table; + PyMappingMethods *mapping_table; + PyNumberMethods *number_table; + PyBufferProcs *buffer_table; + + private: + // + // prevent the compiler generating these unwanted functions + // + PythonType( const PythonType &tb ); // unimplemented + void operator=( const PythonType &t ); // unimplemented + + }; + +} // Namespace Py + +// End of __CXX_PythonType__h +#endif diff -Nru matplotlib-0.99.3/CXX/Version.hxx matplotlib-1.0.1/CXX/Version.hxx --- matplotlib-0.99.3/CXX/Version.hxx 2009-07-31 15:14:42.000000000 +0000 +++ matplotlib-1.0.1/CXX/Version.hxx 2010-07-07 01:41:53.000000000 +0000 @@ -38,9 +38,9 @@ #ifndef __PyCXX_version_hxx__ #define __PyCXX_version_hxx__ -#define PYCXX_VERSION_MAJOR 5 -#define PYCXX_VERSION_MINOR 4 -#define PYCXX_VERSION_PATCH 2 +#define PYCXX_VERSION_MAJOR 6 +#define PYCXX_VERSION_MINOR 1 +#define PYCXX_VERSION_PATCH 1 #define PYCXX_MAKEVERSION( major, minor, patch ) ((major<<16)|(minor<<8)|(patch)) #define PYCXX_VERSION PYCXX_MAKEVERSION( PYCXX_VERSION_MAJOR, PYCXX_VERSION_MINOR, PYCXX_VERSION_PATCH ) #endif diff -Nru matplotlib-0.99.3/CXX/WrapPython.h matplotlib-1.0.1/CXX/WrapPython.h --- matplotlib-0.99.3/CXX/WrapPython.h 2009-07-31 15:14:42.000000000 +0000 +++ matplotlib-1.0.1/CXX/WrapPython.h 2010-09-23 19:54:49.000000000 +0000 @@ -38,8 +38,8 @@ #ifndef __PyCXX_wrap_python_hxx__ #define __PyCXX_wrap_python_hxx__ -// pull in python definitions -#include +/* Python API mandates Python.h is included *first* */ +#include "Python.h" // On some platforms we have to include time.h to get select defined #if !defined(__WIN32__) && !defined(WIN32) && !defined(_WIN32) && !defined(_WIN64) diff -Nru matplotlib-0.99.3/debian/changelog matplotlib-1.0.1/debian/changelog --- matplotlib-0.99.3/debian/changelog 2011-04-13 16:43:46.000000000 +0000 +++ matplotlib-1.0.1/debian/changelog 2011-04-29 00:24:28.000000000 +0000 @@ -1,32 +1,42 @@ -matplotlib (0.99.3-1ubuntu4) natty; urgency=low +matplotlib (1.0.1-1~rtm1+natty1) natty; urgency=low - * add patch 70_search_new_tkdir.patch - + search in new path for tkConfig.sh, changed in tk 8.5.9-2 (LP: #752647) + * backport from sid - -- Julian Taylor Thu, 07 Apr 2011 21:12:50 +0200 + -- Adrian Benson Mon, 25 Apr 2011 19:39:02 +1200 -matplotlib (0.99.3-1ubuntu3) natty; urgency=low +matplotlib (1.0.1-1) experimental; urgency=low - [ Mike Droettboom ] - * debian/patches/40_UnicodeEncodeError.patch: Remove unicode from docstrings - since it doesn't play well with __builtin__.help(). (LP: #685710) - - -- Artur Rona Mon, 04 Apr 2011 21:24:28 +0200 - -matplotlib (0.99.3-1ubuntu2) natty; urgency=low - - * No change rebuild to pick up python2.7 - - -- Scott Kitterman Thu, 04 Nov 2010 13:21:26 -0400 - -matplotlib (0.99.3-1ubuntu1) maverick; urgency=low - - * Merge from debian unstable. Remaining changes: - - Drop python-qt-dev from build-depends and python-qt3 from - python-matplotlib suggests to support python-qt3 removal. Reflect - this in README.Debian. + * New upstream release; Closes: #606116 + * debian/patches/{10_build_fix.patch, 20_matplotlibrc_path_search_fix.patch} + - updated to new upstream code + * debian/patches/30_doc_pass_dpi.patch + - removed, merged upstream + * debian/rules + - don't compress objects.inv; thanks to Michael Fladischer for the report; + Closes: #608760 + * debian/rules, debian/patches/30_disable_sample_downloads.patch + - bypass examples data download from internet, but use local copy instead + * debian/python-matplotlib-data.install + - install examples sample data + * debian/control + - bump Standards-Version: to 3.9.1 (no changes needed) + - removed DM-U-A flag, no more needed + - added python-xlwt to b-d, needed to build doc examples + - Benjamin Drung removed himself from the Uploaders list + * debian/copyright + - updated debian packaging copyright + * debian/patches/40_bts608939_draw_markers_description.patch + - fix a glitch (missing reference to documentation page) in draw_markers() + description; thanks to Jakub Wilk for report and patch; Closes: #608939 + * debian/patches/50_bts608942_spaces_in_param_args.patch + - don't separate param and its argument with a space, new sphinx consider + the first argument as the type; thanks to Jakub Wilk for the report; + Closes: #608942 + * debian/patches/60_doc_output_format.patch + - obtain the documentation output format even if the value is a unicode (as + returned by recent sphinx); thanks to Jakub Wilk for the tip on IRC - -- Andreas Wenning Fri, 25 Jun 2010 12:53:04 +0000 + -- Sandro Tosi Tue, 25 Jan 2011 18:17:56 +0100 matplotlib (0.99.3-1) unstable; urgency=low @@ -42,14 +52,6 @@ -- Sandro Tosi Tue, 22 Jun 2010 00:32:30 +0200 -matplotlib (0.99.1.2-3ubuntu1) lucid; urgency=low - - * Merge from Debian unstable, remaining changes: - - Drop python-qt-dev from build-depends and python-qt3 from - python-matplotlib suggests to support python-qt3 removal. - - -- Benjamin Drung Sat, 06 Feb 2010 18:38:21 +0100 - matplotlib (0.99.1.2-3) unstable; urgency=low [ Sandro Tosi ] @@ -67,22 +69,6 @@ -- Benjamin Drung Sat, 06 Feb 2010 09:34:01 +0100 -matplotlib (0.99.1.2-2ubuntu2) lucid; urgency=low - - * Drop python-qt-dev from build-depends and python-qt3 from - python-matplotlib suggests to support python-qt3 removal - - Update README.debian - - -- Scott Kitterman Tue, 26 Jan 2010 15:29:44 -0500 - -matplotlib (0.99.1.2-2ubuntu1) lucid; urgency=low - - * Merge from Debian unstable, remaining changes: - - Explicitly depend on python-tk as workaround for LP #301007; drop these - changes if an auto backend discovery is implemented by upstream. - - -- Benjamin Drung Mon, 28 Dec 2009 16:22:14 +0100 - matplotlib (0.99.1.2-2) unstable; urgency=low * Build depend on texlive-latex-recommended instead of latex-ucs to fix FTBFS @@ -94,14 +80,6 @@ -- Benjamin Drung Mon, 28 Dec 2009 15:57:32 +0100 -matplotlib (0.99.1.2-1ubuntu1) lucid; urgency=low - - * Merge from Debian unstable, remaining changes: - - Explicitly depend on python-tk as workaround for LP #301007; drop these - changes if an auto backend discovery is implemented by upstream. - - -- Benjamin Drung Sun, 15 Nov 2009 23:29:52 +0100 - matplotlib (0.99.1.2-1) unstable; urgency=low * New upstream release. @@ -111,14 +89,6 @@ -- Benjamin Drung Sun, 15 Nov 2009 22:17:31 +0100 -matplotlib (0.99.1.1-1ubuntu1) lucid; urgency=low - - * Merge from Debian unstable, remaining changes: - - Explicitly depend on python-tk as workaround for LP #301007; drop these - changes if an auto backend discovery is implemented by upstream. - - -- Benjamin Drung Sat, 14 Nov 2009 22:15:45 +0100 - matplotlib (0.99.1.1-1) unstable; urgency=low [ Sandro Tosi ] @@ -151,14 +121,6 @@ -- Benjamin Drung Sun, 08 Nov 2009 21:58:23 +0100 -matplotlib (0.99.0-1ubuntu1) karmic; urgency=low - - * Merge from Debian unstable (LP: #419885), remaining changes: - - Explicitly depend on python-tk as workaround for LP #301007; drop these - changes if an auto backend discovery is implemented by upstream. - - -- Benjamin Drung Fri, 18 Sep 2009 10:13:37 +0200 - matplotlib (0.99.0-1) unstable; urgency=low * New upstream release @@ -178,15 +140,6 @@ -- Sandro Tosi Wed, 15 Jul 2009 10:16:45 +0200 -matplotlib (0.98.5.3-1ubuntu1) karmic; urgency=low - - * Merge from Debian unstable (LP: #382467), remaining changes: - - Build with tcl/tk8.5 as python-tk was build with tcl/tk8.5. - * debian/control: Explicitly depend on python-tk as workaround for LP #301007; - drop these changes if an auto backend discovery is implemented by upstream. - - -- Benjamin Drung Mon, 01 Jun 2009 18:22:43 +0200 - matplotlib (0.98.5.3-1) unstable; urgency=low [ Benjamin Drung ] @@ -231,28 +184,6 @@ -- Sandro Tosi Fri, 29 May 2009 08:40:48 +0200 -matplotlib (0.98.5.2-1ubuntu3) jaunty; urgency=low - - * Install egg-info files and add python-setuptools to build depends; thanks to - Gediminas Paulauskas (LP: #298138). - * debian/control: Build depends on python-qt4 - - -- Benjamin Drung Wed, 25 Mar 2009 18:56:31 +0100 - -matplotlib (0.98.5.2-1ubuntu2) jaunty; urgency=low - - * Really build with tcl/tk8.5 as python-tk was build with tcl/tk8.5 - (LP: #337469). - - -- Andrew Straw Sat, 21 Mar 2009 14:55:09 -0700 - -matplotlib (0.98.5.2-1ubuntu1) jaunty; urgency=low - - * Python 2.6 transition (lp: #336234) - * Build with tcl/tk8.5 as python-tk was build with tcl/tk8.5. - - -- Michael Bienia Sun, 01 Mar 2009 18:30:05 +0100 - matplotlib (0.98.5.2-1) experimental; urgency=low [ Benjamin Drung ] @@ -634,7 +565,7 @@ * Depend on python-tz, remove the pytz files. Closes: #376715. -- Matthias Klose Fri, 7 Jul 2006 18:38:43 +0000 - + matplotlib (0.86.2-6) unstable; urgency=low * Added a note about numeric/numarray deps in README.debian. Closes: #376198 diff -Nru matplotlib-0.99.3/debian/control matplotlib-1.0.1/debian/control --- matplotlib-0.99.3/debian/control 2011-04-04 19:23:52.000000000 +0000 +++ matplotlib-1.0.1/debian/control 2011-01-17 19:14:00.000000000 +0000 @@ -1,11 +1,9 @@ Source: matplotlib Section: python Priority: optional -Maintainer: Ubuntu Developers -XSBC-Original-Maintainer: Debian Python Modules Team +Maintainer: Debian Python Modules Team Uploaders: Alexandre Fayolle , - Sandro Tosi , - Benjamin Drung + Sandro Tosi Build-Depends: debhelper (>= 7), dvipng, graphviz, @@ -23,6 +21,7 @@ python-numpy (>= 1:1.3.0), python-numpy-dbg (>= 1:1.3.0), python-pkg-resources, + python-qt-dev, python-qt4, python-qt4-dev, python-setuptools, @@ -33,6 +32,7 @@ python-tz, python-wxgtk2.8, python-wxgtk2.8-dbg, + python-xlwt, tcl8.5-dev, texlive-fonts-recommended, texlive-latex-extra, @@ -40,8 +40,7 @@ tk8.5-dev, zlib1g-dev XS-Python-Version: all -Standards-Version: 3.8.4 -XS-DM-Upload-Allowed: yes +Standards-Version: 3.9.1 Homepage: http://matplotlib.sf.net/ Vcs-Svn: svn://svn.debian.org/svn/python-modules/packages/matplotlib/trunk/ Vcs-Browser: http://svn.debian.org/viewsvn/python-modules/packages/matplotlib/trunk/ @@ -59,8 +58,7 @@ ${misc:Depends}, ${python:Depends}, ${shlibs:Depends} -Recommends: python-glade2, - python-tk (>= 2.5.2-1.1) +Recommends: python-glade2, python-tk (>= 2.5.2-1.1) Provides: ${python:Provides} Conflicts: python2.4-matplotlib Replaces: python2.4-matplotlib @@ -70,14 +68,15 @@ librsvg2-common, python-configobj, python-excelerator, + python-gtk2, python-matplotlib-doc, + python-qt3, + python-qt4, python-scipy, python-traits (>= 2.0), - texlive-extra-utils, - texlive-latex-extra, - python-gtk2, python-wxgtk2.8, - python-qt4 + texlive-extra-utils, + texlive-latex-extra Description: Python based plotting system in a style similar to Matlab Matplotlib is a pure Python plotting library designed to bring publication quality plotting to Python with a syntax familiar to diff -Nru matplotlib-0.99.3/debian/copyright matplotlib-1.0.1/debian/copyright --- matplotlib-0.99.3/debian/copyright 2011-04-04 19:23:52.000000000 +0000 +++ matplotlib-1.0.1/debian/copyright 2011-01-12 22:28:17.000000000 +0000 @@ -71,7 +71,7 @@ The Debian packaging is: - Copyright (C) 2008-2009 Sandro Tosi + Copyright (C) 2008-2011 Sandro Tosi and is licensed under the same terms as upstream code. @@ -399,7 +399,7 @@ ** There are many things in this file you may want to change. This file ** should be the first include file. It is the header file for the whole ** project. - ** + ** ** This file was last modified 22 December 1995. */ diff -Nru matplotlib-0.99.3/debian/patches/10_build_fix.patch matplotlib-1.0.1/debian/patches/10_build_fix.patch --- matplotlib-0.99.3/debian/patches/10_build_fix.patch 2011-04-04 19:23:52.000000000 +0000 +++ matplotlib-1.0.1/debian/patches/10_build_fix.patch 2011-01-02 19:44:05.000000000 +0000 @@ -3,11 +3,11 @@ Author: Sandro Tosi Last-Update: 2010-02-06 -Index: matplotlib-0.99.3/setupext.py +Index: matplotlib-1.0~rc1/setupext.py =================================================================== ---- matplotlib-0.99.3.orig/setupext.py 2010-03-09 15:20:20.000000000 +0100 -+++ matplotlib-0.99.3/setupext.py 2010-06-12 10:01:18.165019669 +0200 -@@ -47,12 +47,12 @@ +--- matplotlib-1.0~rc1.orig/setupext.py 2010-06-07 15:11:57.000000000 +0200 ++++ matplotlib-1.0~rc1/setupext.py 2010-06-30 20:05:25.676158843 +0200 +@@ -49,12 +49,12 @@ basedir = { 'win32' : ['win32_static',], @@ -26,7 +26,7 @@ 'cygwin' : ['/usr/local', '/usr',], '_darwin' : ['/sw/lib/freetype2', '/sw/lib/freetype219', '/usr/local', '/usr', '/sw'], -@@ -67,11 +67,12 @@ +@@ -69,10 +69,10 @@ 'freebsd5' : ['/usr/local', '/usr'], 'freebsd6' : ['/usr/local', '/usr'], 'sunos5' : [os.getenv('MPLIB_BASE') or '/usr/local',], @@ -38,8 +38,6 @@ + 'gnukfreebsd6' : ['/usr'], + 'gnukfreebsd7' : ['/usr'], + 'gnukfreebsd8' : ['/usr'], + 'gnu0' : ['/usr'], 'aix5' : ['/usr/local'], -+ 'gnu0' : ['/usr'], } - - import sys, os, stat diff -Nru matplotlib-0.99.3/debian/patches/20_matplotlibrc_path_search_fix.patch matplotlib-1.0.1/debian/patches/20_matplotlibrc_path_search_fix.patch --- matplotlib-0.99.3/debian/patches/20_matplotlibrc_path_search_fix.patch 2011-04-04 19:23:52.000000000 +0000 +++ matplotlib-1.0.1/debian/patches/20_matplotlibrc_path_search_fix.patch 2011-01-02 19:44:05.000000000 +0000 @@ -2,23 +2,25 @@ Forwarded: not-needed Author: Sandro Tosi ---- matplotlib-0.98.3.orig/lib/matplotlib/__init__.py 2008-08-22 11:52:37.253904720 +0200 -+++ matplotlib-0.98.3/lib/matplotlib/__init__.py 2008-08-22 11:52:42.250189441 +0200 -@@ -453,9 +453,11 @@ +Index: matplotlib-1.0~rc1/lib/matplotlib/__init__.py +=================================================================== +--- matplotlib-1.0~rc1.orig/lib/matplotlib/__init__.py 2010-06-29 15:30:11.000000000 +0200 ++++ matplotlib-1.0~rc1/lib/matplotlib/__init__.py 2010-07-01 18:48:46.494542076 +0200 +@@ -489,10 +489,12 @@ raise RuntimeError('Path in environment MATPLOTLIBDATA not a directory') return path - path = os.sep.join([os.path.dirname(__file__), 'mpl-data']) + path = '/usr/share/matplotlib/mpl-data' - if os.path.isdir(path): return path -- -+ + if os.path.isdir(path): + return path + + raise RuntimeError('Could not find the matplotlib data files') -+ ++ # setuptools' namespace_packages may highjack this init file # so need to try something known to be in matplotlib, not basemap import matplotlib.afm -@@ -566,7 +568,7 @@ +@@ -600,7 +602,7 @@ if os.path.exists(fname): return fname diff -Nru matplotlib-0.99.3/debian/patches/30_disable_sample_downloads.patch matplotlib-1.0.1/debian/patches/30_disable_sample_downloads.patch --- matplotlib-0.99.3/debian/patches/30_disable_sample_downloads.patch 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/debian/patches/30_disable_sample_downloads.patch 2011-01-10 23:35:24.000000000 +0000 @@ -0,0 +1,15 @@ +Description: disable download of sample data (used to run examples) +Author: Benjamin Gamari + +Index: matplotlib-1.0.1/matplotlibrc.template +=================================================================== +--- matplotlib-1.0.1.orig/matplotlibrc.template 2011-01-01 21:49:44.000000000 -0500 ++++ matplotlib-1.0.1/matplotlibrc.template 2011-01-01 22:13:35.720384573 -0500 +@@ -377,5 +377,5 @@ + # where you have a checkout of + # https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/trunk/sample_data + +-#examples.download : True # False to bypass downloading mechanism +-#examples.directory : '' # directory to look in if download is false ++examples.download : False # False to bypass downloading mechanism ++examples.directory : '/usr/share/matplotlib/sampledata' # absolute directory to look in if download is false diff -Nru matplotlib-0.99.3/debian/patches/30_doc_pass_dpi.patch matplotlib-1.0.1/debian/patches/30_doc_pass_dpi.patch --- matplotlib-0.99.3/debian/patches/30_doc_pass_dpi.patch 2011-04-04 19:23:52.000000000 +0000 +++ matplotlib-1.0.1/debian/patches/30_doc_pass_dpi.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,16 +0,0 @@ -Description: Pass DPI, along with format, in plot format configuration -Forwarded: yes -Author: Sandro Tosi - -diff -urNad matplotlib~/doc/make.py matplotlib/doc/make.py ---- matplotlib~/doc/make.py 2009-08-01 21:14:12.000000000 +0200 -+++ matplotlib/doc/make.py 2009-10-09 08:56:04.000000000 +0200 -@@ -30,7 +30,7 @@ - check_build() - shutil.copy('../lib/matplotlib/mpl-data/matplotlibrc', '_static/matplotlibrc') - if small_docs: -- options = "-D plot_formats=\"['png']\"" -+ options = "-D plot_formats=\"[('png', 80)]\"" - else: - options = '' - if os.system('sphinx-build %s -P -b html -d build/doctrees . build/html' % options): diff -Nru matplotlib-0.99.3/debian/patches/40_bts608939_draw_markers_description.patch matplotlib-1.0.1/debian/patches/40_bts608939_draw_markers_description.patch --- matplotlib-0.99.3/debian/patches/40_bts608939_draw_markers_description.patch 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/debian/patches/40_bts608939_draw_markers_description.patch 2011-01-12 22:57:01.000000000 +0000 @@ -0,0 +1,16 @@ +Description: minor glitch in draw_markers() description +Author: Jakub Wilk + +Index: matplotlib-1.0.1/doc/api/api_changes.rst +=================================================================== +--- matplotlib-1.0.1.orig/doc/api/api_changes.rst 2011-01-12 23:54:37.130685365 +0100 ++++ matplotlib-1.0.1/doc/api/api_changes.rst 2011-01-12 23:54:54.886682489 +0100 +@@ -540,7 +540,7 @@ + + * :meth:`draw_markers(self, gc, marker_path, marker_trans, path, + trans, rgbFace) +- ` + + * :meth:`draw_path_collection(self, master_transform, cliprect, + clippath, clippath_trans, paths, all_transforms, offsets, diff -Nru matplotlib-0.99.3/debian/patches/40_UnicodeEncodeError.patch matplotlib-1.0.1/debian/patches/40_UnicodeEncodeError.patch --- matplotlib-0.99.3/debian/patches/40_UnicodeEncodeError.patch 2011-04-04 19:24:26.000000000 +0000 +++ matplotlib-1.0.1/debian/patches/40_UnicodeEncodeError.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,39 +0,0 @@ -From: Artur Rona -Description: Remove unicode from docstrings, since it doesn't play well with __builtin__.help(). -Bug: http://sourceforge.net/support/tracker.php?aid=3129438 -Bug-Ubuntu: https://launchpad.net/bugs/685710 -Origin: upstream, http://matplotlib.svn.sourceforge.net/viewvc/matplotlib?view=revision&sortby=rev&revision=8818 -Author: Mike Droettboom - -Index: lib/matplotlib/projections/polar.py -=================================================================== ---- a/lib/matplotlib/projections/polar.py (revision 8816) -+++ b/lib/matplotlib/projections/polar.py (working copy) -@@ -88,10 +88,10 @@ - that maximum radius rests on the edge of the axes circle. - """ - def __init__(self, scale_transform, limits): -- u""" -+ """ - *limits* is the view limit of the data. The only part of - its bounds that is used is ymax (for the radius maximum). -- The theta range is always fixed to (0, 2\u03c0). -+ The theta range is always fixed to (0, 2pi). - """ - Affine2DBase.__init__(self) - self._scale_transform = scale_transform -@@ -141,11 +141,10 @@ - inverted.__doc__ = Transform.inverted.__doc__ - - class ThetaFormatter(Formatter): -- u""" -- Used to format the *theta* tick labels. Converts the -- native unit of radians into degrees and adds a degree symbol -- (\u00b0). - """ -+ Used to format the *theta* tick labels. Converts the native -+ unit of radians into degrees and adds a degree symbol. -+ """ - def __call__(self, x, pos=None): - # \u00b0 : degree symbol - if rcParams['text.usetex'] and not rcParams['text.latex.unicode']: diff -Nru matplotlib-0.99.3/debian/patches/50_bts608942_spaces_in_param_args.patch matplotlib-1.0.1/debian/patches/50_bts608942_spaces_in_param_args.patch --- matplotlib-0.99.3/debian/patches/50_bts608942_spaces_in_param_args.patch 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/debian/patches/50_bts608942_spaces_in_param_args.patch 2011-01-13 20:49:06.000000000 +0000 @@ -0,0 +1,51 @@ +Description: don't separate param and its argument with a space + +Index: matplotlib-1.0.1/lib/mpl_toolkits/axes_grid1/axes_divider.py +=================================================================== +--- matplotlib-1.0.1.orig/lib/mpl_toolkits/axes_grid1/axes_divider.py 2011-01-13 19:25:40.413682190 +0100 ++++ matplotlib-1.0.1/lib/mpl_toolkits/axes_grid1/axes_divider.py 2011-01-13 18:59:00.990682216 +0100 +@@ -172,12 +172,12 @@ + def locate(self, nx, ny, nx1=None, ny1=None, renderer=None): + """ + +- :param nx, nx1: Integers specifying the column-position of the ++ :param nx,nx1: Integers specifying the column-position of the + cell. When nx1 is None, a single nx-th column is + specified. Otherwise location of columns spanning between nx + to nx1 (but excluding nx1-th column) is specified. + +- :param ny, ny1: same as nx and nx1, but for row positions. ++ :param ny,ny1: same as nx and nx1, but for row positions. + """ + + +@@ -222,12 +222,12 @@ + (:class:`mpl_toolkits.axes_grid.axes_divider.AxesLocator`) for + specified cell. + +- :param nx, nx1: Integers specifying the column-position of the ++ :param nx,nx1: Integers specifying the column-position of the + cell. When nx1 is None, a single nx-th column is + specified. Otherwise location of columns spanning between nx + to nx1 (but excluding nx1-th column) is specified. + +- :param ny, ny1: same as nx and nx1, but for row positions. ++ :param ny,ny1: same as nx and nx1, but for row positions. + """ + return AxesLocator(self, nx, ny, nx1, ny1) + +@@ -242,12 +242,12 @@ + """ + :param axes_divider: An instance of AxesDivider class. + +- :param nx, nx1: Integers specifying the column-position of the ++ :param nx,nx1: Integers specifying the column-position of the + cell. When nx1 is None, a single nx-th column is + specified. Otherwise location of columns spanning between nx + to nx1 (but excluding nx1-th column) is is specified. + +- :param ny, ny1: same as nx and nx1, but for row positions. ++ :param ny,ny1: same as nx and nx1, but for row positions. + """ + self._axes_divider = axes_divider + diff -Nru matplotlib-0.99.3/debian/patches/60_doc_output_format.patch matplotlib-1.0.1/debian/patches/60_doc_output_format.patch --- matplotlib-0.99.3/debian/patches/60_doc_output_format.patch 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/debian/patches/60_doc_output_format.patch 2011-01-13 22:57:56.000000000 +0000 @@ -0,0 +1,15 @@ +Description: obtain output format information even if it's a unicode string + +Index: matplotlib-1.0.1/lib/matplotlib/sphinxext/plot_directive.py +=================================================================== +--- matplotlib-1.0.1.orig/lib/matplotlib/sphinxext/plot_directive.py 2011-01-06 14:48:13.000000000 +0100 ++++ matplotlib-1.0.1/lib/matplotlib/sphinxext/plot_directive.py 2011-01-13 23:50:58.838682411 +0100 +@@ -346,7 +346,7 @@ + del options['nofigs'] + + formats = setup.config.plot_formats +- if type(formats) == str: ++ if isinstance(formats, basestring): + formats = eval(formats) + + fname = os.path.basename(plot_path) diff -Nru matplotlib-0.99.3/debian/patches/70_search_new_tkdir.patch matplotlib-1.0.1/debian/patches/70_search_new_tkdir.patch --- matplotlib-0.99.3/debian/patches/70_search_new_tkdir.patch 2011-04-13 16:43:46.000000000 +0000 +++ matplotlib-1.0.1/debian/patches/70_search_new_tkdir.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,37 +0,0 @@ -Description: check new dir for tkConfig.sh -Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/matplotlib/+bug/752647 - -location changed in tk8.5 (8.5.9-2) -=== modified file 'setupext.py' ---- matplotlib-0.99.3/setupext.py 2010-06-25 12:53:04 +0000 -+++ matplotlib-0.99.3/setupext.py 2011-04-07 19:07:18 +0000 -@@ -876,14 +876,20 @@ - - def parse_tcl_config(tcl_lib_dir, tk_lib_dir): - # This is where they live on Ubuntu Hardy (at least) -- tcl_config = os.path.join(tcl_lib_dir, "tclConfig.sh") -- tk_config = os.path.join(tk_lib_dir, "tkConfig.sh") -- if not (os.path.exists(tcl_config) and os.path.exists(tk_config)): -- # This is where they live on RHEL4 (at least) -- tcl_config = "/usr/lib/tclConfig.sh" -- tk_config = "/usr/lib/tkConfig.sh" -- if not (os.path.exists(tcl_config) and os.path.exists(tk_config)): -- return None -+ import Tkinter -+ tcl_poss = [tcl_lib_dir, -+ "/usr/lib/tcl"+str(Tkinter.TclVersion), -+ "/usr/lib"] -+ tk_poss = [tk_lib_dir, -+ "/usr/lib/tk"+str(Tkinter.TkVersion), -+ "/usr/lib"] -+ for ptcl, ptk in zip(tcl_poss, tk_poss): -+ tcl_config = os.path.join(ptcl, "tclConfig.sh") -+ tk_config = os.path.join(ptk, "tkConfig.sh") -+ if (os.path.exists(tcl_config) and os.path.exists(tk_config)): -+ break -+ if not (os.path.exists(tcl_config) and os.path.exists(tk_config)): -+ return None - - # These files are shell scripts that set a bunch of - # environment variables. To actually get at the - diff -Nru matplotlib-0.99.3/debian/patches/series matplotlib-1.0.1/debian/patches/series --- matplotlib-0.99.3/debian/patches/series 2011-04-13 16:43:46.000000000 +0000 +++ matplotlib-1.0.1/debian/patches/series 2011-01-13 22:56:49.000000000 +0000 @@ -1,5 +1,6 @@ 10_build_fix.patch 20_matplotlibrc_path_search_fix.patch -30_doc_pass_dpi.patch -40_UnicodeEncodeError.patch -70_search_new_tkdir.patch +30_disable_sample_downloads.patch +40_bts608939_draw_markers_description.patch +50_bts608942_spaces_in_param_args.patch +60_doc_output_format.patch diff -Nru matplotlib-0.99.3/debian/python-matplotlib-data.install matplotlib-1.0.1/debian/python-matplotlib-data.install --- matplotlib-0.99.3/debian/python-matplotlib-data.install 2011-04-04 19:23:52.000000000 +0000 +++ matplotlib-1.0.1/debian/python-matplotlib-data.install 2011-01-11 00:28:14.000000000 +0000 @@ -1,6 +1,7 @@ +lib/matplotlib/backends/Matplotlib.nib /usr/share/matplotlib/ lib/matplotlib/mpl-data/fonts/ /usr/share/matplotlib/mpl-data/ lib/matplotlib/mpl-data/images/ /usr/share/matplotlib/mpl-data/ lib/matplotlib/mpl-data/lineprops.glade /usr/share/matplotlib/mpl-data/ lib/matplotlib/mpl-data/matplotlib.conf /usr/share/matplotlib lib/matplotlib/mpl-data/matplotlibrc /etc/ -lib/matplotlib/backends/Matplotlib.nib /usr/share/matplotlib/ +sampledata/ /usr/share/matplotlib/ diff -Nru matplotlib-0.99.3/debian/README.debian matplotlib-1.0.1/debian/README.debian --- matplotlib-0.99.3/debian/README.debian 2011-04-04 19:23:52.000000000 +0000 +++ matplotlib-1.0.1/debian/README.debian 2008-11-09 00:29:51.000000000 +0000 @@ -41,5 +41,5 @@ GTK+ -> python-gtk2 Tk -> python-tk - QT -> python-qt4 + QT -> python-qt3 or python-qt4 WX -> python-wxgtk2.6 or python-wxgtk2.8 diff -Nru matplotlib-0.99.3/debian/rules matplotlib-1.0.1/debian/rules --- matplotlib-0.99.3/debian/rules 2011-04-04 19:23:52.000000000 +0000 +++ matplotlib-1.0.1/debian/rules 2011-01-20 18:29:45.000000000 +0000 @@ -1,5 +1,7 @@ #!/usr/bin/make -f +export DH_VERBOSE=1 + PYVERS := $(shell pyversions -v -r debian/control) DEFPY := $(shell pyversions -v -d) PY_PLATFORM := $(shell python -c 'from distutils.util import get_platform; print get_platform()') @@ -15,6 +17,10 @@ build-indep-stamp: $(DEFPY:%=build-%-stamp) dh_testdir + # add information to use local copy of 'sampledata' and bypass downloading + echo "examples.download : False" >> $(CURDIR)/doc/matplotlibrc + echo "examples.directory : $(CURDIR)/sampledata" >> $(CURDIR)/doc/matplotlibrc + # build the doc -( cd doc ; MATPLOTLIBDATA=../lib/matplotlib/mpl-data/ \ PYTHONPATH=../build/lib.$(PY_PLATFORM)-$(DEFPY) ./make.py --small all ) @@ -30,6 +36,13 @@ python$* ./setup.py build $(PY_BUILD_FLAGS) python$*-dbg ./setup.py build $(PY_BUILD_FLAGS) +#ifeq (,$(findstring notest,$(DEB_BUILD_OPTIONS))) +# LIB=$$(python$$* -c "from distutils.command.build import build ; from distutils.core import Distribution ; b = build(Distribution()) ; b.finalize_options() ; print b.build_purelib") +# PYTHONPATH=$$LIB python$* -c "import matplotlib as m ; m.test(verbosity=1)" +# LIB=$$(python$$*-dbg -c "from distutils.command.build import build ; from distutils.core import Distribution ; b = build(Distribution()) ; b.finalize_options() ; print b.build_purelib") +# PYTHONPATH=$$LIB python$*-dbg -c "import matplotlib as m ; m.test(verbosity=1)" +#endif + touch $@ @@ -44,7 +57,7 @@ done # clean the doc - ( cd doc ; ./make.py clean ) + -( cd doc ; ./make.py clean ) # workaround for cleaning the doc ("doc/make.py clean" only runs useless svn-clean) rm -rf doc/build doc/examples @@ -63,6 +76,8 @@ rm -rf build rm -rf lib/matplotlib.egg-info + # restore "pristine" doc/matplotlibrc + sed -i '/^examples\./d' $(CURDIR)/doc/matplotlibrc # install install-arch: build-arch $(PYVERS:%=install-%-stamp) @@ -114,7 +129,7 @@ dh_installchangelogs -i CHANGELOG dh_installdocs -p$(pd) -i doc/build/html/ doc/build/latex/Matplotlib.pdf dh_installexamples -p$(pd) -i examples/* - dh_compress -i -Xexamples -Xexamples/data -Xpdf -X.js + dh_compress -i -Xexamples -Xexamples/data -Xpdf -X.js -Xobjects.inv ln -sf /usr/share/javascript/jquery/jquery.js \ $(CURDIR)/debian/$(pd)/usr/share/doc/python-matplotlib-doc/html/_static/jquery.js dh_link -i diff -Nru matplotlib-0.99.3/doc/api/api_changes.rst matplotlib-1.0.1/doc/api/api_changes.rst --- matplotlib-0.99.3/doc/api/api_changes.rst 2009-08-22 21:06:12.000000000 +0000 +++ matplotlib-1.0.1/doc/api/api_changes.rst 2010-08-03 14:22:39.000000000 +0000 @@ -7,7 +7,68 @@ outward-facing API. If updating matplotlib breaks your scripts, this list may help describe what changes may be necessary in your code. -* You can now print several figures to one pdf file. See the docstrings +Changes beyond 0.99.x +===================== + +* The default behavior of :meth:`matplotlib.axes.Axes.set_xlim`, + :meth:`matplotlib.axes.Axes.set_ylim`, and + :meth:`matplotlib.axes.Axes.axis`, and their corresponding + pyplot functions, has been changed: when view limits are + set explicitly with one of these methods, autoscaling is turned + off for the matching axis. A new *auto* kwarg is available to + control this behavior. The limit kwargs have been renamed to + *left* and *right* instead of *xmin* and *xmax*, and *bottom* + and *top* instead of *ymin* and *ymax*. The old names may still + be used, however. + +* There are five new Axes methods with corresponding pyplot + functions to facilitate autoscaling, tick location, and tick + label formatting, and the general appearance of ticks and + tick labels: + + + :meth:`matplotlib.axes.Axes.autoscale` turns autoscaling + on or off, and applies it. + + + :meth:`matplotlib.axes.Axes.margins` sets margins used to + autoscale the :attr:`matplotlib.axes.Axes.viewLim` based on + the :attr:`matplotlib.axes.Axes.dataLim`. + + + :meth:`matplotlib.axes.Axes.locator_params` allows one to + adjust axes locator parameters such as *nbins*. + + + :meth:`matplotlib.axes.Axes.ticklabel_format` is a convenience + method for controlling the :class:`matplotlib.ticker.ScalarFormatter` + that is used by default with linear axes. + + + :meth:`matplotlib.axes.Axes.tick_params` controls direction, size, + visibility, and color of ticks and their labels. + +* The :meth:`matplotlib.axes.Axes.bar` method accepts a *error_kw* + kwarg; it is a dictionary of kwargs to be passed to the + errorbar function. + +* The :meth:`matplotlib.axes.Axes.hist` *color* kwarg now accepts + a sequence of color specs to match a sequence of datasets. + +* The :class:'~matplotlib.collections.EllipseCollection' has been + changed in two ways: + + + There is a new *units* option, 'xy', that scales the ellipse with + the data units. This matches the :class:'~matplotlib.patches.Ellipse` + scaling. + + + The *height* and *width* kwargs have been changed to specify + the height and width, again for consistency with + :class:`~matplotlib.patches.Ellipse`, and to better match + their names; previously they specified the half-height and + half-width. + +* There is a new rc parameter ``axes.color_cycle``, and the color + cycle is now independent of the rc parameter ``lines.color``. + :func:`matplotlib.Axes.set_default_color_cycle` is deprecated. + +* You can now print several figures to one pdf file and modify the + document information dictionary of a pdf file. See the docstrings of the class :class:`matplotlib.backends.backend_pdf.PdfPages` for more information. @@ -18,6 +79,59 @@ .. _configobj: http://www.voidspace.org.uk/python/configobj.html .. _`enthought.traits`: http://code.enthought.com/projects/traits +* The new rc parameter ``savefig.extension`` sets the filename extension + that is used by :meth:`matplotlib.figure.Figure.savefig` if its *fname* + argument lacks an extension. + +* In an effort to simplify the backend API, all clipping rectangles + and paths are now passed in using GraphicsContext objects, even + on collections and images. Therefore:: + + draw_path_collection(self, master_transform, cliprect, clippath, + clippath_trans, paths, all_transforms, offsets, + offsetTrans, facecolors, edgecolors, linewidths, + linestyles, antialiaseds, urls) + + # is now + + draw_path_collection(self, gc, master_transform, paths, all_transforms, + offsets, offsetTrans, facecolors, edgecolors, + linewidths, linestyles, antialiaseds, urls) + + + draw_quad_mesh(self, master_transform, cliprect, clippath, + clippath_trans, meshWidth, meshHeight, coordinates, + offsets, offsetTrans, facecolors, antialiased, + showedges) + + # is now + + draw_quad_mesh(self, gc, master_transform, meshWidth, meshHeight, + coordinates, offsets, offsetTrans, facecolors, + antialiased, showedges) + + + draw_image(self, x, y, im, bbox, clippath=None, clippath_trans=None) + + # is now + + draw_image(self, gc, x, y, im) + +* There are four new Axes methods with corresponding pyplot + functions that deal with unstructured triangular grids: + + + :meth:`matplotlib.axes.Axes.tricontour` draws contour lines + on a triangular grid. + + + :meth:`matplotlib.axes.Axes.tricontourf` draws filled contours + on a triangular grid. + + + :meth:`matplotlib.axes.Axes.tripcolor` draws a pseudocolor + plot on a triangular grid. + + + :meth:`matplotlib.axes.Axes.triplot` draws a triangular grid + as lines and/or markers. + Changes in 0.99 ====================== @@ -98,7 +212,7 @@ to scale one-sided densities by a factor of 2. Also, optionally scale the densities by the sampling frequency, which gives true values of densities that can be integrated by the returned frequency values. - This also gives better MatLab compatibility. The corresponding + This also gives better MATLAB compatibility. The corresponding :class:`matplotlib.axes.Axes` methods and :mod:`matplotlib.pyplot` functions were updated as well. @@ -1013,7 +1127,7 @@ - pylab figure now defaults to num=None, which creates a new figure with a guaranteed unique number - - contour method syntax changed - now it is matlab compatible + - contour method syntax changed - now it is MATLAB compatible unchanged: contour(Z) old: contour(Z, x=Y, y=Y) @@ -1102,7 +1216,7 @@ :: - mpl_connect and mpl_disconnect in the matlab interface renamed to + mpl_connect and mpl_disconnect in the MATLAB interface renamed to connect and disconnect Did away with the text methods for angle since they were ambiguous. @@ -1191,7 +1305,7 @@ Changes for 0.54 ================ -matlab interface +MATLAB interface ---------------- dpi @@ -1208,7 +1322,7 @@ pcolor and scatter ~~~~~~~~~~~~~~~~~~ -There are two changes to the matlab interface API, both involving the +There are two changes to the MATLAB interface API, both involving the patch drawing commands. For efficiency, pcolor and scatter have been rewritten to use polygon collections, which are a new set of objects from matplotlib.collections designed to enable efficient handling of @@ -1242,7 +1356,7 @@ for a discussion on how to set the properties as a sequence. For scatter, the size argument is now in points^2 (the area of the -symbol in points) as in matlab and is not in data coords as before. +symbol in points) as in MATLAB and is not in data coords as before. Using sizes in data coords caused several problems. So you will need to adjust your size arguments accordingly or use scatter_classic. @@ -1410,7 +1524,7 @@ * backends must implement FigureCanvasBackend (the thing that controls the figure and handles the events if any) and - FigureManagerBackend (wraps the canvas and the window for matlab + FigureManagerBackend (wraps the canvas and the window for MATLAB interface). FigureCanvasBase implements a backend switching mechanism @@ -1433,9 +1547,9 @@ Migrating code: - Matlab interface: + MATLAB interface: - The only API change for those using the matlab interface is in how + The only API change for those using the MATLAB interface is in how you call figure redraws for dynamically updating figures. In the old API, you did @@ -1572,7 +1686,7 @@ - new module transforms supplies Bound1D, Bound2D and Transform instances and more - - Changes to the matlab helpers API + - Changes to the MATLAB helpers API * _matlab_helpers.GcfBase is renamed by Gcf. Backends no longer need to derive from this class. Instead, they provide a factory diff -Nru matplotlib-0.99.3/doc/api/backend_pdf_api.rst matplotlib-1.0.1/doc/api/backend_pdf_api.rst --- matplotlib-0.99.3/doc/api/backend_pdf_api.rst 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/api/backend_pdf_api.rst 2010-07-07 01:41:46.000000000 +0000 @@ -0,0 +1,7 @@ + +:mod:`matplotlib.backends.backend_pdf` +====================================== + +.. automodule:: matplotlib.backends.backend_pdf + :members: + :show-inheritance: diff -Nru matplotlib-0.99.3/doc/api/gridspec_api.rst matplotlib-1.0.1/doc/api/gridspec_api.rst --- matplotlib-0.99.3/doc/api/gridspec_api.rst 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/api/gridspec_api.rst 2011-01-05 23:10:31.000000000 +0000 @@ -0,0 +1,12 @@ +******************* +matplotlib gridspec +******************* + + +:mod:`matplotlib.gridspec` +==================== + +.. automodule:: matplotlib.gridspec + :members: + :undoc-members: + :show-inheritance: diff -Nru matplotlib-0.99.3/doc/api/index_backend_api.rst matplotlib-1.0.1/doc/api/index_backend_api.rst --- matplotlib-0.99.3/doc/api/index_backend_api.rst 2009-07-31 15:14:27.000000000 +0000 +++ matplotlib-1.0.1/doc/api/index_backend_api.rst 2010-07-07 01:41:46.000000000 +0000 @@ -8,5 +8,6 @@ backend_gtkagg_api.rst backend_qt4agg_api.rst backend_wxagg_api.rst + backend_pdf_api.rst dviread.rst type1font.rst diff -Nru matplotlib-0.99.3/doc/api/index.rst matplotlib-1.0.1/doc/api/index.rst --- matplotlib-0.99.3/doc/api/index.rst 2009-07-31 15:14:27.000000000 +0000 +++ matplotlib-1.0.1/doc/api/index.rst 2010-07-07 01:41:46.000000000 +0000 @@ -25,11 +25,13 @@ dates_api.rst figure_api.rst font_manager_api.rst - nxutils_api.rst + gridspec_api.rst mathtext_api.rst mlab_api.rst path_api.rst pyplot_api.rst + nxutils_api.rst spine_api.rst ticker_api.rst + units_api.rst index_backend_api.rst diff -Nru matplotlib-0.99.3/doc/api/units_api.rst matplotlib-1.0.1/doc/api/units_api.rst --- matplotlib-0.99.3/doc/api/units_api.rst 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/api/units_api.rst 2010-07-07 01:41:46.000000000 +0000 @@ -0,0 +1,12 @@ +***************** +matplotlib units +***************** + + +:mod:`matplotlib.units` +======================== + +.. automodule:: matplotlib.units + :members: + :undoc-members: + :show-inheritance: diff -Nru matplotlib-0.99.3/doc/conf.py matplotlib-1.0.1/doc/conf.py --- matplotlib-0.99.3/doc/conf.py 2009-07-31 15:14:32.000000000 +0000 +++ matplotlib-1.0.1/doc/conf.py 2010-07-07 01:41:47.000000000 +0000 @@ -18,10 +18,6 @@ # absolute, like shown here. sys.path.append(os.path.abspath('sphinxext')) -# Import support for ipython console session syntax highlighting (lives -# in the sphinxext directory defined above) -import ipython_console_highlighting - # General configuration # --------------------- @@ -30,7 +26,8 @@ extensions = ['matplotlib.sphinxext.mathmpl', 'math_symbol_table', 'sphinx.ext.autodoc', 'matplotlib.sphinxext.only_directives', 'matplotlib.sphinxext.plot_directive', 'inheritance_diagram', - 'gen_gallery', 'gen_rst'] + 'gen_gallery', 'gen_rst', + 'matplotlib.sphinxext.ipython_console_highlighting'] # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] @@ -80,7 +77,7 @@ # Plot directive configuration # ---------------------------- -plot_formats = ['png', 'hires.png', 'pdf'] +plot_formats = [('png', 80), ('hires.png', 200), ('pdf', 50)] # Options for HTML output # ----------------------- diff -Nru matplotlib-0.99.3/doc/devel/coding_guide.rst matplotlib-1.0.1/doc/devel/coding_guide.rst --- matplotlib-0.99.3/doc/devel/coding_guide.rst 2010-03-09 14:20:18.000000000 +0000 +++ matplotlib-1.0.1/doc/devel/coding_guide.rst 2010-07-07 01:41:46.000000000 +0000 @@ -24,9 +24,11 @@ svn co https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/trunk/\ matplotlib mpl --username=youruser --password=yourpass -Branch checkouts, eg the release branch:: +Branch checkouts, eg the 1.0.x maintenance branch:: + + svn co https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/branches/\ + v1_0_maint mpl1 --username=youruser --password=yourpass - svn co https://matplotlib.svn.sf.net/svnroot/matplotlib/branches/v0_99_maint mpl99 Committing changes @@ -51,17 +53,18 @@ * Can you add a test to :file:`unit/nose_tests.py` to test your changes? * If you have altered extension code, do you pass - :file:`unit/memleak_hawaii.py`? + :file:`unit/memleak_hawaii3.py`? * if you have added new files or directories, or reorganized existing ones, are the new files included in the match patterns in :file:`MANIFEST.in`. This file determines what goes into the source distribution of the mpl build. -* Keep the release branch (eg 0.90 and trunk in sync where it makes - sense. If there is a bug on both that needs fixing, use - `svnmerge.py `_ to - keep them in sync. See :ref:`svn-merge` below. +* Keep the maintenance branch (0.91) the latest release branch (eg + 0.98.4) and trunk in sync where it makes sense. If there is a bug + on both that needs fixing, use `svnmerge.py + `_ to keep them in + sync. See :ref:`svn-merge` below. .. _svn-merge: @@ -89,7 +92,7 @@ svnmerge.py merge -S BRANCHNAME Where BRANCHNAME is the name of the branch to merge *from*, - e.g. v0_99_maint. + e.g. v1_0_maint. If you wish to merge only specific revisions (in an unusual situation), do:: @@ -123,17 +126,17 @@ with this. * Creating a new branch from the trunk (if the release version is - 0.98.5 at revision 6573):: + 1.0 at revision 8503):: > svn copy \ - https://matplotlib.svn.sf.net/svnroot/matplotlib/trunk/matplotlib@6573 \ - https://matplotlib.svn.sf.net/svnroot/matplotlib/branches/v0_98_5_maint \ - -m "Creating maintenance branch for 0.98.5" + https://matplotlib.svn.sf.net/svnroot/matplotlib/trunk/matplotlib@8503 \ + https://matplotlib.svn.sf.net/svnroot/matplotlib/branches/v1_0_maint \ + -m "Creating maintenance branch for 1.0" * You can add a new branch for the trunk to "track" using "svnmerge.py init", e.g., from a working copy of the trunk:: - > svnmerge.py init https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/branches/v0_98_5_maint + > svnmerge.py init https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/branches/v1_0_maint property 'svnmerge-integrated' set on '.' After doing a "svn commit" on this, this merge tracking is available @@ -143,7 +146,7 @@ * Tracking can later be removed with the "svnmerge.py uninit" command, e.g.:: - > svnmerge.py -S v0_9_5_maint uninit + > svnmerge.py -S v1_0_maint uninit .. _using-git: @@ -159,36 +162,42 @@ ~~~~~~~~~~~~~~~~~~~~~~ There is an experimental `matplotlib github mirror`_ of the subversion -repository. To make a local clone of it in the directory ``mpl.git``, +repository. To make a local clone of it in the directory ``matplotlib``, enter the following commands:: - # This will create your copy in the mpl.git directory - git clone git://github.com/astraw/matplotlib.git mpl.git - cd mpl.git - git config --add remote.origin.fetch +refs/remotes/*:refs/remotes/* - git fetch - git svn init --branches=branches --trunk=trunk/matplotlib --tags=tags https://matplotlib.svn.sourceforge.net/svnroot/matplotlib + # Download the entire git repository into "matplotlib", name the source repository "svn". + git clone --origin svn git@github.com:astraw/matplotlib.git + + # Change into the newly created git repository. + cd matplotlib + + # Setup the subversion mirroring. + git svn init --trunk=trunk/matplotlib --prefix=svn/ https://matplotlib.svn.sourceforge.net/svnroot/matplotlib - # Now just get the latest svn revisions from the SourceForge SVN repository - git svn fetch -r 6800:HEAD + # Tell git svn to analyze the subversion history + git svn rebase -l .. _matplotlib github mirror: http://github.com/astraw/matplotlib To install from this cloned repository, use the commands in the :ref:`svn installation ` section:: - > cd mpl.git + > cd matplotlib > python setup.py install -Using git -~~~~~~~~~ +Note that it is not possible to interact with the matplotlib +maintenance branches through git due to different representations of +source code repositories in svnmerge and git. + +An example git workflow +~~~~~~~~~~~~~~~~~~~~~~~ The following is a suggested workflow for git/git-svn. Start with a virgin tree in sync with the svn trunk on the git branch -"master":: +"trunk":: - git checkout master + git checkout trunk git svn rebase To create a new, local branch called "whizbang-branch":: @@ -202,72 +211,78 @@ git commit -m "modified a bunch of files" # repeat this as necessary -Now, go back to the master branch and append the history of your branch -to the master branch, which will end up as the svn trunk:: +Now, go back to the trunk branch and append the history of your branch +to the git trunk branch, which will end up as the svn trunk:: - git checkout master + git checkout trunk git svn rebase # Ensure we have most recent svn - git rebase whizbang-branch # Append whizbang changes to master branch + git rebase whizbang-branch # Append whizbang changes to trunk branch git svn dcommit -n # Check that this will apply to svn git svn dcommit # Actually apply to svn Finally, you may want to continue working on your whizbang-branch, so -rebase it to the new master:: +rebase it to the new trunk:: git checkout whizbang-branch - git rebase master + git rebase trunk -If you get the dreaded "Unable to determine upstream SVN information -from working tree history" error when running "git svn rebase", try -creating a new git branch based on subversion trunk and cherry pick -your patches onto that:: +How was this git mirror set up? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - git checkout -b work remotes/trunk # create a new "work" branch - git cherry-pick # where will get applied to new branch +These are notes for those interested in mirroring a subversion +repository on github. I pieced this together by lots of +trial-and-error. -Working on a maintenance branch from git -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Step 1: Create a local mirror of the svn repository -The matplotlib maintenance branches are also available through git. -(Note that the ``git svn init`` line in the instructions above was -updated to make this possible. If you created your git mirror without -a ``--branches`` option, you will need to perform all of the steps -again in a new directory). +:: -You can see which branches are available with:: + rsync -avzP rsync://matplotlib.svn.sourceforge.net/svn/matplotlib/ matplotlib-svn-rsync/ - git branch -a +Step 2: Import the svn history into a new git repository -To switch your working copy to the 0.98.5 maintenance branch:: +:: - git checkout v0_98_5_maint + #!/bin/bash + set -e -Then you probably want to (as above) create a new local branch based -on that branch:: + TARGET=mpl.git.fixed + GIT=/home/astraw/git/bin/git + TRUNKBRANCH=trunk + SVNBRANCHPREFIX="svn/" - git checkout -b whizbang-branch + rm -rf $TARGET + mkdir $TARGET + cd $TARGET + + $GIT init + $GIT svn init --rewrite-root=https://matplotlib.svn.sourceforge.net/svnroot/matplotlib \ + --trunk=trunk/matplotlib --prefix=$SVNBRANCHPREFIX file:///mnt/workdisk/tmp/matplotlib-svn-rsync + $GIT svn fetch + + # now, make master branch track ${SVNBRANCHPREFIX}trunk + $GIT checkout master -b tmp + $GIT branch -d master + $GIT checkout ${SVNBRANCHPREFIX}trunk -b $TRUNKBRANCH + $GIT branch -D tmp + $GIT svn rebase -l + +Step 3: Upload the git repository to github + +:: -When you ``git svn dcommit`` from a maintenance branch, it will commit -to that branch, not to the trunk. + #!/bin/bash + set -e -While it should theoretically be possible to perform merges from a git -maintenance branch to a git trunk and then commit those changes back -to the SVN trunk, I have yet to find the magic incantation to make -that work. However, svnmerge as described `above `_ can be -used and in fact works quite well. - -A note about git write access -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The matplotlib developers need to figure out if there should be write -access to the git repository. This implies using the personal URL -(``git@github.com:astraw/matplotlib.git``) rather than the public URL -(``git://github.com/astraw/matplotlib.git``) for the -repository. However, doing so may make life complicated in the sense -that then there are two writeable matplotlib repositories, which must -be synced to prevent divergence. This is probably not an -insurmountable problem, but it is a problem that the developers should -reach a consensus about. Watch this space... + TARGET=mpl.git.fixed + GIT=/home/astraw/git/bin/git + TRUNKBRANCH=trunk + SVNBRANCHPREFIX="svn/" + + cd $TARGET + + $GIT remote add github git@github.com:astraw/matplotlib.git + git push github $TRUNKBRANCH:master .. _style-guide: @@ -554,8 +569,170 @@ +.. _sample-data: + +Writing examples +================ + +We have hundreds of examples in subdirectories of +file:`matplotlib/examples` in the trunk, and these are automatically +generated when the website it built to show up both in the `examples +`_ and `gallery +`_ sections of the +website. Many people find these examples from the website, and do not +have ready access to the file:`examples` directory in which they +reside. Thus any example data that is required for the example should +be provided through the sample_data svn directory, which can then be +accessed using :func:`matplotlib.cbook.get_sample_data`. First get a +copy of the repository and svn add your data:: + + svn co https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/trunk/sample_data + cp ~/path/to/mydata.dat sample_data/ + cd sample_data + svn add mydata.dat + svn commit -m 'added my data' + +and then in your example code you can load it into a file handle with:: + + import matplotlib.cbook as cbook + fh = cbook.get_sample_data('mydata.dat') + +The file will be fetched from the svn repo using urllib and updated +when the revision number changes. + + +If you prefer just to get the full path to the file instead of an file +object:: + + import matplotlib.cbook as cbook + datafile = cbook.get_sample_data('mydata.dat', asfileobj=False) + print 'datafile', datafile + + .. _license-discussion: + + +Testing +======= + +Matplotlib has a testing infrastructure based on nose_, making it easy +to write new tests. The tests are in :mod:`matplotlib.tests`, and +customizations to the nose testing infrastructure are in +:mod:`matplotlib.testing`. (There is other old testing cruft around, +please ignore it while we consolidate our testing to these locations.) + +.. _nose: http://somethingaboutorange.com/mrl/projects/nose/ + +Running the tests +----------------- + +Running the tests is simple. Make sure you have nose installed and +type from within Python:: + + import matplotlib + matplotlib.test() + +To run a single test from the command line, you can provide +a dot-separated path to the module and function, eg. +(this is assuming the test is installed):: + + nosetests matplotlib.tests.test_simplification:test_clipping + + +Writing a simple test +--------------------- + +Many elements of Matplotlib can be tested using standard tests. For +example, here is a test from :mod:`matplotlib.tests.test_basic`:: + + from nose.tools import assert_equal + + def test_simple(): + '''very simple example test''' + assert_equal(1+1,2) + +Nose determines which functions are tests by searching for functions +beginning with "test" in their name. + +Writing an image comparison test +-------------------------------- + +Writing an image based test is only slightly more difficult than a +simple test. The main consideration is that you must specify the +"baseline", or expected, images in the +:func:`~matplotlib.testing.decorators.image_comparison` decorator. For +example, this test generates a single image and automatically tests +it:: + + import numpy as np + import matplotlib + from matplotlib.testing.decorators import image_comparison + import matplotlib.pyplot as plt + + @image_comparison(baseline_images=['spines_axes_positions.png']) + def test_spines_axes_positions(): + # SF bug 2852168 + fig = plt.figure() + x = np.linspace(0,2*np.pi,100) + y = 2*np.sin(x) + ax = fig.add_subplot(1,1,1) + ax.set_title('centered spines') + ax.plot(x,y) + ax.spines['right'].set_position(('axes',0.1)) + ax.yaxis.set_ticks_position('right') + ax.spines['top'].set_position(('axes',0.25)) + ax.xaxis.set_ticks_position('top') + ax.spines['left'].set_color('none') + ax.spines['bottom'].set_color('none') + fig.savefig('spines_axes_positions.png') + +The mechanism for comparing images is extremely simple -- it compares +an image saved in the current directory with one from the Matplotlib +sample_data repository. The correspondence is done by matching +filenames, so ensure that: + + * The filename given to :meth:`~matplotlib.figure.Figure.savefig` is + exactly the same as the filename given to + :func:`~matplotlib.testing.decorators.image_comparison` in the + ``baseline_images`` argument. + + * The correct image gets added to the sample_data respository with + the name ``test_baseline_``. (See + :ref:`sample-data` above for a description of how to add files to + the sample_data repository.) + + +Known failing tests +------------------- + +If you're writing a test, you may mark it as a known failing test with +the :func:`~matplotlib.testing.decorators.knownfailureif` +decorator. This allows the test to be added to the test suite and run +on the buildbots without causing undue alarm. For example, although +the following test will fail, it is an expected failure:: + + from nose.tools import assert_equal + from matplotlib.testing.decorators import knownfailureif + + @knownfailureif(True) + def test_simple_fail(): + '''very simple example test that should fail''' + assert_equal(1+1,3) + +Note that the first argument to the +:func:`~matplotlib.testing.decorators.knownfailureif` decorator is a +fail condition, which can be a value such as True, False, or +'indeterminate', or may be a dynamically evaluated expression. + +Creating a new module in matplotlib.tests +----------------------------------------- + +Let's say you've added a new module named +``matplotlib.tests.test_whizbang_features``. To add this module to +the list of default tests, append its name to ``default_test_modules`` +in :file:`lib/matplotlib/__init__.py`. + Licenses ======== @@ -623,3 +800,7 @@ licensing choice is compatibility with the other python extensions for scientific computing: ipython, numpy, scipy, the enthought tool suite and python itself are all distributed under BSD compatible licenses. +The other reason is licensing compatibility with the other python +extensions for scientific computing: ipython, numpy, scipy, the +enthought tool suite and python itself are all distributed under BSD +compatible licenses. diff -Nru matplotlib-0.99.3/doc/devel/documenting_mpl.rst matplotlib-1.0.1/doc/devel/documenting_mpl.rst --- matplotlib-0.99.3/doc/devel/documenting_mpl.rst 2009-07-31 15:14:25.000000000 +0000 +++ matplotlib-1.0.1/doc/devel/documenting_mpl.rst 2010-07-07 01:41:46.000000000 +0000 @@ -286,7 +286,7 @@ .. literalinclude:: ../../lib/matplotlib/mpl-data/matplotlibrc -On exception to this is when referring to the examples dir. Relative +One exception to this is when referring to the examples dir. Relative paths are extremely confusing in the sphinx plot extensions, so without getting into the dirty details, it is easier to simply include a symlink to the files at the top doc level directory. This way, API diff -Nru matplotlib-0.99.3/doc/devel/release_guide.rst matplotlib-1.0.1/doc/devel/release_guide.rst --- matplotlib-0.99.3/doc/devel/release_guide.rst 2009-07-31 15:14:25.000000000 +0000 +++ matplotlib-1.0.1/doc/devel/release_guide.rst 2010-07-07 01:41:46.000000000 +0000 @@ -122,7 +122,7 @@ sftp> put matplotlib-0.98.2.tar.gz Uploading matplotlib-0.98.2.tar.gz to /incoming/j/jd/jdh2358/uploads/matplotlib-0.98.2.tar.gz -* go https://sourceforge.net/project/admin/editpackages.php?group_id=80706 and do a +* go https://sourceforge.net/project/admin/explorer.php?group_id=80706 and do a file release. Click on the "Admin" tab to log in as an admin, and then the "File Releases" tab. Go to the bottom and click "add release" and enter the package name but not the version number in diff -Nru matplotlib-0.99.3/doc/faq/howto_faq.rst matplotlib-1.0.1/doc/faq/howto_faq.rst --- matplotlib-0.99.3/doc/faq/howto_faq.rst 2009-08-22 21:06:12.000000000 +0000 +++ matplotlib-1.0.1/doc/faq/howto_faq.rst 2010-09-23 20:07:17.000000000 +0000 @@ -68,6 +68,35 @@ ax.set_xlabel('volts', alpha=0.5) +.. _howto-multipage: + +Save multiple plots in one pdf file +----------------------------------- + +Many image file formats can only have one image per file, but some +formats support multi-page files. Currently only the pdf backend has +support for this. To make a multi-page pdf file, first initialize the +file:: + + from matplotlib.backends.backend_pdf import PdfPages + pp = PdfPages('multipage.pdf') + +You can give the :class:`~matplotlib.backends.backend_pdf.PdfPages` +object to :func:`~matplotlib.pyplot.savefig`, but you have to specify +the format:: + + savefig(pp, format='pdf') + +A simpler way is to call +:meth:`PdfPages.savefig `:: + + pp.savefig() + +Finally, the multipage pdf object has to be closed:: + + pp.close() + + .. _howto-subplots-adjust: Move the edge of an axes to make room for tick labels @@ -702,4 +731,34 @@ +.. _how-to-cite-mpl: + +Cite Matplotlib +================= + +If you want to refer to matplotlib in a publication, you can use +"Matplotlib: A 2D Graphics Environment" by J. D. Hunter In Computing in Science & +Engineering, Vol. 9, No. 3. (2007), pp. 90-95 (see `citeulike `_):: + + @article{Hunter:2007, + Address = {10662 LOS VAQUEROS CIRCLE, PO BOX 3014, LOS ALAMITOS, CA 90720-1314 USA}, + Author = {Hunter, John D.}, + Date-Added = {2010-09-23 12:22:10 -0700}, + Date-Modified = {2010-09-23 12:22:10 -0700}, + Isi = {000245668100019}, + Isi-Recid = {155389429}, + Journal = {Computing In Science \& Engineering}, + Month = {May-Jun}, + Number = {3}, + Pages = {90--95}, + Publisher = {IEEE COMPUTER SOC}, + Times-Cited = {21}, + Title = {Matplotlib: A 2D graphics environment}, + Type = {Editorial Material}, + Volume = {9}, + Year = {2007}, + Abstract = {Matplotlib is a 2D graphics package used for Python for application + development, interactive scripting, and publication-quality image + generation across user interfaces and operating systems.}, + Bdsk-Url-1 = {http://gateway.isiknowledge.com/gateway/Gateway.cgi?GWVersion=2&SrcAuth=Alerting&SrcApp=Alerting&DestApp=WOS&DestLinkType=FullRecord;KeyUT=000245668100019}} diff -Nru matplotlib-0.99.3/doc/faq/installing_faq.rst matplotlib-1.0.1/doc/faq/installing_faq.rst --- matplotlib-0.99.3/doc/faq/installing_faq.rst 2010-03-09 14:20:19.000000000 +0000 +++ matplotlib-1.0.1/doc/faq/installing_faq.rst 2010-07-07 01:41:46.000000000 +0000 @@ -206,19 +206,19 @@ using the `Anti-Grain Geometry`_ engine PS :term:`ps` :term:`vector graphics` -- Postscript_ output :term:`eps` -PDF :term:`pdf` :term:`vector graphics` -- +PDF :term:`pdf` :term:`vector graphics` -- `Portable Document Format`_ SVG :term:`svg` :term:`vector graphics` -- `Scalable Vector Graphics`_ :term:`Cairo` :term:`png` :term:`vector graphics` -- :term:`ps` `Cairo graphics`_ - :term:`pdf` - :term:`svg` - ... + :term:`pdf` + :term:`svg` + ... :term:`GDK` :term:`png` :term:`raster graphics` -- :term:`jpg` the `Gimp Drawing Kit`_ - :term:`tiff` - ... + :term:`tiff` + ... ============= ============ ================================================ And here are the user interfaces and renderer combinations supported: @@ -264,8 +264,8 @@ :file:`pygobject.h` to add the :cmacro:`G_BEGIN_DECLS` and :cmacro:`G_END_DECLS` macros, and rename :cdata:`typename` parameter to :cdata:`typename_`:: - - const char *typename, - + const char *typename_, + - const char *typename, + + const char *typename_, .. _`bug in PyGTK-2.4`: http://bugzilla.gnome.org/show_bug.cgi?id=155304 @@ -294,20 +294,22 @@ ----------------------- If you want to install matplotlib from one of the binary installers we -build, you have two choices: a dmg installer, which is a typical +build, you have two choices: a mpkg installer, which is a typical Installer.app, or an binary OSX egg, which you can install via setuptools easy_install. -The mkpg installer will have a "dmg" extension, and will have a name -like :file:`matplotlib-0.99.0-py2.5-macosx10.5.dmg` depending on the -python, matplotlib, and OSX versions. Save this file and double -click it, which will open up a folder with a file in it that has the -mpkg extension. Double click this to run the Installer.app, which -will prompt you for a password if you need system wide installation -privileges, and install to a directory like -:file:`/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/site-packages`, -again depedending on your python version. This directory should be in -your python path, so you can test your installation with:: +The mkpg installer will have a "zip" extension, and will have a name +like file:`matplotlib-0.99.0.rc1-py2.5-macosx10.5_mpkg.zip` depending on +the python, matplotlib, and OSX versions. You need to unzip this file +using either the "unzip" command on OSX, or simply double clicking on +it to run StuffIt Expander. When you double click on the resultant +mpkd directory, which will have a name like +file:`matplotlib-0.99.0.rc1-py2.5-macosx10.5.mpkg`, it will run the +Installer.app, prompt you for a password if you need system wide +installation privileges, and install to a directory like +file:`/Library/Python/2.5/site-packages/`, again depedending on your +python version. This directory may not be in your python path, so you +can test your installation with:: > python -c 'import matplotlib; print matplotlib.__version__, matplotlib.__file__' @@ -319,23 +321,9 @@ then you will need to set your PYTHONPATH, eg:: - export PYTHONPATH=/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/site-packages:$PYTHONPATH - -See also :ref:`environment-variables`. - - -If you are upgrading your matplotlib using the dmg installer over an -Enthought Python Distribution, you may get an error like "You must use -a framework install of python". EPD puts their python in a directory -like :file:``//Library/Frameworks/Python.framework/Versions/4.3.0`` -where 4.3.0 is an EPD version number. The mpl installer needs the -`python` version number, so you need to create a symlink pointing your -python version to the EPS version before installing matplotlib. For -example, for python veersion 2.5 and EPD version 4.3.0:: - - > cd /Library/Frameworks/Python.framework/Versions - > ln -s 4.3.0 2.5 + export PYTHONPATH=/Library/Python/2.5/site-packages:$PYTHONPATH +See also ref:`environment-variables`. .. _easy-install-osx-egg: @@ -411,25 +399,25 @@ #branch="release" branch="trunk" if [ $branch = "trunk" ] - then - echo getting the trunk - svn co https://matplotlib.svn.sourceforge.net/svnroot/$NAME/trunk/$NAME $NAME - cd $NAME - - fi - if [ $branch = "release" ] - then - echo getting the maintenance branch - svn co https://matplotlib.svn.sf.net/svnroot/matplotlib/branches/v${VERSION}_maint $NAME$VERSION - cd $NAME$VERSION - fi - export CFLAGS="-Os -arch i386" - export LDFLAGS="-Os -arch i386" - export PKG_CONFIG_PATH="/usr/x11/lib/pkgconfig" - export ARCHFLAGS="-arch i386" - python setup.py build - python setup.py install #--prefix=$PREFIX #Use this if you don't want it installed into your default location - cd .. + then + echo getting the trunk + svn co https://matplotlib.svn.sourceforge.net/svnroot/$NAME/trunk/$NAME $NAME + cd $NAME + + fi + if [ $branch = "release" ] + then + echo getting the maintenance branch + svn co https://matplotlib.svn.sf.net/svnroot/matplotlib/branches/v${VERSION}_maint $NAME$VERSION + cd $NAME$VERSION + fi + export CFLAGS="-Os -arch i386" + export LDFLAGS="-Os -arch i386" + export PKG_CONFIG_PATH="/usr/x11/lib/pkgconfig" + export ARCHFLAGS="-arch i386" + python setup.py build + python setup.py install #--prefix=$PREFIX #Use this if you don't want it installed into your default location + cd .. Run this script (for example ``sh ./install-matplotlib-epd-osx.sh``) in the directory in which you want the source code to be placed, or simply type the diff -Nru matplotlib-0.99.3/doc/faq/usage_faq.rst matplotlib-1.0.1/doc/faq/usage_faq.rst --- matplotlib-0.99.3/doc/faq/usage_faq.rst 2009-07-31 15:14:26.000000000 +0000 +++ matplotlib-1.0.1/doc/faq/usage_faq.rst 2010-07-07 01:41:46.000000000 +0000 @@ -17,19 +17,19 @@ installed alongside :mod:`matplotlib`; and :mod:`matplotlib.pyplot` is a module in matplotlib. -Pyplot provides a Matlab-style state-machine interface to +Pyplot provides a MATLAB-style state-machine interface to the underlying object-oriented plotting library in matplotlib. Pylab combines the pyplot functionality (for plotting) with the numpy functionality (for mathematics and for working with arrays) in a single namespace, making that namespace -(or environment) even more Matlab-like. This is what you get if +(or environment) even more MATLAB-like. This is what you get if you use the *ipython* shell with the *-pylab* option, which imports everything from pylab and makes plotting fully interactive. We have been gradually converting the matplotlib examples -from pure Matlab-style, using "from pylab import \*", to a preferred +from pure MATLAB-style, using "from pylab import \*", to a preferred style in which pyplot is used for some convenience functions, either pyplot or the object-oriented style is used for the remainder of the plotting code, and numpy is used explicitly for numeric array operations. @@ -42,7 +42,7 @@ Then one calls, for example, np.arange, np.zeros, np.pi, plt.figure, plt.plot, plt.show, etc. -Example, pure Matlab-style:: +Example, pure MATLAB-style:: from pylab import * x = arange(0, 10, 0.2) @@ -71,7 +71,7 @@ plt.show() So, why do all the extra typing required as one moves away from the pure -matlab-style? For very simple things like this example, the only +MATLAB-style? For very simple things like this example, the only advantage is educational: the wordier styles are more explicit, more clear as to where things come from and what is going on. For more complicated applications, the explicitness and clarity become diff -Nru matplotlib-0.99.3/doc/make.py matplotlib-1.0.1/doc/make.py --- matplotlib-0.99.3/doc/make.py 2010-03-09 14:20:19.000000000 +0000 +++ matplotlib-1.0.1/doc/make.py 2010-11-09 15:02:51.000000000 +0000 @@ -30,7 +30,7 @@ check_build() shutil.copy('../lib/matplotlib/mpl-data/matplotlibrc', '_static/matplotlibrc') if small_docs: - options = "-D plot_formats=\"['png']\"" + options = "-D plot_formats=\"[('png', 80)]\"" else: options = '' if os.system('sphinx-build %s -P -b html -d build/doctrees . build/html' % options): @@ -52,12 +52,8 @@ # Produce pdf. os.chdir('build/latex') - # Copying the makefile produced by sphinx... - if (os.system('pdflatex Matplotlib.tex') or - os.system('pdflatex Matplotlib.tex') or - os.system('makeindex -s python.ist Matplotlib.idx') or - os.system('makeindex -s python.ist modMatplotlib.idx') or - os.system('pdflatex Matplotlib.tex')): + # Call the makefile produced by sphinx... + if os.system('make'): raise SystemExit("Rendering LaTeX failed.") os.chdir('../..') @@ -65,9 +61,8 @@ print 'latex build has not been tested on windows' def clean(): - for dirpath in ['build', 'examples']: - if os.path.exists(dirpath): - shutil.rmtree(dirpath) + shutil.rmtree("build", ignore_errors=True) + shutil.rmtree("examples", ignore_errors=True) for pattern in ['mpl_examples/api/*.png', 'mpl_examples/pylab_examples/*.png', 'mpl_examples/pylab_examples/*.pdf', diff -Nru matplotlib-0.99.3/doc/matplotlibrc matplotlib-1.0.1/doc/matplotlibrc --- matplotlib-0.99.3/doc/matplotlibrc 2009-07-31 15:14:32.000000000 +0000 +++ matplotlib-1.0.1/doc/matplotlibrc 2011-01-05 18:50:52.000000000 +0000 @@ -1,318 +1,13 @@ -### MATPLOTLIBRC FORMAT - -# This is a sample matplotlib configuration file. It should be placed -# in HOME/.matplotlib/matplotlibrc (unix/linux like systems) and -# C:\Documents and Settings\yourname\.matplotlib (win32 systems) -# -# By default, the installer will overwrite the existing file in the -# install path, so if you want to preserve your's, please move it to -# your HOME dir and set the environment variable if necessary. -# -# This file is best viewed in a editor which supports python mode -# syntax highlighting -# -# Blank lines, or lines starting with a comment symbol, are ignored, -# as are trailing comments. Other lines must have the format -# -# key : val # optional comment -# -# Colors: for the color values below, you can either use -# - a matplotlib color string, such as r, k, or b -# - an rgb tuple, such as (1.0, 0.5, 0.0) -# - a hex string, such as ff00ff (no '#' symbol) -# - a scalar grayscale intensity such as 0.75 -# - a legal html color name, eg red, blue, darkslategray - -#### CONFIGURATION BEGINS HERE -# the default backend; one of GTK GTKAgg GTKCairo FltkAgg QtAgg TkAgg -# WX WXAgg Agg Cairo GD GDK Paint PS PDF SVG Template backend : Agg -#maskedarray : False # True to use external maskedarray module - # instead of numpy.ma; this is a temporary - # setting for testing maskedarray. -#interactive : False # see http://matplotlib.sourceforge.net/interactive.html -#toolbar : toolbar2 # None | classic | toolbar2 -#timezone : UTC # a pytz timezone string, eg US/Central or Europe/Paris - -# Where your matplotlib data lives if you installed to a non-default -# location. This is where the matplotlib fonts, bitmaps, etc reside -#datapath : /home/jdhunter/mpldata - - -### LINES -# See http://matplotlib.sourceforge.net/matplotlib.lines.html for more -# information on line properties. -lines.linewidth : 1.5 # line width in points -#lines.linestyle : - # solid line -#lines.color : blue -#lines.marker : None # the default marker -#lines.markeredgewidth : 0.5 # the line width around the marker symbol -#lines.markersize : 6 # markersize, in points -#lines.dash_joinstyle : miter # miter|round|bevel -#lines.dash_capstyle : butt # butt|round|projecting -#lines.solid_joinstyle : miter # miter|round|bevel -#lines.solid_capstyle : projecting # butt|round|projecting -#lines.antialiased : True # render lines in antialised (no jaggies) - -### PATCHES -# Patches are graphical objects that fill 2D space, like polygons or -# circles. See -# http://matplotlib.sourceforge.net/matplotlib.patches.html for more -# information on patch properties -#patch.linewidth : 1.0 # edge width in points -#patch.facecolor : blue -#patch.edgecolor : black -#patch.antialiased : True # render patches in antialised (no jaggies) - -### FONT -# -# font properties used by text.Text. See -# http://matplotlib.sourceforge.net/matplotlib.font_manager.html for more -# information on font properties. The 6 font properties used for font -# matching are given below with their default values. -# -# The font.family property has five values: 'serif' (e.g. Times), -# 'sans-serif' (e.g. Helvetica), 'cursive' (e.g. Zapf-Chancery), -# 'fantasy' (e.g. Western), and 'monospace' (e.g. Courier). Each of -# these font families has a default list of font names in decreasing -# order of priority associated with them. -# -# The font.style property has three values: normal (or roman), italic -# or oblique. The oblique style will be used for italic, if it is not -# present. -# -# The font.variant property has two values: normal or small-caps. For -# TrueType fonts, which are scalable fonts, small-caps is equivalent -# to using a font size of 'smaller', or about 83% of the current font -# size. -# -# The font.weight property has effectively 13 values: normal, bold, -# bolder, lighter, 100, 200, 300, ..., 900. Normal is the same as -# 400, and bold is 700. bolder and lighter are relative values with -# respect to the current weight. -# -# The font.stretch property has 11 values: ultra-condensed, -# extra-condensed, condensed, semi-condensed, normal, semi-expanded, -# expanded, extra-expanded, ultra-expanded, wider, and narrower. This -# property is not currently implemented. -# -# The font.size property is the default font size for text, given in pts. -# 12pt is the standard value. -# -#font.family : sans-serif -#font.style : normal -#font.variant : normal -#font.weight : medium -#font.stretch : normal -# note that font.size controls default text sizes. To configure -# special text sizes tick labels, axes, labels, title, etc, see the rc -# settings for axes and ticks. Special text sizes can be defined -# relative to font.size, using the following values: xx-small, x-small, -# small, medium, large, x-large, xx-large, larger, or smaller -#font.size : 12.0 -#font.serif : Bitstream Vera Serif, New Century Schoolbook, Century Schoolbook L, Utopia, ITC Bookman, Bookman, Nimbus Roman No9 L, Times New Roman, Times, Palatino, Charter, serif -#font.sans-serif : Bitstream Vera Sans, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif -#font.cursive : Apple Chancery, Textile, Zapf Chancery, Sand, cursive -#font.fantasy : Comic Sans MS, Chicago, Charcoal, Impact, Western, fantasy -#font.monospace : Bitstream Vera Sans Mono, Andale Mono, Nimbus Mono L, Courier New, Courier, Fixed, Terminal, monospace - -### TEXT -# text properties used by text.Text. See -# http://matplotlib.sourceforge.net/matplotlib.text.html for more -# information on text properties - -#text.color : black - -### LaTeX customizations. See http://www.scipy.org/Wiki/Cookbook/Matplotlib/UsingTex -#text.usetex : False # use latex for all text handling. The following fonts - # are supported through the usual rc parameter settings: - # new century schoolbook, bookman, times, palatino, - # zapf chancery, charter, serif, sans-serif, helvetica, - # avant garde, courier, monospace, computer modern roman, - # computer modern sans serif, computer modern typewriter - # If another font is desired which can loaded using the - # LaTeX \usepackage command, please inquire at the - # matplotlib mailing list -#text.latex.unicode : False # use "ucs" and "inputenc" LaTeX packages for handling - # unicode strings. -#text.latex.preamble : # IMPROPER USE OF THIS FEATURE WILL LEAD TO LATEX FAILURES - # AND IS THEREFORE UNSUPPORTED. PLEASE DO NOT ASK FOR HELP - # IF THIS FEATURE DOES NOT DO WHAT YOU EXPECT IT TO. - # preamble is a comma separated list of LaTeX statements - # that are included in the LaTeX document preamble. - # An example: - # text.latex.preamble : \usepackage{bm},\usepackage{euler} - # The following packages are always loaded with usetex, so - # beware of package collisions: color, geometry, graphicx, - # type1cm, textcomp. Adobe Postscript (PSSNFS) font packages - # may also be loaded, depending on your font settings -#text.dvipnghack : False # some versions of dvipng don't handle - # alpha channel properly. Use True to correct and flush - # ~/.matplotlib/tex.cache before testing -#text.markup : 'plain' # Affects how text, such as titles and labels, are - # interpreted by default. - # 'plain': As plain, unformatted text - # 'tex': As TeX-like text. Text between $'s will be - # formatted as a TeX math expression. - # This setting has no effect when text.usetex is True. - # In that case, all text will be sent to TeX for - # processing. - -# The following settings allow you to select the fonts in math mode. -# They map from a TeX font name to a fontconfig font pattern. -# These settings are only used if mathtext.fontset is 'custom'. -#mathtext.cal : cursive -#mathtext.rm : serif -#mathtext.tt : monospace -#mathtext.it : serif:italic -#mathtext.bf : serif:bold -#mathtext.sf : sans -#mathtext.fontset : cm # Should be 'cm' (Computer Modern), 'stix', - # 'stixsans' or 'custom' -#mathtext.fallback_to_cm : True # When True, use symbols from the Computer Modern - # fonts when a symbol can not be found in one of - # the custom math fonts. - -### AXES -# default face and edge color, default tick sizes, -# default fontsizes for ticklabels, and so on. See -# http://matplotlib.sourceforge.net/matplotlib.axes.html#Axes -#axes.hold : True # whether to clear the axes by default on -#axes.facecolor : white # axes background color -#axes.edgecolor : black # axes edge color -#axes.linewidth : 1.0 # edge linewidth -#axes.grid : False # display grid or not -#axes.titlesize : 14 # fontsize of the axes title -#axes.labelsize : 12 # fontsize of the x any y labels -#axes.labelcolor : black -#axes.axisbelow : False # whether axis gridlines and ticks are below - # the axes elements (lines, text, etc) -#axes.formatter.limits : -7, 7 # use scientific notation if log10 - # of the axis range is smaller than the - # first or larger than the second - -#polaraxes.grid : True # display grid on polar axes - -### TICKS -# see http://matplotlib.sourceforge.net/matplotlib.axis.html#Ticks -#xtick.major.size : 4 # major tick size in points -#xtick.minor.size : 2 # minor tick size in points -#xtick.major.pad : 4 # distance to major tick label in points -#xtick.minor.pad : 4 # distance to the minor tick label in points -#xtick.color : k # color of the tick labels -#xtick.labelsize : 12 # fontsize of the tick labels -#xtick.direction : in # direction: in or out - -#ytick.major.size : 4 # major tick size in points -#ytick.minor.size : 2 # minor tick size in points -#ytick.major.pad : 4 # distance to major tick label in points -#ytick.minor.pad : 4 # distance to the minor tick label in points -#ytick.color : k # color of the tick labels -#ytick.labelsize : 12 # fontsize of the tick labels -#ytick.direction : in # direction: in or out - -### GRIDS -#grid.color : black # grid color -#grid.linestyle : : # dotted -#grid.linewidth : 0.5 # in points - -### Legend -#legend.isaxes : True -#legend.numpoints : 2 # the number of points in the legend line -#legend.fontsize : 14 -#legend.pad : 0.2 # the fractional whitespace inside the legend border -#legend.markerscale : 1.0 # the relative size of legend markers vs. original -# the following dimensions are in axes coords -#legend.labelsep : 0.010 # the vertical space between the legend entries -#legend.handlelen : 0.05 # the length of the legend lines -#legend.handletextsep : 0.02 # the space between the legend line and legend text -#legend.axespad : 0.02 # the border between the axes and legend edge -#legend.shadow : False - -### FIGURE -# See http://matplotlib.sourceforge.net/matplotlib.figure.html#Figure -figure.figsize : 6, 4 # figure size in inches -#figure.dpi : 80 # figure dots per inch -#figure.facecolor : 0.75 # figure facecolor; 0.75 is scalar gray -#figure.edgecolor : white # figure edgecolor - -# The figure subplot parameters. All dimensions are fraction of the -# figure width or height -figure.subplot.left : 0.2 # the left side of the subplots of the figure -#figure.subplot.right : 0.9 # the right side of the subplots of the figure -figure.subplot.bottom : 0.1 # the bottom of the subplots of the figure -#figure.subplot.top : 0.9 # the top of the subplots of the figure -#figure.subplot.wspace : 0.2 # the amount of width reserved for blank space between subplots -#figure.subplot.hspace : 0.2 # the amount of height reserved for white space between subplots - -#figure.autolayout : False # when True, adjust the axes so that text doesn't overlap - -### IMAGES -#image.aspect : equal # equal | auto | a number -#image.interpolation : bilinear # see help(imshow) for options -#image.cmap : jet # gray | jet etc... -#image.lut : 256 # the size of the colormap lookup table -#image.origin : upper # lower | upper - - -### CONTOUR PLOTS -#contour.negative_linestyle : dashed # dashed | solid - -### SAVING FIGURES -# the default savefig params can be different for the GUI backends. -# Eg, you may want a higher resolution, or to make the figure -# background white +figure.figsize : 5.5, 4.5 # figure size in inches savefig.dpi : 80 # figure dots per inch -#savefig.facecolor : white # figure facecolor when saving -#savefig.edgecolor : white # figure edgecolor when saving - -#cairo.format : png # png, ps, pdf, svg - -# tk backend params -#tk.window_focus : False # Maintain shell focus for TkAgg -#tk.pythoninspect : False # tk sets PYTHONINSEPCT - -# ps backend params -#ps.papersize : letter # auto, letter, legal, ledger, A0-A10, B0-B10 -#ps.useafm : False # use of afm fonts, results in small files -#ps.usedistiller : False # can be: None, ghostscript or xpdf - # Experimental: may produce smaller files. - # xpdf intended for production of publication quality files, - # but requires ghostscript, xpdf and ps2eps -#ps.distiller.res : 6000 # dpi -#ps.fonttype : 3 # Output Type 3 (Type3) or Type 42 (TrueType) - -# pdf backend params -#pdf.compression : 6 # integer from 0 to 9 - # 0 disables compression (good for debugging) -#pdf.fonttype : 3 # Output Type 3 (Type3) or Type 42 (TrueType) - -# svg backend params -#svg.image_inline : True # write raster image data directly into the svg file -#svg.image_noscale : False # suppress scaling of raster data embedded in SVG -#svg.embed_chars : True # embed character outlines in the SVG file - -# docstring params docstring.hardcopy : True # set this when you want to generate hardcopy docstring -# Set the verbose flags. This controls how much information -# matplotlib gives you at runtime and where it goes. The verbosity -# levels are: silent, helpful, debug, debug-annoying. Any level is -# inclusive of all the levels below it. If you setting is debug, -# you'll get all the debug and helpful messages. When submitting -# problems to the mailing-list, please set verbose to helpful or debug -# and paste the output into your report. -# -# The fileo gives the destination for any calls to verbose.report. -# These objects can a filename, or a filehandle like sys.stdout. -# -# You can override the rc default verbosity from the command line by -# giving the flags --verbose-LEVEL where LEVEL is one of the legal -# levels, eg --verbose-helpful. -# -# You can access the verbose instance in your code -# from matplotlib import verbose. +# these parameters are useful for packagers who want to build the docs +# w/o invoking file downloads for the sampledata (see +# matplotlib.cbook.get_sample_data. Unpack +# mpl_sampledata-VERSION.tar.gz and point examples.directory to it. -#verbose.level : silent # one of silent, helpful, debug, debug-annoying -#verbose.fileo : sys.stdout # a log filename, sys.stdout or sys.stderr +#examples.download : False # False to bypass downloading mechanism +#examples.directory : /home/titan/johnh/python/svn/matplotlib.trunk/sample_data/ # directory to look in if download is false diff -Nru matplotlib-0.99.3/doc/mpl_examples/animation/animation_blit_gtk2.py matplotlib-1.0.1/doc/mpl_examples/animation/animation_blit_gtk2.py --- matplotlib-0.99.3/doc/mpl_examples/animation/animation_blit_gtk2.py 2009-07-31 15:14:44.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/animation/animation_blit_gtk2.py 2011-01-05 15:59:56.000000000 +0000 @@ -20,9 +20,9 @@ class UpdateLine(object): def get_bg_bbox(self): - + return self.ax.bbox.padded(-3) - + def __init__(self, canvas, ax): self.cnt = 0 self.canvas = canvas @@ -31,7 +31,7 @@ self.prev_time = time.time() self.start_time = self.prev_time self.prev_pixel_offset = 0. - + self.x0 = 0 self.phases = np.random.random_sample((20,)) * np.pi * 2 @@ -70,7 +70,7 @@ # restore the clean slate background self.canvas.restore_region(self.background1) - # restore subregion (x1+dx, y1, x2, y2) of the second bg + # restore subregion (x1+dx, y1, x2, y2) of the second bg # in a offset position (x1-dx, y1) x1, y1, x2, y2 = self.background2.get_extents() self.canvas.restore_region(self.background2, @@ -82,18 +82,18 @@ def on_draw(self, *args): self.save_bg() return False - + def update_line(self, *args): if self.background1 is None: return True - + cur_time = time.time() pixel_offset = int((cur_time - self.start_time)*100.) dx_pixel = pixel_offset - self.prev_pixel_offset self.prev_pixel_offset = pixel_offset dx_data = self.get_dx_data(dx_pixel) #cur_time - self.prev_time) - + x0 = self.x0 self.x0 += dx_data self.prev_time = cur_time @@ -109,7 +109,7 @@ self.line.set_color(self.color_cycle.next()) - # now plot line segment within [x0, x0+dx_data], + # now plot line segment within [x0, x0+dx_data], # Note that we're only plotting a line between [x0, x0+dx_data]. xx = np.array([x0, self.x0]) self.line.set_xdata(xx) diff -Nru matplotlib-0.99.3/doc/mpl_examples/animation/animation_blit_gtk.py matplotlib-1.0.1/doc/mpl_examples/animation/animation_blit_gtk.py --- matplotlib-0.99.3/doc/mpl_examples/animation/animation_blit_gtk.py 2009-07-31 15:14:44.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/animation/animation_blit_gtk.py 2011-01-05 15:59:56.000000000 +0000 @@ -29,15 +29,28 @@ # for profiling tstart = time.time() +def on_draw(event): + background = canvas.copy_from_bbox(ax.bbox) + if on_draw.background is None: + gobject.idle_add(update_line) + + on_draw.background = background + +on_draw.background = None + +fig.canvas.mpl_connect('draw_event', on_draw) + def update_line(*args): - print 'you are here', update_line.cnt - if update_line.background is None: - update_line.background = canvas.copy_from_bbox(ax.bbox) + if on_draw.background is None: + return True + + print 'frame', update_line.cnt # restore the clean slate background - canvas.restore_region(update_line.background) + canvas.restore_region(on_draw.background) # update the data line.set_ydata(np.sin(x+update_line.cnt/10.0)) + # just draw the animated artist ax.draw_artist(line) @@ -54,14 +67,6 @@ return True update_line.cnt = 0 -update_line.background = None - - -def start_anim(event): - gobject.idle_add(update_line) - canvas.mpl_disconnect(start_anim.cid) - -start_anim.cid = canvas.mpl_connect('draw_event', start_anim) diff -Nru matplotlib-0.99.3/doc/mpl_examples/animation/draggable_legend.py matplotlib-1.0.1/doc/mpl_examples/animation/draggable_legend.py --- matplotlib-0.99.3/doc/mpl_examples/animation/draggable_legend.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/animation/draggable_legend.py 2010-07-07 01:41:53.000000000 +0000 @@ -0,0 +1,43 @@ +import matplotlib.pyplot as plt + + +ax = plt.subplot(111) +ax.plot([1,2,3], label="test") + +l = ax.legend() +d1 = l.draggable() + +xy = 1, 2 +txt = ax.annotate("Test", xy, xytext=(-30, 30), + textcoords="offset points", + bbox=dict(boxstyle="round",fc=(0.2, 1, 1)), + arrowprops=dict(arrowstyle="->")) +d2 = txt.draggable() + + +from matplotlib._png import read_png +from matplotlib.cbook import get_sample_data + +from matplotlib.offsetbox import OffsetImage, AnnotationBbox + +fn = get_sample_data("lena.png", asfileobj=False) +arr_lena = read_png(fn) + +imagebox = OffsetImage(arr_lena, zoom=0.2) + +ab = AnnotationBbox(imagebox, xy, + xybox=(120., -80.), + xycoords='data', + boxcoords="offset points", + pad=0.5, + arrowprops=dict(arrowstyle="->", + connectionstyle="angle,angleA=0,angleB=90,rad=3") + ) + + +ax.add_artist(ab) + +d3 = ab.draggable(use_blit=True) + + +plt.show() diff -Nru matplotlib-0.99.3/doc/mpl_examples/animation/dynamic_image_gtkagg.py matplotlib-1.0.1/doc/mpl_examples/animation/dynamic_image_gtkagg.py --- matplotlib-0.99.3/doc/mpl_examples/animation/dynamic_image_gtkagg.py 2009-07-31 15:14:44.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/animation/dynamic_image_gtkagg.py 2010-07-07 01:41:53.000000000 +0000 @@ -9,7 +9,6 @@ import matplotlib matplotlib.use('GTKAgg') -from matplotlib import rcParams from pylab import * diff -Nru matplotlib-0.99.3/doc/mpl_examples/animation/movie_demo.py matplotlib-1.0.1/doc/mpl_examples/animation/movie_demo.py --- matplotlib-0.99.3/doc/mpl_examples/animation/movie_demo.py 2009-07-31 15:14:44.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/animation/movie_demo.py 2010-07-07 01:41:53.000000000 +0000 @@ -87,7 +87,7 @@ for i in range(len(y)) : # - # The next four lines are just like Matlab. + # The next four lines are just like MATLAB. # plt.plot(x,y[i],'b.') plt.axis((x[0],x[-1],-0.25,1)) diff -Nru matplotlib-0.99.3/doc/mpl_examples/animation/strip_chart_demo.py matplotlib-1.0.1/doc/mpl_examples/animation/strip_chart_demo.py --- matplotlib-0.99.3/doc/mpl_examples/animation/strip_chart_demo.py 2009-07-31 15:14:44.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/animation/strip_chart_demo.py 2010-07-07 01:41:53.000000000 +0000 @@ -9,7 +9,7 @@ different GUI that supports animation (GTKAgg, TkAgg, WXAgg) and use your toolkits idle/timer functions. """ -import gobject, gtk +import gobject import matplotlib matplotlib.use('GTKAgg') import numpy as np diff -Nru matplotlib-0.99.3/doc/mpl_examples/api/artist_demo.py matplotlib-1.0.1/doc/mpl_examples/api/artist_demo.py --- matplotlib-0.99.3/doc/mpl_examples/api/artist_demo.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/api/artist_demo.py 2010-09-23 19:54:50.000000000 +0000 @@ -0,0 +1,119 @@ +""" +Show examples of matplotlib artists +http://matplotlib.sourceforge.net/api/artist_api.html + +Several examples of standard matplotlib graphics primitives (artists) +are drawn using matplotlib API. Full list of artists and the +documentation is available at +http://matplotlib.sourceforge.net/api/artist_api.html + +Copyright (c) 2010, Bartosz Telenczuk + +License: This work is licensed under the BSD. A copy should be +included with this source code, and is also available at +http://www.opensource.org/licenses/bsd-license.php +""" + + +import numpy as np +import matplotlib.pyplot as plt +import matplotlib +from matplotlib.collections import PatchCollection +import matplotlib.path as mpath +import matplotlib.patches as mpatches +import matplotlib.lines as mlines + +font = "sans-serif" +fig = plt.figure(figsize=(5,5)) +ax = plt.axes([0,0,1,1]) + +# create 3x3 grid to plot the artists +pos = np.mgrid[0.2:0.8:3j, 0.2:0.8:3j].reshape(2, -1) + +patches = [] + +# add a circle +art = mpatches.Circle(pos[:,0], 0.1,ec="none") +patches.append(art) +plt.text(pos[0,0], pos[1,0]-0.15, "Circle", ha="center", + family=font, size=14) + +# add a rectangle +art = mpatches.Rectangle(pos[:,1] - np.array([0.025, 0.05]), 0.05, 0.1, + ec="none") +patches.append(art) +plt.text(pos[0,1], pos[1,1]-0.15, "Rectangle", ha="center", + family=font, size=14) + +# add a wedge +wedge = mpatches.Wedge(pos[:,2], 0.1, 30, 270, ec="none") +patches.append(wedge) +plt.text(pos[0,2], pos[1,2]-0.15, "Wedge", ha="center", + family=font, size=14) + +# add a Polygon +polygon = mpatches.RegularPolygon(pos[:,3], 5, 0.1) +patches.append(polygon) +plt.text(pos[0,3], pos[1,3]-0.15, "Polygon", ha="center", + family=font, size=14) + +#add an ellipse +ellipse = mpatches.Ellipse(pos[:,4], 0.2, 0.1) +patches.append(ellipse) +plt.text(pos[0,4], pos[1,4]-0.15, "Ellipse", ha="center", + family=font, size=14) + +#add an arrow +arrow = mpatches.Arrow(pos[0,5]-0.05, pos[1,5]-0.05, 0.1, 0.1, width=0.1) +patches.append(arrow) +plt.text(pos[0,5], pos[1,5]-0.15, "Arrow", ha="center", + family=font, size=14) + +# add a path patch +Path = mpath.Path +verts = np.array([ + (0.158, -0.257), + (0.035, -0.11), + (-0.175, 0.20), + (0.0375, 0.20), + (0.085, 0.115), + (0.22, 0.32), + (0.3, 0.005), + (0.20, -0.05), + (0.158, -0.257), + ]) +verts = verts-verts.mean(0) +codes = [Path.MOVETO, + Path.CURVE4, Path.CURVE4, Path.CURVE4, Path.LINETO, + Path.CURVE4, Path.CURVE4, Path.CURVE4, Path.CLOSEPOLY] + +path = mpath.Path(verts/2.5+pos[:,6], codes) +patch = mpatches.PathPatch(path) +patches.append(patch) +plt.text(pos[0,6], pos[1,6]-0.15, "PathPatch", ha="center", + family=font, size=14) + +# add a fancy box +fancybox = mpatches.FancyBboxPatch( + pos[:,7]-np.array([0.025, 0.05]), 0.05, 0.1, + boxstyle=mpatches.BoxStyle("Round", pad=0.02)) +patches.append(fancybox) +plt.text(pos[0,7], pos[1,7]-0.15, "FancyBoxPatch", ha="center", + family=font, size=14) + +# add a line +x,y = np.array([[-0.06, 0.0, 0.1], [0.05,-0.05, 0.05]]) +line = mlines.Line2D(x+pos[0,8], y+pos[1,8], lw=5., + alpha=0.4) +plt.text(pos[0,8], pos[1,8]-0.15, "Line2D", ha="center", + family=font, size=14) + +colors = 100*np.random.rand(len(patches)) +collection = PatchCollection(patches, cmap=matplotlib.cm.jet, alpha=0.4) +collection.set_array(np.array(colors)) +ax.add_collection(collection) +ax.add_line(line) +ax.set_xticks([]) +ax.set_yticks([]) + +plt.show() diff -Nru matplotlib-0.99.3/doc/mpl_examples/api/color_cycle.py matplotlib-1.0.1/doc/mpl_examples/api/color_cycle.py --- matplotlib-0.99.3/doc/mpl_examples/api/color_cycle.py 2009-07-31 15:14:49.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/api/color_cycle.py 2010-07-07 01:41:55.000000000 +0000 @@ -13,7 +13,7 @@ mpl.rc('lines', linewidth=4) fig = plt.figure() -mpl.axes.set_default_color_cycle(['r', 'g', 'b', 'c']) +mpl.rcParams['axes.color_cycle'] = ['r', 'g', 'b', 'c'] ax = fig.add_subplot(2,1,1) ax.plot(yy) ax.set_title('Changed default color cycle to rgbc') diff -Nru matplotlib-0.99.3/doc/mpl_examples/api/compound_path.py matplotlib-1.0.1/doc/mpl_examples/api/compound_path.py --- matplotlib-0.99.3/doc/mpl_examples/api/compound_path.py 2009-07-31 15:14:49.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/api/compound_path.py 2010-07-07 01:41:55.000000000 +0000 @@ -21,7 +21,7 @@ vertices = np.array(vertices, float) path = Path(vertices, codes) -pathpatch = PathPatch(path, facecolor='red', edgecolor='green') +pathpatch = PathPatch(path, facecolor='None', edgecolor='green') fig = plt.figure() ax = fig.add_subplot(111) diff -Nru matplotlib-0.99.3/doc/mpl_examples/api/date_demo.py matplotlib-1.0.1/doc/mpl_examples/api/date_demo.py --- matplotlib-0.99.3/doc/mpl_examples/api/date_demo.py 2009-07-31 15:14:49.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/api/date_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -17,6 +17,7 @@ import matplotlib.pyplot as plt import matplotlib.dates as mdates import matplotlib.mlab as mlab +import matplotlib.cbook as cbook years = mdates.YearLocator() # every year months = mdates.MonthLocator() # every month @@ -26,7 +27,7 @@ # open, close, volume, adj_close from the mpl-data/example directory. # The record array stores python datetime.date as an object array in # the date column -datafile = matplotlib.get_example_data('goog.npy') +datafile = cbook.get_sample_data('goog.npy') r = np.load(datafile).view(np.recarray) fig = plt.figure() diff -Nru matplotlib-0.99.3/doc/mpl_examples/api/date_index_formatter.py matplotlib-1.0.1/doc/mpl_examples/api/date_index_formatter.py --- matplotlib-0.99.3/doc/mpl_examples/api/date_index_formatter.py 2009-07-31 15:14:49.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/api/date_index_formatter.py 2010-07-07 01:41:55.000000000 +0000 @@ -6,9 +6,13 @@ import numpy as np import matplotlib.pyplot as plt import matplotlib.mlab as mlab +import matplotlib.cbook as cbook import matplotlib.ticker as ticker -r = mlab.csv2rec('../data/aapl.csv') +datafile = cbook.get_sample_data('aapl.csv', asfileobj=False) +print 'loading', datafile +r = mlab.csv2rec(datafile) + r.sort() r = r[-30:] # get the last 30 days diff -Nru matplotlib-0.99.3/doc/mpl_examples/api/demo_affine_image.py matplotlib-1.0.1/doc/mpl_examples/api/demo_affine_image.py --- matplotlib-0.99.3/doc/mpl_examples/api/demo_affine_image.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/api/demo_affine_image.py 2010-07-07 01:41:55.000000000 +0000 @@ -0,0 +1,66 @@ +#!/usr/bin/env python + + +""" +For the backends that supports draw_image with optional affine +transform (e.g., agg, ps backend), the image of the output should +have its boundary matches the red rectangles. +""" + +import numpy as np +import matplotlib.cm as cm +import matplotlib.mlab as mlab +import matplotlib.pyplot as plt +import matplotlib.transforms as mtransforms + +def get_image(): + delta = 0.25 + x = y = np.arange(-3.0, 3.0, delta) + X, Y = np.meshgrid(x, y) + Z1 = mlab.bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0) + Z2 = mlab.bivariate_normal(X, Y, 1.5, 0.5, 1, 1) + Z = Z2-Z1 # difference of Gaussians + return Z + +def imshow_affine(ax, z, *kl, **kwargs): + im = ax.imshow(z, *kl, **kwargs) + x1, x2, y1, y2 = im.get_extent() + im._image_skew_coordinate = (x2, y1) + return im + + +if 1: + + # image rotation + + ax1 = plt.subplot(121) + Z = get_image() + im1 = imshow_affine(ax1, Z, interpolation='nearest', cmap=cm.jet, + origin='lower', + extent=[-2, 4, -3, 2], clip_on=True) + + trans_data2 = mtransforms.Affine2D().rotate_deg(30) + ax1.transData + im1.set_transform(trans_data2) + + # display intended extent of the image + x1, x2, y1, y2 = im1.get_extent() + x3, y3 = x2, y1 + + ax1.plot([x1, x2, x2, x1, x1], [y1, y1, y2, y2, y1], "r--", lw=3, + transform=trans_data2) + + ax1.set_xlim(-3, 5) + ax1.set_ylim(-4, 4) + + + # image skew + + ax2 = plt.subplot(122) + im2 = ax2.imshow(Z, interpolation='nearest', cmap=cm.jet, + origin='lower', + extent=[-2, 4, -3, 2], clip_on=True) + im2._image_skew_coordinate = (3, -2) + + + plt.show() + #plt.savefig("demo_affine_image") diff -Nru matplotlib-0.99.3/doc/mpl_examples/api/engineering_formatter.py matplotlib-1.0.1/doc/mpl_examples/api/engineering_formatter.py --- matplotlib-0.99.3/doc/mpl_examples/api/engineering_formatter.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/api/engineering_formatter.py 2010-07-07 01:41:55.000000000 +0000 @@ -0,0 +1,19 @@ +''' +Demo to show use of the engineering Formatter. +''' + +import matplotlib.pyplot as plt +import numpy as np + +from matplotlib.ticker import EngFormatter + +ax = plt.subplot(111) +ax.set_xscale('log') +formatter = EngFormatter(unit='Hz', places=1) +ax.xaxis.set_major_formatter(formatter) + +xs = np.logspace(1, 9, 100) +ys = (0.8 + 0.4 * np.random.uniform(size=100)) * np.log10(xs)**2 +ax.plot(xs, ys) + +plt.show() diff -Nru matplotlib-0.99.3/doc/mpl_examples/api/font_file.py matplotlib-1.0.1/doc/mpl_examples/api/font_file.py --- matplotlib-0.99.3/doc/mpl_examples/api/font_file.py 2009-07-31 15:14:49.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/api/font_file.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,19 +1,40 @@ -# -*- noplot -*- -""" -Although it is usually not a good idea to explicitly point to a single -ttf file for a font instance, you can do so using the -font_manager.FontProperties fname argument (for a more flexible -solution, see the font_fmaily_rc.py and fonts_demo.py examples). -""" -import matplotlib.font_manager as fm - -import matplotlib.pyplot as plt - -fig = plt.figure() -ax = fig.add_subplot(111) -ax.plot([1,2,3]) - -prop = fm.FontProperties(fname='/Library/Fonts/Tahoma.ttf') -ax.set_title('this is a special font', fontproperties=prop) -plt.show() - +# -*- noplot -*- +""" +Although it is usually not a good idea to explicitly point to a single +ttf file for a font instance, you can do so using the +font_manager.FontProperties fname argument (for a more flexible +solution, see the font_fmaily_rc.py and fonts_demo.py examples). +""" +import sys +import os +import matplotlib.font_manager as fm + +import matplotlib.pyplot as plt + +fig = plt.figure() +ax = fig.add_subplot(111) +ax.plot([1,2,3]) + +if sys.platform == 'win32': + fpath = 'C:\\Windows\\Fonts\\Tahoma.ttf' +elif sys.platform == 'linux2': + fonts = ['/usr/share/fonts/truetype/freefont/FreeSansBoldOblique.ttf', + '/usr/share/fonts/truetype/ttf-liberation/LiberationSans-BoldItalic.ttf', + '/usr/share/fonts/truetype/msttcorefonts/Comic_Sans_MS.ttf', + ] + for fpath in fonts: + if os.path.exists(fpath): + break +else: + fpath = '/Library/Fonts/Tahoma.ttf' + +if os.path.exists(fpath): + prop = fm.FontProperties(fname=fpath) + fname = os.path.split(fpath)[1] + ax.set_title('this is a special font: %s' % fname, fontproperties=prop) +else: + ax.set_title('Demo fails--cannot find a demo font') +ax.set_xlabel('This is the default font') + +plt.show() + diff -Nru matplotlib-0.99.3/doc/mpl_examples/api/hinton_demo.py matplotlib-1.0.1/doc/mpl_examples/api/hinton_demo.py --- matplotlib-0.99.3/doc/mpl_examples/api/hinton_demo.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/api/hinton_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -0,0 +1,60 @@ +#Initial idea from David Warde-Farley on the SciPy Cookbook +import numpy as np +import matplotlib.pyplot as plt +from matplotlib.patches import Rectangle +from matplotlib.ticker import NullLocator +#from matplotlib.collections import RegularPolyCollection +#from matplotlib.colors import BoundaryNorm, ListedColormap + +def hinton(W, maxWeight=None, ax=None): + """ + Draws a Hinton diagram for visualizing a weight matrix. + """ + if not ax: + fig = plt.figure() + ax = fig.add_subplot(1, 1, 1) + + if not maxWeight: + maxWeight = 2**np.ceil(np.log(np.abs(W).max())/np.log(2)) + + ax.patch.set_facecolor('gray') + ax.set_aspect('equal', 'box') + ax.xaxis.set_major_locator(NullLocator()) + ax.yaxis.set_major_locator(NullLocator()) + + for (x,y),w in np.ndenumerate(W): + if w > 0: color = 'white' + else: color = 'black' + size = np.sqrt(np.abs(w)) + rect = Rectangle([x - size / 2, y - size / 2], size, size, + facecolor=color, edgecolor=color) + ax.add_patch(rect) + ax.autoscale_view() + + # Reverse the yaxis limits + ax.set_ylim(*ax.get_ylim()[::-1]) + +## Potential way using polygon collections that just has an issue with +## easily getting the squares scaled by the data. + +# height,width = W.shape +# x = np.arange(width) +# y = np.arange(height) +# X,Y = np.meshgrid(x, y) +# xy = np.array([X.flatten(),Y.flatten()]).T +# scaled_data = W.flatten() / maxWeight +# cmap = ListedColormap(['black', 'white']) +# norm = BoundaryNorm([-1., 0., 1.], cmap.N) + +# rect_col = RegularPolyCollection(4, rotation=np.pi/4, +# sizes=np.abs(scaled_data) * 72 / ax.figure.get_dpi(), offsets=xy, +# transOffset=ax.transData, norm=norm, cmap=cmap, edgecolor='none') +# ax.add_collection(rect_col) +# rect_col.set_array(scaled_data) +# ax.autoscale_view() + +if __name__ == '__main__': + hinton(np.random.rand(20, 20) - 0.5) + plt.title('Hinton Example') + plt.show() + diff -Nru matplotlib-0.99.3/doc/mpl_examples/api/sankey_demo.py matplotlib-1.0.1/doc/mpl_examples/api/sankey_demo.py --- matplotlib-0.99.3/doc/mpl_examples/api/sankey_demo.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/api/sankey_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -0,0 +1,188 @@ +#!/usr/bin/env python + +__author__ = "Yannick Copin " +__version__ = "Time-stamp: <10/02/2010 16:49 ycopin@lyopc548.in2p3.fr>" + +import numpy as N + +def sankey(ax, + outputs=[100.], outlabels=None, + inputs=[100.], inlabels='', + dx=40, dy=10, outangle=45, w=3, inangle=30, offset=2, **kwargs): + """Draw a Sankey diagram. + + outputs: array of outputs, should sum up to 100% + outlabels: output labels (same length as outputs), + or None (use default labels) or '' (no labels) + inputs and inlabels: similar for inputs + dx: horizontal elongation + dy: vertical elongation + outangle: output arrow angle [deg] + w: output arrow shoulder + inangle: input dip angle + offset: text offset + **kwargs: propagated to Patch (e.g. fill=False) + + Return (patch,[intexts,outtexts]).""" + + import matplotlib.patches as mpatches + from matplotlib.path import Path + + outs = N.absolute(outputs) + outsigns = N.sign(outputs) + outsigns[-1] = 0 # Last output + + ins = N.absolute(inputs) + insigns = N.sign(inputs) + insigns[0] = 0 # First input + + assert sum(outs)==100, "Outputs don't sum up to 100%" + assert sum(ins)==100, "Inputs don't sum up to 100%" + + def add_output(path, loss, sign=1): + h = (loss/2+w)*N.tan(outangle/180.*N.pi) # Arrow tip height + move,(x,y) = path[-1] # Use last point as reference + if sign==0: # Final loss (horizontal) + path.extend([(Path.LINETO,[x+dx,y]), + (Path.LINETO,[x+dx,y+w]), + (Path.LINETO,[x+dx+h,y-loss/2]), # Tip + (Path.LINETO,[x+dx,y-loss-w]), + (Path.LINETO,[x+dx,y-loss])]) + outtips.append((sign,path[-3][1])) + else: # Intermediate loss (vertical) + path.extend([(Path.CURVE4,[x+dx/2,y]), + (Path.CURVE4,[x+dx,y]), + (Path.CURVE4,[x+dx,y+sign*dy]), + (Path.LINETO,[x+dx-w,y+sign*dy]), + (Path.LINETO,[x+dx+loss/2,y+sign*(dy+h)]), # Tip + (Path.LINETO,[x+dx+loss+w,y+sign*dy]), + (Path.LINETO,[x+dx+loss,y+sign*dy]), + (Path.CURVE3,[x+dx+loss,y-sign*loss]), + (Path.CURVE3,[x+dx/2+loss,y-sign*loss])]) + outtips.append((sign,path[-5][1])) + + def add_input(path, gain, sign=1): + h = (gain/2)*N.tan(inangle/180.*N.pi) # Dip depth + move,(x,y) = path[-1] # Use last point as reference + if sign==0: # First gain (horizontal) + path.extend([(Path.LINETO,[x-dx,y]), + (Path.LINETO,[x-dx+h,y+gain/2]), # Dip + (Path.LINETO,[x-dx,y+gain])]) + xd,yd = path[-2][1] # Dip position + indips.append((sign,[xd-h,yd])) + else: # Intermediate gain (vertical) + path.extend([(Path.CURVE4,[x-dx/2,y]), + (Path.CURVE4,[x-dx,y]), + (Path.CURVE4,[x-dx,y+sign*dy]), + (Path.LINETO,[x-dx-gain/2,y+sign*(dy-h)]), # Dip + (Path.LINETO,[x-dx-gain,y+sign*dy]), + (Path.CURVE3,[x-dx-gain,y-sign*gain]), + (Path.CURVE3,[x-dx/2-gain,y-sign*gain])]) + xd,yd = path[-4][1] # Dip position + indips.append((sign,[xd,yd+sign*h])) + + outtips = [] # Output arrow tip dir. and positions + urpath = [(Path.MOVETO,[0,100])] # 1st point of upper right path + lrpath = [(Path.LINETO,[0,0])] # 1st point of lower right path + for loss,sign in zip(outs,outsigns): + add_output(sign>=0 and urpath or lrpath, loss, sign=sign) + + indips = [] # Input arrow tip dir. and positions + llpath = [(Path.LINETO,[0,0])] # 1st point of lower left path + ulpath = [(Path.MOVETO,[0,100])] # 1st point of upper left path + for gain,sign in zip(ins,insigns)[::-1]: + add_input(sign<=0 and llpath or ulpath, gain, sign=sign) + + def revert(path): + """A path is not just revertable by path[::-1] because of Bezier + curves.""" + rpath = [] + nextmove = Path.LINETO + for move,pos in path[::-1]: + rpath.append((nextmove,pos)) + nextmove = move + return rpath + + # Concatenate subpathes in correct order + path = urpath + revert(lrpath) + llpath + revert(ulpath) + + codes,verts = zip(*path) + verts = N.array(verts) + + # Path patch + path = Path(verts,codes) + patch = mpatches.PathPatch(path, **kwargs) + ax.add_patch(patch) + + if False: # DEBUG + print "urpath", urpath + print "lrpath", revert(lrpath) + print "llpath", llpath + print "ulpath", revert(ulpath) + + xs,ys = zip(*verts) + ax.plot(xs,ys,'go-') + + # Labels + + def set_labels(labels,values): + """Set or check labels according to values.""" + if labels=='': # No labels + return labels + elif labels is None: # Default labels + return [ '%2d%%' % val for val in values ] + else: + assert len(labels)==len(values) + return labels + + def put_labels(labels,positions,output=True): + """Put labels to positions.""" + texts = [] + lbls = output and labels or labels[::-1] + for i,label in enumerate(lbls): + s,(x,y) = positions[i] # Label direction and position + if s==0: + t = ax.text(x+offset,y,label, + ha=output and 'left' or 'right', va='center') + elif s>0: + t = ax.text(x,y+offset,label, ha='center', va='bottom') + else: + t = ax.text(x,y-offset,label, ha='center', va='top') + texts.append(t) + return texts + + outlabels = set_labels(outlabels, outs) + outtexts = put_labels(outlabels, outtips, output=True) + + inlabels = set_labels(inlabels, ins) + intexts = put_labels(inlabels, indips, output=False) + + # Axes management + ax.set_xlim(verts[:,0].min()-dx, verts[:,0].max()+dx) + ax.set_ylim(verts[:,1].min()-dy, verts[:,1].max()+dy) + ax.set_aspect('equal', adjustable='datalim') + + return patch,[intexts,outtexts] + +if __name__=='__main__': + + import matplotlib.pyplot as P + + outputs = [10.,-20.,5.,15.,-10.,40.] + outlabels = ['First','Second','Third','Fourth','Fifth','Hurray!'] + outlabels = [ s+'\n%d%%' % abs(l) for l,s in zip(outputs,outlabels) ] + + inputs = [60.,-25.,15.] + + fig = P.figure() + ax = fig.add_subplot(1,1,1, xticks=[],yticks=[], + title="Sankey diagram" + ) + + patch,(intexts,outtexts) = sankey(ax, outputs=outputs, outlabels=outlabels, + inputs=inputs, inlabels=None, + fc='g', alpha=0.2) + outtexts[1].set_color('r') + outtexts[-1].set_fontweight('bold') + + P.show() diff -Nru matplotlib-0.99.3/doc/mpl_examples/api/span_regions.py matplotlib-1.0.1/doc/mpl_examples/api/span_regions.py --- matplotlib-0.99.3/doc/mpl_examples/api/span_regions.py 2009-07-31 15:14:49.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/api/span_regions.py 2010-07-07 01:41:55.000000000 +0000 @@ -21,11 +21,11 @@ ax.axhline(0, color='black', lw=2) collection = collections.BrokenBarHCollection.span_where( - t, ymin=0, ymax=1, where=s1>0, facecolor='green', alpha=0.5) + t, ymin=0, ymax=1, where=s1>0, facecolor='green', alpha=0.5) ax.add_collection(collection) collection = collections.BrokenBarHCollection.span_where( - t, ymin=-1, ymax=0, where=s1<0, facecolor='red', alpha=0.5) + t, ymin=-1, ymax=0, where=s1<0, facecolor='red', alpha=0.5) ax.add_collection(collection) diff -Nru matplotlib-0.99.3/doc/mpl_examples/api/watermark_image.py matplotlib-1.0.1/doc/mpl_examples/api/watermark_image.py --- matplotlib-0.99.3/doc/mpl_examples/api/watermark_image.py 2009-07-31 15:14:49.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/api/watermark_image.py 2010-07-07 01:41:55.000000000 +0000 @@ -3,12 +3,13 @@ """ import numpy as np import matplotlib -matplotlib.use('Agg') - +import matplotlib.cbook as cbook import matplotlib.image as image import matplotlib.pyplot as plt -im = image.imread('../data/logo2.png') +datafile = cbook.get_sample_data('logo2.png', asfileobj=False) +print 'loading', datafile +im = image.imread(datafile) im[:,:,-1] = 0.5 # set the alpha channel fig = plt.figure() diff -Nru matplotlib-0.99.3/doc/mpl_examples/axes_grid/demo_axes_divider.py matplotlib-1.0.1/doc/mpl_examples/axes_grid/demo_axes_divider.py --- matplotlib-0.99.3/doc/mpl_examples/axes_grid/demo_axes_divider.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/axes_grid/demo_axes_divider.py 2010-07-07 01:41:54.000000000 +0000 @@ -1,6 +1,13 @@ import matplotlib.pyplot as plt -from demo_image import get_demo_image -#import mpl_toolkits.imaging.axes_grid as imaging + +def get_demo_image(): + import numpy as np + from matplotlib.cbook import get_sample_data + f = get_sample_data("axes_grid/bivariate_normal.npy", asfileobj=False) + z = np.load(f) + # z is a numpy array of 15x15 + return z, (-3,4,-4,3) + def demo_simple_image(ax): Z, extent = get_demo_image() @@ -12,7 +19,7 @@ def demo_locatable_axes_hard(fig1): - from mpl_toolkits.axes_grid \ + from mpl_toolkits.axes_grid1 \ import SubplotDivider, LocatableAxes, Size divider = SubplotDivider(fig1, 2, 2, 2, aspect=True) @@ -50,7 +57,7 @@ def demo_locatable_axes_easy(ax): - from mpl_toolkits.axes_grid import make_axes_locatable + from mpl_toolkits.axes_grid1 import make_axes_locatable divider = make_axes_locatable(ax) @@ -69,7 +76,7 @@ def demo_images_side_by_sied(ax): - from mpl_toolkits.axes_grid import make_axes_locatable + from mpl_toolkits.axes_grid1 import make_axes_locatable divider = make_axes_locatable(ax) @@ -119,6 +126,4 @@ plt.show() - -if __name__ == "__main__": - demo() +demo() diff -Nru matplotlib-0.99.3/doc/mpl_examples/axes_grid/demo_axes_grid2.py matplotlib-1.0.1/doc/mpl_examples/axes_grid/demo_axes_grid2.py --- matplotlib-0.99.3/doc/mpl_examples/axes_grid/demo_axes_grid2.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/axes_grid/demo_axes_grid2.py 2010-07-07 01:41:54.000000000 +0000 @@ -0,0 +1,113 @@ +import matplotlib.pyplot as plt +from mpl_toolkits.axes_grid1 import ImageGrid +import numpy as np + +def get_demo_image(): + from matplotlib.cbook import get_sample_data + f = get_sample_data("axes_grid/bivariate_normal.npy", asfileobj=False) + z = np.load(f) + # z is a numpy array of 15x15 + return z, (-3,4,-4,3) + + +def add_inner_title(ax, title, loc, size=None, **kwargs): + from matplotlib.offsetbox import AnchoredText + from matplotlib.patheffects import withStroke + if size is None: + size = dict(size=plt.rcParams['legend.fontsize']) + at = AnchoredText(title, loc=loc, prop=size, + pad=0., borderpad=0.5, + frameon=False, **kwargs) + ax.add_artist(at) + at.txt._text.set_path_effects([withStroke(foreground="w", linewidth=3)]) + return at + +if 1: + F = plt.figure(1, (6, 6)) + F.clf() + + # prepare images + Z, extent = get_demo_image() + ZS = [Z[i::3,:] for i in range(3)] + extent = extent[0], extent[1]/3., extent[2], extent[3] + + # demo 1 : colorbar at each axes + + grid = ImageGrid(F, 211, # similar to subplot(111) + nrows_ncols = (1, 3), + direction="row", + axes_pad = 0.05, + add_all=True, + label_mode = "1", + share_all = True, + cbar_location="top", + cbar_mode="each", + cbar_size="7%", + cbar_pad="1%", + ) + + + for ax, z in zip(grid, ZS): + im = ax.imshow(z, origin="lower", extent=extent, interpolation="nearest") + ax.cax.colorbar(im) + + for ax, im_title in zip(grid, ["Image 1", "Image 2", "Image 3"]): + t = add_inner_title(ax, im_title, loc=3) + t.patch.set_alpha(0.5) + + for ax, z in zip(grid, ZS): + ax.cax.toggle_label(True) + #axis = ax.cax.axis[ax.cax.orientation] + #axis.label.set_text("counts s$^{-1}$") + #axis.label.set_size(10) + #axis.major_ticklabels.set_size(6) + + # changing the colorbar ticks + grid[1].cax.set_xticks([-1, 0, 1]) + grid[2].cax.set_xticks([-1, 0, 1]) + + grid[0].set_xticks([-2, 0]) + grid[0].set_yticks([-2, 0, 2]) + + + # demo 2 : shared colorbar + + grid2 = ImageGrid(F, 212, + nrows_ncols = (1, 3), + direction="row", + axes_pad = 0.05, + add_all=True, + label_mode = "1", + share_all = True, + cbar_location="right", + cbar_mode="single", + cbar_size="10%", + cbar_pad=0.05, + ) + + grid2[0].set_xlabel("X") + grid2[0].set_ylabel("Y") + + vmax, vmin = np.max(ZS), np.min(ZS) + import matplotlib.colors + norm = matplotlib.colors.normalize(vmax=vmax, vmin=vmin) + + for ax, z in zip(grid2, ZS): + im = ax.imshow(z, norm=norm, + origin="lower", extent=extent, + interpolation="nearest") + + # With cbar_mode="single", cax attribute of all axes are identical. + ax.cax.colorbar(im) + ax.cax.toggle_label(True) + + for ax, im_title in zip(grid2, ["(a)", "(b)", "(c)"]): + t = add_inner_title(ax, im_title, loc=2) + t.patch.set_ec("none") + t.patch.set_alpha(0.5) + + grid2[0].set_xticks([-2, 0]) + grid2[0].set_yticks([-2, 0, 2]) + + plt.draw() + plt.show() diff -Nru matplotlib-0.99.3/doc/mpl_examples/axes_grid/demo_axes_grid.py matplotlib-1.0.1/doc/mpl_examples/axes_grid/demo_axes_grid.py --- matplotlib-0.99.3/doc/mpl_examples/axes_grid/demo_axes_grid.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/axes_grid/demo_axes_grid.py 2010-07-07 01:41:54.000000000 +0000 @@ -1,7 +1,13 @@ import matplotlib.pyplot as plt -from demo_image import get_demo_image -from mpl_toolkits.axes_grid import AxesGrid +from mpl_toolkits.axes_grid1 import AxesGrid +def get_demo_image(): + import numpy as np + from matplotlib.cbook import get_sample_data + f = get_sample_data("axes_grid/bivariate_normal.npy", asfileobj=False) + z = np.load(f) + # z is a numpy array of 15x15 + return z, (-3,4,-4,3) def demo_simple_grid(fig): """ @@ -32,15 +38,19 @@ axes_pad = 0.0, share_all=True, label_mode = "L", + cbar_location = "top", cbar_mode="single", ) Z, extent = get_demo_image() for i in range(4): im = grid[i].imshow(Z, extent=extent, interpolation="nearest") - plt.colorbar(im, cax = grid.cbar_axes[0]) + #plt.colorbar(im, cax = grid.cbar_axes[0]) grid.cbar_axes[0].colorbar(im) + for cax in grid.cbar_axes: + cax.toggle_label(False) + # This affects all axes as share_all = True. grid.axes_llc.set_xticks([-2, 0, 2]) grid.axes_llc.set_yticks([-2, 0, 2]) @@ -66,14 +76,16 @@ im = grid[i].imshow(Z, extent=extent, interpolation="nearest") grid.cbar_axes[i].colorbar(im) + for cax in grid.cbar_axes: + cax.toggle_label(False) + # This affects all axes because we set share_all = True. grid.axes_llc.set_xticks([-2, 0, 2]) grid.axes_llc.set_yticks([-2, 0, 2]) -if __name__ == "__main__": - +if 1: F = plt.figure(1, (5.5, 2.5)) F.subplots_adjust(left=0.05, right=0.98) diff -Nru matplotlib-0.99.3/doc/mpl_examples/axes_grid/demo_axes_rgb.py matplotlib-1.0.1/doc/mpl_examples/axes_grid/demo_axes_rgb.py --- matplotlib-0.99.3/doc/mpl_examples/axes_grid/demo_axes_rgb.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/axes_grid/demo_axes_rgb.py 2010-07-07 01:41:54.000000000 +0000 @@ -1,8 +1,16 @@ import numpy as np import matplotlib.pyplot as plt -from demo_axes_divider import get_demo_image -from mpl_toolkits.axes_grid.axes_rgb import make_rgb_axes, RGBAxes +from mpl_toolkits.axes_grid1.axes_rgb import make_rgb_axes, RGBAxes + +def get_demo_image(): + from matplotlib.cbook import get_sample_data + f = get_sample_data("axes_grid/bivariate_normal.npy", asfileobj=False) + z = np.load(f) + # z is a numpy array of 15x15 + return z, (-3,4,-4,3) + + def get_rgb(): Z, extent = get_demo_image() @@ -67,16 +75,16 @@ ax.RGB.set_ylim(0.9, 10.6) for ax1 in [ax.RGB, ax.R, ax.G, ax.B]: - for axisline in ax1._axislines.values(): - axisline.line.set_color("w") - axisline.major_ticks.set_mec("w") + for sp1 in ax1.spines.values(): + sp1.set_color("w") + for tick in ax1.xaxis.get_major_ticks() + ax1.yaxis.get_major_ticks(): + tick.tick1line.set_mec("w") + tick.tick2line.set_mec("w") return ax -if __name__ == "__main__": - demo_rgb() - ax = demo_rgb2() +demo_rgb() +ax = demo_rgb2() - plt.draw() - plt.show() +plt.show() diff -Nru matplotlib-0.99.3/doc/mpl_examples/axes_grid/demo_axisline_style.py matplotlib-1.0.1/doc/mpl_examples/axes_grid/demo_axisline_style.py --- matplotlib-0.99.3/doc/mpl_examples/axes_grid/demo_axisline_style.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/axes_grid/demo_axisline_style.py 2010-07-07 01:41:54.000000000 +0000 @@ -0,0 +1,21 @@ + +from mpl_toolkits.axes_grid.axislines import SubplotZero +import matplotlib.pyplot as plt +import numpy as np + +if 1: + fig = plt.figure(1) + ax = SubplotZero(fig, 111) + fig.add_subplot(ax) + + for direction in ["xzero", "yzero"]: + ax.axis[direction].set_axisline_style("-|>") + ax.axis[direction].set_visible(True) + + for direction in ["left", "right", "bottom", "top"]: + ax.axis[direction].set_visible(False) + + x = np.linspace(-0.5, 1., 100) + ax.plot(x, np.sin(x*np.pi)) + + plt.show() diff -Nru matplotlib-0.99.3/doc/mpl_examples/axes_grid/demo_colorbar_with_inset_locator.py matplotlib-1.0.1/doc/mpl_examples/axes_grid/demo_colorbar_with_inset_locator.py --- matplotlib-0.99.3/doc/mpl_examples/axes_grid/demo_colorbar_with_inset_locator.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/axes_grid/demo_colorbar_with_inset_locator.py 2010-07-07 01:41:54.000000000 +0000 @@ -0,0 +1,39 @@ +import matplotlib.pyplot as plt + +from mpl_toolkits.axes_grid1.inset_locator import inset_axes + +fig = plt.figure(1, [6, 3]) + +# first subplot +ax1 = fig.add_subplot(121) + +axins1 = inset_axes(ax1, + width="50%", # width = 10% of parent_bbox width + height="5%", # height : 50% + loc=1) + +im1=ax1.imshow([[1,2],[2, 3]]) +plt.colorbar(im1, cax=axins1, orientation="horizontal", ticks=[1,2,3]) +axins1.xaxis.set_ticks_position("bottom") + +# first subplot +ax = fig.add_subplot(122) + +axins = inset_axes(ax, + width="5%", # width = 10% of parent_bbox width + height="50%", # height : 50% + loc=3, + bbox_to_anchor=(1.05, 0., 1, 1), + bbox_transform=ax.transAxes, + borderpad=0, + ) + +# Controlling the placement of the inset axes is basically same as that +# of the legend. you may want to play with the borderpad value and +# the bbox_to_anchor coordinate. + +im=ax.imshow([[1,2],[2, 3]]) +plt.colorbar(im, cax=axins, ticks=[1,2,3]) + +plt.draw() +plt.show() diff -Nru matplotlib-0.99.3/doc/mpl_examples/axes_grid/demo_curvelinear_grid2.py matplotlib-1.0.1/doc/mpl_examples/axes_grid/demo_curvelinear_grid2.py --- matplotlib-0.99.3/doc/mpl_examples/axes_grid/demo_curvelinear_grid2.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/axes_grid/demo_curvelinear_grid2.py 2010-07-07 01:41:54.000000000 +0000 @@ -0,0 +1,63 @@ +import numpy as np +#from matplotlib.path import Path + +import matplotlib.pyplot as plt + +from mpl_toolkits.axes_grid.grid_helper_curvelinear import GridHelperCurveLinear +from mpl_toolkits.axes_grid.axislines import Subplot + +import mpl_toolkits.axes_grid.angle_helper as angle_helper + +def curvelinear_test1(fig): + """ + grid for custom transform. + """ + + def tr(x, y): + sgn = np.sign(x) + x, y = np.abs(np.asarray(x)), np.asarray(y) + return sgn*x**.5, y + + def inv_tr(x,y): + sgn = np.sign(x) + x, y = np.asarray(x), np.asarray(y) + return sgn*x**2, y + + extreme_finder = angle_helper.ExtremeFinderCycle(20, 20, + lon_cycle = None, + lat_cycle = None, + lon_minmax = None, #(0, np.inf), + lat_minmax = None, + ) + + grid_helper = GridHelperCurveLinear((tr, inv_tr), + extreme_finder=extreme_finder) + + ax1 = Subplot(fig, 111, grid_helper=grid_helper) + # ax1 will have a ticks and gridlines defined by the given + # transform (+ transData of the Axes). Note that the transform of + # the Axes itself (i.e., transData) is not affected by the given + # transform. + + fig.add_subplot(ax1) + + ax1.imshow(np.arange(25).reshape(5,5), + vmax = 50, cmap=plt.cm.gray_r, + interpolation="nearest", + origin="lower") + + # tick density + grid_helper.grid_finder.grid_locator1._nbins = 6 + grid_helper.grid_finder.grid_locator2._nbins = 6 + + + +if 1: + fig = plt.figure(1, figsize=(7, 4)) + fig.clf() + + curvelinear_test1(fig) + plt.show() + + + diff -Nru matplotlib-0.99.3/doc/mpl_examples/axes_grid/demo_curvelinear_grid.py matplotlib-1.0.1/doc/mpl_examples/axes_grid/demo_curvelinear_grid.py --- matplotlib-0.99.3/doc/mpl_examples/axes_grid/demo_curvelinear_grid.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/axes_grid/demo_curvelinear_grid.py 2010-07-07 01:41:54.000000000 +0000 @@ -4,10 +4,10 @@ import matplotlib.pyplot as plt import matplotlib.cbook as cbook -from mpl_toolkits.axes_grid.grid_helper_curvelinear import GridHelperCurveLinear -from mpl_toolkits.axes_grid.axislines import Subplot +from mpl_toolkits.axisartist.grid_helper_curvelinear import GridHelperCurveLinear +from mpl_toolkits.axisartist import Subplot -from mpl_toolkits.axes_grid.parasite_axes import SubplotHost, \ +from mpl_toolkits.axisartist import SubplotHost, \ ParasiteAxesAuxTrans @@ -42,11 +42,13 @@ ax1.set_xlim(0, 10.) ax1.set_ylim(0, 10.) + ax1.axis["t"]=ax1.new_floating_axis(0, 3.) + ax1.axis["t2"]=ax1.new_floating_axis(1, 7.) ax1.grid(True) -import mpl_toolkits.axes_grid.angle_helper as angle_helper +import mpl_toolkits.axisartist.angle_helper as angle_helper from matplotlib.projections import PolarAxes from matplotlib.transforms import Affine2D diff -Nru matplotlib-0.99.3/doc/mpl_examples/axes_grid/demo_fixed_size_axes.py matplotlib-1.0.1/doc/mpl_examples/axes_grid/demo_fixed_size_axes.py --- matplotlib-0.99.3/doc/mpl_examples/axes_grid/demo_fixed_size_axes.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/axes_grid/demo_fixed_size_axes.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,57 +0,0 @@ -import matplotlib.pyplot as plt - -from mpl_toolkits.axes_grid \ - import Divider, LocatableAxes, Size - -def demo_fixed_size_axes(): - - fig1 = plt.figure(1, (6, 6)) - - # The first items are for padding and the second items are for the axes. - # sizes are in inch. - h = [Size.Fixed(1.0), Size.Fixed(4.5)] - v = [Size.Fixed(0.7), Size.Fixed(5.)] - - divider = Divider(fig1, (0.0, 0.0, 1., 1.), h, v, aspect=False) - # the width and height of the rectangle is ignored. - - ax = LocatableAxes(fig1, divider.get_position()) - ax.set_axes_locator(divider.new_locator(nx=1, ny=1)) - - fig1.add_axes(ax) - - ax.plot([1,2,3]) - - - - -def demo_fixed_pad_axes(): - - fig = plt.figure(2, (6, 6)) - - # The first & third items are for padding and the second items are for the axes. - # sizes are in inch. - h = [Size.Fixed(1.0), Size.Scaled(1.), Size.Fixed(.2),] - v = [Size.Fixed(0.7), Size.Scaled(1.), Size.Fixed(.5),] - - divider = Divider(fig, (0.0, 0.0, 1., 1.), h, v, aspect=False) - # the width and height of the rectangle is ignored. - - ax = LocatableAxes(fig, divider.get_position()) - ax.set_axes_locator(divider.new_locator(nx=1, ny=1)) - - fig.add_axes(ax) - - ax.plot([1,2,3]) - - - - - - -if __name__ == "__main__": - demo_fixed_size_axes() - demo_fixed_pad_axes() - - plt.draw() - plt.show() diff -Nru matplotlib-0.99.3/doc/mpl_examples/axes_grid/demo_floating_axes.py matplotlib-1.0.1/doc/mpl_examples/axes_grid/demo_floating_axes.py --- matplotlib-0.99.3/doc/mpl_examples/axes_grid/demo_floating_axes.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/axes_grid/demo_floating_axes.py 2010-07-07 01:41:54.000000000 +0000 @@ -0,0 +1,154 @@ +from matplotlib.transforms import Affine2D + +import mpl_toolkits.axisartist.floating_axes as floating_axes + +import numpy as np +import mpl_toolkits.axisartist.angle_helper as angle_helper +from matplotlib.projections import PolarAxes +from mpl_toolkits.axisartist.grid_finder import FixedLocator, MaxNLocator, \ + DictFormatter + +def setup_axes1(fig, rect): + """ + A simple one. + """ + tr = Affine2D().scale(2, 1).rotate_deg(30) + + grid_helper = floating_axes.GridHelperCurveLinear(tr, extremes=(0, 4, 0, 4)) + + ax1 = floating_axes.FloatingSubplot(fig, rect, grid_helper=grid_helper) + fig.add_subplot(ax1) + + grid_helper.grid_finder.grid_locator1._nbins = 4 + grid_helper.grid_finder.grid_locator2._nbins = 4 + + return ax1 + + +def setup_axes2(fig, rect): + """ + With custom locator and formatter. + Note that the extreme values are swapped. + """ + + #tr_scale = Affine2D().scale(np.pi/180., 1.) + + tr = PolarAxes.PolarTransform() + + pi = np.pi + angle_ticks = [(0, r"$0$"), + (.25*pi, r"$\frac{1}{4}\pi$"), + (.5*pi, r"$\frac{1}{2}\pi$")] + grid_locator1 = FixedLocator([v for v, s in angle_ticks]) + tick_formatter1 = DictFormatter(dict(angle_ticks)) + + grid_locator2 = MaxNLocator(2) + + grid_helper = floating_axes.GridHelperCurveLinear(tr, + extremes=(.5*pi, 0, 2, 1), + grid_locator1=grid_locator1, + grid_locator2=grid_locator2, + tick_formatter1=tick_formatter1, + tick_formatter2=None, + ) + + ax1 = floating_axes.FloatingSubplot(fig, rect, grid_helper=grid_helper) + fig.add_subplot(ax1) + + # create a parasite axes whose transData in RA, cz + aux_ax = ax1.get_aux_axes(tr) + + aux_ax.patch = ax1.patch # for aux_ax to have a clip path as in ax + ax1.patch.zorder=0.9 # but this has a side effect that the patch is + # drawn twice, and possibly over some other + # artists. So, we decrease the zorder a bit to + # prevent this. + + return ax1, aux_ax + + +def setup_axes3(fig, rect): + """ + Sometimes, things like axis_direction need to be adjusted. + """ + + # rotate a bit for better orientation + tr_rotate = Affine2D().translate(-95, 0) + + # scale degree to radians + tr_scale = Affine2D().scale(np.pi/180., 1.) + + tr = tr_rotate + tr_scale + PolarAxes.PolarTransform() + + grid_locator1 = angle_helper.LocatorHMS(4) + tick_formatter1 = angle_helper.FormatterHMS() + + grid_locator2 = MaxNLocator(3) + + ra0, ra1 = 8.*15, 14.*15 + cz0, cz1 = 0, 14000 + grid_helper = floating_axes.GridHelperCurveLinear(tr, + extremes=(ra0, ra1, cz0, cz1), + grid_locator1=grid_locator1, + grid_locator2=grid_locator2, + tick_formatter1=tick_formatter1, + tick_formatter2=None, + ) + + ax1 = floating_axes.FloatingSubplot(fig, rect, grid_helper=grid_helper) + fig.add_subplot(ax1) + + # adjust axis + ax1.axis["left"].set_axis_direction("bottom") + ax1.axis["right"].set_axis_direction("top") + + ax1.axis["bottom"].set_visible(False) + ax1.axis["top"].set_axis_direction("bottom") + ax1.axis["top"].toggle(ticklabels=True, label=True) + ax1.axis["top"].major_ticklabels.set_axis_direction("top") + ax1.axis["top"].label.set_axis_direction("top") + + ax1.axis["left"].label.set_text(r"cz [km$^{-1}$]") + ax1.axis["top"].label.set_text(r"$\alpha_{1950}$") + + + # create a parasite axes whose transData in RA, cz + aux_ax = ax1.get_aux_axes(tr) + + aux_ax.patch = ax1.patch # for aux_ax to have a clip path as in ax + ax1.patch.zorder=0.9 # but this has a side effect that the patch is + # drawn twice, and possibly over some other + # artists. So, we decrease the zorder a bit to + # prevent this. + + return ax1, aux_ax + + + +if 1: + import matplotlib.pyplot as plt + fig = plt.figure(1, figsize=(8, 4)) + fig.subplots_adjust(wspace=0.3, left=0.05, right=0.95) + + ax1 = setup_axes1(fig, 131) + + #theta = np.random.rand(10) #*.5*np.pi + #radius = np.random.rand(10) #+1. + #aux_ax1.scatter(theta, radius) + + + ax2, aux_ax2 = setup_axes2(fig, 132) + + theta = np.random.rand(10)*.5*np.pi + radius = np.random.rand(10)+1. + aux_ax2.scatter(theta, radius) + + + ax3, aux_ax3 = setup_axes3(fig, 133) + + theta = (8 + np.random.rand(10)*(14-8))*15. # indegree + radius = np.random.rand(10)*14000. + aux_ax3.scatter(theta, radius) + + plt.show() + diff -Nru matplotlib-0.99.3/doc/mpl_examples/axes_grid/demo_floating_axis.py matplotlib-1.0.1/doc/mpl_examples/axes_grid/demo_floating_axis.py --- matplotlib-0.99.3/doc/mpl_examples/axes_grid/demo_floating_axis.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/axes_grid/demo_floating_axis.py 2010-07-07 01:41:54.000000000 +0000 @@ -9,13 +9,13 @@ """ global ax1 import numpy as np - import mpl_toolkits.axes_grid.angle_helper as angle_helper + import mpl_toolkits.axisartist.angle_helper as angle_helper from matplotlib.projections import PolarAxes from matplotlib.transforms import Affine2D - from mpl_toolkits.axes_grid.parasite_axes import SubplotHost + from mpl_toolkits.axisartist import SubplotHost - from mpl_toolkits.axes_grid.grid_helper_curvelinear import GridHelperCurveLinear + from mpl_toolkits.axisartist import GridHelperCurveLinear # see demo_curvelinear_grid.py for details tr = Affine2D().scale(np.pi/180., 1.) + PolarAxes.PolarTransform() @@ -60,14 +60,12 @@ ax1.grid(True) -if __name__ == "__main__": - import matplotlib.pyplot as plt - fig = plt.figure(1, figsize=(5, 5)) - fig.clf() +import matplotlib.pyplot as plt +fig = plt.figure(1, figsize=(5, 5)) +fig.clf() - curvelinear_test2(fig) +curvelinear_test2(fig) - plt.draw() - plt.show() +plt.show() diff -Nru matplotlib-0.99.3/doc/mpl_examples/axes_grid/demo_image.py matplotlib-1.0.1/doc/mpl_examples/axes_grid/demo_image.py --- matplotlib-0.99.3/doc/mpl_examples/axes_grid/demo_image.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/axes_grid/demo_image.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -import numpy as np - -def get_demo_image(): - # prepare image - delta = 0.5 - - extent = (-3,4,-4,3) - x = np.arange(-3.0, 4.001, delta) - y = np.arange(-4.0, 3.001, delta) - X, Y = np.meshgrid(x, y) - import matplotlib.mlab as mlab - Z1 = mlab.bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0) - Z2 = mlab.bivariate_normal(X, Y, 1.5, 0.5, 1, 1) - Z = (Z1 - Z2) * 10 - - return Z, extent - diff -Nru matplotlib-0.99.3/doc/mpl_examples/axes_grid/demo_parasite_axes2.py matplotlib-1.0.1/doc/mpl_examples/axes_grid/demo_parasite_axes2.py --- matplotlib-0.99.3/doc/mpl_examples/axes_grid/demo_parasite_axes2.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/axes_grid/demo_parasite_axes2.py 2010-07-07 01:41:54.000000000 +0000 @@ -1,32 +1,24 @@ -from mpl_toolkits.axes_grid.parasite_axes import SubplotHost +from mpl_toolkits.axes_grid1 import host_subplot +import mpl_toolkits.axisartist as AA import matplotlib.pyplot as plt if 1: - fig = plt.figure(1) - host = SubplotHost(fig, 111) - - host.set_ylabel("Density") - host.set_xlabel("Distance") + host = host_subplot(111, axes_class=AA.Axes) + plt.subplots_adjust(right=0.75) par1 = host.twinx() par2 = host.twinx() - par1.set_ylabel("Temperature") - - par2.axis["right"].set_visible(False) + offset = 60 + new_fixed_axis = par2.get_grid_helper().new_fixed_axis + par2.axis["right"] = new_fixed_axis(loc="right", + axes=par2, + offset=(offset, 0)) + + par2.axis["right"].toggle(all=True) - offset = 60, 0 - new_axisline = par2.get_grid_helper().new_fixed_axis - par2.axis["right2"] = new_axisline(loc="right", - axes=par2, - offset=offset) - par2.axis["right2"].label.set_visible(True) - par2.axis["right2"].set_label("Velocity") - - fig.add_axes(host) - plt.subplots_adjust(right=0.75) host.set_xlim(0, 2) host.set_ylim(0, 2) @@ -34,6 +26,7 @@ host.set_xlabel("Distance") host.set_ylabel("Density") par1.set_ylabel("Temperature") + par2.set_ylabel("Velocity") p1, = host.plot([0, 1, 2], [0, 1, 2], label="Density") p2, = par1.plot([0, 1, 2], [0, 3, 2], label="Temperature") @@ -46,7 +39,7 @@ host.axis["left"].label.set_color(p1.get_color()) par1.axis["right"].label.set_color(p2.get_color()) - par2.axis["right2"].label.set_color(p3.get_color()) + par2.axis["right"].label.set_color(p3.get_color()) plt.draw() plt.show() diff -Nru matplotlib-0.99.3/doc/mpl_examples/axes_grid/demo_parasite_axes.py matplotlib-1.0.1/doc/mpl_examples/axes_grid/demo_parasite_axes.py --- matplotlib-0.99.3/doc/mpl_examples/axes_grid/demo_parasite_axes.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/axes_grid/demo_parasite_axes.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,54 +0,0 @@ -from mpl_toolkits.axes_grid.parasite_axes import HostAxes, ParasiteAxes -import matplotlib.pyplot as plt - -if __name__ == "__main__": - fig = plt.figure(1) - - host = HostAxes(fig, [0.15, 0.1, 0.65, 0.8]) - par1 = ParasiteAxes(host, sharex=host) - par2 = ParasiteAxes(host, sharex=host) - host.parasites.append(par1) - host.parasites.append(par2) - - host.set_ylabel("Density") - host.set_xlabel("Distance") - - host.axis["right"].set_visible(False) - par1.axis["right"].set_visible(True) - par1.set_ylabel("Temperature") - - par1.axis["right"].major_ticklabels.set_visible(True) - par1.axis["right"].label.set_visible(True) - - par2.set_ylabel("Velocity") - offset = (60, 0) - new_axisline = par2._grid_helper.new_fixed_axis - par2.axis["right2"] = new_axisline(loc="right", - axes=par2, - offset=offset) - - - fig.add_axes(host) - - host.set_xlim(0, 2) - host.set_ylim(0, 2) - - host.set_xlabel("Distance") - host.set_ylabel("Density") - par1.set_ylabel("Temperature") - - p1, = host.plot([0, 1, 2], [0, 1, 2], label="Density") - p2, = par1.plot([0, 1, 2], [0, 3, 2], label="Temperature") - p3, = par2.plot([0, 1, 2], [50, 30, 15], label="Velocity") - - par1.set_ylim(0, 4) - par2.set_ylim(1, 65) - - host.legend() - - host.axis["left"].label.set_color(p1.get_color()) - par1.axis["right"].label.set_color(p2.get_color()) - par2.axis["right2"].label.set_color(p3.get_color()) - - plt.draw() - plt.show() diff -Nru matplotlib-0.99.3/doc/mpl_examples/axes_grid/inset_locator_demo2.py matplotlib-1.0.1/doc/mpl_examples/axes_grid/inset_locator_demo2.py --- matplotlib-0.99.3/doc/mpl_examples/axes_grid/inset_locator_demo2.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/axes_grid/inset_locator_demo2.py 2010-07-07 01:41:54.000000000 +0000 @@ -1,11 +1,17 @@ import matplotlib.pyplot as plt -from mpl_toolkits.axes_grid.inset_locator import zoomed_inset_axes -from mpl_toolkits.axes_grid.inset_locator import mark_inset +from mpl_toolkits.axes_grid1.inset_locator import zoomed_inset_axes +from mpl_toolkits.axes_grid1.inset_locator import mark_inset import numpy as np -from demo_image import get_demo_image +def get_demo_image(): + from matplotlib.cbook import get_sample_data + import numpy as np + f = get_sample_data("axes_grid/bivariate_normal.npy", asfileobj=False) + z = np.load(f) + # z is a numpy array of 15x15 + return z, (-3,4,-4,3) fig = plt.figure(1, [5,4]) diff -Nru matplotlib-0.99.3/doc/mpl_examples/axes_grid/inset_locator_demo.py matplotlib-1.0.1/doc/mpl_examples/axes_grid/inset_locator_demo.py --- matplotlib-0.99.3/doc/mpl_examples/axes_grid/inset_locator_demo.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/axes_grid/inset_locator_demo.py 2010-07-07 01:41:54.000000000 +0000 @@ -1,7 +1,7 @@ import matplotlib.pyplot as plt -from mpl_toolkits.axes_grid.inset_locator import inset_axes, zoomed_inset_axes -from mpl_toolkits.axes_grid.anchored_artists import AnchoredSizeBar +from mpl_toolkits.axes_grid1.inset_locator import inset_axes, zoomed_inset_axes +from mpl_toolkits.axes_grid1.anchored_artists import AnchoredSizeBar def add_sizebar(ax, size): diff -Nru matplotlib-0.99.3/doc/mpl_examples/axes_grid/parasite_simple2.py matplotlib-1.0.1/doc/mpl_examples/axes_grid/parasite_simple2.py --- matplotlib-0.99.3/doc/mpl_examples/axes_grid/parasite_simple2.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/axes_grid/parasite_simple2.py 2010-07-07 01:41:54.000000000 +0000 @@ -1,6 +1,6 @@ import matplotlib.transforms as mtransforms import matplotlib.pyplot as plt -from mpl_toolkits.axes_grid.parasite_axes import SubplotHost +from mpl_toolkits.axes_grid1.parasite_axes import SubplotHost obs = [["01_S1", 3.88, 0.14, 1970, 63], ["01_S4", 5.6, 0.82, 1622, 150], diff -Nru matplotlib-0.99.3/doc/mpl_examples/axes_grid/parasite_simple.py matplotlib-1.0.1/doc/mpl_examples/axes_grid/parasite_simple.py --- matplotlib-0.99.3/doc/mpl_examples/axes_grid/parasite_simple.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/axes_grid/parasite_simple.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,24 +0,0 @@ -from mpl_toolkits.axes_grid.parasite_axes import SubplotHost -import matplotlib.pyplot as plt - -fig = plt.figure(1) - -host = SubplotHost(fig, 111) -fig.add_subplot(host) - -par = host.twinx() - -host.set_xlabel("Distance") -host.set_ylabel("Density") -par.set_ylabel("Temperature") - -p1, = host.plot([0, 1, 2], [0, 1, 2], label="Density") -p2, = par.plot([0, 1, 2], [0, 3, 2], label="Temperature") - -host.axis["left"].label.set_color(p1.get_color()) -par.axis["right"].label.set_color(p2.get_color()) - -host.legend() - -plt.show() - diff -Nru matplotlib-0.99.3/doc/mpl_examples/axes_grid/scatter_hist.py matplotlib-1.0.1/doc/mpl_examples/axes_grid/scatter_hist.py --- matplotlib-0.99.3/doc/mpl_examples/axes_grid/scatter_hist.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/axes_grid/scatter_hist.py 2010-07-07 01:41:54.000000000 +0000 @@ -8,30 +8,24 @@ fig = plt.figure(1, figsize=(5.5,5.5)) -from mpl_toolkits.axes_grid import make_axes_locatable +from mpl_toolkits.axes_grid1 import make_axes_locatable +# the scatter plot: axScatter = plt.subplot(111) -divider = make_axes_locatable(axScatter) - -# create a new axes with a height of 1.2 inch above the axScatter -axHistx = divider.new_vertical(1.2, pad=0.1, sharex=axScatter) - -# create a new axes with a width of 1.2 inch on the right side of the -# axScatter -axHisty = divider.new_horizontal(1.2, pad=0.1, sharey=axScatter) - -fig.add_axes(axHistx) -fig.add_axes(axHisty) +axScatter.scatter(x, y) +axScatter.set_aspect(1.) +# create new axes on the right and on the top of the current axes +# The first argument of the new_vertical(new_horizontal) method is +# the height (width) of the axes to be created in inches. +divider = make_axes_locatable(axScatter) +axHistx = divider.append_axes("top", 1.2, pad=0.1, sharex=axScatter) +axHisty = divider.append_axes("right", 1.2, pad=0.1, sharey=axScatter) # make some labels invisible plt.setp(axHistx.get_xticklabels() + axHisty.get_yticklabels(), visible=False) -# the scatter plot: -axScatter.scatter(x, y) -axScatter.set_aspect(1.) - # now determine nice limits by hand: binwidth = 0.25 xymax = np.max( [np.max(np.fabs(x)), np.max(np.fabs(y))] ) @@ -57,4 +51,3 @@ plt.draw() plt.show() -#plt.savefig("a.pdf") diff -Nru matplotlib-0.99.3/doc/mpl_examples/axes_grid/simple_anchored_artists.py matplotlib-1.0.1/doc/mpl_examples/axes_grid/simple_anchored_artists.py --- matplotlib-0.99.3/doc/mpl_examples/axes_grid/simple_anchored_artists.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/axes_grid/simple_anchored_artists.py 2010-07-07 01:41:54.000000000 +0000 @@ -2,7 +2,7 @@ def draw_text(ax): - from mpl_toolkits.axes_grid.anchored_artists import AnchoredText + from mpl_toolkits.axes_grid1.anchored_artists import AnchoredText at = AnchoredText("Figure 1a", loc=2, prop=dict(size=8), frameon=True, ) @@ -18,7 +18,7 @@ ax.add_artist(at2) def draw_circle(ax): # circle in the canvas coordinate - from mpl_toolkits.axes_grid.anchored_artists import AnchoredDrawingArea + from mpl_toolkits.axes_grid1.anchored_artists import AnchoredDrawingArea from matplotlib.patches import Circle ada = AnchoredDrawingArea(20, 20, 0, 0, loc=1, pad=0., frameon=False) @@ -27,7 +27,7 @@ ax.add_artist(ada) def draw_ellipse(ax): - from mpl_toolkits.axes_grid.anchored_artists import AnchoredEllipse + from mpl_toolkits.axes_grid1.anchored_artists import AnchoredEllipse # draw an ellipse of width=0.1, height=0.15 in the data coordinate ae = AnchoredEllipse(ax.transData, width=0.1, height=0.15, angle=0., loc=3, pad=0.5, borderpad=0.4, frameon=True) @@ -35,7 +35,7 @@ ax.add_artist(ae) def draw_sizebar(ax): - from mpl_toolkits.axes_grid.anchored_artists import AnchoredSizeBar + from mpl_toolkits.axes_grid1.anchored_artists import AnchoredSizeBar # draw a horizontal bar with length of 0.1 in Data coordinate # (ax.transData) with a label underneath. asb = AnchoredSizeBar(ax.transData, diff -Nru matplotlib-0.99.3/doc/mpl_examples/axes_grid/simple_axes_divider1.py matplotlib-1.0.1/doc/mpl_examples/axes_grid/simple_axes_divider1.py --- matplotlib-0.99.3/doc/mpl_examples/axes_grid/simple_axes_divider1.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/axes_grid/simple_axes_divider1.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,30 +0,0 @@ -from mpl_toolkits.axes_grid import Size, Divider -import matplotlib.pyplot as plt - - -fig1 = plt.figure(1, (6, 6)) - -# fixed size in inch -horiz = [Size.Fixed(1.), Size.Fixed(.5), Size.Fixed(1.5), - Size.Fixed(.5)] -vert = [Size.Fixed(1.5), Size.Fixed(.5), Size.Fixed(1.)] - -rect = (0.1, 0.1, 0.8, 0.8) -# divide the axes rectangle into grid whose size is specified by horiz * vert -divider = Divider(fig1, rect, horiz, vert, aspect=False) - -# the rect parameter will be ignore as we will set axes_locator -ax1 = fig1.add_axes(rect, label="1") -ax2 = fig1.add_axes(rect, label="2") -ax3 = fig1.add_axes(rect, label="3") -ax4 = fig1.add_axes(rect, label="4") - -ax1.set_axes_locator(divider.new_locator(nx=0, ny=0)) -ax2.set_axes_locator(divider.new_locator(nx=0, ny=2)) -ax3.set_axes_locator(divider.new_locator(nx=2, ny=2)) -ax4.set_axes_locator(divider.new_locator(nx=2, nx1=4, ny=0)) - - - -plt.draw() -plt.show() diff -Nru matplotlib-0.99.3/doc/mpl_examples/axes_grid/simple_axes_divider2.py matplotlib-1.0.1/doc/mpl_examples/axes_grid/simple_axes_divider2.py --- matplotlib-0.99.3/doc/mpl_examples/axes_grid/simple_axes_divider2.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/axes_grid/simple_axes_divider2.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,29 +0,0 @@ -import mpl_toolkits.axes_grid.axes_size as Size -from mpl_toolkits.axes_grid import Divider -import matplotlib.pyplot as plt - -fig1 = plt.figure(1, (5.5, 4.)) - -# the rect parameter will be ignore as we will set axes_locator -rect = (0.1, 0.1, 0.8, 0.8) -ax = [fig1.add_axes(rect, label="%d"%i) for i in range(4)] - -horiz = [Size.Scaled(1.5), Size.Fixed(.5), Size.Scaled(1.), - Size.Scaled(.5)] - -vert = [Size.Scaled(1.), Size.Fixed(.5), Size.Scaled(1.5)] - -# divide the axes rectangle into grid whose size is specified by horiz * vert -divider = Divider(fig1, rect, horiz, vert, aspect=False) - -ax[0].set_axes_locator(divider.new_locator(nx=0, ny=0)) -ax[1].set_axes_locator(divider.new_locator(nx=0, ny=2)) -ax[2].set_axes_locator(divider.new_locator(nx=2, ny=2)) -ax[3].set_axes_locator(divider.new_locator(nx=2, nx1=4, ny=0)) - -for ax1 in ax: - plt.setp(ax1.get_xticklabels()+ax1.get_yticklabels(), - visible=False) - -plt.draw() -plt.show() diff -Nru matplotlib-0.99.3/doc/mpl_examples/axes_grid/simple_axes_divider3.py matplotlib-1.0.1/doc/mpl_examples/axes_grid/simple_axes_divider3.py --- matplotlib-0.99.3/doc/mpl_examples/axes_grid/simple_axes_divider3.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/axes_grid/simple_axes_divider3.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,38 +0,0 @@ -import mpl_toolkits.axes_grid.axes_size as Size -from mpl_toolkits.axes_grid import Divider -import matplotlib.pyplot as plt - - -fig1 = plt.figure(1, (5.5, 4)) - -# the rect parameter will be ignore as we will set axes_locator -rect = (0.1, 0.1, 0.8, 0.8) -ax = [fig1.add_axes(rect, label="%d"%i) for i in range(4)] - - -horiz = [Size.AxesX(ax[0]), Size.Fixed(.5), Size.AxesX(ax[1])] -vert = [Size.AxesY(ax[0]), Size.Fixed(.5), Size.AxesY(ax[2])] - -# divide the axes rectangle into grid whose size is specified by horiz * vert -divider = Divider(fig1, rect, horiz, vert, aspect=False) - - -ax[0].set_axes_locator(divider.new_locator(nx=0, ny=0)) -ax[1].set_axes_locator(divider.new_locator(nx=2, ny=0)) -ax[2].set_axes_locator(divider.new_locator(nx=0, ny=2)) -ax[3].set_axes_locator(divider.new_locator(nx=2, ny=2)) - -ax[0].set_xlim(0, 2) -ax[1].set_xlim(0, 1) - -ax[0].set_ylim(0, 1) -ax[2].set_ylim(0, 2) - -divider.set_aspect(1.) - -for ax1 in ax: - plt.setp(ax1.get_xticklabels()+ax1.get_yticklabels(), - visible=False) - -plt.draw() -plt.show() diff -Nru matplotlib-0.99.3/doc/mpl_examples/axes_grid/simple_axesgrid2.py matplotlib-1.0.1/doc/mpl_examples/axes_grid/simple_axesgrid2.py --- matplotlib-0.99.3/doc/mpl_examples/axes_grid/simple_axesgrid2.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/axes_grid/simple_axesgrid2.py 2010-07-07 01:41:54.000000000 +0000 @@ -1,9 +1,16 @@ import matplotlib.pyplot as plt -from mpl_toolkits.axes_grid import AxesGrid -from demo_image import get_demo_image +from mpl_toolkits.axes_grid1 import ImageGrid + +def get_demo_image(): + import numpy as np + from matplotlib.cbook import get_sample_data + f = get_sample_data("axes_grid/bivariate_normal.npy", asfileobj=False) + z = np.load(f) + # z is a numpy array of 15x15 + return z, (-3,4,-4,3) F = plt.figure(1, (5.5, 3.5)) -grid = AxesGrid(F, 111, # similar to subplot(111) +grid = ImageGrid(F, 111, # similar to subplot(111) nrows_ncols = (1, 3), axes_pad = 0.1, add_all=True, diff -Nru matplotlib-0.99.3/doc/mpl_examples/axes_grid/simple_axesgrid.py matplotlib-1.0.1/doc/mpl_examples/axes_grid/simple_axesgrid.py --- matplotlib-0.99.3/doc/mpl_examples/axes_grid/simple_axesgrid.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/axes_grid/simple_axesgrid.py 2010-07-07 01:41:54.000000000 +0000 @@ -1,12 +1,12 @@ import matplotlib.pyplot as plt -from mpl_toolkits.axes_grid import AxesGrid +from mpl_toolkits.axes_grid1 import ImageGrid import numpy as np im = np.arange(100) im.shape = 10, 10 fig = plt.figure(1, (4., 4.)) -grid = AxesGrid(fig, 111, # similar to subplot(111) +grid = ImageGrid(fig, 111, # similar to subplot(111) nrows_ncols = (2, 2), # creates 2x2 grid of axes axes_pad=0.1, # pad between axes in inch. ) diff -Nru matplotlib-0.99.3/doc/mpl_examples/axes_grid/simple_axisline2.py matplotlib-1.0.1/doc/mpl_examples/axes_grid/simple_axisline2.py --- matplotlib-0.99.3/doc/mpl_examples/axes_grid/simple_axisline2.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/axes_grid/simple_axisline2.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,24 +0,0 @@ -import matplotlib.pyplot as plt -from mpl_toolkits.axes_grid.axislines import SubplotZero -import numpy as np - -fig = plt.figure(1, (4,3)) - -# a subplot with two additiona axis, "xzero" and "yzero". "xzero" is -# y=0 line, and "yzero" is x=0 line. -ax = SubplotZero(fig, 1, 1, 1) -fig.add_subplot(ax) - -# make xzero axis (horizontal axis line through y=0) visible. -ax.axis["xzero"].set_visible(True) -ax.axis["xzero"].label.set_text("Axis Zero") - -# make other axis (bottom, top, right) invisible. -for n in ["bottom", "top", "right"]: - ax.axis[n].set_visible(False) - -xx = np.arange(0, 2*np.pi, 0.01) -ax.plot(xx, np.sin(xx)) - -plt.show() - diff -Nru matplotlib-0.99.3/doc/mpl_examples/axes_grid/simple_axisline3.py matplotlib-1.0.1/doc/mpl_examples/axes_grid/simple_axisline3.py --- matplotlib-0.99.3/doc/mpl_examples/axes_grid/simple_axisline3.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/axes_grid/simple_axisline3.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,13 +0,0 @@ -import matplotlib.pyplot as plt -from mpl_toolkits.axes_grid.axislines import Subplot - -fig = plt.figure(1, (3,3)) - -ax = Subplot(fig, 111) -fig.add_subplot(ax) - -ax.axis["right"].set_visible(False) -ax.axis["top"].set_visible(False) - -plt.show() - diff -Nru matplotlib-0.99.3/doc/mpl_examples/axes_grid/simple_axisline4.py matplotlib-1.0.1/doc/mpl_examples/axes_grid/simple_axisline4.py --- matplotlib-0.99.3/doc/mpl_examples/axes_grid/simple_axisline4.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/axes_grid/simple_axisline4.py 2010-07-07 01:41:54.000000000 +0000 @@ -1,18 +1,15 @@ import matplotlib.pyplot as plt -from mpl_toolkits.axes_grid.parasite_axes import SubplotHost +from mpl_toolkits.axes_grid1 import host_subplot +import mpl_toolkits.axisartist as AA import numpy as np -fig = plt.figure(1, (4,3)) - -ax = SubplotHost(fig, 111) -fig.add_subplot(ax) - +ax = host_subplot(111, axes_class=AA.Axes) xx = np.arange(0, 2*np.pi, 0.01) ax.plot(xx, np.sin(xx)) ax2 = ax.twin() # ax2 is responsible for "top" axis and "right" axis ax2.set_xticks([0., .5*np.pi, np.pi, 1.5*np.pi, 2*np.pi]) -ax2.set_xticklabels(["0", r"$\frac{1}{2}\pi$", +ax2.set_xticklabels(["$0$", r"$\frac{1}{2}\pi$", r"$\pi$", r"$\frac{3}{2}\pi$", r"$2\pi$"]) ax2.axis["right"].major_ticklabels.set_visible(False) diff -Nru matplotlib-0.99.3/doc/mpl_examples/axes_grid/simple_axisline.py matplotlib-1.0.1/doc/mpl_examples/axes_grid/simple_axisline.py --- matplotlib-0.99.3/doc/mpl_examples/axes_grid/simple_axisline.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/axes_grid/simple_axisline.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,39 +0,0 @@ -import matplotlib.pyplot as plt - -from mpl_toolkits.axes_grid.axislines import SubplotZero - -if 1: - - fig = plt.figure(1) - fig.subplots_adjust(right=0.85) - ax = SubplotZero(fig, 1, 1, 1) - fig.add_subplot(ax) - - # make right and top axis invisible - ax.axis["right"].set_visible(False) - ax.axis["top"].set_visible(False) - - # make xzero axis (horizontal axis line through y=0) visible. - ax.axis["xzero"].set_visible(True) - ax.axis["xzero"].label.set_text("Axis Zero") - - ax.set_ylim(-2, 4) - ax.set_xlabel("Label X") - ax.set_ylabel("Label Y") - # or - #ax.axis["bottom"].label.set_text("Label X") - #ax.axis["left"].label.set_text("Label Y") - - # make new (right-side) yaxis, but wth some offset - offset = (20, 0) - new_axisline = ax.get_grid_helper().new_fixed_axis - - ax.axis["right2"] = new_axisline(loc="right", - offset=offset, - axes=ax) - ax.axis["right2"].label.set_text("Label Y2") - - ax.plot([-2,3,2]) - plt.draw() - plt.show() - diff -Nru matplotlib-0.99.3/doc/mpl_examples/axes_grid/simple_rgb.py matplotlib-1.0.1/doc/mpl_examples/axes_grid/simple_rgb.py --- matplotlib-0.99.3/doc/mpl_examples/axes_grid/simple_rgb.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/axes_grid/simple_rgb.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -import matplotlib.pyplot as plt - -from demo_image import get_demo_image -from mpl_toolkits.axes_grid.axes_rgb import RGBAxes - -def get_rgb(): - Z, extent = get_demo_image() - - Z[Z<0] = 0. - Z = Z/Z.max() - - R = Z[:13,:13] - G = Z[2:,2:] - B = Z[:13,2:] - - return R, G, B - - -fig = plt.figure(1) -ax = RGBAxes(fig, [0.1, 0.1, 0.8, 0.8]) - -r, g, b = get_rgb() -kwargs = dict(origin="lower", interpolation="nearest") -ax.imshow_rgb(r, g, b, **kwargs) - -ax.RGB.set_xlim(0., 9.5) -ax.RGB.set_ylim(0.9, 10.6) - - -plt.draw() -plt.show() diff -Nru matplotlib-0.99.3/doc/mpl_examples/data/aapl.csv matplotlib-1.0.1/doc/mpl_examples/data/aapl.csv --- matplotlib-0.99.3/doc/mpl_examples/data/aapl.csv 2009-07-31 15:14:50.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/data/aapl.csv 1970-01-01 00:00:00.000000000 +0000 @@ -1,6082 +0,0 @@ -Date,Open,High,Low,Close,Volume,Adj Close -2008-10-14,116.26,116.40,103.14,104.08,70749800,104.08 -2008-10-13,104.55,110.53,101.02,110.26,54967000,110.26 -2008-10-10,85.70,100.00,85.00,96.80,79260700,96.80 -2008-10-09,93.35,95.80,86.60,88.74,57763700,88.74 -2008-10-08,85.91,96.33,85.68,89.79,78847900,89.79 -2008-10-07,100.48,101.50,88.95,89.16,67099000,89.16 -2008-10-06,91.96,98.78,87.54,98.14,75264900,98.14 -2008-10-03,104.00,106.50,94.65,97.07,81942800,97.07 -2008-10-02,108.01,108.79,100.00,100.10,57477300,100.10 -2008-10-01,111.92,112.36,107.39,109.12,46303000,109.12 -2008-09-30,108.25,115.00,106.30,113.66,58095800,113.66 -2008-09-29,119.62,119.68,100.59,105.26,93581400,105.26 -2008-09-26,124.91,129.80,123.00,128.24,40208700,128.24 -2008-09-25,129.80,134.79,128.52,131.93,35865600,131.93 -2008-09-24,127.27,130.95,125.15,128.71,37393400,128.71 -2008-09-23,131.85,135.80,126.66,126.84,45727300,126.84 -2008-09-22,139.94,140.25,130.66,131.05,30577300,131.05 -2008-09-19,142.60,144.20,136.31,140.91,51102700,140.91 -2008-09-18,130.57,135.43,120.68,134.09,59819300,134.09 -2008-09-17,138.49,138.51,127.83,127.83,42847200,127.83 -2008-09-16,133.86,142.50,132.15,139.88,42804800,139.88 -2008-09-15,142.03,147.69,140.36,140.36,32852600,140.36 -2008-09-12,150.91,150.91,146.50,148.94,28322400,148.94 -2008-09-11,148.18,152.99,146.00,152.65,34666800,152.65 -2008-09-10,152.32,154.99,148.80,151.61,34755100,151.61 -2008-09-09,156.86,159.96,149.79,151.68,44442500,151.68 -2008-09-08,164.57,164.89,151.46,157.92,37356400,157.92 -2008-09-05,158.59,162.40,157.65,160.18,28083800,160.18 -2008-09-04,165.86,167.91,160.81,161.22,26549500,161.22 -2008-09-03,166.84,168.68,164.00,166.96,26244100,166.96 -2008-09-02,172.40,173.50,165.00,166.19,27884400,166.19 -2008-08-29,172.96,173.50,169.04,169.53,21403200,169.53 -2008-08-28,175.28,176.25,172.75,173.74,15394500,173.74 -2008-08-27,173.31,175.76,172.19,174.67,17045900,174.67 -2008-08-26,172.76,174.88,172.61,173.64,15912500,173.64 -2008-08-25,176.15,176.23,171.66,172.55,17300900,172.55 -2008-08-22,175.82,177.50,175.57,176.79,15700400,176.79 -2008-08-21,174.47,175.45,171.89,174.29,19276600,174.29 -2008-08-20,174.77,176.94,173.61,175.84,18105400,175.84 -2008-08-19,174.54,177.07,171.81,173.53,21997000,173.53 -2008-08-18,175.57,177.81,173.82,175.39,19691200,175.39 -2008-08-15,179.04,179.75,175.05,175.74,25294700,175.74 -2008-08-14,178.33,180.45,177.84,179.32,25393200,179.32 -2008-08-13,177.98,180.00,175.90,179.30,30083800,179.30 -2008-08-12,173.52,179.29,173.51,176.73,29867100,176.73 -2008-08-11,170.07,176.50,169.67,173.56,31821100,173.56 -2008-08-08,163.86,169.65,163.75,169.55,25499900,169.55 -2008-08-07,162.71,166.15,161.50,163.57,24013300,163.57 -2008-08-06,159.97,167.40,158.00,164.19,28264600,164.19 -2008-08-05,155.42,160.80,154.82,160.64,24584700,160.64 -2008-08-04,156.60,157.90,152.91,153.23,21161700,153.23 -2008-08-01,159.90,159.99,155.75,156.66,19451400,156.66 -2008-07-31,157.54,162.20,156.98,158.95,22767800,158.95 -2008-07-30,157.78,160.49,156.08,159.88,25899400,159.88 -2008-07-29,155.41,159.45,153.65,157.08,24431100,157.08 -2008-07-28,162.34,162.47,154.02,154.40,27882600,154.40 -2008-07-25,160.40,163.00,158.65,162.12,22629900,162.12 -2008-07-24,164.32,165.26,158.45,159.03,29986400,159.03 -2008-07-23,164.99,168.37,161.56,166.26,37920300,166.26 -2008-07-22,149.00,162.76,146.53,162.02,67128300,162.02 -2008-07-21,166.90,167.50,161.12,166.29,48588200,166.29 -2008-07-18,168.52,169.65,165.00,165.15,31014800,165.15 -2008-07-17,174.10,174.98,171.39,171.81,27054500,171.81 -2008-07-16,170.20,172.93,168.60,172.81,26706800,172.81 -2008-07-15,172.48,173.74,166.39,169.64,37144400,169.64 -2008-07-14,179.24,179.30,173.08,173.88,31644800,173.88 -2008-07-11,175.47,177.11,171.00,172.58,33214700,172.58 -2008-07-10,174.92,177.34,171.37,176.63,30024600,176.63 -2008-07-09,180.20,180.91,174.14,174.25,31992000,174.25 -2008-07-08,175.40,179.70,172.74,179.55,31726800,179.55 -2008-07-07,173.16,177.13,171.90,175.16,29299700,175.16 -2008-07-03,169.59,172.17,165.75,170.12,18691500,170.12 -2008-07-02,175.20,177.45,168.18,168.18,29911400,168.18 -2008-07-01,164.23,174.72,164.00,174.68,39688600,174.68 -2008-06-30,170.19,172.00,166.62,167.44,24435600,167.44 -2008-06-27,166.51,170.57,164.15,170.09,37223200,170.09 -2008-06-26,174.07,174.84,168.01,168.26,31057500,168.26 -2008-06-25,174.61,178.83,173.88,177.39,23016100,177.39 -2008-06-24,172.37,175.78,171.63,173.25,22212400,173.25 -2008-06-23,174.74,175.88,171.56,173.16,23063600,173.16 -2008-06-20,179.35,181.00,175.00,175.27,31727400,175.27 -2008-06-19,178.55,182.34,176.80,180.90,28283900,180.90 -2008-06-18,181.12,182.20,177.35,178.75,28981000,178.75 -2008-06-17,178.10,181.99,177.41,181.43,32130600,181.43 -2008-06-16,171.30,177.90,169.07,176.84,37561800,176.84 -2008-06-13,171.64,174.16,165.31,172.37,48069900,172.37 -2008-06-12,181.49,182.60,171.20,173.26,46726200,173.26 -2008-06-11,184.34,186.00,179.59,180.81,34341100,180.81 -2008-06-10,180.51,186.78,179.02,185.64,40728600,185.64 -2008-06-09,184.79,184.94,175.75,181.61,67442600,181.61 -2008-06-06,188.00,189.95,185.55,185.64,34438700,185.64 -2008-06-05,186.34,189.84,185.70,189.43,26980200,189.43 -2008-06-04,184.02,187.09,183.23,185.19,25963700,185.19 -2008-06-03,186.86,188.20,182.34,185.37,26804300,185.37 -2008-06-02,188.60,189.65,184.53,186.10,24280000,186.10 -2008-05-30,187.45,189.54,187.38,188.75,21792300,188.75 -2008-05-29,186.76,188.20,185.50,186.69,23113800,186.69 -2008-05-28,187.41,187.95,183.72,187.01,26570700,187.01 -2008-05-27,182.75,186.43,181.84,186.43,28210900,186.43 -2008-05-23,180.77,181.99,177.80,181.17,32389900,181.17 -2008-05-22,179.26,181.33,172.00,177.05,43097700,177.05 -2008-05-21,185.67,187.95,176.25,178.19,41344900,178.19 -2008-05-20,181.82,186.16,180.12,185.90,34637500,185.90 -2008-05-19,187.86,188.69,181.30,183.60,33779300,183.60 -2008-05-16,190.11,190.30,187.00,187.62,27348900,187.62 -2008-05-15,186.81,189.90,184.20,189.73,31186000,189.73 -2008-05-14,191.23,192.24,185.57,186.26,32743700,186.26 -2008-05-13,188.61,191.45,187.86,189.96,29401300,189.96 -2008-05-12,185.21,188.87,182.85,188.16,29234400,188.16 -2008-05-09,183.16,184.25,181.37,183.45,24038300,183.45 -2008-05-08,183.77,186.50,183.07,185.06,32110200,185.06 -2008-05-07,186.05,188.20,180.54,182.59,41326200,182.59 -2008-05-06,184.66,187.12,182.18,186.66,32816800,186.66 -2008-05-05,181.92,185.31,181.05,184.73,30519900,184.73 -2008-05-02,180.19,181.92,178.55,180.94,35931500,180.94 -2008-05-01,174.96,180.00,174.86,180.00,32270600,180.00 -2008-04-30,176.19,180.00,172.92,173.95,40697300,173.95 -2008-04-29,171.11,175.66,170.25,175.05,32981300,175.05 -2008-04-28,169.75,173.75,169.13,172.24,28114800,172.24 -2008-04-25,170.70,171.10,166.42,169.73,35445500,169.73 -2008-04-24,165.34,169.98,159.19,168.94,60573800,168.94 -2008-04-23,164.05,164.84,161.08,162.89,53721100,162.89 -2008-04-22,167.40,168.00,158.09,160.20,51413300,160.20 -2008-04-21,162.21,168.50,161.76,168.16,37112600,168.16 -2008-04-18,159.12,162.26,158.38,161.04,36670200,161.04 -2008-04-17,154.17,156.00,153.35,154.49,25152400,154.49 -2008-04-16,151.72,154.10,150.62,153.70,28420500,153.70 -2008-04-15,149.40,149.72,145.72,148.38,24929900,148.38 -2008-04-14,146.77,149.25,144.54,147.78,30181700,147.78 -2008-04-11,152.72,153.30,146.40,147.14,43217000,147.14 -2008-04-10,151.13,155.42,150.60,154.55,34134400,154.55 -2008-04-09,153.31,153.89,150.46,151.44,31192800,151.44 -2008-04-08,153.55,156.45,152.32,152.84,36224800,152.84 -2008-04-07,156.13,159.69,155.11,155.89,41368800,155.89 -2008-04-04,152.19,154.71,150.75,153.08,30514900,153.08 -2008-04-03,147.06,153.63,147.00,151.61,37556000,151.61 -2008-04-02,148.78,151.20,145.85,147.49,37320300,147.49 -2008-04-01,146.30,149.66,143.61,149.53,36877400,149.53 -2008-03-31,143.27,145.71,142.52,143.50,27430900,143.50 -2008-03-28,141.80,144.65,141.60,143.01,25521800,143.01 -2008-03-27,144.95,145.31,139.99,140.25,35708200,140.25 -2008-03-26,140.87,145.74,140.64,145.06,42217300,145.06 -2008-03-25,139.96,143.10,137.33,140.98,37585400,140.98 -2008-03-24,134.01,140.85,133.64,139.53,38104300,139.53 -2008-03-20,131.12,133.29,129.18,133.27,32456700,133.27 -2008-03-19,133.12,134.29,129.67,129.67,36090600,129.67 -2008-03-18,129.18,133.00,128.67,132.82,43040000,132.82 -2008-03-17,122.55,128.59,122.55,126.73,38307100,126.73 -2008-03-14,129.88,130.30,124.20,126.61,41308600,126.61 -2008-03-13,124.10,129.50,123.00,127.94,45075100,127.94 -2008-03-12,127.04,128.68,125.17,126.03,37843900,126.03 -2008-03-11,124.10,127.48,122.00,127.35,41569400,127.35 -2008-03-10,121.98,123.46,119.37,119.69,35699600,119.69 -2008-03-07,120.41,122.98,119.05,122.25,43945100,122.25 -2008-03-06,124.61,127.50,120.81,120.93,52632100,120.93 -2008-03-05,123.58,125.14,122.25,124.49,43637000,124.49 -2008-03-04,121.99,124.88,120.40,124.62,63763700,124.62 -2008-03-03,124.44,125.98,118.00,121.73,56894400,121.73 -2008-02-29,129.29,130.21,124.80,125.02,44838600,125.02 -2008-02-28,127.20,132.20,125.77,129.91,57794800,129.91 -2008-02-27,118.23,123.05,118.09,122.96,52683500,122.96 -2008-02-26,117.64,121.09,115.44,119.15,53746000,119.15 -2008-02-25,118.59,120.17,116.66,119.74,44884800,119.74 -2008-02-22,122.48,122.51,115.87,119.46,54638500,119.46 -2008-02-21,126.05,126.47,120.86,121.54,33504100,121.54 -2008-02-20,122.20,124.60,121.68,123.82,34551400,123.82 -2008-02-19,125.99,126.75,121.44,122.18,35894500,122.18 -2008-02-15,126.27,127.08,124.06,124.63,32189300,124.63 -2008-02-14,129.40,130.80,127.01,127.46,34074900,127.46 -2008-02-13,126.68,129.78,125.63,129.40,34590500,129.40 -2008-02-12,130.70,131.00,123.62,124.86,43785000,124.86 -2008-02-11,128.01,129.98,127.20,129.45,42908300,129.45 -2008-02-08,122.08,125.70,121.60,125.48,48427600,125.48 -2008-02-07,119.97,124.78,117.27,121.24,74404700,121.24 -2008-02-06,130.83,131.92,121.77,122.00,56188300,122.00 -2008-02-05,130.43,134.00,128.90,129.36,40751500,129.36 -2008-02-04,134.21,135.90,131.42,131.65,32115500,131.65 -2008-02-01,136.24,136.59,132.18,133.75,36098000,133.75 -2008-01-31,129.45,136.65,129.40,135.36,48059800,135.36 -2008-01-30,131.37,135.45,130.00,132.18,44394700,132.18 -2008-01-29,131.15,132.79,129.05,131.54,39285100,131.54 -2008-01-28,128.16,133.20,126.45,130.01,52673000,130.01 -2008-01-25,138.99,139.09,129.61,130.01,55526400,130.01 -2008-01-24,139.99,140.70,132.01,135.60,71638100,135.60 -2008-01-23,136.19,140.00,126.14,139.07,120463200,139.07 -2008-01-22,148.06,159.98,146.00,155.64,86955500,155.64 -2008-01-18,161.71,165.75,159.61,161.36,61583700,161.36 -2008-01-17,161.51,165.36,158.42,160.89,62780700,160.89 -2008-01-16,165.23,169.01,156.70,159.64,79065900,159.64 -2008-01-15,177.72,179.22,164.66,169.04,83688500,169.04 -2008-01-14,177.52,179.42,175.17,178.78,39301800,178.78 -2008-01-11,176.00,177.85,170.00,172.69,44010200,172.69 -2008-01-10,177.58,181.00,175.41,178.02,52963400,178.02 -2008-01-09,171.30,179.50,168.30,179.40,64781500,179.40 -2008-01-08,180.14,182.46,170.80,171.25,54422000,171.25 -2008-01-07,181.25,183.60,170.23,177.64,74006900,177.64 -2008-01-04,191.45,193.00,178.89,180.05,51994000,180.05 -2008-01-03,195.41,197.39,192.69,194.93,30073800,194.93 -2008-01-02,199.27,200.26,192.55,194.84,38542100,194.84 -2007-12-31,199.50,200.50,197.75,198.08,19261900,198.08 -2007-12-28,200.59,201.56,196.88,199.83,24987400,199.83 -2007-12-27,198.95,202.96,197.80,198.57,28411700,198.57 -2007-12-26,199.01,200.96,196.82,198.95,25133300,198.95 -2007-12-24,195.03,199.33,194.79,198.80,17150100,198.80 -2007-12-21,190.12,193.91,189.89,193.91,35498600,193.91 -2007-12-20,185.43,187.83,183.33,187.21,27644900,187.21 -2007-12-19,182.98,184.64,180.90,183.12,29552800,183.12 -2007-12-18,186.52,187.33,178.60,182.98,43664400,182.98 -2007-12-17,190.72,192.65,182.98,184.40,36596200,184.40 -2007-12-14,190.37,193.20,189.54,190.39,24082600,190.39 -2007-12-13,190.19,192.12,187.82,191.83,30879200,191.83 -2007-12-12,193.44,194.48,185.76,190.86,43773600,190.86 -2007-12-11,194.75,196.83,187.39,188.54,39675900,188.54 -2007-12-10,193.59,195.66,192.69,194.21,25799200,194.21 -2007-12-07,190.54,194.99,188.04,194.30,38073800,194.30 -2007-12-06,186.19,190.10,186.12,189.95,32136100,189.95 -2007-12-05,182.89,186.00,182.41,185.50,31871500,185.50 -2007-12-04,177.15,180.90,176.99,179.81,27635700,179.81 -2007-12-03,181.86,184.14,177.70,178.86,34338200,178.86 -2007-11-30,187.34,187.70,179.70,182.22,42421500,182.22 -2007-11-29,179.43,185.17,179.15,184.29,37533100,184.29 -2007-11-28,176.82,180.60,175.35,180.22,41104000,180.22 -2007-11-27,175.22,175.79,170.01,174.81,47036800,174.81 -2007-11-26,173.59,177.27,172.35,172.54,46634100,172.54 -2007-11-23,172.00,172.05,169.75,171.54,16634200,171.54 -2007-11-21,165.84,172.35,164.67,168.46,43493200,168.46 -2007-11-20,165.67,171.79,163.53,168.85,55130100,168.85 -2007-11-19,166.10,168.20,162.10,163.95,41196800,163.95 -2007-11-16,165.30,167.02,159.33,166.39,49391300,166.39 -2007-11-15,166.39,169.59,160.30,164.30,53095600,164.30 -2007-11-14,177.16,177.57,163.74,166.11,51695400,166.11 -2007-11-13,160.85,170.98,153.76,169.96,62034100,169.96 -2007-11-12,165.28,167.70,150.63,153.76,63057700,153.76 -2007-11-09,171.15,175.12,165.21,165.37,54458700,165.37 -2007-11-08,186.67,186.90,167.77,175.47,67458500,175.47 -2007-11-07,190.61,192.68,186.13,186.30,35473400,186.30 -2007-11-06,187.05,192.00,185.27,191.79,34097400,191.79 -2007-11-05,185.29,188.96,184.24,186.18,28720600,186.18 -2007-11-02,189.21,189.44,183.49,187.87,35789800,187.87 -2007-11-01,188.60,190.10,180.00,187.44,28751300,187.44 -2007-10-31,187.63,190.12,184.95,189.95,29761100,189.95 -2007-10-30,186.18,189.37,184.73,187.00,33550500,187.00 -2007-10-29,185.45,186.59,184.70,185.09,19305500,185.09 -2007-10-26,185.29,185.37,182.88,184.70,25219800,184.70 -2007-10-25,184.87,185.90,181.66,182.78,34771500,182.78 -2007-10-24,185.81,187.21,179.24,185.93,46017200,185.93 -2007-10-23,188.56,188.60,182.76,186.16,64113000,186.16 -2007-10-22,170.35,174.90,169.96,174.36,58910700,174.36 -2007-10-19,174.24,174.63,170.00,170.42,46135000,170.42 -2007-10-18,171.50,174.19,171.05,173.50,29417000,173.50 -2007-10-17,172.69,173.04,169.18,172.75,40271900,172.75 -2007-10-16,165.54,170.18,165.15,169.58,38136800,169.58 -2007-10-15,167.98,169.57,163.50,166.98,38497500,166.98 -2007-10-12,163.01,167.28,161.80,167.25,35292000,167.25 -2007-10-11,169.49,171.88,153.21,162.23,58714000,162.23 -2007-10-10,167.55,167.88,165.60,166.79,23842500,166.79 -2007-10-09,170.20,171.11,166.68,167.86,39438800,167.86 -2007-10-08,163.49,167.91,162.97,167.91,29854600,167.91 -2007-10-05,158.37,161.58,157.70,161.45,33695400,161.45 -2007-10-04,158.00,158.08,153.50,156.24,23462800,156.24 -2007-10-03,157.78,159.18,157.01,157.92,24732800,157.92 -2007-10-02,156.55,158.59,155.89,158.45,28288200,158.45 -2007-10-01,154.63,157.41,152.93,156.34,29895300,156.34 -2007-09-28,153.44,154.60,152.75,153.47,21967900,153.47 -2007-09-27,153.77,154.52,152.32,154.50,23507100,154.50 -2007-09-26,154.47,155.00,151.25,152.77,34831000,152.77 -2007-09-25,146.84,153.22,146.82,153.18,42591100,153.18 -2007-09-24,146.73,149.85,146.65,148.28,37577200,148.28 -2007-09-21,141.14,144.65,140.31,144.15,40674300,144.15 -2007-09-20,140.15,141.79,139.32,140.31,24708600,140.31 -2007-09-19,143.02,143.16,139.40,140.77,36674300,140.77 -2007-09-18,139.06,142.85,137.83,140.92,38003200,140.92 -2007-09-17,138.99,140.59,137.60,138.41,28334700,138.41 -2007-09-14,136.57,138.98,136.20,138.81,21690000,138.81 -2007-09-13,138.83,139.00,136.65,137.20,23434400,137.20 -2007-09-12,135.99,139.40,135.75,136.85,36527500,136.85 -2007-09-11,137.90,138.30,133.75,135.49,34710200,135.49 -2007-09-10,136.99,138.04,133.95,136.71,53137100,136.71 -2007-09-07,132.01,132.30,130.00,131.77,51092000,131.77 -2007-09-06,135.56,137.57,132.71,135.01,67902200,135.01 -2007-09-05,144.97,145.84,136.10,136.76,83150800,136.76 -2007-09-04,139.94,145.73,139.84,144.16,47030100,144.16 -2007-08-31,139.49,139.65,137.41,138.48,31317400,138.48 -2007-08-30,132.67,138.25,132.30,136.25,51270800,136.25 -2007-08-29,129.88,134.18,129.54,134.08,41673600,134.08 -2007-08-28,130.99,132.41,126.63,126.82,42120200,126.82 -2007-08-27,133.39,134.66,132.10,132.25,25265700,132.25 -2007-08-24,130.53,135.37,129.81,135.30,32565500,135.30 -2007-08-23,133.09,133.34,129.76,131.07,30958500,131.07 -2007-08-22,131.22,132.75,130.33,132.51,37920200,132.51 -2007-08-21,122.21,128.96,121.00,127.57,46537400,127.57 -2007-08-20,123.96,124.50,120.50,122.22,28689900,122.22 -2007-08-17,122.01,123.50,119.82,122.06,42680800,122.06 -2007-08-16,117.01,118.50,111.62,117.05,66667500,117.05 -2007-08-15,122.74,124.86,119.65,119.90,35459000,119.90 -2007-08-14,128.29,128.30,123.71,124.03,26393100,124.03 -2007-08-13,128.32,129.35,126.50,127.79,26889700,127.79 -2007-08-10,123.12,127.75,120.30,125.00,50383900,125.00 -2007-08-09,131.11,133.00,125.09,126.39,40192700,126.39 -2007-08-08,136.76,136.86,132.00,134.01,28860600,134.01 -2007-08-07,134.94,137.24,132.63,135.03,33926300,135.03 -2007-08-06,132.90,135.27,128.30,135.25,33041800,135.25 -2007-08-03,135.26,135.95,131.50,131.85,24256700,131.85 -2007-08-02,136.65,136.96,134.15,136.49,30451600,136.49 -2007-08-01,133.64,135.38,127.77,135.00,62505600,135.00 -2007-07-31,142.97,143.48,131.52,131.76,62942600,131.76 -2007-07-30,144.33,145.45,139.57,141.43,39535300,141.43 -2007-07-27,146.19,148.92,143.78,143.85,41467800,143.85 -2007-07-26,145.91,148.50,136.96,146.00,78093900,146.00 -2007-07-25,137.35,138.36,135.00,137.26,53435100,137.26 -2007-07-24,138.88,141.00,134.15,134.89,64117600,134.89 -2007-07-23,143.31,145.22,140.93,143.70,37017500,143.70 -2007-07-20,141.65,144.18,140.00,143.75,41706200,143.75 -2007-07-19,140.30,140.81,139.65,140.00,26174700,140.00 -2007-07-18,138.19,138.44,136.04,138.12,27030600,138.12 -2007-07-17,138.30,139.60,137.50,138.91,25355700,138.91 -2007-07-16,138.39,139.98,137.50,138.10,33432600,138.10 -2007-07-13,135.03,137.85,134.52,137.73,32414500,137.73 -2007-07-12,133.85,134.24,132.39,134.07,25164600,134.07 -2007-07-11,132.07,133.70,131.31,132.39,29349000,132.39 -2007-07-10,128.88,134.50,128.81,132.35,44821700,132.35 -2007-07-09,132.38,132.90,129.18,130.33,35565000,130.33 -2007-07-06,133.13,133.34,130.40,132.30,31239100,132.30 -2007-07-05,128.80,132.97,128.69,132.75,51894700,132.75 -2007-07-03,122.00,127.40,121.50,127.17,41517200,127.17 -2007-07-02,121.05,122.09,119.30,121.26,35530800,121.26 -2007-06-29,121.97,124.00,121.09,122.04,40637200,122.04 -2007-06-28,122.36,122.49,120.00,120.56,29933700,120.56 -2007-06-27,120.61,122.04,119.26,121.89,34810600,121.89 -2007-06-26,123.98,124.00,118.72,119.65,48035900,119.65 -2007-06-25,124.19,125.09,121.06,122.34,34478700,122.34 -2007-06-22,123.85,124.45,122.38,123.00,22567000,123.00 -2007-06-21,121.70,124.29,120.72,123.90,30965900,123.90 -2007-06-20,123.87,124.66,121.50,121.55,32054000,121.55 -2007-06-19,124.69,125.01,122.91,123.66,33679500,123.66 -2007-06-18,123.28,125.18,122.54,125.09,32521600,125.09 -2007-06-15,120.62,120.67,119.86,120.50,28972100,120.50 -2007-06-14,117.20,119.45,116.42,118.75,34759500,118.75 -2007-06-13,121.15,121.19,115.40,117.50,61476900,117.50 -2007-06-12,119.35,121.71,118.31,120.38,50948800,120.38 -2007-06-11,126.00,126.15,119.54,120.19,66937800,120.19 -2007-06-08,125.82,125.83,122.29,124.49,44345800,124.49 -2007-06-07,124.99,127.61,123.19,124.07,68395700,124.07 -2007-06-06,122.30,124.05,121.95,123.64,39722900,123.64 -2007-06-05,121.41,122.69,120.50,122.67,32885200,122.67 -2007-06-04,118.63,121.73,117.90,121.33,31666900,121.33 -2007-06-01,121.10,121.19,118.29,118.40,31616500,118.40 -2007-05-31,120.07,122.17,119.54,121.19,46323800,121.19 -2007-05-30,114.30,118.88,113.53,118.77,52801600,118.77 -2007-05-29,114.45,114.86,112.69,114.35,23060500,114.35 -2007-05-25,112.00,113.78,111.50,113.62,22605700,113.62 -2007-05-24,112.81,114.46,110.37,110.69,31691500,110.69 -2007-05-23,114.02,115.00,112.59,112.89,32549100,112.89 -2007-05-22,112.49,113.75,112.01,113.54,20443200,113.54 -2007-05-21,110.31,112.45,110.05,111.98,22853300,111.98 -2007-05-18,110.23,110.64,109.77,110.02,22190900,110.02 -2007-05-17,107.15,109.87,107.15,109.44,26260400,109.44 -2007-05-16,108.53,108.83,103.42,107.34,40241700,107.34 -2007-05-15,109.57,110.20,106.48,107.52,34089800,107.52 -2007-05-14,109.62,110.00,108.25,109.36,23283800,109.36 -2007-05-11,107.74,109.13,106.78,108.74,23346300,108.74 -2007-05-10,106.63,108.84,105.92,107.34,42759200,107.34 -2007-05-09,104.91,106.96,104.89,106.88,25634200,106.88 -2007-05-08,103.47,105.15,103.42,105.06,27999900,105.06 -2007-05-07,101.08,104.35,101.01,103.92,30769900,103.92 -2007-05-04,100.80,101.60,100.50,100.81,13642400,100.81 -2007-05-03,100.73,101.45,100.01,100.40,20574200,100.40 -2007-05-02,99.65,100.54,99.47,100.39,18040900,100.39 -2007-05-01,99.59,100.35,98.55,99.47,19018700,99.47 -2007-04-30,100.09,101.00,99.67,99.80,22018200,99.80 -2007-04-27,98.18,99.95,97.69,99.92,24978700,99.92 -2007-04-26,101.58,102.50,98.30,98.84,62063500,98.84 -2007-04-25,94.23,95.40,93.80,95.35,42398000,95.35 -2007-04-24,93.96,96.39,91.30,93.24,37687600,93.24 -2007-04-23,91.59,93.80,91.42,93.51,27867500,93.51 -2007-04-20,90.89,91.18,90.55,90.97,18670700,90.97 -2007-04-19,90.19,91.25,89.83,90.27,15211200,90.27 -2007-04-18,90.16,90.85,89.60,90.40,16573000,90.40 -2007-04-17,92.00,92.30,89.70,90.35,26854300,90.35 -2007-04-16,90.57,91.50,90.25,91.43,21751200,91.43 -2007-04-13,90.90,91.40,90.06,90.24,25712200,90.24 -2007-04-12,92.04,92.31,90.72,92.19,23452700,92.19 -2007-04-11,93.90,93.95,92.33,92.59,19607800,92.59 -2007-04-10,93.67,94.26,93.41,94.25,12588100,94.25 -2007-04-09,95.21,95.30,93.04,93.65,14762200,93.65 -2007-04-05,94.12,94.68,93.52,94.68,12697000,94.68 -2007-04-04,94.94,95.14,94.13,94.27,17028000,94.27 -2007-04-03,94.14,95.23,93.76,94.50,20854800,94.50 -2007-04-02,94.14,94.25,93.02,93.65,17928300,93.65 -2007-03-30,94.28,94.68,92.75,92.91,21448500,92.91 -2007-03-29,94.19,94.19,92.23,93.75,25918700,93.75 -2007-03-28,94.88,95.40,93.15,93.24,33654900,93.24 -2007-03-27,95.71,96.83,95.00,95.46,33287600,95.46 -2007-03-26,93.99,95.90,93.30,95.85,30892400,95.85 -2007-03-23,93.35,94.07,93.30,93.52,16103000,93.52 -2007-03-22,93.73,94.36,93.00,93.96,20053300,93.96 -2007-03-21,91.99,94.00,91.65,93.87,24532000,93.87 -2007-03-20,91.35,91.84,91.06,91.48,17461300,91.48 -2007-03-19,90.24,91.55,89.59,91.13,25462900,91.13 -2007-03-16,89.54,89.99,89.32,89.59,20418000,89.59 -2007-03-15,89.96,90.36,89.31,89.57,19982100,89.57 -2007-03-14,88.60,90.00,87.92,90.00,28449500,90.00 -2007-03-13,89.41,90.60,88.40,88.40,30996100,88.40 -2007-03-12,88.07,89.99,87.99,89.87,26050300,89.87 -2007-03-09,88.80,88.85,87.40,87.97,16137000,87.97 -2007-03-08,88.59,88.72,87.46,88.00,18250400,88.00 -2007-03-07,88.05,88.97,87.45,87.72,22367300,87.72 -2007-03-06,87.80,88.31,87.40,88.19,25828100,88.19 -2007-03-05,85.89,88.65,85.76,86.32,29960700,86.32 -2007-03-02,86.77,87.54,85.21,85.41,30714300,85.41 -2007-03-01,84.03,88.31,83.75,87.06,50554600,87.06 -2007-02-28,83.00,85.60,83.00,84.61,32838400,84.61 -2007-02-27,86.30,87.08,83.41,83.93,40921900,83.93 -2007-02-26,89.84,90.00,87.61,88.51,21994600,88.51 -2007-02-23,89.16,90.34,88.85,89.07,18496200,89.07 -2007-02-22,90.80,90.81,88.53,89.51,29936600,89.51 -2007-02-21,85.98,89.49,85.96,89.20,41261200,89.20 -2007-02-20,84.65,86.16,84.16,85.90,22060800,85.90 -2007-02-16,85.25,85.41,84.66,84.83,14281000,84.83 -2007-02-15,85.44,85.62,84.78,85.21,12987900,85.21 -2007-02-14,84.63,85.64,84.57,85.30,18142200,85.30 -2007-02-13,85.16,85.29,84.30,84.70,20749500,84.70 -2007-02-12,84.43,85.18,83.63,84.88,25859700,84.88 -2007-02-09,85.88,86.20,83.21,83.27,30733600,83.27 -2007-02-08,85.43,86.51,85.41,86.18,24251100,86.18 -2007-02-07,84.48,86.38,83.55,86.15,38100900,86.15 -2007-02-06,84.45,84.47,82.86,84.15,30871200,84.15 -2007-02-05,84.30,85.23,83.94,83.94,20673300,83.94 -2007-02-02,84.12,85.25,83.70,84.75,22197500,84.75 -2007-02-01,86.23,86.27,84.74,84.74,23726500,84.74 -2007-01-31,84.86,86.00,84.35,85.73,30573900,85.73 -2007-01-30,86.43,86.49,85.25,85.55,20641800,85.55 -2007-01-29,86.30,86.65,85.53,85.94,32202300,85.94 -2007-01-26,87.11,87.37,84.99,85.38,35245500,85.38 -2007-01-25,87.11,88.50,86.03,86.25,32356200,86.25 -2007-01-24,86.68,87.15,86.08,86.70,33136200,86.70 -2007-01-23,85.73,87.51,85.51,85.70,43122300,85.70 -2007-01-22,89.14,89.16,85.65,86.79,51929500,86.79 -2007-01-19,88.63,89.65,88.12,88.50,48731200,88.50 -2007-01-18,92.10,92.11,89.05,89.07,84450200,89.07 -2007-01-17,97.56,97.60,94.82,94.95,58795000,94.95 -2007-01-16,95.68,97.25,95.45,97.10,44431300,97.10 -2007-01-12,94.59,95.06,93.23,94.62,46881800,94.62 -2007-01-11,95.94,96.78,95.10,95.80,51437600,95.80 -2007-01-10,94.75,97.80,93.45,97.00,105460000,97.00 -2007-01-09,86.45,92.98,85.15,92.57,119617800,92.57 -2007-01-08,85.96,86.53,85.28,85.47,28468100,85.47 -2007-01-05,85.77,86.20,84.40,85.05,29812200,85.05 -2007-01-04,84.05,85.95,83.82,85.66,30259300,85.66 -2007-01-03,86.29,86.58,81.90,83.80,44225700,83.80 -2006-12-29,83.95,85.40,83.36,84.84,38443900,84.84 -2006-12-28,80.22,81.25,79.65,80.87,39995600,80.87 -2006-12-27,78.15,82.00,76.77,81.52,69134100,81.52 -2006-12-26,82.15,82.57,80.89,81.51,17524600,81.51 -2006-12-22,83.46,84.04,81.60,82.20,21903700,82.20 -2006-12-21,84.70,85.48,82.20,82.90,32271400,82.90 -2006-12-20,86.47,86.67,84.74,84.76,20274700,84.76 -2006-12-19,84.73,86.68,83.62,86.31,32550200,86.31 -2006-12-18,87.63,88.00,84.59,85.47,25770600,85.47 -2006-12-15,89.02,89.22,87.33,87.72,26426400,87.72 -2006-12-14,89.05,90.00,88.26,88.55,29726100,88.55 -2006-12-13,87.95,89.07,87.15,89.05,30609000,89.05 -2006-12-12,88.61,88.84,85.53,86.14,36665000,86.14 -2006-12-11,88.90,89.30,88.05,88.75,17849300,88.75 -2006-12-08,87.23,89.39,87.00,88.26,28009900,88.26 -2006-12-07,90.03,90.50,86.90,87.04,35886700,87.04 -2006-12-06,90.64,91.39,89.67,89.83,22792300,89.83 -2006-12-05,91.65,92.33,90.87,91.27,23672800,91.27 -2006-12-04,91.88,92.05,90.50,91.12,25340600,91.12 -2006-12-01,91.80,92.33,90.10,91.32,28395700,91.32 -2006-11-30,92.21,92.68,91.06,91.66,31088800,91.66 -2006-11-29,93.00,93.15,90.25,91.80,41324400,91.80 -2006-11-28,90.36,91.97,89.91,91.81,37006200,91.81 -2006-11-27,92.51,93.16,89.50,89.54,38387000,89.54 -2006-11-24,89.53,93.08,89.50,91.63,18524200,91.63 -2006-11-22,88.99,90.75,87.85,90.31,23997900,90.31 -2006-11-21,87.42,88.60,87.11,88.60,22238100,88.60 -2006-11-20,85.40,87.00,85.20,86.47,20385500,86.47 -2006-11-17,85.14,85.94,85.00,85.85,16658000,85.85 -2006-11-16,84.87,86.30,84.62,85.61,24783600,85.61 -2006-11-15,85.05,85.90,84.00,84.05,23404400,84.05 -2006-11-14,84.80,85.00,83.90,85.00,21034100,85.00 -2006-11-13,83.22,84.45,82.64,84.35,16095500,84.35 -2006-11-10,83.55,83.60,82.50,83.12,13352300,83.12 -2006-11-09,82.90,84.69,82.12,83.34,32966200,83.34 -2006-11-08,80.02,82.69,79.89,82.45,24675600,82.45 -2006-11-07,80.45,81.00,80.13,80.51,18783300,80.51 -2006-11-06,78.95,80.06,78.43,79.71,15520600,79.71 -2006-11-03,79.36,79.53,77.79,78.29,15424600,78.29 -2006-11-02,78.92,79.32,78.50,78.98,16624400,78.98 -2006-11-01,81.10,81.38,78.36,79.16,21828300,79.16 -2006-10-31,81.45,81.68,80.23,81.08,17909800,81.08 -2006-10-30,79.99,80.90,79.50,80.42,17854200,80.42 -2006-10-27,81.75,82.45,80.01,80.41,21248800,80.41 -2006-10-26,81.90,82.60,81.13,82.19,15455600,82.19 -2006-10-25,81.35,82.00,81.01,81.68,17329100,81.68 -2006-10-24,81.21,81.68,80.20,81.05,16543300,81.05 -2006-10-23,79.99,81.90,79.75,81.46,29732400,81.46 -2006-10-20,78.97,79.99,78.67,79.95,22836200,79.95 -2006-10-19,79.26,79.95,78.16,78.99,54034900,78.99 -2006-10-18,74.75,75.37,73.91,74.53,40496700,74.53 -2006-10-17,75.04,75.27,74.04,74.29,17175900,74.29 -2006-10-16,75.19,75.88,74.79,75.40,18167600,75.40 -2006-10-13,75.63,76.88,74.74,75.02,24435600,75.02 -2006-10-12,73.61,75.39,73.60,75.26,21173400,75.26 -2006-10-11,73.42,73.98,72.60,73.23,20423400,73.23 -2006-10-10,74.54,74.58,73.08,73.81,18985300,73.81 -2006-10-09,73.80,75.08,73.53,74.63,15650800,74.63 -2006-10-06,74.42,75.04,73.81,74.22,16677100,74.22 -2006-10-05,74.53,76.16,74.13,74.83,24424400,74.83 -2006-10-04,74.10,75.46,73.16,75.38,29610100,75.38 -2006-10-03,74.45,74.95,73.19,74.08,28239600,74.08 -2006-10-02,75.10,75.87,74.30,74.86,25451400,74.86 -2006-09-29,77.11,77.52,76.68,76.98,14493300,76.98 -2006-09-28,77.02,77.48,75.95,77.01,25843200,77.01 -2006-09-27,77.17,77.47,75.82,76.41,28941900,76.41 -2006-09-26,76.18,77.78,76.10,77.61,39391000,77.61 -2006-09-25,73.81,75.86,73.72,75.75,30678300,75.75 -2006-09-22,74.30,74.34,72.58,73.00,23754000,73.00 -2006-09-21,75.25,76.06,74.02,74.65,28361600,74.65 -2006-09-20,74.38,75.68,74.22,75.26,29385400,75.26 -2006-09-19,74.10,74.36,72.80,73.77,25358900,73.77 -2006-09-18,73.80,74.86,73.30,73.89,25188500,73.89 -2006-09-15,74.60,74.98,73.29,74.10,35066200,74.10 -2006-09-14,73.72,74.67,73.46,74.17,28633200,74.17 -2006-09-13,72.85,74.32,72.30,74.20,40933500,74.20 -2006-09-12,72.81,73.45,71.45,72.63,60167400,72.63 -2006-09-11,72.43,73.73,71.42,72.50,33897300,72.50 -2006-09-08,73.37,73.57,71.91,72.52,31997200,72.52 -2006-09-07,70.60,73.48,70.25,72.80,45284200,72.80 -2006-09-06,71.08,71.69,69.70,70.03,34789400,70.03 -2006-09-05,68.97,71.50,68.55,71.48,36159200,71.48 -2006-09-01,68.48,68.65,67.82,68.38,14589100,68.38 -2006-08-31,67.28,68.30,66.66,67.85,20524900,67.85 -2006-08-30,67.34,67.82,66.68,66.96,24290800,66.96 -2006-08-29,66.99,67.26,65.12,66.48,33833300,66.48 -2006-08-28,68.50,68.61,66.68,66.98,26362900,66.98 -2006-08-25,67.34,69.05,67.31,68.75,19427100,68.75 -2006-08-24,67.89,68.19,66.27,67.81,23399700,67.81 -2006-08-23,68.00,68.65,66.94,67.31,19152100,67.31 -2006-08-22,66.68,68.32,66.50,67.62,20606000,67.62 -2006-08-21,67.30,67.31,66.15,66.56,18793800,66.56 -2006-08-18,67.71,68.40,67.26,67.91,19155500,67.91 -2006-08-17,68.00,68.66,67.18,67.59,20755300,67.59 -2006-08-16,67.10,68.07,66.33,67.98,27903000,67.98 -2006-08-15,65.34,66.50,64.80,66.45,30762600,66.45 -2006-08-14,64.05,65.22,63.60,63.94,25629300,63.94 -2006-08-11,63.23,64.13,62.58,63.65,27768900,63.65 -2006-08-10,63.25,64.81,62.70,64.07,24920000,64.07 -2006-08-09,65.43,65.60,63.40,63.59,34137100,63.59 -2006-08-08,67.09,67.11,64.51,64.78,35638000,64.78 -2006-08-07,67.72,69.60,66.31,67.21,44482600,67.21 -2006-08-04,67.05,68.61,64.96,68.30,66173800,68.30 -2006-08-03,67.91,70.00,67.81,69.59,30037300,69.59 -2006-08-02,67.65,68.68,67.51,68.16,19670300,68.16 -2006-08-01,67.22,67.93,65.94,67.18,25420200,67.18 -2006-07-31,66.83,68.63,66.28,67.96,31887200,67.96 -2006-07-28,63.94,65.68,63.50,65.59,24696700,65.59 -2006-07-27,64.50,65.02,62.86,63.40,26251600,63.40 -2006-07-26,62.00,64.64,61.68,63.87,32086700,63.87 -2006-07-25,61.78,62.09,60.78,61.93,21038200,61.93 -2006-07-24,61.26,62.10,60.43,61.42,25816300,61.42 -2006-07-21,59.82,61.15,59.64,60.72,31853300,60.72 -2006-07-20,60.96,61.59,59.72,60.50,70433800,60.50 -2006-07-19,52.96,55.08,52.36,54.10,49669400,54.10 -2006-07-18,53.16,53.85,51.85,52.90,35730300,52.90 -2006-07-17,51.73,53.11,51.65,52.37,36590800,52.37 -2006-07-14,52.50,52.89,50.16,50.67,35465600,50.67 -2006-07-13,52.03,54.12,51.41,52.25,44639500,52.25 -2006-07-12,55.17,55.24,52.92,52.96,33118900,52.96 -2006-07-11,55.11,55.99,54.53,55.65,29465100,55.65 -2006-07-10,55.70,56.49,54.50,55.00,18905200,55.00 -2006-07-07,55.48,56.55,54.67,55.40,28548600,55.40 -2006-07-06,57.09,57.40,55.61,55.77,22614600,55.77 -2006-07-05,57.15,57.60,56.56,57.00,18508600,57.00 -2006-07-03,57.52,58.18,57.34,57.95,6956100,57.95 -2006-06-30,57.59,57.75,56.50,57.27,26417700,57.27 -2006-06-29,56.76,59.09,56.39,58.97,31192800,58.97 -2006-06-28,57.29,57.30,55.41,56.02,30382300,56.02 -2006-06-27,59.09,59.22,57.40,57.43,19664700,57.43 -2006-06-26,59.17,59.20,58.37,58.99,16662000,58.99 -2006-06-23,59.72,60.17,58.73,58.83,23578700,58.83 -2006-06-22,58.20,59.75,58.07,59.58,34486900,59.58 -2006-06-21,57.74,58.71,57.30,57.86,30832000,57.86 -2006-06-20,57.61,58.35,57.29,57.47,24034800,57.47 -2006-06-19,57.83,58.18,57.00,57.20,25163400,57.20 -2006-06-16,58.96,59.19,57.52,57.56,29932200,57.56 -2006-06-15,57.30,59.74,56.75,59.38,42513700,59.38 -2006-06-14,58.28,58.78,56.69,57.61,31362000,57.61 -2006-06-13,57.61,59.10,57.36,58.33,38594400,58.33 -2006-06-12,59.40,59.73,56.96,57.00,25635200,57.00 -2006-06-09,61.18,61.56,59.10,59.24,27708500,59.24 -2006-06-08,58.44,60.93,57.15,60.76,49910100,60.76 -2006-06-07,60.10,60.40,58.35,58.56,26803800,58.56 -2006-06-06,60.22,60.63,58.91,59.72,25929900,59.72 -2006-06-05,61.15,61.15,59.97,60.00,21635200,60.00 -2006-06-02,62.99,63.10,60.88,61.66,24492400,61.66 -2006-06-01,59.85,62.28,59.52,62.17,33661000,62.17 -2006-05-31,61.76,61.79,58.69,59.77,45749200,59.77 -2006-05-30,63.29,63.30,61.22,61.22,20121500,61.22 -2006-05-26,64.31,64.56,63.14,63.55,15462500,63.55 -2006-05-25,64.26,64.45,63.29,64.33,16549000,64.33 -2006-05-24,62.99,63.65,61.56,63.34,32715400,63.34 -2006-05-23,64.86,65.19,63.00,63.15,24800500,63.15 -2006-05-22,63.87,63.99,62.77,63.38,25677700,63.38 -2006-05-19,63.26,64.88,62.82,64.51,35209500,64.51 -2006-05-18,65.68,66.26,63.12,63.18,23515800,63.18 -2006-05-17,64.71,65.70,64.07,65.26,26935500,65.26 -2006-05-16,68.10,68.25,64.75,64.98,33455000,64.98 -2006-05-15,67.37,68.38,67.12,67.79,18899200,67.79 -2006-05-12,67.85,68.69,66.86,67.70,22920500,67.70 -2006-05-11,70.79,70.84,67.55,68.15,29024600,68.15 -2006-05-10,71.29,71.33,69.61,70.60,16424600,70.60 -2006-05-09,71.82,72.56,70.62,71.03,18988100,71.03 -2006-05-08,72.99,73.80,71.72,71.89,21244700,71.89 -2006-05-05,71.86,72.25,71.15,71.89,20139700,71.89 -2006-05-04,71.22,72.89,70.46,71.13,30729300,71.13 -2006-05-03,71.83,71.95,70.18,71.14,24535400,71.14 -2006-05-02,70.15,71.98,70.11,71.62,27559400,71.62 -2006-05-01,70.77,71.54,69.16,69.60,26799300,69.60 -2006-04-28,69.38,71.30,69.20,70.39,27144200,70.39 -2006-04-27,67.73,69.86,67.35,69.36,30212400,69.36 -2006-04-26,66.65,68.28,66.40,68.15,25388800,68.15 -2006-04-25,65.96,66.59,65.56,66.17,18895100,66.17 -2006-04-24,66.85,66.92,65.50,65.75,25251000,65.75 -2006-04-21,68.19,68.64,66.47,67.04,28178100,67.04 -2006-04-20,69.51,70.00,66.20,67.63,59535100,67.63 -2006-04-19,66.82,67.00,65.47,65.65,38786900,65.65 -2006-04-18,65.04,66.47,64.79,66.22,28387300,66.22 -2006-04-17,66.51,66.84,64.35,64.81,25783500,64.81 -2006-04-13,66.34,67.44,65.81,66.47,26238500,66.47 -2006-04-12,68.01,68.17,66.30,66.71,26424800,66.71 -2006-04-11,68.99,69.30,67.07,67.99,33547000,67.99 -2006-04-10,70.29,70.93,68.45,68.67,32268400,68.67 -2006-04-07,70.93,71.21,68.47,69.79,55187100,69.79 -2006-04-06,68.30,72.05,68.20,71.24,95134600,71.24 -2006-04-05,64.71,67.21,64.15,67.21,79764600,67.21 -2006-04-04,62.10,62.22,61.05,61.17,33283000,61.17 -2006-04-03,63.67,64.12,62.61,62.65,29135400,62.65 -2006-03-31,63.25,63.61,62.24,62.72,29119900,62.72 -2006-03-30,62.82,63.30,61.53,62.75,49666100,62.75 -2006-03-29,59.13,62.52,57.67,62.33,83815500,62.33 -2006-03-28,59.63,60.14,58.25,58.71,48940100,58.71 -2006-03-27,60.35,61.38,59.40,59.51,39574000,59.51 -2006-03-24,60.25,60.94,59.03,59.96,38285000,59.96 -2006-03-23,61.82,61.90,59.61,60.16,50993800,60.16 -2006-03-22,62.16,63.25,61.27,61.67,48067700,61.67 -2006-03-21,64.29,64.34,61.39,61.81,47991700,61.81 -2006-03-20,65.22,65.46,63.87,63.99,21622900,63.99 -2006-03-17,64.75,65.54,64.11,64.66,29001500,64.66 -2006-03-16,66.85,66.90,64.30,64.31,26772800,64.31 -2006-03-15,67.71,68.04,65.52,66.23,31857000,66.23 -2006-03-14,65.77,67.32,65.50,67.32,22929300,67.32 -2006-03-13,65.05,66.28,64.79,65.68,30756700,65.68 -2006-03-10,64.05,64.49,62.45,63.19,37255100,63.19 -2006-03-09,65.98,66.47,63.81,63.93,28546600,63.93 -2006-03-08,66.29,67.20,65.35,65.66,23330400,65.66 -2006-03-07,65.76,66.90,65.08,66.31,31174200,66.31 -2006-03-06,67.69,67.72,64.94,65.48,32595200,65.48 -2006-03-03,69.40,69.91,67.53,67.72,26345300,67.72 -2006-03-02,68.99,69.99,68.67,69.61,22331200,69.61 -2006-03-01,68.84,69.49,68.02,69.10,27279200,69.10 -2006-02-28,71.58,72.40,68.10,68.49,45249300,68.49 -2006-02-27,71.99,72.12,70.65,70.99,28258600,70.99 -2006-02-24,72.14,72.89,71.20,71.46,19098000,71.46 -2006-02-23,71.79,73.00,71.43,71.75,30604200,71.75 -2006-02-22,69.00,71.67,68.00,71.32,34937100,71.32 -2006-02-21,70.59,70.80,68.68,69.08,27843100,69.08 -2006-02-17,70.30,70.89,69.61,70.29,20571400,70.29 -2006-02-16,69.91,71.01,69.48,70.57,33863400,70.57 -2006-02-15,67.16,69.62,66.75,69.22,41420400,69.22 -2006-02-14,65.10,68.10,65.00,67.64,41462100,67.64 -2006-02-13,66.63,66.75,64.64,64.71,31553500,64.71 -2006-02-10,65.18,67.67,62.90,67.31,62874200,67.31 -2006-02-09,69.10,69.23,64.53,64.95,41063000,64.95 -2006-02-08,68.49,69.08,66.00,68.81,34039800,68.81 -2006-02-07,68.27,69.48,66.68,67.60,49601100,67.60 -2006-02-06,72.02,72.51,66.74,67.30,58991700,67.30 -2006-02-03,72.24,72.79,71.04,71.85,24718700,71.85 -2006-02-02,75.10,75.36,72.05,72.10,25261500,72.10 -2006-02-01,74.95,76.46,74.64,75.42,18613800,75.42 -2006-01-31,75.50,76.34,73.75,75.51,32626500,75.51 -2006-01-30,71.17,76.60,70.87,75.00,49942900,75.00 -2006-01-27,72.95,73.60,71.10,72.03,34066600,72.03 -2006-01-26,74.53,75.43,71.93,72.33,42192400,72.33 -2006-01-25,77.39,77.50,73.25,74.20,45563800,74.20 -2006-01-24,78.76,79.42,75.77,76.04,40794800,76.04 -2006-01-23,76.10,79.56,76.00,77.67,37847500,77.67 -2006-01-20,79.28,80.04,75.83,76.09,40527100,76.09 -2006-01-19,81.25,81.66,78.74,79.04,60566000,79.04 -2006-01-18,83.08,84.05,81.85,82.49,42879900,82.49 -2006-01-17,85.70,86.38,83.87,84.71,29843700,84.71 -2006-01-13,84.99,86.01,84.60,85.59,27725200,85.59 -2006-01-12,84.97,86.40,83.62,84.29,45743200,84.29 -2006-01-11,83.84,84.80,82.59,83.90,53349800,83.90 -2006-01-10,76.25,81.89,75.83,80.86,81423900,80.86 -2006-01-09,76.73,77.20,75.74,76.05,24108600,76.05 -2006-01-06,75.25,76.70,74.55,76.30,25159200,76.30 -2006-01-05,74.83,74.90,73.75,74.38,16050800,74.38 -2006-01-04,75.13,75.98,74.50,74.97,22128700,74.97 -2006-01-03,72.38,74.75,72.25,74.75,28829800,74.75 -2005-12-30,70.91,72.43,70.34,71.89,22295100,71.89 -2005-12-29,73.78,73.82,71.42,71.45,17500900,71.45 -2005-12-28,74.47,74.76,73.32,73.57,14218400,73.57 -2005-12-27,74.00,75.18,73.95,74.23,21092500,74.23 -2005-12-23,74.17,74.26,73.30,73.35,8209200,73.35 -2005-12-22,73.91,74.49,73.60,74.02,13236100,74.02 -2005-12-21,72.60,73.61,72.54,73.50,16990600,73.50 -2005-12-20,71.63,72.38,71.12,72.11,17111000,72.11 -2005-12-19,71.11,72.60,71.04,71.38,18903400,71.38 -2005-12-16,72.14,72.30,71.06,71.11,23970400,71.11 -2005-12-15,72.68,72.86,71.35,72.18,20041500,72.18 -2005-12-14,72.53,73.30,70.27,72.01,51811300,72.01 -2005-12-13,74.85,75.46,74.21,74.98,17636300,74.98 -2005-12-12,74.87,75.35,74.56,74.91,18749800,74.91 -2005-12-09,74.21,74.59,73.35,74.33,19835800,74.33 -2005-12-08,73.20,74.17,72.60,74.08,28231500,74.08 -2005-12-07,74.23,74.46,73.12,73.95,24266600,73.95 -2005-12-06,73.93,74.83,73.35,74.05,30608200,74.05 -2005-12-05,71.95,72.53,71.49,71.82,20845400,71.82 -2005-12-02,72.27,72.74,70.70,72.63,31991500,72.63 -2005-12-01,68.95,71.73,68.81,71.60,29031900,71.60 -2005-11-30,68.43,68.85,67.52,67.82,21274100,67.82 -2005-11-29,69.99,70.30,67.35,68.10,31836900,68.10 -2005-11-28,70.72,71.07,69.07,69.66,36375700,69.66 -2005-11-25,67.66,69.54,67.50,69.34,14107600,69.34 -2005-11-23,66.88,67.98,66.69,67.11,17351900,67.11 -2005-11-22,64.84,66.76,64.52,66.52,19295800,66.52 -2005-11-21,64.82,65.19,63.72,64.96,18275400,64.96 -2005-11-18,65.31,65.43,64.37,64.56,18748700,64.56 -2005-11-17,65.59,65.88,64.25,64.52,24150200,64.52 -2005-11-16,63.15,65.06,63.09,64.95,28018400,64.95 -2005-11-15,61.60,63.08,61.46,62.28,19172900,62.28 -2005-11-14,61.54,61.98,60.91,61.45,13211900,61.45 -2005-11-11,61.54,62.11,61.34,61.54,15194600,61.54 -2005-11-10,60.64,61.20,59.01,61.18,23762300,61.18 -2005-11-09,60.00,61.21,60.00,60.11,19747500,60.11 -2005-11-08,59.95,60.38,59.10,59.90,16920200,59.90 -2005-11-07,60.85,61.67,60.14,60.23,22815400,60.23 -2005-11-04,60.35,61.24,59.62,61.15,31358400,61.15 -2005-11-03,60.26,62.32,60.07,61.85,31585100,61.85 -2005-11-02,57.72,60.00,57.60,59.95,30609300,59.95 -2005-11-01,57.24,58.14,56.87,57.50,26774500,57.50 -2005-10-31,55.20,57.98,54.75,57.59,33601600,57.59 -2005-10-28,56.04,56.43,54.17,54.47,27492400,54.47 -2005-10-27,56.99,57.01,55.41,55.41,14697900,55.41 -2005-10-26,56.28,57.56,55.92,57.03,22556900,57.03 -2005-10-25,56.40,56.85,55.69,56.10,16611700,56.10 -2005-10-24,55.25,56.79,55.09,56.79,21776900,56.79 -2005-10-21,56.84,56.98,55.36,55.66,28454500,55.66 -2005-10-20,54.47,56.50,54.35,56.14,48491500,56.14 -2005-10-19,52.07,54.96,51.21,54.94,36024400,54.94 -2005-10-18,53.25,53.95,52.20,52.21,21771000,52.21 -2005-10-17,53.98,54.23,52.68,53.44,22029800,53.44 -2005-10-14,54.03,54.35,52.79,54.00,36984000,54.00 -2005-10-13,49.44,53.95,49.27,53.74,66627700,53.74 -2005-10-12,48.65,50.30,47.87,49.25,96338800,49.25 -2005-10-11,51.23,51.87,50.40,51.59,43781600,51.59 -2005-10-10,51.76,51.91,50.28,50.37,18125200,50.37 -2005-10-07,51.72,51.93,50.55,51.30,24210100,51.30 -2005-10-06,53.20,53.49,50.87,51.70,27054900,51.70 -2005-10-05,54.33,54.36,52.75,52.78,21813200,52.78 -2005-10-04,54.95,55.35,53.64,53.75,19266400,53.75 -2005-10-03,54.16,54.54,53.68,54.44,18126900,54.44 -2005-09-30,52.33,53.65,51.88,53.61,18986900,53.61 -2005-09-29,51.23,52.59,50.81,52.34,22744500,52.34 -2005-09-28,53.07,53.11,50.59,51.08,40198000,51.08 -2005-09-27,53.92,54.24,53.43,53.44,12203700,53.44 -2005-09-26,54.03,54.56,53.32,53.84,19520100,53.84 -2005-09-23,52.10,53.50,51.84,53.20,19944900,53.20 -2005-09-22,51.88,52.47,51.32,51.90,16561700,51.90 -2005-09-21,52.96,53.05,51.86,52.11,15526700,52.11 -2005-09-20,52.99,53.81,52.92,53.19,29279600,53.19 -2005-09-19,51.05,52.89,51.05,52.64,27990400,52.64 -2005-09-16,50.23,51.21,49.95,51.21,21107300,51.21 -2005-09-15,50.00,50.18,49.33,49.87,14827000,49.87 -2005-09-14,51.06,51.19,49.46,49.61,16943800,49.61 -2005-09-13,51.02,51.29,50.32,50.82,17603000,50.82 -2005-09-12,51.10,51.63,50.58,51.40,16171300,51.40 -2005-09-09,50.07,51.35,49.79,51.31,21987200,51.31 -2005-09-08,49.35,50.12,49.14,49.78,25094300,49.78 -2005-09-07,49.05,49.40,47.92,48.68,34395500,48.68 -2005-09-06,46.70,48.88,46.55,48.80,29236400,48.80 -2005-09-02,46.30,46.80,46.12,46.22,7942100,46.22 -2005-09-01,47.00,47.17,46.09,46.26,12727400,46.26 -2005-08-31,46.86,47.03,46.27,46.89,14391300,46.89 -2005-08-30,45.99,46.79,45.92,46.57,18527200,46.57 -2005-08-29,45.27,46.03,45.26,45.84,9153400,45.84 -2005-08-26,46.12,46.34,45.36,45.74,9323500,45.74 -2005-08-25,46.12,46.49,45.81,46.06,9866200,46.06 -2005-08-24,45.60,47.12,45.59,45.77,20431100,45.77 -2005-08-23,45.85,46.10,45.32,45.74,10557300,45.74 -2005-08-22,46.15,46.75,45.26,45.87,13847600,45.87 -2005-08-19,46.28,46.70,45.77,45.83,13448900,45.83 -2005-08-18,46.91,47.00,45.75,46.30,15805700,46.30 -2005-08-17,46.40,47.44,46.37,47.15,17847300,47.15 -2005-08-16,47.39,47.50,46.21,46.25,19200800,46.25 -2005-08-15,46.48,48.33,46.45,47.68,38811700,47.68 -2005-08-12,43.46,46.22,43.36,46.10,32715600,46.10 -2005-08-11,43.39,44.12,43.25,44.00,9713700,44.00 -2005-08-10,44.00,44.39,43.31,43.38,12890900,43.38 -2005-08-09,42.93,43.89,42.91,43.82,13601400,43.82 -2005-08-08,43.00,43.25,42.61,42.65,6299400,42.65 -2005-08-05,42.49,43.36,42.02,42.99,8640400,42.99 -2005-08-04,42.89,43.00,42.29,42.71,9618000,42.71 -2005-08-03,43.19,43.31,42.77,43.22,9225800,43.22 -2005-08-02,42.89,43.50,42.61,43.19,10602700,43.19 -2005-08-01,42.57,43.08,42.08,42.75,11223200,42.75 -2005-07-29,43.56,44.38,42.26,42.65,20074300,42.65 -2005-07-28,43.85,44.00,43.30,43.80,8975400,43.80 -2005-07-27,43.83,44.07,42.67,43.99,10133900,43.99 -2005-07-26,44.01,44.11,43.36,43.63,9592600,43.63 -2005-07-25,43.99,44.28,43.73,43.81,10522400,43.81 -2005-07-22,43.44,44.00,43.39,44.00,10753800,44.00 -2005-07-21,43.70,44.04,42.90,43.29,14438000,43.29 -2005-07-20,42.86,43.80,42.65,43.63,16192700,43.63 -2005-07-19,41.52,43.23,41.07,43.19,23966500,43.19 -2005-07-18,41.41,42.10,41.37,41.49,20939200,41.49 -2005-07-15,40.97,41.57,40.46,41.55,24560100,41.55 -2005-07-14,40.79,42.01,40.23,40.75,74859300,40.75 -2005-07-13,38.29,38.50,37.90,38.35,24458400,38.35 -2005-07-12,38.23,38.40,37.91,38.24,13822800,38.24 -2005-07-11,38.37,38.65,37.78,38.10,13885300,38.10 -2005-07-08,37.87,38.28,37.47,38.25,10383400,38.25 -2005-07-07,36.81,37.76,36.80,37.63,13704400,37.63 -2005-07-06,37.71,38.16,37.20,37.39,14093800,37.39 -2005-07-05,36.55,38.15,36.50,37.98,16223900,37.98 -2005-07-01,36.83,36.97,36.29,36.50,8928600,36.50 -2005-06-30,36.61,37.16,36.31,36.81,14942500,36.81 -2005-06-29,37.23,37.29,36.12,36.37,16012800,36.37 -2005-06-28,37.49,37.59,37.17,37.31,12510700,37.31 -2005-06-27,36.84,38.10,36.68,37.10,21434700,37.10 -2005-06-24,39.09,39.12,37.68,37.76,14668200,37.76 -2005-06-23,38.83,39.78,38.65,38.89,24080500,38.89 -2005-06-22,38.26,38.60,38.14,38.55,15175900,38.55 -2005-06-21,37.72,38.19,37.38,37.86,13233100,37.86 -2005-06-20,37.85,38.09,37.45,37.61,11561300,37.61 -2005-06-17,38.47,38.54,37.83,38.31,21290200,38.31 -2005-06-16,37.19,38.08,36.82,37.98,19559800,37.98 -2005-06-15,36.87,37.30,36.30,37.13,20119400,37.13 -2005-06-14,35.92,36.15,35.75,36.00,12423100,36.00 -2005-06-13,35.89,36.61,35.82,35.90,15563300,35.90 -2005-06-10,37.40,37.40,35.52,35.81,24247600,35.81 -2005-06-09,37.00,37.94,36.82,37.65,13937700,37.65 -2005-06-08,36.63,37.25,36.57,36.92,14428800,36.92 -2005-06-07,37.60,37.73,36.45,36.54,26616600,36.54 -2005-06-06,38.33,38.63,37.56,37.92,28998800,37.92 -2005-06-03,38.16,38.58,37.77,38.24,34173900,38.24 -2005-06-02,40.05,40.32,39.60,40.04,13356200,40.04 -2005-06-01,39.89,40.76,39.86,40.30,16207600,40.30 -2005-05-31,40.66,40.74,39.58,39.76,14435900,39.76 -2005-05-27,40.64,40.79,40.01,40.56,11286000,40.56 -2005-05-26,39.94,40.94,39.94,40.74,18768600,40.74 -2005-05-25,39.50,39.95,39.32,39.78,14143100,39.78 -2005-05-24,39.45,39.99,39.03,39.70,21195000,39.70 -2005-05-23,37.85,39.90,37.85,39.76,37234800,39.76 -2005-05-20,37.25,37.65,37.19,37.55,16166100,37.55 -2005-05-19,35.78,37.68,35.78,37.55,28327200,37.55 -2005-05-18,35.45,37.56,34.99,35.84,22740100,35.84 -2005-05-17,35.14,35.46,34.54,35.36,21012300,35.36 -2005-05-16,34.56,35.70,34.53,35.55,16939100,35.55 -2005-05-13,34.20,35.23,34.07,34.77,25096900,34.77 -2005-05-12,35.42,35.59,34.00,34.13,34651500,34.13 -2005-05-11,35.20,35.67,33.11,35.61,72927900,35.61 -2005-05-10,36.75,37.25,36.33,36.42,15723700,36.42 -2005-05-09,37.28,37.45,36.75,36.97,12703400,36.97 -2005-05-06,36.89,37.33,36.79,37.24,11651700,37.24 -2005-05-05,37.25,37.27,36.47,36.68,13834500,36.68 -2005-05-04,36.11,37.20,36.10,37.15,16006300,37.15 -2005-05-03,36.40,36.74,36.03,36.21,17740700,36.21 -2005-05-02,36.21,36.65,36.02,36.43,16640000,36.43 -2005-04-29,36.15,36.23,35.22,36.06,23986800,36.06 -2005-04-28,36.29,36.34,35.24,35.54,20539500,35.54 -2005-04-27,35.89,36.36,35.51,35.95,21924600,35.95 -2005-04-26,36.78,37.51,36.12,36.19,28946700,36.19 -2005-04-25,36.49,37.02,36.11,36.98,26659300,36.98 -2005-04-22,36.84,37.00,34.90,35.50,29968900,35.50 -2005-04-21,36.40,37.21,35.90,37.18,27128300,37.18 -2005-04-20,37.66,37.74,35.44,35.51,33754700,35.51 -2005-04-19,36.60,37.44,35.87,37.09,38630100,37.09 -2005-04-18,35.00,36.30,34.00,35.62,47399200,35.62 -2005-04-15,36.62,37.25,35.28,35.35,61717400,35.35 -2005-04-14,38.81,39.56,36.84,37.26,98328300,37.26 -2005-04-13,42.95,42.99,40.39,41.04,48998100,41.04 -2005-04-12,42.49,43.19,42.01,42.66,35037900,42.66 -2005-04-11,44.15,44.25,41.91,41.92,29345100,41.92 -2005-04-08,43.70,44.45,43.54,43.74,23212500,43.74 -2005-04-07,42.33,43.75,42.25,43.56,18106700,43.56 -2005-04-06,42.40,42.81,42.15,42.33,14815200,42.33 -2005-04-05,41.22,42.24,41.09,41.89,19865700,41.89 -2005-04-04,40.99,41.31,40.16,41.09,20714800,41.09 -2005-04-01,42.09,42.18,40.57,40.89,22903000,40.89 -2005-03-31,42.45,42.52,41.59,41.67,22719100,41.67 -2005-03-30,42.07,42.80,41.82,42.80,14105700,42.80 -2005-03-29,42.56,42.83,41.50,41.75,16477000,41.75 -2005-03-28,42.75,42.96,42.47,42.53,9836100,42.53 -2005-03-24,42.91,43.00,42.50,42.50,12596600,42.50 -2005-03-23,42.45,43.40,42.02,42.55,21779400,42.55 -2005-03-22,43.71,43.96,42.68,42.83,19693400,42.83 -2005-03-21,43.29,43.97,42.86,43.70,19326000,43.70 -2005-03-18,43.33,43.44,42.50,42.96,33576800,42.96 -2005-03-17,41.53,42.88,41.32,42.25,28640000,42.25 -2005-03-16,41.21,42.31,40.78,41.18,24921900,41.18 -2005-03-15,40.64,41.14,40.25,40.96,18164600,40.96 -2005-03-14,40.52,40.79,39.52,40.32,21620900,40.32 -2005-03-11,40.21,40.59,39.80,40.27,22601100,40.27 -2005-03-10,39.53,40.26,39.10,39.83,27753900,39.83 -2005-03-09,39.64,40.28,38.83,39.35,47230900,39.35 -2005-03-08,41.90,42.16,40.10,40.53,36480400,40.53 -2005-03-07,42.80,43.25,42.35,42.75,16094000,42.75 -2005-03-04,42.76,43.01,41.85,42.81,27022100,42.81 -2005-03-03,44.37,44.41,41.22,41.79,50416200,41.79 -2005-03-02,44.25,44.89,44.08,44.12,16362900,44.12 -2005-03-01,44.99,45.11,44.16,44.50,16721000,44.50 -2005-02-28,44.68,45.14,43.96,44.86,23271800,44.86 -2005-02-25,89.62,89.91,88.19,88.99,32696800,44.49 -2005-02-24,88.48,89.31,87.73,88.93,54251000,44.47 -2005-02-23,86.72,88.45,85.55,88.23,48042200,44.12 -2005-02-22,86.30,88.30,85.29,85.29,43546200,42.65 -2005-02-18,87.74,87.86,86.25,86.81,41544800,43.40 -2005-02-17,90.65,90.88,87.45,87.81,54231200,43.90 -2005-02-16,88.15,90.20,87.35,90.13,58544400,45.06 -2005-02-15,86.66,89.08,86.00,88.41,82579200,44.21 -2005-02-14,82.73,84.79,82.05,84.63,45409400,42.31 -2005-02-11,79.86,81.76,78.94,81.21,42894800,40.60 -2005-02-10,78.72,79.28,76.66,78.36,39036400,39.18 -2005-02-09,81.04,81.99,78.10,78.74,42552000,39.37 -2005-02-08,79.07,81.38,78.79,80.90,31786400,40.45 -2005-02-07,78.93,79.35,77.50,78.94,18730600,39.47 -2005-02-04,77.87,78.93,77.53,78.84,20127000,39.42 -2005-02-03,79.10,79.43,77.33,77.81,26130400,38.90 -2005-02-02,77.95,79.91,77.69,79.63,36430800,39.81 -2005-02-01,77.05,77.77,76.58,77.53,24228400,38.76 -2005-01-31,74.58,77.89,74.51,76.90,60039200,38.45 -2005-01-28,72.62,73.98,72.44,73.98,28629000,36.99 -2005-01-27,72.16,72.92,71.55,72.64,17722400,36.32 -2005-01-26,72.66,72.75,71.22,72.25,26410600,36.12 -2005-01-25,71.37,72.84,70.94,72.05,34615400,36.03 -2005-01-24,70.98,71.78,70.55,70.76,30058200,35.38 -2005-01-21,71.31,71.60,70.00,70.49,32547600,35.24 -2005-01-20,69.65,71.27,69.47,70.46,32675800,35.23 -2005-01-19,70.49,71.46,69.75,69.88,26853400,34.94 -2005-01-18,69.85,70.70,67.75,70.65,35945000,35.33 -2005-01-14,70.25,71.72,69.19,70.20,63240800,35.10 -2005-01-13,73.71,74.42,69.73,69.80,113025600,34.90 -2005-01-12,65.45,65.90,63.30,65.46,68560800,32.73 -2005-01-11,68.25,69.15,64.14,64.56,93272400,32.28 -2005-01-10,69.83,70.70,67.88,68.96,61618200,34.48 -2005-01-07,65.00,69.63,64.75,69.25,79551800,34.62 -2005-01-06,64.67,64.91,63.33,64.55,25198400,32.28 -2005-01-05,64.46,65.25,64.05,64.50,24301200,32.25 -2005-01-04,63.79,65.47,62.97,63.94,39171800,31.97 -2005-01-03,64.78,65.11,62.60,63.29,24714000,31.65 -2004-12-31,64.89,65.00,64.03,64.40,9949600,32.20 -2004-12-30,64.81,65.03,64.22,64.80,12333600,32.40 -2004-12-29,63.81,64.98,63.57,64.44,16055800,32.22 -2004-12-28,63.30,64.25,62.05,64.18,21848400,32.09 -2004-12-27,64.80,65.15,62.88,63.16,19981800,31.58 -2004-12-23,63.75,64.25,63.60,64.01,8783200,32.01 -2004-12-22,63.66,64.36,63.40,63.75,20208200,31.88 -2004-12-21,63.56,63.77,61.60,63.69,38014800,31.84 -2004-12-20,65.47,66.00,61.76,62.72,41718800,31.36 -2004-12-17,66.84,67.04,64.90,64.99,27982000,32.49 -2004-12-16,66.15,67.50,66.05,66.60,40218400,33.30 -2004-12-15,65.24,65.46,64.66,65.26,14227200,32.63 -2004-12-14,65.40,65.88,65.02,65.29,14847200,32.65 -2004-12-13,65.62,65.90,64.60,64.91,14108600,32.46 -2004-12-10,65.03,66.05,64.70,65.15,27706200,32.58 -2004-12-09,62.81,64.40,62.07,63.99,26482200,32.00 -2004-12-08,63.08,64.43,62.05,63.28,24710800,31.64 -2004-12-07,65.93,66.73,62.56,62.89,37746400,31.44 -2004-12-06,64.25,66.24,62.95,65.78,44568600,32.89 -2004-12-03,64.53,65.00,61.75,62.68,44244600,31.34 -2004-12-02,66.13,66.90,64.66,65.21,35265800,32.60 -2004-12-01,67.79,67.95,66.27,67.79,28591200,33.90 -2004-11-30,68.79,68.79,67.05,67.05,36732800,33.53 -2004-11-29,68.95,69.57,67.41,68.44,61175600,34.22 -2004-11-26,65.35,65.76,64.34,64.55,19648000,32.28 -2004-11-24,61.69,65.20,61.55,64.05,49671000,32.03 -2004-11-23,62.30,62.45,61.05,61.27,32551800,30.64 -2004-11-22,61.80,64.00,57.90,61.35,91721800,30.67 -2004-11-19,55.49,56.91,54.50,55.17,27331400,27.58 -2004-11-18,54.30,55.45,54.29,55.39,16398200,27.69 -2004-11-17,55.19,55.45,54.22,54.90,14205400,27.45 -2004-11-16,55.16,55.20,54.48,54.94,10539400,27.47 -2004-11-15,55.20,55.46,54.34,55.24,13430200,27.62 -2004-11-12,55.01,55.69,54.84,55.50,14132200,27.75 -2004-11-11,54.95,55.43,54.23,55.30,14546400,27.65 -2004-11-10,53.95,55.39,53.91,54.75,18167000,27.38 -2004-11-09,54.23,54.55,53.38,54.05,16991600,27.02 -2004-11-08,54.27,55.45,53.86,54.38,18818600,27.19 -2004-11-05,54.86,55.00,52.04,54.72,43037400,27.36 -2004-11-04,55.03,55.55,54.37,54.45,33165200,27.23 -2004-11-03,54.37,56.11,53.99,55.31,43006200,27.66 -2004-11-02,52.40,54.08,52.40,53.50,26071000,26.75 -2004-11-01,52.50,53.26,52.04,52.45,21501800,26.23 -2004-10-29,51.84,53.20,51.80,52.40,28936400,26.20 -2004-10-28,49.98,52.22,49.50,52.19,30866600,26.09 -2004-10-27,48.51,50.62,48.17,50.30,42624800,25.15 -2004-10-26,47.45,48.05,46.97,47.97,21227200,23.99 -2004-10-25,47.20,47.84,47.07,47.55,14023000,23.77 -2004-10-22,47.54,47.67,47.02,47.41,17252400,23.70 -2004-10-21,47.48,48.13,47.36,47.94,25875200,23.97 -2004-10-20,47.18,47.60,46.65,47.47,21611000,23.74 -2004-10-19,48.10,48.35,47.31,47.42,28642600,23.71 -2004-10-18,44.70,47.75,44.70,47.75,42884000,23.88 -2004-10-15,44.88,45.61,44.19,45.50,36826000,22.75 -2004-10-14,43.19,45.75,42.55,44.98,98872400,22.49 -2004-10-13,38.87,39.76,38.74,39.75,41536000,19.88 -2004-10-12,38.50,38.58,37.65,38.29,16435400,19.15 -2004-10-11,38.80,39.06,38.20,38.59,11566800,19.30 -2004-10-08,39.56,39.77,38.84,39.06,12829600,19.53 -2004-10-07,40.54,40.93,39.46,39.62,15219600,19.81 -2004-10-06,39.50,40.76,39.47,40.64,15939400,20.32 -2004-10-05,38.56,39.67,38.40,39.37,14505800,19.68 -2004-10-04,39.18,39.18,38.75,38.79,20503000,19.40 -2004-10-01,39.12,39.19,38.58,38.67,16621600,19.33 -2004-09-30,39.00,39.27,38.45,38.75,15179000,19.38 -2004-09-29,37.93,38.86,37.82,38.68,9768200,19.34 -2004-09-28,37.46,38.29,37.45,38.04,12613800,19.02 -2004-09-27,36.95,37.98,36.83,37.53,14197000,18.76 -2004-09-24,37.45,38.00,37.15,37.29,13196000,18.65 -2004-09-23,37.04,37.50,36.93,37.27,14193000,18.64 -2004-09-22,38.10,38.14,36.81,36.92,14346000,18.46 -2004-09-21,37.75,38.87,37.46,38.01,13809000,19.00 -2004-09-20,36.88,37.98,36.87,37.71,8750000,18.85 -2004-09-17,36.55,37.38,36.40,37.14,17939600,18.57 -2004-09-16,35.20,36.76,35.08,36.35,17925600,18.17 -2004-09-15,35.36,35.48,34.80,35.20,8309600,17.60 -2004-09-14,35.24,35.55,34.78,35.49,9100800,17.75 -2004-09-13,35.88,36.07,35.32,35.59,10070600,17.80 -2004-09-10,35.66,36.23,35.46,35.87,11714800,17.93 -2004-09-09,36.10,36.30,35.28,35.70,16476400,17.85 -2004-09-08,35.70,36.57,35.68,36.35,12268800,18.17 -2004-09-07,35.40,36.19,35.23,35.76,10784200,17.88 -2004-09-03,35.01,35.92,35.01,35.23,10481000,17.61 -2004-09-02,35.50,35.81,34.83,35.66,14511600,17.83 -2004-09-01,34.30,35.99,34.19,35.86,18418800,17.93 -2004-08-31,34.07,34.95,34.00,34.49,13448600,17.25 -2004-08-30,34.00,34.72,33.96,34.12,7790800,17.06 -2004-08-27,34.68,34.76,34.00,34.35,13886200,17.17 -2004-08-26,33.04,35.18,32.74,34.66,34137800,17.33 -2004-08-25,31.87,33.15,31.73,33.05,18057800,16.52 -2004-08-24,31.26,31.95,31.19,31.95,13362000,15.98 -2004-08-23,30.86,31.27,30.60,31.08,9095000,15.54 -2004-08-20,30.71,30.99,30.49,30.80,11313600,15.40 -2004-08-19,31.51,31.86,30.36,30.71,13890000,15.35 -2004-08-18,30.51,31.85,30.49,31.74,13023400,15.87 -2004-08-17,30.58,31.13,30.35,30.87,11536400,15.44 -2004-08-16,31.00,31.72,30.64,30.78,15559800,15.39 -2004-08-13,30.60,31.28,30.40,30.84,11716000,15.42 -2004-08-12,30.45,30.85,30.28,30.37,8078600,15.19 -2004-08-11,31.10,31.13,30.26,31.01,11514000,15.51 -2004-08-10,30.39,31.54,30.35,31.52,12537000,15.76 -2004-08-09,29.85,30.45,29.81,30.30,10387400,15.15 -2004-08-06,30.90,31.10,29.70,29.78,17581800,14.89 -2004-08-05,31.81,32.30,31.25,31.39,8732200,15.69 -2004-08-04,31.19,32.12,31.17,31.79,9874600,15.90 -2004-08-03,31.45,31.72,31.15,31.29,7558200,15.65 -2004-08-02,31.18,32.20,31.13,31.58,13039000,15.79 -2004-07-30,32.65,33.00,32.00,32.34,8679400,16.17 -2004-07-29,32.47,32.82,32.13,32.64,7934200,16.32 -2004-07-28,32.31,32.41,31.16,32.27,10180400,16.14 -2004-07-27,31.80,32.75,31.57,32.43,15178800,16.22 -2004-07-26,30.85,31.45,30.78,31.26,14069000,15.63 -2004-07-23,31.53,31.75,30.48,30.70,9770400,15.35 -2004-07-22,31.25,31.73,31.06,31.68,11932800,15.84 -2004-07-21,32.42,32.71,31.34,31.62,10759200,15.81 -2004-07-20,31.95,32.20,31.55,32.20,11562400,16.10 -2004-07-19,32.01,32.22,31.66,31.97,19041800,15.98 -2004-07-16,32.80,32.92,32.12,32.20,17442200,16.10 -2004-07-15,32.66,33.63,32.11,32.93,63133000,16.47 -2004-07-14,28.86,29.97,28.74,29.58,29850000,14.79 -2004-07-13,29.25,29.60,29.02,29.22,11292000,14.61 -2004-07-12,30.02,30.04,28.93,29.14,18272200,14.57 -2004-07-09,30.27,30.50,30.03,30.03,7459400,15.02 -2004-07-08,30.13,30.68,29.95,30.14,8335000,15.07 -2004-07-07,30.85,31.36,30.13,30.39,14214000,15.19 -2004-07-06,31.27,31.42,30.80,30.95,12463600,15.48 -2004-07-02,30.48,31.18,29.73,31.08,32524400,15.54 -2004-07-01,32.10,32.48,31.90,32.30,12212200,16.15 -2004-06-30,32.56,32.97,31.89,32.54,13323000,16.27 -2004-06-29,32.07,32.99,31.41,32.50,21091200,16.25 -2004-06-28,34.18,34.19,32.21,32.49,18610600,16.25 -2004-06-25,33.07,33.70,33.00,33.70,11551000,16.85 -2004-06-24,33.51,33.70,32.98,33.18,9018400,16.59 -2004-06-23,33.00,33.83,32.89,33.70,13959600,16.85 -2004-06-22,32.30,33.09,32.29,33.00,12875400,16.50 -2004-06-21,33.12,33.50,32.12,32.33,13936200,16.17 -2004-06-18,32.66,33.41,32.43,32.91,14509000,16.45 -2004-06-17,32.56,33.13,32.21,32.81,19690000,16.41 -2004-06-16,30.66,33.32,30.53,32.74,32487200,16.37 -2004-06-15,30.54,31.14,30.26,30.69,15879800,15.35 -2004-06-14,30.65,30.68,29.50,30.12,8713800,15.06 -2004-06-10,30.20,30.97,30.20,30.74,9199200,15.37 -2004-06-09,30.09,30.71,30.00,30.20,12471600,15.10 -2004-06-08,29.99,30.44,29.83,30.35,14843600,15.18 -2004-06-07,29.04,29.98,28.81,29.81,10567000,14.90 -2004-06-04,28.56,29.25,28.51,28.78,14254000,14.39 -2004-06-03,28.72,28.99,28.29,28.40,8961800,14.20 -2004-06-02,28.03,29.17,27.80,28.92,11382600,14.46 -2004-06-01,27.79,28.20,27.61,28.06,6504800,14.03 -2004-05-28,28.08,28.27,27.80,28.06,5204200,14.03 -2004-05-27,28.46,28.60,27.82,28.17,8427600,14.09 -2004-05-26,28.33,28.78,28.00,28.51,11506000,14.26 -2004-05-25,27.50,28.51,27.29,28.41,11427800,14.20 -2004-05-24,27.29,27.90,27.11,27.34,8414400,13.67 -2004-05-21,26.90,27.20,26.73,27.11,6424800,13.56 -2004-05-20,26.63,27.00,26.47,26.71,7010600,13.35 -2004-05-19,27.40,27.50,26.42,26.47,13414000,13.23 -2004-05-18,26.97,27.29,26.80,27.06,7359400,13.53 -2004-05-17,26.70,27.06,26.36,26.64,10730200,13.32 -2004-05-14,27.25,27.32,26.45,27.06,9207200,13.53 -2004-05-13,27.10,27.72,26.90,27.19,8209000,13.60 -2004-05-12,26.79,27.34,26.24,27.30,8765000,13.65 -2004-05-11,26.40,27.19,26.40,27.14,10899000,13.57 -2004-05-10,26.27,26.60,25.94,26.28,8927800,13.14 -2004-05-07,26.55,27.57,26.55,26.67,14965600,13.34 -2004-05-06,26.40,26.75,25.90,26.58,9412800,13.29 -2004-05-05,26.20,26.75,25.96,26.65,8503800,13.32 -2004-05-04,25.97,26.55,25.50,26.14,9999400,13.07 -2004-05-03,26.00,26.33,25.74,26.07,10629800,13.03 -2004-04-30,26.71,26.96,25.49,25.78,16660800,12.89 -2004-04-29,26.45,27.00,25.98,26.77,16456800,13.39 -2004-04-28,26.82,27.01,26.34,26.45,8256000,13.23 -2004-04-27,27.24,27.44,26.69,26.94,10138000,13.47 -2004-04-26,27.58,27.64,27.00,27.13,8254600,13.56 -2004-04-23,27.70,28.00,27.05,27.70,11279600,13.85 -2004-04-22,27.56,28.18,27.11,27.78,12306600,13.89 -2004-04-21,27.60,28.12,27.37,27.73,11638400,13.86 -2004-04-20,28.21,28.41,27.56,27.73,12661400,13.86 -2004-04-19,28.12,28.75,27.83,28.35,25441200,14.18 -2004-04-16,29.15,29.31,28.50,29.18,14390400,14.59 -2004-04-15,28.82,29.58,28.16,29.30,62908800,14.65 -2004-04-14,26.74,27.07,26.31,26.64,22847600,13.32 -2004-04-13,27.98,28.03,26.84,26.93,15585600,13.47 -2004-04-12,27.50,28.10,27.49,28.04,8233600,14.02 -2004-04-08,27.88,28.00,27.20,27.53,8604200,13.77 -2004-04-07,27.61,27.70,26.92,27.31,9111400,13.65 -2004-04-06,27.71,28.15,27.43,27.83,9214000,13.91 -2004-04-05,27.48,28.37,27.44,28.32,13774000,14.16 -2004-04-02,27.75,27.93,27.23,27.50,9802800,13.75 -2004-04-01,26.89,27.27,26.62,27.11,11369000,13.56 -2004-03-31,27.92,27.98,26.95,27.04,13956200,13.52 -2004-03-30,27.74,27.95,27.34,27.92,12845600,13.96 -2004-03-29,27.37,27.99,27.20,27.91,12526000,13.95 -2004-03-26,27.00,27.36,26.91,27.04,14996200,13.52 -2004-03-25,26.14,26.91,25.89,26.87,20230200,13.44 -2004-03-24,25.27,25.75,25.27,25.50,15293400,12.75 -2004-03-23,25.88,26.00,25.22,25.29,13768400,12.65 -2004-03-22,25.37,26.17,25.25,25.86,14965400,12.93 -2004-03-19,25.56,26.94,25.54,25.86,14592000,12.93 -2004-03-18,25.94,26.06,25.59,25.67,11467200,12.84 -2004-03-17,25.96,26.38,25.78,26.19,14694000,13.10 -2004-03-16,26.55,26.61,25.39,25.82,21622600,12.91 -2004-03-15,27.03,27.35,26.26,26.45,17204200,13.23 -2004-03-12,27.32,27.78,27.17,27.56,11758000,13.78 -2004-03-11,27.27,28.04,27.09,27.15,21280400,13.57 -2004-03-10,27.04,28.14,26.94,27.68,35963000,13.84 -2004-03-09,25.90,27.23,25.75,27.10,22084400,13.55 -2004-03-08,26.62,26.79,25.80,26.00,18674000,13.00 -2004-03-05,24.95,27.49,24.90,26.74,55021400,13.37 -2004-03-04,23.93,25.22,23.91,25.16,23579400,12.58 -2004-03-03,23.60,24.19,23.60,23.92,8040400,11.96 -2004-03-02,24.00,24.10,23.77,23.81,9167400,11.90 -2004-03-01,24.10,24.30,23.87,24.02,11488600,12.01 -2004-02-27,22.96,24.02,22.95,23.92,16744200,11.96 -2004-02-26,22.88,23.18,22.80,23.04,7086000,11.52 -2004-02-25,22.28,22.90,22.21,22.81,9867000,11.40 -2004-02-24,22.14,22.74,22.00,22.36,9252000,11.18 -2004-02-23,22.34,22.46,21.89,22.19,6931400,11.10 -2004-02-20,22.50,22.51,22.21,22.40,9914400,11.20 -2004-02-19,23.33,23.64,22.41,22.47,11538600,11.23 -2004-02-18,23.18,23.44,23.05,23.26,5058400,11.63 -2004-02-17,23.10,23.49,23.10,23.16,6105600,11.58 -2004-02-13,23.85,24.10,22.83,23.00,11285000,11.50 -2004-02-12,23.61,23.99,23.60,23.73,6571000,11.86 -2004-02-11,23.09,23.87,23.05,23.80,12448000,11.90 -2004-02-10,22.62,23.12,22.44,22.98,9119400,11.49 -2004-02-09,22.62,22.86,22.50,22.67,6723600,11.34 -2004-02-06,22.45,22.89,22.40,22.71,6905000,11.35 -2004-02-05,21.82,22.91,21.81,22.42,12601600,11.21 -2004-02-04,22.00,22.09,21.70,21.79,10912600,10.90 -2004-02-03,22.30,22.40,22.00,22.26,6457600,11.13 -2004-02-02,22.46,22.81,22.08,22.32,10265400,11.16 -2004-01-30,22.65,22.87,22.42,22.56,6617800,11.28 -2004-01-29,22.63,22.80,22.19,22.68,7596400,11.34 -2004-01-28,22.84,23.38,22.41,22.52,9835800,11.26 -2004-01-27,23.04,23.25,22.80,23.07,10966800,11.53 -2004-01-26,22.46,23.06,22.43,23.01,9688200,11.51 -2004-01-23,22.42,22.74,22.25,22.56,8113200,11.28 -2004-01-22,22.56,22.83,22.18,22.18,7321600,11.09 -2004-01-21,22.70,22.97,22.43,22.61,8095000,11.31 -2004-01-20,22.67,22.80,22.25,22.73,11283800,11.36 -2004-01-16,22.89,23.04,22.61,22.72,13315000,11.36 -2004-01-15,22.91,23.40,22.50,22.85,36364600,11.43 -2004-01-14,24.40,24.54,23.78,24.20,22144400,12.10 -2004-01-13,24.70,24.84,23.86,24.12,24250600,12.06 -2004-01-12,23.25,24.00,23.10,23.73,17412400,11.86 -2004-01-09,23.23,24.13,22.79,23.00,15266400,11.50 -2004-01-08,22.84,23.73,22.65,23.36,16439400,11.68 -2004-01-07,22.10,22.83,21.93,22.59,20959800,11.30 -2004-01-06,22.25,22.42,21.71,22.09,18191000,11.05 -2004-01-05,21.42,22.39,21.42,22.17,14107800,11.09 -2004-01-02,21.55,21.75,21.18,21.28,5165800,10.64 -2003-12-31,21.35,21.53,21.18,21.37,6230400,10.69 -2003-12-30,21.18,21.50,21.15,21.28,7316200,10.64 -2003-12-29,20.91,21.16,20.86,21.15,8337800,10.57 -2003-12-26,20.35,20.91,20.34,20.78,3703400,10.39 -2003-12-24,19.72,20.59,19.65,20.41,6338400,10.20 -2003-12-23,19.92,19.95,19.60,19.81,11017800,9.90 -2003-12-22,19.65,19.89,19.25,19.85,13466600,9.93 -2003-12-19,20.19,20.42,19.62,19.70,16198600,9.85 -2003-12-18,19.90,20.18,19.90,20.04,11818400,10.02 -2003-12-17,20.08,20.13,19.79,19.88,9795000,9.94 -2003-12-16,20.19,20.49,20.01,20.12,13355600,10.06 -2003-12-15,21.49,21.49,20.07,20.17,13889600,10.09 -2003-12-12,21.32,21.32,20.70,20.89,6881200,10.44 -2003-12-11,20.25,21.34,20.21,21.21,6540600,10.60 -2003-12-10,20.45,20.61,19.96,20.38,9690600,10.19 -2003-12-09,21.17,21.25,20.40,20.45,4826600,10.23 -2003-12-08,20.78,21.08,20.41,21.05,5294200,10.52 -2003-12-05,20.90,21.15,20.73,20.85,6649200,10.43 -2003-12-04,20.94,21.17,20.77,21.15,6355000,10.57 -2003-12-03,21.54,21.84,20.96,21.03,6832000,10.52 -2003-12-02,21.60,21.90,21.41,21.54,7332000,10.77 -2003-12-01,21.04,21.85,21.00,21.71,12912000,10.85 -2003-11-28,20.78,21.07,20.52,20.91,2717800,10.45 -2003-11-26,20.89,21.15,20.25,20.72,8754600,10.36 -2003-11-25,21.23,21.25,20.61,20.68,9594800,10.34 -2003-11-24,20.50,21.27,20.45,21.15,13636600,10.57 -2003-11-21,20.34,20.58,19.85,20.28,8637000,10.14 -2003-11-20,20.10,21.08,20.10,20.38,8556800,10.19 -2003-11-19,20.56,20.65,20.26,20.42,12306600,10.21 -2003-11-18,21.21,21.34,20.35,20.41,9542600,10.20 -2003-11-17,21.35,21.37,20.95,21.13,8152000,10.56 -2003-11-14,22.48,22.61,21.28,21.46,8466000,10.73 -2003-11-13,22.07,22.56,21.92,22.42,7599000,11.21 -2003-11-12,21.48,22.72,21.48,22.33,10714400,11.16 -2003-11-11,21.90,22.02,21.48,21.54,7681200,10.77 -2003-11-10,22.45,22.65,21.84,21.90,8367000,10.95 -2003-11-07,23.19,23.24,22.45,22.50,7505200,11.25 -2003-11-06,22.91,23.15,22.65,23.12,14181200,11.56 -2003-11-05,22.82,23.13,22.47,23.03,11516800,11.52 -2003-11-04,23.07,23.10,22.59,22.91,8901200,11.45 -2003-11-03,22.83,23.30,22.78,23.15,10815800,11.57 -2003-10-31,23.30,23.35,22.78,22.89,7791200,11.44 -2003-10-30,23.99,24.00,22.87,23.09,9305600,11.55 -2003-10-29,23.51,23.90,23.34,23.69,9538600,11.85 -2003-10-28,22.56,23.77,22.40,23.72,8989800,11.86 -2003-10-27,22.75,22.89,22.49,22.60,5786200,11.30 -2003-10-24,22.56,22.85,22.23,22.60,7852000,11.30 -2003-10-23,22.73,23.15,22.59,22.99,5900400,11.49 -2003-10-22,22.94,23.20,22.68,22.76,5771400,11.38 -2003-10-21,23.31,23.40,22.75,23.18,6302200,11.59 -2003-10-20,22.60,23.34,22.38,23.22,9969000,11.61 -2003-10-17,23.38,23.49,22.43,22.75,12850400,11.38 -2003-10-16,23.80,23.84,22.41,23.25,34845800,11.62 -2003-10-15,24.85,25.01,24.58,24.82,21789400,12.41 -2003-10-14,24.32,24.74,24.19,24.55,9836400,12.27 -2003-10-13,23.73,24.41,23.72,24.35,9995200,12.18 -2003-10-10,23.50,23.81,23.37,23.68,6244200,11.84 -2003-10-09,23.30,23.67,22.79,23.45,12419600,11.73 -2003-10-08,23.25,23.54,22.73,23.06,15309600,11.53 -2003-10-07,22.05,23.41,21.91,23.22,14934800,11.61 -2003-10-06,21.67,22.33,21.58,22.29,9583200,11.15 -2003-10-03,20.99,21.86,20.88,21.69,10700000,10.85 -2003-10-02,20.80,20.80,20.28,20.57,7287800,10.28 -2003-10-01,20.71,21.10,20.19,20.79,8432600,10.40 -2003-09-30,21.09,21.22,20.44,20.72,10193800,10.36 -2003-09-29,21.49,21.67,20.65,21.30,13060800,10.65 -2003-09-26,20.30,21.70,20.15,20.69,12401800,10.35 -2003-09-25,21.34,21.37,20.25,20.43,20513600,10.22 -2003-09-24,22.21,22.31,21.08,21.32,10760200,10.66 -2003-09-23,22.02,22.46,21.88,22.43,4730400,11.22 -2003-09-22,22.18,22.50,21.92,22.08,6422200,11.04 -2003-09-19,22.88,23.05,22.43,22.58,7355600,11.29 -2003-09-18,22.10,22.99,21.95,22.88,9032400,11.44 -2003-09-17,22.37,22.38,21.85,22.12,10335600,11.06 -2003-09-16,22.21,22.69,22.20,22.36,9607400,11.18 -2003-09-15,22.81,22.90,22.12,22.21,8101600,11.10 -2003-09-12,22.51,23.14,22.31,23.10,6428200,11.55 -2003-09-11,22.25,22.79,22.10,22.56,7631600,11.28 -2003-09-10,22.25,22.61,22.11,22.18,8031800,11.09 -2003-09-09,22.53,22.67,22.12,22.37,6441800,11.19 -2003-09-08,22.48,22.79,22.47,22.74,5973000,11.37 -2003-09-05,22.73,23.15,22.41,22.50,8576200,11.25 -2003-09-04,23.16,23.25,22.77,22.83,7135000,11.41 -2003-09-03,22.80,23.32,22.76,22.95,9601000,11.48 -2003-09-02,22.66,22.90,22.40,22.85,8647600,11.43 -2003-08-29,22.20,22.85,22.05,22.61,9398400,11.31 -2003-08-28,21.33,22.22,21.33,22.19,11415200,11.10 -2003-08-27,20.91,21.48,20.66,21.48,8060800,10.74 -2003-08-26,20.75,21.07,20.35,21.05,5891400,10.52 -2003-08-25,20.78,20.91,20.49,20.86,4920800,10.43 -2003-08-22,21.81,22.00,20.64,20.88,8938000,10.44 -2003-08-21,21.03,21.71,20.95,21.68,9118800,10.84 -2003-08-20,20.18,21.27,20.14,21.01,9757600,10.51 -2003-08-19,20.37,20.45,20.00,20.32,4774600,10.16 -2003-08-18,19.86,20.41,19.72,20.34,6884800,10.17 -2003-08-15,20.02,20.07,19.66,19.71,4495200,9.85 -2003-08-14,20.21,20.33,19.94,19.97,6885000,9.98 -2003-08-13,19.86,20.34,19.58,20.18,10146400,10.09 -2003-08-12,19.76,19.80,19.46,19.70,5872800,9.85 -2003-08-11,19.82,19.93,19.51,19.66,4901000,9.83 -2003-08-08,20.11,20.13,19.60,19.64,4916400,9.82 -2003-08-07,19.73,20.09,19.42,19.93,6227800,9.97 -2003-08-06,20.06,20.17,19.50,19.63,8766600,9.81 -2003-08-05,21.35,21.40,20.10,20.38,8908600,10.19 -2003-08-04,20.53,21.50,20.28,21.21,8218400,10.60 -2003-08-01,21.00,21.27,20.64,20.73,5343000,10.36 -2003-07-31,20.74,21.35,20.57,21.08,10766600,10.54 -2003-07-30,20.77,20.90,20.17,20.28,6199800,10.14 -2003-07-29,20.99,21.08,20.52,20.72,7040000,10.36 -2003-07-28,21.50,21.50,20.86,20.99,6084200,10.49 -2003-07-25,20.41,21.57,20.40,21.54,7738800,10.77 -2003-07-24,21.04,21.50,20.38,20.51,8187000,10.26 -2003-07-23,20.95,20.96,20.46,20.79,5108400,10.40 -2003-07-22,20.87,20.96,20.50,20.80,7086600,10.40 -2003-07-21,20.69,20.80,20.30,20.61,6564600,10.31 -2003-07-18,20.90,21.18,20.40,20.86,10672800,10.43 -2003-07-17,20.19,20.95,20.13,20.90,26829000,10.45 -2003-07-16,19.97,20.00,19.38,19.87,8961800,9.94 -2003-07-15,20.02,20.24,19.43,19.61,7380200,9.81 -2003-07-14,20.01,20.40,19.87,19.90,6728800,9.95 -2003-07-11,19.66,20.00,19.53,19.85,4887800,9.93 -2003-07-10,19.88,19.94,19.37,19.58,6104800,9.79 -2003-07-09,20.21,20.45,19.89,19.89,7630200,9.94 -2003-07-08,19.52,20.50,19.49,20.40,9169200,10.20 -2003-07-07,19.27,20.18,19.13,19.87,10224000,9.94 -2003-07-03,19.00,19.55,18.98,19.13,4920400,9.56 -2003-07-02,19.03,19.40,19.02,19.27,11617800,9.64 -2003-07-01,18.87,19.18,18.51,19.09,6464000,9.55 -2003-06-30,18.68,19.21,18.59,19.06,7934000,9.53 -2003-06-27,19.30,19.31,18.48,18.73,13064000,9.36 -2003-06-26,18.70,19.32,18.70,19.29,5775200,9.65 -2003-06-25,18.86,19.40,18.71,19.09,11779000,9.55 -2003-06-24,19.47,19.67,18.72,18.78,18370800,9.39 -2003-06-23,19.30,19.69,18.75,19.06,10977200,9.53 -2003-06-20,19.35,19.58,18.90,19.20,12733800,9.60 -2003-06-19,19.36,19.61,18.77,19.14,13626000,9.57 -2003-06-18,18.45,19.48,18.31,19.12,16249400,9.56 -2003-06-17,18.41,18.50,17.99,18.19,6338000,9.10 -2003-06-16,17.60,18.27,17.45,18.27,8518800,9.14 -2003-06-13,17.75,17.95,17.13,17.42,6830200,8.71 -2003-06-12,17.55,17.88,17.45,17.77,9021000,8.89 -2003-06-11,17.15,17.51,16.81,17.45,8039800,8.73 -2003-06-10,16.89,17.29,16.75,17.18,6308800,8.59 -2003-06-09,16.94,17.04,16.63,16.79,9284000,8.40 -2003-06-06,17.74,18.04,17.14,17.15,8621000,8.57 -2003-06-05,17.45,17.74,17.33,17.64,7339200,8.82 -2003-06-04,17.30,17.79,17.14,17.60,9685800,8.80 -2003-06-03,17.44,17.67,17.02,17.31,12887800,8.65 -2003-06-02,18.10,18.29,17.27,17.45,14949600,8.73 -2003-05-30,18.12,18.18,17.53,17.95,13669600,8.98 -2003-05-29,18.29,18.50,17.90,18.10,11920200,9.05 -2003-05-28,18.50,18.66,18.15,18.28,12131400,9.14 -2003-05-27,17.96,18.90,17.91,18.88,10361800,9.44 -2003-05-23,18.21,18.46,17.96,18.32,7382800,9.16 -2003-05-22,17.89,18.40,17.74,18.24,6373600,9.12 -2003-05-21,17.79,18.09,17.67,17.85,10893200,8.93 -2003-05-20,18.10,18.16,17.60,17.79,14865000,8.90 -2003-05-19,18.53,18.65,18.06,18.10,15924600,9.05 -2003-05-16,18.59,19.01,18.28,18.80,12201000,9.40 -2003-05-15,18.60,18.85,18.47,18.73,10178400,9.36 -2003-05-14,18.83,18.84,18.43,18.55,12696000,9.27 -2003-05-13,18.43,18.97,17.95,18.67,15957000,9.34 -2003-05-12,18.15,18.74,18.13,18.56,14977600,9.28 -2003-05-09,18.33,18.40,17.88,18.30,21013800,9.15 -2003-05-08,17.70,18.07,17.29,18.00,24562000,9.00 -2003-05-07,17.33,18.24,17.11,17.65,37656400,8.82 -2003-05-06,16.12,17.90,16.10,17.50,54089000,8.75 -2003-05-05,14.77,16.88,14.75,16.09,55561000,8.05 -2003-05-02,14.46,14.59,14.34,14.45,11470800,7.22 -2003-05-01,14.25,14.39,14.00,14.36,12241400,7.18 -2003-04-30,13.93,14.35,13.85,14.22,16363400,7.11 -2003-04-29,13.98,14.16,13.58,14.06,16365600,7.03 -2003-04-28,13.48,13.96,13.43,13.86,22742800,6.93 -2003-04-25,13.46,13.58,13.23,13.35,7332800,6.68 -2003-04-24,13.52,13.61,13.00,13.44,11611000,6.72 -2003-04-23,13.53,13.63,13.36,13.58,7488600,6.79 -2003-04-22,13.18,13.62,13.09,13.51,10734600,6.76 -2003-04-21,13.13,13.19,12.98,13.14,5440000,6.57 -2003-04-17,13.20,13.25,12.72,13.12,22009200,6.56 -2003-04-16,12.99,13.67,12.92,13.24,36292000,6.62 -2003-04-15,13.59,13.60,13.30,13.39,10856000,6.70 -2003-04-14,13.71,13.75,13.50,13.58,17962800,6.79 -2003-04-11,14.05,14.44,12.93,13.20,49739600,6.60 -2003-04-10,14.20,14.39,14.20,14.37,3825000,7.18 -2003-04-09,14.52,14.62,14.14,14.19,5240200,7.09 -2003-04-08,14.51,14.65,14.36,14.45,4604800,7.22 -2003-04-07,14.85,14.95,14.41,14.49,7030800,7.24 -2003-04-04,14.52,14.67,14.39,14.41,5215000,7.20 -2003-04-03,14.56,14.70,14.35,14.46,5204000,7.23 -2003-04-02,14.36,14.69,14.27,14.60,6120400,7.30 -2003-04-01,14.20,14.31,14.07,14.16,5512200,7.08 -2003-03-31,14.33,14.53,14.04,14.14,9166400,7.07 -2003-03-28,14.40,14.62,14.37,14.57,5189400,7.28 -2003-03-27,14.32,14.70,14.32,14.49,4371200,7.24 -2003-03-26,14.55,14.56,14.30,14.41,6369400,7.20 -2003-03-25,14.41,14.83,14.37,14.55,5989200,7.28 -2003-03-24,14.67,14.80,14.35,14.37,5753600,7.18 -2003-03-21,15.09,15.15,14.82,15.00,10641000,7.50 -2003-03-20,14.93,14.99,14.60,14.91,5827800,7.45 -2003-03-19,15.07,15.15,14.79,14.95,5047000,7.47 -2003-03-18,15.00,15.09,14.82,15.00,8213600,7.50 -2003-03-17,14.89,15.07,14.71,15.01,14282600,7.51 -2003-03-14,14.68,15.01,14.64,14.78,5467800,7.39 -2003-03-13,14.47,14.80,14.17,14.72,11980200,7.36 -2003-03-12,14.17,14.39,14.06,14.22,7948600,7.11 -2003-03-11,14.36,14.49,14.12,14.23,5756800,7.11 -2003-03-10,14.51,14.67,14.30,14.37,4806200,7.18 -2003-03-07,14.47,14.71,14.31,14.53,7178000,7.26 -2003-03-06,14.58,14.60,14.40,14.56,3566400,7.28 -2003-03-05,14.61,14.80,14.52,14.62,4524400,7.31 -2003-03-04,14.74,14.81,14.44,14.56,4514800,7.28 -2003-03-03,15.01,15.16,14.55,14.65,7277200,7.32 -2003-02-28,14.86,15.09,14.77,15.01,6967800,7.51 -2003-02-27,14.57,15.00,14.51,14.86,5512200,7.43 -2003-02-26,14.99,15.02,14.48,14.50,7753400,7.25 -2003-02-25,14.68,15.08,14.58,15.02,6737200,7.51 -2003-02-24,14.86,15.03,13.80,14.74,6437600,7.37 -2003-02-21,14.82,15.06,14.65,15.00,5623000,7.50 -2003-02-20,14.85,14.96,14.71,14.77,8012600,7.39 -2003-02-19,15.07,15.15,14.68,14.85,8584600,7.43 -2003-02-18,14.75,15.30,14.72,15.27,10389200,7.64 -2003-02-14,14.61,14.72,14.35,14.67,8689200,7.34 -2003-02-13,14.41,14.64,14.24,14.54,7446200,7.27 -2003-02-12,14.27,14.60,14.27,14.39,8167400,7.20 -2003-02-11,14.50,14.63,14.20,14.35,5885000,7.18 -2003-02-10,14.26,14.57,14.06,14.35,5996000,7.18 -2003-02-07,14.55,14.60,14.07,14.15,9632200,7.07 -2003-02-06,14.36,14.59,14.22,14.43,6398200,7.22 -2003-02-05,14.71,14.93,14.44,14.45,7914800,7.22 -2003-02-04,14.45,14.65,14.31,14.60,11336200,7.30 -2003-02-03,14.41,14.91,14.35,14.66,9456600,7.33 -2003-01-31,14.19,14.55,14.05,14.36,12186600,7.18 -2003-01-30,14.98,15.07,14.29,14.32,14537800,7.16 -2003-01-29,14.55,15.10,14.30,14.93,13323000,7.47 -2003-01-28,14.24,14.69,14.16,14.58,10223400,7.29 -2003-01-27,13.68,14.50,13.65,14.13,13978800,7.07 -2003-01-24,14.24,14.24,13.56,13.80,10909600,6.90 -2003-01-23,14.05,14.36,13.95,14.17,8152000,7.09 -2003-01-22,13.98,14.15,13.80,13.88,7683600,6.94 -2003-01-21,14.21,14.41,14.00,14.02,9052000,7.01 -2003-01-17,14.56,14.56,14.08,14.10,9527200,7.05 -2003-01-16,14.21,14.76,14.21,14.62,19966800,7.31 -2003-01-15,14.59,14.70,14.26,14.43,13254600,7.22 -2003-01-14,14.69,14.82,14.49,14.61,6673600,7.30 -2003-01-13,14.90,14.90,14.36,14.63,6390800,7.32 -2003-01-10,14.58,14.82,14.49,14.72,6253600,7.36 -2003-01-09,14.62,14.92,14.50,14.68,7687600,7.34 -2003-01-08,14.58,14.71,14.44,14.55,8201600,7.28 -2003-01-07,14.79,15.00,14.47,14.85,12226600,7.43 -2003-01-06,15.03,15.38,14.88,14.90,13947600,7.45 -2003-01-03,14.80,14.93,14.59,14.90,5266200,7.45 -2003-01-02,14.36,14.92,14.35,14.80,6479600,7.40 -2002-12-31,14.00,14.36,13.95,14.33,7168800,7.16 -2002-12-30,14.08,14.15,13.84,14.07,5537200,7.03 -2002-12-27,14.31,14.38,14.01,14.06,2858400,7.03 -2002-12-26,14.42,14.81,14.28,14.40,3050800,7.20 -2002-12-24,14.44,14.47,14.30,14.36,1405000,7.18 -2002-12-23,14.16,14.55,14.12,14.49,4493800,7.24 -2002-12-20,14.29,14.56,13.78,14.14,11360600,7.07 -2002-12-19,14.53,14.92,14.10,14.20,12411400,7.10 -2002-12-18,14.80,14.86,14.50,14.57,5382200,7.28 -2002-12-17,14.85,15.19,14.66,15.08,7952200,7.54 -2002-12-16,14.81,15.10,14.61,14.85,8986600,7.43 -2002-12-13,15.14,15.15,14.65,14.79,5885000,7.39 -2002-12-12,15.51,15.55,15.01,15.19,5333600,7.59 -2002-12-11,15.30,15.49,15.08,15.49,9053600,7.74 -2002-12-10,14.75,15.45,14.73,15.28,11021800,7.64 -2002-12-09,14.94,14.95,14.67,14.75,8431600,7.38 -2002-12-06,14.65,15.19,14.52,14.95,8762800,7.47 -2002-12-05,15.03,15.08,14.53,14.63,8692800,7.32 -2002-12-04,15.18,15.19,14.50,14.97,11634200,7.49 -2002-12-03,15.20,15.34,15.10,15.16,8138200,7.58 -2002-12-02,15.90,16.10,15.01,15.18,14240800,7.59 -2002-11-29,15.79,15.88,15.41,15.50,5122600,7.75 -2002-11-27,15.60,15.86,15.45,15.72,10242800,7.86 -2002-11-26,15.85,15.90,15.27,15.41,8580800,7.70 -2002-11-25,16.03,16.14,15.71,15.97,7122400,7.99 -2002-11-22,16.09,16.30,15.90,16.01,8137800,8.01 -2002-11-21,15.90,16.44,15.75,16.35,14945800,8.18 -2002-11-20,15.30,15.70,15.25,15.53,7455000,7.76 -2002-11-19,15.55,15.75,15.01,15.27,7534000,7.64 -2002-11-18,16.19,16.20,15.52,15.65,5877800,7.82 -2002-11-15,16.23,16.24,15.76,15.95,5749800,7.97 -2002-11-14,15.90,16.41,15.78,16.30,5061200,8.15 -2002-11-13,15.50,16.07,15.28,15.59,8276400,7.80 -2002-11-12,15.32,16.04,15.28,15.64,7992600,7.82 -2002-11-11,15.74,15.89,15.12,15.16,5463400,7.58 -2002-11-08,16.01,16.20,15.52,15.84,6788000,7.92 -2002-11-07,16.94,17.10,15.81,16.00,12006400,8.00 -2002-11-06,17.08,17.32,16.70,17.22,7728200,8.61 -2002-11-05,16.75,16.96,16.35,16.90,7524800,8.45 -2002-11-04,16.50,17.38,16.35,16.89,13457800,8.44 -2002-11-01,15.94,16.50,15.89,16.36,6779600,8.18 -2002-10-31,15.99,16.44,15.92,16.07,10565600,8.03 -2002-10-30,15.49,16.37,15.48,15.98,9667000,7.99 -2002-10-29,15.57,15.88,14.96,15.44,9256400,7.72 -2002-10-28,15.55,15.95,15.25,15.61,12475000,7.80 -2002-10-25,14.69,15.45,14.59,15.42,9966800,7.71 -2002-10-24,15.02,15.21,14.55,14.69,6241000,7.34 -2002-10-23,14.63,14.98,14.50,14.88,7465600,7.44 -2002-10-22,14.47,14.88,14.26,14.70,7791000,7.35 -2002-10-21,14.26,14.63,14.00,14.56,8518600,7.28 -2002-10-18,14.00,14.35,13.93,14.34,10296400,7.17 -2002-10-17,14.21,14.38,13.98,14.11,16760600,7.05 -2002-10-16,14.86,15.13,13.90,14.56,10986600,7.28 -2002-10-15,15.22,15.25,14.78,15.16,14482800,7.58 -2002-10-14,14.55,14.98,14.44,14.77,6943000,7.39 -2002-10-11,14.25,14.78,14.10,14.51,10524200,7.26 -2002-10-10,13.63,14.22,13.58,14.11,11484800,7.05 -2002-10-09,13.54,13.85,13.41,13.59,12738800,6.80 -2002-10-08,13.90,13.96,13.36,13.68,16201600,6.84 -2002-10-07,13.97,14.21,13.76,13.77,8739200,6.89 -2002-10-04,14.36,14.40,13.99,14.03,6815200,7.01 -2002-10-03,14.18,14.60,14.06,14.30,7782000,7.15 -2002-10-02,14.33,14.63,14.10,14.17,8191000,7.09 -2002-10-01,14.59,14.60,14.00,14.51,12229400,7.26 -2002-09-30,14.40,14.57,14.14,14.50,8489200,7.25 -2002-09-27,14.49,14.85,14.48,14.72,7362600,7.36 -2002-09-26,15.10,15.19,14.55,14.70,7451600,7.35 -2002-09-25,14.69,15.17,14.65,14.93,9095800,7.47 -2002-09-24,14.40,14.82,14.40,14.64,8952200,7.32 -2002-09-23,14.76,14.96,14.45,14.85,9418200,7.43 -2002-09-20,14.62,14.94,14.52,14.87,12599600,7.43 -2002-09-19,14.75,14.80,14.48,14.58,7355200,7.29 -2002-09-18,14.69,15.09,14.52,15.02,11737200,7.51 -2002-09-17,14.57,15.03,14.57,14.80,15285600,7.40 -2002-09-16,14.14,14.61,14.12,14.50,10237200,7.25 -2002-09-13,14.13,14.34,14.05,14.17,10105400,7.09 -2002-09-12,14.20,14.51,14.12,14.14,9636800,7.07 -2002-09-11,14.34,14.60,14.15,14.29,7229000,7.14 -2002-09-10,14.41,14.49,14.12,14.33,8909600,7.16 -2002-09-09,14.28,14.53,14.15,14.37,5651600,7.18 -2002-09-06,14.51,14.65,14.23,14.38,6485400,7.19 -2002-09-05,14.22,14.36,14.05,14.18,8077800,7.09 -2002-09-04,14.20,14.78,14.17,14.48,15023600,7.24 -2002-09-03,14.49,14.55,14.05,14.05,9890600,7.03 -2002-08-30,14.73,15.14,14.58,14.75,6911400,7.38 -2002-08-29,14.65,15.08,14.51,14.70,5863200,7.35 -2002-08-28,14.80,15.12,14.65,14.70,8856200,7.35 -2002-08-27,15.71,15.74,14.71,14.85,9365400,7.43 -2002-08-26,15.95,15.95,15.16,15.53,6784600,7.76 -2002-08-23,15.90,15.93,15.45,15.73,5830200,7.86 -2002-08-22,16.20,16.25,15.66,15.97,9225400,7.99 -2002-08-21,16.01,16.24,15.45,16.12,7229600,8.06 -2002-08-20,15.97,16.09,15.53,15.91,6665200,7.95 -2002-08-19,15.78,16.25,15.72,15.98,7734200,7.99 -2002-08-16,15.45,16.10,15.28,15.81,8758000,7.91 -2002-08-15,15.25,15.75,15.01,15.61,11502800,7.80 -2002-08-14,14.67,15.35,14.54,15.17,14253000,7.59 -2002-08-13,14.90,15.21,14.55,14.59,9638200,7.30 -2002-08-12,14.90,15.02,14.69,14.99,6420200,7.49 -2002-08-09,15.25,15.25,14.75,15.00,7347000,7.50 -2002-08-08,14.77,15.38,14.77,15.30,8119600,7.65 -2002-08-07,15.09,15.36,14.35,15.03,11909800,7.51 -2002-08-06,14.21,15.23,14.08,14.74,9716200,7.37 -2002-08-05,14.51,14.70,13.97,13.99,7286600,6.99 -2002-08-02,14.74,15.00,14.25,14.45,6395000,7.22 -2002-08-01,15.11,15.42,14.73,14.80,8177000,7.40 -2002-07-31,15.40,15.42,14.90,15.26,11096400,7.63 -2002-07-30,14.85,15.51,14.56,15.43,12672800,7.72 -2002-07-29,14.48,15.10,14.37,15.02,9820000,7.51 -2002-07-26,14.46,14.53,13.80,14.34,7418000,7.17 -2002-07-25,14.93,14.95,14.01,14.36,17119800,7.18 -2002-07-24,14.33,15.22,14.25,15.20,14521200,7.60 -2002-07-23,14.90,15.13,14.44,14.47,14281800,7.24 -2002-07-22,14.75,15.19,14.61,14.92,15389200,7.46 -2002-07-19,14.70,15.17,14.53,14.96,13757400,7.48 -2002-07-18,15.50,15.56,14.75,14.99,19980800,7.49 -2002-07-17,16.13,16.20,15.19,15.63,43410200,7.82 -2002-07-16,18.15,18.57,17.61,17.86,15956000,8.93 -2002-07-15,17.43,18.60,16.81,18.23,10571200,9.11 -2002-07-12,18.55,18.79,17.26,17.51,15839000,8.76 -2002-07-11,17.26,18.35,16.97,18.30,13345600,9.15 -2002-07-10,17.71,18.17,17.25,17.32,7388600,8.66 -2002-07-09,18.09,18.29,17.46,17.53,8098200,8.77 -2002-07-08,18.52,18.61,17.68,18.01,7543000,9.01 -2002-07-05,17.71,18.75,17.71,18.74,5773200,9.37 -2002-07-03,16.81,17.68,16.75,17.55,7108200,8.77 -2002-07-02,17.03,17.16,16.83,16.94,10899600,8.47 -2002-07-01,17.71,17.88,17.05,17.06,7953200,8.53 -2002-06-28,17.10,17.82,17.00,17.72,9637800,8.86 -2002-06-27,16.79,17.27,16.42,17.06,8987800,8.53 -2002-06-26,16.80,17.29,15.98,16.55,19962600,8.27 -2002-06-25,17.40,17.68,16.86,17.14,10757200,8.57 -2002-06-24,16.77,17.73,16.70,17.27,15426200,8.64 -2002-06-21,16.97,17.49,16.79,16.85,15899200,8.43 -2002-06-20,17.17,17.60,16.85,17.11,14165600,8.56 -2002-06-19,17.37,17.60,16.88,17.12,61052400,8.56 -2002-06-18,20.42,20.59,19.98,20.15,12620000,10.07 -2002-06-17,20.24,20.63,19.85,20.54,11593200,10.27 -2002-06-14,19.24,20.36,18.11,20.10,15175000,10.05 -2002-06-13,20.02,20.05,19.38,19.54,12574400,9.77 -2002-06-12,20.41,20.75,19.94,20.09,18882800,10.05 -2002-06-11,21.64,21.70,20.41,20.46,12482000,10.23 -2002-06-10,21.48,21.84,21.34,21.48,9913400,10.74 -2002-06-07,21.76,21.94,20.93,21.40,21870600,10.70 -2002-06-06,22.96,23.23,22.04,22.16,9285600,11.08 -2002-06-05,22.83,22.83,22.35,22.72,9895800,11.36 -2002-06-04,22.88,23.04,22.18,22.78,12422200,11.39 -2002-06-03,23.39,23.45,22.58,22.91,8396800,11.45 -2002-05-31,24.09,24.25,23.28,23.30,13053400,11.65 -2002-05-30,23.77,24.38,23.51,24.20,7013400,12.10 -2002-05-29,23.92,24.44,23.45,23.98,7921200,11.99 -2002-05-28,23.69,24.20,23.43,23.98,5347000,11.99 -2002-05-24,24.99,24.99,23.96,24.15,5934800,12.07 -2002-05-23,24.45,25.24,24.07,25.18,13192800,12.59 -2002-05-22,23.37,24.37,23.32,24.32,10388400,12.16 -2002-05-21,24.83,25.00,23.40,23.46,10035400,11.73 -2002-05-20,24.57,24.93,24.53,24.74,9639800,12.37 -2002-05-17,25.49,25.78,24.61,25.01,8446200,12.51 -2002-05-16,25.06,25.45,24.75,25.21,8109000,12.60 -2002-05-15,25.37,25.98,24.84,25.28,11993800,12.64 -2002-05-14,24.45,25.68,24.22,25.61,18803800,12.81 -2002-05-13,23.52,24.09,22.94,23.94,9486000,11.97 -2002-05-10,24.29,24.29,22.98,23.32,8407000,11.66 -2002-05-09,24.25,24.35,23.80,24.19,8022000,12.10 -2002-05-08,23.20,24.52,23.04,24.37,15595800,12.19 -2002-05-07,22.94,22.95,22.14,22.47,8669600,11.23 -2002-05-06,23.35,23.50,22.46,22.65,8916600,11.32 -2002-05-03,23.57,24.02,23.43,23.51,8242200,11.76 -2002-05-02,23.81,24.34,23.60,23.69,8548000,11.85 -2002-05-01,24.29,24.29,23.36,23.98,7668000,11.99 -2002-04-30,23.89,24.38,23.75,24.27,10034400,12.14 -2002-04-29,23.16,24.06,23.09,23.96,9724600,11.98 -2002-04-26,24.28,24.37,23.00,23.01,10892200,11.51 -2002-04-25,23.56,24.34,23.55,24.12,6935800,12.06 -2002-04-24,24.30,24.50,23.68,23.77,5016000,11.89 -2002-04-23,24.54,24.78,24.09,24.25,8338200,12.12 -2002-04-22,24.84,24.93,24.23,24.53,9622400,12.27 -2002-04-19,25.49,25.49,24.93,24.98,13407400,12.49 -2002-04-18,25.50,25.52,24.88,25.41,14346800,12.70 -2002-04-17,25.93,26.17,25.38,26.11,14151800,13.06 -2002-04-16,25.15,25.99,25.12,25.74,21949200,12.87 -2002-04-15,25.06,25.15,24.80,25.00,10691800,12.50 -2002-04-12,25.01,25.17,24.57,25.06,11437200,12.53 -2002-04-11,25.03,25.20,24.75,24.86,14544800,12.43 -2002-04-10,24.21,24.95,24.01,24.66,8035000,12.33 -2002-04-09,24.59,25.00,24.01,24.10,6840400,12.05 -2002-04-08,24.16,24.68,23.78,24.56,9339800,12.28 -2002-04-05,24.95,25.19,24.10,24.74,9941000,12.37 -2002-04-04,23.67,25.05,23.67,24.90,12089200,12.45 -2002-04-03,24.05,24.49,23.60,23.75,7661800,11.88 -2002-04-02,24.00,24.30,23.87,24.07,7278400,12.03 -2002-04-01,23.38,24.70,23.28,24.46,7108800,12.23 -2002-03-28,23.70,23.88,23.46,23.67,3873400,11.84 -2002-03-27,23.35,23.72,23.26,23.47,4560800,11.73 -2002-03-26,23.20,23.64,23.00,23.46,9208600,11.73 -2002-03-25,24.07,24.09,23.24,23.35,9386800,11.68 -2002-03-22,24.22,24.56,23.87,24.09,7221200,12.05 -2002-03-21,23.86,24.30,23.26,24.27,22012600,12.14 -2002-03-20,24.66,25.14,24.50,24.92,10511400,12.46 -2002-03-19,24.69,25.30,24.30,24.85,8655200,12.43 -2002-03-18,24.95,25.05,24.32,24.74,10877000,12.37 -2002-03-15,24.46,24.96,24.25,24.95,8603600,12.48 -2002-03-14,24.30,24.60,23.87,24.43,7760600,12.22 -2002-03-13,24.37,24.85,24.15,24.49,7170200,12.24 -2002-03-12,24.51,24.74,24.10,24.72,9073400,12.36 -2002-03-11,24.60,25.14,24.10,25.06,9385200,12.53 -2002-03-08,24.74,25.09,24.30,24.66,9634800,12.33 -2002-03-07,24.06,24.53,23.61,24.38,9223200,12.19 -2002-03-06,23.48,24.34,22.93,24.07,8078800,12.03 -2002-03-05,24.15,24.43,23.40,23.53,9810800,11.77 -2002-03-04,23.26,24.58,22.76,24.29,12437800,12.15 -2002-03-01,21.93,23.50,21.82,23.45,12464000,11.73 -2002-02-28,22.15,22.59,21.35,21.70,16319200,10.85 -2002-02-27,23.94,24.25,20.94,21.96,36791400,10.98 -2002-02-26,23.91,24.37,23.25,23.67,9290400,11.84 -2002-02-25,22.85,24.72,22.36,23.81,15244600,11.90 -2002-02-22,21.66,22.95,21.50,22.74,14517000,11.37 -2002-02-21,22.92,23.00,21.45,21.50,15955400,10.75 -2002-02-20,22.77,23.20,22.35,23.13,10194400,11.56 -2002-02-19,23.76,23.87,22.48,22.62,13937800,11.31 -2002-02-15,24.53,24.98,23.85,23.90,9292400,11.95 -2002-02-14,25.05,25.23,24.38,24.60,9291800,12.30 -2002-02-13,24.73,25.24,24.65,25.01,11174000,12.51 -2002-02-12,24.66,25.04,24.45,24.71,8010000,12.35 -2002-02-11,23.93,25.00,23.74,24.98,14235800,12.49 -2002-02-08,24.40,24.64,23.37,24.03,12690400,12.02 -2002-02-07,24.65,25.29,24.08,24.30,12422600,12.15 -2002-02-06,25.60,25.98,24.15,24.67,21342000,12.34 -2002-02-05,25.09,25.98,25.08,25.45,16317400,12.73 -2002-02-04,24.32,25.52,24.20,25.35,18656200,12.68 -2002-02-01,24.34,24.96,24.34,24.41,14225200,12.20 -2002-01-31,24.16,24.73,24.11,24.72,16730200,12.36 -2002-01-30,23.07,24.14,22.94,24.09,16842000,12.05 -2002-01-29,23.22,23.54,22.85,23.07,8583000,11.53 -2002-01-28,23.40,23.55,22.72,23.27,6658800,11.64 -2002-01-25,22.89,23.42,22.66,23.25,6639800,11.62 -2002-01-24,22.91,23.51,22.90,23.21,12285800,11.60 -2002-01-23,21.80,23.04,21.59,23.02,15831400,11.51 -2002-01-22,22.27,22.37,21.82,21.82,11689800,10.91 -2002-01-18,22.00,22.60,21.96,22.17,12100400,11.09 -2002-01-17,21.96,22.74,21.87,22.48,23592000,11.24 -2002-01-16,21.41,21.41,20.50,20.78,20246200,10.39 -2002-01-15,21.32,21.76,21.21,21.70,10368600,10.85 -2002-01-14,21.01,21.40,20.90,21.15,14857000,10.57 -2002-01-11,21.39,21.84,20.60,21.05,12457200,10.52 -2002-01-10,21.22,21.46,20.25,21.23,16169200,10.61 -2002-01-09,22.80,22.93,21.28,21.65,11708400,10.82 -2002-01-08,22.75,23.05,22.46,22.61,16072800,11.31 -2002-01-07,23.72,24.00,22.75,22.90,15878000,11.45 -2002-01-04,23.34,23.95,22.99,23.69,14642000,11.85 -2002-01-03,23.00,23.75,22.77,23.58,21857400,11.79 -2002-01-02,22.05,23.30,21.96,23.30,18910600,11.65 -2001-12-31,22.51,22.66,21.83,21.90,4920800,10.95 -2001-12-28,21.97,23.00,21.96,22.43,10683000,11.22 -2001-12-27,21.58,22.25,21.58,22.07,6839600,11.03 -2001-12-26,21.35,22.30,21.14,21.49,5228600,10.74 -2001-12-24,20.90,21.45,20.90,21.36,1808200,10.68 -2001-12-21,21.01,21.54,20.80,21.00,9154800,10.50 -2001-12-20,21.40,21.47,20.62,20.67,7888000,10.34 -2001-12-19,20.58,21.68,20.47,21.62,10355600,10.81 -2001-12-18,20.89,21.33,20.22,21.01,8401400,10.51 -2001-12-17,20.40,21.00,20.19,20.62,6204000,10.31 -2001-12-14,20.73,20.83,20.09,20.39,6781600,10.19 -2001-12-13,21.49,21.55,20.50,21.00,7065800,10.50 -2001-12-12,21.87,21.92,21.25,21.49,6873600,10.74 -2001-12-11,22.67,22.85,21.65,21.78,7338400,10.89 -2001-12-10,22.29,22.99,22.23,22.54,6071800,11.27 -2001-12-07,22.46,22.71,22.00,22.54,7268400,11.27 -2001-12-06,23.48,23.50,22.14,22.78,12104800,11.39 -2001-12-05,22.36,24.03,22.17,23.76,20306400,11.88 -2001-12-04,21.05,22.56,20.72,22.40,13586400,11.20 -2001-12-03,21.06,21.28,20.60,21.05,6470200,10.52 -2001-11-30,20.47,21.44,20.25,21.30,10854000,10.65 -2001-11-29,20.60,20.70,20.19,20.42,7241600,10.21 -2001-11-28,20.85,21.21,20.41,20.53,8950400,10.27 -2001-11-27,21.20,21.52,20.50,21.00,9591200,10.50 -2001-11-26,19.94,21.55,19.88,21.37,16453200,10.69 -2001-11-23,19.71,19.95,19.57,19.84,2143000,9.92 -2001-11-21,19.61,19.80,19.26,19.68,7199400,9.84 -2001-11-20,19.82,20.20,19.50,19.53,9878000,9.77 -2001-11-19,19.00,20.05,18.96,20.00,11878200,10.00 -2001-11-16,19.27,19.29,18.40,18.97,8238000,9.48 -2001-11-15,19.45,19.90,19.23,19.45,7608200,9.73 -2001-11-14,19.59,19.90,19.15,19.61,7898200,9.81 -2001-11-13,19.08,19.39,18.71,19.37,8024000,9.69 -2001-11-12,18.66,19.17,17.96,18.75,7196400,9.38 -2001-11-09,18.60,19.25,18.55,18.71,4796200,9.35 -2001-11-08,19.63,19.89,18.57,18.71,12219400,9.35 -2001-11-07,19.46,20.13,19.33,19.59,13678200,9.80 -2001-11-06,18.96,19.62,18.53,19.57,11286400,9.78 -2001-11-05,18.84,19.25,18.61,19.07,8421200,9.53 -2001-11-02,18.52,18.86,18.16,18.57,7043000,9.28 -2001-11-01,17.65,18.78,17.25,18.59,11178400,9.30 -2001-10-31,17.73,18.40,17.44,17.56,9776800,8.78 -2001-10-30,17.38,18.00,17.06,17.60,9884400,8.80 -2001-10-29,18.57,18.67,17.60,17.63,8542200,8.81 -2001-10-26,18.86,19.25,18.62,18.67,9963000,9.34 -2001-10-25,18.44,19.25,18.16,19.19,9105400,9.60 -2001-10-24,18.06,19.09,17.75,18.95,13372400,9.48 -2001-10-23,19.12,19.42,17.87,18.14,24463600,9.07 -2001-10-22,18.21,19.07,18.09,19.02,13997800,9.51 -2001-10-19,17.94,18.40,17.88,18.30,5956800,9.15 -2001-10-18,17.29,18.23,17.29,18.00,21877600,9.00 -2001-10-17,18.34,18.41,16.96,16.99,10197800,8.49 -2001-10-16,18.09,18.20,17.77,18.01,7248200,9.01 -2001-10-15,17.95,18.38,17.95,17.99,11384000,8.99 -2001-10-12,17.31,18.08,16.86,18.01,10279000,9.01 -2001-10-11,16.92,17.74,16.85,17.74,11934400,8.87 -2001-10-10,16.10,16.85,15.95,16.82,10991400,8.41 -2001-10-09,16.05,16.20,15.63,16.00,6215200,8.00 -2001-10-08,15.57,16.35,15.50,16.20,7428000,8.10 -2001-10-05,15.40,16.15,14.99,16.14,12238800,8.07 -2001-10-04,15.35,16.25,14.99,15.88,14325800,7.94 -2001-10-03,14.95,15.36,14.83,14.98,24394400,7.49 -2001-10-02,15.43,15.83,14.88,15.05,8424400,7.53 -2001-10-01,15.49,15.99,15.23,15.54,7436000,7.77 -2001-09-28,15.71,15.91,15.39,15.51,13039600,7.76 -2001-09-27,15.25,15.75,15.20,15.51,11508600,7.76 -2001-09-26,15.81,15.89,14.93,15.15,17635600,7.57 -2001-09-25,16.14,16.22,15.35,15.54,13371600,7.77 -2001-09-24,16.11,16.84,15.95,16.45,10519200,8.23 -2001-09-21,14.80,16.25,14.68,15.73,20375600,7.86 -2001-09-20,16.29,16.95,15.50,15.68,14684800,7.84 -2001-09-19,16.50,17.10,15.60,17.02,13332800,8.51 -2001-09-18,16.90,17.72,16.17,16.28,11682200,8.14 -2001-09-17,16.00,17.07,15.73,16.99,16357400,8.49 -2001-09-10,17.00,17.50,16.92,17.37,11030200,8.69 -2001-09-07,17.50,18.10,17.20,17.28,8636800,8.64 -2001-09-06,18.40,18.93,17.65,17.72,10084600,8.86 -2001-09-05,18.24,18.95,18.12,18.55,12859200,9.27 -2001-09-04,18.50,19.08,18.18,18.25,12436200,9.12 -2001-08-31,17.73,18.60,17.65,18.55,7746600,9.27 -2001-08-30,17.74,18.18,17.28,17.83,13167600,8.91 -2001-08-29,18.44,18.83,17.83,17.83,8570400,8.91 -2001-08-28,18.90,19.14,18.40,18.40,6133400,9.20 -2001-08-27,18.60,19.30,18.16,18.92,6273000,9.46 -2001-08-24,18.00,18.62,17.65,18.57,10369000,9.28 -2001-08-23,18.20,18.34,17.58,17.81,7752800,8.90 -2001-08-22,17.94,18.25,17.61,18.21,6213400,9.10 -2001-08-21,18.14,18.14,17.70,17.92,6632200,8.96 -2001-08-20,18.14,18.23,17.81,18.12,9010800,9.06 -2001-08-17,18.00,18.45,17.99,18.07,7443800,9.03 -2001-08-16,18.27,18.75,17.97,18.65,10289000,9.32 -2001-08-15,18.76,18.94,18.20,18.44,10331400,9.22 -2001-08-14,19.20,19.36,18.67,18.73,8176800,9.36 -2001-08-13,19.10,19.33,18.76,19.09,5285600,9.55 -2001-08-10,19.04,19.32,18.59,19.02,6677200,9.51 -2001-08-09,18.96,19.15,18.72,19.05,7166600,9.52 -2001-08-08,19.26,19.70,18.54,18.90,9863200,9.45 -2001-08-07,19.33,19.67,18.98,19.25,6019600,9.62 -2001-08-06,19.04,19.66,19.00,19.13,3559000,9.56 -2001-08-03,19.89,19.90,19.00,19.50,6644800,9.75 -2001-08-02,19.65,19.87,19.26,19.82,9003200,9.91 -2001-08-01,19.01,19.78,18.95,19.06,10862000,9.53 -2001-07-31,19.27,19.42,18.51,18.79,8393800,9.40 -2001-07-30,19.12,19.36,18.51,18.93,8691400,9.47 -2001-07-27,18.75,19.25,18.50,18.96,11933400,9.48 -2001-07-26,18.48,18.80,17.85,18.59,13183600,9.30 -2001-07-25,19.12,19.30,17.97,18.47,15852800,9.23 -2001-07-24,19.39,19.92,18.73,19.09,12442000,9.55 -2001-07-23,20.09,20.50,19.51,19.54,8620000,9.77 -2001-07-20,19.70,20.06,19.49,19.98,15878000,9.99 -2001-07-19,21.23,21.42,19.75,19.96,30755000,9.98 -2001-07-18,21.78,22.78,20.42,20.79,40607600,10.40 -2001-07-17,23.98,25.22,23.01,25.10,23136800,12.55 -2001-07-16,24.88,25.10,23.91,23.96,9952400,11.98 -2001-07-13,24.13,25.01,23.84,24.85,16240800,12.43 -2001-07-12,23.30,24.81,23.30,24.36,21957200,12.18 -2001-07-11,21.03,22.55,21.00,22.54,16803800,11.27 -2001-07-10,22.95,23.07,20.84,21.14,14116800,10.57 -2001-07-09,22.09,23.00,21.68,22.70,12052400,11.35 -2001-07-06,22.76,22.96,21.72,22.03,10818600,11.02 -2001-07-05,23.60,23.77,23.01,23.19,5439000,11.60 -2001-07-03,23.51,24.18,23.50,23.84,4019400,11.92 -2001-07-02,23.64,24.23,23.14,23.90,8216000,11.95 -2001-06-29,23.66,25.10,23.20,23.25,18406800,11.62 -2001-06-28,23.05,23.91,22.94,23.54,12443200,11.77 -2001-06-27,23.83,24.00,22.50,23.34,13361800,11.67 -2001-06-26,23.34,23.77,23.01,23.75,9742200,11.88 -2001-06-25,22.50,24.00,22.45,23.99,15698200,11.99 -2001-06-22,22.48,23.00,21.76,22.26,10215200,11.13 -2001-06-21,21.55,23.00,21.10,22.49,12190400,11.24 -2001-06-20,20.00,21.85,19.98,21.67,15415000,10.84 -2001-06-19,20.85,21.40,20.01,20.19,11467400,10.10 -2001-06-18,20.41,20.85,20.00,20.33,12354000,10.16 -2001-06-15,20.10,20.75,19.35,20.44,16236600,10.22 -2001-06-14,20.04,20.45,19.77,19.88,10619600,9.94 -2001-06-13,21.42,21.73,20.06,20.47,18267400,10.23 -2001-06-12,19.77,20.69,19.76,20.31,10849800,10.15 -2001-06-11,21.05,21.07,19.95,20.04,10500000,10.02 -2001-06-08,21.65,21.65,20.71,21.32,12236600,10.66 -2001-06-07,20.71,21.70,20.45,21.66,11613600,10.83 -2001-06-06,20.93,20.93,20.33,20.73,7970600,10.36 -2001-06-05,20.80,21.10,20.35,20.94,16849800,10.47 -2001-06-04,21.08,21.11,20.46,20.66,10068600,10.33 -2001-06-01,20.13,21.09,19.98,20.89,16288400,10.44 -2001-05-31,19.80,20.24,19.49,19.95,15817600,9.98 -2001-05-30,20.76,20.76,19.30,19.78,27752800,9.89 -2001-05-29,22.32,22.50,20.81,21.47,18428200,10.73 -2001-05-25,23.20,23.29,22.50,22.76,5669400,11.38 -2001-05-24,23.29,23.30,22.62,23.20,9705600,11.60 -2001-05-23,23.75,23.75,22.86,23.23,10037200,11.61 -2001-05-22,24.00,24.13,23.40,23.50,14747000,11.75 -2001-05-21,23.63,23.91,23.05,23.56,16464200,11.78 -2001-05-18,23.36,23.64,23.12,23.53,5680400,11.77 -2001-05-17,24.23,24.33,23.25,23.55,11861400,11.77 -2001-05-16,23.26,24.50,22.85,24.10,11511800,12.05 -2001-05-15,23.37,25.50,23.04,23.18,8465200,11.59 -2001-05-14,22.89,23.68,22.75,23.29,11043600,11.65 -2001-05-11,23.01,23.49,22.76,22.85,7251600,11.43 -2001-05-10,24.21,24.50,22.95,23.00,10320600,11.50 -2001-05-09,24.14,24.55,23.67,23.98,11603200,11.99 -2001-05-08,25.35,25.45,23.95,24.57,11265600,12.28 -2001-05-07,25.62,25.76,24.84,24.96,9876800,12.48 -2001-05-04,24.24,25.85,23.96,25.75,10037600,12.88 -2001-05-03,25.97,26.25,24.73,24.96,10769400,12.48 -2001-05-02,26.34,26.70,25.76,26.59,13161600,13.30 -2001-05-01,25.41,26.50,25.20,25.93,15259000,12.97 -2001-04-30,26.70,27.12,24.87,25.49,17670600,12.74 -2001-04-27,25.20,26.29,24.75,26.20,16179000,13.10 -2001-04-26,25.17,26.10,24.68,24.69,28560600,12.35 -2001-04-25,24.21,24.86,23.57,24.72,11813600,12.36 -2001-04-24,24.33,24.75,23.51,24.03,13469200,12.02 -2001-04-23,24.34,25.00,24.00,24.25,19340200,12.12 -2001-04-20,24.93,25.63,24.60,25.04,24764400,12.52 -2001-04-19,25.55,25.75,23.60,25.72,66916800,12.86 -2001-04-18,21.57,24.08,21.08,22.79,39315800,11.40 -2001-04-17,21.20,21.21,19.60,20.40,24471400,10.20 -2001-04-16,22.09,22.40,20.86,21.44,10186600,10.72 -2001-04-12,21.42,23.02,21.15,22.42,10676200,11.21 -2001-04-11,22.98,23.00,21.28,21.80,11932000,10.90 -2001-04-10,20.90,22.70,20.78,22.04,16334800,11.02 -2001-04-09,20.69,21.34,20.06,20.54,9520800,10.27 -2001-04-06,20.80,21.04,19.90,20.59,11603200,10.30 -2001-04-05,20.60,22.50,20.00,20.87,15955800,10.44 -2001-04-04,19.76,20.25,18.75,19.50,24481600,9.75 -2001-04-03,21.36,21.40,20.13,20.24,13167400,10.12 -2001-04-02,22.09,22.66,21.40,21.59,12175400,10.80 -2001-03-30,22.55,22.72,21.34,22.07,14298200,11.03 -2001-03-29,21.77,23.45,21.50,22.53,21895200,11.27 -2001-03-28,22.08,22.50,21.50,22.17,20880800,11.09 -2001-03-27,21.94,23.05,21.90,22.87,19422200,11.44 -2001-03-26,23.13,23.75,21.13,21.78,26230400,10.89 -2001-03-23,22.06,23.56,22.00,23.00,33749400,11.50 -2001-03-22,20.37,21.75,20.19,21.62,25839000,10.81 -2001-03-21,19.78,20.87,19.37,20.12,13265400,10.06 -2001-03-20,20.72,20.94,19.69,19.69,17833800,9.85 -2001-03-19,19.75,20.62,19.50,20.56,12722800,10.28 -2001-03-16,19.00,20.31,18.87,19.62,16806600,9.81 -2001-03-15,20.87,21.37,19.69,19.69,18906600,9.85 -2001-03-14,18.50,20.50,18.44,20.44,17065400,10.22 -2001-03-13,18.87,19.56,18.19,19.56,15840600,9.78 -2001-03-12,19.69,19.87,18.12,18.62,13967800,9.31 -2001-03-09,20.62,20.69,20.00,20.25,10685400,10.12 -2001-03-08,20.69,21.12,20.44,20.81,7325600,10.40 -2001-03-07,21.31,21.62,20.75,21.25,14985600,10.62 -2001-03-06,20.72,22.06,20.69,21.50,26144600,10.75 -2001-03-05,19.37,20.50,19.25,20.37,11587600,10.19 -2001-03-02,18.31,20.44,18.25,19.25,14511200,9.62 -2001-03-01,17.81,18.75,17.19,18.75,11803400,9.38 -2001-02-28,19.37,19.44,18.12,18.25,18157600,9.12 -2001-02-27,19.28,19.44,18.69,19.37,12451000,9.69 -2001-02-26,19.06,19.69,18.56,19.50,7380000,9.75 -2001-02-23,18.62,18.87,18.25,18.81,10503800,9.40 -2001-02-22,19.06,19.37,18.00,18.81,15431200,9.40 -2001-02-21,18.25,19.94,18.25,18.87,13947800,9.44 -2001-02-20,19.19,19.44,18.19,18.31,11249600,9.15 -2001-02-16,19.00,19.50,18.75,19.00,9428400,9.50 -2001-02-15,19.69,20.56,19.69,20.06,11123200,10.03 -2001-02-14,19.19,19.62,18.50,19.50,11040000,9.75 -2001-02-13,19.94,20.44,19.00,19.12,8470600,9.56 -2001-02-12,19.06,20.00,18.81,19.69,9795600,9.85 -2001-02-09,20.50,20.81,18.69,19.12,21082600,9.56 -2001-02-08,20.56,21.06,20.19,20.75,21585000,10.38 -2001-02-07,20.66,20.87,19.81,20.75,14071600,10.38 -2001-02-06,20.16,21.39,20.00,21.12,16528400,10.56 -2001-02-05,20.50,20.56,19.75,20.19,10228800,10.10 -2001-02-02,21.12,21.94,20.50,20.62,15263400,10.31 -2001-02-01,20.69,21.50,20.50,21.12,13205400,10.56 -2001-01-31,21.50,22.50,21.44,21.62,26106000,10.81 -2001-01-30,21.56,22.00,20.87,21.75,24734600,10.88 -2001-01-29,19.56,21.75,19.56,21.69,30562800,10.85 -2001-01-26,19.50,19.81,19.06,19.56,17245600,9.78 -2001-01-25,20.56,20.56,19.75,19.94,17495000,9.97 -2001-01-24,20.62,20.69,19.56,20.50,25616200,10.25 -2001-01-23,19.31,20.94,19.06,20.50,31418400,10.25 -2001-01-22,19.06,19.62,18.44,19.25,18551600,9.62 -2001-01-19,19.44,19.56,18.69,19.50,27748200,9.75 -2001-01-18,17.81,18.75,17.62,18.69,43822800,9.35 -2001-01-17,17.56,17.56,16.50,16.81,30037600,8.40 -2001-01-16,17.44,18.25,17.00,17.12,10940000,8.56 -2001-01-12,17.87,18.00,17.06,17.19,15121000,8.60 -2001-01-11,16.25,18.50,16.25,18.00,28707600,9.00 -2001-01-10,16.69,17.00,16.06,16.56,20743400,8.28 -2001-01-09,16.81,17.64,16.56,17.19,21040600,8.60 -2001-01-08,16.94,16.98,15.94,16.56,13350000,8.28 -2001-01-05,16.94,17.37,16.06,16.37,14731000,8.19 -2001-01-04,18.14,18.50,16.81,17.06,26411000,8.53 -2001-01-03,14.50,16.69,14.44,16.37,29181800,8.19 -2001-01-02,14.88,15.25,14.56,14.88,16161800,7.44 -2000-12-29,14.69,15.00,14.50,14.88,22518800,7.44 -2000-12-28,14.38,14.94,14.31,14.81,10910000,7.41 -2000-12-27,14.34,14.81,14.19,14.81,11626000,7.41 -2000-12-26,14.88,15.00,14.25,14.69,7745400,7.34 -2000-12-22,14.13,15.00,14.13,15.00,11369600,7.50 -2000-12-21,14.25,15.00,13.88,14.06,13102600,7.03 -2000-12-20,13.78,14.63,13.63,14.38,20196200,7.19 -2000-12-19,14.38,15.25,14.00,14.00,13367200,7.00 -2000-12-18,14.56,14.63,13.94,14.25,11645000,7.12 -2000-12-15,14.56,14.69,14.00,14.06,18363800,7.03 -2000-12-14,15.03,15.25,14.44,14.44,9406600,7.22 -2000-12-13,15.56,15.56,14.88,15.00,12327200,7.50 -2000-12-12,15.25,16.00,15.00,15.38,13803400,7.69 -2000-12-11,15.19,15.38,14.88,15.19,11884000,7.59 -2000-12-08,14.81,15.31,14.44,15.06,15568200,7.53 -2000-12-07,14.44,14.88,14.00,14.31,14606600,7.16 -2000-12-06,14.63,15.00,14.00,14.31,49092400,7.16 -2000-12-05,16.94,17.44,16.37,17.00,21932200,8.50 -2000-12-04,17.19,17.19,16.44,16.69,13273400,8.35 -2000-12-01,17.00,17.50,16.81,17.06,13783800,8.53 -2000-11-30,16.69,17.00,16.12,16.50,28922200,8.25 -2000-11-29,18.09,18.31,17.25,17.56,17586200,8.78 -2000-11-28,18.69,19.00,17.94,18.03,9618200,9.02 -2000-11-27,19.87,19.94,18.50,18.69,9244000,9.35 -2000-11-24,18.86,19.50,18.81,19.31,5751800,9.65 -2000-11-22,18.81,19.12,18.37,18.50,10029600,9.25 -2000-11-21,19.19,19.50,18.75,18.81,10786200,9.40 -2000-11-20,18.59,19.50,18.25,18.94,14581600,9.47 -2000-11-17,19.19,19.25,18.25,18.50,15943400,9.25 -2000-11-16,19.50,19.81,18.87,19.00,8554000,9.50 -2000-11-15,20.03,20.19,19.25,19.87,10086600,9.94 -2000-11-14,19.94,20.50,19.56,20.25,14611200,10.12 -2000-11-13,18.75,20.00,18.25,19.37,15423200,9.69 -2000-11-10,19.36,19.87,19.06,19.06,15080600,9.53 -2000-11-09,19.87,20.50,19.06,20.19,17035400,10.10 -2000-11-08,21.37,21.44,19.81,20.06,15082800,10.03 -2000-11-07,21.50,21.81,20.81,21.31,10786800,10.65 -2000-11-06,22.44,22.62,20.87,21.44,14060000,10.72 -2000-11-03,23.00,23.00,21.94,22.25,18423400,11.12 -2000-11-02,21.12,22.44,21.06,22.31,21105400,11.15 -2000-11-01,19.44,20.87,19.44,20.50,20553800,10.25 -2000-10-31,19.75,20.25,19.25,19.56,31649000,9.78 -2000-10-30,19.12,19.94,18.75,19.31,22832800,9.65 -2000-10-27,18.87,19.19,17.87,18.56,26594600,9.28 -2000-10-26,18.81,18.87,17.50,18.50,25780600,9.25 -2000-10-25,19.06,19.19,18.44,18.50,23720600,9.25 -2000-10-24,20.69,20.87,18.81,18.87,28736200,9.44 -2000-10-23,20.27,20.56,19.44,20.37,19694000,10.19 -2000-10-20,19.06,20.37,18.94,19.50,28270400,9.75 -2000-10-19,19.16,19.81,18.31,18.94,53818200,9.47 -2000-10-18,19.44,21.06,18.75,20.12,29803800,10.06 -2000-10-17,21.69,21.94,19.69,20.12,21495600,10.06 -2000-10-16,22.31,23.25,21.37,21.50,29298800,10.75 -2000-10-13,20.25,22.12,20.00,22.06,44564000,11.03 -2000-10-12,20.31,20.81,19.50,20.00,42548200,10.00 -2000-10-11,20.12,21.00,19.12,19.62,42801200,9.81 -2000-10-10,21.62,22.44,20.50,20.87,24683400,10.44 -2000-10-09,22.62,22.87,21.12,21.75,21342600,10.88 -2000-10-06,22.69,22.94,21.00,22.19,21881000,11.10 -2000-10-05,23.50,24.50,22.00,22.06,31189400,11.03 -2000-10-04,22.37,23.75,21.87,23.62,52368200,11.81 -2000-10-03,24.94,25.00,22.19,22.31,72795600,11.15 -2000-10-02,26.69,26.75,23.50,24.25,86610600,12.12 -2000-09-29,28.19,29.00,25.37,25.75,265069000,12.88 -2000-09-28,49.31,53.81,48.13,53.50,34988200,26.75 -2000-09-27,51.75,52.75,48.25,48.94,14370000,24.47 -2000-09-26,53.31,54.75,51.38,51.44,10396600,25.72 -2000-09-25,52.75,55.50,52.06,53.50,15564000,26.75 -2000-09-22,50.31,52.44,50.00,52.19,25961200,26.09 -2000-09-21,58.50,59.63,55.25,56.69,18238400,28.34 -2000-09-20,59.41,61.44,58.56,61.05,8121600,30.52 -2000-09-19,59.75,60.50,58.56,59.94,9706200,29.97 -2000-09-18,55.25,60.75,55.06,60.66,15163200,30.33 -2000-09-15,57.75,58.19,54.25,55.23,14095400,27.61 -2000-09-14,58.56,59.63,56.81,56.86,15241800,28.43 -2000-09-13,56.75,59.50,56.75,58.00,10932600,29.00 -2000-09-12,57.34,60.06,57.00,57.75,6722200,28.88 -2000-09-11,58.69,60.38,58.13,58.44,6699000,29.22 -2000-09-08,61.63,61.63,58.50,58.88,6984400,29.44 -2000-09-07,59.13,62.56,58.25,62.00,7770400,31.00 -2000-09-06,61.38,62.38,57.75,58.44,12700400,29.22 -2000-09-05,62.66,64.12,62.25,62.44,10669000,31.22 -2000-09-01,61.31,63.63,61.13,63.44,9181800,31.72 -2000-08-31,58.97,61.50,58.94,60.94,14988800,30.47 -2000-08-30,59.00,60.00,58.70,59.50,10199600,29.75 -2000-08-29,57.88,59.44,57.69,59.19,9546200,29.59 -2000-08-28,57.25,59.00,57.06,58.06,12822600,29.03 -2000-08-25,56.50,57.50,56.38,56.81,11947800,28.41 -2000-08-24,54.67,56.63,53.38,56.11,11109400,28.06 -2000-08-23,51.47,54.75,51.06,54.31,8470400,27.16 -2000-08-22,50.63,52.81,50.38,51.69,9889000,25.84 -2000-08-21,50.25,51.56,49.63,50.50,4803800,25.25 -2000-08-18,51.38,51.81,49.88,50.00,6798800,25.00 -2000-08-17,48.38,52.44,48.31,51.44,9683400,25.72 -2000-08-16,46.88,49.00,46.81,48.50,5137600,24.25 -2000-08-15,47.25,47.94,46.50,46.69,4089000,23.34 -2000-08-14,47.59,47.69,46.31,47.06,5603400,23.53 -2000-08-11,46.84,48.00,45.56,47.69,8503200,23.84 -2000-08-10,48.00,48.44,47.38,47.56,8995400,23.78 -2000-08-09,48.13,48.44,47.25,47.50,13569000,23.75 -2000-08-08,47.94,48.00,46.31,46.75,6315400,23.38 -2000-08-07,47.88,49.06,47.19,47.94,6697200,23.97 -2000-08-04,49.47,51.25,46.31,47.38,9406800,23.69 -2000-08-03,45.56,48.06,44.25,48.00,12150000,24.00 -2000-08-02,49.00,49.94,47.19,47.25,5808800,23.62 -2000-08-01,50.31,51.16,49.25,49.31,4904600,24.66 -2000-07-31,49.16,51.63,48.75,50.81,5550000,25.41 -2000-07-28,52.28,52.50,46.88,48.31,8505400,24.16 -2000-07-27,50.00,53.25,49.88,52.00,10543800,26.00 -2000-07-26,49.84,51.25,49.25,50.06,7526200,25.03 -2000-07-25,50.31,50.63,49.06,50.06,7567200,25.03 -2000-07-24,52.56,52.88,47.50,48.69,14720600,24.34 -2000-07-21,54.36,55.63,52.94,53.56,7013200,26.78 -2000-07-20,55.00,57.06,54.13,55.13,16631800,27.57 -2000-07-19,55.19,56.81,51.75,52.69,16359600,26.34 -2000-07-18,58.50,58.88,56.88,57.25,11378200,28.62 -2000-07-17,58.25,58.81,57.13,58.31,9289000,29.16 -2000-07-14,57.13,59.00,56.88,57.69,6804400,28.84 -2000-07-13,58.50,60.63,54.75,56.50,15925600,28.25 -2000-07-12,58.13,58.94,56.38,58.88,8057600,29.44 -2000-07-11,57.00,59.25,55.44,56.94,12783200,28.47 -2000-07-10,54.09,58.25,53.75,57.13,14211000,28.57 -2000-07-07,52.59,54.81,52.13,54.44,9422600,27.22 -2000-07-06,52.50,52.94,49.63,51.81,11063800,25.91 -2000-07-05,53.25,55.19,50.75,51.63,9478800,25.82 -2000-07-03,52.13,54.31,52.13,53.31,2535000,26.66 -2000-06-30,52.81,54.94,51.69,52.38,11550000,26.19 -2000-06-29,53.06,53.94,51.06,51.25,7281200,25.62 -2000-06-28,53.31,55.38,51.50,54.44,10235000,27.22 -2000-06-27,53.78,55.50,51.63,51.75,7270600,25.88 -2000-06-26,52.50,54.75,52.13,54.13,6631000,27.07 -2000-06-23,53.78,54.63,50.81,51.69,7320400,25.84 -2000-06-22,55.75,57.63,53.56,53.75,16706200,26.88 -2000-06-21,50.50,56.94,50.31,55.63,17500000,27.82 -2000-06-20,98.50,103.94,98.37,101.25,17922000,25.31 -2000-06-19,90.56,97.87,89.81,96.62,14089200,24.16 -2000-06-16,93.50,93.75,89.06,91.19,10842400,22.80 -2000-06-15,91.25,93.37,89.00,92.37,8898800,23.09 -2000-06-14,94.69,96.25,90.12,90.44,9925200,22.61 -2000-06-13,91.19,94.69,88.19,94.50,12570000,23.62 -2000-06-12,96.37,96.44,90.87,91.19,10374400,22.80 -2000-06-09,96.75,97.94,94.37,95.75,9020000,23.94 -2000-06-08,97.62,98.50,93.12,94.81,8540800,23.70 -2000-06-07,93.62,97.00,91.62,96.56,12056800,24.14 -2000-06-06,91.97,96.75,90.31,92.87,18771200,23.22 -2000-06-05,93.31,95.25,89.69,91.31,11582000,22.83 -2000-06-02,93.75,99.75,89.00,92.56,28336400,23.14 -2000-06-01,81.75,89.56,80.37,89.12,32280000,22.28 -2000-05-31,86.87,91.25,83.81,84.00,15483600,21.00 -2000-05-30,87.62,88.12,81.75,87.56,25481200,21.89 -2000-05-26,88.00,89.87,85.25,86.37,6486400,21.59 -2000-05-25,88.50,92.66,86.00,87.27,14530800,21.82 -2000-05-24,86.19,89.75,83.00,87.69,24248000,21.92 -2000-05-23,90.50,93.37,85.62,85.81,18488000,21.45 -2000-05-22,93.75,93.75,86.00,89.94,26995200,22.49 -2000-05-19,99.25,99.25,93.37,94.00,26459200,23.50 -2000-05-18,103.00,104.94,100.62,100.75,13365600,25.19 -2000-05-17,103.62,103.69,100.37,101.37,14227600,25.34 -2000-05-16,104.52,109.06,102.75,105.69,15736400,26.42 -2000-05-15,108.06,108.06,100.12,101.00,24252000,25.25 -2000-05-12,106.00,110.50,104.77,107.62,10962000,26.91 -2000-05-11,101.37,104.25,99.00,102.81,17852400,25.70 -2000-05-10,104.06,105.00,98.75,99.31,19127600,24.83 -2000-05-09,110.31,111.25,104.87,105.44,11685600,26.36 -2000-05-08,112.09,113.69,110.00,110.12,6605600,27.53 -2000-05-05,110.81,114.75,110.72,113.12,10160000,28.28 -2000-05-04,115.12,115.25,110.56,110.69,14284400,27.67 -2000-05-03,118.94,121.25,111.62,115.06,17500000,28.76 -2000-05-02,123.25,126.25,117.50,117.87,8446400,29.47 -2000-05-01,124.87,125.12,121.87,124.31,8100000,31.08 -2000-04-28,127.12,127.50,121.31,124.06,8932400,31.01 -2000-04-27,117.19,127.00,116.58,126.75,11678000,31.69 -2000-04-26,126.62,128.00,120.00,121.31,13117600,30.33 -2000-04-25,122.12,128.75,122.06,128.31,14002400,32.08 -2000-04-24,115.00,120.50,114.75,120.50,15845600,30.12 -2000-04-20,123.69,124.75,117.06,118.87,25806800,29.72 -2000-04-19,126.19,130.25,119.75,121.12,18586400,30.28 -2000-04-18,123.50,126.87,119.37,126.87,13962400,31.72 -2000-04-17,109.50,123.94,109.06,123.87,14642400,30.97 -2000-04-14,109.31,118.00,109.00,111.87,23845600,27.97 -2000-04-13,111.50,120.00,108.50,113.81,18923600,28.45 -2000-04-12,119.00,119.00,104.87,109.25,33618800,27.31 -2000-04-11,123.50,124.87,118.06,119.44,19368000,29.86 -2000-04-10,131.69,132.75,124.75,125.00,7592400,31.25 -2000-04-07,127.25,131.88,125.50,131.75,8668800,32.94 -2000-04-06,130.63,134.50,123.25,125.19,9290800,31.30 -2000-04-05,126.47,132.88,124.00,130.38,16359200,32.60 -2000-04-04,132.63,133.00,116.75,127.31,23596400,31.83 -2000-04-03,135.50,139.50,129.44,133.31,11742400,33.33 -2000-03-31,127.44,137.25,126.00,135.81,14457600,33.95 -2000-03-30,133.56,137.69,125.44,125.75,14800000,31.44 -2000-03-29,139.38,139.44,133.83,135.94,8568800,33.99 -2000-03-28,137.25,142.00,137.13,139.13,7253600,34.78 -2000-03-27,137.63,144.75,136.88,139.56,9976800,34.89 -2000-03-24,142.44,143.94,135.50,138.69,15962000,34.67 -2000-03-23,142.00,150.38,140.00,141.31,20098000,35.33 -2000-03-22,132.78,144.38,131.56,144.19,20288800,36.05 -2000-03-21,122.56,136.75,121.62,134.94,18729200,33.74 -2000-03-20,123.50,126.25,122.37,123.00,7316400,30.75 -2000-03-17,120.12,125.00,119.62,125.00,10902400,31.25 -2000-03-16,117.31,122.00,114.50,121.56,13516800,30.39 -2000-03-15,115.62,120.25,114.12,116.25,15845200,29.06 -2000-03-14,121.22,124.25,114.00,114.25,15321200,28.56 -2000-03-13,122.12,126.50,119.50,121.31,10864400,30.33 -2000-03-10,121.69,127.94,121.00,125.75,8900800,31.44 -2000-03-09,120.87,125.00,118.25,122.25,9884400,30.56 -2000-03-08,122.87,123.94,118.56,122.00,9690800,30.50 -2000-03-07,126.44,127.44,121.12,122.87,9767600,30.72 -2000-03-06,126.00,129.13,125.00,125.69,7520000,31.42 -2000-03-03,124.87,128.23,120.00,128.00,11565200,32.00 -2000-03-02,127.00,127.94,120.69,122.00,11136800,30.50 -2000-03-01,118.56,132.06,118.50,130.31,38478000,32.58 -2000-02-29,113.56,117.25,112.56,114.62,13186800,28.66 -2000-02-28,110.12,115.00,108.37,113.25,11729200,28.31 -2000-02-25,114.81,117.00,110.12,110.37,8908000,27.59 -2000-02-24,117.31,119.12,111.75,115.20,13446400,28.80 -2000-02-23,113.23,119.00,111.00,116.25,16905600,29.06 -2000-02-22,110.12,116.94,106.69,113.81,15083200,28.45 -2000-02-18,114.62,115.37,110.87,111.25,8346800,27.81 -2000-02-17,115.19,115.50,113.12,114.87,10350000,28.72 -2000-02-16,117.75,118.12,112.12,114.12,13525200,28.53 -2000-02-15,115.25,119.94,115.19,119.00,17363600,29.75 -2000-02-14,109.31,115.87,108.62,115.81,13130000,28.95 -2000-02-11,113.62,114.12,108.25,108.75,7592000,27.19 -2000-02-10,112.87,113.87,110.00,113.50,10832400,28.38 -2000-02-09,114.12,117.12,112.44,112.62,10698000,28.16 -2000-02-08,114.00,116.12,111.25,114.87,14613600,28.72 -2000-02-07,108.00,114.25,105.94,114.06,15770800,28.51 -2000-02-04,103.94,110.00,103.62,108.00,15206800,27.00 -2000-02-03,100.31,104.25,100.25,103.31,16977600,25.83 -2000-02-02,100.75,102.12,97.00,98.81,16588800,24.70 -2000-02-01,104.00,105.00,100.00,100.25,11380000,25.06 -2000-01-31,101.00,103.87,94.50,103.75,25071200,25.94 -2000-01-28,108.19,110.87,100.62,101.62,15142000,25.41 -2000-01-27,108.81,113.00,107.00,110.00,12163600,27.50 -2000-01-26,110.00,114.19,109.75,110.19,13131200,27.55 -2000-01-25,105.00,113.12,102.37,112.25,17775200,28.06 -2000-01-24,108.44,112.75,105.12,106.25,15760000,26.56 -2000-01-21,114.25,114.25,110.19,111.31,17729200,27.83 -2000-01-20,115.50,121.50,113.50,113.50,65418800,28.38 -2000-01-19,105.62,108.75,103.37,106.56,21358000,26.64 -2000-01-18,101.00,106.00,100.44,103.94,16421200,25.99 -2000-01-14,100.00,102.25,99.37,100.44,13954400,25.11 -2000-01-13,94.48,98.75,92.50,96.75,36882400,24.19 -2000-01-12,95.00,95.50,86.50,87.19,34870800,21.80 -2000-01-11,95.94,99.37,90.50,92.75,15775200,23.19 -2000-01-10,102.00,102.25,94.75,97.75,18059200,24.44 -2000-01-07,96.50,101.00,95.50,99.50,16463200,24.88 -2000-01-06,106.12,107.00,95.00,95.00,27443200,23.75 -2000-01-05,103.75,110.56,103.00,104.00,27818000,26.00 -2000-01-04,108.25,110.62,101.19,102.50,18310000,25.62 -2000-01-03,104.87,112.50,101.69,111.94,19144400,27.99 -1999-12-31,100.94,102.87,99.50,102.81,5856400,25.70 -1999-12-30,102.19,104.12,99.62,100.31,7419200,25.08 -1999-12-29,96.81,102.19,95.50,100.69,10161200,25.17 -1999-12-28,99.12,99.62,95.00,98.19,8843200,24.55 -1999-12-27,104.37,104.44,99.25,99.31,6022000,24.83 -1999-12-23,101.81,104.25,101.06,103.50,8218800,25.88 -1999-12-22,102.87,104.56,98.75,99.94,11682000,24.99 -1999-12-21,98.19,103.06,97.94,102.50,11000000,25.62 -1999-12-20,99.56,99.62,96.62,98.00,10155200,24.50 -1999-12-17,100.87,102.00,98.50,100.00,17700800,25.00 -1999-12-16,98.00,98.37,94.00,98.31,16568000,24.58 -1999-12-15,93.25,97.25,91.06,97.00,22254400,24.25 -1999-12-14,98.37,99.75,94.75,94.87,15570800,23.72 -1999-12-13,102.39,102.50,98.94,99.00,18931200,24.75 -1999-12-10,105.31,109.25,99.00,103.00,22786800,25.75 -1999-12-09,111.00,111.00,100.87,105.25,30555600,26.31 -1999-12-08,116.25,117.87,109.50,110.06,14730800,27.51 -1999-12-07,116.56,118.00,114.00,117.81,15901200,29.45 -1999-12-06,114.56,117.31,111.44,116.00,16688000,29.00 -1999-12-03,112.19,115.56,111.87,115.00,23151200,28.75 -1999-12-02,103.12,110.62,101.75,110.19,20275600,27.55 -1999-12-01,101.00,104.50,100.06,103.06,22098000,25.76 -1999-11-30,98.12,103.75,97.37,97.87,30132400,24.47 -1999-11-29,94.25,99.75,93.25,94.56,16586800,23.64 -1999-11-26,94.75,95.50,94.12,95.06,4737600,23.76 -1999-11-24,93.00,95.00,91.69,94.69,7683600,23.67 -1999-11-23,91.75,95.25,88.50,92.81,19406400,23.20 -1999-11-22,91.75,91.75,89.25,90.62,7242400,22.66 -1999-11-19,89.50,92.87,88.06,92.44,11162000,23.11 -1999-11-18,91.06,91.12,88.44,89.62,13043600,22.41 -1999-11-17,90.69,94.75,90.00,90.25,13032000,22.56 -1999-11-16,90.00,91.75,88.50,91.19,8370000,22.80 -1999-11-15,89.62,92.87,88.50,89.44,9283600,22.36 -1999-11-12,91.94,92.00,87.37,90.62,9970000,22.66 -1999-11-11,91.59,92.62,89.87,92.25,9660000,23.06 -1999-11-10,88.25,93.25,88.12,91.44,20661200,22.86 -1999-11-09,94.37,94.50,88.00,89.62,28910000,22.41 -1999-11-08,87.75,97.73,86.75,96.37,33962400,24.09 -1999-11-05,84.62,88.37,84.00,88.31,14889200,22.08 -1999-11-04,82.06,85.37,80.62,83.62,13549200,20.91 -1999-11-03,81.62,83.25,81.00,81.50,11736800,20.38 -1999-11-02,78.00,81.69,77.31,80.25,14268800,20.06 -1999-11-01,80.00,80.69,77.37,77.62,9965600,19.41 -1999-10-29,78.81,81.06,78.81,80.12,18680800,20.03 -1999-10-28,77.06,79.00,76.06,77.87,18005200,19.47 -1999-10-27,74.37,76.62,73.44,76.37,15837600,19.09 -1999-10-26,74.94,75.50,73.31,75.06,12924400,18.76 -1999-10-25,74.25,76.12,73.75,74.50,11677600,18.62 -1999-10-22,77.12,77.25,73.37,73.94,14995200,18.49 -1999-10-21,72.56,77.06,72.37,76.12,28347600,19.03 -1999-10-20,70.00,75.25,70.00,75.12,38633600,18.78 -1999-10-19,71.62,75.00,68.44,68.50,36521200,17.12 -1999-10-18,73.87,74.25,71.12,73.25,27733600,18.31 -1999-10-15,71.12,75.81,70.19,74.56,41910000,18.64 -1999-10-14,69.25,73.31,69.00,73.19,67822400,18.30 -1999-10-13,66.62,69.50,63.75,64.03,22752000,16.01 -1999-10-12,67.87,69.62,67.00,67.69,20142000,16.92 -1999-10-11,66.00,68.25,66.00,66.69,9418000,16.67 -1999-10-08,66.19,66.31,63.50,65.56,13689200,16.39 -1999-10-07,68.44,68.62,64.87,66.37,21660800,16.59 -1999-10-06,69.37,69.62,67.00,67.19,28726400,16.80 -1999-10-05,65.62,68.12,64.75,67.94,29100800,16.99 -1999-10-04,62.38,64.87,62.38,64.56,16408800,16.14 -1999-10-01,62.13,62.44,59.50,61.72,21977600,15.43 -1999-09-30,59.56,64.19,59.25,63.31,32449200,15.83 -1999-09-29,60.25,61.25,58.00,59.06,23493600,14.77 -1999-09-28,61.50,62.00,57.44,59.63,50542400,14.91 -1999-09-27,66.37,66.75,61.19,61.31,33877600,15.33 -1999-09-24,63.38,67.02,63.00,64.94,42148800,16.24 -1999-09-23,71.12,71.25,63.00,63.31,40853200,15.83 -1999-09-22,69.75,71.62,69.02,70.31,40132000,17.58 -1999-09-21,73.19,73.25,69.00,69.25,119931200,17.31 -1999-09-20,77.00,80.12,76.87,79.06,16326400,19.76 -1999-09-17,77.31,77.75,76.25,76.94,9915600,19.24 -1999-09-16,76.06,78.06,73.87,76.81,15793600,19.20 -1999-09-15,78.87,79.12,75.25,75.37,12843200,18.84 -1999-09-14,74.72,78.50,74.69,77.81,13883200,19.45 -1999-09-13,77.06,77.06,74.81,75.00,9000000,18.75 -1999-09-10,76.00,77.69,74.69,77.44,16398000,19.36 -1999-09-09,75.50,75.94,73.87,75.56,19093600,18.89 -1999-09-08,76.19,77.69,74.50,74.50,27233600,18.62 -1999-09-07,73.75,77.94,73.50,76.37,35177600,19.09 -1999-09-03,71.94,75.25,70.50,73.50,58403600,18.38 -1999-09-02,67.62,71.44,66.87,70.56,31975200,17.64 -1999-09-01,67.00,68.81,66.00,68.62,28168000,17.16 -1999-08-31,62.59,65.87,62.06,65.25,22675200,16.31 -1999-08-30,65.00,65.00,62.00,62.06,12033200,15.52 -1999-08-27,62.75,65.00,62.69,64.75,15980000,16.19 -1999-08-26,61.13,63.13,61.13,62.13,14449200,15.53 -1999-08-25,60.69,61.50,60.13,61.38,10553600,15.35 -1999-08-24,60.38,60.75,59.94,60.38,17948000,15.10 -1999-08-23,59.38,61.38,59.31,60.75,12709200,15.19 -1999-08-20,59.25,59.38,58.19,59.19,11730800,14.80 -1999-08-19,59.81,60.50,58.56,58.75,19645600,14.69 -1999-08-18,60.06,62.00,59.63,60.13,16743200,15.03 -1999-08-17,60.31,60.38,58.94,60.31,11474400,15.08 -1999-08-16,59.81,60.69,59.50,60.50,9896400,15.12 -1999-08-13,60.63,62.00,59.88,60.06,10668800,15.02 -1999-08-12,59.06,61.38,58.63,60.00,23806400,15.00 -1999-08-11,56.00,59.75,55.94,59.69,30374400,14.92 -1999-08-10,54.00,56.00,53.63,55.38,14879200,13.85 -1999-08-09,54.34,55.19,54.25,54.44,8338000,13.61 -1999-08-06,54.06,55.31,53.50,54.13,15575600,13.53 -1999-08-05,53.50,54.88,52.13,54.75,11541200,13.69 -1999-08-04,55.19,55.88,53.25,53.81,13279200,13.45 -1999-08-03,56.75,57.44,53.63,55.25,13176800,13.81 -1999-08-02,55.63,58.00,55.50,55.75,12958000,13.94 -1999-07-30,54.50,56.13,54.50,55.69,13685600,13.92 -1999-07-29,53.38,55.25,53.13,53.88,9860000,13.47 -1999-07-28,53.88,55.38,53.00,54.38,11762000,13.60 -1999-07-27,52.63,53.94,52.50,53.69,14150800,13.42 -1999-07-26,52.88,53.00,50.88,50.94,12555200,12.73 -1999-07-23,52.81,53.75,52.69,53.31,8192000,13.33 -1999-07-22,53.63,53.88,51.13,52.38,14529200,13.10 -1999-07-21,54.06,55.44,52.88,54.06,25653600,13.52 -1999-07-20,54.56,55.50,52.75,52.88,15804400,13.22 -1999-07-19,53.94,55.81,52.31,54.44,20050000,13.61 -1999-07-16,53.63,54.50,53.00,53.06,14705600,13.27 -1999-07-15,55.88,55.94,51.31,53.25,60433600,13.31 -1999-07-14,54.50,56.63,54.50,55.94,22320000,13.98 -1999-07-13,53.50,54.19,52.88,53.69,10136800,13.42 -1999-07-12,55.50,55.63,54.19,54.50,10862000,13.62 -1999-07-09,54.50,55.63,53.00,55.63,21750000,13.91 -1999-07-08,51.13,55.06,50.88,54.50,58058000,13.62 -1999-07-07,47.38,50.75,47.00,49.88,39264400,12.47 -1999-07-06,45.94,47.63,45.81,47.38,16212000,11.85 -1999-07-02,45.53,46.88,45.19,46.31,4426800,11.58 -1999-07-01,46.31,46.56,45.25,45.31,5334400,11.33 -1999-06-30,45.69,46.94,44.94,46.31,12270800,11.58 -1999-06-29,42.72,45.56,42.63,45.38,13599200,11.35 -1999-06-28,42.44,42.94,42.38,42.56,9938800,10.64 -1999-06-25,42.50,42.69,42.06,42.19,10518800,10.55 -1999-06-24,43.63,43.63,42.25,42.31,15498000,10.58 -1999-06-23,45.06,45.09,43.56,43.69,18994400,10.92 -1999-06-22,46.31,46.94,45.38,45.38,5415600,11.35 -1999-06-21,47.00,47.25,46.00,46.50,4842000,11.62 -1999-06-18,45.38,47.25,45.19,47.13,7448000,11.78 -1999-06-17,47.63,48.00,45.75,46.38,8022400,11.60 -1999-06-16,46.38,48.06,46.38,47.94,8056800,11.98 -1999-06-15,45.19,46.75,45.13,46.06,4666400,11.52 -1999-06-14,46.50,46.63,45.13,45.44,5615600,11.36 -1999-06-11,48.13,48.50,46.25,46.44,6613600,11.61 -1999-06-10,47.88,48.25,47.31,48.13,11325200,12.03 -1999-06-09,47.44,48.50,47.44,48.44,12655200,12.11 -1999-06-08,48.75,48.81,47.56,47.69,11203200,11.92 -1999-06-07,48.13,49.00,47.50,48.94,14949200,12.23 -1999-06-04,47.63,48.19,47.25,48.13,13171200,12.03 -1999-06-03,46.88,48.00,46.81,47.44,17450800,11.86 -1999-06-02,44.50,47.94,44.00,46.56,18614400,11.64 -1999-06-01,45.00,45.31,44.38,44.81,16479200,11.20 -1999-05-28,43.31,44.31,43.13,44.06,7196400,11.02 -1999-05-27,43.19,43.75,42.69,43.50,12042400,10.88 -1999-05-26,41.75,44.38,41.25,44.06,15642000,11.02 -1999-05-25,41.56,42.44,40.94,41.50,13095200,10.38 -1999-05-24,43.63,44.31,41.88,41.94,9340800,10.48 -1999-05-21,43.00,44.31,42.56,43.94,16555200,10.98 -1999-05-20,45.44,45.75,42.50,42.50,14940000,10.62 -1999-05-19,45.50,45.75,43.50,45.19,10660000,11.30 -1999-05-18,44.81,46.00,44.38,45.25,14954400,11.31 -1999-05-17,43.75,44.69,43.00,44.38,7531200,11.10 -1999-05-14,45.13,45.81,44.38,44.38,8102000,11.10 -1999-05-13,46.44,46.81,45.50,46.19,10573600,11.55 -1999-05-12,44.88,46.50,44.13,46.50,14129200,11.62 -1999-05-11,44.88,46.19,43.56,44.75,16388800,11.19 -1999-05-10,46.75,46.94,44.63,45.25,14055600,11.31 -1999-05-07,44.63,45.88,42.75,45.88,15528800,11.47 -1999-05-06,46.56,46.88,44.00,44.50,15486400,11.12 -1999-05-05,46.31,47.00,44.63,47.00,20694400,11.75 -1999-05-04,48.25,48.63,46.19,46.50,28980000,11.62 -1999-05-03,46.06,50.00,45.75,49.56,52535600,12.39 -1999-04-30,44.00,47.13,44.00,46.00,52596400,11.50 -1999-04-29,43.25,44.38,41.78,43.00,28206400,10.75 -1999-04-28,44.63,45.69,43.63,44.06,34122000,11.02 -1999-04-27,43.00,45.81,43.00,45.75,75225200,11.44 -1999-04-26,39.50,41.25,39.25,40.94,33152000,10.23 -1999-04-23,36.25,39.44,36.25,39.19,37402400,9.80 -1999-04-22,35.06,36.63,35.06,36.38,26454400,9.10 -1999-04-21,34.00,34.38,33.50,34.38,12566800,8.60 -1999-04-20,33.88,34.75,33.50,34.06,18725600,8.52 -1999-04-19,35.69,36.00,33.50,33.88,32923200,8.47 -1999-04-16,35.88,36.06,35.25,35.44,17945600,8.86 -1999-04-15,35.38,36.19,34.31,35.75,61960000,8.94 -1999-04-14,35.25,37.06,35.00,35.53,24323600,8.88 -1999-04-13,36.31,36.81,34.50,34.63,14732400,8.66 -1999-04-12,35.00,36.88,34.88,36.25,14145600,9.06 -1999-04-09,36.25,37.25,35.94,36.75,9608000,9.19 -1999-04-08,36.88,37.06,36.00,36.88,10600800,9.22 -1999-04-07,38.06,38.25,36.38,37.13,14723200,9.28 -1999-04-06,36.81,38.31,36.81,38.00,22455200,9.50 -1999-04-05,36.00,37.88,36.00,37.06,16474400,9.27 -1999-04-01,36.06,36.69,35.75,36.06,9381200,9.02 -1999-03-31,36.38,37.13,35.88,35.94,15086400,8.98 -1999-03-30,35.00,36.38,35.00,35.88,19806800,8.97 -1999-03-29,33.50,35.44,33.44,35.38,20337600,8.85 -1999-03-26,33.75,33.81,33.00,33.25,9080000,8.31 -1999-03-25,34.38,34.88,33.38,33.81,14286800,8.45 -1999-03-24,33.25,33.75,32.50,33.69,14297600,8.42 -1999-03-23,34.44,34.44,32.75,33.00,14842000,8.25 -1999-03-22,34.00,35.19,32.94,35.06,21200800,8.77 -1999-03-19,35.94,36.00,32.88,33.50,19161200,8.38 -1999-03-18,34.38,35.63,34.25,35.50,8126800,8.88 -1999-03-17,35.94,36.06,33.94,34.06,13084400,8.52 -1999-03-16,35.00,35.56,34.94,35.50,14302000,8.88 -1999-03-15,33.31,35.00,33.25,34.06,12586800,8.52 -1999-03-12,32.31,33.50,32.31,33.19,9700000,8.30 -1999-03-11,32.25,33.88,32.00,32.19,16936800,8.05 -1999-03-10,34.19,34.19,32.44,32.56,19526800,8.14 -1999-03-09,34.31,34.38,33.50,34.13,11427600,8.53 -1999-03-08,33.25,34.69,33.19,34.38,19682000,8.60 -1999-03-05,34.31,34.31,32.38,33.19,16735600,8.30 -1999-03-04,34.50,34.50,32.38,33.44,13137600,8.36 -1999-03-03,34.75,35.13,33.50,34.19,10497600,8.55 -1999-03-02,34.13,35.31,33.75,34.63,24414400,8.66 -1999-03-01,34.81,34.81,33.63,33.75,17435200,8.44 -1999-02-26,36.50,37.00,34.50,34.81,23847600,8.70 -1999-02-25,37.31,37.69,36.50,36.94,9455600,9.23 -1999-02-24,38.81,39.00,37.38,37.44,7620000,9.36 -1999-02-23,38.56,39.56,37.94,38.44,11521200,9.61 -1999-02-22,37.38,38.88,37.25,38.44,10682000,9.61 -1999-02-19,36.25,37.69,36.19,37.19,12938800,9.30 -1999-02-18,37.56,37.88,35.56,36.00,17876400,9.00 -1999-02-17,38.13,38.69,36.94,37.00,10581200,9.25 -1999-02-16,38.88,38.88,37.88,38.31,10723600,9.58 -1999-02-12,39.13,39.13,37.00,37.69,15339200,9.42 -1999-02-11,38.75,39.75,38.56,39.63,20200000,9.91 -1999-02-10,36.88,38.69,36.00,38.31,20135200,9.58 -1999-02-09,37.94,39.06,37.06,37.19,25042000,9.30 -1999-02-08,36.69,37.94,36.25,37.75,16723600,9.44 -1999-02-05,38.25,38.38,35.50,36.31,27778000,9.08 -1999-02-04,40.19,40.25,37.75,37.88,16565600,9.47 -1999-02-03,39.00,40.56,38.75,40.19,12108000,10.05 -1999-02-02,40.38,40.75,39.00,39.19,10975600,9.80 -1999-02-01,41.69,41.94,40.31,40.94,9962000,10.23 -1999-01-29,41.19,41.56,40.00,41.19,8684400,10.30 -1999-01-28,40.88,41.25,40.31,40.88,12015600,10.22 -1999-01-27,41.00,41.38,39.94,40.13,13053200,10.03 -1999-01-26,39.94,40.88,39.63,40.50,20002400,10.12 -1999-01-25,39.25,39.56,38.81,39.38,13763200,9.85 -1999-01-22,37.69,39.50,37.06,38.75,12365200,9.69 -1999-01-21,40.44,40.56,37.50,38.81,21449200,9.70 -1999-01-20,41.06,42.00,40.50,40.56,27806800,10.14 -1999-01-19,41.94,42.31,40.38,40.88,19116400,10.22 -1999-01-15,41.81,42.13,40.00,41.31,35933600,10.33 -1999-01-14,45.50,46.00,41.06,41.38,61570000,10.35 -1999-01-13,42.88,47.31,42.25,46.50,37434400,11.62 -1999-01-12,46.31,46.63,44.13,46.13,29330000,11.53 -1999-01-11,45.75,46.06,44.88,45.88,20054400,11.47 -1999-01-08,46.56,46.88,44.00,45.00,24246400,11.25 -1999-01-07,42.25,45.06,42.13,45.00,51056800,11.25 -1999-01-06,44.13,44.13,41.00,41.75,48165200,10.44 -1999-01-05,41.94,43.94,41.50,43.31,50362000,10.83 -1999-01-04,42.13,42.25,40.00,41.25,34049200,10.31 -1998-12-31,40.50,41.38,39.50,40.94,9716400,10.23 -1998-12-30,40.13,41.13,40.00,40.06,8498000,10.02 -1998-12-29,41.13,41.50,40.25,40.81,13853200,10.20 -1998-12-28,39.00,41.13,39.00,40.88,25917600,10.22 -1998-12-24,39.88,40.00,39.19,39.25,7155200,9.81 -1998-12-23,38.63,40.50,38.38,39.81,44124400,9.95 -1998-12-22,36.38,38.13,36.00,38.00,41111200,9.50 -1998-12-21,35.38,35.63,34.25,35.06,12769200,8.77 -1998-12-18,33.38,35.38,33.25,35.19,28283200,8.80 -1998-12-17,32.94,33.75,32.75,33.44,11812000,8.36 -1998-12-16,33.75,34.19,32.63,32.81,13375200,8.20 -1998-12-15,32.75,33.63,32.75,33.56,9462000,8.39 -1998-12-14,32.88,33.31,32.25,32.50,17925200,8.12 -1998-12-11,32.25,34.00,32.00,33.75,24644400,8.44 -1998-12-10,32.69,32.94,31.87,32.00,13980800,8.00 -1998-12-09,32.69,32.88,31.62,32.00,21184400,8.00 -1998-12-08,33.94,33.94,32.00,32.06,24295200,8.02 -1998-12-07,33.38,33.75,32.75,33.75,20255600,8.44 -1998-12-04,34.31,34.44,32.00,32.75,25765200,8.19 -1998-12-03,36.31,36.50,33.63,33.69,22380800,8.42 -1998-12-02,34.13,36.88,33.50,36.00,34382400,9.00 -1998-12-01,32.00,34.81,31.62,34.13,30941200,8.53 -1998-11-30,34.56,34.81,31.75,31.94,20060800,7.99 -1998-11-27,35.06,35.13,34.75,35.06,5483600,8.77 -1998-11-25,35.88,36.06,34.94,35.13,10855600,8.78 -1998-11-24,36.13,36.75,35.75,35.94,11430800,8.98 -1998-11-23,35.56,36.81,35.19,36.25,20642000,9.06 -1998-11-20,36.44,36.75,34.75,35.31,14268000,8.83 -1998-11-19,35.50,37.19,35.44,35.75,12385200,8.94 -1998-11-18,35.19,36.00,34.88,35.44,11781200,8.86 -1998-11-17,35.75,35.81,34.75,34.81,7529200,8.70 -1998-11-16,35.94,36.75,35.44,36.00,13740800,9.00 -1998-11-13,34.94,36.06,34.69,35.69,28301200,8.92 -1998-11-12,33.13,34.44,32.88,34.00,21261200,8.50 -1998-11-11,35.75,35.81,32.75,33.56,33895200,8.39 -1998-11-10,36.19,36.25,35.00,35.13,31576800,8.78 -1998-11-09,37.69,38.13,35.50,36.63,23622000,9.16 -1998-11-06,37.88,38.25,37.25,38.06,28496800,9.52 -1998-11-05,38.38,39.38,38.06,38.19,21684400,9.55 -1998-11-04,38.56,39.13,38.13,38.69,22438000,9.67 -1998-11-03,37.38,38.25,37.31,37.81,13247600,9.45 -1998-11-02,37.50,37.75,37.25,37.63,9076400,9.41 -1998-10-30,36.81,37.50,36.25,37.13,11358000,9.28 -1998-10-29,36.44,37.44,35.81,36.44,12321200,9.11 -1998-10-28,35.25,37.00,35.13,36.81,13006400,9.20 -1998-10-27,38.00,38.94,35.06,35.25,19233200,8.81 -1998-10-26,36.06,37.75,35.50,37.44,17013600,9.36 -1998-10-23,36.75,36.88,35.13,35.50,12732400,8.88 -1998-10-22,36.88,37.63,36.25,36.75,11343200,9.19 -1998-10-21,36.75,37.44,35.75,37.13,15390000,9.28 -1998-10-20,37.94,38.19,36.00,36.06,13649200,9.02 -1998-10-19,36.69,38.06,35.88,37.50,17010000,9.38 -1998-10-16,37.13,38.06,36.50,36.69,21998000,9.17 -1998-10-15,36.25,37.25,35.50,36.63,30037600,9.16 -1998-10-14,39.75,41.31,36.81,37.38,81445600,9.35 -1998-10-13,38.06,39.19,36.00,38.75,33646400,9.69 -1998-10-12,37.50,38.44,36.56,37.44,22250000,9.36 -1998-10-09,31.75,35.25,30.75,35.13,23880000,8.78 -1998-10-08,31.00,31.19,28.50,30.81,24623200,7.70 -1998-10-07,32.38,33.31,31.87,31.94,16920000,7.99 -1998-10-06,33.69,34.31,32.50,32.56,14281200,8.14 -1998-10-05,34.00,34.56,31.50,32.19,19726800,8.05 -1998-10-02,35.50,36.25,34.13,35.06,16998800,8.77 -1998-10-01,36.75,38.00,35.38,35.69,13234400,8.92 -1998-09-30,38.75,39.25,38.00,38.13,5976800,9.53 -1998-09-29,39.06,40.00,38.13,39.50,10907600,9.88 -1998-09-28,39.75,40.19,38.00,39.06,14501200,9.77 -1998-09-25,38.19,39.19,37.63,38.75,8172000,9.69 -1998-09-24,37.88,39.56,37.75,38.50,17246800,9.62 -1998-09-23,37.25,38.38,36.56,38.31,10284400,9.58 -1998-09-22,37.13,37.63,36.38,37.00,9218800,9.25 -1998-09-21,35.69,36.94,35.31,36.94,10570800,9.23 -1998-09-18,36.06,36.75,35.56,36.75,10904400,9.19 -1998-09-17,36.06,37.13,35.88,36.00,9627600,9.00 -1998-09-16,38.63,38.75,37.00,37.31,9248800,9.33 -1998-09-15,36.75,38.56,36.50,38.19,15492000,9.55 -1998-09-14,38.25,38.81,37.13,37.19,8837600,9.30 -1998-09-11,38.50,39.63,36.88,37.63,12593600,9.41 -1998-09-10,36.25,38.25,35.75,38.13,18826800,9.53 -1998-09-09,38.06,38.13,37.00,37.38,12683200,9.35 -1998-09-08,38.00,38.25,36.75,38.25,14400000,9.56 -1998-09-04,35.50,36.44,33.75,35.13,13493200,8.78 -1998-09-03,35.00,35.13,34.00,34.63,14653200,8.66 -1998-09-02,35.50,37.38,35.25,35.56,30122400,8.89 -1998-09-01,31.37,35.38,30.62,34.13,31060000,8.53 -1998-08-31,34.75,34.88,31.00,31.19,31012400,7.80 -1998-08-28,37.13,38.50,34.13,34.19,33303200,8.55 -1998-08-27,39.25,39.25,35.63,37.50,39813600,9.38 -1998-08-26,39.88,41.13,39.50,40.38,14538000,10.10 -1998-08-25,42.38,42.38,40.31,40.81,17709200,10.20 -1998-08-24,43.44,43.50,40.13,41.19,21810000,10.30 -1998-08-21,40.00,43.56,39.00,43.00,29054400,10.75 -1998-08-20,41.00,41.13,40.25,40.63,14018000,10.16 -1998-08-19,43.50,43.75,41.00,41.00,17377600,10.25 -1998-08-18,42.44,43.38,42.25,42.56,21642000,10.64 -1998-08-17,41.00,42.81,39.88,41.94,33248800,10.48 -1998-08-14,40.69,40.75,39.50,40.50,16110000,10.12 -1998-08-13,39.94,40.75,39.38,39.44,13976800,9.86 -1998-08-12,39.75,40.94,39.48,40.06,24654400,10.02 -1998-08-11,37.75,41.00,37.38,39.00,62860000,9.75 -1998-08-10,36.31,38.06,36.25,37.94,17455600,9.48 -1998-08-07,37.19,37.38,36.00,36.50,10645600,9.12 -1998-08-06,35.06,36.88,34.88,36.88,15678800,9.22 -1998-08-05,33.75,36.00,33.50,36.00,16226800,9.00 -1998-08-04,35.50,36.00,34.00,34.19,10506800,8.55 -1998-08-03,34.25,35.56,33.25,35.13,10786800,8.78 -1998-07-31,36.63,36.75,34.50,34.63,6550800,8.66 -1998-07-30,35.81,36.75,35.50,36.50,12950000,9.12 -1998-07-29,33.75,35.88,33.69,35.13,16006800,8.78 -1998-07-28,34.06,34.63,33.00,33.63,8054400,8.41 -1998-07-27,34.25,34.88,33.25,34.44,7657600,8.61 -1998-07-24,35.38,35.50,33.81,34.69,9693600,8.67 -1998-07-23,34.81,35.63,34.75,34.94,9040800,8.73 -1998-07-22,34.94,35.63,34.25,35.00,10040800,8.75 -1998-07-21,36.13,37.00,35.56,35.63,11772400,8.91 -1998-07-20,36.56,36.63,35.50,36.25,13727600,9.06 -1998-07-17,37.25,37.25,36.19,36.88,22486400,9.22 -1998-07-16,37.88,38.13,35.75,37.50,91497600,9.38 -1998-07-15,33.69,34.69,33.50,34.44,21253600,8.61 -1998-07-14,33.94,34.00,33.13,33.44,19607600,8.36 -1998-07-13,31.94,34.13,31.87,33.94,25566400,8.48 -1998-07-10,32.19,32.63,31.75,32.06,10806800,8.02 -1998-07-09,32.94,33.63,31.44,31.69,20256400,7.92 -1998-07-08,30.75,32.94,30.69,32.56,33334400,8.14 -1998-07-07,30.37,30.87,30.00,30.50,8637600,7.62 -1998-07-06,29.50,30.37,29.12,30.37,9697600,7.59 -1998-07-02,29.69,30.06,29.00,29.00,10650800,7.25 -1998-07-01,28.87,30.00,28.50,29.94,11228800,7.49 -1998-06-30,28.62,28.81,28.12,28.69,4681200,7.17 -1998-06-29,28.25,28.81,28.06,28.69,5943600,7.17 -1998-06-26,28.50,28.62,27.75,28.19,3973200,7.05 -1998-06-25,28.56,28.81,28.31,28.56,6856400,7.14 -1998-06-24,27.75,28.62,27.31,28.25,9788800,7.06 -1998-06-23,27.44,28.12,27.25,27.81,8258800,6.95 -1998-06-22,27.00,27.56,26.75,27.37,4809200,6.84 -1998-06-19,27.37,27.44,26.75,27.06,4931200,6.76 -1998-06-18,27.75,28.06,27.19,27.31,4288800,6.83 -1998-06-17,28.00,28.56,27.94,28.12,6687600,7.03 -1998-06-16,27.69,28.12,27.31,28.00,4649200,7.00 -1998-06-15,27.25,28.25,27.25,27.50,4881200,6.88 -1998-06-12,27.62,28.25,27.37,28.12,8014400,7.03 -1998-06-11,28.19,28.62,27.81,27.81,6451200,6.95 -1998-06-10,28.00,29.00,27.62,28.06,8202000,7.01 -1998-06-09,27.37,28.50,27.37,28.25,9852400,7.06 -1998-06-08,27.00,27.69,26.81,27.25,4523600,6.81 -1998-06-05,26.87,27.25,26.37,26.87,4406800,6.72 -1998-06-04,26.62,26.87,25.81,26.81,5585600,6.70 -1998-06-03,27.12,27.25,26.19,26.31,5196800,6.58 -1998-06-02,26.44,27.31,26.00,26.87,6405600,6.72 -1998-06-01,26.50,27.62,25.62,26.25,11427600,6.56 -1998-05-29,27.50,27.56,26.44,26.62,7751200,6.66 -1998-05-28,26.75,27.87,26.75,27.44,10672000,6.86 -1998-05-27,25.69,26.81,25.62,26.75,13233200,6.69 -1998-05-26,28.06,28.25,26.62,26.69,11143200,6.67 -1998-05-22,28.75,28.75,27.31,27.87,9522000,6.97 -1998-05-21,29.56,29.69,28.62,28.87,4700000,7.22 -1998-05-20,29.62,29.87,28.75,29.56,6810000,7.39 -1998-05-19,28.94,29.44,28.81,29.37,7815200,7.34 -1998-05-18,29.37,29.56,28.37,28.50,8310800,7.12 -1998-05-15,30.06,30.37,29.25,29.56,9743600,7.39 -1998-05-14,30.37,30.44,29.75,30.06,5815600,7.51 -1998-05-13,30.06,30.81,29.62,30.44,11245600,7.61 -1998-05-12,30.56,30.75,29.94,30.12,9212000,7.53 -1998-05-11,30.87,31.62,30.75,30.94,23768000,7.74 -1998-05-08,30.06,30.50,29.94,30.44,9690000,7.61 -1998-05-07,30.56,30.62,29.87,30.19,19761200,7.55 -1998-05-06,29.87,30.44,29.25,30.31,32056400,7.58 -1998-05-05,29.25,29.87,29.12,29.69,14982400,7.42 -1998-05-04,28.87,29.50,28.87,29.06,20419200,7.26 -1998-05-01,27.50,28.25,26.87,28.00,6582000,7.00 -1998-04-30,27.37,27.62,27.06,27.37,6442000,6.84 -1998-04-29,26.94,27.44,26.75,27.00,6774400,6.75 -1998-04-28,27.87,28.00,26.25,26.94,8487600,6.74 -1998-04-27,26.75,27.75,26.75,27.75,14655600,6.94 -1998-04-24,27.75,28.25,27.50,27.94,7708000,6.99 -1998-04-23,27.44,29.00,27.19,27.69,16983200,6.92 -1998-04-22,28.75,29.00,27.50,27.50,10186400,6.88 -1998-04-21,29.06,29.12,28.50,29.00,12446400,7.25 -1998-04-20,27.62,29.50,27.56,29.00,18498800,7.25 -1998-04-17,28.56,28.62,27.69,27.94,21165200,6.99 -1998-04-16,29.25,29.62,28.19,28.62,65642000,7.16 -1998-04-15,27.19,27.50,26.62,27.44,19928800,6.86 -1998-04-14,26.37,27.25,26.37,26.94,11725200,6.74 -1998-04-13,25.62,26.69,25.00,26.44,10305600,6.61 -1998-04-09,25.06,25.87,25.00,25.62,6083600,6.41 -1998-04-08,25.25,25.37,24.69,25.00,8044400,6.25 -1998-04-07,25.81,26.00,24.87,25.50,10461200,6.38 -1998-04-06,27.00,27.00,26.19,26.25,12422000,6.56 -1998-04-03,27.12,27.25,26.81,27.06,7259200,6.76 -1998-04-02,27.31,27.44,26.94,27.31,6950800,6.83 -1998-04-01,27.44,27.81,27.06,27.50,6693600,6.88 -1998-03-31,27.44,27.81,27.25,27.50,9538800,6.88 -1998-03-30,26.75,27.50,26.75,27.44,8972400,6.86 -1998-03-27,26.62,27.31,26.37,26.94,9133200,6.74 -1998-03-26,26.75,27.00,26.44,26.56,7253600,6.64 -1998-03-25,27.62,27.75,26.37,27.16,13854400,6.79 -1998-03-24,26.37,28.00,26.25,28.00,24152000,7.00 -1998-03-23,25.94,26.25,24.62,26.12,14818800,6.53 -1998-03-20,26.69,26.87,26.00,26.37,7704400,6.59 -1998-03-19,26.87,26.94,26.56,26.75,5736800,6.69 -1998-03-18,26.00,26.94,26.00,26.94,9900000,6.74 -1998-03-17,26.50,26.69,25.87,26.34,14658800,6.59 -1998-03-16,27.12,27.25,26.19,26.69,14375600,6.67 -1998-03-13,27.25,27.25,26.25,27.12,20231200,6.78 -1998-03-12,26.12,27.00,25.56,27.00,26598000,6.75 -1998-03-11,25.12,26.19,24.56,26.12,43374400,6.53 -1998-03-10,23.00,24.50,22.94,24.06,25472400,6.01 -1998-03-09,23.75,24.31,22.50,22.75,20540800,5.69 -1998-03-06,23.87,24.50,23.37,24.44,23803600,6.11 -1998-03-05,23.25,24.25,23.12,24.06,24129200,6.01 -1998-03-04,22.87,24.75,22.87,24.44,29212400,6.11 -1998-03-03,21.87,23.19,21.62,23.12,11937600,5.78 -1998-03-02,23.56,23.56,22.25,22.75,14313600,5.69 -1998-02-27,23.31,23.87,22.56,23.62,18578000,5.91 -1998-02-26,22.31,23.56,21.87,23.50,21263200,5.88 -1998-02-25,21.31,22.75,20.94,22.31,25459200,5.58 -1998-02-24,21.31,21.37,20.75,21.31,16322000,5.33 -1998-02-23,20.12,21.62,20.00,21.25,17060800,5.31 -1998-02-20,20.50,20.56,19.81,20.00,11634400,5.00 -1998-02-19,20.87,20.94,20.00,20.44,14292400,5.11 -1998-02-18,19.56,20.75,19.56,20.56,17677600,5.14 -1998-02-17,19.50,19.75,19.50,19.62,6530800,4.91 -1998-02-13,19.19,19.87,19.00,19.50,7444400,4.88 -1998-02-12,19.12,19.44,19.06,19.37,7297600,4.84 -1998-02-11,19.50,19.50,18.87,19.00,7582000,4.75 -1998-02-10,19.12,19.56,19.06,19.44,15090000,4.86 -1998-02-09,18.37,19.50,18.37,19.19,17682000,4.80 -1998-02-06,18.37,18.69,18.25,18.50,7241200,4.62 -1998-02-05,18.25,18.50,18.00,18.31,8526400,4.58 -1998-02-04,18.06,18.50,18.00,18.25,6100000,4.56 -1998-02-03,17.69,18.62,17.69,18.31,14390000,4.58 -1998-02-02,18.50,18.50,17.37,17.69,22752400,4.42 -1998-01-30,18.31,18.87,18.25,18.31,5802400,4.58 -1998-01-29,18.94,19.12,18.50,18.50,7571200,4.62 -1998-01-28,19.19,19.37,18.62,19.19,5418000,4.80 -1998-01-27,19.19,19.69,19.00,19.12,4013200,4.78 -1998-01-26,19.44,19.56,18.81,19.44,5246800,4.86 -1998-01-23,19.37,19.69,19.25,19.50,8331200,4.88 -1998-01-22,18.69,19.75,18.62,19.25,11785200,4.81 -1998-01-21,18.75,19.06,18.56,18.91,6812000,4.73 -1998-01-20,19.06,19.31,18.62,19.06,8642400,4.76 -1998-01-16,19.44,19.44,18.69,18.81,8820000,4.70 -1998-01-15,19.19,19.75,18.62,19.19,19982000,4.80 -1998-01-14,19.87,19.94,19.25,19.75,21048000,4.94 -1998-01-13,18.62,19.62,18.50,19.50,22758800,4.88 -1998-01-12,17.44,18.62,17.12,18.25,18444400,4.56 -1998-01-09,18.12,19.37,17.50,18.19,31675200,4.55 -1998-01-08,17.44,18.62,16.94,18.19,27645600,4.55 -1998-01-07,18.81,19.00,17.31,17.50,37201200,4.38 -1998-01-06,15.94,20.00,14.75,18.94,64737600,4.74 -1998-01-05,16.50,16.56,15.19,15.88,23282000,3.97 -1998-01-02,13.63,16.25,13.50,16.25,25650800,4.06 -1997-12-31,13.13,13.63,12.94,13.13,14531200,3.28 -1997-12-30,13.00,13.44,12.75,13.19,12250800,3.30 -1997-12-29,13.31,13.44,12.88,13.13,9944400,3.28 -1997-12-26,13.06,13.38,13.00,13.31,3860000,3.33 -1997-12-24,13.00,13.25,13.00,13.13,3502000,3.28 -1997-12-23,13.13,13.31,12.94,12.94,16402000,3.23 -1997-12-22,13.88,14.00,13.19,13.31,5704400,3.33 -1997-12-19,13.56,13.88,13.25,13.69,6812000,3.42 -1997-12-18,14.00,14.00,13.75,13.81,7225200,3.45 -1997-12-17,14.31,14.56,13.94,13.94,9494400,3.48 -1997-12-16,14.00,14.38,14.00,14.31,6646400,3.58 -1997-12-15,14.13,14.25,13.75,13.94,5927600,3.48 -1997-12-12,14.75,14.88,14.00,14.13,5742400,3.53 -1997-12-11,14.44,14.56,13.88,14.56,9185600,3.64 -1997-12-10,15.06,15.06,14.50,14.75,6960000,3.69 -1997-12-09,15.50,15.69,15.00,15.25,8680800,3.81 -1997-12-08,15.56,15.75,15.38,15.56,4776800,3.89 -1997-12-05,15.56,16.00,15.56,15.81,7926400,3.95 -1997-12-04,16.00,16.00,15.63,15.63,7135600,3.91 -1997-12-03,16.06,16.12,15.69,15.75,12258800,3.94 -1997-12-02,17.37,17.50,15.88,15.88,14178800,3.97 -1997-12-01,17.69,17.94,17.25,17.75,3135600,4.44 -1997-11-28,17.62,17.87,17.44,17.75,1495600,4.44 -1997-11-26,17.37,17.69,17.25,17.50,2178800,4.38 -1997-11-25,17.69,17.87,16.87,17.37,7346400,4.34 -1997-11-24,17.56,18.00,17.50,17.62,5630800,4.41 -1997-11-21,18.62,18.69,18.00,18.19,3498800,4.55 -1997-11-20,18.19,18.62,18.12,18.50,4587600,4.62 -1997-11-19,17.87,18.31,17.87,18.25,2843600,4.56 -1997-11-18,18.50,18.50,18.06,18.06,5258000,4.51 -1997-11-17,18.87,18.94,18.33,18.50,7323600,4.62 -1997-11-14,18.25,18.50,18.00,18.44,4835600,4.61 -1997-11-13,18.00,18.06,17.50,18.00,9218000,4.50 -1997-11-12,18.06,18.50,17.56,17.62,7448000,4.41 -1997-11-11,19.00,19.00,18.12,18.37,11893600,4.59 -1997-11-10,21.00,21.50,18.50,18.69,49946800,4.67 -1997-11-07,18.87,20.00,18.75,19.75,28423200,4.94 -1997-11-06,18.87,19.50,18.87,19.00,22060800,4.75 -1997-11-05,18.25,18.62,18.06,18.37,13840000,4.59 -1997-11-04,17.75,18.12,17.50,17.94,6033200,4.49 -1997-11-03,17.56,17.75,17.06,17.37,4512000,4.34 -1997-10-31,17.37,17.37,16.62,17.03,9549200,4.26 -1997-10-30,17.06,17.56,16.50,16.50,6764400,4.12 -1997-10-29,18.44,18.50,17.25,17.50,6355200,4.38 -1997-10-28,16.00,18.50,15.88,18.12,12273200,4.53 -1997-10-27,16.75,18.12,16.75,16.75,11764400,4.19 -1997-10-24,18.12,18.37,16.50,16.56,13880000,4.14 -1997-10-23,18.00,18.19,17.75,17.75,6688000,4.44 -1997-10-22,19.06,19.25,18.50,18.56,5421200,4.64 -1997-10-21,18.87,19.31,18.69,19.06,16982000,4.76 -1997-10-20,20.12,20.19,18.62,18.69,14724400,4.67 -1997-10-17,21.12,21.12,19.87,20.12,15682000,5.03 -1997-10-16,21.12,22.06,20.87,21.50,26422000,5.38 -1997-10-15,22.12,24.75,22.12,23.81,28982000,5.95 -1997-10-14,22.69,22.75,22.19,22.69,5923200,5.67 -1997-10-13,22.75,22.87,22.19,22.69,5679200,5.67 -1997-10-10,21.50,22.75,21.50,22.69,9666800,5.67 -1997-10-09,21.25,22.50,21.19,21.75,6696400,5.44 -1997-10-08,21.75,21.81,21.31,21.50,3891200,5.38 -1997-10-07,21.87,22.00,21.81,21.81,3916400,5.45 -1997-10-06,22.19,22.25,21.69,21.94,3338800,5.49 -1997-10-03,22.00,22.25,21.69,22.12,5813200,5.53 -1997-10-02,21.44,22.00,21.37,21.94,4856400,5.49 -1997-10-01,21.69,21.75,21.37,21.53,4670800,5.38 -1997-09-30,22.00,22.31,21.69,21.69,5032000,5.42 -1997-09-29,21.69,22.25,21.56,22.06,5980000,5.51 -1997-09-26,21.50,21.94,21.12,21.31,7440000,5.33 -1997-09-25,21.31,21.75,21.00,21.12,7988000,5.28 -1997-09-24,21.69,21.75,21.37,21.50,7957600,5.38 -1997-09-23,22.25,22.25,21.69,21.75,7163200,5.44 -1997-09-22,22.12,23.06,22.00,22.81,7176400,5.70 -1997-09-19,22.19,22.19,21.75,21.94,3407600,5.49 -1997-09-18,21.50,22.50,21.50,22.31,6042400,5.58 -1997-09-17,22.00,22.00,21.69,21.81,3109200,5.45 -1997-09-16,22.06,22.14,21.75,21.94,4812400,5.49 -1997-09-15,21.87,22.12,21.50,21.50,3473200,5.38 -1997-09-12,22.19,22.25,21.44,22.06,4071200,5.51 -1997-09-11,22.87,23.00,22.06,22.37,7504400,5.59 -1997-09-10,21.75,23.12,21.69,22.94,9803600,5.74 -1997-09-09,21.31,21.87,21.25,21.81,5702000,5.45 -1997-09-08,22.25,22.25,21.44,21.50,6264400,5.38 -1997-09-05,22.62,22.87,22.00,22.19,4883600,5.55 -1997-09-04,22.56,22.87,22.25,22.50,4385600,5.62 -1997-09-03,22.37,23.25,22.31,22.50,10163200,5.62 -1997-09-02,22.00,22.56,21.94,22.37,6646800,5.59 -1997-08-29,21.81,22.00,21.50,21.75,3937600,5.44 -1997-08-28,22.12,22.50,22.00,22.00,3426400,5.50 -1997-08-27,22.37,22.75,21.87,22.69,6813200,5.67 -1997-08-26,22.62,23.00,22.12,22.25,8100800,5.56 -1997-08-25,23.62,23.69,22.94,23.06,4968800,5.76 -1997-08-22,23.44,24.00,23.37,23.62,8135200,5.91 -1997-08-21,24.50,24.69,23.87,24.00,9271200,6.00 -1997-08-20,24.44,25.12,24.19,24.62,11595200,6.16 -1997-08-19,23.69,24.50,23.31,24.44,10331200,6.11 -1997-08-18,23.31,23.75,22.75,23.62,7791200,5.91 -1997-08-15,23.12,23.44,22.81,23.25,9320000,5.81 -1997-08-14,23.62,24.25,22.69,23.00,15536400,5.75 -1997-08-13,22.25,23.87,20.44,23.62,42923600,5.91 -1997-08-12,24.06,24.25,21.87,22.06,37444400,5.51 -1997-08-11,26.31,26.44,23.50,24.56,55411200,6.14 -1997-08-08,27.81,28.37,26.12,26.81,64809200,6.70 -1997-08-07,28.75,29.56,28.37,29.19,134124400,7.30 -1997-08-06,25.25,27.75,25.00,26.31,149671200,6.58 -1997-08-05,19.94,20.00,19.48,19.75,8840800,4.94 -1997-08-04,19.19,19.81,19.19,19.75,21851200,4.94 -1997-08-01,17.62,19.19,17.56,19.19,17217600,4.80 -1997-07-31,17.37,17.75,17.25,17.50,9434400,4.38 -1997-07-30,16.94,17.69,16.75,17.37,13372400,4.34 -1997-07-29,16.44,16.62,16.37,16.50,2558000,4.12 -1997-07-28,16.44,16.50,16.25,16.44,3962000,4.11 -1997-07-25,15.88,16.56,15.75,16.25,7798000,4.06 -1997-07-24,16.12,16.12,15.63,15.81,4772000,3.95 -1997-07-23,16.75,16.87,16.00,16.12,5049200,4.03 -1997-07-22,16.37,16.69,16.31,16.56,8274400,4.14 -1997-07-21,17.56,17.69,16.00,16.16,12695600,4.04 -1997-07-18,17.87,17.94,17.06,17.34,11353600,4.34 -1997-07-17,17.00,18.12,16.44,17.50,26659200,4.38 -1997-07-16,15.81,16.50,15.63,16.44,15947600,4.11 -1997-07-15,15.75,16.00,15.63,15.94,14953200,3.98 -1997-07-14,15.25,15.63,14.88,15.63,14700800,3.91 -1997-07-11,13.38,15.50,13.31,15.19,26252400,3.80 -1997-07-10,12.88,13.38,12.75,13.25,17606400,3.31 -1997-07-09,13.81,13.88,13.63,13.69,5090000,3.42 -1997-07-08,13.88,14.00,13.69,13.75,3427600,3.44 -1997-07-07,13.94,14.25,13.75,13.81,6860000,3.45 -1997-07-03,13.13,13.88,13.00,13.69,6688000,3.42 -1997-07-02,13.25,13.38,13.00,13.06,8931200,3.27 -1997-07-01,13.94,14.00,13.13,13.19,16104400,3.30 -1997-06-30,14.75,14.75,14.00,14.25,6132400,3.56 -1997-06-27,14.69,14.81,14.63,14.69,5642000,3.67 -1997-06-26,15.13,15.13,14.63,14.69,13643600,3.67 -1997-06-25,15.31,15.38,15.00,15.13,7102000,3.78 -1997-06-24,15.44,15.56,15.25,15.31,3974800,3.83 -1997-06-23,15.50,15.63,15.38,15.38,3574800,3.85 -1997-06-20,15.69,15.75,15.50,15.56,3943600,3.89 -1997-06-19,16.00,16.00,15.69,15.75,4323600,3.94 -1997-06-18,16.12,16.25,15.75,15.94,3936400,3.98 -1997-06-17,15.56,16.50,15.50,16.34,5080800,4.09 -1997-06-16,15.88,15.88,15.38,15.50,4800800,3.88 -1997-06-13,16.06,16.12,15.75,15.81,4737600,3.95 -1997-06-12,16.37,16.37,16.00,16.06,2816400,4.01 -1997-06-11,16.31,16.44,16.25,16.31,3766800,4.08 -1997-06-10,16.75,16.75,16.06,16.25,4969200,4.06 -1997-06-09,16.69,16.94,16.62,16.62,2689200,4.16 -1997-06-06,16.62,16.75,16.50,16.75,1893200,4.19 -1997-06-05,16.62,17.12,16.56,16.69,2323200,4.17 -1997-06-04,16.62,16.75,16.50,16.62,2889200,4.16 -1997-06-03,16.75,16.94,16.62,16.69,2335600,4.17 -1997-06-02,17.00,17.00,16.75,16.94,1488000,4.24 -1997-05-30,16.50,17.00,16.37,16.62,6340800,4.16 -1997-05-29,17.12,17.12,16.62,16.62,3976800,4.16 -1997-05-28,17.37,17.50,17.00,17.00,3130000,4.25 -1997-05-27,16.75,17.37,16.75,17.25,2938000,4.31 -1997-05-23,16.62,17.00,16.62,16.87,2413200,4.22 -1997-05-22,16.75,16.87,16.50,16.62,2753600,4.16 -1997-05-21,17.12,17.12,16.50,16.87,4369200,4.22 -1997-05-20,17.00,17.44,16.75,17.25,3046400,4.31 -1997-05-19,17.50,17.62,17.00,17.00,1881200,4.25 -1997-05-16,17.50,17.62,17.25,17.25,3338800,4.31 -1997-05-15,17.75,18.00,17.50,17.75,3544800,4.44 -1997-05-14,17.87,18.00,17.50,17.69,4846800,4.42 -1997-05-13,17.50,17.87,17.00,17.56,7056800,4.39 -1997-05-12,17.25,17.62,17.00,17.56,5898800,4.39 -1997-05-09,17.00,17.50,17.00,17.06,6732000,4.26 -1997-05-08,16.62,17.12,16.50,17.00,2963200,4.25 -1997-05-07,16.87,17.00,16.37,16.50,4101200,4.12 -1997-05-06,17.00,17.12,16.75,16.87,2974800,4.22 -1997-05-05,17.00,17.12,16.75,17.00,3538800,4.25 -1997-05-02,17.00,17.12,16.75,17.00,3643600,4.25 -1997-05-01,16.87,17.12,16.75,17.00,2596800,4.25 -1997-04-30,17.00,17.25,16.75,17.00,9202000,4.25 -1997-04-29,18.00,18.00,17.50,17.69,1853200,4.42 -1997-04-28,17.75,17.87,17.50,17.62,1687600,4.41 -1997-04-25,17.62,17.87,17.37,17.50,3121200,4.38 -1997-04-24,18.50,18.50,17.75,17.87,2696800,4.47 -1997-04-23,18.37,18.50,18.12,18.12,1960800,4.53 -1997-04-22,18.12,18.50,17.87,18.50,3392000,4.62 -1997-04-21,18.62,18.62,18.00,18.00,3197600,4.50 -1997-04-18,19.12,19.12,18.37,18.37,5058000,4.59 -1997-04-17,18.25,19.12,18.12,19.00,7859200,4.75 -1997-04-16,18.62,19.00,18.37,18.56,3101200,4.64 -1997-04-15,19.12,19.25,18.12,18.44,4869200,4.61 -1997-04-14,18.37,18.87,18.00,18.75,4020000,4.69 -1997-04-11,18.87,18.87,18.12,18.25,2842400,4.56 -1997-04-10,19.00,19.12,18.50,18.87,4188000,4.72 -1997-04-09,19.25,19.25,18.87,19.00,8766400,4.75 -1997-04-08,19.62,19.62,18.62,19.12,6923600,4.78 -1997-04-07,19.75,19.87,19.25,19.50,9136800,4.88 -1997-04-04,19.12,19.62,19.00,19.25,16980800,4.81 -1997-04-03,18.50,19.12,18.25,18.87,19603200,4.72 -1997-04-02,17.87,18.06,17.62,18.00,7957600,4.50 -1997-04-01,17.62,17.81,17.37,17.50,7881200,4.38 -1997-03-31,18.62,19.37,17.25,18.25,34658000,4.56 -1997-03-27,17.50,19.25,17.25,18.62,40695200,4.66 -1997-03-26,16.37,16.87,16.25,16.75,3824400,4.19 -1997-03-25,16.62,16.62,16.08,16.50,4031200,4.12 -1997-03-24,16.50,16.62,16.25,16.50,2556800,4.12 -1997-03-21,17.50,17.50,16.37,16.62,4892400,4.16 -1997-03-20,16.00,17.50,15.88,17.25,11324400,4.31 -1997-03-19,16.37,16.37,15.88,16.12,7457600,4.03 -1997-03-18,16.37,16.50,16.12,16.25,4548800,4.06 -1997-03-17,16.25,16.50,16.00,16.50,6886400,4.12 -1997-03-14,16.37,16.75,16.25,16.56,8245600,4.14 -1997-03-13,16.37,16.37,16.12,16.37,3772000,4.09 -1997-03-12,16.25,16.75,16.12,16.25,2544400,4.06 -1997-03-11,16.62,16.62,16.00,16.37,3539200,4.09 -1997-03-10,16.62,16.75,16.44,16.62,3554800,4.16 -1997-03-07,16.75,16.75,16.37,16.50,2523200,4.12 -1997-03-06,17.00,17.00,16.50,16.62,4172000,4.16 -1997-03-05,16.62,17.00,16.50,17.00,3453600,4.25 -1997-03-04,16.25,16.50,16.00,16.50,3688800,4.12 -1997-03-03,16.50,16.50,16.00,16.12,4670000,4.03 -1997-02-28,16.87,16.87,16.25,16.25,4371200,4.06 -1997-02-27,17.00,17.12,16.75,17.00,3700000,4.25 -1997-02-26,17.00,17.12,16.75,17.12,3687600,4.28 -1997-02-25,17.00,17.37,16.87,16.87,4938000,4.22 -1997-02-24,16.25,16.87,16.25,16.62,4222000,4.16 -1997-02-21,16.87,17.00,16.00,16.37,7549200,4.09 -1997-02-20,17.62,17.62,17.00,17.00,4474800,4.25 -1997-02-19,17.87,17.87,17.12,17.62,8627600,4.41 -1997-02-18,16.62,17.87,16.25,17.87,13171200,4.47 -1997-02-14,16.25,16.37,16.00,16.31,8492000,4.08 -1997-02-13,15.75,16.12,15.50,16.12,7013200,4.03 -1997-02-12,15.75,15.88,15.50,15.75,6303600,3.94 -1997-02-11,15.88,16.00,15.50,15.69,5004400,3.92 -1997-02-10,16.12,16.12,15.63,15.63,6633600,3.91 -1997-02-07,16.50,16.50,15.75,15.81,8403600,3.95 -1997-02-06,15.25,16.12,15.25,16.00,14283600,4.00 -1997-02-05,15.25,15.63,15.25,15.25,14093600,3.81 -1997-02-04,16.25,16.37,15.13,15.38,25458000,3.85 -1997-02-03,16.87,17.00,16.25,16.31,13162000,4.08 -1997-01-31,16.62,16.62,16.50,16.62,7135200,4.16 -1997-01-30,16.75,16.75,16.50,16.75,5018800,4.19 -1997-01-29,16.62,16.75,16.50,16.62,5428000,4.16 -1997-01-28,17.00,17.00,16.50,16.62,7520000,4.16 -1997-01-27,17.12,17.25,16.62,16.62,7646800,4.16 -1997-01-24,17.25,17.25,16.87,16.87,6726800,4.22 -1997-01-23,17.25,17.37,17.12,17.25,6175200,4.31 -1997-01-22,17.37,17.50,17.00,17.19,7356800,4.30 -1997-01-21,17.00,17.25,16.87,17.25,10179200,4.31 -1997-01-20,16.87,17.12,16.75,16.94,10423600,4.24 -1997-01-17,16.75,17.12,16.62,16.75,11619200,4.19 -1997-01-16,17.12,17.12,16.62,16.75,23983600,4.19 -1997-01-15,18.00,18.00,17.12,17.25,15483200,4.31 -1997-01-14,18.37,18.37,17.75,17.87,9143200,4.47 -1997-01-13,18.50,18.50,18.12,18.12,10942000,4.53 -1997-01-10,17.62,18.25,17.62,18.25,12651200,4.56 -1997-01-09,17.75,17.87,17.50,17.75,15970000,4.44 -1997-01-08,18.25,18.37,17.37,17.62,39296400,4.41 -1997-01-07,18.12,18.25,17.50,17.50,34896400,4.38 -1997-01-06,17.62,18.34,17.25,17.87,67246400,4.47 -1997-01-03,21.12,22.25,21.00,21.75,4295600,5.44 -1997-01-02,21.12,21.25,20.75,21.00,5128800,5.25 -1996-12-31,21.37,21.50,20.75,20.87,13719200,5.22 -1996-12-30,23.12,23.25,21.75,21.75,9366800,5.44 -1996-12-27,22.87,23.75,22.87,23.12,4900000,5.78 -1996-12-26,23.25,23.25,22.87,23.00,3049200,5.75 -1996-12-24,23.25,23.37,22.87,23.12,2067600,5.78 -1996-12-23,24.00,24.25,23.25,23.25,11883600,5.81 -1996-12-20,22.50,23.62,21.37,23.50,19535600,5.88 -1996-12-19,23.00,23.25,22.25,22.25,4893600,5.56 -1996-12-18,22.75,23.12,22.62,23.12,7326400,5.78 -1996-12-17,22.37,22.50,22.25,22.50,5625200,5.62 -1996-12-16,23.50,23.50,22.50,22.62,5335600,5.66 -1996-12-13,23.75,23.87,23.25,23.25,3194400,5.81 -1996-12-12,24.12,24.25,23.87,23.87,3122400,5.97 -1996-12-11,23.75,24.25,23.75,24.00,5853600,6.00 -1996-12-10,24.87,25.00,24.25,24.50,6593600,6.12 -1996-12-09,25.25,25.37,24.81,25.00,5680800,6.25 -1996-12-06,24.37,25.37,24.00,25.12,8210800,6.28 -1996-12-05,25.00,25.25,25.00,25.00,5096800,6.25 -1996-12-04,25.12,25.37,24.87,25.00,6823600,6.25 -1996-12-03,25.25,25.50,25.00,25.12,9840800,6.28 -1996-12-02,24.12,25.12,23.87,25.12,6254400,6.28 -1996-11-29,24.50,24.62,24.00,24.12,1527600,6.03 -1996-11-27,24.12,24.62,24.12,24.50,3191200,6.12 -1996-11-26,24.87,25.00,24.00,24.25,4054800,6.06 -1996-11-25,25.37,25.50,25.00,25.00,2830800,6.25 -1996-11-22,24.50,25.25,24.50,25.25,3732400,6.31 -1996-11-21,24.87,25.00,24.37,24.50,2522400,6.12 -1996-11-20,24.87,25.37,24.87,25.00,3683200,6.25 -1996-11-19,24.87,25.12,24.62,24.87,4446400,6.22 -1996-11-18,25.00,25.12,24.50,24.75,5468800,6.19 -1996-11-15,25.87,26.00,25.00,25.00,4684400,6.25 -1996-11-14,25.50,25.75,25.37,25.62,1740800,6.41 -1996-11-13,25.37,25.87,25.00,25.56,3000800,6.39 -1996-11-12,26.12,26.25,25.12,25.25,5120000,6.31 -1996-11-11,26.37,26.37,25.87,26.00,3318800,6.50 -1996-11-08,25.87,26.25,25.75,26.25,6750800,6.56 -1996-11-07,25.37,26.00,25.25,25.87,5548800,6.47 -1996-11-06,25.62,25.75,24.87,25.50,6462000,6.38 -1996-11-05,24.50,25.87,24.50,25.50,13517600,6.38 -1996-11-04,24.37,24.50,23.75,24.37,3270800,6.09 -1996-11-01,23.37,24.25,23.12,24.25,7563200,6.06 -1996-10-31,23.25,23.37,22.25,23.00,6945600,5.75 -1996-10-30,23.50,24.00,22.87,22.87,9192000,5.72 -1996-10-29,24.62,24.75,23.12,23.25,7135200,5.81 -1996-10-28,25.12,25.12,24.50,24.50,4288800,6.12 -1996-10-25,24.87,25.00,24.50,24.50,2775600,6.12 -1996-10-24,25.00,25.00,24.50,24.75,3020800,6.19 -1996-10-23,24.75,25.25,24.37,24.75,5736800,6.19 -1996-10-22,25.62,25.62,24.25,24.87,7651200,6.22 -1996-10-21,26.50,26.62,25.50,25.62,6712000,6.41 -1996-10-18,26.50,26.62,26.00,26.56,13681200,6.64 -1996-10-17,27.50,27.75,26.37,26.37,36679200,6.59 -1996-10-16,25.25,26.12,24.62,25.75,11975200,6.44 -1996-10-15,25.75,25.87,25.00,25.25,12970000,6.31 -1996-10-14,24.50,25.37,24.25,25.25,9649200,6.31 -1996-10-11,24.37,24.62,24.00,24.25,4327600,6.06 -1996-10-10,23.87,24.50,23.75,24.19,9883200,6.05 -1996-10-09,23.37,23.62,22.87,23.00,3044800,5.75 -1996-10-08,23.50,24.25,23.25,23.25,6802000,5.81 -1996-10-07,23.00,23.37,22.87,23.12,3428800,5.78 -1996-10-04,22.87,23.12,22.12,22.81,4770000,5.70 -1996-10-03,23.62,23.75,22.37,22.37,8140000,5.59 -1996-10-02,23.62,24.62,23.12,23.62,9890000,5.91 -1996-10-01,22.00,24.75,22.00,24.62,19269200,6.16 -1996-09-30,22.12,22.37,22.12,22.19,3058000,5.55 -1996-09-27,22.25,22.37,22.12,22.31,2932000,5.58 -1996-09-26,22.37,22.50,22.25,22.37,3693600,5.59 -1996-09-25,22.50,22.62,22.00,22.37,3902400,5.59 -1996-09-24,22.37,22.87,22.37,22.50,5143600,5.62 -1996-09-23,22.87,22.87,22.37,22.37,1653600,5.59 -1996-09-20,23.37,23.50,22.75,22.87,5330800,5.72 -1996-09-19,23.62,23.62,23.37,23.37,4282000,5.84 -1996-09-18,23.00,24.12,22.87,23.50,12631200,5.88 -1996-09-17,22.87,23.12,22.50,23.00,7487600,5.75 -1996-09-16,21.50,23.00,21.37,22.37,8747600,5.59 -1996-09-13,20.37,21.25,20.37,21.00,5967600,5.25 -1996-09-12,21.00,21.12,20.25,20.37,9340000,5.09 -1996-09-11,21.50,21.75,21.00,21.12,5266800,5.28 -1996-09-10,22.12,22.12,21.50,21.50,5562000,5.38 -1996-09-09,22.62,22.75,21.87,22.00,5302400,5.50 -1996-09-06,23.12,23.25,22.62,23.00,8602000,5.75 -1996-09-05,23.50,23.75,22.87,22.87,9999200,5.72 -1996-09-04,23.87,24.62,23.87,24.12,3636400,6.03 -1996-09-03,24.12,24.37,23.87,24.12,2461200,6.03 -1996-08-30,24.75,24.75,24.25,24.25,3784800,6.06 -1996-08-29,24.87,24.87,24.37,24.50,3829200,6.12 -1996-08-28,24.87,25.00,24.50,24.87,5844400,6.22 -1996-08-27,24.12,25.00,24.00,24.86,10339200,6.22 -1996-08-26,23.87,24.12,23.50,24.12,3204400,6.03 -1996-08-23,23.00,24.00,23.00,23.87,7281200,5.97 -1996-08-22,23.00,23.25,22.87,23.25,3138000,5.81 -1996-08-21,23.50,23.62,22.87,23.00,4052400,5.75 -1996-08-20,23.87,23.87,23.37,23.50,7564400,5.88 -1996-08-19,22.37,23.62,22.37,23.62,8084400,5.91 -1996-08-16,22.62,22.62,22.12,22.50,5075600,5.62 -1996-08-15,22.62,22.75,22.25,22.25,3845600,5.56 -1996-08-14,22.62,23.00,22.62,22.75,2570000,5.69 -1996-08-13,22.87,23.12,22.37,22.50,3706400,5.62 -1996-08-12,23.37,23.62,22.37,23.00,5408000,5.75 -1996-08-09,22.25,23.37,22.12,23.12,8243600,5.78 -1996-08-08,22.37,22.37,21.87,22.12,3640000,5.53 -1996-08-07,21.75,22.62,21.62,22.37,8892400,5.59 -1996-08-06,21.00,21.50,20.75,21.50,3354800,5.38 -1996-08-05,21.62,21.87,20.87,21.00,3612000,5.25 -1996-08-02,21.62,22.00,21.25,21.62,4574800,5.41 -1996-08-01,22.00,22.00,21.12,21.25,3942400,5.31 -1996-07-31,21.25,22.00,21.25,22.00,3332400,5.50 -1996-07-30,22.62,22.75,21.25,21.37,6766800,5.34 -1996-07-29,22.00,22.50,21.75,22.25,7005600,5.56 -1996-07-26,21.50,22.00,21.12,22.00,4426800,5.50 -1996-07-25,21.12,21.37,20.75,21.00,4090800,5.25 -1996-07-24,20.00,21.00,19.87,20.81,9448800,5.20 -1996-07-23,20.50,20.62,20.25,20.50,4651200,5.12 -1996-07-22,20.87,20.87,20.00,20.25,5456400,5.06 -1996-07-19,20.87,21.00,20.75,20.75,9510000,5.19 -1996-07-18,21.50,21.75,20.36,20.87,32058800,5.22 -1996-07-17,17.37,17.50,16.62,16.87,8355600,4.22 -1996-07-16,17.37,17.37,16.00,16.87,10334400,4.22 -1996-07-15,18.12,18.12,17.12,17.19,4779200,4.30 -1996-07-12,18.37,18.37,17.25,18.06,9610800,4.51 -1996-07-11,18.75,18.87,17.37,17.87,10420000,4.47 -1996-07-10,19.12,19.50,18.75,18.75,6055200,4.69 -1996-07-09,19.50,19.62,19.00,19.00,6723600,4.75 -1996-07-08,19.62,19.87,19.00,19.12,6762000,4.78 -1996-07-05,19.37,19.75,19.25,19.50,3808800,4.88 -1996-07-03,20.37,20.37,19.37,19.37,10323200,4.84 -1996-07-02,21.37,21.50,21.00,21.00,3189200,5.25 -1996-07-01,21.12,21.50,21.00,21.50,4732400,5.38 -1996-06-28,20.87,21.00,20.62,21.00,4138000,5.25 -1996-06-27,20.00,21.00,19.75,20.62,8202400,5.16 -1996-06-26,20.62,20.75,19.62,19.87,14440800,4.97 -1996-06-25,22.12,22.25,20.37,20.62,8831200,5.16 -1996-06-24,22.62,22.62,22.12,22.25,4398000,5.56 -1996-06-21,22.87,22.87,22.37,22.62,5792000,5.66 -1996-06-20,23.37,23.37,22.50,22.75,5260800,5.69 -1996-06-19,23.12,23.37,22.62,23.12,4803600,5.78 -1996-06-18,23.62,23.75,22.62,22.75,7979200,5.69 -1996-06-17,24.12,24.12,23.62,23.62,4052000,5.91 -1996-06-14,24.75,24.75,23.87,23.94,5186800,5.99 -1996-06-13,24.37,24.92,24.00,24.62,6856800,6.16 -1996-06-12,24.50,24.50,24.00,24.25,5440000,6.06 -1996-06-11,24.25,24.25,24.00,24.00,5481200,6.00 -1996-06-10,24.37,24.50,24.00,24.12,3820800,6.03 -1996-06-07,24.00,24.37,23.50,24.37,9565200,6.09 -1996-06-06,25.00,25.25,24.12,24.25,12938800,6.06 -1996-06-05,25.37,25.50,24.25,25.12,18228000,6.28 -1996-06-04,24.00,24.37,23.87,24.19,27235600,6.05 -1996-06-03,25.87,26.00,24.75,24.75,4481200,6.19 -1996-05-31,25.62,26.62,25.50,26.12,5813600,6.53 -1996-05-30,24.87,25.75,24.75,25.50,3703600,6.38 -1996-05-29,26.25,26.25,24.75,24.87,7840000,6.22 -1996-05-28,26.75,27.25,26.37,26.37,3658800,6.59 -1996-05-24,26.25,26.87,26.12,26.75,4046800,6.69 -1996-05-23,26.12,26.62,25.75,26.25,4447600,6.56 -1996-05-22,27.37,27.37,25.75,26.06,7215600,6.51 -1996-05-21,28.00,28.12,27.12,27.12,4088000,6.78 -1996-05-20,27.87,28.12,27.62,27.94,3028800,6.99 -1996-05-17,28.37,28.37,27.50,27.62,4405600,6.91 -1996-05-16,28.25,28.62,27.87,28.37,4648800,7.09 -1996-05-15,27.87,28.87,27.75,28.50,10442400,7.12 -1996-05-14,27.75,28.00,27.50,27.50,7068000,6.88 -1996-05-13,27.12,27.62,26.62,27.06,6701200,6.76 -1996-05-10,26.25,27.37,26.00,27.25,3966400,6.81 -1996-05-09,26.37,26.50,25.75,26.12,3515600,6.53 -1996-05-08,27.25,27.25,25.62,26.75,6688800,6.69 -1996-05-07,26.37,27.37,26.25,26.87,12641200,6.72 -1996-05-06,24.87,25.87,24.75,25.62,10349200,6.41 -1996-05-03,24.12,24.12,23.50,23.87,3892400,5.97 -1996-05-02,24.50,24.50,23.50,23.75,6728000,5.94 -1996-05-01,24.37,24.75,24.12,24.37,4039200,6.09 -1996-04-30,24.87,24.87,24.12,24.37,4881200,6.09 -1996-04-29,25.00,25.00,24.50,24.75,4324800,6.19 -1996-04-26,25.00,25.12,24.62,24.75,6759200,6.19 -1996-04-25,24.37,24.87,24.12,24.87,6245200,6.22 -1996-04-24,24.62,24.75,24.19,24.25,4596800,6.06 -1996-04-23,25.12,25.25,24.62,24.75,6086400,6.19 -1996-04-22,25.25,25.50,24.87,25.12,3973200,6.28 -1996-04-19,24.62,25.12,24.62,25.06,3655600,6.26 -1996-04-18,25.37,25.39,24.25,24.75,7780800,6.19 -1996-04-17,25.87,26.00,25.12,25.25,3056400,6.31 -1996-04-16,25.87,26.00,25.62,25.87,3634400,6.47 -1996-04-15,25.50,25.75,25.00,25.75,5515600,6.44 -1996-04-12,25.87,25.87,25.37,25.50,2924400,6.38 -1996-04-11,26.12,26.25,25.50,25.75,3526400,6.44 -1996-04-10,26.12,26.50,25.87,26.00,6242400,6.50 -1996-04-09,24.87,26.50,24.37,26.00,8415600,6.50 -1996-04-08,23.87,24.50,23.75,24.37,6046400,6.09 -1996-04-04,24.62,24.62,24.00,24.12,3092000,6.03 -1996-04-03,25.12,25.12,24.33,24.56,2591200,6.14 -1996-04-02,25.62,25.62,24.87,25.00,3635600,6.25 -1996-04-01,25.12,25.87,24.52,25.50,5680000,6.38 -1996-03-29,24.25,24.75,23.75,24.56,5962400,6.14 -1996-03-28,24.75,25.62,24.12,24.19,10572000,6.05 -1996-03-27,23.25,25.25,23.00,25.25,15338800,6.31 -1996-03-26,24.00,24.50,23.62,23.87,5755600,5.97 -1996-03-25,25.50,25.75,24.00,24.00,5887600,6.00 -1996-03-22,25.25,25.37,24.87,25.37,3842400,6.34 -1996-03-21,25.50,25.50,25.00,25.12,3932400,6.28 -1996-03-20,25.75,25.75,25.12,25.25,4154800,6.31 -1996-03-19,26.37,26.50,25.62,25.75,4442400,6.44 -1996-03-18,25.94,26.12,25.75,26.12,3907600,6.53 -1996-03-15,26.00,26.00,25.50,25.87,3632400,6.47 -1996-03-14,25.87,25.87,25.50,25.62,3342400,6.41 -1996-03-13,25.87,26.12,25.62,25.75,3560000,6.44 -1996-03-12,26.00,26.37,25.62,25.81,3453200,6.45 -1996-03-11,26.25,26.37,25.75,25.87,4544800,6.47 -1996-03-08,25.75,26.25,25.00,26.00,5322400,6.50 -1996-03-07,26.25,26.37,25.37,25.81,9292400,6.45 -1996-03-06,26.75,26.87,26.12,26.19,3547600,6.55 -1996-03-05,26.50,26.75,26.25,26.62,4246800,6.66 -1996-03-04,27.25,27.37,26.25,26.25,6708800,6.56 -1996-03-01,27.62,27.62,26.62,26.87,8263200,6.72 -1996-02-29,27.50,27.75,27.25,27.50,4049200,6.88 -1996-02-28,28.87,28.87,27.62,27.75,6728800,6.94 -1996-02-27,29.87,29.87,28.50,28.62,5331200,7.16 -1996-02-26,30.00,30.12,29.50,29.50,4238000,7.38 -1996-02-23,29.87,30.25,29.62,29.87,6205200,7.47 -1996-02-22,30.00,30.12,29.62,29.87,6588000,7.47 -1996-02-21,29.37,29.75,29.12,29.62,7924400,7.41 -1996-02-20,28.00,29.50,28.00,29.00,13473200,7.25 -1996-02-16,28.12,28.37,27.50,27.50,5602400,6.88 -1996-02-15,27.62,28.12,27.37,28.00,4360000,7.00 -1996-02-14,28.25,28.25,27.44,27.62,5843600,6.91 -1996-02-13,28.00,28.87,27.87,28.12,8161200,7.03 -1996-02-12,28.12,28.50,28.00,28.37,6948800,7.09 -1996-02-09,27.87,28.50,27.62,27.75,7360800,6.94 -1996-02-08,27.50,28.12,27.50,27.87,9420800,6.97 -1996-02-07,29.75,29.75,27.75,28.25,12885200,7.06 -1996-02-06,29.25,30.00,29.25,29.62,8101200,7.41 -1996-02-05,29.69,29.75,29.00,29.25,11396400,7.31 -1996-02-02,28.87,29.62,28.75,29.25,19865600,7.31 -1996-02-01,27.50,28.37,27.50,28.37,11902400,7.09 -1996-01-31,27.75,28.00,27.37,27.62,11736800,6.91 -1996-01-30,27.00,28.12,26.86,27.31,22246800,6.83 -1996-01-29,29.00,29.75,28.75,29.12,11900000,7.28 -1996-01-26,30.37,31.25,28.62,30.62,26297600,7.66 -1996-01-25,31.75,32.00,30.12,30.25,15911200,7.56 -1996-01-24,32.13,32.25,31.75,32.25,23438800,8.06 -1996-01-23,33.75,34.00,31.00,31.62,35305200,7.91 -1996-01-22,29.75,31.00,29.25,30.50,17852400,7.62 -1996-01-19,31.00,31.75,29.37,29.87,29623600,7.47 -1996-01-18,32.88,33.38,30.37,31.94,24955200,7.99 -1996-01-17,34.38,34.38,33.75,34.00,8445200,8.50 -1996-01-16,34.38,34.75,33.63,34.56,12606400,8.64 -1996-01-15,33.75,34.50,33.38,34.13,12971200,8.53 -1996-01-12,34.75,34.75,33.25,33.88,14370000,8.47 -1996-01-11,32.63,35.00,32.38,35.00,27041200,8.75 -1996-01-10,32.50,34.75,32.25,34.25,13057600,8.56 -1996-01-09,34.63,34.63,32.75,32.75,8978800,8.19 -1996-01-08,34.50,35.50,34.00,34.63,4341200,8.66 -1996-01-05,31.62,34.25,31.37,34.25,15929200,8.56 -1996-01-04,32.38,32.38,31.37,31.56,10721200,7.89 -1996-01-03,32.00,32.88,31.87,32.13,15368800,8.03 -1996-01-02,32.25,32.25,31.75,32.13,4983200,8.03 -1995-12-29,32.00,32.38,31.62,31.87,10874400,7.97 -1995-12-28,32.13,32.75,31.87,32.00,8933200,8.00 -1995-12-27,32.13,33.38,31.87,32.38,9609200,8.10 -1995-12-26,32.50,32.50,31.75,32.06,4994800,8.02 -1995-12-22,32.63,32.88,32.13,32.25,8392400,8.06 -1995-12-21,32.75,32.75,31.62,32.50,11893200,8.12 -1995-12-20,33.50,33.63,32.50,32.63,13074400,8.16 -1995-12-19,32.75,33.25,32.25,32.75,15403600,8.19 -1995-12-18,35.13,35.25,31.87,32.25,23807600,8.06 -1995-12-15,35.50,36.63,34.38,35.25,25960000,8.81 -1995-12-14,38.88,39.38,38.00,38.25,11928000,9.56 -1995-12-13,38.25,39.00,36.75,38.38,24472400,9.60 -1995-12-12,38.63,38.63,38.00,38.00,6353200,9.50 -1995-12-11,39.50,39.63,38.38,38.63,4003200,9.66 -1995-12-08,38.75,39.38,37.88,39.38,5053200,9.85 -1995-12-07,38.75,38.75,37.88,38.56,5084800,9.64 -1995-12-06,39.75,39.88,38.38,38.75,7195200,9.69 -1995-12-05,38.50,39.88,38.25,39.50,13000000,9.88 -1995-12-04,40.13,40.13,39.00,39.50,17171200,9.88 -1995-12-01,38.00,38.25,37.13,37.63,7300800,9.41 -1995-11-30,38.88,39.00,38.00,38.13,6247600,9.53 -1995-11-29,40.13,40.13,39.00,39.25,3782000,9.81 -1995-11-28,39.38,40.13,39.25,40.00,6305200,10.00 -1995-11-27,40.63,40.63,39.38,39.38,4148800,9.85 -1995-11-24,38.88,40.38,38.75,40.19,3930800,10.05 -1995-11-22,38.63,39.25,38.50,38.63,3533600,9.66 -1995-11-21,38.75,38.75,37.88,38.63,6845200,9.66 -1995-11-20,40.25,40.25,38.50,38.63,5314400,9.63 -1995-11-17,40.00,40.38,39.75,40.13,4607600,10.00 -1995-11-16,40.88,41.50,39.50,39.94,8102000,9.95 -1995-11-15,42.00,42.00,40.13,41.00,8874400,10.22 -1995-11-14,41.00,42.50,41.00,41.50,14560000,10.34 -1995-11-13,40.25,41.25,40.00,40.88,11343200,10.19 -1995-11-10,39.38,40.25,38.88,39.75,7973200,9.91 -1995-11-09,39.75,40.00,38.88,39.38,9295200,9.81 -1995-11-08,39.75,41.00,38.75,38.88,12823600,9.69 -1995-11-07,37.75,40.50,37.50,39.63,26310800,9.88 -1995-11-06,36.50,38.75,36.38,38.13,11143200,9.50 -1995-11-03,36.75,36.88,35.88,36.50,6413200,9.10 -1995-11-02,36.88,36.88,36.25,36.63,5464400,9.13 -1995-11-01,36.63,37.13,35.50,36.63,6913200,9.13 -1995-10-31,35.25,36.63,35.13,36.31,10334400,9.05 -1995-10-30,34.88,35.25,34.63,35.25,6291200,8.79 -1995-10-27,34.88,34.88,34.13,34.75,5523200,8.66 -1995-10-26,34.88,35.00,34.50,34.88,4503600,8.69 -1995-10-25,35.25,35.38,34.75,34.75,4761200,8.66 -1995-10-24,35.50,35.50,34.88,35.13,7638800,8.76 -1995-10-23,35.13,35.13,34.75,35.13,7078000,8.76 -1995-10-20,35.25,35.25,34.63,35.13,13818800,8.76 -1995-10-19,35.88,36.13,34.75,34.75,33761200,8.66 -1995-10-18,37.00,39.56,36.75,37.38,18311200,9.32 -1995-10-17,36.50,36.88,35.88,36.63,6390000,9.13 -1995-10-16,36.25,37.00,35.88,36.13,6515200,9.00 -1995-10-13,35.75,36.88,35.50,36.00,8422000,8.97 -1995-10-12,35.00,35.38,34.75,35.31,5803200,8.80 -1995-10-11,35.25,35.63,34.13,34.88,11893200,8.69 -1995-10-10,34.38,35.00,33.63,34.69,14303600,8.65 -1995-10-09,35.38,35.75,34.38,34.81,13320800,8.68 -1995-10-06,36.75,37.00,35.63,35.69,11058000,8.89 -1995-10-05,36.25,36.63,35.88,36.50,8737600,9.10 -1995-10-04,36.63,37.00,36.00,36.38,9532000,9.07 -1995-10-03,38.13,38.50,37.13,37.63,10368000,9.38 -1995-10-02,37.75,38.50,37.50,37.63,14000000,9.38 -1995-09-29,38.00,38.25,36.88,37.25,10123200,9.28 -1995-09-28,36.50,37.88,36.50,37.75,11843600,9.41 -1995-09-27,37.50,37.50,34.75,36.25,16135600,9.03 -1995-09-26,37.75,37.88,37.13,37.38,8961200,9.32 -1995-09-25,38.25,38.27,37.38,37.52,11267600,9.35 -1995-09-22,36.88,37.25,36.38,37.06,14258000,9.24 -1995-09-21,36.50,37.50,36.38,37.00,12407600,9.22 -1995-09-20,37.25,37.38,36.50,36.63,11500800,9.13 -1995-09-19,36.75,37.13,36.13,36.75,17512400,9.16 -1995-09-18,36.38,36.81,35.88,36.69,22216400,9.14 -1995-09-15,37.38,39.88,35.50,35.88,43286800,8.94 -1995-09-14,41.38,41.63,39.75,40.00,19675600,9.97 -1995-09-13,42.88,43.38,42.00,42.38,11530800,10.56 -1995-09-12,44.50,44.88,42.63,42.94,11658800,10.70 -1995-09-11,44.88,45.50,44.25,44.25,6160800,11.03 -1995-09-08,44.75,44.88,44.50,44.75,6243200,11.15 -1995-09-07,44.00,45.31,43.75,44.75,9373600,11.15 -1995-09-06,43.88,44.17,43.50,43.75,7175600,10.90 -1995-09-05,43.50,43.50,42.75,43.50,6443200,10.84 -1995-09-01,43.00,43.50,42.88,42.94,3532400,10.70 -1995-08-31,43.38,43.50,43.00,43.00,3148000,10.72 -1995-08-30,43.25,43.75,43.13,43.38,5482000,10.81 -1995-08-29,43.00,43.25,42.50,43.13,11325600,10.75 -1995-08-28,44.88,45.00,43.00,43.00,8680000,10.72 -1995-08-25,45.88,45.88,44.63,44.75,4819200,11.15 -1995-08-24,45.63,46.25,45.50,45.75,10285200,11.40 -1995-08-23,44.88,45.88,44.63,45.50,9078000,11.34 -1995-08-22,44.38,45.13,44.13,44.75,7769200,11.15 -1995-08-21,44.88,45.38,44.13,44.13,9721200,11.00 -1995-08-18,44.88,45.13,43.75,44.88,8620000,11.19 -1995-08-17,44.63,45.50,44.13,44.63,8827600,11.12 -1995-08-16,44.00,44.50,43.63,44.50,10457600,11.09 -1995-08-15,43.88,44.13,43.13,44.06,11370800,10.95 -1995-08-14,43.00,43.75,42.88,43.38,5989200,10.78 -1995-08-11,42.88,43.13,41.88,43.06,7407600,10.70 -1995-08-10,43.13,43.25,42.63,42.75,5868000,10.63 -1995-08-09,42.63,43.75,42.50,43.13,13190000,10.72 -1995-08-08,43.63,43.75,42.38,42.50,8388800,10.56 -1995-08-07,44.13,44.63,43.13,43.38,6920000,10.78 -1995-08-04,45.00,45.13,43.75,44.25,6884400,11.00 -1995-08-03,44.13,45.63,43.88,45.00,7640800,11.18 -1995-08-02,43.88,45.00,43.75,44.38,9840800,11.03 -1995-08-01,44.88,44.88,43.50,43.50,7540000,10.81 -1995-07-31,45.50,45.63,44.75,45.00,5673600,11.18 -1995-07-28,46.75,47.25,45.00,45.50,9341200,11.31 -1995-07-27,45.50,47.50,45.50,46.81,11621200,11.63 -1995-07-26,46.25,46.25,45.38,45.38,6125200,11.28 -1995-07-25,46.00,46.38,45.63,45.75,9418000,11.37 -1995-07-24,44.00,45.50,43.75,45.38,7679200,11.28 -1995-07-21,43.00,44.88,43.00,43.75,27082400,10.87 -1995-07-20,46.00,47.38,45.00,47.06,11848800,11.70 -1995-07-19,47.00,48.00,45.00,45.50,18613200,11.31 -1995-07-18,49.00,49.56,47.75,48.13,9102000,11.96 -1995-07-17,48.88,49.75,48.63,49.00,8098000,12.18 -1995-07-14,47.38,49.00,47.00,48.75,9929200,12.12 -1995-07-13,47.38,48.75,47.13,47.63,12596400,11.84 -1995-07-12,47.25,48.00,46.13,47.00,10145200,11.68 -1995-07-11,47.75,48.63,47.06,47.13,7683200,11.71 -1995-07-10,48.63,49.88,48.13,48.63,10640800,12.09 -1995-07-07,46.88,49.25,46.75,48.63,13840000,12.09 -1995-07-06,46.50,47.00,45.75,47.00,6583200,11.68 -1995-07-05,46.88,47.88,46.50,46.50,6325600,11.56 -1995-07-03,46.50,47.13,46.25,46.94,1410800,11.67 -1995-06-30,47.25,47.88,46.13,46.44,5927600,11.54 -1995-06-29,46.38,48.13,46.00,47.25,8320000,11.74 -1995-06-28,46.00,47.50,45.38,46.63,9531200,11.59 -1995-06-27,47.38,48.25,46.38,46.38,7772400,11.53 -1995-06-26,48.25,48.50,47.63,48.13,5465600,11.96 -1995-06-23,48.75,49.00,47.75,48.75,8286800,12.12 -1995-06-22,49.00,49.63,48.63,49.13,16928800,12.21 -1995-06-21,47.63,50.13,46.75,49.38,22378800,12.27 -1995-06-20,46.00,47.75,46.00,47.38,26385200,11.78 -1995-06-19,43.88,45.25,43.50,44.38,16774400,11.03 -1995-06-16,43.88,44.00,43.50,43.88,3200800,10.91 -1995-06-15,43.63,43.75,43.38,43.63,3331200,10.84 -1995-06-14,43.88,43.88,43.38,43.63,4224800,10.84 -1995-06-13,44.50,44.63,43.88,44.00,4508000,10.94 -1995-06-12,44.00,44.50,43.88,44.17,7584400,10.98 -1995-06-09,43.63,43.75,43.13,43.50,6679200,10.81 -1995-06-08,43.38,43.38,42.13,42.94,4874400,10.67 -1995-06-07,44.13,44.13,43.13,43.13,4451200,10.72 -1995-06-06,43.63,44.38,43.50,44.00,11270800,10.94 -1995-06-05,42.38,43.50,42.13,43.50,9103200,10.81 -1995-06-02,41.88,42.38,41.50,42.13,3783200,10.47 -1995-06-01,41.88,42.50,41.75,42.19,6685200,10.49 -1995-05-31,42.13,42.13,41.00,41.56,5707600,10.33 -1995-05-30,42.63,42.88,41.50,42.00,7021200,10.44 -1995-05-26,43.00,43.13,42.25,42.69,4097600,10.61 -1995-05-25,43.25,44.00,43.00,43.38,6536800,10.75 -1995-05-24,43.75,44.25,42.88,43.50,9459200,10.78 -1995-05-23,44.13,44.38,43.50,43.88,9881200,10.88 -1995-05-22,42.50,44.13,42.25,44.13,13282400,10.94 -1995-05-19,42.88,43.75,42.63,42.75,11522000,10.60 -1995-05-18,44.13,44.13,43.25,43.38,13287600,10.75 -1995-05-17,43.75,44.38,43.50,44.00,9419200,10.91 -1995-05-16,43.13,44.38,42.50,43.75,11895600,10.84 -1995-05-15,43.13,43.75,42.50,43.63,14053200,10.81 -1995-05-12,40.88,43.69,40.50,43.63,23153200,10.81 -1995-05-11,41.63,41.63,40.38,41.00,18712400,10.16 -1995-05-10,41.50,41.88,40.75,41.44,9837600,10.27 -1995-05-09,40.63,41.38,40.00,41.25,11540800,10.22 -1995-05-08,39.88,41.00,39.75,40.50,13832000,10.04 -1995-05-05,38.75,39.13,38.13,38.88,7445200,9.64 -1995-05-04,38.25,39.88,38.00,38.50,10846800,9.54 -1995-05-03,38.25,38.63,38.00,38.13,6043600,9.45 -1995-05-02,38.25,38.38,37.50,38.13,4289200,9.45 -1995-05-01,38.25,38.75,38.00,38.25,6375600,9.48 -1995-04-28,38.00,38.38,37.50,38.25,6984400,9.48 -1995-04-27,38.50,38.50,37.75,37.88,5014800,9.39 -1995-04-26,37.63,38.75,37.38,38.25,8246800,9.48 -1995-04-25,39.13,39.38,37.25,37.75,9780000,9.36 -1995-04-24,39.00,39.63,38.50,39.00,9724400,9.67 -1995-04-21,37.25,39.50,37.13,39.13,23812400,9.70 -1995-04-20,37.13,38.50,36.63,37.63,11772400,9.33 -1995-04-19,37.50,37.50,35.63,36.38,9990800,9.02 -1995-04-18,38.50,38.63,37.50,37.50,8263200,9.29 -1995-04-17,38.13,39.38,37.88,38.38,7467600,9.51 -1995-04-13,39.25,39.25,37.88,38.25,6242400,9.48 -1995-04-12,38.25,39.63,37.38,39.00,16973200,9.67 -1995-04-11,36.75,37.88,36.63,37.75,7673200,9.36 -1995-04-10,36.88,37.00,36.13,36.63,4211200,9.08 -1995-04-07,37.00,37.13,36.25,36.75,10562400,9.11 -1995-04-06,37.25,38.00,35.53,36.75,25823600,9.11 -1995-04-05,34.13,34.75,33.75,34.75,9470000,8.61 -1995-04-04,35.75,35.88,33.63,33.88,15300000,8.40 -1995-04-03,35.50,35.75,35.13,35.50,5528000,8.80 -1995-03-31,35.13,35.63,34.75,35.25,6558000,8.74 -1995-03-30,34.63,35.50,34.50,35.38,9767600,8.77 -1995-03-29,34.00,34.88,33.88,34.38,17760000,8.52 -1995-03-28,36.25,36.34,34.13,34.38,24655600,8.52 -1995-03-27,37.63,37.63,36.63,37.19,5111200,9.22 -1995-03-24,37.38,37.88,37.25,37.75,4584400,9.36 -1995-03-23,37.88,38.00,36.98,37.13,6094400,9.20 -1995-03-22,36.25,39.50,36.25,38.06,17130800,9.43 -1995-03-21,35.50,36.75,35.25,36.25,10920800,8.98 -1995-03-20,35.13,35.63,35.00,35.25,6793600,8.74 -1995-03-17,35.50,35.50,34.88,35.13,7713600,8.71 -1995-03-16,35.25,36.00,35.00,35.25,11330000,8.74 -1995-03-15,35.50,36.25,34.88,35.00,26120800,8.67 -1995-03-14,38.25,38.25,34.50,35.00,26015200,8.67 -1995-03-13,39.63,39.63,38.00,38.13,11653200,9.45 -1995-03-10,39.63,40.38,39.38,39.50,4923200,9.79 -1995-03-09,39.88,40.38,39.38,39.75,7038000,9.85 -1995-03-08,38.75,40.13,37.75,39.56,13048800,9.81 -1995-03-07,39.88,39.88,38.25,38.31,5399200,9.50 -1995-03-06,39.75,40.00,39.50,39.75,4751200,9.85 -1995-03-03,39.75,40.69,39.50,40.25,5209200,9.98 -1995-03-02,40.13,40.75,39.75,40.00,9619200,9.91 -1995-03-01,39.75,40.13,39.42,40.00,8025200,9.91 -1995-02-28,38.50,39.88,38.00,39.50,7965200,9.79 -1995-02-27,38.25,39.00,38.11,38.25,9600800,9.48 -1995-02-24,40.13,40.38,38.50,39.00,20334400,9.67 -1995-02-23,41.13,41.88,40.00,40.19,11262000,9.96 -1995-02-22,40.63,41.00,40.13,40.81,10501200,10.12 -1995-02-21,42.63,42.75,40.88,41.00,10776800,10.16 -1995-02-17,42.88,43.00,42.50,42.50,4366400,10.53 -1995-02-16,43.13,43.25,42.63,43.19,7821200,10.70 -1995-02-15,43.25,43.50,42.50,42.56,6604400,10.55 -1995-02-14,43.75,44.13,42.63,42.94,5934400,10.64 -1995-02-13,43.50,44.50,43.25,43.75,10120800,10.84 -1995-02-10,43.63,44.19,43.38,43.75,12542400,10.81 -1995-02-09,42.13,43.88,42.13,43.63,16988800,10.78 -1995-02-08,41.00,42.38,40.88,42.31,14403600,10.46 -1995-02-07,40.38,41.00,40.00,40.81,7200000,10.09 -1995-02-06,40.75,40.75,39.50,40.50,8702000,10.01 -1995-02-03,42.00,42.13,40.38,40.50,11400800,10.01 -1995-02-02,40.13,41.88,40.13,41.63,7288000,10.29 -1995-02-01,40.75,40.75,39.88,40.13,5665200,9.92 -1995-01-31,40.50,40.88,40.00,40.38,7621200,9.98 -1995-01-30,40.13,40.50,39.88,40.13,8255200,9.92 -1995-01-27,39.88,40.38,39.00,39.88,10676400,9.86 -1995-01-26,40.88,41.50,39.25,39.50,8822000,9.76 -1995-01-25,39.50,42.00,39.50,40.98,18482000,10.13 -1995-01-24,42.25,42.38,41.38,41.63,7805600,10.29 -1995-01-23,41.88,42.63,41.00,42.25,14252400,10.44 -1995-01-20,47.00,47.00,42.50,42.63,35731200,10.54 -1995-01-19,45.50,46.00,45.00,45.88,11238800,11.34 -1995-01-18,45.00,45.63,44.75,45.63,4581200,11.28 -1995-01-17,44.50,45.50,44.13,45.00,11806400,11.12 -1995-01-16,44.88,45.25,44.25,44.50,6765600,11.00 -1995-01-13,46.13,46.13,44.38,44.88,12565600,11.09 -1995-01-12,46.13,46.38,44.75,45.38,19721200,11.22 -1995-01-11,43.75,48.06,42.69,46.75,31212400,11.56 -1995-01-10,41.25,44.00,41.25,43.69,21977600,10.80 -1995-01-09,41.63,41.88,41.00,41.20,9805200,10.18 -1995-01-06,41.63,43.13,41.13,42.00,38456800,10.38 -1995-01-05,39.25,39.38,38.75,38.88,2646800,9.61 -1995-01-04,38.63,39.63,38.63,39.38,5682400,9.73 -1995-01-03,38.88,38.88,37.88,38.38,3726400,9.49 -1994-12-30,39.38,39.88,38.75,39.00,2616400,9.64 -1994-12-29,39.25,39.88,39.13,39.50,4341200,9.76 -1994-12-28,39.13,39.25,38.25,39.13,3198000,9.67 -1994-12-27,39.25,39.75,38.88,39.13,2928800,9.67 -1994-12-23,38.50,39.38,38.50,38.88,3372000,9.61 -1994-12-22,38.50,38.88,38.25,38.63,4771200,9.55 -1994-12-21,37.88,38.50,37.50,38.38,5635600,9.49 -1994-12-20,39.13,39.25,38.38,38.50,6263600,9.52 -1994-12-19,37.25,39.38,37.25,39.13,11890000,9.67 -1994-12-16,37.25,37.75,36.75,37.25,6432400,9.21 -1994-12-15,38.00,38.38,36.88,37.13,8133200,9.18 -1994-12-14,36.50,38.13,36.50,37.88,11123600,9.36 -1994-12-13,36.63,36.94,36.25,36.38,4266800,8.99 -1994-12-12,36.38,36.75,35.50,36.50,8004400,9.02 -1994-12-09,35.88,36.38,34.75,36.25,9329200,8.96 -1994-12-08,36.88,37.00,35.75,35.88,6081200,8.87 -1994-12-07,37.50,37.81,36.06,36.63,4916800,9.05 -1994-12-06,37.00,38.38,36.88,37.56,8516400,9.28 -1994-12-05,36.50,37.38,36.13,37.19,6460000,9.19 -1994-12-02,36.50,36.75,35.63,36.56,6170000,9.04 -1994-12-01,37.00,37.63,36.00,36.19,11051200,8.95 -1994-11-30,38.38,39.38,37.00,37.25,11157600,9.21 -1994-11-29,38.00,38.50,37.75,38.25,5163200,9.45 -1994-11-28,37.63,38.25,37.31,37.81,4971200,9.35 -1994-11-25,36.88,37.75,36.75,37.75,3012400,9.33 -1994-11-23,37.00,37.88,36.38,36.88,11723200,9.12 -1994-11-22,37.75,39.13,37.25,37.38,8018800,9.24 -1994-11-21,40.00,40.25,38.00,38.13,7255600,9.42 -1994-11-18,40.00,40.50,39.63,40.00,5257600,9.89 -1994-11-17,40.88,41.00,39.88,40.00,5380000,9.86 -1994-11-16,40.75,41.56,40.63,40.94,6700000,10.09 -1994-11-15,42.50,43.00,41.25,41.38,6001200,10.20 -1994-11-14,41.25,42.75,41.25,42.50,5002000,10.47 -1994-11-11,41.25,41.50,41.00,41.13,2237600,10.14 -1994-11-10,41.75,41.88,41.00,41.31,5476800,10.18 -1994-11-09,42.75,43.00,41.00,41.63,14530000,10.26 -1994-11-08,40.63,42.63,40.25,42.25,12476400,10.41 -1994-11-07,40.38,41.25,40.13,40.75,4058000,10.04 -1994-11-04,41.50,41.63,40.00,40.38,6869200,9.95 -1994-11-03,41.75,42.00,41.00,41.50,3962400,10.23 -1994-11-02,43.13,43.25,41.38,41.38,7819200,10.20 -1994-11-01,42.88,43.48,42.38,43.13,7805600,10.63 -1994-10-31,42.00,43.38,41.50,43.19,12728000,10.64 -1994-10-28,42.38,42.88,41.75,42.13,9762400,10.38 -1994-10-27,43.25,43.75,42.50,42.75,5700800,10.54 -1994-10-26,42.63,43.27,42.63,43.25,7043200,10.66 -1994-10-25,41.63,42.63,41.50,42.63,10771200,10.51 -1994-10-24,42.75,43.13,41.88,42.25,7316800,10.41 -1994-10-21,40.75,42.75,40.75,42.63,11528000,10.51 -1994-10-20,41.25,41.81,40.50,41.00,7808000,10.10 -1994-10-19,41.00,42.13,41.00,41.25,12549200,10.17 -1994-10-18,40.63,41.63,40.50,41.25,16749200,10.17 -1994-10-17,40.88,41.50,38.88,39.75,10866400,9.80 -1994-10-14,41.50,42.00,40.88,41.13,6292000,10.14 -1994-10-13,42.63,42.88,40.63,41.13,18761200,10.14 -1994-10-12,39.63,42.63,39.13,42.13,21340000,10.38 -1994-10-11,41.38,41.88,39.38,39.63,30083600,9.77 -1994-10-10,37.13,39.63,37.00,38.88,18700800,9.58 -1994-10-07,36.13,37.06,35.50,37.00,13022000,9.12 -1994-10-06,37.38,37.48,36.00,36.25,18828800,8.93 -1994-10-05,33.63,38.13,33.38,37.88,25366800,9.33 -1994-10-04,33.25,34.00,33.00,33.75,5822000,8.32 -1994-10-03,33.63,33.75,32.50,33.13,4644400,8.16 -1994-09-30,34.13,34.50,33.63,33.69,2561200,8.30 -1994-09-29,33.75,34.38,33.38,34.13,3921200,8.41 -1994-09-28,34.00,34.38,33.63,33.88,2914800,8.35 -1994-09-27,33.75,34.13,33.38,33.88,3904800,8.35 -1994-09-26,33.88,34.50,33.63,33.94,5072400,8.36 -1994-09-23,33.88,34.50,33.88,33.94,4760000,8.36 -1994-09-22,34.25,34.25,33.63,33.88,5235600,8.35 -1994-09-21,34.50,34.63,33.75,34.13,8402400,8.41 -1994-09-20,35.13,35.38,34.38,34.56,7047600,8.52 -1994-09-19,36.38,36.75,35.50,35.50,6242000,8.75 -1994-09-16,35.88,37.25,35.50,36.38,13008000,8.97 -1994-09-15,35.13,36.13,35.13,36.00,9253200,8.87 -1994-09-14,35.63,35.75,35.00,35.13,3549200,8.66 -1994-09-13,35.75,36.25,35.63,35.81,3723600,8.82 -1994-09-12,35.63,35.75,35.38,35.75,3252400,8.81 -1994-09-09,35.75,36.00,35.38,35.75,5624400,8.81 -1994-09-08,36.00,36.25,35.63,36.13,5691200,8.90 -1994-09-07,35.63,36.63,35.38,36.13,7283200,8.90 -1994-09-06,35.25,35.63,35.00,35.56,3279200,8.76 -1994-09-02,35.25,35.50,35.00,35.38,3628000,8.72 -1994-09-01,35.38,35.75,34.63,35.00,7305200,8.63 -1994-08-31,36.00,37.38,35.75,36.19,12568800,8.92 -1994-08-30,35.25,36.38,35.13,36.25,6515600,8.93 -1994-08-29,35.75,36.13,35.25,35.38,5450800,8.72 -1994-08-26,35.25,36.13,35.25,35.75,7300000,8.81 -1994-08-25,34.25,36.38,34.25,35.06,10688800,8.64 -1994-08-24,34.75,35.00,34.38,34.88,6132400,8.60 -1994-08-23,34.88,35.88,34.75,35.00,7669200,8.63 -1994-08-22,34.75,35.00,34.63,34.88,5445600,8.60 -1994-08-19,34.75,35.00,34.25,34.88,4674800,8.60 -1994-08-18,34.75,35.25,34.50,34.63,7370000,8.53 -1994-08-17,34.88,35.38,34.63,35.00,10232400,8.63 -1994-08-16,34.38,34.75,34.00,34.75,5563200,8.56 -1994-08-15,34.75,35.00,34.25,34.63,4293200,8.53 -1994-08-12,34.38,35.13,33.88,34.75,6425200,8.53 -1994-08-11,34.25,35.13,33.88,34.31,10649200,8.43 -1994-08-10,33.63,34.88,33.25,34.63,9065200,8.50 -1994-08-09,33.50,33.88,33.13,33.63,2811200,8.26 -1994-08-08,33.13,34.00,33.00,33.75,5048800,8.29 -1994-08-05,32.88,33.38,32.88,33.25,3123200,8.17 -1994-08-04,33.13,33.75,33.13,33.25,6620000,8.17 -1994-08-03,32.75,33.25,32.13,33.13,8113600,8.14 -1994-08-02,33.50,33.63,32.38,32.56,9642400,8.00 -1994-08-01,33.63,33.75,32.75,33.38,8204400,8.20 -1994-07-29,31.87,34.00,31.87,33.69,19853600,8.27 -1994-07-28,31.00,32.13,30.87,31.87,8762000,7.83 -1994-07-27,31.25,31.37,30.62,31.06,4788000,7.63 -1994-07-26,31.75,32.00,31.12,31.37,6756400,7.70 -1994-07-25,31.12,31.87,30.75,31.69,15103200,7.78 -1994-07-22,31.62,31.97,30.00,31.00,28098800,7.61 -1994-07-21,26.62,28.50,26.50,28.00,10348800,6.88 -1994-07-20,27.37,27.62,26.37,26.62,7765200,6.54 -1994-07-19,28.62,28.75,27.37,27.69,4176400,6.80 -1994-07-18,28.12,29.00,28.00,28.37,2734800,6.97 -1994-07-15,28.23,28.62,27.50,28.25,3409200,6.94 -1994-07-14,29.62,29.75,28.25,28.62,6459200,7.03 -1994-07-13,28.50,30.25,28.50,29.69,16081200,7.29 -1994-07-12,27.00,28.44,26.37,28.37,8662000,6.97 -1994-07-11,27.12,27.37,26.62,27.00,3801200,6.63 -1994-07-08,26.50,27.62,26.50,27.06,7457600,6.65 -1994-07-07,25.87,27.00,25.50,26.81,6097600,6.58 -1994-07-06,26.25,26.50,26.00,26.12,3499200,6.41 -1994-07-05,25.62,26.75,25.62,26.50,3080800,6.51 -1994-07-01,26.37,26.50,25.37,25.75,6404400,6.32 -1994-06-30,26.25,26.87,26.25,26.50,3652000,6.51 -1994-06-29,26.75,27.12,25.87,26.12,4842400,6.41 -1994-06-28,26.25,27.12,25.62,26.75,6235200,6.57 -1994-06-27,25.25,26.25,24.62,26.25,9153200,6.45 -1994-06-24,25.12,26.12,24.75,25.61,10470000,6.29 -1994-06-23,26.25,26.25,24.87,25.12,7283200,6.17 -1994-06-22,26.25,26.75,26.00,26.25,4081200,6.45 -1994-06-21,26.87,27.25,25.75,26.00,8693200,6.39 -1994-06-20,26.25,27.25,26.00,27.12,7150000,6.66 -1994-06-17,26.00,26.75,25.87,26.50,8027600,6.51 -1994-06-16,27.75,27.75,26.12,26.37,7812400,6.48 -1994-06-15,27.00,28.00,26.87,27.81,5704400,6.83 -1994-06-14,27.25,27.37,26.62,27.06,5531200,6.65 -1994-06-13,26.37,27.19,26.37,27.00,3339200,6.63 -1994-06-10,27.12,27.37,26.37,26.50,5107600,6.51 -1994-06-09,25.62,27.00,25.50,27.00,10485200,6.63 -1994-06-08,27.50,27.62,26.00,26.12,9809200,6.41 -1994-06-07,27.25,27.75,27.25,27.50,5013600,6.75 -1994-06-06,27.50,27.75,27.00,27.37,4513200,6.72 -1994-06-03,27.12,28.00,26.75,27.62,12649200,6.78 -1994-06-02,28.37,28.50,27.12,27.37,13762400,6.72 -1994-06-01,28.50,28.62,27.87,28.25,13786800,6.94 -1994-05-31,29.50,29.50,28.50,29.25,9211200,7.18 -1994-05-27,30.25,30.75,29.50,29.94,3882400,7.35 -1994-05-26,31.50,31.50,30.25,30.50,2613200,7.46 -1994-05-25,30.25,31.75,30.00,31.25,4873200,7.64 -1994-05-24,31.00,31.25,30.25,30.75,4536400,7.52 -1994-05-23,31.00,31.25,30.00,30.50,4286400,7.46 -1994-05-20,31.75,32.25,31.00,31.06,3519200,7.60 -1994-05-19,30.75,32.50,30.50,32.13,9776800,7.86 -1994-05-18,29.75,30.75,29.25,30.62,4436800,7.49 -1994-05-17,29.75,29.75,28.75,29.37,6450800,7.18 -1994-05-16,30.00,30.50,29.50,29.50,4854800,7.22 -1994-05-13,29.75,30.50,29.25,30.00,3323200,7.34 -1994-05-12,30.50,30.75,29.50,29.69,3839200,7.26 -1994-05-11,31.00,31.50,29.75,30.25,5218000,7.40 -1994-05-10,31.75,32.00,31.00,31.00,5246800,7.58 -1994-05-09,32.25,32.50,30.75,31.25,5026400,7.64 -1994-05-06,32.25,32.75,31.25,32.31,6721200,7.90 -1994-05-05,33.25,33.75,32.25,32.88,10307600,8.04 -1994-05-04,31.00,33.25,30.50,33.00,13008800,8.07 -1994-05-03,31.00,31.25,29.50,30.25,4761200,7.40 -1994-05-02,30.00,31.25,30.00,31.00,4401200,7.58 -1994-04-29,30.00,30.50,29.75,30.00,3399200,7.34 -1994-04-28,31.00,31.25,29.75,30.25,3604400,7.40 -1994-04-26,31.50,31.50,31.00,31.25,5879200,7.64 -1994-04-25,29.75,31.00,29.50,31.00,12846800,7.58 -1994-04-22,31.25,32.00,28.50,29.75,24923600,7.28 -1994-04-21,28.50,30.50,27.00,29.62,14674400,7.25 -1994-04-20,29.25,30.00,28.00,28.25,10080800,6.91 -1994-04-19,29.75,30.00,28.50,29.00,5947600,7.09 -1994-04-18,30.50,30.50,29.25,29.62,8238800,7.25 -1994-04-15,31.25,31.50,30.00,30.25,6730800,7.40 -1994-04-14,30.50,31.75,30.00,31.50,7933200,7.71 -1994-04-13,32.25,32.50,31.25,31.75,8330000,7.77 -1994-04-12,33.38,33.38,31.75,32.00,4890800,7.83 -1994-04-11,33.50,33.50,32.50,33.50,3823600,8.19 -1994-04-08,33.75,34.00,33.25,33.50,6336400,8.19 -1994-04-07,33.50,33.75,32.75,33.38,2764800,8.17 -1994-04-06,34.00,34.00,32.75,33.50,4616400,8.19 -1994-04-05,33.75,34.25,33.50,33.50,3505600,8.19 -1994-04-04,32.25,33.25,31.75,33.25,6016800,8.13 -1994-03-31,32.50,33.50,31.50,33.25,7481200,8.13 -1994-03-30,32.50,33.25,31.75,32.50,6079200,7.95 -1994-03-29,33.25,33.75,32.25,32.75,7640000,8.01 -1994-03-28,33.00,34.00,32.75,33.25,10098800,8.13 -1994-03-25,34.75,34.75,32.75,32.75,12291200,8.01 -1994-03-24,35.13,35.25,34.00,34.63,6738800,8.47 -1994-03-23,35.25,35.50,34.25,35.13,7749200,8.59 -1994-03-22,35.25,35.50,34.50,35.00,8690800,8.56 -1994-03-21,36.38,36.50,35.25,35.50,8806400,8.68 -1994-03-18,36.75,36.75,35.75,36.38,8004400,8.90 -1994-03-17,36.75,37.00,36.25,36.50,5590800,8.93 -1994-03-16,37.50,37.75,36.50,36.75,5265200,8.99 -1994-03-15,38.25,38.25,37.25,37.63,7319200,9.20 -1994-03-14,38.50,38.50,37.75,38.13,15783600,9.33 -1994-03-11,37.00,37.75,36.75,37.25,5791200,9.11 -1994-03-10,37.25,37.63,36.75,37.25,5142400,9.11 -1994-03-09,36.63,37.50,36.00,37.50,8896800,9.17 -1994-03-08,38.00,38.00,36.75,37.00,6647600,9.05 -1994-03-07,37.00,38.13,36.75,37.88,11088800,9.27 -1994-03-04,36.00,37.50,35.75,36.75,8113600,8.99 -1994-03-03,35.75,36.25,35.50,35.75,6737600,8.75 -1994-03-02,35.25,36.25,34.75,35.63,10519200,8.72 -1994-03-01,36.75,36.75,35.75,36.25,7570800,8.87 -1994-02-28,36.25,37.00,36.00,36.50,4434800,8.93 -1994-02-25,37.00,37.25,35.50,36.00,8468000,8.81 -1994-02-24,37.00,37.25,36.25,36.63,7081200,8.96 -1994-02-23,37.25,38.25,37.00,37.25,9318800,9.11 -1994-02-22,36.25,37.50,35.75,37.25,7676400,9.11 -1994-02-18,36.50,37.00,36.25,36.25,5326400,8.87 -1994-02-17,37.25,37.88,36.25,37.00,5197600,9.05 -1994-02-16,37.50,37.50,36.75,36.75,4379200,8.99 -1994-02-15,36.75,37.50,36.25,37.13,4654400,9.08 -1994-02-14,37.00,38.00,36.75,37.00,8775200,9.05 -1994-02-11,36.25,37.50,36.25,37.00,5880800,9.05 -1994-02-10,36.25,37.50,36.00,36.50,10802000,8.93 -1994-02-09,35.75,36.50,35.25,36.25,6699200,8.87 -1994-02-08,36.00,36.50,35.25,35.75,10210800,8.75 -1994-02-07,33.50,37.13,33.50,36.50,25925200,8.93 -1994-02-04,33.50,35.00,33.25,33.50,12645200,8.17 -1994-02-03,33.00,33.63,32.50,33.50,4933200,8.17 -1994-02-02,33.25,33.25,32.50,33.00,5247600,8.04 -1994-02-01,33.00,33.50,32.25,33.25,5618000,8.10 -1994-01-31,33.50,33.75,32.75,32.75,8532400,7.98 -1994-01-28,34.25,34.75,33.75,34.00,4891200,8.29 -1994-01-27,33.50,34.25,33.00,34.13,4724800,8.32 -1994-01-26,33.75,34.00,33.25,33.50,5922400,8.17 -1994-01-25,34.75,35.00,33.25,33.88,15818800,8.26 -1994-01-24,33.25,35.25,33.25,35.00,24742000,8.53 -1994-01-21,33.25,33.50,32.25,33.38,35007600,8.14 -1994-01-20,29.50,30.75,29.50,29.87,9582400,7.28 -1994-01-19,29.25,29.75,28.75,29.25,10066400,7.13 -1994-01-18,30.25,30.25,29.00,29.37,12978000,7.16 -1994-01-17,31.00,31.50,30.00,30.37,5206400,7.40 -1994-01-14,30.75,31.75,30.50,31.00,7673200,7.56 -1994-01-13,30.00,30.75,29.75,30.62,19000000,7.46 -1994-01-12,32.25,32.25,30.50,30.50,15684400,7.43 -1994-01-11,33.50,33.75,31.75,31.87,12700000,7.77 -1994-01-10,33.00,33.88,32.75,33.63,7222000,8.20 -1994-01-07,32.00,33.25,31.25,33.13,10688800,8.08 -1994-01-06,33.75,34.00,32.50,32.75,13095200,7.98 -1994-01-05,31.75,33.88,31.75,33.75,21874400,8.23 -1994-01-04,30.25,31.50,30.00,31.50,10198800,7.68 -1994-01-03,29.50,30.00,29.00,29.87,6485200,7.28 -1993-12-31,29.75,30.25,29.25,29.25,5765200,7.13 -1993-12-30,28.50,30.25,28.50,29.75,11253200,7.25 -1993-12-29,29.25,29.25,28.50,28.50,3853200,6.95 -1993-12-28,28.75,29.50,28.50,29.12,5705600,7.10 -1993-12-27,27.75,28.75,27.25,28.50,5730000,6.95 -1993-12-23,27.25,27.25,26.50,27.25,8120000,6.64 -1993-12-22,27.25,28.50,27.00,28.00,6498800,6.82 -1993-12-21,28.50,28.75,27.25,27.50,8973600,6.70 -1993-12-20,29.25,29.75,28.25,28.50,6768800,6.95 -1993-12-17,29.50,29.75,29.12,29.50,5197600,7.19 -1993-12-16,29.50,29.75,29.00,29.37,4532000,7.16 -1993-12-15,29.00,29.75,29.00,29.75,4438000,7.25 -1993-12-14,29.25,29.75,29.00,29.12,10492400,7.10 -1993-12-13,28.25,29.50,27.75,29.50,8729200,7.19 -1993-12-10,30.25,30.50,27.75,28.25,17781200,6.89 -1993-12-09,31.75,32.00,29.75,30.00,6531200,7.31 -1993-12-08,32.00,32.25,31.50,31.87,1422000,7.77 -1993-12-07,32.00,32.25,31.50,32.25,2280800,7.86 -1993-12-06,31.50,32.50,31.25,32.25,5610000,7.86 -1993-12-03,31.75,32.00,31.00,31.50,4314800,7.68 -1993-12-02,31.75,32.00,31.00,31.75,3614400,7.74 -1993-12-01,32.00,32.25,31.25,31.50,3978800,7.68 -1993-11-30,31.75,32.63,31.50,31.50,4036800,7.68 -1993-11-29,32.25,32.50,31.50,31.75,3462000,7.74 -1993-11-26,32.75,33.00,32.25,32.63,1569200,7.95 -1993-11-24,32.75,33.50,32.63,33.00,3246800,8.04 -1993-11-23,32.50,33.00,31.25,33.00,6653600,8.04 -1993-11-22,32.75,33.00,32.25,32.50,5389200,7.92 -1993-11-19,33.00,33.50,32.50,33.00,4409200,8.04 -1993-11-18,33.50,33.75,33.00,33.50,4089200,8.14 -1993-11-17,34.00,35.00,32.75,33.50,10812400,8.14 -1993-11-16,32.00,34.25,31.75,34.00,10838000,8.26 -1993-11-15,31.50,32.75,31.50,32.00,5616800,7.77 -1993-11-12,31.50,32.00,30.50,31.75,5136800,7.71 -1993-11-11,30.75,32.00,30.50,31.37,5090800,7.62 -1993-11-10,30.25,30.75,30.00,30.75,2765600,7.47 -1993-11-09,31.00,31.25,29.75,30.12,6136400,7.32 -1993-11-08,32.00,32.13,30.50,30.75,5966400,7.47 -1993-11-05,31.87,32.25,30.75,31.87,13513200,7.74 -1993-11-04,31.50,32.25,30.75,32.25,6632000,7.83 -1993-11-03,33.00,33.00,31.00,31.62,6320000,7.68 -1993-11-02,31.25,33.00,31.00,32.75,8013600,7.95 -1993-11-01,30.75,31.50,30.25,31.50,3798800,7.65 -1993-10-29,31.00,31.75,30.50,30.75,4892400,7.47 -1993-10-28,31.75,32.25,31.00,31.00,8736800,7.53 -1993-10-27,30.00,32.25,29.75,31.75,16415200,7.71 -1993-10-26,29.75,30.00,29.00,29.75,7960000,7.23 -1993-10-25,30.25,30.50,29.62,30.00,7840800,7.29 -1993-10-22,30.50,31.50,29.75,30.25,14160000,7.35 -1993-10-21,27.50,31.25,27.25,30.25,22417600,7.35 -1993-10-20,28.00,28.25,27.25,27.75,4956400,6.74 -1993-10-19,28.25,28.50,27.25,27.75,7643200,6.74 -1993-10-18,28.00,28.75,27.75,28.37,11900000,6.89 -1993-10-15,27.75,28.50,26.75,28.25,34136400,6.86 -1993-10-14,24.00,24.50,23.50,23.75,5749200,5.77 -1993-10-13,24.25,24.25,23.50,24.00,6322400,5.83 -1993-10-12,24.00,25.00,23.75,24.00,10952400,5.83 -1993-10-11,22.75,24.00,22.75,23.75,5775200,5.77 -1993-10-08,23.25,23.25,22.25,22.62,4989200,5.49 -1993-10-07,23.50,23.75,22.75,23.00,4828000,5.59 -1993-10-06,23.75,24.00,23.37,23.62,6271200,5.74 -1993-10-05,23.00,24.00,23.00,23.50,6306400,5.71 -1993-10-04,22.62,23.00,22.00,22.75,6891200,5.53 -1993-10-01,22.75,23.00,22.50,22.75,12022000,5.53 -1993-09-30,24.00,24.00,23.00,23.37,9828000,5.68 -1993-09-29,24.25,24.87,23.75,23.87,8463600,5.80 -1993-09-28,24.75,25.00,24.25,24.75,3386400,6.01 -1993-09-27,25.00,25.25,24.25,24.75,4043200,6.01 -1993-09-24,25.00,25.25,24.50,25.00,2743200,6.07 -1993-09-23,25.50,25.50,24.50,24.75,4697600,6.01 -1993-09-22,24.25,25.50,24.25,25.50,3960800,6.19 -1993-09-21,24.75,25.25,23.87,24.50,5250000,5.95 -1993-09-20,25.25,25.50,24.75,24.87,3968800,6.04 -1993-09-17,24.37,25.50,24.25,25.25,6157600,6.13 -1993-09-16,24.25,25.00,24.25,24.75,3086800,6.01 -1993-09-15,24.50,25.00,23.50,24.50,9206800,5.95 -1993-09-14,24.25,25.00,24.00,24.25,9880000,5.89 -1993-09-13,26.25,26.50,24.75,25.25,9143600,6.13 -1993-09-10,26.25,26.25,25.37,26.25,4804800,6.38 -1993-09-09,26.75,27.00,26.00,26.00,5352000,6.31 -1993-09-08,26.25,27.00,26.00,26.75,8102000,6.50 -1993-09-07,26.00,27.00,25.75,26.25,5130000,6.38 -1993-09-03,26.00,26.00,25.25,25.75,5830000,6.25 -1993-09-02,26.00,26.25,25.25,25.75,10081200,6.25 -1993-09-01,26.50,26.75,25.75,26.12,8065200,6.34 -1993-08-31,26.50,26.75,26.00,26.50,4570800,6.44 -1993-08-30,26.50,26.50,25.87,26.00,9785600,6.31 -1993-08-27,27.00,27.00,26.25,26.50,6676400,6.44 -1993-08-26,27.25,27.25,26.50,26.87,6296800,6.53 -1993-08-25,28.00,28.25,26.75,27.25,5209200,6.62 -1993-08-24,28.25,28.75,27.75,28.00,3625600,6.80 -1993-08-23,28.00,28.75,27.50,28.37,3265600,6.89 -1993-08-20,27.75,28.00,27.00,28.00,3574400,6.80 -1993-08-19,28.75,28.75,27.50,27.50,5452000,6.68 -1993-08-18,29.00,29.75,28.25,28.50,6751200,6.92 -1993-08-17,27.75,28.50,27.25,28.37,3876800,6.89 -1993-08-16,27.50,28.00,27.25,27.50,3669200,6.68 -1993-08-13,26.50,27.75,26.25,27.37,4978800,6.62 -1993-08-12,27.50,27.75,26.00,26.50,12098800,6.41 -1993-08-11,28.50,28.50,27.00,27.50,5965200,6.65 -1993-08-10,29.50,29.75,28.25,28.50,5465600,6.89 -1993-08-09,29.25,30.25,29.00,29.75,5767600,7.19 -1993-08-06,29.25,30.25,29.25,29.25,4506800,7.07 -1993-08-05,30.75,30.75,29.00,29.50,7498800,7.13 -1993-08-04,29.25,30.50,29.00,30.25,8700000,7.31 -1993-08-03,29.00,29.25,28.75,29.00,6315600,7.01 -1993-08-02,28.25,29.25,28.00,28.50,7728000,6.89 -1993-07-30,27.50,28.25,27.00,27.75,7669200,6.71 -1993-07-29,27.00,27.50,26.75,27.25,4343200,6.59 -1993-07-28,26.25,27.00,26.25,26.87,3300000,6.50 -1993-07-27,26.75,27.50,26.25,26.50,7100800,6.41 -1993-07-26,26.75,27.50,26.00,26.87,5468000,6.50 -1993-07-23,27.00,27.50,26.00,26.25,8365600,6.35 -1993-07-22,26.00,27.00,25.75,26.50,7554400,6.41 -1993-07-21,26.00,26.75,25.50,26.25,16283600,6.35 -1993-07-20,26.25,27.75,25.75,26.87,19017600,6.50 -1993-07-19,28.00,28.75,25.50,25.62,28813200,6.20 -1993-07-16,28.50,29.62,26.50,27.50,75744400,6.65 -1993-07-15,37.25,37.75,35.25,35.75,12091200,8.64 -1993-07-14,36.75,37.50,35.75,37.25,8816800,9.01 -1993-07-13,38.75,38.75,37.00,37.25,5650800,9.01 -1993-07-12,36.75,38.13,36.25,38.00,6215600,9.19 -1993-07-09,37.00,37.25,36.50,36.75,5604400,8.89 -1993-07-08,36.50,37.50,36.25,36.50,4964800,8.83 -1993-07-07,37.50,37.88,36.25,36.50,8124400,8.83 -1993-07-06,38.25,39.00,37.50,37.75,5558800,9.13 -1993-07-02,38.25,38.75,37.75,38.50,6846400,9.31 -1993-07-01,39.00,39.75,38.00,38.00,7809200,9.19 -1993-06-30,38.75,39.75,38.50,39.50,7170000,9.55 -1993-06-29,40.25,40.25,38.50,39.00,10526400,9.43 -1993-06-28,40.50,40.50,38.75,40.13,12645600,9.70 -1993-06-25,40.38,40.75,39.50,40.00,9198000,9.67 -1993-06-24,40.50,41.75,40.00,41.75,7980000,10.10 -1993-06-23,41.75,41.75,40.00,40.50,6462400,9.79 -1993-06-22,40.88,42.00,39.75,41.38,12021200,10.01 -1993-06-21,40.50,40.50,39.50,39.63,9776800,9.58 -1993-06-18,41.63,42.13,39.75,41.00,11138800,9.91 -1993-06-17,42.50,42.50,40.50,41.25,14635600,9.97 -1993-06-16,42.25,43.25,41.50,42.25,12615600,10.22 -1993-06-15,45.25,45.25,41.88,42.00,16018000,10.16 -1993-06-14,44.00,44.75,43.50,44.63,8927600,10.79 -1993-06-11,45.00,45.25,43.38,43.75,8662400,10.58 -1993-06-10,43.50,44.75,42.75,44.50,19783600,10.76 -1993-06-09,45.00,45.63,44.00,44.25,42090000,10.70 -1993-06-08,48.75,50.00,48.00,49.50,22194400,11.97 -1993-06-07,54.50,54.75,50.38,50.75,17239200,12.27 -1993-06-04,55.75,56.25,54.50,54.88,7649200,13.27 -1993-06-03,57.00,57.25,56.00,56.38,5603200,13.63 -1993-06-02,56.75,58.25,56.00,57.00,7160000,13.78 -1993-06-01,56.50,57.75,56.50,57.00,4837600,13.78 -1993-05-28,57.00,57.50,56.25,56.63,6575200,13.69 -1993-05-27,57.75,58.50,57.25,57.50,7049200,13.87 -1993-05-26,56.00,57.75,55.38,57.75,4353600,13.94 -1993-05-25,56.75,57.50,55.75,56.38,6462400,13.60 -1993-05-24,56.75,58.75,56.75,57.63,5373200,13.91 -1993-05-21,58.75,59.13,56.75,57.50,5300000,13.87 -1993-05-20,57.25,59.00,57.25,58.75,10385200,14.18 -1993-05-19,54.75,57.50,54.50,57.25,6176400,13.81 -1993-05-18,55.50,56.25,55.00,55.50,5860000,13.39 -1993-05-17,55.50,56.00,55.00,55.75,2491200,13.45 -1993-05-14,55.25,56.00,55.00,55.50,4212000,13.39 -1993-05-13,53.50,55.75,53.50,55.50,12940800,13.39 -1993-05-12,54.25,54.75,53.00,53.25,3779200,12.85 -1993-05-11,55.00,55.25,54.00,54.50,5665600,13.15 -1993-05-10,55.00,55.88,55.00,55.00,4929200,13.27 -1993-05-07,53.50,54.75,53.50,54.75,2927600,13.21 -1993-05-06,54.50,54.75,53.50,53.75,2536800,12.97 -1993-05-05,53.00,55.50,53.00,54.50,9059200,13.15 -1993-05-04,52.25,54.25,52.00,53.38,6112400,12.88 -1993-05-03,51.25,52.00,51.00,51.88,2332400,12.52 -1993-04-30,50.75,52.50,50.75,51.25,4730000,12.37 -1993-04-29,51.50,51.75,50.13,50.75,2958000,12.25 -1993-04-28,49.75,52.00,49.75,51.38,5846800,12.40 -1993-04-27,48.75,50.25,48.75,50.25,4648800,12.13 -1993-04-26,49.25,49.75,48.50,49.00,3689200,11.82 -1993-04-23,49.75,50.25,48.75,49.25,4808000,11.88 -1993-04-22,49.25,50.50,49.00,50.00,5648800,12.06 -1993-04-21,50.25,50.75,49.25,49.63,7337600,11.98 -1993-04-20,48.75,50.25,48.25,50.00,8580800,12.06 -1993-04-19,48.50,49.50,48.25,48.50,8148000,11.70 -1993-04-16,48.25,48.75,47.38,48.13,24533200,11.61 -1993-04-15,48.25,48.25,46.75,47.25,7816800,11.40 -1993-04-14,48.25,48.75,47.63,48.75,6092400,11.76 -1993-04-13,50.50,51.25,48.25,48.50,5893600,11.70 -1993-04-12,49.50,51.00,49.50,50.00,3324800,12.06 -1993-04-08,50.00,50.50,49.00,49.75,5857600,12.00 -1993-04-07,49.00,50.75,48.50,50.50,5825200,12.19 -1993-04-06,50.00,50.25,48.75,48.75,6020800,11.76 -1993-04-05,50.00,50.50,49.50,50.00,5332000,12.06 -1993-04-02,50.50,51.25,49.50,50.13,9077600,12.10 -1993-04-01,51.25,52.00,51.00,51.75,3878000,12.49 -1993-03-31,52.50,52.75,51.25,51.50,7968800,12.43 -1993-03-30,51.13,52.25,50.25,52.25,9447600,12.61 -1993-03-29,52.25,52.50,50.75,51.00,9362000,12.31 -1993-03-26,54.75,54.75,52.50,53.25,5431200,12.85 -1993-03-25,53.75,54.75,53.50,54.75,6125200,13.21 -1993-03-24,52.75,54.25,52.50,53.75,5126400,12.97 -1993-03-23,53.25,54.00,52.63,52.75,3674400,12.73 -1993-03-22,53.50,53.88,52.75,53.25,5911200,12.85 -1993-03-19,55.00,55.25,53.50,53.75,5516800,12.97 -1993-03-18,55.00,55.63,54.50,54.50,3810800,13.15 -1993-03-17,56.50,57.00,55.00,55.13,6301200,13.30 -1993-03-16,57.25,57.75,56.50,56.50,3626800,13.63 -1993-03-15,56.00,57.25,55.38,57.00,4868800,13.75 -1993-03-12,56.75,56.75,55.50,56.25,4527600,13.57 -1993-03-11,57.00,57.25,56.25,56.88,5167600,13.73 -1993-03-10,56.75,57.25,56.00,56.75,4738800,13.69 -1993-03-09,56.50,57.50,56.50,56.75,5535200,13.69 -1993-03-08,55.00,56.75,55.00,56.50,6322400,13.63 -1993-03-05,54.75,55.75,54.75,55.00,4001200,13.27 -1993-03-04,54.50,55.25,53.50,55.00,6730000,13.27 -1993-03-03,54.00,55.00,53.25,54.63,7261200,13.18 -1993-03-02,53.00,54.50,53.00,54.25,5294400,13.09 -1993-03-01,53.00,53.50,52.75,53.25,4272400,12.85 -1993-02-26,54.25,54.25,52.25,53.00,10538000,12.79 -1993-02-25,53.25,54.75,53.25,54.75,5979200,13.21 -1993-02-24,52.13,53.88,52.13,53.63,10253600,12.94 -1993-02-23,55.00,55.25,54.00,54.25,6937600,13.09 -1993-02-22,55.00,56.00,54.75,55.13,3531200,13.30 -1993-02-19,55.25,55.50,54.75,55.00,6366800,13.27 -1993-02-18,55.00,55.25,53.50,55.00,10006800,13.27 -1993-02-17,53.25,54.00,52.00,53.88,8932400,13.00 -1993-02-16,53.50,53.50,51.50,53.00,14563200,12.79 -1993-02-12,55.00,55.50,53.75,53.88,9855600,13.00 -1993-02-11,55.75,56.25,55.00,55.13,6015200,13.27 -1993-02-10,57.00,57.25,55.00,55.75,9593600,13.42 -1993-02-09,57.00,57.38,56.50,56.88,8525600,13.70 -1993-02-08,57.00,57.50,55.50,56.50,10060000,13.60 -1993-02-05,59.25,59.50,56.25,57.25,13134400,13.78 -1993-02-04,60.00,60.25,59.00,59.50,7453200,14.33 -1993-02-03,61.00,61.00,58.50,60.00,9455200,14.45 -1993-02-02,60.75,61.50,60.25,60.25,6530000,14.51 -1993-02-01,59.25,61.25,59.25,61.25,8608800,14.75 -1993-01-29,60.25,61.25,59.00,59.50,9516800,14.33 -1993-01-28,60.00,60.25,59.25,59.88,6580000,14.42 -1993-01-27,61.00,61.75,58.75,60.25,8101200,14.51 -1993-01-26,60.50,62.00,60.50,60.75,10201200,14.63 -1993-01-25,59.25,60.50,59.25,60.00,7237600,14.45 -1993-01-22,60.25,60.25,59.00,59.50,5252400,14.33 -1993-01-21,59.75,60.25,58.75,60.00,6601200,14.45 -1993-01-20,59.75,60.25,59.50,60.00,5685600,14.45 -1993-01-19,59.75,60.50,59.25,59.75,9802400,14.39 -1993-01-18,59.50,60.00,58.00,59.50,11935600,14.33 -1993-01-15,61.00,62.25,60.00,60.25,32257600,14.51 -1993-01-14,64.00,65.25,63.75,65.00,13145200,15.65 -1993-01-13,61.50,64.00,61.25,63.50,7135600,15.29 -1993-01-12,62.75,63.75,61.50,61.50,12364400,14.81 -1993-01-11,62.00,64.37,61.75,64.12,9785200,15.44 -1993-01-08,60.75,63.00,59.75,62.25,11474400,14.99 -1993-01-07,61.75,62.50,60.63,61.00,9741200,14.69 -1993-01-06,60.75,62.00,60.50,61.75,10055600,14.87 -1993-01-05,58.00,59.25,57.25,59.25,6658800,14.27 -1993-01-04,59.50,60.00,57.75,58.25,4618800,14.03 -1992-12-31,58.75,60.00,58.75,59.75,3302000,14.39 -1992-12-30,59.75,59.75,58.75,58.75,3610800,14.15 -1992-12-29,59.50,60.75,59.50,59.63,4171200,14.36 -1992-12-28,59.25,59.75,59.25,59.50,2536400,14.33 -1992-12-24,60.00,60.00,59.00,59.00,1642400,14.21 -1992-12-23,60.25,60.50,59.25,59.75,4018800,14.39 -1992-12-22,59.75,61.25,59.75,60.63,10009200,14.60 -1992-12-21,58.25,60.00,58.00,59.63,9159200,14.36 -1992-12-18,57.50,59.25,57.25,58.25,8414400,14.03 -1992-12-17,55.25,57.50,55.25,56.88,8370800,13.70 -1992-12-16,56.25,57.00,54.50,55.00,8085200,13.24 -1992-12-15,56.75,57.00,55.50,56.38,6541200,13.57 -1992-12-14,57.50,57.75,56.75,57.25,3962000,13.78 -1992-12-11,57.25,58.25,57.25,57.50,4299200,13.84 -1992-12-10,57.25,57.63,56.50,57.25,5010800,13.78 -1992-12-09,57.75,58.00,57.25,57.63,5700800,13.88 -1992-12-08,57.75,58.75,57.75,58.13,7035600,14.00 -1992-12-07,56.75,57.75,56.75,57.75,5168000,13.90 -1992-12-04,57.25,57.50,56.50,56.88,3432400,13.70 -1992-12-03,56.50,57.63,56.13,57.50,6710800,13.84 -1992-12-02,58.25,58.50,57.00,57.25,3498800,13.78 -1992-12-01,57.25,59.00,56.75,58.25,4652400,14.03 -1992-11-30,56.25,57.50,55.63,57.50,5739200,13.84 -1992-11-27,56.50,57.25,56.25,56.50,1688800,13.57 -1992-11-25,57.00,57.25,56.00,56.50,4208000,13.57 -1992-11-24,57.00,57.50,56.50,57.50,5601200,13.82 -1992-11-23,56.50,57.00,56.25,56.75,5462400,13.63 -1992-11-20,58.50,58.75,57.00,57.50,5572000,13.82 -1992-11-19,57.75,59.50,57.75,58.25,8608000,14.00 -1992-11-18,56.00,58.25,55.50,57.75,10889200,13.88 -1992-11-17,57.25,57.50,54.88,55.25,6045200,13.27 -1992-11-16,56.25,57.75,56.00,57.38,2419200,13.79 -1992-11-13,57.00,57.25,56.00,56.25,3042000,13.51 -1992-11-12,57.00,57.50,56.38,56.88,3844400,13.67 -1992-11-11,56.50,58.25,56.25,56.75,5023600,13.63 -1992-11-10,55.00,56.50,54.75,56.25,4368000,13.51 -1992-11-09,56.00,56.00,54.75,55.25,4052000,13.27 -1992-11-06,54.75,56.50,54.75,55.75,9443200,13.39 -1992-11-05,52.50,55.00,52.50,55.00,10647600,13.21 -1992-11-04,52.00,52.75,52.00,52.50,5086800,12.61 -1992-11-03,52.50,52.50,51.50,52.00,4042000,12.49 -1992-11-02,52.50,52.75,51.75,52.25,6094400,12.55 -1992-10-30,53.50,53.50,52.00,52.50,4657600,12.61 -1992-10-29,52.25,54.00,51.50,53.25,7661200,12.79 -1992-10-28,51.25,52.75,50.75,52.25,7033200,12.55 -1992-10-27,51.50,52.50,51.00,51.50,7575600,12.37 -1992-10-26,48.75,51.50,48.50,51.50,8972000,12.37 -1992-10-23,49.25,49.50,48.25,48.75,3279200,11.71 -1992-10-22,48.50,49.25,48.25,48.75,3026400,11.71 -1992-10-21,49.25,49.50,48.00,48.50,4080800,11.65 -1992-10-20,49.00,50.00,48.50,49.13,10269200,11.80 -1992-10-19,49.00,49.25,48.50,49.00,7002400,11.77 -1992-10-16,46.75,49.50,46.50,49.00,16142000,11.77 -1992-10-15,45.75,46.00,45.25,45.50,2701200,10.93 -1992-10-14,45.25,46.25,45.00,46.00,3429200,11.05 -1992-10-13,44.75,46.00,44.00,45.38,5265600,10.90 -1992-10-12,43.25,44.25,43.25,44.00,2580000,10.57 -1992-10-09,43.50,44.00,43.00,43.38,2108000,10.42 -1992-10-08,44.00,44.25,43.00,43.50,4543200,10.45 -1992-10-07,45.00,45.25,43.50,43.75,4050800,10.51 -1992-10-06,43.75,45.00,42.75,44.75,4058000,10.75 -1992-10-05,43.25,43.75,41.50,43.50,9475600,10.45 -1992-10-02,44.50,44.75,43.00,43.75,4063600,10.51 -1992-10-01,44.75,45.13,44.25,44.25,4396400,10.63 -1992-09-30,45.00,45.50,44.50,45.13,3580800,10.84 -1992-09-29,44.50,45.50,44.00,44.88,5626400,10.78 -1992-09-28,45.00,45.00,43.75,44.75,5351200,10.75 -1992-09-25,46.25,46.50,45.25,45.50,4926400,10.93 -1992-09-24,47.25,47.75,46.25,46.25,4492000,11.11 -1992-09-23,46.00,47.50,45.50,47.50,4443200,11.41 -1992-09-22,46.75,46.75,45.25,45.75,3996800,10.99 -1992-09-21,46.75,47.75,46.25,46.50,3204400,11.17 -1992-09-18,45.75,46.88,45.25,46.50,4133600,11.17 -1992-09-17,47.25,47.25,45.38,46.00,6180000,11.05 -1992-09-16,47.75,48.25,46.50,47.00,6395600,11.29 -1992-09-15,49.25,49.25,47.75,48.25,7806800,11.59 -1992-09-14,49.00,50.00,48.50,49.50,7682400,11.89 -1992-09-11,49.00,49.25,47.50,47.63,6438000,11.44 -1992-09-10,48.00,49.50,47.50,49.25,8165600,11.83 -1992-09-09,48.00,49.25,47.75,49.00,5622400,11.77 -1992-09-08,46.75,48.00,46.50,47.75,2511200,11.47 -1992-09-04,48.25,48.25,46.75,47.25,2268800,11.35 -1992-09-03,49.00,49.25,47.75,47.75,7570000,11.47 -1992-09-02,46.50,48.75,46.50,48.50,6794400,11.65 -1992-09-01,46.25,46.50,45.75,46.50,2172000,11.17 -1992-08-31,45.00,46.25,44.75,46.00,4328800,11.05 -1992-08-28,44.25,45.25,44.00,45.00,2202400,10.81 -1992-08-27,44.75,45.13,44.25,44.50,2974800,10.69 -1992-08-26,44.25,44.50,43.25,44.25,4325600,10.63 -1992-08-25,43.25,44.50,43.25,44.38,4731200,10.66 -1992-08-24,44.25,44.75,43.25,43.25,5454400,10.39 -1992-08-21,44.75,45.25,44.00,44.63,3926400,10.72 -1992-08-20,44.75,45.00,44.25,44.75,3894800,10.75 -1992-08-19,44.63,45.25,44.50,44.50,6096800,10.69 -1992-08-18,44.50,45.25,44.50,44.75,4017600,10.75 -1992-08-17,44.25,44.75,43.75,44.75,4617600,10.75 -1992-08-14,45.00,45.25,44.50,44.75,4872400,10.72 -1992-08-13,44.50,45.50,44.25,44.75,6122000,10.72 -1992-08-12,43.75,44.25,43.25,44.13,4343600,10.57 -1992-08-11,44.50,44.50,43.00,43.50,4339200,10.42 -1992-08-10,43.25,44.50,43.00,44.13,3280800,10.57 -1992-08-07,42.00,43.75,41.50,43.38,7842400,10.39 -1992-08-06,44.25,44.50,42.75,44.00,9220800,10.54 -1992-08-05,45.50,45.50,44.50,44.75,4981200,10.72 -1992-08-04,45.00,45.75,44.75,45.50,4295600,10.90 -1992-08-03,46.75,47.25,45.50,45.75,2452400,10.96 -1992-07-31,47.25,47.50,46.75,46.75,3262000,11.20 -1992-07-30,47.25,47.50,46.75,47.25,4927600,11.32 -1992-07-29,46.63,47.75,46.50,47.25,8976400,11.32 -1992-07-28,45.50,46.50,45.25,46.50,4813600,11.14 -1992-07-27,45.75,46.50,45.25,45.25,88800,10.84 -1992-07-24,44.50,46.25,44.00,45.88,4832000,10.99 -1992-07-23,44.50,44.75,43.75,44.75,6128800,10.72 -1992-07-22,45.25,45.50,44.00,44.25,5798800,10.60 -1992-07-21,45.50,46.25,45.00,45.75,4730800,10.96 -1992-07-20,44.75,45.25,44.00,44.75,6873600,10.72 -1992-07-17,45.00,46.00,44.63,45.00,15135600,10.78 -1992-07-16,47.75,49.00,47.25,48.75,5011200,11.68 -1992-07-15,47.50,49.00,47.25,48.00,6248000,11.50 -1992-07-14,47.00,48.00,47.00,47.50,4510800,11.38 -1992-07-13,45.75,47.13,45.25,47.00,4486800,11.26 -1992-07-10,46.00,46.25,44.88,45.75,5144400,10.96 -1992-07-09,46.00,46.50,45.75,45.88,5922000,10.99 -1992-07-08,44.00,45.75,44.00,45.75,7020000,10.96 -1992-07-07,46.25,46.25,43.50,44.25,7416400,10.60 -1992-07-06,46.50,46.75,45.50,46.25,4378000,11.08 -1992-07-02,49.00,49.00,45.75,46.25,9169200,11.08 -1992-07-01,48.00,49.50,47.75,49.00,5129200,11.74 -1992-06-30,46.75,48.25,46.50,48.00,6919200,11.50 -1992-06-29,45.75,47.13,45.25,46.75,6735200,11.20 -1992-06-26,45.75,46.00,44.50,45.25,3953600,10.84 -1992-06-25,46.50,46.50,45.25,45.63,5745200,10.93 -1992-06-24,45.50,46.00,45.25,46.00,7548000,11.02 -1992-06-23,45.00,45.50,44.50,45.25,11130800,10.84 -1992-06-22,44.00,44.75,42.75,44.25,13930000,10.60 -1992-06-19,46.00,46.00,43.75,44.75,15280000,10.72 -1992-06-18,47.50,49.00,44.75,45.25,15495600,10.84 -1992-06-17,49.00,49.25,47.00,47.50,10880800,11.38 -1992-06-16,51.75,52.00,48.75,49.25,13053200,11.80 -1992-06-15,54.00,54.00,52.50,52.63,6777600,12.61 -1992-06-12,54.50,55.00,54.25,54.63,3450800,13.09 -1992-06-11,53.75,54.25,53.50,53.88,5028800,12.91 -1992-06-10,54.00,54.75,53.50,53.75,4522400,12.88 -1992-06-09,54.25,54.25,53.50,54.00,3626800,12.94 -1992-06-08,55.00,55.00,54.00,54.25,3730000,13.00 -1992-06-05,54.75,55.25,54.25,54.88,4040800,13.15 -1992-06-04,54.25,54.75,53.50,54.50,6453200,13.06 -1992-06-03,56.50,56.50,54.00,54.13,10743200,12.97 -1992-06-02,57.50,57.50,56.25,56.50,5560000,13.54 -1992-06-01,57.25,59.50,56.00,57.50,8869200,13.78 -1992-05-29,59.75,60.63,59.50,59.75,6369200,14.29 -1992-05-28,60.00,60.25,59.00,59.50,4558000,14.23 -1992-05-27,59.25,60.25,59.00,60.25,5516400,14.41 -1992-05-26,59.50,59.75,58.75,59.25,3423200,14.17 -1992-05-22,59.00,59.75,59.00,59.50,1670800,14.23 -1992-05-21,60.25,60.25,58.75,59.13,4938800,14.14 -1992-05-20,59.75,60.25,59.25,60.00,6200800,14.35 -1992-05-19,60.75,60.75,59.00,59.38,4715600,14.20 -1992-05-18,61.50,61.50,60.00,60.38,4616400,14.44 -1992-05-15,61.00,61.25,60.50,60.63,4339200,14.50 -1992-05-14,62.75,63.00,60.25,61.38,5606800,14.68 -1992-05-13,62.50,63.25,62.25,62.75,3482000,15.01 -1992-05-12,62.25,63.00,61.75,62.25,2769200,14.89 -1992-05-11,62.00,62.75,61.50,62.25,3250000,14.89 -1992-05-08,61.50,62.88,61.00,62.00,7105600,14.83 -1992-05-07,61.50,62.25,60.50,60.75,6175600,14.53 -1992-05-06,60.75,62.13,60.50,61.75,6377600,14.77 -1992-05-05,60.50,60.63,59.50,60.50,6449200,14.47 -1992-05-04,59.50,61.25,59.25,60.50,4402000,14.47 -1992-05-01,60.00,60.75,58.25,59.25,4821200,14.17 -1992-04-30,57.25,60.25,56.50,60.13,9303600,14.38 -1992-04-29,54.25,57.00,54.25,57.00,7116800,13.63 -1992-04-28,55.25,55.75,53.00,54.25,6229200,12.97 -1992-04-27,56.00,56.25,55.00,55.75,5014800,13.33 -1992-04-24,57.00,58.25,56.00,56.50,3526800,13.51 -1992-04-23,57.50,58.25,56.00,57.00,6534400,13.63 -1992-04-22,56.25,58.00,56.25,57.63,6129200,13.78 -1992-04-21,57.00,57.25,56.00,56.25,6442400,13.45 -1992-04-20,59.00,59.00,56.00,56.75,7380800,13.57 -1992-04-16,60.25,60.75,58.50,59.00,9260800,14.11 -1992-04-15,58.00,60.88,57.50,60.50,7764400,14.47 -1992-04-14,57.75,59.25,57.25,58.75,5178000,14.05 -1992-04-13,55.50,56.75,55.25,56.50,4402000,13.51 -1992-04-10,57.25,57.50,55.00,55.50,9803600,13.27 -1992-04-09,56.00,58.25,55.25,57.25,6874400,13.69 -1992-04-08,57.00,57.00,54.75,55.88,13123600,13.36 -1992-04-07,61.00,61.25,57.25,57.25,8234400,13.69 -1992-04-06,59.00,61.00,59.00,60.75,3643600,14.53 -1992-04-03,58.75,59.25,58.50,59.00,4181200,14.11 -1992-04-02,59.00,59.50,58.38,58.75,4798800,14.05 -1992-04-01,57.25,59.25,57.25,59.00,5714400,14.11 -1992-03-31,58.25,59.75,58.00,58.25,7613200,13.93 -1992-03-30,61.25,61.25,57.75,58.13,12124400,13.90 -1992-03-27,63.88,64.00,60.50,61.00,9452000,14.59 -1992-03-26,64.75,65.25,63.75,64.00,4412400,15.30 -1992-03-25,65.00,65.00,64.25,64.50,4353200,15.42 -1992-03-24,63.50,65.00,63.25,65.00,7501200,15.54 -1992-03-23,63.00,63.75,63.00,63.00,1804400,15.07 -1992-03-20,63.00,63.25,63.00,63.25,1942400,15.13 -1992-03-19,63.75,63.75,62.75,63.00,4251200,15.07 -1992-03-18,63.25,64.00,63.00,63.75,2902000,15.25 -1992-03-17,63.50,63.75,62.75,62.88,3061200,15.04 -1992-03-16,62.75,63.50,61.75,63.38,2016400,15.16 -1992-03-13,63.25,63.75,62.00,63.13,2843600,15.10 -1992-03-12,63.25,63.75,61.50,62.75,5472400,15.01 -1992-03-11,63.75,64.25,63.00,63.25,4714400,15.13 -1992-03-10,64.00,64.75,63.75,63.75,4394400,15.25 -1992-03-09,63.75,64.25,63.50,63.75,3896800,15.25 -1992-03-06,63.50,64.00,63.00,64.00,4816400,15.30 -1992-03-05,64.50,65.50,63.00,63.50,8462400,15.19 -1992-03-04,66.25,66.75,64.75,65.00,4120800,15.54 -1992-03-03,67.75,68.00,66.25,66.37,3560000,15.87 -1992-03-02,67.75,68.50,67.25,67.25,3203200,16.08 -1992-02-28,68.50,69.00,67.00,67.50,3244400,16.14 -1992-02-27,70.00,70.00,68.00,68.50,4364800,16.38 -1992-02-26,68.25,70.00,68.25,69.87,8193600,16.71 -1992-02-25,66.25,68.50,65.25,68.50,8134400,16.38 -1992-02-24,66.25,66.50,65.75,66.12,6122400,15.81 -1992-02-21,64.75,65.50,64.50,65.00,5421200,15.54 -1992-02-20,62.50,64.75,62.25,64.62,4692400,15.45 -1992-02-19,62.75,63.00,61.75,62.00,3426400,14.83 -1992-02-18,64.25,64.50,62.75,62.75,2442000,15.01 -1992-02-14,63.75,64.25,63.25,64.12,2610800,15.33 -1992-02-13,65.25,65.25,63.75,64.25,2734400,15.34 -1992-02-12,63.75,65.50,63.00,65.25,4931200,15.57 -1992-02-11,63.00,63.75,62.25,62.88,4378800,15.01 -1992-02-10,64.00,64.25,63.00,63.13,3091200,15.07 -1992-02-07,64.25,64.75,62.75,64.00,5285600,15.28 -1992-02-06,65.75,66.00,64.00,64.12,3330000,15.30 -1992-02-05,66.25,66.75,65.12,66.12,5772400,15.78 -1992-02-04,65.75,66.25,65.00,65.75,6896400,15.69 -1992-02-03,64.75,66.25,64.50,65.75,5652000,15.69 -1992-01-31,64.00,65.25,63.50,64.75,5164400,15.46 -1992-01-30,63.50,63.75,62.75,63.75,3128800,15.22 -1992-01-29,64.75,65.75,63.25,63.25,5164400,15.10 -1992-01-28,64.75,65.37,63.00,65.25,6206800,15.57 -1992-01-27,64.75,65.25,64.25,64.50,2992000,15.40 -1992-01-24,64.50,65.75,64.00,64.62,6356400,15.42 -1992-01-23,64.25,64.75,63.00,64.50,4953200,15.40 -1992-01-22,61.50,63.75,61.25,63.50,6560000,15.16 -1992-01-21,64.25,64.25,61.00,61.13,6938000,14.59 -1992-01-20,64.50,65.25,64.00,64.00,7492400,15.28 -1992-01-17,67.75,69.00,64.75,64.75,30308800,15.46 -1992-01-16,63.75,64.25,62.50,62.75,10485200,14.98 -1992-01-15,64.50,65.00,63.00,63.50,11652400,15.16 -1992-01-14,62.25,64.75,62.25,64.50,9789200,15.40 -1992-01-13,62.25,62.75,61.50,62.00,3858800,14.80 -1992-01-10,61.50,62.50,61.00,62.25,7012400,14.86 -1992-01-09,60.50,62.25,60.25,62.25,7450800,14.86 -1992-01-08,58.50,61.25,58.50,60.50,8330800,14.44 -1992-01-07,57.50,59.50,57.50,59.13,5059200,14.11 -1992-01-06,58.75,59.00,57.75,58.00,4080000,13.84 -1992-01-03,60.00,60.25,58.25,59.00,6814400,14.08 -1992-01-02,55.75,59.75,55.50,59.50,8357600,14.20 -1991-12-31,57.38,58.00,56.00,56.38,4802000,13.46 -1991-12-30,55.00,57.25,55.00,56.75,6580800,13.55 -1991-12-27,54.75,55.75,54.50,55.00,6008000,13.13 -1991-12-26,52.75,55.00,52.25,54.88,4805600,13.10 -1991-12-24,52.00,53.75,51.75,52.25,6742400,12.47 -1991-12-23,50.50,51.75,50.00,51.50,3686800,12.29 -1991-12-20,51.25,51.50,50.25,50.25,4588000,11.99 -1991-12-19,51.25,51.75,50.75,50.75,4140800,12.11 -1991-12-18,50.25,52.00,50.00,51.75,6678000,12.35 -1991-12-17,50.50,51.00,50.25,50.50,3502400,12.05 -1991-12-16,50.38,50.75,50.00,50.50,2777600,12.05 -1991-12-13,49.75,50.75,49.75,50.38,3418000,12.03 -1991-12-12,49.38,49.75,49.00,49.38,3297600,11.79 -1991-12-11,49.25,49.75,48.50,49.00,3031200,11.70 -1991-12-10,49.00,49.50,48.50,49.13,4390000,11.73 -1991-12-09,49.00,50.00,48.75,49.13,3502000,11.73 -1991-12-06,49.50,49.75,48.50,48.75,7055200,11.64 -1991-12-05,50.50,51.00,49.25,50.00,3555600,11.93 -1991-12-04,50.75,50.75,50.00,50.50,2897600,12.05 -1991-12-03,52.00,52.00,50.25,50.50,3692400,12.05 -1991-12-02,50.75,52.00,50.00,51.75,4250000,12.35 -1991-11-29,50.50,51.50,50.50,50.75,1227600,12.11 -1991-11-27,51.25,51.50,50.50,51.00,2268800,12.17 -1991-11-26,51.50,52.00,50.00,51.50,4982000,12.29 -1991-11-25,51.00,52.25,51.00,51.25,2802000,12.23 -1991-11-22,51.00,51.75,50.25,51.25,3502400,12.23 -1991-11-21,50.50,51.75,50.50,51.00,3823200,12.17 -1991-11-20,51.25,52.00,50.25,50.50,6005600,12.05 -1991-11-19,51.75,51.75,49.75,51.25,10216400,12.23 -1991-11-18,50.00,52.50,50.00,52.13,8530000,12.44 -1991-11-15,54.50,54.75,49.75,50.00,9186400,11.91 -1991-11-14,54.25,55.25,54.00,54.75,6733600,13.04 -1991-11-13,54.00,54.50,53.50,54.13,6640000,12.89 -1991-11-12,54.25,54.75,53.75,54.50,5972000,12.98 -1991-11-11,53.50,54.50,53.25,53.75,5896800,12.80 -1991-11-08,51.25,53.75,51.00,53.25,13435200,12.68 -1991-11-07,48.50,50.50,48.25,49.75,10618800,11.85 -1991-11-06,49.00,49.25,47.50,48.00,8466400,11.43 -1991-11-05,49.75,50.50,48.75,48.75,7711200,11.61 -1991-11-04,50.75,50.75,48.50,49.75,6983200,11.85 -1991-11-01,51.25,52.00,50.50,51.00,7203600,12.14 -1991-10-31,50.75,51.75,50.00,51.50,8300800,12.26 -1991-10-30,52.00,52.75,49.50,49.75,5302400,11.85 -1991-10-29,51.50,52.00,50.75,51.75,3624400,12.32 -1991-10-28,51.50,51.75,50.75,51.50,2792400,12.26 -1991-10-25,51.75,52.25,50.75,51.25,3832000,12.20 -1991-10-24,53.00,53.25,51.50,52.13,6372400,12.41 -1991-10-23,55.00,55.25,52.75,53.13,6046400,12.65 -1991-10-22,55.50,56.25,54.50,54.50,7456400,12.98 -1991-10-21,55.25,55.88,54.25,54.75,4172000,13.04 -1991-10-18,55.13,55.50,54.50,55.00,15964400,13.10 -1991-10-17,53.00,53.25,51.50,52.38,5423200,12.47 -1991-10-16,52.50,54.00,52.25,53.50,7182000,12.74 -1991-10-15,50.50,52.50,50.00,52.50,10300800,12.50 -1991-10-14,49.00,50.25,48.75,49.88,4015600,11.88 -1991-10-11,48.13,48.88,46.50,48.50,4292000,11.55 -1991-10-10,48.75,49.00,46.75,47.75,5623200,11.37 -1991-10-09,48.25,48.75,47.75,48.00,4752400,11.43 -1991-10-08,48.13,48.50,46.50,48.25,6170000,11.49 -1991-10-07,48.00,48.75,47.50,48.13,2328000,11.46 -1991-10-04,48.00,48.75,47.50,48.25,2854400,11.49 -1991-10-03,50.00,50.00,47.50,47.75,6478000,11.37 -1991-10-02,51.75,51.75,49.50,49.75,643600,11.85 -1991-10-01,49.25,51.25,49.00,50.75,4698800,12.08 -1991-09-30,49.25,49.75,49.00,49.50,2266800,11.79 -1991-09-27,50.00,50.75,48.75,49.00,2245200,11.67 -1991-09-26,50.25,50.25,49.00,50.00,2556800,11.91 -1991-09-25,50.25,50.50,49.25,50.50,1959200,12.02 -1991-09-24,49.50,50.38,48.25,50.25,3805600,11.97 -1991-09-23,50.00,50.75,49.25,49.50,3136800,11.79 -1991-09-20,49.75,51.00,49.50,50.63,6742000,12.06 -1991-09-19,50.25,50.50,49.50,49.75,6374400,11.85 -1991-09-18,48.75,50.50,48.50,50.13,4342000,11.94 -1991-09-17,47.00,49.00,46.75,49.00,4856400,11.67 -1991-09-16,49.25,49.25,46.50,47.25,7365600,11.25 -1991-09-13,50.00,50.25,48.50,48.63,5974400,11.58 -1991-09-12,51.25,51.25,49.75,50.63,4267600,12.06 -1991-09-11,50.75,51.00,49.50,50.50,6378000,12.02 -1991-09-10,52.75,53.38,49.75,50.13,6535600,11.94 -1991-09-09,51.75,53.50,51.50,53.25,4538000,12.68 -1991-09-06,51.00,51.75,50.50,51.50,2848800,12.26 -1991-09-05,51.50,51.75,50.75,51.00,2793600,12.14 -1991-09-04,52.75,52.75,51.38,51.50,4299200,12.26 -1991-09-03,52.75,53.25,52.00,52.50,2443200,12.50 -1991-08-30,53.00,53.25,52.25,53.00,2363200,12.62 -1991-08-29,53.25,53.88,52.50,53.00,4053200,12.62 -1991-08-28,54.00,54.25,53.13,53.25,3843600,12.68 -1991-08-27,53.00,54.00,52.75,54.00,3597600,12.86 -1991-08-26,53.00,53.50,52.50,53.00,3644400,12.62 -1991-08-23,54.00,55.50,52.75,53.00,8601200,12.62 -1991-08-22,54.00,54.75,53.75,54.25,5936400,12.92 -1991-08-21,52.50,54.13,52.00,53.75,7987600,12.80 -1991-08-20,51.50,51.75,50.50,51.00,7123600,12.14 -1991-08-19,49.50,51.63,48.50,50.50,11538000,12.02 -1991-08-16,52.75,54.25,52.25,53.25,5689200,12.65 -1991-08-15,55.00,55.00,53.00,53.25,5219200,12.65 -1991-08-14,54.75,55.00,53.88,54.88,7173200,13.04 -1991-08-13,52.00,54.00,52.00,53.50,10255200,12.71 -1991-08-12,50.75,52.25,50.50,51.75,5096400,12.29 -1991-08-09,50.50,51.00,49.75,50.75,5533600,12.06 -1991-08-08,50.75,51.75,50.00,50.50,6769200,12.00 -1991-08-07,49.50,51.00,49.38,50.38,7578800,11.97 -1991-08-06,48.75,50.25,47.75,49.50,7890800,11.76 -1991-08-05,49.75,49.75,48.25,48.50,3620800,11.52 -1991-08-02,49.75,50.25,49.00,50.00,9767600,11.88 -1991-08-01,46.00,49.25,45.75,49.13,16023600,11.67 -1991-07-31,46.50,46.88,45.00,46.25,3689200,10.99 -1991-07-30,45.50,46.75,45.50,46.50,3281200,11.05 -1991-07-29,45.25,45.50,44.50,45.50,1916800,10.81 -1991-07-26,45.75,45.75,44.75,44.88,2657600,10.66 -1991-07-25,45.25,45.75,45.00,45.25,2366800,10.75 -1991-07-24,45.25,45.75,44.50,45.00,4703200,10.69 -1991-07-23,46.25,46.50,44.50,45.00,4770000,10.69 -1991-07-22,45.75,46.25,45.50,46.00,3882000,10.93 -1991-07-19,45.25,46.25,45.00,46.00,4601200,10.93 -1991-07-18,44.00,45.13,43.00,44.88,14240000,10.66 -1991-07-17,43.50,44.50,42.25,42.50,7474400,10.10 -1991-07-16,45.50,45.75,43.50,43.75,7966400,10.39 -1991-07-15,46.75,46.75,45.50,45.50,4932400,10.81 -1991-07-12,47.25,47.25,46.25,46.75,4753200,11.11 -1991-07-11,47.00,47.25,46.00,46.75,5217600,11.11 -1991-07-10,47.50,48.25,46.75,47.25,5610000,11.23 -1991-07-09,47.25,48.25,46.50,46.88,8091200,11.14 -1991-07-08,45.25,47.25,45.00,46.75,10971200,11.11 -1991-07-05,43.00,46.00,42.75,45.63,11842000,10.84 -1991-07-03,42.25,43.50,41.75,43.13,11087600,10.25 -1991-07-02,42.25,42.75,41.75,42.25,4296800,10.04 -1991-07-01,42.25,43.00,41.75,42.50,6979200,10.10 -1991-06-28,42.25,42.50,40.25,41.50,8102400,9.86 -1991-06-27,42.50,42.75,41.75,42.50,5400000,10.10 -1991-06-26,42.75,43.50,42.25,43.00,8958000,10.22 -1991-06-25,42.00,43.00,41.75,42.38,8151200,10.07 -1991-06-24,41.75,42.25,41.25,41.75,7443600,9.92 -1991-06-21,42.00,42.50,41.75,42.00,7378800,9.98 -1991-06-20,41.25,42.00,40.75,42.00,5158000,9.98 -1991-06-19,41.75,42.25,41.25,41.75,6408000,9.92 -1991-06-18,42.25,43.25,41.50,42.13,8749200,10.01 -1991-06-17,41.00,42.25,41.00,42.00,5966800,9.98 -1991-06-14,42.75,42.75,40.75,41.13,8049200,9.77 -1991-06-13,42.50,43.00,41.75,42.13,7565200,10.01 -1991-06-12,44.00,44.75,41.25,42.38,15580000,10.07 -1991-06-11,45.00,45.50,44.25,44.63,6742400,10.60 -1991-06-10,46.00,47.13,45.75,46.00,5991200,10.93 -1991-06-07,46.25,47.00,45.63,46.13,5463600,10.96 -1991-06-06,48.25,48.25,46.50,46.63,6028000,11.08 -1991-06-05,49.25,49.25,47.75,48.00,4760800,11.40 -1991-06-04,49.50,49.50,48.50,49.13,6593600,11.67 -1991-06-03,47.00,49.50,46.75,49.25,7870800,11.70 -1991-05-31,47.50,47.75,46.25,47.00,7792400,11.17 -1991-05-30,47.00,47.75,46.50,47.63,5663600,11.32 -1991-05-29,46.25,47.75,45.88,47.00,13733600,11.17 -1991-05-28,46.00,46.25,45.25,46.00,6124400,10.93 -1991-05-24,45.50,46.00,45.00,45.88,3484800,10.90 -1991-05-23,46.50,46.75,44.75,45.13,7458800,10.72 -1991-05-22,45.75,46.50,45.50,46.25,8137600,10.99 -1991-05-21,45.25,46.50,44.75,45.25,12500000,10.75 -1991-05-20,47.25,47.50,44.00,44.25,9365200,10.51 -1991-05-17,48.75,48.75,46.50,47.00,16836800,11.14 -1991-05-16,51.00,51.25,48.50,49.00,13652000,11.61 -1991-05-15,51.50,52.00,49.00,50.50,18530800,11.97 -1991-05-14,52.75,53.75,52.50,53.50,7763600,12.68 -1991-05-13,52.25,53.50,51.50,52.75,8763600,12.50 -1991-05-10,51.50,53.25,50.75,51.25,8652000,12.14 -1991-05-09,50.00,51.50,49.75,50.75,8523200,12.03 -1991-05-08,50.75,50.75,49.25,49.75,6332400,11.79 -1991-05-07,51.00,51.25,50.50,50.63,9671200,12.00 -1991-05-06,48.50,50.50,48.25,50.25,7596400,11.91 -1991-05-03,49.00,49.50,48.25,49.00,8717600,11.61 -1991-05-02,47.75,49.75,47.50,49.00,28973600,11.61 -1991-05-01,48.00,49.00,47.00,47.25,66732000,11.20 -1991-04-30,57.75,58.25,54.50,55.00,25413600,13.03 -1991-04-29,58.50,60.25,58.25,58.25,7395200,13.80 -1991-04-26,58.50,59.00,57.75,58.63,4481200,13.89 -1991-04-25,59.75,59.75,58.50,58.50,11276800,13.86 -1991-04-24,61.75,62.00,60.50,60.75,3769200,14.40 -1991-04-23,62.25,63.00,60.25,61.50,8494400,14.57 -1991-04-22,59.50,62.00,58.75,61.50,9190000,14.57 -1991-04-19,61.00,61.50,59.50,59.63,10272400,14.13 -1991-04-18,62.75,63.00,60.75,61.00,8853600,14.46 -1991-04-17,65.00,65.00,62.00,63.25,11533600,14.99 -1991-04-16,63.25,64.50,62.50,64.25,22176800,15.23 -1991-04-15,61.75,64.50,60.00,62.25,60732400,14.75 -1991-04-12,71.50,73.25,69.75,71.75,13140000,17.00 -1991-04-11,67.75,71.37,67.50,71.00,12710800,16.83 -1991-04-10,68.50,69.25,66.75,66.87,7733600,15.85 -1991-04-09,69.75,70.00,68.25,68.75,4280800,16.29 -1991-04-08,69.25,70.00,68.75,70.00,2604400,16.59 -1991-04-05,71.75,71.75,68.75,69.37,5567600,16.44 -1991-04-04,70.00,72.00,69.50,71.50,6024400,16.94 -1991-04-03,72.50,72.75,70.00,70.00,8585200,16.59 -1991-04-02,69.00,72.75,68.50,72.75,10473600,17.24 -1991-04-01,68.00,69.50,67.50,68.50,4218000,16.23 -1991-03-28,69.25,70.00,67.75,68.00,2816800,16.11 -1991-03-27,70.00,70.25,68.50,69.25,6812400,16.41 -1991-03-26,64.75,70.25,64.75,70.00,11935200,16.59 -1991-03-25,63.50,65.00,63.25,64.50,4858800,15.28 -1991-03-22,64.00,64.75,62.25,63.25,12096400,14.99 -1991-03-21,68.25,68.75,63.75,64.75,10600000,15.34 -1991-03-20,69.25,69.50,66.87,67.75,12939200,16.06 -1991-03-19,66.50,70.25,65.75,69.50,15100000,16.47 -1991-03-18,65.75,68.25,65.75,67.75,7645200,16.06 -1991-03-15,65.75,66.50,65.25,66.25,7335600,15.70 -1991-03-14,66.75,67.50,64.50,65.25,8126400,15.46 -1991-03-13,62.75,66.50,62.75,66.25,6253200,15.70 -1991-03-12,63.00,63.75,62.50,62.88,8360000,14.90 -1991-03-11,64.50,64.75,62.25,63.50,6276400,15.05 -1991-03-08,67.75,68.25,65.00,65.00,11522400,15.40 -1991-03-07,63.50,67.50,63.25,67.25,11497600,15.94 -1991-03-06,64.00,65.62,62.88,63.00,18731200,14.93 -1991-03-05,59.00,63.25,59.00,63.13,15769200,14.96 -1991-03-04,58.00,58.75,57.00,58.38,3175600,13.83 -1991-03-01,57.00,59.00,57.00,57.75,4518800,13.69 -1991-02-28,58.25,58.50,56.25,57.25,8120000,13.57 -1991-02-27,58.25,58.50,57.50,58.25,6243200,13.80 -1991-02-26,57.50,58.75,56.50,58.25,8934400,13.80 -1991-02-25,60.25,60.50,57.50,58.00,12848800,13.74 -1991-02-22,59.00,61.75,58.50,59.75,8320800,14.16 -1991-02-21,61.25,62.25,58.75,59.00,6826400,13.98 -1991-02-20,59.50,61.75,59.25,61.00,7646800,14.46 -1991-02-19,57.50,60.25,57.38,60.00,8080800,14.22 -1991-02-15,57.25,58.50,57.25,57.63,13067600,13.66 -1991-02-14,60.00,60.00,56.75,57.13,13493200,13.51 -1991-02-13,60.00,60.25,58.00,60.00,9130800,14.19 -1991-02-12,61.00,61.25,59.38,60.00,8042000,14.19 -1991-02-11,60.00,61.50,59.75,61.38,11546400,14.51 -1991-02-08,57.50,60.25,57.50,59.88,11220000,14.16 -1991-02-07,57.00,58.75,55.75,57.75,18587600,13.66 -1991-02-06,57.75,58.25,56.50,56.88,7965200,13.45 -1991-02-05,55.25,58.00,54.75,57.75,12740000,13.66 -1991-02-04,55.75,56.00,55.00,55.25,9569200,13.07 -1991-02-01,55.50,57.88,55.50,55.75,15897600,13.18 -1991-01-31,55.50,56.00,54.75,55.50,8677600,13.12 -1991-01-30,53.25,55.75,53.25,55.50,12043200,13.12 -1991-01-29,54.25,54.50,52.25,53.75,7708800,12.71 -1991-01-28,53.25,55.25,53.25,54.50,9771200,12.89 -1991-01-25,52.00,53.63,52.00,53.50,8012000,12.65 -1991-01-24,51.50,52.75,51.50,52.13,8374400,12.33 -1991-01-23,51.25,52.25,51.00,51.75,8725600,12.24 -1991-01-22,51.00,52.50,50.50,51.25,15296400,12.12 -1991-01-21,49.75,51.50,49.75,50.75,11595200,12.00 -1991-01-18,48.75,50.75,48.50,50.25,33691200,11.88 -1991-01-17,52.50,52.75,49.00,51.25,21137600,12.12 -1991-01-16,47.00,50.00,46.75,49.75,13968800,11.76 -1991-01-15,46.50,46.75,46.00,46.75,6870000,11.06 -1991-01-14,46.00,46.75,46.00,46.25,7535600,10.94 -1991-01-11,47.00,47.25,46.00,47.00,11003200,11.11 -1991-01-10,45.75,47.25,45.75,47.13,15562400,11.15 -1991-01-09,44.25,46.00,43.75,45.25,16692400,10.70 -1991-01-08,43.75,43.88,42.50,43.25,7816400,10.23 -1991-01-07,43.00,45.25,43.00,43.25,11111200,10.23 -1991-01-04,43.00,44.25,43.00,43.25,5062400,10.23 -1991-01-03,43.50,44.25,43.00,43.00,5365600,10.17 -1991-01-02,42.75,44.00,42.00,43.50,5543600,10.29 -1990-12-31,43.00,43.25,42.75,43.00,1593200,10.17 -1990-12-28,43.25,43.50,42.75,43.00,2285200,10.17 -1990-12-27,43.25,44.00,43.25,43.50,3492000,10.29 -1990-12-26,44.00,44.25,43.00,43.75,3682000,10.35 -1990-12-24,44.75,45.00,44.00,44.00,2106800,10.40 -1990-12-21,44.25,45.25,43.50,45.00,12363200,10.64 -1990-12-20,41.25,44.50,41.25,44.00,14326400,10.40 -1990-12-19,42.50,42.50,41.13,41.88,5036800,9.90 -1990-12-18,41.00,42.50,40.75,42.25,7899200,9.99 -1990-12-17,39.00,40.50,39.00,40.13,4683600,9.49 -1990-12-14,40.25,40.50,39.50,39.88,3126400,9.43 -1990-12-13,39.50,41.00,39.50,40.75,5752000,9.64 -1990-12-12,39.75,40.00,39.00,39.63,8664400,9.37 -1990-12-11,41.25,41.50,40.00,40.00,12438000,9.46 -1990-12-10,42.25,42.50,41.50,41.75,8966400,9.87 -1990-12-07,41.00,42.75,41.00,42.50,11781200,10.05 -1990-12-06,41.25,41.75,40.50,41.25,19013600,9.75 -1990-12-05,38.50,40.25,37.88,40.13,7822000,9.49 -1990-12-04,37.50,38.75,37.50,38.50,5453200,9.10 -1990-12-03,37.25,38.25,37.00,38.13,5922400,9.02 -1990-11-30,36.25,37.25,36.25,36.75,4350800,8.69 -1990-11-29,37.00,37.00,36.25,36.75,4528000,8.69 -1990-11-28,37.75,38.50,36.75,36.75,6250800,8.69 -1990-11-27,37.00,38.25,36.75,37.50,5899200,8.87 -1990-11-26,36.00,37.00,36.00,36.75,2925600,8.69 -1990-11-23,36.25,37.00,36.00,36.38,1911200,8.60 -1990-11-21,35.25,36.25,34.75,36.13,4400800,8.54 -1990-11-20,36.50,36.75,35.25,35.50,5490800,8.39 -1990-11-19,35.50,36.38,35.25,36.38,8017600,8.60 -1990-11-16,35.75,36.00,34.75,35.13,6545200,8.31 -1990-11-15,36.75,37.00,35.50,36.00,5787600,8.48 -1990-11-14,35.75,37.25,35.75,37.00,6819200,8.72 -1990-11-13,36.25,36.50,35.75,36.00,5086400,8.48 -1990-11-12,35.50,36.75,35.25,36.25,5192000,8.54 -1990-11-09,35.00,35.75,34.50,35.50,7102000,8.37 -1990-11-08,33.00,35.00,33.00,34.50,7136400,8.13 -1990-11-07,33.50,33.75,32.63,33.25,7254400,7.84 -1990-11-06,33.50,34.50,33.25,33.50,6620800,7.90 -1990-11-05,32.25,33.50,32.00,33.25,6604400,7.84 -1990-11-02,30.50,32.38,30.50,31.75,5323200,7.48 -1990-11-01,30.50,31.00,29.75,30.50,3258800,7.19 -1990-10-31,30.50,31.87,30.25,30.75,5331200,7.25 -1990-10-30,29.75,30.75,28.87,30.37,3513600,7.16 -1990-10-29,30.25,30.50,29.75,29.87,4415600,7.04 -1990-10-26,29.75,31.25,29.75,30.00,4811200,7.07 -1990-10-25,30.25,31.25,29.62,30.00,5481200,7.07 -1990-10-24,30.75,31.00,30.00,30.50,5079200,7.19 -1990-10-23,31.00,31.50,30.25,31.00,5969200,7.31 -1990-10-22,31.50,31.50,30.50,31.12,9041200,7.33 -1990-10-19,31.25,31.75,30.25,31.37,33363200,7.39 -1990-10-18,26.50,28.75,26.50,28.50,11255600,6.72 -1990-10-17,25.25,26.50,25.00,26.50,11059200,6.25 -1990-10-16,27.50,27.50,24.25,25.00,10913200,5.89 -1990-10-15,28.50,28.75,26.62,27.75,7190000,6.54 -1990-10-12,28.25,28.50,27.00,28.25,8169200,6.66 -1990-10-11,26.75,27.87,25.50,27.75,7376800,6.54 -1990-10-10,27.25,28.00,26.00,26.50,5283600,6.25 -1990-10-09,28.50,29.00,27.75,28.00,4321200,6.60 -1990-10-08,28.75,29.25,28.25,29.12,2218800,6.86 -1990-10-05,27.00,28.75,27.00,28.00,3572000,6.60 -1990-10-04,26.75,28.00,26.25,28.00,7638800,6.60 -1990-10-03,29.75,29.75,26.75,27.00,9591200,6.36 -1990-10-02,31.00,32.00,29.50,29.62,9699200,6.98 -1990-10-01,29.50,31.00,29.25,30.50,5581200,7.19 -1990-09-28,28.50,29.00,27.25,29.00,6291200,6.83 -1990-09-27,30.00,30.50,28.00,28.25,5085600,6.66 -1990-09-26,30.00,30.50,29.75,29.75,3363200,7.01 -1990-09-25,30.50,30.75,29.25,30.00,5642000,7.07 -1990-09-24,31.50,31.50,29.75,30.25,4961200,7.13 -1990-09-21,32.00,32.50,31.00,31.50,5503600,7.42 -1990-09-20,32.25,32.25,31.25,31.62,3607600,7.45 -1990-09-19,33.25,33.75,32.00,32.50,6536800,7.66 -1990-09-18,33.75,33.75,33.00,33.38,4456400,7.87 -1990-09-17,34.00,35.25,33.50,33.75,2782000,7.95 -1990-09-14,33.50,34.25,33.25,34.00,4084400,8.01 -1990-09-13,34.50,34.75,33.00,33.75,3492400,7.95 -1990-09-12,34.50,34.50,33.50,34.00,3600800,8.01 -1990-09-11,36.00,36.13,33.75,34.00,6370800,8.01 -1990-09-10,37.00,37.00,35.75,35.75,2732400,8.43 -1990-09-07,35.50,36.75,35.13,36.38,2098800,8.57 -1990-09-06,35.50,36.00,35.25,35.75,3134800,8.43 -1990-09-05,37.25,37.25,35.75,36.00,2292000,8.48 -1990-09-04,36.50,37.50,36.50,37.00,2974800,8.72 -1990-08-31,36.00,37.25,36.00,37.00,3570000,8.72 -1990-08-30,37.25,37.50,36.00,36.25,4388800,8.54 -1990-08-29,38.00,38.13,36.75,37.25,5407600,8.78 -1990-08-28,37.50,38.38,37.25,38.13,2877600,8.99 -1990-08-27,36.75,38.00,36.25,37.75,4214800,8.90 -1990-08-24,35.25,36.00,34.75,35.50,2634400,8.37 -1990-08-23,34.25,35.00,33.50,34.50,5138800,8.13 -1990-08-22,37.00,37.00,34.88,35.13,4395600,8.28 -1990-08-21,35.75,36.75,35.25,36.25,5769200,8.54 -1990-08-20,36.50,37.50,36.25,36.75,2681200,8.66 -1990-08-17,38.50,38.50,35.75,36.50,8806400,8.58 -1990-08-16,39.00,39.63,38.50,38.50,4438800,9.05 -1990-08-15,40.00,40.25,39.25,39.25,3292000,9.22 -1990-08-14,40.00,40.00,39.25,39.75,3520800,9.34 -1990-08-13,38.00,40.00,37.88,39.88,5584400,9.37 -1990-08-10,38.75,39.25,38.25,38.75,3683600,9.11 -1990-08-09,40.25,40.50,39.25,39.50,3443600,9.28 -1990-08-08,39.50,40.75,39.50,40.13,3674400,9.43 -1990-08-07,40.25,40.63,38.75,39.50,7096400,9.28 -1990-08-06,39.00,40.50,38.50,39.50,6425600,9.28 -1990-08-03,43.50,43.75,39.75,41.25,9609200,9.69 -1990-08-02,41.25,43.75,41.25,43.50,7973600,10.22 -1990-08-01,42.00,42.75,41.50,42.38,3350800,9.96 -1990-07-31,42.50,42.75,41.50,42.00,3444800,9.87 -1990-07-30,40.75,42.50,40.75,42.38,3058800,9.96 -1990-07-27,41.25,41.75,40.50,41.38,2240000,9.72 -1990-07-26,42.25,42.50,41.00,41.38,2885600,9.72 -1990-07-25,42.00,43.25,41.75,42.25,3762400,9.93 -1990-07-24,42.00,42.25,41.00,42.13,6928800,9.90 -1990-07-23,41.00,41.75,40.00,41.50,9655200,9.75 -1990-07-20,42.00,42.50,40.75,41.00,6858000,9.63 -1990-07-19,40.75,42.50,40.00,41.75,20932400,9.81 -1990-07-18,44.50,45.00,43.00,44.63,10309200,10.49 -1990-07-17,45.75,46.00,44.00,44.25,4892000,10.40 -1990-07-16,46.75,47.13,45.25,45.63,6428000,10.72 -1990-07-13,47.50,47.75,46.75,46.75,8254400,10.99 -1990-07-12,46.75,47.50,46.50,47.38,6537600,11.13 -1990-07-11,46.75,47.00,45.75,47.00,8808800,11.04 -1990-07-10,47.00,47.50,46.75,47.00,12923600,11.04 -1990-07-09,45.00,47.00,44.75,46.63,11281200,10.96 -1990-07-06,43.50,45.00,43.25,44.75,7481200,10.52 -1990-07-05,43.75,44.25,43.25,43.50,3859200,10.22 -1990-07-03,43.88,44.50,43.75,44.00,3572400,10.34 -1990-07-02,44.50,44.50,43.75,44.00,4856400,10.34 -1990-06-29,43.00,44.88,42.75,44.75,11622000,10.52 -1990-06-28,42.75,43.25,41.75,43.00,8930000,10.10 -1990-06-27,40.75,42.00,40.25,41.50,3490800,9.75 -1990-06-26,41.75,42.00,40.38,40.63,4558800,9.55 -1990-06-25,41.50,41.75,40.25,41.25,4378000,9.69 -1990-06-22,42.00,42.63,41.25,41.50,10154400,9.75 -1990-06-21,40.00,42.00,40.00,41.88,7455600,9.84 -1990-06-20,39.88,40.25,39.75,40.00,5530000,9.40 -1990-06-19,39.00,39.75,38.38,39.63,5623600,9.31 -1990-06-18,39.25,39.50,39.00,39.25,3988800,9.22 -1990-06-15,39.75,40.00,39.13,39.50,5163600,9.28 -1990-06-14,40.00,40.25,39.25,39.75,5018000,9.34 -1990-06-13,40.38,40.75,39.75,39.75,4963600,9.34 -1990-06-12,39.13,40.50,38.75,40.50,5902000,9.52 -1990-06-11,37.75,39.00,37.75,39.00,5661200,9.16 -1990-06-08,38.50,38.50,37.50,38.25,11926800,8.99 -1990-06-07,39.50,39.75,38.50,39.00,6668800,9.16 -1990-06-06,39.00,39.50,38.75,39.50,7563600,9.28 -1990-06-05,41.00,41.00,39.00,39.50,10702000,9.28 -1990-06-04,40.75,41.00,39.75,40.75,6412400,9.58 -1990-06-01,41.38,42.00,40.75,40.75,5624400,9.58 -1990-05-31,41.50,41.50,41.00,41.25,3682400,9.69 -1990-05-30,41.63,41.75,41.25,41.38,9890000,9.72 -1990-05-29,40.00,41.25,39.25,41.00,8689200,9.63 -1990-05-25,39.50,40.75,39.00,40.00,11562400,9.40 -1990-05-24,42.25,42.25,41.50,42.00,5296400,9.87 -1990-05-23,41.25,42.50,41.25,42.00,7417600,9.87 -1990-05-22,40.13,41.50,40.00,41.38,10772000,9.72 -1990-05-21,39.50,40.00,38.75,39.50,9382400,9.28 -1990-05-18,41.25,41.50,39.50,39.75,9248000,9.31 -1990-05-17,41.75,42.25,41.00,41.50,5488000,9.72 -1990-05-16,41.75,41.75,41.00,41.63,3139200,9.76 -1990-05-15,41.38,42.00,41.00,41.75,5343600,9.78 -1990-05-14,42.75,42.75,41.25,41.75,8088000,9.78 -1990-05-11,41.38,42.75,40.75,42.63,7691200,9.99 -1990-05-10,41.75,41.75,40.50,41.38,6413600,9.70 -1990-05-09,41.63,42.00,41.25,41.88,3491200,9.81 -1990-05-08,41.00,42.00,41.00,41.75,4025600,9.78 -1990-05-07,39.75,41.75,39.75,41.50,4866400,9.72 -1990-05-04,40.00,40.75,39.25,40.00,6063200,9.37 -1990-05-03,39.75,40.25,39.75,40.00,5950800,9.37 -1990-05-02,39.75,40.00,39.25,39.75,4857600,9.31 -1990-05-01,39.75,40.00,39.38,39.63,5845200,9.29 -1990-04-30,39.25,39.75,39.00,39.38,4888800,9.23 -1990-04-27,39.00,39.50,38.75,39.13,4178800,9.17 -1990-04-26,39.00,39.50,38.13,38.88,5098000,9.11 -1990-04-25,38.75,39.00,38.25,38.75,4743200,9.08 -1990-04-24,40.00,40.50,38.50,38.75,10852000,9.08 -1990-04-23,40.25,40.50,39.50,39.75,4597600,9.31 -1990-04-20,40.88,41.50,39.75,40.25,11573600,9.43 -1990-04-19,41.75,43.13,40.00,40.25,17215600,9.43 -1990-04-18,43.25,43.75,42.50,43.25,6925200,10.13 -1990-04-17,43.25,43.50,42.75,43.25,4683600,10.13 -1990-04-16,43.50,44.25,43.25,43.75,8116400,10.25 -1990-04-12,43.00,44.00,42.50,43.25,7566800,10.13 -1990-04-11,41.50,43.00,41.50,42.50,7620000,9.96 -1990-04-10,41.25,42.00,41.00,41.25,4695600,9.67 -1990-04-09,39.75,41.50,39.50,41.13,3771200,9.64 -1990-04-06,40.25,41.25,39.75,39.88,4235600,9.35 -1990-04-05,41.00,41.25,40.00,40.25,3877600,9.43 -1990-04-04,41.50,42.00,40.75,41.25,5363200,9.67 -1990-04-03,40.50,41.75,40.50,41.75,5006400,9.78 -1990-04-02,40.00,40.63,39.50,40.25,5332000,9.43 -1990-03-30,40.00,41.00,40.00,40.25,7986400,9.43 -1990-03-29,41.00,41.50,40.75,41.13,3472000,9.64 -1990-03-28,42.00,42.13,41.00,41.25,3696800,9.67 -1990-03-27,42.00,42.25,41.25,42.00,3033600,9.84 -1990-03-26,42.50,43.38,42.00,42.25,4581200,9.90 -1990-03-23,41.25,43.00,41.00,42.25,8155200,9.90 -1990-03-22,41.75,42.25,40.75,40.75,8292400,9.55 -1990-03-21,41.25,42.25,41.25,41.63,5463200,9.76 -1990-03-20,42.25,43.00,40.75,41.38,13984400,9.70 -1990-03-19,40.50,42.50,40.00,42.38,15433200,9.93 -1990-03-16,40.00,40.75,39.13,40.25,23042400,9.43 -1990-03-15,36.50,38.00,36.50,36.75,4302000,8.61 -1990-03-14,36.75,37.25,36.50,37.00,3654800,8.67 -1990-03-13,36.50,37.25,36.25,36.88,5321200,8.64 -1990-03-12,37.25,37.50,36.25,36.63,5864400,8.58 -1990-03-09,36.75,37.50,36.25,36.88,8248800,8.64 -1990-03-08,35.75,37.00,35.00,36.75,8013600,8.61 -1990-03-07,35.00,36.00,35.00,35.38,7301200,8.29 -1990-03-06,35.00,35.25,34.50,35.25,5578800,8.26 -1990-03-05,33.50,34.75,33.50,34.50,6537600,8.08 -1990-03-02,33.50,34.75,33.25,33.75,3761200,7.91 -1990-03-01,33.50,34.75,33.25,34.25,7283200,8.03 -1990-02-28,33.50,34.00,33.25,34.00,3918800,7.97 -1990-02-27,34.00,34.25,33.50,33.50,2642000,7.85 -1990-02-26,33.00,34.25,33.00,34.00,2844800,7.97 -1990-02-23,32.75,33.50,32.75,33.25,5375600,7.79 -1990-02-22,34.00,34.50,33.00,33.00,6976800,7.73 -1990-02-21,32.75,34.25,32.50,34.00,6283600,7.97 -1990-02-20,33.50,33.75,33.00,33.50,4402400,7.85 -1990-02-16,34.25,34.50,33.75,33.75,4556400,7.91 -1990-02-15,33.75,34.25,33.50,34.25,3509200,8.00 -1990-02-14,34.50,34.75,33.75,34.25,3448000,8.00 -1990-02-13,34.00,35.00,33.75,34.50,3653600,8.06 -1990-02-12,34.25,34.50,33.75,34.00,2695600,7.94 -1990-02-09,33.50,34.50,33.25,34.25,6004400,8.00 -1990-02-08,33.25,33.50,32.25,33.00,6680000,7.71 -1990-02-07,33.00,34.00,32.50,33.25,11180800,7.77 -1990-02-06,34.75,35.00,34.00,34.75,2640000,8.12 -1990-02-05,34.25,35.25,34.00,35.00,3653200,8.18 -1990-02-02,33.25,34.75,33.25,34.25,4248800,8.00 -1990-02-01,34.50,34.63,33.50,33.63,4193200,7.86 -1990-01-31,34.50,34.75,33.00,34.00,5152400,7.94 -1990-01-30,33.25,34.50,33.00,34.00,4180800,7.94 -1990-01-29,33.00,33.50,32.13,33.25,4284800,7.77 -1990-01-26,34.00,34.00,32.25,32.75,6492000,7.65 -1990-01-25,34.25,34.75,34.00,34.13,3996800,7.97 -1990-01-24,32.50,34.25,32.25,34.00,6077600,7.94 -1990-01-23,33.75,34.25,33.00,33.75,5048800,7.88 -1990-01-22,34.00,34.50,33.25,33.25,5200800,7.77 -1990-01-19,33.75,34.50,33.50,34.25,9485600,8.00 -1990-01-18,33.00,33.50,32.25,32.38,9760800,7.56 -1990-01-17,34.75,34.75,33.00,33.25,7050000,7.77 -1990-01-16,33.50,35.00,32.75,34.88,7658000,8.15 -1990-01-15,34.50,35.75,34.25,34.25,5785600,8.00 -1990-01-12,34.25,34.75,33.75,34.50,6150000,8.06 -1990-01-11,36.25,36.25,34.50,34.50,7547600,8.06 -1990-01-10,37.63,37.63,35.75,36.00,7140000,8.41 -1990-01-09,38.00,38.00,37.00,37.63,3096800,8.79 -1990-01-08,37.50,38.00,37.00,38.00,3643200,8.88 -1990-01-05,37.75,38.25,37.00,37.75,4406400,8.82 -1990-01-04,38.25,38.75,37.25,37.63,7928800,8.79 -1990-01-03,38.00,38.00,37.50,37.50,7444400,8.76 -1990-01-02,35.25,37.50,35.00,37.25,6555600,8.70 -1989-12-29,34.75,35.75,34.38,35.25,5445200,8.23 -1989-12-28,35.00,35.25,34.25,34.63,5403200,8.09 -1989-12-27,35.50,35.75,35.00,35.13,9189200,8.21 -1989-12-26,36.75,36.75,35.25,35.50,4849200,8.29 -1989-12-22,36.25,37.25,36.00,36.50,6610800,8.53 -1989-12-21,35.75,36.25,35.50,36.25,10889200,8.47 -1989-12-20,35.75,36.25,35.25,35.75,6377600,8.35 -1989-12-19,34.50,35.50,34.50,35.00,8977600,8.18 -1989-12-18,33.75,35.00,33.75,34.75,10978000,8.12 -1989-12-15,34.75,35.00,32.50,33.75,18520800,7.88 -1989-12-14,35.75,36.13,34.50,34.88,10886400,8.15 -1989-12-13,36.00,36.50,35.50,36.00,13920000,8.41 -1989-12-12,39.25,39.50,35.00,36.00,36634400,8.41 -1989-12-11,41.00,41.50,38.38,39.25,23223200,9.17 -1989-12-08,42.50,43.00,41.25,41.75,9032400,9.75 -1989-12-07,42.25,43.25,42.00,42.75,6378800,9.99 -1989-12-06,45.00,45.25,41.00,42.75,11965600,9.99 -1989-12-05,45.25,45.75,44.50,45.00,4364800,10.51 -1989-12-04,43.75,45.50,43.75,45.25,3498000,10.57 -1989-12-01,44.50,45.00,43.63,44.00,5235200,10.28 -1989-11-30,43.75,44.50,43.50,44.25,2280800,10.34 -1989-11-29,43.50,44.25,42.50,44.00,5475200,10.28 -1989-11-28,43.75,44.25,42.75,44.13,4854400,10.31 -1989-11-27,44.75,45.25,43.75,44.00,3774800,10.28 -1989-11-24,44.75,45.00,44.75,44.75,1014400,10.45 -1989-11-22,45.50,45.75,44.50,44.75,3508000,10.45 -1989-11-21,45.25,46.50,45.25,45.25,5013600,10.57 -1989-11-20,45.00,45.50,44.50,45.25,3870800,10.57 -1989-11-17,44.50,45.25,44.50,44.75,3164400,10.45 -1989-11-16,44.50,44.75,43.75,44.75,3453600,10.43 -1989-11-15,45.00,45.25,44.00,44.25,3499200,10.31 -1989-11-14,46.50,46.75,44.50,44.75,3021200,10.43 -1989-11-13,46.50,47.25,46.50,46.50,2445600,10.83 -1989-11-10,45.75,47.00,45.75,46.75,2336800,10.89 -1989-11-09,45.00,46.00,44.50,46.00,3166400,10.72 -1989-11-08,44.25,45.25,44.25,45.00,5102000,10.49 -1989-11-07,43.25,44.50,43.25,44.00,5406800,10.25 -1989-11-06,43.50,44.00,43.00,43.25,4416400,10.08 -1989-11-03,44.00,44.50,43.25,43.25,6258800,10.08 -1989-11-02,45.00,45.00,43.00,44.00,16170800,10.25 -1989-11-01,46.25,46.75,45.75,46.13,2199200,10.75 -1989-10-31,45.75,46.50,45.50,46.50,3288800,10.83 -1989-10-30,45.50,46.00,45.00,45.75,3121200,10.66 -1989-10-27,45.25,45.75,44.50,45.25,4634400,10.54 -1989-10-26,45.50,46.50,45.00,45.25,6048000,10.54 -1989-10-25,47.75,47.75,46.25,46.50,4263600,10.83 -1989-10-24,46.25,48.50,45.25,47.63,7735600,11.10 -1989-10-23,48.00,48.25,46.25,46.75,4375600,10.89 -1989-10-20,47.75,49.25,47.50,48.00,9350800,11.18 -1989-10-19,48.25,49.50,48.25,48.75,4016800,11.36 -1989-10-18,46.50,48.25,46.00,48.25,5157600,11.24 -1989-10-17,46.00,48.75,45.00,47.25,8935600,11.01 -1989-10-16,44.75,46.75,42.50,46.75,15184400,10.89 -1989-10-13,48.75,49.50,45.00,45.75,7195600,10.66 -1989-10-12,49.00,49.25,48.50,48.75,2969200,11.36 -1989-10-11,48.75,49.25,48.00,48.88,5608800,11.39 -1989-10-10,49.75,50.38,48.50,49.50,10262400,11.53 -1989-10-09,48.00,49.75,47.50,49.50,6997600,11.53 -1989-10-06,46.25,48.25,46.00,48.13,12939200,11.21 -1989-10-05,44.50,46.50,44.25,45.50,8760000,10.60 -1989-10-04,43.75,44.63,43.50,44.25,5687600,10.31 -1989-10-03,44.25,44.50,43.13,43.63,6094400,10.17 -1989-10-02,44.50,44.75,43.75,44.38,4922400,10.34 -1989-09-29,45.25,45.50,44.50,44.50,2500800,10.37 -1989-09-28,45.00,45.75,45.00,45.50,2856800,10.60 -1989-09-27,44.25,45.13,44.00,44.75,3229200,10.43 -1989-09-26,45.00,45.50,44.75,45.25,2762400,10.54 -1989-09-25,44.75,45.75,44.75,45.25,4875600,10.54 -1989-09-22,44.75,45.25,44.25,44.88,2605600,10.46 -1989-09-21,45.00,46.00,44.25,44.75,7186800,10.43 -1989-09-20,44.00,45.00,43.75,44.63,4230800,10.40 -1989-09-19,44.25,44.50,43.00,43.25,2888800,10.08 -1989-09-18,44.50,45.00,44.00,44.00,2264400,10.25 -1989-09-15,45.00,45.25,44.25,45.00,4470800,10.49 -1989-09-14,45.00,45.25,44.50,44.75,4693600,10.43 -1989-09-13,46.25,46.63,45.00,45.00,4616400,10.49 -1989-09-12,45.50,46.75,45.00,46.00,3710800,10.72 -1989-09-11,44.75,46.00,44.50,45.75,3522000,10.66 -1989-09-08,44.75,45.25,44.50,45.00,2013200,10.49 -1989-09-07,44.75,45.50,44.75,44.75,4083200,10.43 -1989-09-06,44.75,44.88,44.00,44.75,3108800,10.43 -1989-09-05,44.50,45.38,44.50,44.75,4112400,10.43 -1989-09-01,44.50,44.75,44.25,44.63,2651200,10.40 -1989-08-31,44.50,45.00,44.25,44.50,2016400,10.37 -1989-08-30,44.00,44.75,44.00,44.50,4161200,10.37 -1989-08-29,44.75,45.00,43.75,44.13,6339200,10.28 -1989-08-28,44.50,45.00,44.00,44.75,2936800,10.43 -1989-08-25,44.00,45.00,44.00,44.75,5766400,10.43 -1989-08-24,43.75,44.50,43.50,44.13,5829200,10.28 -1989-08-23,43.00,44.25,42.50,43.75,6202400,10.19 -1989-08-22,42.00,43.00,42.00,42.88,4013200,9.99 -1989-08-21,42.25,43.25,42.00,42.25,4923600,9.84 -1989-08-18,41.75,42.50,41.50,42.25,3003600,9.82 -1989-08-17,40.25,41.25,40.00,41.00,5495600,9.53 -1989-08-16,41.50,41.75,40.00,40.38,4318800,9.39 -1989-08-15,40.75,41.50,40.75,41.38,5852000,9.62 -1989-08-14,41.50,42.00,40.50,40.75,3690800,9.47 -1989-08-11,44.00,44.00,41.25,41.88,8226800,9.74 -1989-08-10,44.00,44.00,42.75,43.25,5442400,10.05 -1989-08-09,44.00,45.75,43.88,44.00,6975600,10.23 -1989-08-08,43.50,44.75,43.50,44.13,7366400,10.26 -1989-08-07,43.00,44.00,42.63,43.75,6012000,10.17 -1989-08-04,41.25,42.75,41.13,42.75,6564400,9.94 -1989-08-03,40.50,41.50,40.50,41.25,6185600,9.59 -1989-08-02,39.75,40.50,39.50,40.50,3633600,9.41 -1989-08-01,39.75,40.25,39.25,39.88,4996800,9.27 -1989-07-31,39.25,40.00,39.00,39.75,4014800,9.24 -1989-07-28,39.25,39.75,39.00,39.38,4274400,9.15 -1989-07-27,38.25,39.50,38.00,39.25,6193200,9.12 -1989-07-26,38.25,38.50,37.75,38.25,8363600,8.89 -1989-07-25,39.25,39.75,38.00,38.75,7502400,9.01 -1989-07-24,39.75,39.75,39.25,39.25,4154800,9.12 -1989-07-21,39.75,40.00,39.00,40.00,4993600,9.30 -1989-07-20,40.75,41.25,39.75,40.00,8448800,9.30 -1989-07-19,39.50,40.75,39.00,40.50,8543200,9.41 -1989-07-18,40.75,40.75,38.75,39.25,17050800,9.12 -1989-07-17,40.75,41.25,39.75,40.75,4694400,9.47 -1989-07-14,40.75,41.00,39.75,40.75,9206800,9.47 -1989-07-13,40.00,41.00,39.50,40.63,8057600,9.44 -1989-07-12,39.75,40.25,39.50,40.00,4452000,9.30 -1989-07-11,40.75,41.00,39.75,39.75,8729200,9.24 -1989-07-10,41.00,41.25,40.00,40.50,7294400,9.41 -1989-07-07,41.25,42.00,40.50,41.25,3806400,9.59 -1989-07-06,40.75,41.75,40.25,41.25,6218000,9.59 -1989-07-05,40.50,40.75,40.00,40.50,4264400,9.41 -1989-07-03,41.75,41.75,40.75,40.75,1730800,9.47 -1989-06-30,40.50,41.75,39.50,41.25,5885600,9.59 -1989-06-29,41.00,41.25,40.00,40.63,8351200,9.44 -1989-06-28,42.25,42.25,41.00,41.75,9190800,9.70 -1989-06-27,43.75,44.25,42.50,42.63,3788000,9.91 -1989-06-26,44.00,44.00,43.25,43.50,6568800,10.11 -1989-06-23,43.25,44.25,43.25,43.88,4438800,10.20 -1989-06-22,42.50,43.75,42.00,43.25,4911200,10.05 -1989-06-21,43.00,43.50,42.25,42.50,4659200,9.88 -1989-06-20,44.00,44.00,42.25,43.00,4807600,10.00 -1989-06-19,44.50,44.75,43.50,44.00,6551200,10.23 -1989-06-16,44.75,45.50,43.50,44.50,19378000,10.34 -1989-06-15,49.50,49.75,47.50,47.50,5766800,11.04 -1989-06-14,49.00,50.25,48.25,49.63,8983600,11.54 -1989-06-13,47.50,48.75,47.00,48.50,8254400,11.27 -1989-06-12,46.75,47.75,46.25,47.50,2892400,11.04 -1989-06-09,47.25,47.75,46.50,47.00,3378800,10.93 -1989-06-08,48.50,49.00,47.25,47.63,6378800,11.07 -1989-06-07,46.75,48.50,46.75,48.25,6293200,11.22 -1989-06-06,46.75,47.00,46.25,46.75,5189200,10.87 -1989-06-05,48.75,49.00,46.50,47.00,4451200,10.93 -1989-06-02,48.50,49.50,48.50,49.00,4448800,11.39 -1989-06-01,47.75,49.25,47.50,48.75,6416800,11.33 -1989-05-31,47.50,48.13,47.00,47.75,4134400,11.10 -1989-05-30,48.25,49.00,47.38,47.50,4018000,11.04 -1989-05-26,48.25,49.00,48.00,48.50,4028800,11.27 -1989-05-25,47.25,49.00,47.25,48.25,8309200,11.22 -1989-05-24,45.25,47.75,45.25,47.75,10645200,11.10 -1989-05-23,46.00,46.00,45.25,45.50,4803600,10.58 -1989-05-22,45.75,46.25,45.25,46.00,6800000,10.69 -1989-05-19,44.75,46.25,44.75,45.75,11820800,10.61 -1989-05-18,45.25,45.50,44.75,44.75,7558800,10.38 -1989-05-17,45.25,45.50,45.00,45.25,8892400,10.50 -1989-05-16,46.00,46.25,45.00,45.38,8170800,10.53 -1989-05-15,44.75,46.25,44.75,46.00,11372400,10.67 -1989-05-12,44.50,45.00,44.00,45.00,16685600,10.44 -1989-05-11,43.25,44.25,43.00,43.88,10763600,10.18 -1989-05-10,43.00,43.50,42.50,43.25,8380000,10.03 -1989-05-09,42.00,43.00,42.00,42.50,12398800,9.86 -1989-05-08,41.50,42.25,41.50,42.25,7373600,9.80 -1989-05-05,42.50,42.75,41.50,41.50,16464400,9.63 -1989-05-04,40.25,41.25,40.00,41.00,6762000,9.51 -1989-05-03,39.75,40.75,39.75,40.25,7896800,9.34 -1989-05-02,39.00,40.25,39.00,39.88,7719200,9.25 -1989-05-01,38.50,39.25,38.50,39.00,2881200,9.05 -1989-04-28,39.25,39.50,38.50,39.00,3725600,9.05 -1989-04-27,39.50,40.00,39.00,39.38,4988000,9.13 -1989-04-26,40.00,40.25,39.13,39.75,6652000,9.22 -1989-04-25,40.00,40.50,39.75,40.00,4165600,9.28 -1989-04-24,40.00,40.25,39.50,40.13,3977600,9.31 -1989-04-21,40.50,40.88,39.75,40.13,4132000,9.31 -1989-04-20,40.75,41.50,40.25,40.75,6434400,9.45 -1989-04-19,40.00,41.63,39.75,40.88,15215600,9.48 -1989-04-18,39.50,40.50,39.25,40.13,20055200,9.31 -1989-04-17,38.50,39.25,38.00,39.25,5008000,9.10 -1989-04-14,39.00,39.25,38.25,38.75,4408800,8.99 -1989-04-13,38.75,39.50,38.25,38.50,6493200,8.93 -1989-04-12,38.25,39.25,37.88,38.50,13862000,8.93 -1989-04-11,37.50,38.00,37.00,37.75,5252400,8.76 -1989-04-10,37.25,38.00,36.75,37.00,4854400,8.58 -1989-04-07,36.00,37.50,36.00,37.38,12699200,8.67 -1989-04-06,34.75,36.13,34.50,36.00,5598800,8.35 -1989-04-05,34.50,35.25,34.25,35.00,4303200,8.12 -1989-04-04,34.50,34.88,33.88,34.50,4140800,8.00 -1989-04-03,35.50,36.25,34.75,35.00,5949200,8.12 -1989-03-31,35.00,35.75,34.75,35.63,6630800,8.26 -1989-03-30,34.25,35.00,34.00,34.75,3780800,8.06 -1989-03-29,34.00,34.50,34.00,34.25,2666800,7.94 -1989-03-28,34.00,34.50,34.00,34.00,5047600,7.89 -1989-03-27,34.25,34.50,33.50,33.75,5425600,7.83 -1989-03-23,34.00,34.50,33.75,34.38,4250800,7.97 -1989-03-22,34.25,34.75,33.75,33.88,5180800,7.86 -1989-03-21,35.50,35.50,34.75,34.88,4588800,8.09 -1989-03-20,35.00,35.25,34.50,34.88,6480800,8.09 -1989-03-17,34.50,35.75,34.00,34.88,8485200,8.09 -1989-03-16,35.00,35.50,34.50,35.25,6880000,8.18 -1989-03-15,35.25,35.50,34.75,35.00,3225600,8.12 -1989-03-14,35.00,35.50,34.88,35.25,5796800,8.18 -1989-03-13,35.00,35.50,34.75,35.00,4683600,8.12 -1989-03-10,34.50,35.00,34.25,35.00,3684400,8.12 -1989-03-09,35.25,35.75,34.50,34.50,4768800,8.00 -1989-03-08,35.63,36.25,35.25,35.25,7727600,8.18 -1989-03-07,35.50,36.00,35.00,35.75,9327600,8.29 -1989-03-06,35.00,35.88,34.50,35.50,6028800,8.23 -1989-03-03,35.25,35.25,34.00,34.75,13854400,8.06 -1989-03-02,35.75,36.25,34.75,35.00,13440800,8.12 -1989-03-01,36.25,36.50,35.50,36.00,6096400,8.35 -1989-02-28,36.50,36.75,36.00,36.25,6290000,8.41 -1989-02-27,36.00,36.50,35.75,36.50,4151200,8.47 -1989-02-24,37.00,37.00,36.00,36.00,5452000,8.35 -1989-02-23,36.50,37.00,36.25,36.75,3409200,8.52 -1989-02-22,37.25,37.50,36.50,36.75,8529200,8.52 -1989-02-21,36.88,37.75,36.75,37.50,6808800,8.70 -1989-02-17,36.25,37.00,36.25,36.75,4180800,8.52 -1989-02-16,36.25,37.25,36.00,36.38,9138800,8.41 -1989-02-15,35.75,36.25,35.50,36.25,11812400,8.38 -1989-02-14,36.88,37.00,35.25,35.75,31843200,8.27 -1989-02-13,36.75,37.25,36.75,37.00,8422000,8.56 -1989-02-10,38.25,38.25,37.00,37.25,12441200,8.62 -1989-02-09,38.25,39.00,38.00,38.25,5756400,8.85 -1989-02-08,39.00,39.50,38.00,38.25,5612000,8.85 -1989-02-07,38.25,39.25,38.25,39.00,5908800,9.02 -1989-02-06,39.50,39.50,38.25,38.50,4174400,8.91 -1989-02-03,40.00,40.25,39.00,39.25,6406400,9.08 -1989-02-02,39.50,40.25,39.25,39.75,16927600,9.19 -1989-02-01,37.75,39.63,37.38,39.25,17420000,9.08 -1989-01-31,37.25,37.75,36.75,37.75,16442000,8.73 -1989-01-30,37.63,38.00,37.25,37.38,20961200,8.65 -1989-01-27,38.25,39.25,36.25,37.63,75976400,8.70 -1989-01-26,40.75,42.13,40.63,41.75,10203600,9.66 -1989-01-25,41.75,42.00,41.00,41.50,3963200,9.60 -1989-01-24,41.00,41.75,40.75,41.63,7983200,9.63 -1989-01-23,40.75,41.25,40.75,41.00,6452000,9.48 -1989-01-20,40.50,41.50,40.25,41.00,6207600,9.48 -1989-01-19,40.50,41.00,40.00,40.50,9155200,9.37 -1989-01-18,40.75,41.13,39.50,39.75,17440800,9.19 -1989-01-17,43.25,43.50,40.00,40.38,27033600,9.34 -1989-01-16,43.25,44.00,43.00,43.75,6033200,10.12 -1989-01-13,42.75,43.50,42.38,43.25,6928000,10.00 -1989-01-12,42.25,43.00,42.00,42.75,5373200,9.89 -1989-01-11,42.25,42.50,41.25,42.13,5585200,9.74 -1989-01-10,42.50,42.88,41.50,42.63,3695600,9.86 -1989-01-09,43.00,43.13,42.25,43.00,2850800,9.95 -1989-01-06,42.25,43.50,42.25,42.63,7103600,9.86 -1989-01-05,42.00,43.25,41.25,42.25,10985200,9.77 -1989-01-04,40.75,42.13,40.50,42.00,8575200,9.71 -1989-01-03,40.25,40.50,40.00,40.38,3578800,9.34 -1988-12-30,40.50,41.25,40.25,40.25,2938800,9.31 -1988-12-29,40.25,40.75,40.25,40.50,4212000,9.37 -1988-12-28,40.50,40.75,39.75,40.25,1841200,9.31 -1988-12-27,41.00,41.50,40.50,40.50,2155200,9.37 -1988-12-23,41.00,41.38,41.00,41.13,1475600,9.51 -1988-12-22,41.75,42.00,40.75,41.00,3802000,9.48 -1988-12-21,41.00,42.00,41.00,41.75,8642400,9.66 -1988-12-20,41.00,41.50,40.63,41.00,9810800,9.48 -1988-12-19,40.25,41.00,40.00,40.75,8373600,9.43 -1988-12-16,39.50,40.50,39.25,40.13,6572000,9.28 -1988-12-15,40.00,40.50,39.25,39.50,4032000,9.14 -1988-12-14,38.50,40.00,38.50,39.75,6916800,9.19 -1988-12-13,38.50,38.75,38.25,38.75,4386400,8.96 -1988-12-12,39.25,39.50,38.50,38.50,4215600,8.91 -1988-12-09,39.25,39.50,38.75,39.13,1608800,9.05 -1988-12-08,39.25,39.25,38.75,39.13,2125600,9.05 -1988-12-07,39.00,39.50,38.75,39.38,3518800,9.11 -1988-12-06,39.25,39.75,39.00,39.50,3763200,9.14 -1988-12-05,39.50,40.00,38.75,39.50,5534400,9.14 -1988-12-02,38.25,39.88,38.00,39.25,11940000,9.08 -1988-12-01,37.75,39.00,37.50,38.75,7586800,8.96 -1988-11-30,36.75,38.00,36.75,37.63,6013600,8.70 -1988-11-29,36.50,36.75,36.00,36.75,3326400,8.50 -1988-11-28,36.50,36.75,36.00,36.50,4986800,8.44 -1988-11-25,36.25,36.75,36.00,36.50,1727600,8.44 -1988-11-23,35.75,37.00,35.50,36.88,6733200,8.53 -1988-11-22,36.50,36.88,36.00,36.13,5299200,8.36 -1988-11-21,37.50,37.75,36.25,36.63,7928000,8.47 -1988-11-18,38.50,38.50,38.00,38.00,2066400,8.77 -1988-11-17,38.00,38.50,38.00,38.25,2841200,8.82 -1988-11-16,39.00,39.25,37.75,38.00,5280000,8.77 -1988-11-15,39.00,39.25,38.75,39.00,2866800,9.00 -1988-11-14,38.75,39.00,38.25,38.88,3046400,8.97 -1988-11-11,39.00,39.63,38.50,38.50,3882400,8.88 -1988-11-10,39.50,39.75,39.00,39.50,3573200,9.11 -1988-11-09,38.25,39.38,38.00,39.25,7206800,9.05 -1988-11-08,37.50,38.75,37.38,38.50,5540800,8.88 -1988-11-07,37.25,37.75,37.00,37.50,6093600,8.65 -1988-11-04,36.75,38.00,36.75,37.75,5500000,8.71 -1988-11-03,37.25,37.50,36.75,37.13,8670000,8.57 -1988-11-02,38.25,38.25,36.75,37.25,7451200,8.59 -1988-11-01,38.50,38.75,37.75,38.00,5138800,8.77 -1988-10-31,38.75,38.75,37.50,38.63,8695200,8.91 -1988-10-28,39.00,39.50,38.50,38.50,3026800,8.88 -1988-10-27,38.75,39.25,38.25,39.00,5138000,9.00 -1988-10-26,40.00,40.00,38.50,39.25,6751200,9.05 -1988-10-25,40.25,40.25,39.75,39.88,3043600,9.20 -1988-10-24,41.25,41.25,39.63,40.00,4842400,9.23 -1988-10-21,41.25,41.75,40.75,41.00,4422400,9.46 -1988-10-20,40.00,41.63,40.00,41.50,6215200,9.57 -1988-10-19,39.75,40.75,39.50,40.00,9918000,9.23 -1988-10-18,39.00,39.50,38.25,39.38,5100000,9.08 -1988-10-17,38.50,39.00,38.25,38.50,3360800,8.88 -1988-10-14,39.50,39.50,38.13,38.75,5625200,8.94 -1988-10-13,38.50,39.75,38.50,39.00,5892400,9.00 -1988-10-12,38.50,39.00,38.00,38.75,4763600,8.94 -1988-10-11,38.25,39.50,38.25,39.00,6964400,9.00 -1988-10-10,39.50,39.75,37.50,38.50,11880000,8.88 -1988-10-07,39.00,39.75,38.38,39.75,16355200,9.17 -1988-10-06,40.50,40.88,39.25,39.75,6009200,9.17 -1988-10-05,41.25,41.75,40.50,40.88,4400000,9.43 -1988-10-04,42.25,42.75,41.13,41.50,1847600,9.57 -1988-10-03,43.00,43.25,42.00,42.50,3243200,9.80 -1988-09-30,44.00,44.00,43.25,43.25,3338800,9.98 -1988-09-29,43.75,44.25,43.50,44.00,3804400,10.15 -1988-09-28,43.50,44.13,43.25,43.50,3038800,10.04 -1988-09-27,42.50,43.50,42.50,43.38,5832400,10.01 -1988-09-26,43.75,44.00,42.50,42.75,3124400,9.86 -1988-09-23,43.50,44.25,43.50,43.75,3638000,10.09 -1988-09-22,43.00,44.00,42.75,44.00,5203600,10.15 -1988-09-21,41.75,43.00,41.50,42.75,3274800,9.86 -1988-09-20,41.75,42.25,41.38,41.50,3682400,9.57 -1988-09-19,42.00,42.25,41.25,41.75,3296400,9.63 -1988-09-16,41.50,42.75,41.38,42.25,4431200,9.75 -1988-09-15,42.00,42.75,41.50,41.63,5920000,9.60 -1988-09-14,41.75,42.38,41.50,42.00,8520800,9.69 -1988-09-13,40.25,41.25,40.00,41.00,4293600,9.46 -1988-09-12,41.00,41.75,40.13,41.00,5290800,9.46 -1988-09-09,38.75,41.00,37.75,40.50,8393200,9.34 -1988-09-08,38.25,39.50,37.75,38.75,7403200,8.94 -1988-09-07,39.00,39.50,37.75,38.25,6417600,8.82 -1988-09-06,40.00,40.00,38.75,38.88,5125200,8.97 -1988-09-02,39.50,40.00,39.00,39.75,6661200,9.17 -1988-09-01,39.75,39.75,38.50,38.88,8818800,8.97 -1988-08-31,41.00,41.13,39.50,39.88,8493600,9.20 -1988-08-30,40.75,41.00,40.00,40.88,1809200,9.43 -1988-08-29,40.75,41.00,40.50,40.88,2046400,9.43 -1988-08-26,40.00,40.75,40.00,40.25,1453200,9.29 -1988-08-25,40.25,40.50,39.25,40.13,4560000,9.26 -1988-08-24,39.75,40.75,39.50,40.75,4482000,9.40 -1988-08-23,39.75,40.25,39.25,39.50,5843200,9.11 -1988-08-22,40.25,40.75,39.50,39.75,6100000,9.17 -1988-08-19,42.50,42.75,40.50,40.75,8120000,9.40 -1988-08-18,42.00,43.00,41.75,42.50,2648000,9.80 -1988-08-17,42.50,42.75,41.75,42.00,4252400,9.69 -1988-08-16,41.00,43.25,40.75,42.50,4397600,9.80 -1988-08-15,42.25,42.25,40.50,41.25,5971200,9.52 -1988-08-12,43.00,43.00,42.25,42.50,2771200,9.79 -1988-08-11,42.25,43.25,42.00,43.25,3803200,9.96 -1988-08-10,43.75,43.75,41.75,41.88,5300800,9.64 -1988-08-09,44.00,44.25,43.00,43.50,6090800,10.02 -1988-08-08,44.50,44.75,44.00,44.00,1085600,10.13 -1988-08-05,44.50,45.00,44.25,44.25,1881200,10.19 -1988-08-04,44.75,45.25,44.50,44.63,2473200,10.28 -1988-08-03,44.75,44.75,44.00,44.75,3980800,10.30 -1988-08-02,45.00,45.50,44.50,44.63,4338000,10.28 -1988-08-01,44.50,45.75,44.25,45.00,3085600,10.36 -1988-07-29,43.25,44.50,43.00,44.38,5697600,10.22 -1988-07-28,42.50,43.00,42.25,42.63,3326800,9.82 -1988-07-27,42.75,43.25,42.50,42.75,4162400,9.84 -1988-07-26,42.75,43.25,42.25,42.75,3640800,9.84 -1988-07-25,42.75,43.25,42.25,42.75,3794400,9.84 -1988-07-22,43.00,43.25,42.50,42.50,3724800,9.79 -1988-07-21,43.75,44.00,42.75,43.00,5323600,9.90 -1988-07-20,44.75,45.00,44.00,44.25,4293600,10.19 -1988-07-19,45.00,45.50,43.88,44.75,4372400,10.30 -1988-07-18,45.38,46.00,45.25,45.50,4061200,10.48 -1988-07-15,45.00,45.50,44.75,45.00,2968000,10.36 -1988-07-14,44.75,45.25,44.50,45.00,2245200,10.36 -1988-07-13,44.75,45.00,44.25,44.75,4132000,10.30 -1988-07-12,45.00,45.25,44.50,44.75,3605600,10.30 -1988-07-11,45.50,45.50,44.88,45.13,2646400,10.39 -1988-07-08,45.50,46.00,45.00,45.25,3766400,10.42 -1988-07-07,46.50,46.50,45.25,45.88,3778000,10.56 -1988-07-06,47.13,47.50,46.13,46.50,5608800,10.71 -1988-07-05,46.50,47.25,46.13,47.25,3736400,10.88 -1988-07-01,46.50,46.88,46.25,46.50,3385600,10.71 -1988-06-30,46.25,46.75,46.00,46.25,4104800,10.65 -1988-06-29,46.00,46.75,45.75,46.38,5125200,10.68 -1988-06-28,44.75,46.25,44.50,46.25,5809200,10.65 -1988-06-27,44.50,45.38,44.50,44.50,3001200,10.25 -1988-06-24,45.00,45.50,44.50,45.00,2684400,10.36 -1988-06-23,45.75,45.75,45.00,45.00,2566400,10.36 -1988-06-22,45.50,45.88,45.00,45.63,6998000,10.51 -1988-06-21,44.00,45.00,43.88,44.88,4422000,10.33 -1988-06-20,44.38,44.75,44.00,44.13,2811200,10.16 -1988-06-17,44.75,44.75,44.25,44.75,3410800,10.30 -1988-06-16,45.00,45.25,44.25,44.50,3854400,10.25 -1988-06-15,45.25,45.75,45.00,45.75,4360000,10.53 -1988-06-14,45.25,46.00,45.00,45.25,10445600,10.42 -1988-06-13,45.00,45.25,44.25,45.00,5320000,10.36 -1988-06-10,43.50,44.75,43.00,44.50,6320000,10.25 -1988-06-09,45.00,45.25,43.25,43.50,9640000,10.02 -1988-06-08,44.25,45.50,44.00,45.00,9240000,10.36 -1988-06-07,43.75,45.25,43.50,44.00,11120000,10.13 -1988-06-06,42.75,44.00,42.75,44.00,5880000,10.13 -1988-06-03,41.75,43.25,41.75,43.00,6280000,9.90 -1988-06-02,42.00,42.50,41.50,41.75,4760000,9.61 -1988-06-01,41.50,42.50,41.25,42.50,8200000,9.79 -1988-05-31,40.00,41.50,39.75,41.50,4400000,9.56 -1988-05-27,39.25,40.00,39.00,39.75,3020000,9.15 -1988-05-26,38.50,39.50,38.50,39.38,3076800,9.07 -1988-05-25,39.00,39.75,38.50,38.50,4840000,8.87 -1988-05-24,38.00,39.00,37.75,38.88,5080000,8.95 -1988-05-23,38.50,38.88,37.38,38.00,6560000,8.75 -1988-05-20,39.25,39.50,38.75,38.75,2941200,8.92 -1988-05-19,39.50,39.75,38.50,39.00,8920000,8.98 -1988-05-18,40.50,40.75,39.50,39.75,6240000,9.15 -1988-05-17,41.50,42.00,40.25,40.50,6920000,9.33 -1988-05-16,40.50,41.38,40.00,41.25,2686800,9.50 -1988-05-13,40.25,40.50,40.00,40.50,2566800,9.31 -1988-05-12,39.50,40.25,39.50,39.75,2965600,9.13 -1988-05-11,40.25,40.75,39.50,39.50,6240000,9.08 -1988-05-10,40.50,41.00,40.25,40.88,3439200,9.39 -1988-05-09,41.25,41.25,40.50,40.75,2732000,9.36 -1988-05-06,41.63,41.75,41.25,41.25,3835600,9.48 -1988-05-05,42.00,42.25,41.50,41.75,2536800,9.59 -1988-05-04,41.88,43.13,41.75,42.00,8000000,9.65 -1988-05-03,41.00,42.25,40.75,41.75,4440000,9.59 -1988-05-02,40.75,41.25,40.50,41.00,2944400,9.42 -1988-04-29,41.25,41.50,40.50,41.00,3222000,9.42 -1988-04-28,41.75,42.00,41.25,41.38,3553600,9.51 -1988-04-27,41.75,42.00,41.50,41.75,4520000,9.59 -1988-04-26,41.00,41.75,40.75,41.50,6280000,9.54 -1988-04-25,40.25,41.00,40.00,40.88,5360000,9.39 -1988-04-22,39.75,40.25,39.50,40.13,3846800,9.22 -1988-04-21,40.38,40.50,39.00,39.50,6360000,9.08 -1988-04-20,40.25,40.50,39.25,39.75,7680000,9.13 -1988-04-19,40.13,41.50,40.13,40.25,7596400,9.25 -1988-04-18,39.75,40.75,39.25,40.00,6080000,9.19 -1988-04-15,39.75,40.00,38.50,39.50,8320000,9.08 -1988-04-14,40.50,41.50,39.00,39.50,6720000,9.08 -1988-04-13,41.75,42.00,41.00,41.25,5120000,9.48 -1988-04-12,41.75,42.25,41.25,41.75,6200000,9.59 -1988-04-11,41.75,42.00,41.00,41.50,5320000,9.54 -1988-04-08,40.75,41.75,39.75,41.00,7240000,9.42 -1988-04-07,41.75,42.38,40.75,40.75,5840000,9.36 -1988-04-06,39.50,41.75,39.00,41.75,6800000,9.59 -1988-04-05,39.25,39.50,38.50,39.25,5280000,9.02 -1988-04-04,39.75,40.50,38.50,38.75,6480000,8.91 -1988-03-31,39.75,40.50,39.25,40.00,7760000,9.19 -1988-03-30,40.75,41.25,38.75,39.50,13280000,9.08 -1988-03-29,41.50,42.00,40.63,41.00,7640000,9.42 -1988-03-28,40.00,41.75,39.50,41.50,6160000,9.54 -1988-03-25,40.75,41.25,40.00,40.13,4680000,9.22 -1988-03-24,41.75,42.50,40.00,40.88,11440000,9.39 -1988-03-23,44.00,44.00,41.88,42.50,7480000,9.77 -1988-03-22,44.00,44.50,43.25,44.00,4265600,10.11 -1988-03-21,44.38,44.63,43.00,43.88,8120000,10.08 -1988-03-18,45.00,45.50,44.25,44.75,9720000,10.28 -1988-03-17,46.25,46.50,44.75,45.00,9320000,10.34 -1988-03-16,44.88,46.38,44.50,46.13,4240000,10.60 -1988-03-15,46.00,46.25,44.75,45.00,6480000,10.34 -1988-03-14,45.75,46.50,45.50,46.25,3518000,10.63 -1988-03-11,45.50,45.75,44.50,45.75,5640000,10.51 -1988-03-10,47.00,47.25,45.25,45.25,6320000,10.40 -1988-03-09,46.25,47.25,46.25,46.75,4800000,10.74 -1988-03-08,46.75,47.00,46.00,46.25,5160000,10.63 -1988-03-07,46.75,47.75,46.50,46.88,7400000,10.77 -1988-03-04,46.00,47.00,45.50,46.88,7480000,10.77 -1988-03-03,44.50,47.00,44.50,46.50,16920000,10.69 -1988-03-02,43.75,45.00,43.50,44.75,10440000,10.28 -1988-03-01,43.25,43.50,42.50,43.25,6120000,9.94 -1988-02-29,41.75,43.25,41.50,43.00,4000000,9.88 -1988-02-26,42.00,42.25,41.25,41.75,2952400,9.59 -1988-02-25,42.00,43.00,41.75,41.75,6400000,9.59 -1988-02-24,42.75,43.00,42.00,42.25,5200000,9.71 -1988-02-23,43.25,43.75,42.25,42.75,7880000,9.82 -1988-02-22,41.50,43.63,41.50,43.25,7160000,9.94 -1988-02-19,41.75,42.00,41.50,41.75,3242400,9.59 -1988-02-18,41.63,42.75,41.50,41.75,5120000,9.59 -1988-02-17,41.25,42.50,41.25,41.88,9160000,9.62 -1988-02-16,41.00,41.25,40.00,41.25,5520000,9.48 -1988-02-12,40.63,41.50,40.50,41.00,4920000,9.42 -1988-02-11,41.00,41.25,40.25,40.63,5280000,9.32 -1988-02-10,39.75,41.50,39.75,41.00,8160000,9.40 -1988-02-09,39.00,39.88,38.75,39.75,4160000,9.12 -1988-02-08,38.50,39.25,37.75,38.75,7280000,8.89 -1988-02-05,40.00,40.38,38.50,38.63,4720000,8.86 -1988-02-04,39.50,40.13,39.00,39.75,7120000,9.12 -1988-02-03,41.00,41.25,39.25,39.50,8080000,9.06 -1988-02-02,41.50,41.88,40.50,41.25,6840000,9.46 -1988-02-01,41.75,42.50,41.38,41.75,7120000,9.58 -1988-01-29,41.50,41.75,40.25,41.50,9480000,9.52 -1988-01-28,40.00,41.50,39.75,41.25,8320000,9.46 -1988-01-27,40.25,40.50,38.75,39.75,9240000,9.12 -1988-01-26,40.75,41.00,39.25,39.75,5120000,9.12 -1988-01-25,39.50,41.50,39.50,40.88,7160000,9.38 -1988-01-22,40.50,40.75,38.25,39.25,15920000,9.00 -1988-01-21,40.50,40.75,39.38,40.13,17640000,9.20 -1988-01-20,43.00,43.00,38.25,39.75,24320000,9.12 -1988-01-19,42.25,43.25,41.38,42.75,9800000,9.80 -1988-01-18,43.00,43.00,42.00,42.75,4480000,9.80 -1988-01-15,43.50,45.00,42.50,42.88,12280000,9.83 -1988-01-14,42.75,42.88,42.00,42.25,4720000,9.69 -1988-01-13,42.00,43.25,41.13,42.25,7560000,9.69 -1988-01-12,43.00,43.50,39.75,42.00,14320000,9.63 -1988-01-11,40.00,42.75,39.75,42.50,14440000,9.75 -1988-01-08,44.50,45.25,39.50,40.00,17360000,9.17 -1988-01-07,43.50,44.75,42.50,44.50,7600000,10.21 -1988-01-06,45.00,45.00,43.75,43.75,9600000,10.03 -1988-01-05,46.00,46.25,44.25,44.63,11040000,10.24 -1988-01-04,42.75,44.75,42.25,44.75,11800000,10.26 -1987-12-31,42.50,43.00,41.88,42.00,4200000,9.63 -1987-12-30,42.50,43.75,42.50,43.38,5560000,9.95 -1987-12-29,40.50,42.25,40.25,42.13,4240000,9.66 -1987-12-28,42.25,42.50,39.50,40.25,8200000,9.23 -1987-12-24,42.00,43.00,41.75,42.63,2508000,9.78 -1987-12-23,41.75,42.75,41.25,42.25,6120000,9.69 -1987-12-22,41.75,41.75,40.50,41.50,4600000,9.52 -1987-12-21,40.50,41.75,40.25,41.75,6720000,9.58 -1987-12-18,39.50,41.25,39.25,40.50,10800000,9.29 -1987-12-17,40.50,40.75,39.25,39.25,11640000,9.00 -1987-12-16,37.75,39.75,37.25,39.25,11800000,9.00 -1987-12-15,37.75,38.25,37.00,37.50,10680000,8.60 -1987-12-14,34.50,37.50,34.25,37.25,12200000,8.54 -1987-12-11,34.75,34.75,33.50,34.00,4360000,7.80 -1987-12-10,33.75,36.00,33.25,34.75,9880000,7.97 -1987-12-09,34.50,36.25,33.88,35.00,6400000,8.03 -1987-12-08,33.50,34.88,33.25,34.50,9080000,7.91 -1987-12-07,31.00,33.25,31.00,33.00,7280000,7.57 -1987-12-04,30.25,31.25,29.75,30.75,8720000,7.05 -1987-12-03,33.00,33.38,29.75,30.50,11400000,7.00 -1987-12-02,33.25,33.50,32.50,32.50,5080000,7.45 -1987-12-01,33.50,34.00,32.75,33.25,6480000,7.63 -1987-11-30,33.75,34.50,30.50,33.00,14880000,7.57 -1987-11-27,36.25,36.50,34.75,35.00,2526800,8.03 -1987-11-25,37.00,37.00,36.00,36.50,3311200,8.37 -1987-11-24,36.75,37.75,36.13,37.00,7040000,8.49 -1987-11-23,35.50,36.25,34.75,36.25,3500000,8.31 -1987-11-20,34.00,36.00,33.25,35.50,8960000,8.14 -1987-11-19,36.50,36.50,34.00,34.50,6520000,7.91 -1987-11-18,35.75,36.50,34.50,36.25,9480000,8.31 -1987-11-17,36.75,37.00,35.00,35.00,9600000,8.03 -1987-11-16,37.75,38.50,36.50,36.75,6600000,8.41 -1987-11-13,39.25,39.50,37.00,37.25,5520000,8.52 -1987-11-12,38.50,40.00,38.38,38.75,8800000,8.87 -1987-11-11,37.25,38.25,36.75,37.25,6640000,8.52 -1987-11-10,36.50,37.50,36.00,36.25,8280000,8.30 -1987-11-09,37.00,37.50,36.25,37.25,7520000,8.52 -1987-11-06,38.25,39.50,37.00,37.75,6680000,8.64 -1987-11-05,36.25,38.75,36.25,38.00,9120000,8.70 -1987-11-04,35.50,37.25,34.75,36.00,8360000,8.24 -1987-11-03,38.00,38.50,34.25,36.25,11200000,8.30 -1987-11-02,38.75,39.50,37.50,38.75,6720000,8.87 -1987-10-30,40.00,43.00,38.50,38.63,15040000,8.84 -1987-10-29,34.25,40.00,32.25,39.50,11840000,9.04 -1987-10-28,30.75,33.75,29.25,33.50,14960000,7.67 -1987-10-27,29.50,32.25,29.00,30.25,16280000,6.92 -1987-10-26,34.50,35.00,27.62,28.00,11200000,6.41 -1987-10-23,35.75,36.50,34.25,35.50,7080000,8.12 -1987-10-22,39.25,40.50,36.00,36.75,13760000,8.41 -1987-10-21,38.50,42.00,38.00,40.50,19080000,9.27 -1987-10-20,38.50,42.00,32.63,34.50,20320000,7.90 -1987-10-19,48.25,48.25,35.50,36.50,17000000,8.35 -1987-10-16,52.25,53.00,47.50,48.25,15000000,11.04 -1987-10-15,53.25,54.50,51.75,52.00,12440000,11.90 -1987-10-14,53.75,54.00,52.00,53.25,9240000,12.19 -1987-10-13,54.50,54.75,53.25,54.50,5800000,12.47 -1987-10-12,54.25,54.38,51.75,53.25,7120000,12.19 -1987-10-09,54.25,55.50,54.00,54.13,5200000,12.39 -1987-10-08,55.50,56.00,53.25,54.25,5880000,12.42 -1987-10-07,55.50,55.75,54.25,55.50,8000000,12.70 -1987-10-06,59.50,59.50,55.50,55.75,7200000,12.76 -1987-10-05,58.50,59.75,57.75,59.25,4800000,13.56 -1987-10-02,58.25,58.75,57.50,58.50,3450000,13.39 -1987-10-01,56.75,58.75,56.50,58.25,4160000,13.33 -1987-09-30,54.25,57.00,54.25,56.50,4360000,12.93 -1987-09-29,56.00,56.00,54.25,54.50,6120000,12.47 -1987-09-28,57.50,58.75,55.50,55.75,7280000,12.76 -1987-09-25,56.75,58.00,56.50,57.50,3806800,13.16 -1987-09-24,55.25,57.88,55.25,56.50,6520000,12.93 -1987-09-23,54.13,56.00,53.75,55.25,9098800,12.64 -1987-09-22,50.50,54.25,50.25,54.13,5480000,12.39 -1987-09-21,51.75,52.75,50.25,50.25,4600000,11.50 -1987-09-18,52.00,52.25,51.38,51.75,2555600,11.84 -1987-09-17,52.00,52.25,51.00,52.00,2400000,11.90 -1987-09-16,51.75,52.63,51.25,51.75,6000000,11.84 -1987-09-15,53.00,53.00,51.50,51.75,3744800,11.84 -1987-09-14,54.75,55.25,52.75,53.00,2928000,12.13 -1987-09-11,54.00,55.50,52.75,54.50,4440000,12.47 -1987-09-10,53.25,54.50,53.13,53.75,5000000,12.30 -1987-09-09,50.25,53.00,49.50,52.75,5640000,12.07 -1987-09-08,50.25,50.50,48.50,49.88,6280000,11.42 -1987-09-04,51.25,51.75,50.00,50.50,3891200,11.56 -1987-09-03,52.50,52.75,50.25,51.25,6600000,11.73 -1987-09-02,52.00,53.25,50.75,52.00,8200000,11.90 -1987-09-01,54.75,55.25,52.50,52.50,4960000,12.01 -1987-08-31,52.25,54.25,51.75,54.00,5360000,12.36 -1987-08-28,52.00,52.50,51.50,52.00,3434400,11.90 -1987-08-27,52.25,52.75,51.50,52.00,4440000,11.90 -1987-08-26,53.00,53.50,52.00,52.00,7000000,11.90 -1987-08-25,52.75,53.25,52.00,52.00,4880000,11.90 -1987-08-24,53.00,53.50,52.25,52.25,4320000,11.96 -1987-08-21,51.75,53.75,51.50,53.00,5000000,12.13 -1987-08-20,50.25,52.50,49.75,51.75,6280000,11.84 -1987-08-19,49.50,50.00,49.00,50.00,2404400,11.44 -1987-08-18,49.25,49.50,48.25,48.75,8480000,11.16 -1987-08-17,49.50,50.00,48.75,49.50,5200000,11.33 -1987-08-14,48.50,50.00,48.00,49.00,3758800,11.21 -1987-08-13,48.75,50.25,48.50,49.00,7000000,11.21 -1987-08-12,49.50,49.75,48.25,48.75,5760000,11.16 -1987-08-11,49.50,50.25,48.75,49.50,9680000,11.33 -1987-08-10,48.25,48.25,45.75,48.25,2800000,11.04 -1987-08-07,46.25,47.25,46.00,46.50,5440000,10.63 -1987-08-06,43.25,46.75,42.75,46.25,9000000,10.57 -1987-08-05,42.25,43.50,42.00,43.25,4640000,9.89 -1987-08-04,40.50,42.25,40.00,42.25,4320000,9.66 -1987-08-03,41.00,41.50,40.25,40.25,2275600,9.20 -1987-07-31,41.25,42.00,41.25,41.25,2613600,9.43 -1987-07-30,41.00,41.50,40.75,41.50,3727600,9.49 -1987-07-29,42.00,42.00,40.50,41.00,3534800,9.37 -1987-07-28,42.50,42.75,41.75,41.88,2660800,9.57 -1987-07-27,42.50,43.00,42.00,42.25,2035600,9.66 -1987-07-24,41.50,42.75,41.50,42.50,4200000,9.71 -1987-07-23,43.00,43.50,40.50,41.75,2685600,9.54 -1987-07-22,41.50,42.75,41.25,42.50,2185200,9.71 -1987-07-21,42.00,42.50,41.25,41.38,3966400,9.46 -1987-07-20,43.00,43.25,41.50,41.75,4440000,9.54 -1987-07-17,44.25,44.75,42.75,43.25,3300000,9.89 -1987-07-16,44.00,44.00,43.25,44.00,3388000,10.06 -1987-07-15,43.00,44.75,42.25,44.00,9680000,10.06 -1987-07-14,41.00,43.00,41.00,43.00,9200000,9.83 -1987-07-13,39.00,40.75,38.75,40.50,9120000,9.26 -1987-07-10,38.00,39.25,37.75,38.00,5600000,8.69 -1987-07-09,37.25,38.75,37.25,37.75,8560000,8.63 -1987-07-08,39.25,39.25,36.50,37.25,12200000,8.51 -1987-07-07,40.50,41.00,38.75,39.25,7280000,8.97 -1987-07-06,40.75,41.75,40.50,40.75,3060800,9.31 -1987-07-02,40.00,41.00,39.75,40.63,2931200,9.29 -1987-07-01,40.75,40.75,39.75,40.00,3402000,9.14 -1987-06-30,40.50,41.00,39.75,40.50,5160000,9.26 -1987-06-29,40.50,40.75,40.00,40.75,3628000,9.31 -1987-06-26,40.75,41.50,40.00,40.50,4560000,9.26 -1987-06-25,42.00,42.50,40.50,40.50,4320000,9.26 -1987-06-24,41.50,43.25,40.50,42.00,4240000,9.60 -1987-06-23,42.00,42.13,40.75,41.25,2892000,9.43 -1987-06-22,41.25,42.25,40.88,42.00,6040000,9.60 -1987-06-19,41.50,41.75,40.38,41.00,4480000,9.37 -1987-06-18,40.25,41.75,39.50,41.50,8200000,9.49 -1987-06-17,41.50,42.50,40.00,40.50,10640000,9.26 -1987-06-16,41.50,41.75,38.00,41.50,12240000,9.49 -1987-06-15,79.00,79.50,77.50,78.50,9280000,8.97 -1987-06-12,79.00,79.75,78.75,79.00,3653600,9.03 -1987-06-11,78.50,80.00,78.00,79.00,4521600,9.03 -1987-06-10,78.75,80.25,78.00,78.50,5235200,8.97 -1987-06-09,77.50,79.50,77.50,78.50,4570400,8.97 -1987-06-08,77.75,78.00,76.75,77.75,7213600,8.89 -1987-06-05,78.75,78.75,77.75,77.75,4696000,8.89 -1987-06-04,78.00,78.75,77.00,78.50,5511200,8.97 -1987-06-03,77.25,79.50,77.25,77.75,6140000,8.89 -1987-06-02,77.50,78.00,77.00,77.25,4927200,8.83 -1987-06-01,79.50,79.50,77.50,77.75,2984000,8.89 -1987-05-29,80.25,80.50,79.00,79.00,3322400,9.03 -1987-05-28,79.50,80.25,78.50,80.00,5424000,9.14 -1987-05-27,78.00,80.25,77.50,79.50,6484000,9.09 -1987-05-26,74.50,78.00,74.00,78.00,5481600,8.91 -1987-05-22,75.00,75.50,73.75,74.12,3484000,8.47 -1987-05-21,74.75,75.75,74.50,74.50,6233600,8.51 -1987-05-20,73.00,75.00,72.50,74.50,10320000,8.51 -1987-05-19,75.75,75.75,72.62,73.25,8560000,8.37 -1987-05-18,78.25,78.50,75.50,75.75,8640000,8.66 -1987-05-15,79.25,79.25,78.00,78.25,5220000,8.94 -1987-05-14,78.25,79.50,78.25,79.25,5316000,9.06 -1987-05-13,75.75,78.62,75.50,78.50,11120000,8.97 -1987-05-12,76.00,76.50,75.00,75.50,9280000,8.63 -1987-05-11,77.00,79.50,76.75,77.00,7048800,8.80 -1987-05-08,80.50,81.00,79.00,79.00,6618400,9.01 -1987-05-07,79.75,81.00,79.75,80.25,6488800,9.16 -1987-05-06,80.50,82.25,79.25,80.00,10240000,9.13 -1987-05-05,80.00,80.75,78.00,80.25,8240000,9.16 -1987-05-04,79.50,80.25,79.00,79.75,5095200,9.10 -1987-05-01,79.50,80.00,78.75,80.00,4751200,9.13 -1987-04-30,78.00,80.00,77.75,79.25,9040000,9.04 -1987-04-29,77.25,79.75,77.00,77.75,10400000,8.87 -1987-04-28,75.75,77.87,75.50,77.00,11600000,8.79 -1987-04-27,74.25,75.25,73.25,75.00,13680000,8.56 -1987-04-24,75.75,76.50,74.50,74.75,9120000,8.53 -1987-04-23,74.25,77.25,74.25,76.00,10880000,8.67 -1987-04-22,76.62,77.00,74.00,74.25,14400000,8.47 -1987-04-21,70.25,75.00,69.50,74.75,15440000,8.53 -1987-04-20,71.50,72.75,70.75,71.12,5353600,8.12 -1987-04-16,71.25,73.25,71.00,71.50,12400000,8.16 -1987-04-15,69.50,71.00,68.75,71.00,12480000,8.10 -1987-04-14,66.75,69.75,66.50,68.00,14560000,7.76 -1987-04-13,70.00,70.25,67.50,67.50,5101600,7.70 -1987-04-10,71.25,71.50,69.75,70.25,7791200,8.02 -1987-04-09,68.75,71.50,67.75,71.00,8480000,8.10 -1987-04-08,67.75,70.25,67.50,69.00,8240000,7.87 -1987-04-07,69.75,70.25,67.75,67.75,9280000,7.73 -1987-04-06,71.50,72.75,69.25,70.00,10320000,7.99 -1987-04-03,71.50,71.87,70.25,71.75,19280000,8.19 -1987-04-02,68.25,71.75,67.00,71.75,27760000,8.19 -1987-04-01,63.00,67.00,62.38,66.75,7792800,7.62 -1987-03-31,62.25,64.75,62.25,64.50,9760000,7.36 -1987-03-30,63.50,64.25,62.25,62.50,9280000,7.13 -1987-03-27,67.25,67.50,64.75,65.00,4817600,7.42 -1987-03-26,66.75,67.75,66.50,67.25,5146400,7.67 -1987-03-25,66.50,67.00,65.25,66.75,9760000,7.62 -1987-03-24,67.75,68.50,66.25,66.25,9600000,7.56 -1987-03-23,68.00,68.25,66.25,67.50,8800000,7.70 -1987-03-20,68.25,69.75,68.25,68.25,12400000,7.79 -1987-03-19,65.75,68.50,65.50,68.37,7396000,7.80 -1987-03-18,67.25,67.50,64.75,66.00,10800000,7.53 -1987-03-17,65.50,68.00,65.00,67.00,8720000,7.65 -1987-03-16,63.50,65.25,62.50,65.25,8800000,7.45 -1987-03-13,65.25,66.00,63.50,63.50,7067200,7.25 -1987-03-12,66.00,66.25,63.63,65.25,10800000,7.45 -1987-03-11,67.25,68.00,66.25,66.25,7826400,7.56 -1987-03-10,64.50,66.87,64.50,66.75,8720000,7.62 -1987-03-09,66.50,66.75,64.50,64.62,9120000,7.37 -1987-03-06,67.25,68.37,66.75,67.25,6332800,7.67 -1987-03-05,67.50,69.00,67.25,68.50,12080000,7.82 -1987-03-04,65.75,68.25,65.37,67.62,16000000,7.72 -1987-03-03,67.50,68.12,64.75,65.00,15600000,7.42 -1987-03-02,70.25,70.50,67.00,67.50,14160000,7.70 -1987-02-27,69.12,71.00,67.75,70.00,14480000,7.99 -1987-02-26,69.50,71.37,68.00,69.12,17840000,7.89 -1987-02-25,65.50,69.50,64.62,69.12,16240000,7.89 -1987-02-24,63.25,66.00,63.13,65.50,12720000,7.47 -1987-02-23,60.88,64.25,59.63,63.13,12560000,7.20 -1987-02-20,62.38,62.50,60.63,61.25,6813600,6.99 -1987-02-19,63.50,63.50,61.75,62.38,11200000,7.12 -1987-02-18,66.62,67.37,63.38,63.50,16800000,7.25 -1987-02-17,62.13,66.50,61.88,66.37,14640000,7.57 -1987-02-13,58.63,62.50,58.00,62.13,18240000,7.09 -1987-02-12,57.00,59.88,57.00,58.63,25360000,6.69 -1987-02-11,53.00,56.75,52.75,56.50,12240000,6.45 -1987-02-10,52.50,52.75,51.63,52.75,5977600,6.02 -1987-02-09,52.88,53.38,52.25,52.63,5611200,6.01 -1987-02-06,54.00,54.00,52.88,54.00,10480000,6.16 -1987-02-05,55.00,55.13,53.13,53.88,12160000,6.15 -1987-02-04,55.50,55.50,54.38,55.00,7791200,6.28 -1987-02-03,56.00,56.13,54.75,55.50,6412800,6.33 -1987-02-02,55.50,56.00,54.25,55.88,8800000,6.38 -1987-01-30,54.00,55.88,52.63,55.50,14640000,6.33 -1987-01-29,55.88,57.25,53.38,54.13,19920000,6.18 -1987-01-28,53.00,55.75,52.13,55.38,14800000,6.32 -1987-01-27,50.00,53.13,49.88,52.75,13520000,6.02 -1987-01-26,50.00,50.50,49.50,49.75,12560000,5.68 -1987-01-23,52.50,53.00,50.25,50.25,16400000,5.73 -1987-01-22,48.88,52.63,48.50,52.50,16880000,5.99 -1987-01-21,50.88,51.13,49.00,49.00,19040000,5.59 -1987-01-20,55.00,55.75,51.50,51.63,27680000,5.89 -1987-01-19,48.75,53.13,47.88,53.13,12960000,6.06 -1987-01-16,50.00,50.00,47.75,48.75,14560000,5.56 -1987-01-15,48.25,51.38,48.00,49.88,19520000,5.69 -1987-01-14,44.63,48.25,44.50,48.13,18000000,5.49 -1987-01-13,45.13,45.38,44.63,44.63,7584800,5.09 -1987-01-12,45.50,45.75,44.75,45.50,8320000,5.19 -1987-01-09,44.75,45.75,44.38,45.38,8560000,5.18 -1987-01-08,44.75,45.13,44.50,44.75,10400000,5.11 -1987-01-07,43.88,44.88,43.63,44.75,15520000,5.11 -1987-01-06,43.13,44.00,42.63,43.75,11600000,4.99 -1987-01-05,41.25,43.25,41.00,43.00,8560000,4.91 -1987-01-02,40.38,41.13,40.13,40.88,4360000,4.66 -1986-12-31,41.00,41.38,40.38,40.50,4742400,4.62 -1986-12-30,40.50,41.50,40.38,41.00,5297600,4.68 -1986-12-29,41.00,41.13,40.25,40.50,4224800,4.62 -1986-12-26,41.88,41.88,41.00,41.00,3215200,4.68 -1986-12-24,42.00,42.13,41.63,41.88,3453600,4.78 -1986-12-23,42.25,42.38,41.88,42.13,8720000,4.81 -1986-12-22,42.00,42.50,41.75,42.13,5887200,4.81 -1986-12-19,41.38,42.50,41.38,42.13,7149600,4.81 -1986-12-18,41.13,41.88,40.75,41.38,6258400,4.72 -1986-12-17,42.38,42.50,40.88,41.25,5417600,4.71 -1986-12-16,41.63,42.50,41.63,42.50,5464000,4.85 -1986-12-15,41.00,41.75,40.38,41.75,7481600,4.76 -1986-12-12,42.88,43.00,41.25,41.25,6451200,4.71 -1986-12-11,43.63,43.88,42.63,42.88,8080000,4.89 -1986-12-10,42.38,43.75,42.00,43.50,8720000,4.96 -1986-12-09,42.38,42.63,41.13,42.38,10800000,4.84 -1986-12-08,43.63,43.88,42.38,42.50,12400000,4.85 -1986-12-05,42.63,43.75,42.50,43.75,9360000,4.99 -1986-12-04,42.63,42.75,42.00,42.50,9600000,4.85 -1986-12-03,41.63,43.00,41.50,42.75,12000000,4.88 -1986-12-02,40.50,41.75,40.00,41.50,13200000,4.74 -1986-12-01,40.00,40.13,39.13,40.13,12400000,4.58 -1986-11-28,40.50,40.63,39.63,40.00,7897600,4.56 -1986-11-26,40.13,41.25,40.00,40.50,18080000,4.62 -1986-11-25,38.00,40.38,38.00,40.25,30320000,4.59 -1986-11-24,36.25,38.13,36.00,38.00,13440000,4.34 -1986-11-21,35.25,36.25,35.13,36.00,10240000,4.11 -1986-11-20,34.88,35.38,34.88,35.25,10560000,4.02 -1986-11-19,35.13,35.25,34.50,35.00,10800000,3.99 -1986-11-18,36.38,36.75,35.13,35.38,6115200,4.04 -1986-11-17,35.25,37.00,35.00,36.38,5071200,4.15 -1986-11-14,35.50,35.50,34.88,35.25,4840000,4.02 -1986-11-13,36.50,36.50,35.50,35.50,4928800,4.05 -1986-11-12,35.75,36.63,35.63,36.63,4700000,4.18 -1986-11-11,35.50,35.75,35.25,35.50,1809600,4.05 -1986-11-10,35.88,35.88,35.13,35.38,3793600,4.04 -1986-11-07,36.00,36.13,34.88,35.75,5153600,4.08 -1986-11-06,36.63,36.88,35.75,36.13,11840000,4.12 -1986-11-05,35.75,37.13,35.50,37.00,22320000,4.22 -1986-11-04,34.88,35.88,33.88,35.75,8800000,4.08 -1986-11-03,34.75,35.13,34.63,35.00,5457600,3.99 -1986-10-31,34.25,34.88,34.25,34.63,4338400,3.95 -1986-10-30,33.50,34.75,33.38,34.25,10480000,3.91 -1986-10-29,33.50,33.50,33.13,33.38,3057600,3.81 -1986-10-28,34.00,34.13,33.00,33.38,5102400,3.81 -1986-10-27,33.50,34.00,33.25,34.00,5422400,3.88 -1986-10-24,33.13,33.25,32.75,33.00,2718400,3.77 -1986-10-23,32.50,33.13,32.50,33.13,4441600,3.78 -1986-10-22,32.75,32.88,32.25,32.50,3382400,3.71 -1986-10-21,33.00,33.00,32.63,32.75,4096000,3.74 -1986-10-20,33.50,33.63,32.88,32.88,5344000,3.75 -1986-10-17,33.75,34.00,33.38,33.63,5460000,3.84 -1986-10-16,33.38,33.88,33.25,33.63,4876000,3.84 -1986-10-15,33.50,33.50,32.75,33.38,7367200,3.81 -1986-10-14,34.63,35.25,33.75,34.00,7164000,3.88 -1986-10-13,33.13,34.63,33.00,34.63,3582400,3.95 -1986-10-10,32.88,33.38,32.38,33.25,2096000,3.79 -1986-10-09,32.75,33.25,32.63,33.00,2820000,3.77 -1986-10-08,32.88,33.00,32.25,32.75,4021600,3.74 -1986-10-07,34.00,34.13,32.88,33.00,4577600,3.77 -1986-10-06,33.75,34.25,33.63,34.13,3384000,3.89 -1986-10-03,34.38,34.75,33.38,33.75,4997600,3.85 -1986-10-02,33.75,34.38,33.50,34.13,3401600,3.89 -1986-10-01,33.38,34.50,33.38,34.13,4988800,3.89 -1986-09-30,32.88,33.88,32.63,33.50,6488800,3.82 -1986-09-29,33.63,33.88,31.62,32.50,7475200,3.71 -1986-09-26,34.13,34.38,33.88,34.25,2512800,3.91 -1986-09-25,35.13,35.25,33.63,34.50,6744800,3.94 -1986-09-24,36.13,36.38,34.00,35.13,6360000,4.01 -1986-09-23,35.25,36.25,35.13,36.13,12080000,4.12 -1986-09-22,33.50,35.38,33.50,35.25,8560000,4.02 -1986-09-19,33.75,33.88,33.25,33.63,4601600,3.84 -1986-09-18,34.25,34.50,33.75,34.00,3546400,3.88 -1986-09-17,34.88,35.00,34.25,34.25,4181600,3.91 -1986-09-16,33.13,35.13,32.50,34.88,8800000,3.98 -1986-09-15,32.25,33.13,32.00,33.13,7973600,3.78 -1986-09-12,32.50,32.75,31.75,31.75,8160000,3.62 -1986-09-11,34.63,34.75,32.50,32.63,4842400,3.72 -1986-09-10,35.63,35.88,34.75,35.00,2737600,3.99 -1986-09-09,34.63,36.00,34.63,35.75,5398400,4.08 -1986-09-08,35.00,35.00,33.63,34.75,4522400,3.97 -1986-09-05,35.63,35.88,35.00,35.13,3561600,4.01 -1986-09-04,35.00,35.50,34.75,35.50,7133600,4.05 -1986-09-03,34.75,34.88,34.13,34.75,4216000,3.97 -1986-09-02,37.13,37.13,34.75,34.75,8320000,3.97 -1986-08-29,37.63,38.00,36.88,37.00,4846400,4.22 -1986-08-28,37.00,38.00,36.88,37.75,7849600,4.31 -1986-08-27,36.63,37.00,36.25,37.00,5280000,4.22 -1986-08-26,36.38,36.88,36.38,36.63,4713600,4.18 -1986-08-25,36.50,36.88,36.38,36.38,4533600,4.15 -1986-08-22,35.88,36.63,35.88,36.25,4162400,4.14 -1986-08-21,36.13,36.38,35.75,35.75,6992800,4.08 -1986-08-20,35.25,36.50,35.25,36.25,6140000,4.14 -1986-08-19,35.13,35.50,34.63,35.38,4944000,4.04 -1986-08-18,35.75,35.88,35.00,35.38,5297600,4.04 -1986-08-15,36.13,36.50,35.63,35.75,4910400,4.08 -1986-08-14,36.00,37.00,36.00,36.00,8240000,4.11 -1986-08-13,34.25,36.25,34.25,36.00,16240000,4.11 -1986-08-12,33.38,34.38,33.38,34.25,8720000,3.91 -1986-08-11,31.87,33.50,31.75,33.50,6591200,3.82 -1986-08-08,31.87,32.38,31.62,31.62,3941600,3.61 -1986-08-07,31.12,32.63,31.12,31.75,6211200,3.62 -1986-08-06,32.13,32.13,31.00,31.12,6644800,3.55 -1986-08-05,31.62,32.38,31.50,32.13,4238400,3.67 -1986-08-04,31.37,31.50,30.62,31.50,4653600,3.59 -1986-08-01,31.12,31.75,31.12,31.37,5360000,3.58 -1986-07-31,30.50,31.50,30.50,31.25,10080000,3.57 -1986-07-30,31.25,31.50,30.00,30.50,9120000,3.48 -1986-07-29,32.25,32.25,30.75,31.25,21280000,3.57 -1986-07-28,33.88,34.00,32.25,32.38,8800000,3.69 -1986-07-25,33.13,34.00,33.00,34.00,7769600,3.88 -1986-07-24,34.25,34.38,33.00,33.13,5187200,3.78 -1986-07-23,34.63,34.63,34.13,34.13,6416000,3.89 -1986-07-22,33.50,34.63,33.25,34.63,8560000,3.95 -1986-07-21,33.00,33.75,32.75,33.50,8160000,3.82 -1986-07-18,32.25,32.50,31.25,31.75,11040000,3.62 -1986-07-17,33.50,33.75,32.13,32.25,8960000,3.68 -1986-07-16,35.50,35.63,32.75,33.50,19280000,3.82 -1986-07-15,35.00,35.00,34.25,34.88,10640000,3.98 -1986-07-14,37.13,37.38,36.25,36.25,8480000,4.14 -1986-07-11,35.38,37.75,35.25,37.13,8000000,4.24 -1986-07-10,34.75,35.38,34.63,35.38,7453600,4.04 -1986-07-09,34.25,34.75,34.00,34.63,13040000,3.95 -1986-07-08,35.25,35.25,34.13,34.25,9782400,3.91 -1986-07-07,37.63,37.75,35.38,35.63,6501600,4.07 -1986-07-03,36.13,37.75,35.63,37.63,6509600,4.29 -1986-07-02,35.38,36.25,35.38,36.13,5202400,4.12 -1986-07-01,35.88,36.13,34.75,35.38,3140000,4.04 -1986-06-30,35.88,36.25,35.75,35.88,2553600,4.09 -1986-06-27,36.25,36.75,35.50,35.88,1811200,4.09 -1986-06-26,35.88,36.38,35.50,36.25,4184800,4.14 -1986-06-25,35.00,36.00,35.00,35.88,4755200,4.09 -1986-06-24,34.75,35.13,34.38,34.88,5088800,3.98 -1986-06-23,36.00,36.25,34.63,34.75,4196000,3.97 -1986-06-20,35.00,36.13,35.00,36.00,5761600,4.11 -1986-06-19,34.25,35.75,33.88,35.00,12347200,3.99 -1986-06-18,34.25,34.75,32.50,34.25,15381600,3.91 -1986-06-17,35.88,36.00,34.00,34.25,7936000,3.91 -1986-06-16,36.38,36.88,35.63,35.88,6222400,4.09 -1986-06-13,36.00,36.38,35.25,36.38,5144800,4.15 -1986-06-12,36.13,36.38,36.00,36.00,4638400,4.11 -1986-06-11,36.00,36.25,35.50,36.13,6692800,4.12 -1986-06-10,36.00,36.00,35.13,36.00,8827200,4.11 -1986-06-09,37.75,37.88,35.88,36.00,8835200,4.11 -1986-06-06,38.88,38.88,37.50,37.75,6342400,4.31 -1986-06-05,38.75,39.13,38.50,38.88,5282400,4.44 -1986-06-04,37.88,38.88,37.75,38.75,10747200,4.42 -1986-06-03,37.13,38.13,37.13,37.88,11661600,4.32 -1986-06-02,37.00,37.38,36.75,37.13,7158400,4.24 -1986-05-30,37.00,37.25,36.50,37.00,4591200,4.22 -1986-05-29,37.25,37.25,36.50,37.00,3635200,4.22 -1986-05-28,36.88,37.50,36.75,37.25,7418400,4.25 -1986-05-27,37.00,37.00,36.38,36.88,3058400,4.21 -1986-05-23,36.75,37.13,36.38,37.00,5013600,4.22 -1986-05-22,37.00,37.50,35.75,36.75,7895200,4.19 -1986-05-21,35.38,37.25,35.00,37.00,12418400,4.22 -1986-05-20,35.63,35.63,34.25,35.38,8811200,4.04 -1986-05-19,36.00,36.50,35.50,35.63,7506400,4.07 -1986-05-16,36.00,36.25,35.13,36.00,11424800,4.11 -1986-05-15,36.88,37.00,35.63,36.00,7964000,4.11 -1986-05-14,36.00,37.38,36.00,36.88,17277600,4.21 -1986-05-13,36.38,36.50,35.25,36.00,16876000,4.11 -1986-05-12,33.38,36.63,33.25,36.38,14335200,4.15 -1986-05-09,33.00,33.63,32.75,33.38,7961600,3.81 -1986-05-08,31.50,33.13,31.50,33.00,8342400,3.77 -1986-05-07,32.63,32.88,31.25,31.50,7133600,3.59 -1986-05-06,32.25,33.25,32.25,32.63,7829600,3.72 -1986-05-05,30.50,32.50,30.50,32.13,5364000,3.67 -1986-05-02,30.25,31.00,30.12,30.50,3377600,3.48 -1986-05-01,30.25,30.25,29.75,30.25,9218400,3.45 -1986-04-30,31.25,31.62,30.25,30.25,4944000,3.45 -1986-04-29,32.00,32.25,26.87,31.25,4750400,3.57 -1986-04-28,32.25,32.75,31.75,32.00,5241600,3.65 -1986-04-25,31.37,32.63,31.37,32.25,9348800,3.68 -1986-04-24,29.62,31.50,29.50,31.37,16398400,3.58 -1986-04-23,29.87,30.37,29.37,29.62,9371200,3.38 -1986-04-22,30.37,31.25,29.62,29.87,11726400,3.41 -1986-04-21,29.87,30.75,29.87,30.37,9775200,3.47 -1986-04-18,29.00,29.87,28.75,29.75,8871200,3.39 -1986-04-17,28.25,29.12,28.00,29.00,9672800,3.31 -1986-04-16,27.37,28.50,27.37,28.25,7535200,3.22 -1986-04-15,26.87,27.50,26.87,27.37,4722400,3.12 -1986-04-14,27.00,27.25,26.75,26.87,3076000,3.07 -1986-04-11,27.25,27.50,27.00,27.00,2737600,3.08 -1986-04-10,27.12,27.37,26.87,27.25,3932800,3.11 -1986-04-09,27.62,27.75,26.87,27.12,4851200,3.09 -1986-04-08,27.25,27.75,27.25,27.62,6912800,3.15 -1986-04-07,26.75,27.50,26.25,27.25,4318400,3.11 -1986-04-04,27.00,27.00,26.62,26.75,4508800,3.05 -1986-04-03,27.25,27.62,26.87,27.00,7548800,3.08 -1986-04-02,27.25,27.37,26.25,27.25,11627200,3.11 -1986-04-01,28.25,28.25,27.00,27.25,7973600,3.11 -1986-03-31,28.25,28.50,28.00,28.25,6744800,3.22 -1986-03-27,28.25,29.00,28.25,28.25,7856000,3.22 -1986-03-26,27.87,28.75,27.87,28.25,7941600,3.22 -1986-03-25,26.75,27.87,26.75,27.87,10060000,3.18 -1986-03-24,27.62,27.62,26.37,26.75,10528800,3.05 -1986-03-21,28.25,28.75,27.50,27.62,9309600,3.15 -1986-03-20,28.00,29.62,28.00,28.25,32318400,3.22 -1986-03-19,26.87,27.25,26.37,26.50,6816000,3.02 -1986-03-18,26.00,27.25,25.87,26.87,8920000,3.07 -1986-03-17,26.00,26.00,25.37,26.00,4240000,2.97 -1986-03-14,24.75,26.25,24.75,26.12,13781600,2.98 -1986-03-13,24.75,25.00,24.37,24.75,4176000,2.82 -1986-03-12,24.87,25.12,24.75,24.75,3071200,2.82 -1986-03-11,24.62,24.87,24.50,24.87,3681600,2.84 -1986-03-10,24.75,24.87,24.62,24.62,2727200,2.81 -1986-03-07,25.37,25.37,24.75,24.75,3477600,2.82 -1986-03-06,25.25,25.75,25.12,25.37,3630400,2.89 -1986-03-05,24.62,25.50,24.25,25.25,6324000,2.88 -1986-03-04,24.62,25.00,24.50,24.62,3217600,2.81 -1986-03-03,25.00,25.12,24.50,24.62,3912800,2.81 -1986-02-28,25.62,25.87,24.87,25.00,4507200,2.85 -1986-02-27,26.00,26.12,25.50,25.62,3873600,2.92 -1986-02-26,26.37,26.75,26.00,26.00,5907200,2.97 -1986-02-25,25.75,26.37,25.12,26.37,8041600,3.01 -1986-02-24,25.25,25.75,25.00,25.75,8840000,2.94 -1986-02-21,25.12,25.75,25.12,25.25,6771200,2.88 -1986-02-20,25.00,25.37,24.87,25.12,4951200,2.87 -1986-02-19,23.87,25.50,23.87,25.00,12871200,2.85 -1986-02-18,23.75,24.00,23.25,23.87,5295200,2.72 -1986-02-14,23.87,24.12,23.75,23.75,4928800,2.71 -1986-02-13,24.00,24.00,23.75,23.87,3944000,2.72 -1986-02-12,23.87,24.00,23.75,24.00,4770400,2.74 -1986-02-11,23.87,24.00,23.50,23.87,5504000,2.72 -1986-02-10,24.00,24.50,23.75,23.87,4036000,2.72 -1986-02-07,24.12,24.12,23.50,24.00,4656000,2.74 -1986-02-06,23.75,24.25,23.62,24.12,4835200,2.75 -1986-02-05,23.75,23.87,23.50,23.75,7042400,2.71 -1986-02-04,23.87,24.37,23.75,23.75,9298400,2.71 -1986-02-03,23.12,24.00,22.87,23.87,12512800,2.72 -1986-01-31,23.00,23.25,22.87,23.12,5317600,2.64 -1986-01-30,23.50,23.50,22.87,23.00,8493600,2.62 -1986-01-29,22.25,24.37,22.00,23.62,21064800,2.70 -1986-01-28,22.12,22.37,22.00,22.25,7949600,2.54 -1986-01-27,22.62,22.75,22.00,22.12,13955200,2.52 -1986-01-24,23.00,23.37,22.62,22.62,4044000,2.58 -1986-01-23,23.37,23.50,22.75,23.00,5624000,2.62 -1986-01-22,24.00,24.12,22.37,23.37,5144800,2.67 -1986-01-21,23.87,24.12,23.75,24.00,5464800,2.74 -1986-01-20,24.00,24.00,23.37,23.87,4590400,2.72 -1986-01-17,24.50,24.75,23.87,24.00,12344000,2.74 -1986-01-16,23.87,24.75,23.87,24.50,19132800,2.80 -1986-01-15,23.25,24.00,23.12,23.87,15126400,2.72 -1986-01-14,23.00,23.75,22.50,23.25,9772800,2.65 -1986-01-13,22.75,23.12,22.50,23.00,7701600,2.62 -1986-01-10,22.62,23.12,22.62,22.75,5491200,2.60 -1986-01-09,22.87,23.00,21.87,22.62,16002400,2.58 -1986-01-08,23.00,23.50,22.75,22.87,21711200,2.61 -1986-01-07,22.25,23.00,22.12,23.00,16807200,2.62 -1986-01-06,22.37,22.37,21.87,22.25,6636000,2.54 -1986-01-03,22.25,22.37,22.12,22.37,8653600,2.55 -1986-01-02,22.00,22.25,21.75,22.25,4212800,2.54 -1985-12-31,22.25,22.37,22.00,22.00,3158400,2.51 -1985-12-30,22.37,22.62,22.12,22.25,3848800,2.54 -1985-12-27,21.75,22.62,21.75,22.37,4427200,2.55 -1985-12-26,21.75,22.00,21.62,21.75,1658400,2.48 -1985-12-24,21.87,22.00,21.62,21.75,2344800,2.48 -1985-12-23,22.37,22.50,21.62,21.87,5157600,2.50 -1985-12-20,22.50,22.75,22.25,22.37,7402400,2.55 -1985-12-19,22.25,22.75,22.12,22.50,9673600,2.57 -1985-12-18,21.37,22.87,21.37,22.25,20033600,2.54 -1985-12-17,20.87,21.00,20.37,20.62,3926400,2.35 -1985-12-16,20.00,21.25,20.00,20.87,10362400,2.38 -1985-12-13,20.00,20.25,19.75,20.00,8975200,2.28 -1985-12-12,19.87,20.25,19.87,20.00,4515200,2.28 -1985-12-11,19.50,20.12,19.50,19.75,8489600,2.25 -1985-12-10,19.37,19.62,19.25,19.50,7206400,2.23 -1985-12-09,19.75,20.00,19.25,19.37,5015200,2.21 -1985-12-06,20.12,20.12,19.62,19.75,2347200,2.25 -1985-12-05,20.50,20.75,20.00,20.12,4508800,2.30 -1985-12-04,20.12,20.62,20.12,20.50,5928800,2.34 -1985-12-03,20.25,20.37,20.00,20.12,5548800,2.30 -1985-12-02,20.12,20.25,20.00,20.25,3611200,2.31 -1985-11-29,20.00,20.12,19.87,20.12,3546400,2.30 -1985-11-27,19.37,20.12,19.25,20.00,6873600,2.28 -1985-11-26,19.12,19.50,19.00,19.37,5892800,2.21 -1985-11-25,19.00,19.25,19.00,19.12,3488800,2.18 -1985-11-22,19.00,19.25,18.87,19.00,4620000,2.17 -1985-11-21,19.00,19.25,19.00,19.00,3720000,2.17 -1985-11-20,19.25,19.37,19.00,19.00,3548800,2.17 -1985-11-19,19.87,20.00,19.25,19.25,3373600,2.20 -1985-11-18,19.87,20.00,19.87,19.87,2342400,2.27 -1985-11-15,20.00,20.25,19.87,19.87,2932800,2.27 -1985-11-14,20.00,20.12,20.00,20.00,4995200,2.28 -1985-11-13,19.87,19.87,19.37,19.37,3642400,2.21 -1985-11-12,20.00,20.25,19.87,19.87,6224800,2.27 -1985-11-11,20.50,20.75,20.00,20.00,6421600,2.28 -1985-11-08,20.50,20.75,20.50,20.50,10517600,2.34 -1985-11-07,19.62,19.87,19.62,19.62,11352800,2.24 -1985-11-06,19.25,19.37,19.25,19.25,7181600,2.20 -1985-11-05,18.75,19.12,18.62,18.62,3841600,2.12 -1985-11-04,18.75,19.12,18.75,18.75,5584800,2.14 -1985-11-01,18.62,19.00,18.62,18.62,3320000,2.12 -1985-10-31,19.00,19.25,18.62,18.62,5548800,2.12 -1985-10-30,19.00,19.00,19.00,19.00,8098400,2.17 -1985-10-29,18.00,18.00,17.87,17.87,4693600,2.04 -1985-10-28,18.00,18.12,18.00,18.00,2148800,2.05 -1985-10-25,18.37,18.37,18.00,18.00,2271200,2.05 -1985-10-24,18.37,18.87,18.37,18.37,9768800,2.10 -1985-10-23,18.00,18.50,18.00,18.00,5309600,2.05 -1985-10-22,18.00,18.25,18.00,18.00,15186400,2.05 -1985-10-21,17.75,17.75,17.25,17.25,4248800,1.97 -1985-10-18,18.25,18.37,17.75,17.75,8268800,2.03 -1985-10-17,18.25,19.12,18.25,18.25,12455200,2.08 -1985-10-16,18.00,18.12,18.00,18.00,10336000,2.05 -1985-10-15,17.00,17.12,17.00,17.00,10504800,1.94 -1985-10-14,16.62,16.62,16.62,16.62,5555200,1.90 -1985-10-11,16.00,16.25,16.00,16.00,4261600,1.83 -1985-10-10,15.88,16.00,15.88,15.88,9386400,1.81 -1985-10-09,15.13,15.25,15.00,15.00,3001600,1.71 -1985-10-08,15.13,15.13,15.13,15.13,3144000,1.73 -1985-10-07,15.00,15.25,15.00,15.00,3284800,1.71 -1985-10-04,15.50,15.50,15.00,15.00,2484800,1.71 -1985-10-03,15.63,15.63,15.50,15.50,1784800,1.77 -1985-10-02,15.75,15.88,15.63,15.63,795200,1.78 -1985-10-01,15.75,15.88,15.75,15.75,3175200,1.80 -1985-09-30,15.88,16.00,15.75,15.75,1324800,1.80 -1985-09-27,15.88,16.00,15.88,15.88,250400,1.81 -1985-09-26,15.88,16.00,15.88,15.88,1949600,1.81 -1985-09-25,16.50,16.50,15.88,15.88,3761600,1.81 -1985-09-24,16.87,17.25,16.50,16.50,3161600,1.88 -1985-09-23,16.87,17.12,16.87,16.87,4277600,1.92 -1985-09-20,17.00,17.12,16.75,16.75,4846400,1.91 -1985-09-19,17.00,17.00,17.00,17.00,6662400,1.94 -1985-09-18,16.25,16.25,16.25,16.25,4316000,1.85 -1985-09-17,15.25,15.25,15.25,15.25,6564000,1.74 -1985-09-16,15.75,15.75,15.25,15.25,1344000,1.74 -1985-09-13,16.12,16.12,15.75,15.75,2541600,1.80 -1985-09-12,16.12,16.12,16.12,16.12,3998400,1.84 -1985-09-11,15.50,15.63,15.50,15.50,3150400,1.77 -1985-09-10,15.38,15.63,15.38,15.38,4364800,1.75 -1985-09-09,15.25,15.38,15.25,15.25,4728800,1.74 -1985-09-06,15.00,15.00,15.00,15.00,3333600,1.71 -1985-09-05,14.88,15.00,14.88,14.88,1201600,1.70 -1985-09-04,14.88,15.13,14.88,14.88,1708800,1.70 -1985-09-03,15.00,15.00,14.75,14.75,1369600,1.68 -1985-08-30,15.00,15.00,15.00,15.00,1537600,1.71 -1985-08-29,15.25,15.25,14.88,14.88,2006400,1.70 -1985-08-28,15.25,15.38,15.25,15.25,1475200,1.74 -1985-08-27,15.25,15.25,15.25,15.25,1540000,1.74 -1985-08-26,15.13,15.13,15.13,15.13,1315200,1.73 -1985-08-23,14.88,15.00,14.75,14.75,1601600,1.68 -1985-08-22,15.25,15.25,14.88,14.88,4406400,1.70 -1985-08-21,15.25,15.25,15.25,15.25,2767200,1.74 -1985-08-20,15.25,15.25,15.25,15.25,2431200,1.74 -1985-08-19,15.00,15.25,15.00,15.00,1726400,1.71 -1985-08-16,14.63,14.88,14.63,14.63,3008800,1.67 -1985-08-15,14.63,14.75,14.50,14.50,3800000,1.65 -1985-08-14,15.25,15.25,14.63,14.63,10372800,1.67 -1985-08-13,15.25,15.50,15.25,15.25,1555200,1.74 -1985-08-12,15.25,15.25,15.00,15.00,1988800,1.71 -1985-08-09,15.25,15.25,15.25,15.25,2186400,1.74 -1985-08-08,15.13,15.25,15.13,15.13,5321600,1.73 -1985-08-07,15.25,16.00,14.88,14.88,5452800,1.70 -1985-08-06,15.38,15.75,15.25,15.25,2260000,1.74 -1985-08-05,15.75,15.88,15.38,15.38,3307200,1.75 -1985-08-02,15.88,15.88,15.75,15.75,3501600,1.80 -1985-08-01,15.88,16.12,15.88,15.88,1842400,1.81 -1985-07-31,16.25,16.37,15.88,15.88,2917600,1.81 -1985-07-30,16.25,16.37,16.25,16.25,3237600,1.85 -1985-07-29,16.62,16.62,16.00,16.00,2808800,1.83 -1985-07-26,16.62,16.75,16.62,16.62,4673600,1.90 -1985-07-25,16.62,16.75,16.62,16.62,11282400,1.90 -1985-07-24,16.50,16.75,16.25,16.25,6040000,1.85 -1985-07-23,16.87,17.12,16.50,16.50,6038400,1.88 -1985-07-22,17.37,17.37,16.87,16.87,6906400,1.92 -1985-07-19,17.37,17.37,17.37,17.37,4117600,1.98 -1985-07-18,17.62,17.62,17.25,17.25,6437600,1.97 -1985-07-17,17.62,17.87,17.62,17.62,4255200,2.01 -1985-07-16,17.75,17.87,17.50,17.50,5120000,2.00 -1985-07-15,17.87,18.25,17.75,17.75,2804800,2.03 -1985-07-12,18.00,18.00,17.87,17.87,1680000,2.04 -1985-07-11,18.00,18.12,18.00,18.00,2361600,2.05 -1985-07-10,18.00,18.00,18.00,18.00,3802400,2.05 -1985-07-09,17.62,17.75,17.62,17.62,5284000,2.01 -1985-07-08,17.62,17.75,17.62,17.62,3301600,2.01 -1985-07-05,17.62,17.75,17.62,17.62,1321600,2.01 -1985-07-03,17.50,17.50,17.50,17.50,2472800,2.00 -1985-07-02,18.12,18.25,17.25,17.25,2807200,1.97 -1985-07-01,18.12,18.25,18.12,18.12,3702400,2.07 -1985-06-28,18.37,18.50,18.00,18.00,4875200,2.05 -1985-06-27,18.37,18.50,18.37,18.37,6915200,2.10 -1985-06-26,18.12,18.12,18.12,18.12,4722400,2.07 -1985-06-25,17.50,17.87,17.50,17.50,10506400,2.00 -1985-06-24,17.25,17.50,17.25,17.25,7387200,1.97 -1985-06-21,16.12,16.50,16.12,16.12,5941600,1.84 -1985-06-20,15.75,15.75,15.75,15.75,6822400,1.80 -1985-06-19,15.63,15.88,15.63,15.63,6177600,1.78 -1985-06-18,15.25,15.50,15.25,15.25,9489600,1.74 -1985-06-17,14.88,15.00,14.88,14.88,8464000,1.70 -1985-06-14,14.88,15.75,14.75,14.75,20226400,1.68 -1985-06-13,15.75,15.88,14.88,14.88,13573600,1.70 -1985-06-12,16.12,16.25,15.75,15.75,8888800,1.80 -1985-06-11,16.12,16.50,16.12,16.12,10751200,1.84 -1985-06-10,16.37,16.50,16.12,16.12,11296000,1.84 -1985-06-07,17.00,17.00,16.37,16.37,16980000,1.87 -1985-06-06,17.00,17.00,17.00,17.00,9688800,1.94 -1985-06-05,17.25,17.75,16.87,16.87,10267200,1.92 -1985-06-04,17.25,17.37,17.25,17.25,14373600,1.97 -1985-06-03,17.00,17.00,16.00,16.00,20578400,1.83 -1985-05-31,17.62,18.00,17.37,17.37,13235200,1.98 -1985-05-30,17.62,17.87,17.62,17.62,11273600,2.01 -1985-05-29,17.12,17.25,17.12,17.12,8808800,1.95 -1985-05-28,17.87,17.87,16.87,16.87,18253600,1.92 -1985-05-24,19.75,19.75,18.12,18.12,21060000,2.07 -1985-05-23,20.50,20.50,19.75,19.75,8576000,2.25 -1985-05-22,20.75,20.87,20.62,20.62,4342400,2.35 -1985-05-21,21.25,21.25,20.75,20.75,5452800,2.37 -1985-05-20,21.75,22.25,21.37,21.37,7044000,2.44 -1985-05-17,21.37,22.12,21.25,21.75,7592800,2.48 -1985-05-16,21.37,22.00,21.37,21.37,8275200,2.44 -1985-05-15,20.00,20.37,20.00,20.00,4668800,2.28 -1985-05-14,20.00,20.12,19.75,19.75,4364000,2.25 -1985-05-13,20.25,20.37,20.00,20.00,3157600,2.28 -1985-05-10,20.00,20.50,20.00,20.25,4893600,2.31 -1985-05-09,20.00,20.12,20.00,20.00,4571200,2.28 -1985-05-08,19.87,19.87,19.87,19.87,5177600,2.27 -1985-05-07,20.00,20.00,20.00,20.00,3844800,2.28 -1985-05-06,20.00,20.25,19.75,19.75,2007200,2.25 -1985-05-03,19.25,20.12,19.25,20.00,5673600,2.28 -1985-05-02,20.62,20.62,19.25,19.25,11787200,2.20 -1985-05-01,21.25,21.37,20.87,20.87,2075200,2.38 -1985-04-30,21.25,21.37,21.25,21.25,3396000,2.42 -1985-04-29,21.87,22.00,21.12,21.12,2256000,2.41 -1985-04-26,22.00,22.62,21.87,21.87,4295200,2.50 -1985-04-25,22.00,22.12,22.00,22.00,3135200,2.51 -1985-04-24,22.12,22.50,22.00,22.00,2830400,2.51 -1985-04-23,22.12,22.25,22.12,22.12,4261600,2.52 -1985-04-22,22.50,22.50,21.62,21.62,3700000,2.47 -1985-04-19,22.87,22.87,22.37,22.50,3468800,2.57 -1985-04-18,22.87,23.00,22.87,22.87,7246400,2.61 -1985-04-17,22.62,22.87,22.62,22.62,4402400,2.58 -1985-04-16,21.62,21.75,21.62,21.62,2424800,2.47 -1985-04-15,21.37,21.62,21.37,21.37,2168800,2.44 -1985-04-12,21.37,21.37,20.75,20.87,2607200,2.38 -1985-04-11,21.37,22.00,21.37,21.37,5260000,2.44 -1985-04-10,21.00,21.25,21.00,21.00,8117600,2.40 -1985-04-09,19.62,19.75,19.62,19.62,9461600,2.24 -1985-04-08,20.87,21.00,19.62,19.62,7129600,2.24 -1985-04-04,21.00,21.12,20.62,20.87,5792800,2.38 -1985-04-03,21.00,21.12,21.00,21.00,8681600,2.40 -1985-04-02,21.62,21.75,21.00,21.00,8146400,2.40 -1985-04-01,22.12,22.62,21.62,21.62,4115200,2.47 -1985-03-29,21.87,22.25,21.87,22.12,3155200,2.52 -1985-03-28,21.87,22.25,21.87,21.87,4667200,2.50 -1985-03-27,22.50,22.75,21.87,21.87,4008800,2.50 -1985-03-26,22.50,22.50,22.50,22.50,4346400,2.57 -1985-03-25,22.25,22.25,21.62,21.62,3931200,2.47 -1985-03-22,22.62,23.00,22.25,22.25,2910400,2.54 -1985-03-21,22.62,23.00,22.62,22.62,5826400,2.58 -1985-03-20,22.25,22.62,22.25,22.25,14498400,2.54 -1985-03-19,22.87,23.12,22.00,22.00,6147200,2.51 -1985-03-18,22.87,23.12,22.87,22.87,4487200,2.61 -1985-03-15,21.75,23.12,21.62,22.62,6524000,2.58 -1985-03-14,21.75,21.87,21.75,21.75,8667200,2.48 -1985-03-13,23.00,23.00,21.75,21.75,8973600,2.48 -1985-03-12,23.00,23.25,23.00,23.00,7880000,2.62 -1985-03-11,22.25,22.37,22.25,22.25,10244800,2.54 -1985-03-08,22.12,22.12,20.75,21.50,16931200,2.45 -1985-03-07,24.62,24.75,22.12,22.12,26244000,2.52 -1985-03-06,25.87,25.87,24.62,24.62,6933600,2.81 -1985-03-05,25.87,25.87,25.87,25.87,4687200,2.95 -1985-03-04,25.25,26.00,25.25,25.25,5484000,2.88 -1985-03-01,24.75,24.87,24.00,24.87,8857600,2.84 -1985-02-28,25.12,25.12,24.75,24.75,11415200,2.82 -1985-02-27,26.75,26.75,25.12,25.12,14421600,2.87 -1985-02-26,27.25,27.37,26.75,26.75,6764800,3.05 -1985-02-25,27.62,27.75,27.25,27.25,3564000,3.11 -1985-02-22,26.87,27.87,26.87,27.62,8096000,3.15 -1985-02-21,26.87,27.00,26.87,26.87,11035200,3.07 -1985-02-20,27.62,27.75,26.37,26.37,7864800,3.01 -1985-02-19,27.87,27.87,27.62,27.62,5391200,3.15 -1985-02-15,27.62,28.12,27.37,28.00,6224000,3.19 -1985-02-14,28.37,28.62,27.62,27.62,15268800,3.15 -1985-02-13,29.75,29.75,28.37,28.37,18835200,3.24 -1985-02-12,30.50,30.62,29.75,29.75,8095200,3.39 -1985-02-11,30.50,30.75,30.50,30.50,12431200,3.48 -1985-02-08,29.87,30.00,29.50,29.87,4757600,3.41 -1985-02-07,30.00,30.37,29.87,29.87,8793600,3.41 -1985-02-06,30.00,30.00,30.00,30.00,6980000,3.42 -1985-02-05,29.50,30.00,29.50,29.50,6824800,3.37 -1985-02-04,29.25,29.37,29.25,29.25,7801600,3.34 -1985-02-01,29.00,29.12,28.37,28.62,4941600,3.27 -1985-01-31,29.87,30.00,29.00,29.00,9880000,3.31 -1985-01-30,29.87,30.50,29.87,29.87,17624800,3.41 -1985-01-29,30.25,30.50,29.87,29.87,8029600,3.41 -1985-01-28,30.25,30.62,30.25,30.25,14721600,3.45 -1985-01-25,29.00,29.62,28.37,29.62,11381600,3.38 -1985-01-24,29.62,29.62,29.00,29.00,14192800,3.31 -1985-01-23,30.12,30.25,29.62,29.62,15384000,3.38 -1985-01-22,30.12,30.25,30.12,30.12,15202400,3.44 -1985-01-21,29.25,29.50,29.25,29.25,11635200,3.34 -1985-01-18,28.12,29.25,28.00,28.62,12615200,3.27 -1985-01-17,30.25,30.75,28.12,28.12,19573600,3.21 -1985-01-16,30.25,30.75,30.25,30.25,6816000,3.45 -1985-01-15,30.62,31.12,30.00,30.00,9476000,3.42 -1985-01-14,30.62,30.87,30.62,30.62,9691200,3.49 -1985-01-11,30.00,30.25,29.50,29.75,7347200,3.39 -1985-01-10,30.00,30.12,30.00,30.00,9926400,3.42 -1985-01-09,28.75,29.12,28.75,28.75,5973600,3.28 -1985-01-08,28.25,28.50,28.00,28.00,5040000,3.19 -1985-01-07,28.37,28.50,28.25,28.25,6117600,3.22 -1985-01-04,28.37,28.50,28.00,28.37,4915200,3.24 -1985-01-03,28.37,29.12,28.37,28.37,5967200,3.24 -1985-01-02,29.12,29.12,27.87,27.87,6272800,3.18 -1984-12-31,29.12,29.25,29.12,29.12,7453600,3.32 -1984-12-28,27.75,28.87,27.62,28.75,5941600,3.28 -1984-12-27,27.75,27.87,27.75,27.75,3531200,3.17 -1984-12-26,27.62,27.87,27.62,27.62,2444000,3.15 -1984-12-24,27.50,27.62,27.50,27.50,2418400,3.14 -1984-12-21,27.37,27.50,26.75,27.00,4438400,3.08 -1984-12-20,27.50,28.00,27.37,27.37,5013600,3.12 -1984-12-19,28.62,28.75,27.50,27.50,11372800,3.14 -1984-12-18,28.62,28.75,28.62,28.62,12164800,3.27 -1984-12-17,27.00,27.25,27.00,27.00,4513600,3.08 -1984-12-14,25.75,26.62,25.75,26.37,3475200,3.01 -1984-12-13,25.75,26.25,25.75,25.75,2424800,2.94 -1984-12-12,26.37,26.37,25.50,25.50,3937600,2.91 -1984-12-11,26.75,27.12,26.37,26.37,4432800,3.01 -1984-12-10,27.25,27.25,26.75,26.75,4016000,3.05 -1984-12-07,27.37,28.37,27.12,27.25,17696000,3.11 -1984-12-06,27.37,27.50,27.37,27.37,11360000,3.12 -1984-12-05,26.12,26.12,26.12,26.12,9406400,2.98 -1984-12-04,24.87,25.37,24.87,24.87,4332800,2.84 -1984-12-03,24.75,24.87,24.37,24.37,3533600,2.78 -1984-11-30,25.37,25.62,24.62,24.75,3906400,2.82 -1984-11-29,25.87,25.87,25.37,25.37,6248800,2.89 -1984-11-28,25.87,26.50,25.87,25.87,14673600,2.95 -1984-11-27,24.62,24.87,24.62,24.62,4590400,2.81 -1984-11-26,24.00,24.00,24.00,24.00,3636000,2.74 -1984-11-23,23.37,24.12,23.37,23.75,4904800,2.71 -1984-11-21,23.12,23.25,23.12,23.12,6418400,2.64 -1984-11-20,22.62,22.75,22.62,22.62,9424800,2.58 -1984-11-19,23.25,23.37,21.87,21.87,8321600,2.50 -1984-11-16,23.75,24.12,23.12,23.25,5920000,2.65 -1984-11-15,23.75,24.00,23.75,23.75,3833600,2.71 -1984-11-14,23.75,24.00,23.75,23.75,3752800,2.71 -1984-11-13,24.12,24.62,23.50,23.50,4548800,2.68 -1984-11-12,24.12,24.25,24.12,24.12,4070400,2.75 -1984-11-09,24.75,24.87,23.00,23.25,10518400,2.65 -1984-11-08,25.75,25.75,24.75,24.75,3162400,2.82 -1984-11-07,26.25,26.37,25.75,25.75,8286400,2.94 -1984-11-06,26.25,26.37,26.25,26.25,8073600,3.00 -1984-11-05,24.87,25.37,24.75,24.75,3764800,2.82 -1984-11-02,25.00,25.12,24.75,24.87,1004800,2.84 -1984-11-01,25.00,25.25,25.00,25.00,1680000,2.85 -1984-10-31,25.00,25.25,24.87,24.87,2191200,2.84 -1984-10-30,25.00,25.25,25.00,25.00,2677600,2.85 -1984-10-29,24.75,24.87,24.75,24.75,1836000,2.82 -1984-10-26,25.25,25.25,24.50,24.62,4113600,2.81 -1984-10-25,26.25,26.25,25.25,25.25,5676000,2.88 -1984-10-24,26.25,26.50,26.25,26.25,5989600,3.00 -1984-10-23,26.00,26.25,26.00,26.00,6668800,2.97 -1984-10-22,25.62,26.00,25.37,25.37,4108800,2.89 -1984-10-19,25.62,27.37,25.50,25.62,11673600,2.92 -1984-10-18,25.62,25.75,25.62,25.62,8842400,2.92 -1984-10-17,24.87,25.00,24.87,24.87,5636000,2.84 -1984-10-16,24.00,24.12,23.87,23.87,4246400,2.72 -1984-10-15,24.00,24.25,24.00,24.00,8715200,2.74 -1984-10-12,23.75,23.87,22.50,22.75,9522400,2.60 -1984-10-11,23.87,24.50,23.75,23.75,6553600,2.71 -1984-10-10,24.62,24.62,23.87,23.87,13070400,2.72 -1984-10-09,24.87,25.00,24.62,24.62,4515200,2.81 -1984-10-08,24.87,25.00,24.87,24.87,1721600,2.84 -1984-10-05,25.37,25.37,24.75,24.87,3510400,2.84 -1984-10-04,25.37,25.62,25.37,25.37,4482400,2.89 -1984-10-03,25.12,25.50,25.12,25.12,4335200,2.87 -1984-10-02,24.75,25.62,24.75,24.75,4258400,2.82 -1984-10-01,25.00,25.00,24.50,24.50,3521600,2.80 -1984-09-28,25.75,25.75,24.62,25.12,8344800,2.87 -1984-09-27,25.75,25.87,25.75,25.75,3796000,2.94 -1984-09-26,26.12,27.25,25.75,25.75,3987200,2.94 -1984-09-25,26.50,26.50,26.12,26.12,5977600,2.98 -1984-09-24,26.87,27.00,26.62,26.62,2833600,3.04 -1984-09-21,27.12,27.87,26.50,26.87,3591200,3.07 -1984-09-20,27.12,27.37,27.12,27.12,2387200,3.09 -1984-09-19,27.62,27.87,27.00,27.00,3816000,3.08 -1984-09-18,28.62,28.87,27.62,27.62,3495200,3.15 -1984-09-17,28.62,29.00,28.62,28.62,6886400,3.27 -1984-09-14,27.62,28.50,27.62,27.87,8826400,3.18 -1984-09-13,27.50,27.62,27.50,27.50,7429600,3.14 -1984-09-12,26.87,27.00,26.12,26.12,4773600,2.98 -1984-09-11,26.62,27.37,26.62,26.87,5444000,3.07 -1984-09-10,26.50,26.62,25.87,26.37,2346400,3.01 -1984-09-07,26.50,26.87,26.25,26.50,2981600,3.02 Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/doc/mpl_examples/data/AAPL.dat and /tmp/GJbvHcIw6l/matplotlib-1.0.1/doc/mpl_examples/data/AAPL.dat differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/doc/mpl_examples/data/ct.raw and /tmp/GJbvHcIw6l/matplotlib-1.0.1/doc/mpl_examples/data/ct.raw differ diff -Nru matplotlib-0.99.3/doc/mpl_examples/data/data_x_x2_x3.csv matplotlib-1.0.1/doc/mpl_examples/data/data_x_x2_x3.csv --- matplotlib-0.99.3/doc/mpl_examples/data/data_x_x2_x3.csv 2009-07-31 15:14:50.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/data/data_x_x2_x3.csv 1970-01-01 00:00:00.000000000 +0000 @@ -1,11 +0,0 @@ - 0 0 0 - 1 1 1 - 2 4 8 - 3 9 27 - 4 16 64 - 5 25 125 - 6 36 216 - 7 49 343 - 8 64 512 - 9 81 729 -10 100 1000 diff -Nru matplotlib-0.99.3/doc/mpl_examples/data/demodata.csv matplotlib-1.0.1/doc/mpl_examples/data/demodata.csv --- matplotlib-0.99.3/doc/mpl_examples/data/demodata.csv 2009-07-31 15:14:50.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/data/demodata.csv 1970-01-01 00:00:00.000000000 +0000 @@ -1,11 +0,0 @@ -clientid,date,weekdays,gains,prices,up -0,2008-04-30,Wed,-0.52458192906686452,7791404.0091921333,False -1,2008-05-01,Thu,0.076191536201738269,3167180.7366340165,True -2,2008-05-02,Fri,-0.86850970062880861,9589766.9613829032,False -3,2008-05-03,Sat,-0.42701083852713395,8949415.1867596991,False -4,2008-05-04,Sun,0.2532553652693274,937163.44375252665,True -5,2008-05-05,Mon,-0.68151636911081892,949579.88022264629,False -6,2008-05-06,Tue,0.0071911579626532168,7268426.906552773,True -7,2008-05-07,Wed,0.67449747200412147,7517014.782897247,True -8,2008-05-08,Thu,-1.1841008656818983,1920959.5423492221,False -9,2008-05-09,Fri,-1.5803692595811152,8456240.6198725495,False Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/doc/mpl_examples/data/eeg.dat and /tmp/GJbvHcIw6l/matplotlib-1.0.1/doc/mpl_examples/data/eeg.dat differ diff -Nru matplotlib-0.99.3/doc/mpl_examples/data/embedding_in_wx3.xrc matplotlib-1.0.1/doc/mpl_examples/data/embedding_in_wx3.xrc --- matplotlib-0.99.3/doc/mpl_examples/data/embedding_in_wx3.xrc 2009-07-31 15:14:50.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/data/embedding_in_wx3.xrc 1970-01-01 00:00:00.000000000 +0000 @@ -1,65 +0,0 @@ - - - - embedding_in_wx3 - - - wxVERTICAL - - - - - - - wxALL|wxEXPAND - 5 - - - - wxHORIZONTAL - - - - - - wxALL|wxEXPAND - 2 - - - - - - - wxALL|wxEXPAND - 2 - - - - - - - - wxALL|wxEXPAND - 2 - - - - 0 - - - wxEXPAND - - - - wxLEFT|wxRIGHT|wxEXPAND - 5 - - - - - wxEXPAND - - - - - \ No newline at end of file diff -Nru matplotlib-0.99.3/doc/mpl_examples/data/goog.csv matplotlib-1.0.1/doc/mpl_examples/data/goog.csv --- matplotlib-0.99.3/doc/mpl_examples/data/goog.csv 2009-07-31 15:14:50.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/data/goog.csv 1970-01-01 00:00:00.000000000 +0000 @@ -1,1048 +0,0 @@ -Date,Open,High,Low,Close,Volume,Adj Close -2008-10-14,393.53,394.50,357.00,362.71,7784800,362.71 -2008-10-13,355.79,381.95,345.75,381.02,8905500,381.02 -2008-10-10,313.16,341.89,310.30,332.00,10597800,332.00 -2008-10-09,344.52,348.57,321.67,328.98,8075000,328.98 -2008-10-08,330.16,358.99,326.11,338.11,11826400,338.11 -2008-10-07,373.33,374.98,345.37,346.01,11054400,346.01 -2008-10-06,373.98,375.99,357.16,371.21,11220600,371.21 -2008-10-03,397.35,412.50,383.07,386.91,7992900,386.91 -2008-10-02,409.79,409.98,386.00,390.49,5984900,390.49 -2008-10-01,411.15,416.98,403.10,411.72,6234800,411.72 -2008-09-30,395.98,425.08,392.32,400.52,3086300,400.52 -2008-09-29,419.51,423.51,380.71,381.00,10762900,381.00 -2008-09-26,428.00,437.16,421.03,431.04,5292500,431.04 -2008-09-25,438.84,450.00,435.98,439.60,5020300,439.60 -2008-09-24,430.34,445.00,430.11,435.11,4242000,435.11 -2008-09-23,433.25,440.79,425.72,429.27,5204200,429.27 -2008-09-22,454.13,454.13,429.00,430.14,4407300,430.14 -2008-09-19,461.00,462.07,443.28,449.15,10006000,449.15 -2008-09-18,422.64,439.18,410.50,439.08,8589400,439.08 -2008-09-17,438.48,439.14,413.44,414.49,9126900,414.49 -2008-09-16,425.96,449.28,425.49,442.93,6990700,442.93 -2008-09-15,424.00,441.97,423.71,433.86,6567400,433.86 -2008-09-12,430.21,441.99,429.00,437.66,6028000,437.66 -2008-09-11,408.35,435.09,406.38,433.75,6471400,433.75 -2008-09-10,424.47,424.48,409.68,414.16,6226800,414.16 -2008-09-09,423.17,432.38,415.00,418.66,7229600,418.66 -2008-09-08,452.02,452.94,417.55,419.95,9017900,419.95 -2008-09-05,445.49,452.46,440.08,444.25,4534300,444.25 -2008-09-04,460.00,463.24,449.40,450.26,4848500,450.26 -2008-09-03,468.73,474.29,459.58,464.41,4314600,464.41 -2008-09-02,476.77,482.18,461.42,465.25,6111500,465.25 -2008-08-29,469.75,471.01,462.33,463.29,3848200,463.29 -2008-08-28,472.49,476.45,470.33,473.78,3029700,473.78 -2008-08-27,473.73,474.83,464.84,468.58,4387100,468.58 -2008-08-26,483.46,483.46,470.59,474.16,3308200,474.16 -2008-08-25,486.11,497.00,481.50,483.01,2014300,483.01 -2008-08-22,491.50,494.88,489.48,490.59,2297200,490.59 -2008-08-21,482.92,489.90,479.27,486.53,3514100,486.53 -2008-08-20,494.72,496.69,482.57,485.00,3982100,485.00 -2008-08-19,490.43,498.28,486.63,490.50,3046500,490.50 -2008-08-18,509.84,510.00,495.51,498.30,3333900,498.30 -2008-08-15,506.99,510.66,505.50,510.15,3545700,510.15 -2008-08-14,497.70,507.61,496.29,505.49,2918600,505.49 -2008-08-13,501.60,503.54,493.88,500.03,3625500,500.03 -2008-08-12,502.00,506.13,498.00,502.61,2755700,502.61 -2008-08-11,492.47,508.88,491.78,500.84,4239300,500.84 -2008-08-08,480.15,495.75,475.69,495.01,3739300,495.01 -2008-08-07,482.00,484.00,476.41,479.12,2773800,479.12 -2008-08-06,478.37,489.77,472.51,486.34,3375800,486.34 -2008-08-05,467.59,480.08,466.33,479.85,3584500,479.85 -2008-08-04,468.12,473.01,461.90,463.00,2487000,463.00 -2008-08-01,472.51,473.22,462.50,467.86,3007900,467.86 -2008-07-31,474.56,480.89,471.44,473.75,2865100,473.75 -2008-07-30,485.50,486.02,472.81,482.70,3490700,482.70 -2008-07-29,479.30,487.26,478.00,483.11,2802800,483.11 -2008-07-28,492.09,492.09,475.13,477.12,3160000,477.12 -2008-07-25,486.49,493.13,481.50,491.98,3183500,491.98 -2008-07-24,496.70,496.87,475.62,475.62,3540900,475.62 -2008-07-23,481.61,497.23,478.10,489.22,4894100,489.22 -2008-07-22,466.72,480.25,465.60,477.11,4691500,477.11 -2008-07-21,480.88,484.09,465.70,468.80,5901500,468.80 -2008-07-18,498.35,498.98,478.19,481.32,11292400,481.32 -2008-07-17,534.16,537.05,524.50,533.44,8787400,533.44 -2008-07-16,514.04,536.50,510.60,535.60,4742200,535.60 -2008-07-15,516.28,527.50,501.10,516.09,6071000,516.09 -2008-07-14,539.00,540.06,515.45,521.62,4424800,521.62 -2008-07-11,536.50,539.50,519.43,533.80,4981400,533.80 -2008-07-10,545.00,549.50,530.72,540.57,4331700,540.57 -2008-07-09,550.76,555.68,540.73,541.55,4154000,541.55 -2008-07-08,545.99,555.19,540.00,554.53,4932400,554.53 -2008-07-07,542.30,549.00,535.60,543.91,4255200,543.91 -2008-07-03,530.88,539.23,527.50,537.00,2400500,537.00 -2008-07-02,536.51,540.38,526.06,527.04,4223000,527.04 -2008-07-01,519.58,536.72,517.00,534.73,4959900,534.73 -2008-06-30,532.47,538.00,523.06,526.42,3765300,526.42 -2008-06-27,527.68,530.00,515.09,528.07,5436900,528.07 -2008-06-26,544.10,544.93,528.26,528.82,5659500,528.82 -2008-06-25,544.97,557.80,543.67,551.00,4122200,551.00 -2008-06-24,545.14,551.19,535.10,542.30,4672600,542.30 -2008-06-23,545.36,553.15,542.02,545.21,3635900,545.21 -2008-06-20,556.98,556.98,544.51,546.43,5983100,546.43 -2008-06-19,555.35,563.78,550.81,560.20,5683100,560.20 -2008-06-18,564.51,568.99,559.16,562.38,3381200,562.38 -2008-06-17,576.35,578.07,568.38,569.46,3462900,569.46 -2008-06-16,566.50,579.10,566.50,572.81,3542800,572.81 -2008-06-13,561.49,575.70,561.34,571.51,6184400,571.51 -2008-06-12,548.76,558.00,546.88,552.95,5491600,552.95 -2008-06-11,556.24,557.34,544.46,545.20,3812900,545.20 -2008-06-10,549.56,558.82,546.78,554.17,3657400,554.17 -2008-06-09,568.06,570.00,545.40,557.87,5288300,557.87 -2008-06-06,579.75,580.72,567.00,567.00,4734500,567.00 -2008-06-05,577.08,588.04,576.21,586.30,3916700,586.30 -2008-06-04,565.33,578.00,564.55,572.22,3363200,572.22 -2008-06-03,576.50,580.50,560.61,567.30,4305300,567.30 -2008-06-02,582.50,583.89,571.27,575.00,3674200,575.00 -2008-05-30,583.47,589.92,581.30,585.80,3225200,585.80 -2008-05-29,574.79,585.88,573.20,583.00,4845000,583.00 -2008-05-28,567.94,571.49,561.10,568.24,4050400,568.24 -2008-05-27,544.96,562.60,543.85,560.90,3865500,560.90 -2008-05-23,546.96,553.00,537.81,544.62,4431500,544.62 -2008-05-22,551.95,554.21,540.25,549.46,5076300,549.46 -2008-05-21,578.52,581.41,547.89,549.99,6468100,549.99 -2008-05-20,574.63,582.48,572.91,578.60,3313600,578.60 -2008-05-19,578.55,588.88,573.52,577.52,5604500,577.52 -2008-05-16,581.43,584.68,578.32,580.07,4274100,580.07 -2008-05-15,579.00,582.95,575.61,581.00,4342700,581.00 -2008-05-14,586.49,591.19,575.25,576.30,4375800,576.30 -2008-05-13,586.23,587.95,578.55,583.00,5163500,583.00 -2008-05-12,574.75,586.75,568.91,584.94,4863900,584.94 -2008-05-09,579.00,585.00,571.30,573.20,4484900,573.20 -2008-05-08,586.20,589.30,578.91,583.01,5122900,583.01 -2008-05-07,590.27,599.49,576.43,579.00,6613000,579.00 -2008-05-06,591.00,592.00,583.00,586.36,4629300,586.36 -2008-05-05,598.86,599.00,587.13,594.90,6281000,594.90 -2008-05-02,598.49,602.45,579.30,581.29,6998800,581.29 -2008-05-01,578.31,594.93,576.97,593.08,6602800,593.08 -2008-04-30,562.21,584.86,558.47,574.29,7903000,574.29 -2008-04-29,550.83,563.40,550.01,558.47,4346000,558.47 -2008-04-28,545.88,556.81,539.00,552.12,4008600,552.12 -2008-04-25,549.02,553.00,542.73,544.06,4164400,544.06 -2008-04-24,551.29,554.49,540.02,543.04,4135100,543.04 -2008-04-23,557.94,559.31,540.95,546.49,4921500,546.49 -2008-04-22,537.57,560.83,537.56,555.00,7938500,555.00 -2008-04-21,539.39,542.59,530.29,537.79,7439700,537.79 -2008-04-18,535.21,547.70,524.77,539.41,18235600,539.41 -2008-04-17,455.63,459.37,446.52,449.54,13353000,449.54 -2008-04-16,444.40,458.28,441.00,455.03,7620200,455.03 -2008-04-15,458.13,459.72,443.72,446.84,4577600,446.84 -2008-04-14,457.16,457.45,450.15,451.66,3842600,451.66 -2008-04-11,464.07,467.26,455.01,457.45,4151500,457.45 -2008-04-10,464.96,473.86,461.85,469.08,5072400,469.08 -2008-04-09,469.13,472.00,457.54,464.19,6048100,464.19 -2008-04-08,473.04,474.14,462.01,467.81,4547000,467.81 -2008-04-07,477.03,485.44,473.53,476.82,5943500,476.82 -2008-04-04,457.01,477.83,456.20,471.09,5897200,471.09 -2008-04-03,461.73,463.29,448.13,455.12,6778400,455.12 -2008-04-02,469.90,475.74,460.39,465.70,5999000,465.70 -2008-04-01,447.74,466.50,446.87,465.71,6093100,465.71 -2008-03-31,435.64,442.69,432.01,440.47,4446400,440.47 -2008-03-28,447.46,453.57,434.31,438.08,4376200,438.08 -2008-03-27,446.00,448.61,440.49,444.08,5832200,444.08 -2008-03-26,452.59,462.87,449.29,458.19,5214200,458.19 -2008-03-25,457.46,457.47,446.00,450.78,5831600,450.78 -2008-03-24,438.43,465.78,437.72,460.56,6763500,460.56 -2008-03-20,427.32,435.70,417.50,433.55,9900400,433.55 -2008-03-19,441.11,447.50,431.67,432.00,6179000,432.00 -2008-03-18,428.98,440.84,425.53,439.16,7237200,439.16 -2008-03-17,427.99,433.71,412.11,419.87,7888200,419.87 -2008-03-14,442.98,449.34,430.62,437.92,6574400,437.92 -2008-03-13,432.67,446.98,428.78,443.01,7726600,443.01 -2008-03-12,440.01,447.88,438.07,440.18,6651900,440.18 -2008-03-11,425.26,440.15,424.65,439.84,8826900,439.84 -2008-03-10,428.83,431.00,413.04,413.62,7987600,413.62 -2008-03-07,428.88,440.00,426.24,433.35,8071800,433.35 -2008-03-06,447.69,453.30,431.18,432.70,7470100,432.70 -2008-03-05,445.25,454.17,444.00,447.70,7436600,447.70 -2008-03-04,450.95,453.36,435.78,444.60,13621700,444.60 -2008-03-03,471.51,472.72,450.11,457.02,7554500,457.02 -2008-02-29,471.87,479.74,464.65,471.18,9425400,471.18 -2008-02-28,470.50,479.09,467.36,475.39,6586900,475.39 -2008-02-27,460.13,475.49,459.64,472.86,10121900,472.86 -2008-02-26,461.20,466.47,446.85,464.19,23287300,464.19 -2008-02-25,505.95,506.50,485.74,486.44,8350800,486.44 -2008-02-22,502.06,509.00,497.55,507.80,5515900,507.80 -2008-02-21,512.85,513.21,499.50,502.86,5677800,502.86 -2008-02-20,503.51,511.01,498.82,509.00,6662200,509.00 -2008-02-19,534.94,535.06,506.50,508.95,6350400,508.95 -2008-02-15,528.31,532.66,524.33,529.64,5240100,529.64 -2008-02-14,538.35,541.04,531.00,532.25,6476700,532.25 -2008-02-13,522.50,534.99,518.69,534.62,6624700,534.62 -2008-02-12,523.39,530.60,513.03,518.09,6662300,518.09 -2008-02-11,520.52,523.71,513.40,521.16,5826000,521.16 -2008-02-08,509.41,517.73,508.70,516.69,6828900,516.69 -2008-02-07,496.86,514.19,494.76,504.95,7928900,504.95 -2008-02-06,511.14,511.17,497.93,501.71,7636400,501.71 -2008-02-05,489.43,509.00,488.52,506.80,11203300,506.80 -2008-02-04,509.07,512.78,492.55,495.43,13157100,495.43 -2008-02-01,528.67,536.67,510.00,515.90,17600500,515.90 -2008-01-31,539.01,573.00,534.29,564.30,14871300,564.30 -2008-01-30,549.19,560.43,543.51,548.27,7939600,548.27 -2008-01-29,560.47,561.33,540.67,550.52,6283000,550.52 -2008-01-28,570.97,572.24,548.60,555.98,5816700,555.98 -2008-01-25,591.81,595.00,566.18,566.40,6966000,566.40 -2008-01-24,558.80,579.69,554.14,574.49,9400900,574.49 -2008-01-23,560.71,568.00,519.00,548.62,16965700,548.62 -2008-01-22,562.03,597.50,561.20,584.35,9501500,584.35 -2008-01-18,608.36,609.99,598.45,600.25,8539600,600.25 -2008-01-17,620.76,625.74,598.01,600.79,8216800,600.79 -2008-01-16,628.97,639.99,601.93,615.95,10560000,615.95 -2008-01-15,645.90,649.05,635.38,637.65,5568200,637.65 -2008-01-14,651.14,657.40,645.25,653.82,4447500,653.82 -2008-01-11,642.70,649.47,630.11,638.25,4977000,638.25 -2008-01-10,645.01,657.20,640.11,646.73,6334200,646.73 -2008-01-09,630.04,653.34,622.51,653.20,6739700,653.20 -2008-01-08,653.00,659.96,631.00,631.68,5339100,631.68 -2008-01-07,653.94,662.28,637.35,649.25,6403400,649.25 -2008-01-04,679.69,680.96,655.00,657.00,5359800,657.00 -2008-01-03,685.26,686.85,676.52,685.33,3252500,685.33 -2008-01-02,692.87,697.37,677.73,685.19,4306900,685.19 -2007-12-31,698.57,702.49,690.58,691.48,2376200,691.48 -2007-12-28,704.93,707.95,696.54,702.53,2562700,702.53 -2007-12-27,707.07,716.00,700.74,700.74,2942500,700.74 -2007-12-26,698.99,713.22,698.21,710.84,2530000,710.84 -2007-12-24,694.99,700.73,693.06,700.73,1628400,700.73 -2007-12-21,697.88,699.26,693.24,696.69,5382000,696.69 -2007-12-20,685.83,691.00,680.61,689.69,4422200,689.69 -2007-12-19,674.21,679.50,669.00,677.37,4421100,677.37 -2007-12-18,674.16,676.71,652.50,673.35,7166700,673.35 -2007-12-17,688.00,695.42,663.67,669.23,5486000,669.23 -2007-12-14,687.51,699.70,687.26,689.96,3673500,689.96 -2007-12-13,696.31,697.62,681.21,694.05,5040800,694.05 -2007-12-12,714.00,714.32,688.50,699.35,6159100,699.35 -2007-12-11,719.94,720.99,698.78,699.20,6139100,699.20 -2007-12-10,715.99,724.80,714.00,718.42,3856200,718.42 -2007-12-07,714.99,718.00,710.50,714.87,3852100,714.87 -2007-12-06,697.80,716.56,697.01,715.26,4909000,715.26 -2007-12-05,692.73,698.93,687.50,698.51,4209600,698.51 -2007-12-04,678.31,692.00,677.12,684.16,4231800,684.16 -2007-12-03,691.01,695.00,681.14,681.53,4325100,681.53 -2007-11-30,711.00,711.06,682.11,693.00,7895500,693.00 -2007-11-29,690.75,702.79,687.77,697.00,6208000,697.00 -2007-11-28,682.11,694.30,672.14,692.26,7916500,692.26 -2007-11-27,674.80,676.43,650.26,673.57,8904500,673.57 -2007-11-26,680.20,693.40,665.00,666.00,6790100,666.00 -2007-11-23,670.00,678.28,668.11,676.70,2738700,676.70 -2007-11-21,643.77,669.97,642.08,660.52,7013500,660.52 -2007-11-20,636.48,659.10,632.87,648.54,9840600,648.54 -2007-11-19,629.59,636.77,618.50,625.85,5527400,625.85 -2007-11-16,633.94,635.49,616.02,633.63,9042800,633.63 -2007-11-15,638.57,647.50,624.00,629.65,6967700,629.65 -2007-11-14,673.28,675.49,636.27,641.68,8094700,641.68 -2007-11-13,644.99,660.92,632.07,660.55,8426100,660.55 -2007-11-12,657.74,669.93,626.21,632.07,10227300,632.07 -2007-11-09,675.78,681.88,661.21,663.97,11388100,663.97 -2007-11-08,734.60,734.89,677.18,693.84,16512200,693.84 -2007-11-07,741.13,747.24,723.14,732.94,8252900,732.94 -2007-11-06,737.56,741.79,725.00,741.79,8436300,741.79 -2007-11-05,706.99,730.23,706.07,725.65,8883700,725.65 -2007-11-02,710.51,713.58,697.34,711.25,5841500,711.25 -2007-11-01,702.79,713.72,701.78,703.21,6527200,703.21 -2007-10-31,700.69,707.00,696.04,707.00,6876800,707.00 -2007-10-30,677.51,699.91,677.51,694.77,6900600,694.77 -2007-10-29,677.77,680.00,672.09,679.23,3066300,679.23 -2007-10-26,674.03,676.54,668.06,674.60,3353900,674.60 -2007-10-25,678.68,678.97,663.55,668.51,5795500,668.51 -2007-10-24,672.71,677.47,659.56,675.82,7404200,675.82 -2007-10-23,661.25,677.60,660.00,675.77,6793700,675.77 -2007-10-22,638.67,655.00,636.28,650.75,6664400,650.75 -2007-10-19,654.56,658.49,643.23,644.71,15789000,644.71 -2007-10-18,635.41,641.37,628.50,639.62,12289200,639.62 -2007-10-17,630.45,634.00,621.59,633.48,6030500,633.48 -2007-10-16,618.49,625.92,611.99,616.00,6025300,616.00 -2007-10-15,638.47,639.86,615.55,620.11,6943800,620.11 -2007-10-12,623.98,638.40,618.24,637.39,6823700,637.39 -2007-10-11,633.64,641.41,609.00,622.00,11799000,622.00 -2007-10-10,621.36,625.68,616.80,625.39,5385600,625.39 -2007-10-09,615.11,623.78,608.39,615.18,8767800,615.18 -2007-10-08,595.00,610.26,593.95,609.62,5028000,609.62 -2007-10-05,587.11,596.00,587.01,594.05,5068700,594.05 -2007-10-04,585.09,585.09,577.06,579.03,2986700,579.03 -2007-10-03,586.25,588.99,580.36,584.02,3879500,584.02 -2007-10-02,583.38,596.81,580.01,584.39,7067500,584.39 -2007-10-01,569.97,584.35,569.61,582.55,4711300,582.55 -2007-09-28,567.00,569.55,564.12,567.27,2639500,567.27 -2007-09-27,571.73,571.74,565.78,567.50,2056300,567.50 -2007-09-26,570.40,571.79,563.81,568.16,3346100,568.16 -2007-09-25,564.00,569.56,562.86,569.00,2730600,569.00 -2007-09-24,561.00,571.46,560.00,568.02,5297000,568.02 -2007-09-21,556.34,560.79,552.83,560.10,8011700,560.10 -2007-09-20,547.00,556.80,546.03,552.83,5525000,552.83 -2007-09-19,539.27,549.45,538.86,546.85,5526900,546.85 -2007-09-18,526.52,537.25,524.27,535.27,4215700,535.27 -2007-09-17,526.53,529.28,524.07,525.30,2197500,525.30 -2007-09-14,523.20,530.27,522.22,528.75,2764900,528.75 -2007-09-13,524.06,527.21,523.22,524.78,1891100,524.78 -2007-09-12,520.53,527.98,519.00,522.65,2986000,522.65 -2007-09-11,516.99,521.65,515.73,521.33,2703600,521.33 -2007-09-10,521.28,522.07,510.88,514.48,3225800,514.48 -2007-09-07,517.86,521.24,516.80,519.35,3663600,519.35 -2007-09-06,529.36,529.83,518.24,523.52,3625900,523.52 -2007-09-05,523.40,529.48,522.25,527.80,3312900,527.80 -2007-09-04,515.02,528.00,514.62,525.15,3693700,525.15 -2007-08-31,513.10,516.50,511.47,515.25,2977600,515.25 -2007-08-30,512.36,515.40,510.58,511.40,2651700,511.40 -2007-08-29,507.84,513.30,507.23,512.88,2549300,512.88 -2007-08-28,511.53,514.98,505.79,506.40,3273900,506.40 -2007-08-27,514.43,517.45,511.40,513.26,2325100,513.26 -2007-08-24,512.61,515.55,508.50,515.00,2472700,515.00 -2007-08-23,516.00,516.13,507.00,512.19,3076700,512.19 -2007-08-22,509.96,516.25,509.25,512.75,3252700,512.75 -2007-08-21,498.94,508.16,497.77,506.61,3610600,506.61 -2007-08-20,502.46,502.56,496.00,497.92,2697300,497.92 -2007-08-17,497.44,501.00,491.65,500.04,5479400,500.04 -2007-08-16,492.02,496.43,480.46,491.52,8645600,491.52 -2007-08-15,509.00,511.69,496.71,497.55,5409500,497.55 -2007-08-14,515.72,517.40,508.00,508.60,3633700,508.60 -2007-08-13,519.54,519.75,513.03,515.50,3179300,515.50 -2007-08-10,510.18,518.72,505.63,515.75,5875200,515.75 -2007-08-09,520.80,526.82,514.63,514.73,4846500,514.73 -2007-08-08,519.34,525.78,517.09,525.78,4068800,525.78 -2007-08-07,509.75,519.88,509.04,516.02,4264300,516.02 -2007-08-06,503.00,510.15,502.50,510.00,3651500,510.00 -2007-08-03,510.05,513.20,503.00,503.00,3176200,503.00 -2007-08-02,513.72,514.99,509.00,511.01,3154900,511.01 -2007-08-01,510.50,516.51,508.14,512.94,4421500,512.94 -2007-07-31,520.23,520.44,510.00,510.00,4270500,510.00 -2007-07-30,512.92,519.34,510.50,516.11,3963300,516.11 -2007-07-27,508.53,516.62,505.50,511.89,5509100,511.89 -2007-07-26,508.74,512.59,498.88,508.00,6883400,508.00 -2007-07-25,516.98,517.02,505.56,509.76,5545000,509.76 -2007-07-24,509.30,518.69,507.11,514.00,5572100,514.00 -2007-07-23,519.01,520.00,512.15,512.51,6356700,512.51 -2007-07-20,511.90,523.18,509.50,520.12,17772300,520.12 -2007-07-19,553.46,553.52,542.24,548.59,11127200,548.59 -2007-07-18,553.89,554.50,543.81,549.50,6080000,549.50 -2007-07-17,555.04,557.73,552.38,555.00,4328600,555.00 -2007-07-16,550.30,558.58,549.31,552.99,6599500,552.99 -2007-07-13,547.91,552.67,547.25,552.16,5237100,552.16 -2007-07-12,545.86,547.32,540.22,545.33,3441600,545.33 -2007-07-11,543.61,546.50,540.01,544.47,3309300,544.47 -2007-07-10,543.79,547.00,541.65,543.34,3856000,543.34 -2007-07-09,543.00,548.74,540.26,542.56,3729800,542.56 -2007-07-06,541.25,543.87,538.73,539.40,2747000,539.40 -2007-07-05,535.56,544.40,532.15,541.63,4942900,541.63 -2007-07-03,531.06,534.40,527.50,534.34,1871800,534.34 -2007-07-02,525.49,531.85,524.20,530.38,3487600,530.38 -2007-06-29,526.02,527.40,519.46,522.70,3880600,522.70 -2007-06-28,524.88,529.50,523.80,525.01,4168400,525.01 -2007-06-27,525.00,527.99,519.56,526.29,6123100,526.29 -2007-06-26,532.73,533.20,526.24,530.26,5689500,530.26 -2007-06-25,528.98,534.99,523.38,527.42,7925000,527.42 -2007-06-22,516.42,524.99,516.10,524.98,7203700,524.98 -2007-06-21,510.98,515.29,506.28,514.11,4409700,514.11 -2007-06-20,516.96,518.75,509.06,509.97,4338200,509.97 -2007-06-19,514.01,517.25,511.54,514.31,4355300,514.31 -2007-06-18,506.18,516.00,504.24,515.20,4835900,515.20 -2007-06-15,508.19,509.00,501.23,505.89,6174100,505.89 -2007-06-14,505.38,505.88,501.70,502.84,4621200,502.84 -2007-06-13,507.09,508.54,498.69,505.24,7034000,505.24 -2007-06-12,508.71,511.67,503.17,504.77,6419500,504.77 -2007-06-11,514.02,518.25,510.00,511.34,4647700,511.34 -2007-06-08,516.20,519.64,509.46,515.49,6358200,515.49 -2007-06-07,519.75,526.50,512.51,515.06,10630500,515.06 -2007-06-06,516.75,520.78,515.26,518.25,7886700,518.25 -2007-06-05,509.75,519.00,506.61,518.84,10447100,518.84 -2007-06-04,497.91,510.51,497.59,507.07,7101000,507.07 -2007-06-01,501.00,505.02,497.93,500.40,4799000,500.40 -2007-05-31,500.56,508.78,497.06,497.91,8924300,497.91 -2007-05-30,484.50,498.84,483.00,498.60,7245800,498.60 -2007-05-29,485.00,491.80,484.00,487.11,5218000,487.11 -2007-05-25,479.70,484.95,477.27,483.52,5348500,483.52 -2007-05-24,475.15,479.20,471.50,474.33,4173600,474.33 -2007-05-23,480.82,483.41,473.75,473.97,5060200,473.97 -2007-05-22,473.00,479.01,473.00,475.86,3839000,475.86 -2007-05-21,469.53,479.20,466.72,470.60,6159300,470.60 -2007-05-18,472.03,472.70,469.75,470.32,3695900,470.32 -2007-05-17,472.46,475.22,470.81,470.96,4660600,470.96 -2007-05-16,462.00,473.14,459.02,472.61,6554200,472.61 -2007-05-15,461.96,462.54,457.41,458.00,4119000,458.00 -2007-05-14,465.48,467.51,460.00,461.78,3872700,461.78 -2007-05-11,461.83,467.00,461.00,466.74,2944100,466.74 -2007-05-10,467.04,469.49,461.02,461.47,3686300,461.47 -2007-05-09,466.15,471.73,463.88,469.25,3889900,469.25 -2007-05-08,466.13,468.17,464.73,466.81,2905100,466.81 -2007-05-07,472.14,472.82,466.47,467.27,3020100,467.27 -2007-05-04,470.12,474.84,465.88,471.12,3950000,471.12 -2007-05-03,466.22,474.07,465.29,473.23,3594200,473.23 -2007-05-02,468.65,471.08,465.73,465.78,3062700,465.78 -2007-05-01,472.19,472.81,464.17,469.00,3658200,469.00 -2007-04-30,479.15,481.35,471.38,471.38,3641200,471.38 -2007-04-27,480.07,482.40,478.33,479.01,2925700,479.01 -2007-04-26,478.10,484.45,477.11,481.18,4124900,481.18 -2007-04-25,480.00,481.37,476.11,477.99,3966800,477.99 -2007-04-24,478.61,479.98,475.55,477.53,3694700,477.53 -2007-04-23,480.10,485.00,478.26,479.08,5674600,479.08 -2007-04-20,490.52,492.50,482.02,482.48,12161500,482.48 -2007-04-19,474.50,481.95,469.59,471.65,11009600,471.65 -2007-04-18,471.26,479.90,469.53,476.01,5670500,476.01 -2007-04-17,473.80,476.39,471.60,472.80,3210100,472.80 -2007-04-16,468.46,476.99,468.15,474.27,5077900,474.27 -2007-04-13,468.45,468.77,463.36,466.29,2794800,466.29 -2007-04-12,464.00,468.00,462.24,467.39,2707900,467.39 -2007-04-11,466.06,469.40,462.61,464.53,3812000,464.53 -2007-04-10,467.09,470.79,465.16,466.50,2979300,466.50 -2007-04-09,472.98,473.00,465.59,468.21,3062100,468.21 -2007-04-05,471.30,472.09,469.62,471.51,2715800,471.51 -2007-04-04,472.14,473.00,469.58,471.02,3778800,471.02 -2007-04-03,464.05,474.25,464.00,472.60,6501800,472.60 -2007-04-02,457.76,458.53,452.12,458.53,3448500,458.53 -2007-03-30,462.10,463.40,456.14,458.16,3380200,458.16 -2007-03-29,464.55,466.00,455.00,460.92,3988500,460.92 -2007-03-28,461.87,465.44,460.15,461.88,4591600,461.88 -2007-03-27,463.55,465.23,460.34,463.62,3741200,463.62 -2007-03-26,460.55,465.00,455.62,465.00,4710300,465.00 -2007-03-23,461.45,463.39,457.08,461.83,4111300,461.83 -2007-03-22,455.61,462.17,452.53,462.04,5680700,462.04 -2007-03-21,445.30,456.57,445.21,456.55,5798300,456.55 -2007-03-20,445.79,447.60,443.60,445.28,3421500,445.28 -2007-03-19,443.25,448.50,440.63,447.23,5197700,447.23 -2007-03-16,445.65,446.70,439.89,440.85,5659100,440.85 -2007-03-15,447.86,449.82,443.94,446.19,3944200,446.19 -2007-03-14,443.23,448.66,439.00,448.00,8016900,448.00 -2007-03-13,450.11,451.93,442.83,443.03,6377300,443.03 -2007-03-12,452.57,455.25,451.11,454.75,3465400,454.75 -2007-03-09,458.00,458.40,450.10,452.96,4977700,452.96 -2007-03-08,459.22,465.50,454.10,454.72,5362800,454.72 -2007-03-07,462.69,463.14,454.29,455.64,6534100,455.64 -2007-03-06,447.47,459.00,447.38,457.55,7533700,457.55 -2007-03-05,437.02,445.50,437.00,440.95,6355100,440.95 -2007-03-02,445.11,448.70,438.68,438.68,6583600,438.68 -2007-03-01,442.67,452.42,440.00,448.23,8685200,448.23 -2007-02-28,450.41,453.67,443.04,449.45,8032300,449.45 -2007-02-27,455.00,459.80,447.17,448.77,9312800,448.77 -2007-02-26,472.83,475.25,463.75,464.93,3969900,464.93 -2007-02-23,475.75,476.95,467.80,470.62,3882600,470.62 -2007-02-22,478.69,484.24,474.39,475.85,5743900,475.85 -2007-02-21,469.84,478.68,467.74,475.86,5640600,475.86 -2007-02-20,468.47,472.75,464.71,472.10,4067600,472.10 -2007-02-16,462.80,470.15,462.06,469.94,6177000,469.94 -2007-02-15,466.00,466.13,460.72,461.47,4042400,461.47 -2007-02-14,460.00,469.13,459.22,465.93,5698800,465.93 -2007-02-13,459.15,462.78,457.26,459.10,4062600,459.10 -2007-02-12,460.68,462.39,455.02,458.29,5754500,458.29 -2007-02-09,471.65,472.68,461.50,461.89,4858600,461.89 -2007-02-08,468.05,473.75,465.15,471.03,4076700,471.03 -2007-02-07,473.82,474.35,468.78,470.01,4119800,470.01 -2007-02-06,468.10,473.30,467.26,471.48,5321900,471.48 -2007-02-05,477.50,478.00,466.19,467.16,7206900,467.16 -2007-02-02,482.61,485.00,477.81,481.50,6286500,481.50 -2007-02-01,506.00,506.01,481.53,481.75,15658700,481.75 -2007-01-31,496.49,505.00,495.51,501.50,12206100,501.50 -2007-01-30,494.00,498.00,491.22,494.32,4180500,494.32 -2007-01-29,498.00,498.75,490.50,492.47,4775700,492.47 -2007-01-26,490.93,497.90,487.03,495.84,5496500,495.84 -2007-01-25,501.00,504.50,485.66,488.09,6368500,488.09 -2007-01-24,484.45,499.54,483.29,499.07,6059300,499.07 -2007-01-23,480.79,484.75,477.29,479.05,4665500,479.05 -2007-01-22,492.50,492.65,478.50,480.84,5404300,480.84 -2007-01-19,487.98,490.76,486.74,489.75,4978300,489.75 -2007-01-18,494.52,496.48,487.43,487.83,5932000,487.83 -2007-01-17,503.39,507.77,494.38,497.28,6699100,497.28 -2007-01-16,507.55,513.00,503.30,504.28,7568900,504.28 -2007-01-12,501.99,505.00,500.00,505.00,4473700,505.00 -2007-01-11,497.20,501.75,496.18,499.72,7208200,499.72 -2007-01-10,484.43,493.55,482.04,489.46,5968500,489.46 -2007-01-09,485.45,488.25,481.20,485.50,5381400,485.50 -2007-01-08,487.69,489.87,482.20,483.58,4754400,483.58 -2007-01-05,482.50,487.50,478.11,487.19,6872100,487.19 -2007-01-04,469.00,483.95,468.35,483.26,7887600,483.26 -2007-01-03,466.00,476.66,461.11,467.59,7706500,467.59 -2006-12-29,462.10,464.47,459.86,460.48,2559200,460.48 -2006-12-28,467.12,468.58,462.25,462.56,3116200,462.56 -2006-12-27,460.00,468.08,459.10,468.03,4231500,468.03 -2006-12-26,456.52,459.47,454.59,457.53,2074300,457.53 -2006-12-22,457.50,458.64,452.73,455.58,3988300,455.58 -2006-12-21,464.18,465.25,452.34,456.20,6953300,456.20 -2006-12-20,470.00,471.50,462.33,462.90,4367800,462.90 -2006-12-19,461.72,469.31,458.50,468.63,6587000,468.63 -2006-12-18,482.51,482.74,460.72,462.80,8016600,462.80 -2006-12-15,482.64,484.11,479.84,480.30,5190800,480.30 -2006-12-14,480.25,483.75,477.26,482.12,4748900,482.12 -2006-12-13,484.69,485.50,477.02,478.99,4662100,478.99 -2006-12-12,483.85,486.36,480.28,481.78,4181000,481.78 -2006-12-11,484.92,488.90,483.80,483.93,3263400,483.93 -2006-12-08,481.94,488.60,480.00,484.11,3974900,484.11 -2006-12-07,490.23,491.80,482.42,482.64,4664300,482.64 -2006-12-06,486.96,492.40,484.52,488.71,4450300,488.71 -2006-12-05,487.40,489.44,484.89,487.00,4103000,487.00 -2006-12-04,483.00,487.43,479.35,484.85,4899900,484.85 -2006-12-01,485.98,488.39,478.50,480.80,5631400,480.80 -2006-11-30,484.19,490.40,481.55,484.81,5577500,484.81 -2006-11-29,494.24,494.74,482.25,484.65,6315300,484.65 -2006-11-28,481.13,489.86,477.03,489.50,7797600,489.50 -2006-11-27,501.37,501.78,484.75,484.75,7324700,484.75 -2006-11-24,504.50,507.50,504.00,505.00,1732700,505.00 -2006-11-22,510.97,513.00,505.78,508.01,4500700,508.01 -2006-11-21,496.54,510.00,495.83,509.65,8427500,509.65 -2006-11-20,498.40,498.40,492.65,495.05,5124500,495.05 -2006-11-17,493.25,499.66,493.00,498.79,5511000,498.79 -2006-11-16,495.00,497.68,492.56,495.90,5092600,495.90 -2006-11-15,493.43,499.85,491.93,491.93,8370700,491.93 -2006-11-14,480.70,489.95,480.50,489.30,7223400,489.30 -2006-11-13,474.90,481.17,474.14,481.03,4341900,481.03 -2006-11-10,473.78,474.72,470.29,473.55,2796700,473.55 -2006-11-09,476.50,479.49,471.86,472.63,4879200,472.63 -2006-11-08,470.35,481.74,468.60,475.00,7965000,475.00 -2006-11-07,476.95,479.02,471.77,472.57,4897100,472.57 -2006-11-06,473.77,479.66,472.33,476.95,4991500,476.95 -2006-11-03,472.23,473.75,465.06,471.80,4907700,471.80 -2006-11-02,467.50,473.73,466.38,469.91,5236700,469.91 -2006-11-01,478.76,479.13,465.26,467.50,5426300,467.50 -2006-10-31,478.06,482.16,473.84,476.39,6285400,476.39 -2006-10-30,474.82,480.46,470.01,476.57,6563100,476.57 -2006-10-27,483.90,485.24,472.49,475.20,6604000,475.20 -2006-10-26,487.68,491.96,484.20,485.10,7031700,485.10 -2006-10-25,477.49,488.50,475.11,486.60,9187500,486.60 -2006-10-24,476.28,477.86,471.41,473.31,8660200,473.31 -2006-10-23,462.28,484.64,460.37,480.78,15104500,480.78 -2006-10-20,458.99,460.10,453.59,459.67,11647900,459.67 -2006-10-19,420.23,429.50,419.57,426.06,11503500,426.06 -2006-10-18,422.99,424.75,417.50,419.31,6017300,419.31 -2006-10-17,420.30,423.75,416.70,420.64,5211000,420.64 -2006-10-16,427.70,429.20,421.34,421.75,4319400,421.75 -2006-10-13,427.76,429.50,425.56,427.30,3622500,427.30 -2006-10-12,428.56,429.68,424.00,427.44,4844000,427.44 -2006-10-11,425.02,429.91,423.76,426.50,5635400,426.50 -2006-10-10,431.56,437.85,422.39,426.65,9788600,426.65 -2006-10-09,424.80,431.95,423.42,429.00,7583300,429.00 -2006-10-06,410.22,421.91,409.75,420.50,7336500,420.50 -2006-10-05,414.70,418.24,410.86,411.81,5789800,411.81 -2006-10-04,404.97,415.77,403.05,415.70,6661800,415.70 -2006-10-03,401.29,406.46,398.19,404.04,5464700,404.04 -2006-10-02,401.90,406.00,400.80,401.44,3651900,401.44 -2006-09-29,405.13,405.62,401.41,401.90,3310900,401.90 -2006-09-28,404.08,406.98,400.54,403.58,5107400,403.58 -2006-09-27,406.30,411.22,402.37,402.92,5876700,402.92 -2006-09-26,405.50,407.68,401.77,406.87,5289400,406.87 -2006-09-25,405.58,409.45,402.50,403.98,5737300,403.98 -2006-09-22,404.98,407.45,401.36,403.78,4649600,403.78 -2006-09-21,400.30,408.45,399.86,406.85,10692100,406.85 -2006-09-20,407.10,407.39,394.62,397.00,9147800,397.00 -2006-09-19,415.46,415.49,392.74,403.81,14292900,403.81 -2006-09-18,410.00,418.69,409.47,414.69,7106700,414.69 -2006-09-15,407.48,410.05,406.74,409.88,7838200,409.88 -2006-09-14,404.30,406.28,401.93,403.98,5366100,403.98 -2006-09-13,395.15,406.76,395.10,406.57,9768200,406.57 -2006-09-12,385.00,392.73,384.88,391.90,5442200,391.90 -2006-09-11,378.26,384.69,377.77,384.09,4529200,384.09 -2006-09-08,376.72,380.79,376.72,377.85,3083400,377.85 -2006-09-07,379.39,381.75,377.40,378.49,3842000,378.49 -2006-09-06,382.10,383.19,379.66,380.14,3724100,380.14 -2006-09-05,379.87,385.40,377.44,384.36,4074300,384.36 -2006-09-01,380.99,381.28,377.19,378.60,2672900,378.60 -2006-08-31,381.49,382.15,378.20,378.53,2959900,378.53 -2006-08-30,379.21,384.65,378.51,380.75,4044400,380.75 -2006-08-29,380.78,382.32,377.20,378.95,4460000,378.95 -2006-08-28,375.61,380.95,375.00,380.95,4164000,380.95 -2006-08-25,373.08,375.32,372.50,373.26,2466700,373.26 -2006-08-24,374.44,376.40,372.26,373.73,3482500,373.73 -2006-08-23,377.64,378.27,372.66,373.43,3642300,373.43 -2006-08-22,377.73,379.26,374.84,378.29,4164100,378.29 -2006-08-21,378.10,379.00,375.22,377.30,4023300,377.30 -2006-08-18,386.31,387.09,380.75,383.36,4952200,383.36 -2006-08-17,386.39,390.00,383.92,385.80,5080200,385.80 -2006-08-16,383.48,388.45,382.12,387.72,5853200,387.72 -2006-08-15,374.11,381.67,372.60,380.97,6698200,380.97 -2006-08-14,371.50,375.13,368.67,369.43,4968300,369.43 -2006-08-11,374.40,375.28,368.00,368.50,3766500,368.50 -2006-08-10,373.88,377.67,372.46,374.20,4261900,374.20 -2006-08-09,382.80,384.68,376.36,376.94,4311000,376.94 -2006-08-08,382.82,384.50,379.09,381.00,5743200,381.00 -2006-08-07,371.50,379.73,371.15,377.95,3946900,377.95 -2006-08-04,379.56,380.68,371.75,373.85,5095200,373.85 -2006-08-03,364.98,377.91,363.36,375.39,6327000,375.39 -2006-08-02,375.60,377.17,365.20,367.23,7097800,367.23 -2006-08-01,385.11,385.77,375.51,375.51,5463200,375.51 -2006-07-31,388.00,389.17,383.31,386.60,4595300,386.60 -2006-07-28,382.00,389.56,381.73,388.12,4083600,388.12 -2006-07-27,387.37,387.49,377.95,382.40,5641100,382.40 -2006-07-26,388.20,391.91,383.00,385.50,5531900,385.50 -2006-07-25,385.02,391.31,383.80,389.36,5761100,389.36 -2006-07-24,392.82,393.89,381.21,390.90,8086100,390.90 -2006-07-21,386.14,391.75,377.69,390.11,11754600,390.11 -2006-07-20,404.28,404.44,385.66,387.12,12538700,387.12 -2006-07-19,395.01,401.14,394.66,399.00,8518500,399.00 -2006-07-18,409.75,410.57,397.74,403.05,8536800,403.05 -2006-07-17,404.63,411.00,403.72,407.89,5811900,407.89 -2006-07-14,410.33,411.49,398.61,403.50,7552100,403.50 -2006-07-13,414.00,418.34,406.83,408.83,6924500,408.83 -2006-07-12,422.09,422.74,416.73,417.25,4906700,417.25 -2006-07-11,418.51,425.05,413.03,424.56,5971300,424.56 -2006-07-10,423.44,425.23,416.38,418.20,4436400,418.20 -2006-07-07,426.05,427.89,415.88,420.45,6041900,420.45 -2006-07-06,423.38,425.38,421.98,423.19,3687100,423.19 -2006-07-05,421.52,422.80,415.64,421.46,4985600,421.46 -2006-07-03,420.04,423.77,419.45,423.20,2156700,423.20 -2006-06-30,415.60,419.33,412.33,419.33,6258000,419.33 -2006-06-29,407.99,418.20,405.82,417.81,6658200,417.81 -2006-06-28,404.01,406.48,401.13,406.11,3710500,406.11 -2006-06-27,405.71,408.00,401.01,402.32,4107100,402.32 -2006-06-26,406.75,408.30,403.25,404.22,3551200,404.22 -2006-06-23,402.76,409.75,400.74,404.86,5314800,404.86 -2006-06-22,401.58,406.00,388.00,399.95,5911900,399.95 -2006-06-21,391.06,404.00,389.75,402.13,8744400,402.13 -2006-06-20,388.03,391.87,386.51,387.17,4039900,387.17 -2006-06-19,390.85,394.80,386.98,388.14,7633100,388.14 -2006-06-16,389.10,390.93,388.00,390.70,5304600,390.70 -2006-06-15,386.62,392.25,383.00,391.00,6785700,391.00 -2006-06-14,389.83,391.10,378.52,384.39,7772000,384.39 -2006-06-13,380.90,387.00,378.12,386.52,7659100,386.52 -2006-06-12,388.34,390.49,381.00,381.54,5019100,381.54 -2006-06-09,392.19,395.43,385.35,386.57,6157500,386.57 -2006-06-08,387.75,394.27,378.59,393.30,10359500,393.30 -2006-06-07,393.24,394.86,386.50,386.51,8911300,386.51 -2006-06-06,376.58,390.00,376.30,389.99,10259800,389.99 -2006-06-05,376.18,381.45,374.15,374.44,5558500,374.44 -2006-06-02,386.84,387.08,377.45,379.44,6386400,379.44 -2006-06-01,373.54,382.99,371.60,382.62,6278000,382.62 -2006-05-31,373.80,378.25,366.78,371.82,7981300,371.82 -2006-05-30,378.28,381.00,371.45,371.94,4316000,371.94 -2006-05-26,384.55,385.88,380.03,381.35,3667000,381.35 -2006-05-25,379.08,383.00,372.31,382.99,8194600,382.99 -2006-05-24,377.35,383.44,371.61,381.25,9553800,381.25 -2006-05-23,374.21,383.88,373.56,375.58,8983000,375.58 -2006-05-22,367.85,373.03,365.25,370.95,8604400,370.95 -2006-05-19,373.28,374.50,360.57,370.02,11398200,370.02 -2006-05-18,378.78,381.81,370.71,370.99,5835000,370.99 -2006-05-17,370.61,379.84,370.22,374.50,10643800,374.50 -2006-05-16,375.99,376.86,369.89,371.30,6491100,371.30 -2006-05-15,375.93,380.15,368.25,376.20,8590100,376.20 -2006-05-12,383.54,384.87,373.55,374.13,10087600,374.13 -2006-05-11,403.42,404.71,384.98,387.00,8892800,387.00 -2006-05-10,408.31,411.71,401.86,402.98,6187200,402.98 -2006-05-09,395.70,409.00,393.75,408.80,9140600,408.80 -2006-05-08,395.11,397.12,390.05,394.78,5118600,394.78 -2006-05-05,397.60,400.68,391.78,394.30,6065000,394.30 -2006-05-04,395.03,398.87,392.21,394.75,4652000,394.75 -2006-05-03,396.35,401.50,390.88,394.17,8072200,394.17 -2006-05-02,401.08,402.49,388.40,394.80,13104300,394.80 -2006-05-01,418.47,419.44,398.55,398.90,10361200,398.90 -2006-04-28,418.63,425.73,416.30,417.94,7421300,417.94 -2006-04-27,422.91,426.91,419.39,420.03,8337900,420.03 -2006-04-26,427.74,430.04,423.53,425.97,7277800,425.97 -2006-04-25,439.63,441.04,426.00,427.16,9569000,427.16 -2006-04-24,439.40,444.70,436.52,440.50,8836400,440.50 -2006-04-21,448.90,450.72,436.17,437.10,22551300,437.10 -2006-04-20,411.01,416.00,408.20,415.00,12271500,415.00 -2006-04-19,412.57,413.64,406.73,410.50,6781700,410.50 -2006-04-18,407.93,409.83,401.50,404.24,8137600,404.24 -2006-04-17,403.45,412.50,400.84,406.82,8259500,406.82 -2006-04-13,408.63,409.76,400.50,402.16,6552900,402.16 -2006-04-12,409.00,411.33,405.19,408.95,6017000,408.95 -2006-04-11,416.42,419.10,406.22,409.66,11107200,409.66 -2006-04-10,407.08,417.17,405.25,416.38,9320100,416.38 -2006-04-07,412.41,412.85,404.02,406.16,7025900,406.16 -2006-04-06,406.49,413.89,405.43,411.18,8598500,411.18 -2006-04-05,408.20,414.57,402.82,407.99,13410500,407.99 -2006-04-04,389.90,404.90,388.14,404.34,15715700,404.34 -2006-04-03,389.53,392.47,387.93,389.70,8122700,389.70 -2006-03-31,388.74,391.87,384.03,390.00,36521400,390.00 -2006-03-30,389.19,393.50,383.61,388.44,14711700,388.44 -2006-03-29,379.94,399.00,379.51,394.98,19027500,394.98 -2006-03-28,371.71,377.86,371.17,377.20,8945800,377.20 -2006-03-27,367.09,371.71,365.00,369.69,7023700,369.69 -2006-03-24,368.62,370.09,362.51,365.80,15180600,365.80 -2006-03-23,342.35,345.75,340.20,341.89,7434700,341.89 -2006-03-22,339.75,344.10,337.50,340.22,7596000,340.22 -2006-03-21,350.01,351.66,339.08,339.92,9831100,339.92 -2006-03-20,342.34,350.09,341.54,348.19,10407600,348.19 -2006-03-17,338.80,341.78,334.93,339.79,8551700,339.79 -2006-03-16,348.61,348.75,337.90,338.77,10016700,338.77 -2006-03-15,350.77,352.30,340.53,344.50,12768800,344.50 -2006-03-14,337.14,352.37,332.62,351.16,18450700,351.16 -2006-03-13,340.93,346.10,335.45,337.06,13642400,337.06 -2006-03-10,343.50,344.50,331.55,337.50,19325600,337.50 -2006-03-09,355.39,358.53,341.50,343.00,13910400,343.00 -2006-03-08,353.93,360.03,350.54,353.88,11745600,353.88 -2006-03-07,365.02,368.45,358.15,364.45,10378800,364.45 -2006-03-06,380.91,383.40,367.14,368.10,8939700,368.10 -2006-03-03,384.30,387.24,375.76,378.18,11962000,378.18 -2006-03-02,364.28,381.10,362.20,376.45,18330300,376.45 -2006-03-01,368.56,369.45,361.30,364.80,12061200,364.80 -2006-02-28,393.20,397.54,338.51,362.62,39437600,362.62 -2006-02-27,381.27,391.70,380.28,390.38,10212200,390.38 -2006-02-24,377.30,380.07,373.49,377.40,6484300,377.40 -2006-02-23,365.61,381.24,365.39,378.07,12551600,378.07 -2006-02-22,367.15,368.95,363.86,365.49,6476200,365.49 -2006-02-21,366.44,373.54,365.11,366.59,8686000,366.59 -2006-02-17,369.86,372.14,363.62,368.75,14320200,368.75 -2006-02-16,345.67,367.00,344.49,366.46,21315500,366.46 -2006-02-15,341.27,346.00,337.83,342.38,12947000,342.38 -2006-02-14,345.33,351.69,342.40,343.32,14654000,343.32 -2006-02-13,346.64,350.60,341.89,345.70,19717800,345.70 -2006-02-10,361.95,364.50,353.14,362.61,15223500,362.61 -2006-02-09,371.20,374.40,356.11,358.77,11912400,358.77 -2006-02-08,368.48,370.69,354.67,369.08,20804100,369.08 -2006-02-07,382.99,383.70,363.35,367.92,16630200,367.92 -2006-02-06,385.31,389.90,379.56,385.10,8940400,385.10 -2006-02-03,393.62,393.90,372.57,381.55,18281800,381.55 -2006-02-02,403.82,406.50,395.98,396.04,11807700,396.04 -2006-02-01,389.03,402.00,387.52,401.78,27122500,401.78 -2006-01-31,430.57,439.60,423.97,432.66,22066000,432.66 -2006-01-30,429.23,433.28,425.00,426.82,8588900,426.82 -2006-01-27,435.00,438.22,428.98,433.49,8452200,433.49 -2006-01-26,439.54,439.99,423.56,434.27,12926100,434.27 -2006-01-25,451.26,454.23,429.22,433.00,18739800,433.00 -2006-01-24,436.03,444.95,434.48,443.03,15464600,443.03 -2006-01-23,407.38,428.39,405.73,427.50,22741400,427.50 -2006-01-20,438.70,440.03,394.74,399.46,41116700,399.46 -2006-01-19,451.17,453.49,433.00,436.45,14537300,436.45 -2006-01-18,447.30,457.36,443.25,444.91,20485700,444.91 -2006-01-17,463.06,469.90,462.53,467.11,8270300,467.11 -2006-01-13,464.31,466.89,461.61,466.25,7656600,466.25 -2006-01-12,473.72,474.99,461.50,463.63,10125300,463.63 -2006-01-11,471.27,475.11,469.18,471.63,9007400,471.63 -2006-01-10,464.42,470.25,462.04,469.76,9097100,469.76 -2006-01-09,466.41,473.40,460.94,466.90,12791900,466.90 -2006-01-06,456.87,470.50,453.24,465.66,17756900,465.66 -2006-01-05,446.00,451.55,441.50,451.24,10808300,451.24 -2006-01-04,443.90,448.96,439.75,445.24,15286400,445.24 -2006-01-03,422.52,435.67,418.22,435.23,13121200,435.23 -2005-12-30,417.27,418.21,413.74,414.86,7587100,414.86 -2005-12-29,427.98,428.73,419.17,420.15,6945800,420.15 -2005-12-28,424.34,427.78,421.26,426.69,7117900,426.69 -2005-12-27,431.86,431.86,422.76,424.64,6702800,424.64 -2005-12-23,432.15,432.50,428.78,430.93,4595100,430.93 -2005-12-22,431.77,432.86,425.93,432.04,7546600,432.04 -2005-12-21,433.55,436.86,420.71,426.33,11221900,426.33 -2005-12-20,427.86,432.20,424.67,429.74,10084700,429.74 -2005-12-19,432.20,446.21,420.11,424.60,21936800,424.60 -2005-12-16,425.34,432.50,422.75,430.15,16330500,430.15 -2005-12-15,419.11,423.14,416.50,422.55,6045800,422.55 -2005-12-14,417.04,419.73,415.49,418.96,6630400,418.96 -2005-12-13,412.50,418.00,411.64,417.49,8157000,417.49 -2005-12-12,414.63,415.21,409.95,412.61,6950100,412.61 -2005-12-09,415.00,415.78,408.56,409.20,7643400,409.20 -2005-12-08,405.30,410.65,402.64,410.65,8910100,410.65 -2005-12-07,406.16,406.70,399.01,404.22,11665900,404.22 -2005-12-06,408.70,416.41,401.70,404.54,15114700,404.54 -2005-12-05,417.00,417.50,404.28,405.85,10289400,405.85 -2005-12-02,416.94,419.53,413.86,417.70,7543500,417.70 -2005-12-01,409.20,415.44,408.29,414.09,9744900,414.09 -2005-11-30,404.26,408.45,395.56,404.91,15596600,404.91 -2005-11-29,424.46,426.40,402.14,403.54,21495800,403.54 -2005-11-28,429.82,431.24,422.44,423.48,11008400,423.48 -2005-11-25,425.78,428.75,425.30,428.62,4840100,428.62 -2005-11-23,417.04,424.72,415.78,422.86,10085000,422.86 -2005-11-22,408.65,417.31,406.23,416.47,9596000,416.47 -2005-11-21,399.17,409.98,393.49,409.36,10335100,409.36 -2005-11-18,403.49,404.50,399.85,400.21,7025700,400.21 -2005-11-17,401.80,403.81,399.53,403.45,9212200,403.45 -2005-11-16,396.20,398.85,394.11,398.15,8695200,398.15 -2005-11-15,394.38,397.00,390.95,392.80,8624900,392.80 -2005-11-14,392.12,398.22,391.53,396.97,7807900,396.97 -2005-11-11,395.12,396.90,388.85,390.40,7063900,390.40 -2005-11-10,378.36,391.35,377.43,391.10,9128700,391.10 -2005-11-09,386.67,388.29,378.03,379.15,10466900,379.15 -2005-11-08,394.25,395.59,388.58,389.90,7897500,389.90 -2005-11-07,395.10,397.47,392.15,395.03,9591500,395.03 -2005-11-04,389.98,391.79,385.45,390.43,8824900,390.43 -2005-11-03,382.41,386.58,381.38,385.95,7448400,385.95 -2005-11-02,381.70,385.00,377.17,379.68,10565400,379.68 -2005-11-01,371.86,383.90,369.01,379.38,16356100,379.38 -2005-10-31,360.24,374.75,359.51,372.14,14342900,372.14 -2005-10-28,355.27,358.95,355.02,358.17,5903500,358.17 -2005-10-27,356.60,357.09,351.68,353.06,5134400,353.06 -2005-10-26,346.28,356.00,346.19,355.44,8907500,355.44 -2005-10-25,345.78,347.40,342.86,346.91,6878300,346.91 -2005-10-24,343.37,349.30,342.19,348.65,9431700,348.65 -2005-10-21,345.80,346.43,333.00,339.90,22892400,339.90 -2005-10-20,309.99,311.13,301.21,303.20,13911700,303.20 -2005-10-19,304.00,309.87,303.96,308.70,7010700,308.70 -2005-10-18,304.96,307.96,302.74,303.28,7077800,303.28 -2005-10-17,297.50,305.20,294.56,305.00,7566700,305.00 -2005-10-14,299.90,300.23,292.54,296.14,8519100,296.14 -2005-10-13,302.00,302.00,290.68,297.44,10567700,297.44 -2005-10-12,305.20,307.19,299.00,300.97,9306200,300.97 -2005-10-11,310.61,312.65,304.86,306.10,8542600,306.10 -2005-10-10,313.31,314.82,309.15,310.65,5572200,310.65 -2005-10-07,314.79,316.67,310.54,312.99,6770300,312.99 -2005-10-06,314.14,314.48,310.09,312.75,7993800,312.75 -2005-10-05,312.69,314.90,308.00,310.71,8328400,310.71 -2005-10-04,319.95,321.28,310.74,311.00,9144300,311.00 -2005-10-03,313.63,320.11,312.79,318.68,9160300,318.68 -2005-09-30,314.22,317.50,312.29,316.46,9151300,316.46 -2005-09-29,306.68,310.72,306.08,309.62,5613800,309.62 -2005-09-28,314.22,315.10,305.60,306.00,7997400,306.00 -2005-09-27,314.95,318.41,313.38,313.94,6873100,313.94 -2005-09-26,319.50,320.95,312.56,314.28,9894400,314.28 -2005-09-23,313.00,317.21,312.59,315.36,8483800,315.36 -2005-09-22,311.50,319.22,310.17,311.37,13006400,311.37 -2005-09-21,308.41,313.76,305.96,311.90,10119700,311.90 -2005-09-20,306.15,311.30,305.23,307.91,9351000,307.91 -2005-09-19,301.00,306.00,300.71,303.79,5761900,303.79 -2005-09-16,304.02,304.50,299.87,300.20,7579800,300.20 -2005-09-15,299.52,306.75,297.91,302.62,15466200,302.62 -2005-09-14,308.73,313.28,300.30,303.00,11275800,303.00 -2005-09-13,309.00,315.53,306.17,311.68,10299900,311.68 -2005-09-12,301.75,311.42,301.00,309.74,10386500,309.74 -2005-09-09,297.28,299.10,296.56,299.09,4390500,299.09 -2005-09-08,294.83,299.28,293.36,295.39,6613300,295.39 -2005-09-07,285.89,295.50,285.28,294.87,7499500,294.87 -2005-09-06,289.00,289.39,286.80,287.11,4212300,287.11 -2005-09-02,286.51,289.99,286.44,288.45,3434500,288.45 -2005-09-01,285.91,287.50,285.00,286.25,2742100,286.25 -2005-08-31,288.23,288.50,284.36,286.00,5034000,286.00 -2005-08-30,287.39,289.51,285.88,287.27,4792000,287.27 -2005-08-29,282.24,289.12,282.24,288.45,5903000,288.45 -2005-08-26,283.48,285.02,282.66,283.58,3755300,283.58 -2005-08-25,282.55,284.00,279.97,282.59,4376600,282.59 -2005-08-24,277.57,284.75,276.45,282.57,8593100,282.57 -2005-08-23,276.16,279.74,274.12,279.58,5821700,279.58 -2005-08-22,281.24,281.47,273.35,274.01,6813000,274.01 -2005-08-19,280.99,281.45,279.62,280.00,5542900,280.00 -2005-08-18,275.91,280.50,275.00,279.99,11872800,279.99 -2005-08-17,285.51,286.57,284.00,285.10,3883300,285.10 -2005-08-16,284.88,287.79,283.34,285.65,7109200,285.65 -2005-08-15,289.80,292.77,283.77,284.00,8174700,284.00 -2005-08-12,283.36,290.20,281.64,289.72,6585900,289.72 -2005-08-11,285.89,286.58,280.62,284.05,7514900,284.05 -2005-08-10,291.30,292.33,284.88,285.68,6879000,285.68 -2005-08-09,291.96,292.68,288.51,291.57,5779300,291.57 -2005-08-08,293.60,295.65,290.49,291.25,4481800,291.25 -2005-08-05,297.50,298.51,291.31,292.35,5939700,292.35 -2005-08-04,295.55,299.00,295.25,297.73,5236500,297.73 -2005-08-03,298.00,299.72,295.60,297.30,5930600,297.30 -2005-08-02,291.60,299.52,291.12,299.19,7290200,299.19 -2005-08-01,288.12,292.50,288.10,291.61,5662400,291.61 -2005-07-29,292.14,292.84,286.99,287.76,8363300,287.76 -2005-07-28,297.41,297.41,293.28,293.50,5925600,293.50 -2005-07-27,297.74,298.23,292.40,296.93,7217900,296.93 -2005-07-26,295.01,298.00,292.09,296.09,9816900,296.09 -2005-07-25,302.39,303.29,294.96,295.85,9658800,295.85 -2005-07-22,306.37,309.25,296.33,302.40,23386800,302.40 -2005-07-21,314.05,317.80,311.21,313.94,19789400,313.94 -2005-07-20,305.57,312.61,301.80,312.00,14310400,312.00 -2005-07-19,302.10,310.35,301.80,309.90,12621400,309.90 -2005-07-18,300.00,301.90,297.75,299.54,6207800,299.54 -2005-07-15,301.24,303.40,299.78,301.19,8438400,301.19 -2005-07-14,305.34,306.75,300.07,300.89,10667700,300.89 -2005-07-13,292.51,299.24,292.10,298.86,11437900,298.86 -2005-07-12,293.39,294.40,290.93,291.78,5864900,291.78 -2005-07-11,296.40,296.60,291.02,293.35,8390300,293.35 -2005-07-08,296.25,297.50,294.05,296.23,7457600,296.23 -2005-07-07,289.39,295.80,288.51,295.54,10672100,295.54 -2005-07-06,297.30,297.60,291.38,291.52,8000300,291.52 -2005-07-05,292.10,295.98,290.23,295.71,7494000,295.71 -2005-07-01,295.04,296.24,289.22,291.25,9227600,291.25 -2005-06-30,294.34,298.93,291.04,294.15,15094400,294.15 -2005-06-29,302.50,304.38,292.15,292.72,18298700,292.72 -2005-06-28,306.28,309.25,302.00,302.00,19036500,302.00 -2005-06-27,298.90,304.47,293.86,304.10,17802900,304.10 -2005-06-24,290.90,298.00,289.58,297.25,17771200,297.25 -2005-06-23,288.00,294.81,286.50,289.71,14056400,289.71 -2005-06-22,289.67,292.32,288.67,289.30,10474000,289.30 -2005-06-21,288.07,290.30,284.97,287.84,15132300,287.84 -2005-06-20,276.09,287.67,271.73,286.70,21024700,286.70 -2005-06-17,279.00,280.30,275.90,280.30,10434400,280.30 -2005-06-16,274.26,278.30,273.07,277.44,12462400,277.44 -2005-06-15,275.00,277.30,267.43,274.80,20883100,274.80 -2005-06-14,278.59,281.24,277.75,278.35,10091900,278.35 -2005-06-13,279.82,284.19,276.52,282.75,12803200,282.75 -2005-06-10,286.99,287.28,280.02,282.50,12696600,282.50 -2005-06-09,284.72,288.50,280.56,286.31,16441100,286.31 -2005-06-08,292.85,293.19,278.00,279.56,25700900,279.56 -2005-06-07,297.10,299.59,290.30,293.12,24323000,293.12 -2005-06-06,282.39,293.75,281.83,290.94,22525900,290.94 -2005-06-03,286.79,289.30,277.41,280.26,18782300,280.26 -2005-06-02,288.73,289.78,284.60,287.90,17974100,287.90 -2005-06-01,283.20,292.89,282.02,288.00,35191700,288.00 -2005-05-31,269.43,278.40,269.37,277.27,22236800,277.27 -2005-05-27,260.46,266.05,259.25,266.00,12184100,266.00 -2005-05-26,260.96,263.76,258.30,259.20,13546600,259.20 -2005-05-25,252.73,260.98,250.63,260.81,18057900,260.81 -2005-05-24,256.96,265.44,253.50,256.00,29043100,256.00 -2005-05-23,243.16,258.10,242.71,255.45,21388300,255.45 -2005-05-20,241.21,241.67,239.65,241.61,8163500,241.61 -2005-05-19,240.34,241.17,238.27,239.18,9716500,239.18 -2005-05-18,233.61,239.97,233.52,239.16,12312000,239.16 -2005-05-17,230.56,233.45,230.20,233.13,7808900,233.13 -2005-05-16,229.68,231.62,228.57,231.05,5681400,231.05 -2005-05-13,229.18,231.09,227.32,229.24,7415500,229.24 -2005-05-12,230.81,232.23,228.20,228.72,8948200,228.72 -2005-05-11,228.97,231.98,227.93,231.29,11478800,231.29 -2005-05-10,225.47,227.80,224.72,227.80,6345800,227.80 -2005-05-09,228.00,228.50,225.43,226.02,5536800,226.02 -2005-05-06,228.40,229.25,226.47,228.02,6763900,228.02 -2005-05-05,228.62,228.62,225.88,226.98,7509600,226.98 -2005-05-04,227.23,229.88,227.00,228.50,12083500,228.50 -2005-05-03,221.85,228.15,221.32,226.19,17780200,226.19 -2005-05-02,222.05,223.70,220.21,222.29,9767400,222.29 -2005-04-29,221.91,222.25,217.82,220.00,9170200,220.00 -2005-04-28,219.50,222.08,217.71,219.45,8682800,219.45 -2005-04-27,217.99,220.85,216.74,219.78,10264800,219.78 -2005-04-26,220.22,222.00,218.29,218.75,17272000,218.75 -2005-04-25,217.82,224.74,217.52,223.53,19840000,223.53 -2005-04-22,222.90,224.00,214.26,215.81,33205100,215.81 -2005-04-21,200.42,205.00,199.32,204.22,17751900,204.22 -2005-04-20,198.58,200.50,195.91,198.10,15451500,198.10 -2005-04-19,189.33,192.00,188.03,191.40,8430000,191.40 -2005-04-18,184.58,187.88,183.49,186.97,6550300,186.97 -2005-04-15,190.10,190.34,184.66,185.00,11577400,185.00 -2005-04-14,193.27,194.36,190.10,191.45,6152700,191.45 -2005-04-13,193.47,194.32,189.73,192.93,6555800,192.93 -2005-04-12,193.00,194.42,189.41,193.96,7319600,193.96 -2005-04-11,193.09,194.80,192.32,193.23,5410500,193.23 -2005-04-08,193.69,195.10,191.45,192.05,5116600,192.05 -2005-04-07,188.78,194.62,188.64,193.76,9692200,193.76 -2005-04-06,189.24,189.65,187.58,189.22,5252600,189.22 -2005-04-05,187.73,190.26,187.57,188.57,8736700,188.57 -2005-04-04,179.95,185.32,179.84,185.29,8076400,185.29 -2005-04-01,181.76,182.95,179.99,180.04,6182000,180.04 -2005-03-31,177.95,181.39,177.64,180.51,6768600,180.51 -2005-03-30,180.64,181.45,179.60,180.45,6236100,180.45 -2005-03-29,181.05,183.28,178.07,179.57,6473000,179.57 -2005-03-28,181.68,184.80,180.95,181.42,8738000,181.42 -2005-03-24,180.70,180.86,179.20,179.25,3705200,179.25 -2005-03-23,177.97,180.24,177.97,178.98,4845000,178.98 -2005-03-22,181.18,181.94,177.85,178.60,5631700,178.60 -2005-03-21,179.27,182.17,177.25,180.88,7483700,180.88 -2005-03-18,178.81,180.40,178.31,180.04,7090000,180.04 -2005-03-17,177.13,179.64,175.80,179.29,8260600,179.29 -2005-03-16,176.70,178.61,175.01,175.60,7106300,175.60 -2005-03-15,175.30,180.00,174.21,178.61,10422100,178.61 -2005-03-14,178.33,178.40,172.57,174.99,11146600,174.99 -2005-03-11,180.44,180.95,177.15,177.80,8028300,177.80 -2005-03-10,181.01,181.20,177.40,179.98,10960500,179.98 -2005-03-09,184.21,184.65,180.16,181.35,11360400,181.35 -2005-03-08,189.10,189.85,184.97,185.20,8046100,185.20 -2005-03-07,187.78,189.60,187.03,188.81,8667400,188.81 -2005-03-04,186.70,187.25,185.07,185.90,6774100,185.90 -2005-03-03,186.13,187.75,184.31,187.01,7608600,187.01 -2005-03-02,185.95,187.67,184.36,185.18,7285500,185.18 -2005-03-01,189.29,189.75,182.00,186.06,9311200,186.06 -2005-02-28,186.00,189.87,185.85,187.99,7818400,187.99 -2005-02-25,189.15,189.92,185.51,185.87,9973500,185.87 -2005-02-24,183.37,189.85,182.23,188.89,25814300,188.89 -2005-02-23,193.30,194.48,188.66,193.95,15586000,193.95 -2005-02-22,196.50,198.90,190.39,191.37,13483700,191.37 -2005-02-18,198.51,198.84,196.66,197.95,8485900,197.95 -2005-02-17,197.83,199.75,196.81,197.90,10414400,197.90 -2005-02-16,194.70,199.33,194.30,198.41,16532300,198.41 -2005-02-15,193.60,199.84,193.08,195.23,25782800,195.23 -2005-02-14,182.85,193.08,181.00,192.99,38562200,192.99 -2005-02-11,186.66,192.32,186.07,187.40,13116000,187.40 -2005-02-10,191.97,192.21,185.25,187.98,18982700,187.98 -2005-02-09,200.76,201.60,189.46,191.58,17171500,191.58 -2005-02-08,196.96,200.02,194.53,198.64,11480000,198.64 -2005-02-07,205.26,206.40,195.51,196.03,12960400,196.03 -2005-02-04,206.47,207.75,202.60,204.36,14819300,204.36 -2005-02-03,205.99,213.37,205.81,210.86,12988100,210.86 -2005-02-02,215.55,216.80,203.66,205.96,32799300,205.96 -2005-02-01,194.38,196.66,190.63,191.90,18839000,191.90 -2005-01-31,193.69,196.36,191.72,195.62,9596700,195.62 -2005-01-28,190.02,194.70,186.34,190.34,12208200,190.34 -2005-01-27,188.76,188.86,185.20,188.08,6627400,188.08 -2005-01-26,179.27,189.41,179.15,189.24,12307900,189.24 -2005-01-25,181.94,182.24,176.29,177.12,10659200,177.12 -2005-01-24,188.69,189.33,180.32,180.72,14022700,180.72 -2005-01-21,194.54,195.36,188.12,188.28,9258400,188.28 -2005-01-20,192.50,196.25,192.00,193.92,9001600,193.92 -2005-01-19,204.65,205.30,196.71,197.30,11257700,197.30 -2005-01-18,200.97,205.02,198.66,203.90,13172600,203.90 -2005-01-14,196.00,200.01,194.13,199.97,9640300,199.97 -2005-01-13,195.38,197.39,194.05,195.33,6849400,195.33 -2005-01-12,194.33,195.93,190.50,195.38,8177800,195.38 -2005-01-11,195.62,197.71,193.18,193.54,6958700,193.54 -2005-01-10,194.50,198.10,191.83,195.06,7539600,195.06 -2005-01-07,190.64,194.25,188.78,193.85,9662900,193.85 -2005-01-06,195.08,195.90,187.72,188.55,10387100,188.55 -2005-01-05,193.45,196.90,192.23,193.51,8236600,193.51 -2005-01-04,201.40,202.93,193.48,194.50,13755900,194.50 -2005-01-03,197.40,203.64,195.46,202.71,15844200,202.71 -2004-12-31,199.23,199.88,192.56,192.79,7668500,192.79 -2004-12-30,192.97,198.23,191.85,197.60,5904300,197.60 -2004-12-29,191.78,193.52,191.78,192.90,2678100,192.90 -2004-12-28,192.11,193.55,191.01,192.76,4145800,192.76 -2004-12-27,189.15,193.30,189.10,191.91,6104100,191.91 -2004-12-23,187.45,188.60,186.00,187.90,3614600,187.90 -2004-12-22,183.90,186.85,183.01,186.30,3907000,186.30 -2004-12-21,186.31,187.88,183.40,183.75,5516300,183.75 -2004-12-20,182.00,188.46,181.87,185.02,9834500,185.02 -2004-12-17,176.76,180.50,176.55,180.08,7386200,180.08 -2004-12-16,176.95,180.49,175.95,176.47,8572800,176.47 -2004-12-15,177.99,180.69,176.66,179.78,11471000,179.78 -2004-12-14,171.00,178.82,169.60,178.69,11088400,178.69 -2004-12-13,172.17,173.18,169.45,170.45,4818600,170.45 -2004-12-10,173.43,174.88,171.29,171.65,4317200,171.65 -2004-12-09,170.25,173.50,168.47,173.43,7654000,173.43 -2004-12-08,170.35,173.68,168.73,169.98,7541800,169.98 -2004-12-07,176.00,176.20,170.55,171.43,6870900,171.43 -2004-12-06,179.13,180.70,176.02,176.29,6254000,176.29 -2004-12-03,179.95,181.06,177.60,180.40,5869200,180.40 -2004-12-02,179.90,181.51,178.55,179.40,6260900,179.40 -2004-12-01,181.95,182.50,179.55,179.96,7864100,179.96 -2004-11-30,180.71,183.00,180.25,181.98,7700000,181.98 -2004-11-29,180.36,182.95,177.51,181.05,10666600,181.05 -2004-11-26,175.80,180.03,175.32,179.39,6480100,179.39 -2004-11-24,174.82,177.21,172.51,174.76,15281000,174.76 -2004-11-23,167.97,170.83,166.50,167.52,12413300,167.52 -2004-11-22,164.47,169.50,161.31,165.10,12368200,165.10 -2004-11-19,169.10,169.98,166.52,169.40,8769300,169.40 -2004-11-18,170.29,174.42,165.73,167.54,16629600,167.54 -2004-11-17,169.02,177.50,169.00,172.50,18132900,172.50 -2004-11-16,177.50,179.47,170.83,172.54,20917400,172.54 -2004-11-15,180.45,188.32,178.75,184.87,11901500,184.87 -2004-11-12,185.23,189.80,177.40,182.00,16746100,182.00 -2004-11-11,169.13,183.75,167.57,183.02,14985500,183.02 -2004-11-10,170.67,172.52,166.33,167.86,10644000,167.86 -2004-11-09,174.10,175.20,165.27,168.70,11064200,168.70 -2004-11-08,170.93,175.44,169.40,172.55,11191800,172.55 -2004-11-05,181.98,182.30,168.55,169.35,19833100,169.35 -2004-11-04,188.44,190.40,183.35,184.70,14409600,184.70 -2004-11-03,198.18,201.60,190.75,191.67,13888700,191.67 -2004-11-02,198.78,199.25,193.34,194.87,11346300,194.87 -2004-11-01,193.55,197.67,191.27,196.03,12224900,196.03 -2004-10-29,198.89,199.95,190.60,190.64,21162500,190.64 -2004-10-28,186.68,194.39,185.60,193.30,14846800,193.30 -2004-10-27,182.72,189.52,181.77,185.97,13356500,185.97 -2004-10-26,186.34,192.64,180.00,181.80,22307100,181.80 -2004-10-25,176.40,194.43,172.55,187.40,32764200,187.40 -2004-10-22,170.54,180.17,164.08,172.43,36891900,172.43 -2004-10-21,144.40,150.13,141.62,149.38,14589500,149.38 -2004-10-20,148.03,148.99,139.60,140.49,11372700,140.49 -2004-10-19,150.50,152.40,147.35,147.94,9064000,147.94 -2004-10-18,143.20,149.20,141.21,149.16,7025200,149.16 -2004-10-15,144.93,145.50,141.95,144.11,6604000,144.11 -2004-10-14,141.01,142.38,138.56,142.00,5226300,142.00 -2004-10-13,143.32,143.55,140.08,140.90,9893000,140.90 -2004-10-12,134.44,137.61,133.40,137.40,5838600,137.40 -2004-10-11,137.00,138.86,133.85,135.26,5241300,135.26 -2004-10-08,138.72,139.68,137.02,137.73,5540300,137.73 -2004-10-07,136.92,139.88,136.55,138.85,7064600,138.85 -2004-10-06,137.55,138.45,136.00,137.08,6697400,137.08 -2004-10-05,134.66,138.53,132.24,138.37,7494100,138.37 -2004-10-04,135.25,136.87,134.03,135.06,6517900,135.06 -2004-10-01,130.80,134.24,128.90,132.58,7570000,132.58 -2004-09-30,129.90,132.30,129.00,129.60,6885900,129.60 -2004-09-29,126.70,135.02,126.23,131.08,15273500,131.08 -2004-09-28,121.30,127.40,120.21,126.86,8473000,126.86 -2004-09-27,119.56,120.88,117.80,118.26,3536600,118.26 -2004-09-24,120.94,124.10,119.76,119.83,4566300,119.83 -2004-09-23,118.84,122.63,117.02,120.82,4272100,120.82 -2004-09-22,117.40,119.67,116.81,118.38,3794400,118.38 -2004-09-21,119.81,120.42,117.51,117.84,3618000,117.84 -2004-09-20,116.95,121.60,116.77,119.36,5319700,119.36 -2004-09-17,114.42,117.49,113.55,117.49,4741000,117.49 -2004-09-16,112.34,115.80,111.65,113.97,4637800,113.97 -2004-09-15,110.56,114.23,110.20,112.00,5361900,112.00 -2004-09-14,107.45,112.00,106.79,111.49,5419900,111.49 -2004-09-13,106.63,108.41,106.46,107.50,3926000,107.50 -2004-09-10,101.60,106.56,101.30,105.33,4353800,105.33 -2004-09-09,102.53,102.71,101.00,102.31,2032900,102.31 -2004-09-08,100.74,103.03,100.50,102.30,2495300,102.30 -2004-09-07,101.01,102.00,99.61,101.58,2926700,101.58 -2004-09-03,100.95,101.74,99.32,100.01,2578800,100.01 -2004-09-02,99.19,102.37,98.94,101.51,7566900,101.51 -2004-09-01,102.70,102.97,99.67,100.25,4573700,100.25 -2004-08-31,102.30,103.71,102.16,102.37,2461400,102.37 -2004-08-30,105.28,105.49,102.01,102.01,2601000,102.01 -2004-08-27,108.10,108.62,105.69,106.15,3109000,106.15 -2004-08-26,104.95,107.95,104.66,107.91,3551000,107.91 -2004-08-25,104.96,108.00,103.88,106.00,4598900,106.00 -2004-08-24,111.24,111.60,103.57,104.87,7631300,104.87 -2004-08-23,110.75,113.48,109.05,109.40,9137200,109.40 -2004-08-20,101.01,109.08,100.50,108.31,11428600,108.31 -2004-08-19,100.00,104.06,95.96,100.34,22351900,100.34 diff -Nru matplotlib-0.99.3/doc/mpl_examples/data/intc.csv matplotlib-1.0.1/doc/mpl_examples/data/intc.csv --- matplotlib-0.99.3/doc/mpl_examples/data/intc.csv 2009-07-31 15:14:50.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/data/intc.csv 1970-01-01 00:00:00.000000000 +0000 @@ -1,66 +0,0 @@ -Date,Open,High,Low,Close,Volume,Adj. Close* -19-Sep-03,29.30,29.36,28.83,29.17,53550300,29.15 -18-Sep-03,28.69,29.28,28.46,29.16,46619000,29.14 -17-Sep-03,28.94,29.38,28.77,28.88,52827300,28.86 -16-Sep-03,28.08,28.99,28.02,28.91,48748000,28.89 -15-Sep-03,28.33,28.45,27.91,27.99,36350400,27.97 -12-Sep-03,27.81,28.39,27.55,28.34,51931600,28.32 -11-Sep-03,27.62,28.35,27.29,28.03,56654900,28.01 -10-Sep-03,28.44,28.49,27.63,27.66,57999300,27.64 -9-Sep-03,29.00,29.13,28.66,28.79,49792900,28.77 -8-Sep-03,28.88,29.20,28.80,29.18,52154000,29.16 -5-Sep-03,28.83,29.10,28.37,28.71,68429904,28.69 -4-Sep-03,28.32,28.74,28.04,28.60,63744700,28.58 -3-Sep-03,28.94,28.97,28.04,28.22,60714800,28.20 -2-Sep-03,28.77,28.84,28.17,28.74,58841200,28.72 -29-Aug-03,28.18,28.65,28.04,28.59,41986600,28.57 -28-Aug-03,28.10,28.35,27.85,28.30,48631600,28.28 -27-Aug-03,27.61,28.08,27.42,28.02,58217200,28.00 -26-Aug-03,26.96,27.74,26.68,27.71,65213400,27.69 -25-Aug-03,27.56,27.76,27.07,27.24,52037500,27.22 -22-Aug-03,28.16,29.04,27.32,27.39,120604096,27.37 -21-Aug-03,26.69,26.78,26.01,26.39,66434900,26.37 -20-Aug-03,26.14,26.74,26.13,26.36,47210300,26.34 -19-Aug-03,26.37,26.54,25.92,26.47,55966300,26.45 -18-Aug-03,25.10,26.23,25.05,26.19,59081000,26.17 -15-Aug-03,25.09,25.25,24.81,25.05,21622800,25.04 -14-Aug-03,24.80,25.17,24.55,25.14,51830000,25.13 -13-Aug-03,24.50,25.00,24.30,24.71,51882500,24.70 -12-Aug-03,24.09,24.40,23.82,24.37,48475100,24.36 -11-Aug-03,23.62,24.13,23.58,23.90,41624600,23.89 -8-Aug-03,24.15,24.22,23.33,23.58,57453600,23.57 -7-Aug-03,23.94,24.30,23.86,23.99,48517800,23.98 -6-Aug-03,24.10,24.55,23.81,24.14,57799000,24.13 -5-Aug-03,25.12,25.12,24.23,24.27,51979800,24.26 -4-Aug-03,24.91,25.23,24.39,25.13,53570000,25.10 -1-Aug-03,24.78,25.07,24.73,25.02,48494900,24.99 -31-Jul-03,24.80,25.35,24.68,24.89,68692096,24.86 -30-Jul-03,24.86,24.87,24.28,24.49,40786200,24.46 -29-Jul-03,24.81,25.23,24.70,24.90,68217600,24.87 -28-Jul-03,24.92,25.13,24.61,24.76,45462200,24.73 -25-Jul-03,24.17,24.94,23.73,24.91,52627700,24.88 -24-Jul-03,25.15,25.17,23.95,23.97,58119100,23.94 -23-Jul-03,24.37,24.90,24.26,24.81,49058200,24.78 -22-Jul-03,24.39,24.53,24.05,24.42,61074300,24.39 -21-Jul-03,24.60,24.63,23.95,24.06,52851200,24.03 -18-Jul-03,25.10,25.15,24.15,24.66,65296900,24.63 -17-Jul-03,24.69,25.10,24.60,24.93,71736800,24.90 -16-Jul-03,25.24,25.50,24.82,25.31,128925696,25.27 -15-Jul-03,24.44,24.77,23.67,24.10,102323696,24.07 -14-Jul-03,24.27,24.58,23.85,24.02,76909400,23.99 -11-Jul-03,23.29,23.50,23.07,23.34,46535400,23.31 -10-Jul-03,23.07,23.30,22.61,22.91,63261600,22.88 -9-Jul-03,23.30,23.99,23.25,23.48,78521904,23.45 -8-Jul-03,22.83,23.40,22.67,23.15,64980800,23.12 -7-Jul-03,22.24,22.98,22.17,22.91,56553100,22.88 -3-Jul-03,21.97,22.31,21.71,21.72,40502400,21.69 -2-Jul-03,21.66,22.32,21.47,22.21,74291504,22.18 -1-Jul-03,20.87,21.50,20.51,21.41,64496600,21.38 -30-Jun-03,21.14,21.30,20.59,20.81,51457500,20.78 -27-Jun-03,20.70,21.13,20.53,20.57,63348200,20.54 -26-Jun-03,20.30,20.76,20.15,20.63,52904900,20.60 -25-Jun-03,20.53,20.83,19.99,20.04,61250600,20.01 -24-Jun-03,20.11,20.74,20.04,20.45,63799700,20.42 -23-Jun-03,20.70,20.97,20.05,20.36,59628100,20.33 -20-Jun-03,21.34,21.42,20.64,20.67,78909400,20.64 -19-Jun-03,21.66,21.92,21.12,21.12,69563696,21.09 Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/doc/mpl_examples/data/INTC.dat and /tmp/GJbvHcIw6l/matplotlib-1.0.1/doc/mpl_examples/data/INTC.dat differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/doc/mpl_examples/data/lena.jpg and /tmp/GJbvHcIw6l/matplotlib-1.0.1/doc/mpl_examples/data/lena.jpg differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/doc/mpl_examples/data/lena.png and /tmp/GJbvHcIw6l/matplotlib-1.0.1/doc/mpl_examples/data/lena.png differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/doc/mpl_examples/data/logo2.png and /tmp/GJbvHcIw6l/matplotlib-1.0.1/doc/mpl_examples/data/logo2.png differ diff -Nru matplotlib-0.99.3/doc/mpl_examples/data/membrane.dat matplotlib-1.0.1/doc/mpl_examples/data/membrane.dat --- matplotlib-0.99.3/doc/mpl_examples/data/membrane.dat 2009-07-31 15:14:50.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/data/membrane.dat 1970-01-01 00:00:00.000000000 +0000 @@ -1,64 +0,0 @@ -°ú*¿°ú*¿ºš+¿°ú*¿°ú*¿Ä:,¿Ä:,¿Ä:,¿°ú*¿ºš+¿ºš+¿°ú*¿ºš+¿°ú*¿¦Z*¿°ú*¿°ú*¿¦Z*¿¦Z*¿°ú*¿Ä:,¿Ä:,¿œº)¿¦Z*¿¦Z*¿°ú*¿°ú*¿°ú*¿ºš+¿Ä:,¿Ä:,¿°ú*¿ºš+¿°ú*¿ºš+¿ºš+¿ºš+¿ºš+¿ºš+¿ºš+¿°ú*¿°ú*¿ºš+¿ºš+¿ºš+¿°ú*¿°ú*¿ºš+¿¦Z*¿°ú*¿°ú*¿ºš+¿ºš+¿°ú*¿ºš+¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿¦Z*¿¦Z*¿°ú*¿ºš+¿¦Z*¿ºš+¿ºš+¿¦Z*¿°ú*¿°ú*¿ºš+¿ºš+¿ºš+¿ºš+¿Ä:,¿Ä:,¿ºš+¿ºš+¿ºš+¿¦Z*¿œº)¿ºš+¿°ú*¿°ú*¿Ä:,¿ºš+¿ºš+¿¦Z*¿Ä:,¿Ä:,¿¦Z*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿Ä:,¿ºš+¿°ú*¿°ú*¿°ú*¿ºš+¿ºš+¿ºš+¿°ú*¿°ú*¿ºš+¿Ä:,¿Ä:,¿°ú*¿ºš+¿ºš+¿ºš+¿°ú*¿°ú*¿ºš+¿°ú*¿°ú*¿ºš+¿ºš+¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿¦Z*¿¦Z*¿ºš+¿ºš+¿ºš+¿ºš+¿ºš+¿¦Z*¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿Ä:,¿°ú*¿°ú*¿Ä:,¿ÎÚ,¿ÎÚ,¿ºš+¿Ä:,¿Ä:,¿ºš+¿°ú*¿Ä:,¿ºš+¿ºš+¿ºš+¿¦Z*¿¦Z*¿°ú*¿ºš+¿ºš+¿¦Z*¿°ú*¿°ú*¿¦Z*¿¦Z*¿¦Z*¿°ú*¿ºš+¿¦Z*¿¦Z*¿¦Z*¿ºš+¿ºš+¿ºš+¿Ä:,¿°ú*¿°ú*¿ºš+¿°ú*¿ºš+¿ºš+¿ºš+¿œº)¿°ú*¿°ú*¿Ä:,¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿¦Z*¿¦Z*¿¦Z*¿¦Z*¿°ú*¿°ú*¿¦Z*¿¦Z*¿ºš+¿ºš+¿ºš+¿ºš+¿ºš+¿ºš+¿¦Z*¿°ú*¿°ú*¿Ä:,¿°ú*¿Ä:,¿Ä:,¿ÎÚ,¿°ú*¿¦Z*¿¦Z*¿¦Z*¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿œº)¿œº)¿ºš+¿ºš+¿°ú*¿°ú*¿ºš+¿°ú*¿°ú*¿¦Z*¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿°ú*¿ºš+¿ºš+¿ºš+¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿ºš+¿ºš+¿œº)¿¦Z*¿¦Z*¿Ä:,¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿¦Z*¿¦Z*¿°ú*¿¦Z*¿¦Z*¿ºš+¿ºš+¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿ÎÚ,¿ÎÚ,¿ºš+¿°ú*¿°ú*¿Ä:,¿°ú*¿ºš+¿ºš+¿ºš+¿¦Z*¿¦Z*¿¦Z*¿°ú*¿°ú*¿°ú*¿ºš+¿°ú*¿°ú*¿°ú*¿¦Z*¿¦Z*¿¦Z*¿ºš+¿°ú*¿¦Z*¿¦Z*¿ºš+¿ºš+¿ºš+¿ºš+¿Ä:,¿Ä:,¿ºš+¿ºš+¿ºš+¿ºš+¿Ä:,¿Ä:,¿ºš+¿¦Z*¿ºš+¿ºš+¿ºš+¿œº)¿°ú*¿°ú*¿°ú*¿œº)¿œº)¿ÎÚ,¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿¦Z*¿¦Z*¿°ú*¿Ä:,¿Ä:,¿ºš+¿ºš+¿ºš+¿Ä:,¿ºš+¿°ú*¿°ú*¿°ú*¿ÎÚ,¿ºš+¿ºš+¿ºš+¿ºš+¿ºš+¿¦Z*¿°ú*¿°ú*¿ºš+¿¦Z*¿¦Z*¿°ú*¿°ú*¿°ú*¿¦Z*¿°ú*¿œº)¿¦Z*¿¦Z*¿¦Z*¿¦Z*¿¦Z*¿Ä:,¿°ú*¿°ú*¿ºš+¿ºš+¿ºš+¿°ú*¿ºš+¿ºš+¿°ú*¿°ú*¿Ä:,¿°ú*¿°ú*¿ÎÚ,¿°ú*¿°ú*¿ºš+¿°ú*¿°ú*¿¦Z*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿ºš+¿°ú*¿ºš+¿¦Z*¿ºš+¿Ä:,¿ºš+¿ºš+¿°ú*¿ºš+¿ºš+¿Ä:,¿°ú*¿°ú*¿ºš+¿ºš+¿ºš+¿ºš+¿°ú*¿°ú*¿Ä:,¿œº)¿¦Z*¿°ú*¿ºš+¿¦Z*¿¦Z*¿¦Z*¿¦Z*¿°ú*¿°ú*¿¦Z*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿Ä:,¿Ä:,¿°ú*¿ºš+¿Ä:,¿°ú*¿°ú*¿°ú*¿¦Z*¿¦Z*¿°ú*¿°ú*¿°ú*¿ºš+¿ºš+¿ºš+¿ºš+¿¦Z*¿°ú*¿°ú*¿°ú*¿¦Z*¿°ú*¿°ú*¿¦Z*¿¦Z*¿¦Z*¿ºš+¿Ä:,¿Ä:,¿¦Z*¿¦Z*¿¦Z*¿¦Z*¿¦Z*¿ºš+¿°ú*¿°ú*¿ºš+¿ºš+¿ºš+¿Ä:,¿ºš+¿ºš+¿ºš+¿ºš+¿Ä:,¿ºš+¿°ú*¿ºš+¿Ä:,¿Ä:,¿¦Z*¿¦Z*¿¦Z*¿°ú*¿°ú*¿°ú*¿ºš+¿°ú*¿°ú*¿¦Z*¿¦Z*¿¦Z*¿ºš+¿ºš+¿ºš+¿°ú*¿ºš+¿ºš+¿¦Z*¿¦Z*¿ºš+¿ºš+¿ºš+¿ºš+¿Ä:,¿Ä:,¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿Ä:,¿°ú*¿°ú*¿°ú*¿¦Z*¿°ú*¿¦Z*¿¦Z*¿°ú*¿œº)¿œº)¿°ú*¿ºš+¿ºš+¿ºš+¿ºš+¿ºš+¿°ú*¿ºš+¿°ú*¿°ú*¿°ú*¿°ú*¿ºš+¿ºš+¿ºš+¿ºš+¿ºš+¿¦Z*¿ºš+¿ºš+¿°ú*¿°ú*¿¦Z*¿ºš+¿ºš+¿¦Z*¿°ú*¿°ú*¿°ú*¿œº)¿œº)¿°ú*¿¦Z*¿¦Z*¿°ú*¿¦Z*¿¦Z*¿ºš+¿ºš+¿¦Z*¿°ú*¿°ú*¿Ä:,¿°ú*¿°ú*¿°ú*¿Ä:,¿Ä:,¿°ú*¿°ú*¿°ú*¿¦Z*¿Ä:,¿ºš+¿°ú*¿Ä:,¿°ú*¿¦Z*¿¦Z*¿ºš+¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿°ú*¿œº)¿œº)¿ºš+¿¦Z*¿¦Z*¿°ú*¿ºš+¿ºš+¿¦Z*¿°ú*¿°ú*¿ºš+¿ºš+¿ºš+¿ºš+¿ºš+¿°ú*¿ºš+¿ºš+¿¦Z*¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿ºš+¿¦Z*¿œº)¿°ú*¿ºš+¿¦Z*¿¦Z*¿¦Z*¿ºš+¿°ú*¿°ú*¿ºš+¿°ú*¿°ú*¿°ú*¿ºš+¿ºš+¿°ú*¿Ä:,¿Ä:,¿°ú*¿¦Z*¿°ú*¿ºš+¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿¦Z*¿°ú*¿°ú*¿ºš+¿°ú*¿°ú*¿Ä:,¿°ú*¿¦Z*¿¦Z*¿¦Z*¿¦Z*¿œº)¿œº)¿°ú*¿ºš+¿ºš+¿°ú*¿ºš+¿ºš+¿œº)¿°ú*¿°ú*¿ºš+¿ºš+¿ºš+¿°ú*¿¦Z*¿¦Z*¿ºš+¿ºš+¿¦Z*¿ºš+¿ºš+¿°ú*¿œº)¿œº)¿ºš+¿°ú*¿°ú*¿¦Z*¿¦Z*¿¦Z*¿¦Z*¿°ú*¿°ú*¿¦Z*¿¦Z*¿¦Z*¿ºš+¿°ú*¿Ä:,¿¦Z*¿°ú*¿°ú*¿Ä:,¿Ä:,¿¦Z*¿°ú*¿°ú*¿ºš+¿¦Z*¿¦Z*¿ºš+¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿¦Z*¿°ú*¿°ú*¿¦Z*¿°ú*¿ºš+¿¦Z*¿¦Z*¿œº)¿ºš+¿ºš+¿¦Z*¿¦Z*¿¦Z*¿ºš+¿°ú*¿°ú*¿ºš+¿ºš+¿ºš+¿ºš+¿ºš+¿ºš+¿Ä:,¿ºš+¿ºš+¿¦Z*¿¦Z*¿°ú*¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿œº)¿°ú*¿°ú*¿°ú*¿¦Z*¿¦Z*¿°ú*¿°ú*¿°ú*¿ºš+¿°ú*¿°ú*¿°ú*¿¦Z*¿ºš+¿°ú*¿°ú*¿°ú*¿¦Z*¿¦Z*¿Ä:,¿Ä:,¿¦Z*¿°ú*¿Ä:,¿ºš+¿ºš+¿ºš+¿Ä:,¿Ä:,¿Ä:,¿¦Z*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿¦Z*¿¦Z*¿¦Z*¿°ú*¿¦Z*¿¦Z*¿Ä:,¿Ä:,¿œº)¿¦Z*¿¦Z*¿Ä:,¿¦Z*¿¦Z*¿ºš+¿ºš+¿ºš+¿°ú*¿ºš+¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿ºš+¿ºš+¿°ú*¿°ú*¿¦Z*¿ºš+¿ºš+¿¦Z*¿¦Z*¿¦Z*¿ºš+¿¦Z*¿¦Z*¿°ú*¿Ä:,¿Ä:,¿°ú*¿°ú*¿°ú*¿ºš+¿ºš+¿ºš+¿¦Z*¿¦Z*¿ºš+¿ºš+¿ºš+¿°ú*¿ºš+¿ºš+¿°ú*¿¦Z*¿¦Z*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿¦Z*¿°ú*¿¦Z*¿¦Z*¿°ú*¿¦Z*¿¦Z*¿¦Z*¿¦Z*¿°ú*¿°ú*¿ºš+¿°ú*¿°ú*¿°ú*¿ºš+¿ºš+¿œº)¿°ú*¿°ú*¿Ä:,¿°ú*¿°ú*¿ºš+¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿ºš+¿ºš+¿°ú*¿¦Z*¿¦Z*¿°ú*¿¦Z*¿’)¿¦Z*¿Ä:,¿¦Z*¿œº)¿œº)¿°ú*¿ºš+¿ºš+¿°ú*¿ºš+¿ºš+¿ºš+¿°ú*¿°ú*¿¦Z*¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿œº)¿œº)¿œº)¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿¦Z*¿¦Z*¿°ú*¿¦Z*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿¦Z*¿ºš+¿ºš+¿œº)¿°ú*¿°ú*¿ºš+¿¦Z*¿°ú*¿°ú*¿°ú*¿Ä:,¿°ú*¿°ú*¿°ú*¿ºš+¿ºš+¿°ú*¿œº)¿œº)¿ºš+¿ºš+¿ºš+¿¦Z*¿Ä:,¿°ú*¿œº)¿œº)¿°ú*¿ºš+¿ºš+¿¦Z*¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿¦Z*¿Ä:,¿Ä:,¿°ú*¿¦Z*¿°ú*¿Ä:,¿Ä:,¿ºš+¿°ú*¿°ú*¿¦Z*¿’)¿’)¿ºš+¿°ú*¿¦Z*¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿¦Z*¿¦Z*¿¦Z*¿°ú*¿œº)¿œº)¿Ä:,¿°ú*¿°ú*¿ºš+¿ºš+¿ºš+¿`ú%¿VZ%¿8z#¿$:"¿ü¹¿ÞÙ¿Àù¿Àù¿z™¿\¹¿\¹¿*™¿¿¿Ðø ¿² ¿² ¿”8 ¿vX¿vX¿:˜¿&X¿¿Ó/ý¾¿ïû¾«¯ú¾[¯õ¾[¯õ¾ ¯ð¾÷nï¾÷nモ.é¾C.ä¾C.ä¾ßíݾ˭ܾ˭ܾgmÖ¾+­Ò¾mѾmѾïìξwlǾwlǾwlǾ'l¾,Á¾,Á¾ë«¾¾ÿ뿾ÿ뿾×k½¾×k½¾×k½¾ë«¾¾ë«¾¾ë«¾¾ë«¾¾,Á¾,Á¾,Á¾'l¾c,ƾwlǾwlǾwlǾŸìɾŸìɾ³,˾Çl̾Çl̾mѾ-о-о+­Ò¾?íÓ¾?íÓ¾S-Õ¾gmÖ¾gmÖ¾{­×¾{­×¾{­×¾íؾ£-ھ˭ܾ·mÛ¾·mÛ¾ßíݾßíݾßíݾ˭ܾó-ß¾ó-ß¾nà¾ó-ß¾ßíݾnྮá¾/î⾮ᾮᾮá¾Wnå¾Wnå¾/îâ¾/îâ¾/îâ¾C.ä¾/îâ¾/îâ¾®á¾/îâ¾/îâ¾®á¾C.ä¾C.ä¾®á¾ó-ß¾nà¾nà¾nà¾/îâ¾nà¾nà¾ó-ß¾®á¾®á¾nà¾nà¾nà¾nà¾Ë­Ü¾Ë­Ü¾ßíݾnà¾Ë­Ü¾Ë­Ü¾ßíݾßíݾ£-Ú¾£-Ú¾£-Ú¾{­×¾{­×¾íؾS-Õ¾S-Õ¾gmÖ¾íؾíؾ+­Ò¾+­Ò¾+­Ò¾+­Ò¾mѾmѾïìξ-о۬;۬;۬;-оÇl̾Çl̾Çl̾³,˾³,˾Ÿìɾ³,˾³,˾ŸìɾŸìɾŸìɾ‹¬È¾‹¬È¾‹¬È¾c,ƾc,ƾwlǾwlǾwlǾOìľOìľOìľc,ƾOìľOìľOìľOìľOìľOìľwlǾOìľwlǾŸìɾwlǾwlǾwlǾ³,˾ŸìɾŸìɾ³,˾³,˾³,˾ŸìɾÇl̾Çl̾ŸìɾŸìɾÇl̾³,˾³,˾۬;۬;۬;۬;-о-оmѾ-о-о+­Ò¾-о-о+­Ò¾S-Õ¾S-Õ¾S-Õ¾gmÖ¾gmÖ¾gmÖ¾S-Õ¾{­×¾íؾíؾ{­×¾{­×¾{­×¾{­×¾Ë­Ü¾Ë­Ü¾·mÛ¾·mÛ¾·mÛ¾£-Ú¾íؾíؾ·mÛ¾·mÛ¾íؾ·mÛ¾·mÛ¾·mÛ¾£-Ú¾·m۾˭ܾ·mÛ¾·mÛ¾·mÛ¾·mÛ¾·m۾˭ܾ˭ܾ˭ܾ£-Ú¾·mÛ¾·mÛ¾£-Ú¾íؾ£-ھ˭ܾíؾíؾíؾíؾgmÖ¾gmÖ¾gmÖ¾gmÖ¾gmÖ¾gmÖ¾gmÖ¾?íÓ¾?íÓ¾?íÓ¾mѾmѾïìξmѾmѾ۬;۬;۬;-оÇl̾Çl̾³,˾³,˾wlǾŸìɾŸìɾc,ƾwlǾwlǾc,ƾ'l¾'l¾;¬Ã¾,Á¾ÿ뿾,Á¾,Á¾×k½¾×k½¾×k½¾×k½¾×k½¾×k½¾¯ëº¾¯ëº¾¯ëº¾‡k¸¾‡k¸¾s+·¾_ëµ¾_ëµ¾_ëµ¾›«¹¾›«¹¾s+·¾_ëµ¾_ëµ¾#+²¾_ëµ¾_ëµ¾7k³¾7k³¾7k³¾‡k¸¾K«´¾K«´¾s+·¾_ëµ¾s+·¾7k³¾7k³¾_ëµ¾‡k¸¾‡k¸¾‡k¸¾¯ëº¾¯ëº¾×k½¾¯ëº¾¯ëº¾×k½¾ë«¾¾ë«¾¾ë«¾¾,Á¾;¬Ã¾wlǾwlǾc,ƾwlǾwlǾ‹¬È¾‹¬È¾‹¬È¾³,˾Çl̾Çl̾Çl̾³,˾³,˾-о-оïìξ-о-о+­Ò¾-о-о?íÓ¾?íÓ¾?íÓ¾S-Õ¾S-Õ¾S-Õ¾S-Õ¾gmÖ¾gmÖ¾gmÖ¾íؾíؾ{­×¾{­×¾£-Ú¾íؾíؾíؾ£-Ú¾£-Ú¾£-Ú¾{­×¾{­×¾£-Ú¾£-Ú¾£-Ú¾£-Ú¾{­×¾{­×¾gmÖ¾íؾ{­×¾gmÖ¾gmÖ¾gmÖ¾gmÖ¾gmÖ¾?íÓ¾?íÓ¾?íÓ¾+­Ò¾+­Ò¾mѾïìξïìξ-о+­Ò¾+­Ò¾Û¬Í¾ïìξïìξÇl̾ŸìɾŸìɾ‹¬È¾³,˾³,˾wlǾOìľOìľc,ƾ'l¾'l¾ÿ뿾ÿ뿾ÿ뿾Ã+¼¾Ã+¼¾×k½¾×k½¾×k½¾›«¹¾s+·¾s+·¾7k³¾#+²¾#+²¾7k³¾7k³¾7k³¾çj®¾çj®¾çj®¾Ó*­¾¿ê«¾¿ê«¾—j©¾«ªª¾[ª¥¾[ª¥¾Gj¤¾[ª¥¾꡾꡾÷iŸ¾Ï霾Ï霾é—¾Wi•¾Wi•¾gh†¾ÕM]¾ÕM]¾9Žã½i‹¶½i‹¶½É¾]ÍU¾]ÍU¾Ó*­¾c,ƾ£-Ú¾k®æ¾3/ó¾Ó/ý¾¸¿¸¿b¿vX¿vX¿Š˜¿”8 ¿”8 ¿² ¿¨x -¿¨x -¿¨x -¿Š˜¿¨x -¿žØ ¿”8 ¿Š˜¿¨x -¿¨x -¿€ø¿Š˜¿Š˜¿€ø¿l¸¿l¸¿vX¿l¸¿l¸¿NØ¿b¿b¿Xx¿Xx¿NØ¿:˜¿:˜¿:˜¿&X¿&X¿¸¿&X¿&X¿û¯ÿ¾x¿x¿çoþ¾Ó/ý¾Ó/ý¾¿ïû¾«¯ú¾«¯ú¾—où¾ƒ/ø¾ƒ/ø¾oïö¾[¯õ¾3/ó¾ ¯ð¾ ¯ð¾ ¯ð¾÷nï¾÷nï¾ ¯ð¾ ¯ð¾ ¯ð¾»®ë¾Ïîì¾Ïîì¾î羓.龓.龓.é¾C.ä¾C.ä¾k®æ¾nà¾nà¾ßíݾßíݾ·mÛ¾£-Ú¾£-Ú¾íؾgmÖ¾gmÖ¾S-Õ¾+­Ò¾+­Ò¾-оmѾïìξ³,˾ŸìɾŸìɾŸìɾc,ƾc,ƾc,ƾc,ƾ'l¾,Á¾,Á¾ÿ뿾×k½¾×k½¾¯ëº¾›«¹¾›«¹¾›«¹¾K«´¾7k³¾7k³¾7k³¾ûª¯¾Ó*­¾Ó*­¾¿ê«¾«ªª¾«ªª¾ƒ*¨¾[ª¥¾[ª¥¾3*£¾꡾꡾Ï霾»©›¾§iš¾k©–¾Wi•¾/é’¾ó(¾ó(¾ýÍ_¾É¾É¾‰‰˜½ÉŠ¬½ÉŠ¬½mÌF¾gh†¾ƒ*¨¾;¬Ã¾;¬Ã¾Wnå¾ã.î¾ã.î¾Ó/ý¾¿¿NØ¿NØ¿NØ¿vX¿vX¿vX¿b¿€ø¿€ø¿b¿l¸¿l¸¿l¸¿l¸¿b¿l¸¿l¸¿NØ¿NØ¿NØ¿D8¿D8¿D8¿:˜¿¿¿:˜¿¸¿¸¿x¿&X¿û¯ÿ¾Ó/ý¾û¯ÿ¾çoþ¾û¯ÿ¾û¯ÿ¾¿ïû¾¿ïû¾¿ïû¾«¯ú¾oïö¾oïö¾Goô¾oïö¾oïö¾[¯õ¾Goô¾Goô¾Goô¾ïñ¾ã.î¾ã.î¾ã.nê¾»®ë¾»®ë¾»®ë¾îç¾îç¾k®æ¾k®æ¾k®æ¾®á¾®á¾®á¾ó-ß¾nà¾Ë­Ü¾·mÛ¾·mÛ¾£-Ú¾£-Ú¾£-Ú¾?íÓ¾S-Õ¾S-Õ¾mѾmѾmѾïìξïìξïìξÇl̾³,˾ŸìɾwlǾwlǾ;¬Ã¾c,ƾc,ƾ,Á¾ë«¾¾ë«¾¾ë«¾¾Ã+¼¾Ã+¼¾‡k¸¾‡k¸¾‡k¸¾7k³¾7k³¾#+²¾#+²¾#+²¾çj®¾Ó*­¾Ó*­¾—j©¾ƒ*¨¾ƒ*¨¾3*£¾[ª¥¾ ª ¾÷iŸ¾÷iŸ¾»©›¾»©›¾»©›¾C)”¾©‘¾©‘¾{¨‡¾ÝÏ}¾ÝÏ}¾ -Ⱦ)Š¢½)Š¢½)Š¢½…H¾…H¾ßè¾Ó*­¾;¬Ã¾S-Õ¾S-Õ¾÷nï¾[¯õ¾[¯õ¾û¯ÿ¾¸¿¸¿:˜¿D8¿D8¿0ø¿NØ¿NØ¿NØ¿:˜¿:˜¿D8¿:˜¿:˜¿0ø¿0ø¿&X¿&X¿¿¸¿x¿x¿¸¿û¯ÿ¾û¯ÿ¾çoþ¾û¯ÿ¾û¯ÿ¾Ó/ý¾¿ïû¾¿ïû¾«¯ú¾ƒ/ø¾ƒ/ø¾—où¾[¯õ¾[¯õ¾oïö¾Goô¾Goô¾Goô¾Goô¾ïñ¾3/ó¾3/ó¾ ¯ð¾ ¯ð¾ ¯ð¾ã.î¾Ïîì¾Ïî쾧n꾧n꾧nê¾îç¾k®æ¾k®æ¾C.ä¾C.ä¾C.ä¾®á¾nà¾ó-߾˭ܾ˭ܾ·mÛ¾£-Ú¾£-Ú¾£-Ú¾gmÖ¾gmÖ¾{­×¾gmÖ¾gmÖ¾+­Ò¾?íÓ¾mѾïìξïìξ۬;³,˾³,˾‹¬È¾ŸìɾŸìɾwlǾc,ƾc,ƾ,Á¾ÿ뿾ÿ뿾Ã+¼¾›«¹¾›«¹¾¯ëº¾s+·¾_ëµ¾_ëµ¾_ëµ¾#+²¾ë°¾ë°¾çj®¾—j©¾—j©¾«ªª¾«ªª¾«ªª¾[ª¥¾ ª ¾ ª ¾Ï霾Ï霾Ï霾闾闾©‘¾/é’¾/é’¾+¨‚¾ÅNl¾ÅNl¾ ŒÀ½q -W½q -W½‰‰˜½­È -¾­È -¾Wi•¾7k³¾7k³¾Ë­Ü¾k®æ¾÷nï¾Goô¾¿ïû¾çoþ¾û¯ÿ¾û¯ÿ¾¸¿&X¿&X¿¸¿&X¿&X¿¸¿¸¿¸¿¿¸¿¸¿x¿x¿x¿çoþ¾Ó/ý¾¿ïû¾¿ïû¾¿ïû¾«¯ú¾—où¾—où¾«¯ú¾«¯ú¾«¯ú¾[¯õ¾oïö¾oïö¾ïñ¾Goô¾Goô¾3/ó¾3/ó¾3/ó¾ïñ¾÷nï¾ ¯ð¾÷nï¾Ïîì¾Ïîì¾ã.î¾ã.n꾓.龓.龧nê¾k®æ¾k®æ¾k®æ¾Wnå¾Wnå¾nà¾C.ä¾/îâ¾nà¾nà¾ó-ß¾ó-ß¾ó-߾˭ܾ·mÛ¾·mÛ¾íؾíؾíؾS-Õ¾gmÖ¾gmÖ¾S-Õ¾-о-о-оmѾmѾ³,˾۬;³,˾³,˾ŸìɾŸìɾc,ƾc,ƾOìľ'l¾'l¾×k½¾,Á¾,Á¾›«¹¾¯ëº¾¯ëº¾‡k¸¾K«´¾K«´¾7k³¾ë°¾ûª¯¾çj®¾çj®¾«ªª¾«ªª¾«ªª¾oꦾ[ª¥¾[ª¥¾꡾ã)ž¾ã)ž¾Ï霾»©›¾»©›¾©‘¾ó(¾Ë¨Œ¾?胾=Ïs¾…MX¾ýȾýȾ ½ ½ ½É¾Oq¾Oq¾‡k¸¾Çl̾Çl̾k®æ¾÷nï¾÷nᆱ¯ú¾û¯ÿ¾Ó/ý¾û¯ÿ¾û¯ÿ¾x¿çoþ¾çoþ¾û¯ÿ¾û¯ÿ¾û¯ÿ¾çoþ¾çoþ¾çoþ¾çoþ¾Ó/ý¾¿ïû¾ƒ/ø¾ƒ/ø¾«¯ú¾oïö¾oïö¾[¯õ¾oïö¾oïö¾3/ó¾3/ó¾3/ó¾3/ó¾ ¯ð¾ ¯ð¾÷nï¾ ¯ð¾ã.î¾÷nï¾÷nï¾»®ë¾Ïîì¾Ïî쾧n꾓.龓.龓.é¾îç¾î羓.龓.龓.é¾C.ä¾C.ä¾Wn微ᾮᾮá¾ó-ß¾ó-ß¾ßíݾó-ß¾ó-ß¾ßíݾ˭ܾ˭ܾ˭ܾ£-Ú¾£-Ú¾£-Ú¾{­×¾{­×¾{­×¾gmÖ¾+­Ò¾+­Ò¾+­Ò¾?íÓ¾mѾmѾmѾïìξïìξ³,˾Çl̾Çl̾ŸìɾwlǾwlǾOìľ;¬Ã¾'l¾;¬Ã¾,Á¾ë«¾¾ë«¾¾ë«¾¾¯ëº¾¯ëº¾¯ëº¾‡k¸¾7k³¾7k³¾_ëµ¾#+²¾#+²¾ë°¾ûª¯¾¿ê«¾¿ê«¾¿ê«¾ƒ*¨¾Gj¤¾Gj¤¾[ª¥¾÷iŸ¾÷iŸ¾Ï霾»©›¾»©›¾C)”¾i¾i¾S(…¾h¾íÎn¾ELD¾)ò½a½¡ -ª¼¡ -ª¼¹‹»½-Ë2¾-Ë2¾oꦾÿ뿾+­Ò¾nྒྷ.é¾ïñ¾Goô¾Goô¾ƒ/ø¾¿ïû¾¿ïû¾çoþ¾Ó/ý¾Ó/ý¾çoþ¾çoþ¾çoþ¾¿ïû¾Ó/ý¾¿ïû¾—où¾—où¾oïö¾oïö¾oïö¾Goô¾3/ó¾3/ó¾ ¯ð¾[¯õ¾ïñ¾ã.î¾ã.î¾÷nï¾ ¯ð¾ ¯ð¾»®ë¾Ïîì¾Ïî쾓.龧n꾧n꾧nê¾îç¾îç¾k®æ¾k®æ¾Wnå¾k®æ¾k®æ¾®á¾®á¾®á¾/îâ¾ßíݾßíݾnà¾ßíݾßíݾßíݾßíݾ˭ܾ·mÛ¾·mÛ¾·mÛ¾£-Ú¾£-Ú¾{­×¾íؾíؾ{­×¾gmÖ¾gmÖ¾?íÓ¾?íÓ¾?íÓ¾mѾ-о-оmѾ-о۬;ïìξïìξ۬;³,˾³,˾wlǾ‹¬È¾‹¬È¾c,ƾc,ƾc,ƾ;¬Ã¾;¬Ã¾;¬Ã¾ÿ뿾ÿ뿾×k½¾Ã+¼¾Ã+¼¾›«¹¾¯ëº¾¯ëº¾_ëµ¾s+·¾s+·¾#+²¾ë°¾ë°¾ë°¾ûª¯¾Ó*­¾«ªª¾«ªª¾oꦾƒ*¨¾ƒ*¨¾÷iŸ¾÷iŸ¾÷iŸ¾“)™¾é—¾é—¾C)”¾ó(¾ó(¾gh†¾ÝÏ}¾ÝÏ}¾ÍË<¾éÞ½‘ 9½a –¼q½‹±½K0¾K0¾oꦾÿ뿾ÿ뿾ßíݾk®æ¾k®æ¾ ¯ð¾[¯õ¾[¯õ¾«¯ú¾—où¾—où¾¿ïû¾—où¾«¯ú¾—où¾—où¾[¯õ¾[¯õ¾[¯õ¾oïö¾Goô¾Goô¾Goô¾ïñ¾ïñ¾÷nï¾ ¯ð¾ ¯ð¾ã.î¾Ïîì¾Ïîì¾»®ë¾»®ë¾»®ë¾§nê¾îç¾îç¾k®æ¾k®æ¾Wnå¾Wnå¾Wnå¾Wnå¾/îâ¾/îâ¾C.侮ᾮá¾nà¾nà¾nྷm۾˭ܾ˭ܾ˭ܾ˭ܾ˭ܾ£-Ú¾·mÛ¾£-Ú¾gmÖ¾íؾ{­×¾{­×¾{­×¾{­×¾gmÖ¾gmÖ¾S-Õ¾+­Ò¾+­Ò¾+­Ò¾?íÓ¾?íÓ¾ïìξïìξïìξïìξïìξ۬;۬;۬;³,˾³,˾³,˾wlǾwlǾwlǾwlǾOìľOìľ'l¾Oìľÿ뿾,Á¾,Á¾×k½¾ÿ뿾ÿ뿾×k½¾›«¹¾›«¹¾‡k¸¾›«¹¾›«¹¾K«´¾7k³¾7k³¾7k³¾ë°¾ë°¾çj®¾¿ê«¾¿ê«¾—j©¾3*£¾Gj¤¾[ª¥¾[ª¥¾÷iŸ¾ã)ž¾ã)ž¾§iš¾C)”¾C)”¾©‘¾ßè¾ßè¾ÝÏ}¾eOv¾eOv¾%I¾Ù‰½Ù‰½!‚¼±k½5H¾­ÍZ¾/é’¾7k³¾ŸìɾŸìɾ®á¾“.龓.é¾Goô¾[¯õ¾[¯õ¾—où¾—où¾—où¾—où¾ƒ/ø¾ƒ/ø¾ƒ/ø¾Goô¾Goô¾Goô¾Goô¾3/ó¾ïñ¾ïñ¾ïñ¾ïñ¾ïñ¾÷nï¾÷nï¾÷nï¾»®ë¾“.龓.龓.龓.龓.é¾îç¾Wnå¾Wnå¾C.ä¾Wnå¾/îâ¾/îâ¾/îâ¾nà¾ó-ß¾ó-ß¾ó-ß¾ßíݾßíݾ˭ܾ˭ܾ˭ܾ£-Ú¾£-Ú¾£-Ú¾£-Ú¾£-Ú¾íؾ{­×¾{­×¾íؾ{­×¾{­×¾?íÓ¾gmÖ¾S-Õ¾?íÓ¾?íÓ¾mѾS-Õ¾S-Õ¾mѾmѾmѾïìξ۬;۬;Çl̾Çl̾Çl̾Çl̾ŸìɾŸìɾŸìɾŸìɾwlǾc,ƾc,ƾc,ƾOìľOìľ'l¾c,ƾc,ƾÿ뿾뫾¾ë«¾¾¯ëº¾¯ëº¾¯ëº¾Ã+¼¾¯ëº¾‡k¸¾›«¹¾›«¹¾‡k¸¾_ëµ¾_ëµ¾#+²¾ë°¾ë°¾Ó*­¾¿ê«¾¿ê«¾¿ê«¾—j©¾Gj¤¾Gj¤¾꡾3*£¾÷iŸ¾÷iŸ¾»©›¾§iš¾§iš¾C)”¾/é’¾/é’¾£(Š¾S(…¾S(…¾uNg¾õK?¾‰Žè½Ñ M½Ñ M½¡ -ª¼ÉŠ¬½ÉŠ¬½eOv¾÷iŸ¾÷iŸ¾Çl̾íؾíؾ§nê¾ã.î¾ã.î¾Goô¾oïö¾[¯õ¾ƒ/ø¾ƒ/ø¾[¯õ¾Goô¾Goô¾oïö¾3/ó¾3/ó¾Goô¾3/ó¾ïñ¾ ¯ð¾ ¯ð¾ïñ¾»®ë¾»®ë¾§nê¾»®ë¾»®ë¾“.龓.龓.é¾îç¾Wnå¾Wnå¾C.ä¾nà¾C.ä¾®á¾ó-ß¾ó-ß¾®á¾®á¾·mÛ¾ßíݾßíݾ˭ܾíؾíؾ·mÛ¾·mÛ¾·mÛ¾£-Ú¾íؾíؾíؾgmÖ¾íؾS-Õ¾S-Õ¾gmÖ¾S-Õ¾S-Õ¾S-Õ¾gmÖ¾gmÖ¾-оmѾmѾ-о-о-оïìξ۬;۬;Çl̾Çl̾³,˾ŸìɾŸìɾŸìɾc,ƾc,ƾ‹¬È¾wlǾwlǾwlǾ‹¬È¾‹¬È¾;¬Ã¾;¬Ã¾Oìľ뫾¾'l¾'l¾,Á¾,Á¾ë«¾¾ë«¾¾ë«¾¾¯ëº¾¯ëº¾¯ëº¾‡k¸¾_ëµ¾_ëµ¾_ëµ¾#+²¾#+²¾#+²¾ë°¾¿ê«¾¿ê«¾¿ê«¾¿ê«¾—j©¾—j©¾oꦾ[ª¥¾[ª¥¾꡾ ª ¾ ª ¾»©›¾“)™¾é—¾/é’¾©‘¾ßè¾èˆ¾èˆ¾eOv¾ýÍ_¾ýÍ_¾)Š¢½á ¾¼á ¾¼q½ùŒÏ½ÌA¾·h‹¾·h‹¾,Á¾mѾmѾC.侧n꾧nê¾ïñ¾3/ó¾3/ó¾ƒ/ø¾[¯õ¾[¯õ¾ƒ/ø¾oïö¾3/ó¾3/ó¾3/ó¾[¯õ¾ïñ¾ïñ¾÷nï¾ ¯ð¾ ¯ð¾Ïîì¾»®ë¾»®ë¾§n꾧n꾧nê¾îç¾k®æ¾“.é¾/îâ¾/îâ¾/îâ¾Wnå¾Wnå¾ó-ß¾®á¾®á¾®á¾ßíݾßíݾßíݾßíݾ·mÛ¾ßíݾ£-Ú¾íؾ£-Ú¾£-Ú¾íؾíؾíؾ{­×¾{­×¾{­×¾{­×¾{­×¾{­×¾mѾmѾmѾ+­Ò¾-о-оmѾmѾïìξ۬;۬;Çl̾Çl̾Çl̾Çl̾ŸìɾŸìɾÇl̾‹¬È¾‹¬È¾‹¬È¾³,˾³,˾c,ƾwlǾ‹¬È¾Oìľ;¬Ã¾;¬Ã¾OìľOìľÿ뿾'l¾'l¾뫾¾ë«¾¾ë«¾¾×k½¾›«¹¾×k½¾¯ëº¾›«¹¾‡k¸¾‡k¸¾‡k¸¾#+²¾#+²¾#+²¾K«´¾ë°¾ë°¾ûª¯¾çj®¾çj®¾¿ê«¾—j©¾—j©¾ƒ*¨¾[ª¥¾꡾3*£¾ ª ¾÷iŸ¾»©›¾»©›¾/é’¾Wi•¾Wi•¾{¨‡¾gh†¾gh†¾eOv¾…MX¾MɾɊ¬½ ½Á ¼¡ú¼¡ú¼¥K:¾èˆ¾èˆ¾,Á¾-о-оk®æ¾§n꾧nê¾ïñ¾Goô¾3/ó¾3/ó¾3/ó¾oïö¾oïö¾oïö¾[¯õ¾[¯õ¾[¯õ¾ïñ¾ ¯ð¾ ¯ð¾ã.î¾ã.î¾ã.î¾»®ë¾§n꾧n꾧nê¾Wnå¾k®æ¾k®æ¾k®æ¾C.ä¾C.ä¾C.ä¾Wnå¾C.ä¾C.ä¾/î⾮ᾮá¾ßíݾó-ß¾·mÛ¾ßíݾ˭ܾ·mÛ¾£-Ú¾£-Ú¾·mÛ¾·mÛ¾·mÛ¾S-Õ¾{­×¾{­×¾?íÓ¾gmÖ¾gmÖ¾S-Õ¾+­Ò¾+­Ò¾+­Ò¾+­Ò¾+­Ò¾-о-о-оïìξïìξ-о۬;۬;۬;۬;۬;Çl̾۬;Çl̾ŸìɾŸìɾŸìɾŸìɾŸìɾwlǾwlǾwlǾ;¬Ã¾;¬Ã¾;¬Ã¾;¬Ã¾;¬Ã¾;¬Ã¾,Á¾ÿ뿾ÿ뿾ÿ뿾×k½¾×k½¾Ã+¼¾Ã+¼¾›«¹¾›«¹¾›«¹¾¯ëº¾s+·¾s+·¾‡k¸¾_ëµ¾_ëµ¾7k³¾ë°¾ë°¾ë°¾ûª¯¾ûª¯¾¿ê«¾—j©¾—j©¾oꦾoꦾGj¤¾3*£¾3*£¾Ï霾»©›¾»©›¾»©›¾C)”¾C)”¾ó(¾Ë¨Œ¾Ë¨Œ¾+¨‚¾µO{¾µO{¾UK5¾™Ù½ñ -/½A 4¼A 4¼)Š¢½ÅI¾ÅI¾ã)ž¾›«¹¾›«¹¾{­×¾/îâ¾/îâ¾Ïîì¾÷nï¾÷nï¾ïñ¾3/ó¾Goô¾Goô¾Goô¾3/ó¾3/ó¾3/ó¾ïñ¾÷nï¾÷nï¾÷nï¾Ïîì¾Ïîì¾»®ë¾Ïîì¾Ïî쾧n꾧n꾧nê¾k®æ¾îç¾îç¾k®æ¾k®æ¾C.ä¾C.ä¾C.侮ᾮᾮá¾ó-ß¾ßíݾßíݾ˭ܾ·mÛ¾·mÛ¾·mÛ¾·mÛ¾·mÛ¾íؾíؾ£-Ú¾gmÖ¾gmÖ¾{­×¾{­×¾{­×¾S-Õ¾gmÖ¾gmÖ¾S-Õ¾?íÓ¾?íÓ¾+­Ò¾?íÓ¾?íÓ¾mѾ۬;۬;mѾ-оïìξ۬;ïìξÇl̾³,˾³,˾Ÿìɾ³,˾³,˾ŸìɾŸìɾŸìɾ‹¬È¾wlǾwlǾ;¬Ã¾OìľOìľ;¬Ã¾'l¾'l¾;¬Ã¾;¬Ã¾ÿ뿾,Á¾,Á¾×k½¾×k½¾×k½¾×k½¾Ã+¼¾Ã+¼¾›«¹¾s+·¾s+·¾s+·¾K«´¾7k³¾ë°¾#+²¾ûª¯¾¿ê«¾¿ê«¾Ó*­¾Ó*­¾Ó*­¾ƒ*¨¾oꦾoꦾGj¤¾÷iŸ¾÷iŸ¾ã)ž¾Ï霾Ï霾é—¾/é’¾/é’¾©‘¾£(Š¾S(…¾h¾Ïx¾ÕM]¾íɾíɾ± ½Á ¼Á ¼i‹¶½K0¾K0¾ ª ¾Ã+¼¾Û¬Í¾£-Ú¾nà¾îç¾Ïîì¾ã.î¾Goô¾3/ó¾3/ó¾ïñ¾Goô¾Goô¾3/ó¾ ¯ð¾ ¯ð¾Goô¾ïñ¾ïñ¾ ¯ð¾ïñ¾ïñ¾»®ë¾Ïîì¾Ïîì¾»®ë¾§nê¾»®ë¾îç¾îç¾Wnå¾Wnå¾Wnå¾/îâ¾C.ä¾C.ä¾ó-ß¾nà¾nà¾ó-߾˭ܾ˭ܾßíݾßíݾßíݾ£-Ú¾£-Ú¾£-Ú¾íؾ£-Ú¾£-Ú¾gmÖ¾gmÖ¾{­×¾{­×¾{­×¾S-Õ¾S-Õ¾S-Õ¾+­Ò¾+­Ò¾+­Ò¾?íÓ¾-о-оmѾmѾmѾïìξ۬;۬;۬;Çl̾Çl̾³,˾Ÿìɾ³,˾‹¬È¾‹¬È¾³,˾‹¬È¾‹¬È¾wlǾwlǾwlǾ;¬Ã¾OìľOìľOìľOìľOìľ;¬Ã¾;¬Ã¾'l¾,Á¾,Á¾ë«¾¾×k½¾×k½¾¯ëº¾¯ëº¾¯ëº¾›«¹¾s+·¾s+·¾K«´¾K«´¾K«´¾#+²¾#+²¾ûª¯¾ûª¯¾ûª¯¾¿ê«¾çj®¾çj®¾—j©¾oꦾoꦾGj¤¾3*£¾3*£¾÷iŸ¾Ï霾Ï霾§iš¾é—¾/é’¾i¾ó(¾·h‹¾S(…¾S(…¾Îi¾•LI¾•LI¾Qu½a –¼a –¼‘ 9½)ò½)ò½ó(¾Ó*­¾Ó*­¾mѾ·mÛ¾C.ä¾»®ë¾Ïîì¾÷nï¾ïñ¾ïñ¾3/ó¾Goô¾Goô¾[¯õ¾3/ó¾3/ó¾3/ó¾ ¯ð¾ ¯ð¾ïñ¾ã.î¾ã.î¾»®ë¾»®ë¾»®ë¾»®ë¾“.龓.龓.龓.é¾Wnå¾Wnå¾Wnå¾/îâ¾nà¾nà¾/îâ¾nà¾nྮá¾ó-ß¾ó-ß¾ó-ß¾ßíݾ˭ܾ˭ܾ˭ܾ£-Ú¾£-Ú¾£-Ú¾£-Ú¾íؾíؾ{­×¾gmÖ¾gmÖ¾-оS-Õ¾S-Õ¾S-Õ¾mѾ+­Ò¾+­Ò¾-оmѾ-о-оïìξïìξïìξïìξÇl̾Çl̾ïìξÇl̾Çl̾Çl̾Çl̾³,˾ŸìɾŸìɾŸìɾ‹¬È¾‹¬È¾wlǾ‹¬È¾‹¬È¾;¬Ã¾OìľOìľ,Á¾'l¾'l¾ÿ뿾뫾¾ë«¾¾ÿ뿾¯ëº¾×k½¾Ã+¼¾Ã+¼¾‡k¸¾›«¹¾›«¹¾›«¹¾_ëµ¾_ëµ¾_ëµ¾K«´¾K«´¾ûª¯¾ë°¾ë°¾Ó*­¾Ó*­¾Ó*­¾oꦾ[ª¥¾oꦾGj¤¾3*£¾ ª ¾ ª ¾ ª ¾“)™¾é—¾é—¾k©–¾i¾i¾Ë¨Œ¾S(…¾S(…¾eOv¾MÎd¾MÎd¾©ŒÊ½ñ -/½Á ¼!‚¼Iˆ„½É¾ÅNl¾ÅNl¾K«´¾ŸìɾŸìɾó-ß¾k®æ¾k®æ¾ã.î¾÷nï¾÷nï¾Goô¾3/ó¾3/ó¾3/ó¾ïñ¾ ¯ð¾ïñ¾ïñ¾ïñ¾Ïîì¾Ïîì¾Ïîì¾»®ë¾»®ë¾»®ë¾Ïîì¾Ïî쾓.é¾îç¾îç¾k®æ¾k®æ¾k®æ¾Wnå¾C.ä¾/îâ¾C.ä¾®á¾nà¾nà¾nà¾nà¾ßíݾßíݾ˭ܾíؾ£-ھ˭ܾ˭ܾíؾ£-Ú¾£-Ú¾£-Ú¾{­×¾{­×¾{­×¾?íÓ¾?íÓ¾?íÓ¾gmÖ¾?íÓ¾+­Ò¾+­Ò¾S-Õ¾mѾmѾ+­Ò¾-о-о-оmѾmѾ۬;۬;۬;ïìξ³,˾³,˾³,˾³,˾ŸìɾŸìɾŸìɾwlǾŸìɾŸìɾc,ƾOìľOìľc,ƾ;¬Ã¾;¬Ã¾;¬Ã¾;¬Ã¾,Á¾ÿ뿾ÿ뿾,Á¾ë«¾¾ë«¾¾×k½¾Ã+¼¾Ã+¼¾›«¹¾¯ëº¾s+·¾_ëµ¾_ëµ¾K«´¾7k³¾7k³¾ë°¾ûª¯¾ûª¯¾Ó*­¾Ó*­¾Ó*­¾oꦾƒ*¨¾ƒ*¨¾oꦾ꡾÷iŸ¾÷iŸ¾÷iŸ¾“)™¾é—¾é—¾Wi•¾/é’¾/é’¾£(Š¾gh†¾gh†¾eOv¾ÕM]¾=Ê#¾ ŒÀ½Q -%½Á ¼!‚¼!‚¼íɾ=Ïs¾=Ïs¾s+·¾‹¬È¾‹¬È¾Ë­Ü¾k®æ¾k®æ¾Ïîì¾Ïîì¾ ¯ð¾3/ó¾3/ó¾ïñ¾3/ó¾3/ó¾ïñ¾ïñ¾ïñ¾ ¯ð¾ ¯ð¾ ¯ð¾ïñ¾Ïîì¾Ïîì¾»®ë¾»®ë¾»®ë¾§n꾧nê¾k®æ¾k®æ¾k®æ¾Wnå¾C.ä¾C.ä¾Wnå¾/îâ¾nà¾ó-ß¾ó-ß¾nà¾ßíݾßíݾ˭ܾßíݾßíݾ·mÛ¾£-Ú¾£-Ú¾£-Ú¾íؾ£-Ú¾{­×¾{­×¾{­×¾gmÖ¾gmÖ¾gmÖ¾{­×¾{­×¾S-Õ¾?íÓ¾?íÓ¾?íÓ¾+­Ò¾mѾ+­Ò¾mѾ۬;ïìξïìξ-оïìξïìξÇl̾Çl̾Çl̾³,˾Ÿìɾ‹¬È¾wlǾ‹¬È¾wlǾc,ƾc,ƾ‹¬È¾c,ƾc,ƾc,ƾwlǾwlǾ'l¾;¬Ã¾;¬Ã¾,Á¾,Á¾,Á¾ÿ뿾뫾¾ë«¾¾Ã+¼¾›«¹¾›«¹¾‡k¸¾‡k¸¾K«´¾_ëµ¾_ëµ¾7k³¾ë°¾ë°¾ûª¯¾#+²¾#+²¾¿ê«¾«ªª¾«ªª¾ƒ*¨¾ƒ*¨¾[ª¥¾Gj¤¾Gj¤¾꡾÷iŸ¾÷iŸ¾§iš¾§iš¾§iš¾©‘¾ó(¾ó(¾£(Š¾?胾ÝÏ}¾Îi¾Îi¾5H¾Iˆ„½Iˆ„½p»± ½± ½mÌF¾£(Š¾£(Š¾ÿ뿾۬;۬;®á¾“.龧nê¾Ïîì¾Ïîì¾3/ó¾3/ó¾3/ó¾Goô¾Goô¾Goô¾ ¯ð¾ïñ¾ïñ¾ ¯ð¾÷nï¾÷nï¾ã.î¾ã.î¾ã.n꾧nê¾î羧n꾧nê¾Wnå¾k®æ¾k®æ¾k®æ¾®á¾®á¾C.ä¾/îâ¾®á¾ó-ß¾nà¾ó-ß¾ó-ß¾ó-ß¾ó-ß¾·mÛ¾·mÛ¾ßíݾ˭ܾ˭ܾ£-Ú¾£-Ú¾£-Ú¾{­×¾{­×¾{­×¾íؾ?íÓ¾gmÖ¾?íÓ¾?íÓ¾?íÓ¾+­Ò¾+­Ò¾+­Ò¾mѾmѾmѾïìξïìξ-о۬;۬;ïìξïìξïìξ۬;Çl̾۬;³,˾³,˾³,˾Çl̾Çl̾wlǾwlǾwlǾwlǾc,ƾOìľc,ƾ;¬Ã¾'l¾'l¾'l¾ÿ뿾'l¾'l¾×k½¾¯ëº¾¯ëº¾ë«¾¾¯ëº¾¯ëº¾s+·¾‡k¸¾‡k¸¾K«´¾K«´¾K«´¾7k³¾ë°¾ë°¾ûª¯¾ûª¯¾Ó*­¾«ªª¾«ªª¾ƒ*¨¾oꦾoꦾ ª ¾꡾꡾Ï霾“)™¾é—¾k©–¾C)”¾i¾ßè¾ßè¾{¨‡¾ÝÏ}¾ÝÏ}¾­ÍZ¾íɾíɾaæ¼ - º - º‰‰˜½=Ê#¾=Ê#¾ã)ž¾s+·¾³,˾gm־˭ܾk®æ¾»®ë¾»®ë¾ ¯ð¾ ¯ð¾ ¯ð¾ïñ¾3/ó¾3/ó¾ïñ¾ ¯ð¾ ¯ð¾ïñ¾ ¯ð¾ ¯ð¾÷nï¾÷nᄃnê¾Ïîì¾Ïîì¾»®ë¾“.龓.é¾î羓.龓.é¾Wnå¾îç¾îç¾Wnå¾C.ä¾C.ä¾/îâ¾/îâ¾nྮᾮá¾ó-ß¾®á¾®á¾ßíݾ˭ܾ˭ܾ·mÛ¾íؾ£-Ú¾íؾíؾ{­×¾gmÖ¾gmÖ¾gmÖ¾S-Õ¾S-Õ¾?íÓ¾+­Ò¾+­Ò¾S-Õ¾?íÓ¾?íÓ¾+­Ò¾+­Ò¾+­Ò¾mѾmѾ+­Ò¾mѾmѾ-о-о-оÇl̾Çl̾Çl̾³,˾‹¬È¾ŸìɾŸìɾŸìɾŸìɾc,ƾc,ƾOìľOìľOìľ;¬Ã¾;¬Ã¾;¬Ã¾;¬Ã¾ÿ뿾ÿ뿾뫾¾ë«¾¾ë«¾¾Ã+¼¾Ã+¼¾¯ëº¾›«¹¾›«¹¾›«¹¾_ëµ¾_ëµ¾K«´¾7k³¾7k³¾ë°¾7k³¾7k³¾¿ê«¾«ªª¾«ªª¾¿ê«¾[ª¥¾[ª¥¾Gj¤¾Gj¤¾ã)ž¾÷iŸ¾÷iŸ¾»©›¾§iš¾§iš¾k©–¾i¾i¾Ë¨Œ¾èˆ¾+¨‚¾Ïx¾MÎd¾õK?¾ÙŽí½ÙŽí½Á -\¼p»p»ÙŽí½ -ÍP¾ -ÍP¾Ó*­¾,Á¾,Á¾Ë­Ü¾®á¾“.é¾»®ë¾»®ë¾ ¯ð¾3/ó¾3/ó¾÷nï¾Goô¾Goô¾ïñ¾ïñ¾ ¯ð¾ ¯ð¾ã.î¾÷nï¾÷nï¾÷nï¾ã.î¾»®ë¾»®ë¾Ïî쾓.龓.龧nê¾îç¾îç¾îç¾îç¾Wnå¾Wnå¾Wnå¾/îâ¾ó-ß¾ó-ß¾/î⾮ᾮá¾ßíݾßíݾßíݾ˭ܾ£-Ú¾£-Ú¾£-Ú¾íؾíؾ£-Ú¾£-Ú¾·mÛ¾£-Ú¾£-Ú¾gmÖ¾gmÖ¾gmÖ¾gmÖ¾?íÓ¾?íÓ¾gmÖ¾+­Ò¾+­Ò¾+­Ò¾mѾ+­Ò¾mѾmѾ-оÇl̾Çl̾ïìξ۬;۬;Çl̾Çl̾Çl̾³,˾‹¬È¾‹¬È¾‹¬È¾wlǾ‹¬È¾‹¬È¾c,ƾ;¬Ã¾wlǾwlǾ;¬Ã¾,Á¾,Á¾'l¾'l¾'l¾ÿ뿾뫾¾ë«¾¾×k½¾Ã+¼¾Ã+¼¾‡k¸¾›«¹¾›«¹¾_ëµ¾K«´¾K«´¾7k³¾7k³¾¿ê«¾ûª¯¾ûª¯¾Ó*­¾ƒ*¨¾ƒ*¨¾ƒ*¨¾oꦾoꦾGj¤¾꡾꡾꡾ã)ž¾ã)ž¾“)™¾“)™¾Wi•¾ßè¾ßè¾Ë¨Œ¾{¨‡¾{¨‡¾=Ïs¾­ÍZ¾­ÍZ¾‹±½¡ú¼¡ú¼!‚¼™ˆ‰½MɾÅNl¾“)™¾K«´¾ŸìɾŸìɾßíݾWnå¾Wnå¾Ïîì¾ã.î¾ã.î¾Goô¾3/ó¾3/ó¾Goô¾Goô¾Goô¾÷nï¾ ¯ð¾ïñ¾ïñ¾÷nï¾÷nï¾÷nï¾÷nï¾÷nᄃn꾧nê¾îç¾îç¾îç¾îç¾Wnå¾Wnå¾îç¾C.ä¾/îâ¾/îâ¾/îâ¾/îâ¾nà¾nà¾ó-ß¾ó-ß¾ó-ß¾ó-ß¾ßíݾßíݾ˭ܾ˭ܾ˭ܾ·mÛ¾ßíݾßíݾ{­×¾{­×¾{­×¾{­×¾gmÖ¾íؾgmÖ¾{­×¾?íÓ¾S-Õ¾S-Õ¾S-Õ¾mѾmѾ+­Ò¾-о-о+­Ò¾ïìξïìξÇl̾ïìξ۬;Çl̾Çl̾ïìξÇl̾Çl̾³,˾³,˾³,˾‹¬È¾‹¬È¾‹¬È¾wlǾOìľc,ƾc,ƾc,ƾ;¬Ã¾'l¾'l¾뫾¾ÿ뿾ÿ뿾×k½¾×k½¾¯ëº¾×k½¾×k½¾s+·¾‡k¸¾‡k¸¾K«´¾_ëµ¾_ëµ¾#+²¾ë°¾ë°¾ë°¾Ó*­¾¿ê«¾¿ê«¾ƒ*¨¾ƒ*¨¾[ª¥¾oꦾ3*£¾ ª ¾ ª ¾÷iŸ¾»©›¾»©›¾é—¾C)”¾C)”¾Ë¨Œ¾{¨‡¾{¨‡¾(€¾íÎn¾íÎn¾µJ+¾ ŒÀ½± ½ - ºÁ ¼a½…H¾…H¾k©–¾#+²¾#+²¾?íӾ˭ܾ˭ܾ»®ë¾÷nï¾÷nï¾ã.î¾3/ó¾3/ó¾3/ó¾3/ó¾3/ó¾ïñ¾ïñ¾ïñ¾ ¯ð¾÷nï¾ã.î¾÷nï¾÷nï¾»®ë¾§n꾧nê¾Ïîì¾îç¾î羧n꾓.龓.é¾Wnå¾Wnå¾Wnå¾Wnå¾C.ä¾/î⾮ᾮá¾C.侮ᾮá¾nà¾nà¾nà¾Ë­Ü¾Ë­Ü¾Ë­Ü¾ßíݾ£-Ú¾£-Ú¾£-Ú¾íؾ{­×¾{­×¾{­×¾{­×¾íؾíؾgmÖ¾?íÓ¾?íÓ¾?íÓ¾?íÓ¾?íÓ¾?íÓ¾?íÓ¾+­Ò¾+­Ò¾+­Ò¾mѾmѾmѾïìξïìξïìξÇl̾Çl̾Çl̾Çl̾Çl̾Çl̾Ÿìɾ‹¬È¾‹¬È¾ŸìɾŸìɾc,ƾwlǾwlǾ,Á¾'l¾'l¾;¬Ã¾ÿ뿾ÿ뿾ÿ뿾뫾¾ë«¾¾Ã+¼¾×k½¾×k½¾Ã+¼¾‡k¸¾‡k¸¾_ëµ¾K«´¾_ëµ¾#+²¾#+²¾ë°¾ë°¾ë°¾¿ê«¾«ªª¾«ªª¾ƒ*¨¾Gj¤¾Gj¤¾3*£¾3*£¾3*£¾Ï霾»©›¾§iš¾é—¾é—¾/é’¾ó(¾ó(¾{¨‡¾S(…¾S(…¾ÅNl¾…MX¾…MX¾)Š¢½á ¾¼á ¾¼¡ -ª¼Ù‰½eJ&¾ÝÏ}¾ ª ¾s+·¾ŸìɾŸìɾnà¾Wnå¾Wnå¾ã.î¾ã.î¾ã.î¾ ¯ð¾ïñ¾ïñ¾3/ó¾[¯õ¾[¯õ¾ ¯ð¾ ¯ð¾ïñ¾÷nï¾Ïîì¾÷nï¾÷nï¾÷nï¾»®ë¾ã.î¾ã..龧n꾧nê¾îç¾î羓.é¾k®æ¾k®æ¾Wnå¾Wnå¾Wnå¾nà¾nà¾nà¾nà¾ó-ß¾ó-ß¾nà¾ßíݾßíݾ·mÛ¾·mÛ¾·mÛ¾·mÛ¾·mÛ¾íؾíؾíؾíؾ{­×¾{­×¾{­×¾£-Ú¾£-Ú¾?íÓ¾gmÖ¾gmÖ¾gmÖ¾+­Ò¾?íÓ¾?íÓ¾?íÓ¾mѾ+­Ò¾+­Ò¾mѾïìξïìξ۬;Çl̾Çl̾۬;³,˾³,˾Çl̾ŸìɾŸìɾ‹¬È¾wlǾ‹¬È¾c,ƾOìľwlǾwlǾOìľ;¬Ã¾;¬Ã¾;¬Ã¾,Á¾,Á¾,Á¾ë«¾¾×k½¾×k½¾×k½¾›«¹¾›«¹¾›«¹¾‡k¸¾‡k¸¾K«´¾K«´¾#+²¾ë°¾çj®¾ûª¯¾çj®¾çj®¾«ªª¾—j©¾—j©¾oꦾGj¤¾Gj¤¾ã)ž¾ ª ¾ ª ¾»©›¾“)™¾“)™¾k©–¾i¾Ë¨Œ¾£(Š¾{¨‡¾+¨‚¾Ïx¾Ïx¾ÍË<¾ÙŽí½ÙŽí½ È»p»± ½ÙŽí½½ÌK¾ß辫ªª¾«ªª¾-о£-Ú¾£-Ú¾îç¾Ïîì¾Ïîì¾ã.î¾ ¯ð¾ ¯ð¾ ¯ð¾ ¯ð¾ ¯ð¾Goô¾3/ó¾3/ó¾ïñ¾ ¯ð¾÷nï¾÷nï¾÷nï¾ã.n꾧nê¾»®ë¾»®ë¾»®ë¾§nê¾îç¾îç¾Wnå¾k®æ¾k®æ¾/îâ¾C.ä¾C.ä¾C.ä¾®á¾ó-ß¾/îâ¾/îâ¾ó-ß¾ßíݾßíݾßíݾó-ß¾ó-ß¾ßíݾ·mÛ¾·m۾˭ܾ£-Ú¾£-Ú¾{­×¾{­×¾íؾS-Õ¾S-Õ¾gmÖ¾íؾíؾgmÖ¾S-Õ¾S-Õ¾S-Õ¾mѾmѾ-о+­Ò¾+­Ò¾-о۬;۬;-оÇl̾Çl̾ïìξïìξÇl̾ŸìɾŸìɾ³,˾ŸìɾŸìɾwlǾwlǾwlǾc,ƾ;¬Ã¾;¬Ã¾;¬Ã¾Oìľ'l¾ÿ뿾ÿ뿾ÿ뿾×k½¾×k½¾›«¹¾¯ëº¾¯ëº¾s+·¾_ëµ¾K«´¾K«´¾K«´¾#+²¾ë°¾ë°¾ûª¯¾Ó*­¾Ó*­¾¿ê«¾—j©¾—j©¾oꦾ[ª¥¾[ª¥¾Gj¤¾꡾꡾»©›¾Ï霾»©›¾k©–¾k©–¾/é’¾i¾i¾gh†¾+¨‚¾+¨‚¾MÎd¾}Ë7¾}Ë7¾1 C½Á ¼Á ¼á ¾¼IÔ½ELD¾£(Š¾ƒ*¨¾Ã+¼¾Çl̾Çl̾®á¾Wnå¾Wnå¾ã.î¾ ¯ð¾ ¯ð¾ïñ¾3/ó¾3/ó¾ ¯ð¾3/ó¾3/ó¾ïñ¾ïñ¾ïñ¾÷nï¾Ïîì¾Ïîì¾ã.î¾»®ë¾»®ë¾Ïîì¾Ïîì¾îç¾îç¾îç¾îç¾îç¾îç¾Wnå¾/îâ¾/îâ¾/îâ¾/îâ¾/îâ¾/îâ¾/îâ¾®á¾nà¾nà¾C.ä¾nà¾nà¾ßíݾnà¾nà¾íؾ·mÛ¾·mÛ¾£-Ú¾{­×¾{­×¾íؾS-Õ¾S-Õ¾gmÖ¾gmÖ¾+­Ò¾?íÓ¾S-Õ¾+­Ò¾+­Ò¾+­Ò¾+­Ò¾+­Ò¾+­Ò¾mѾ?íÓ¾?íӾ۬;-о-оïìξïìξÇl̾Çl̾Çl̾Çl̾³,˾³,˾ŸìɾŸìɾŸìɾc,ƾOìľc,ƾc,ƾc,ƾ,Á¾c,ƾc,ƾÿ뿾뫾¾ë«¾¾×k½¾Ã+¼¾Ã+¼¾¯ëº¾‡k¸¾‡k¸¾s+·¾s+·¾s+·¾K«´¾K«´¾ûª¯¾ûª¯¾çj®¾#+²¾Ó*­¾Ó*­¾—j©¾«ªª¾«ªª¾Gj¤¾3*£¾3*£¾꡾Ï霾Ï霾Ï霾k©–¾k©–¾/é’¾©‘¾©‘¾·h‹¾gh†¾gh†¾=Ïs¾ýÍ_¾¥K:¾™Ù½™Ù½A 4¼p»p»™Ù½•LI¾•LI¾«ªª¾×k½¾×k½¾£-Ú¾®á¾®á¾»®ë¾÷nï¾÷nï¾ ¯ð¾ïñ¾ïñ¾ïñ¾3/ó¾Goô¾ã.î¾ã.î¾ ¯ð¾ïñ¾ïñ¾ã.î¾Ïîì¾Ïîì¾»®ë¾Ïîì¾Ïîì¾»®ë¾§n꾧n꾓.é¾îç¾îç¾îç¾îç¾Wnå¾Wnå¾Wnå¾C.ä¾/îâ¾/îâ¾/îâ¾/îâ¾ó-ß¾ó-ß¾®á¾nà¾ßíݾßíݾ˭ܾ·mÛ¾·m۾˭ܾ˭ܾ˭ܾ£-Ú¾£-Ú¾£-Ú¾íؾ{­×¾£-Ú¾£-Ú¾gmÖ¾S-Õ¾íؾíؾ+­Ò¾S-Õ¾S-Õ¾S-Õ¾+­Ò¾+­Ò¾mѾ-о-оmѾïìξ۬;-оïìξÇl̾³,˾³,˾Ÿìɾ‹¬È¾‹¬È¾Ÿìɾ‹¬È¾‹¬È¾;¬Ã¾c,ƾc,ƾOìľ;¬Ã¾;¬Ã¾,Á¾,Á¾×k½¾,Á¾,Á¾¯ëº¾×k½¾×k½¾›«¹¾‡k¸¾‡k¸¾‡k¸¾7k³¾7k³¾K«´¾ë°¾ë°¾çj®¾çj®¾Ó*­¾«ªª¾«ªª¾ƒ*¨¾[ª¥¾[ª¥¾Gj¤¾3*£¾3*£¾ã)ž¾§iš¾§iš¾é—¾k©–¾k©–¾i¾·h‹¾·h‹¾S(…¾(€¾(€¾ÕM]¾µJ+¾YŒÅ½ ½p»p»Ñ M½Ñ M½…MX¾©‘¾©‘¾'l¾+­Ò¾+­Ò¾nà¾îç¾Ïîì¾Ïîì¾ã.î¾ ¯ð¾ïñ¾3/ó¾ïñ¾ïñ¾ïñ¾ïñ¾ïñ¾ïñ¾ ¯ð¾ ¯ð¾ ¯ð¾÷nï¾ã.î¾ã.î¾÷nï¾Ïîì¾Ïîì¾k®æ¾»®ë¾»®ë¾îç¾îç¾îç¾îç¾C.ä¾/îâ¾Wnå¾Wnå¾/îâ¾/îâ¾/îâ¾®á¾nà¾nà¾ó-ß¾nà¾nà¾ßíݾßíݾßíݾßíݾnà¾nྣ-Ú¾£-Ú¾£-Ú¾£-Ú¾{­×¾íؾ{­×¾íؾ{­×¾{­×¾{­×¾S-Õ¾S-Õ¾S-Õ¾+­Ò¾mѾmѾ+­Ò¾mѾmѾïìξïìξïìξÇl̾Çl̾Çl̾Çl̾³,˾ŸìɾÇl̾³,˾ŸìɾŸìɾŸìɾc,ƾc,ƾc,ƾOìľ'l¾'l¾'l¾'l¾'l¾ÿ뿾×k½¾×k½¾Ã+¼¾Ã+¼¾Ã+¼¾‡k¸¾‡k¸¾K«´¾_ëµ¾7k³¾#+²¾7k³¾7k³¾çj®¾çj®¾çj®¾«ªª¾«ªª¾«ªª¾ƒ*¨¾3*£¾3*£¾3*£¾÷iŸ¾Ï霾§iš¾§iš¾§iš¾Wi•¾Wi•¾ó(¾Ë¨Œ¾Ë¨Œ¾?胾(€¾(€¾­ÍZ¾íɾíɾq½ - º - ºq -W½5H¾…MX¾C)”¾C)”¾,Á¾mѾmѾC.ä¾Wnå¾Wnå¾Ïîì¾ïñ¾ïñ¾ïñ¾3/ó¾3/ó¾ïñ¾Goô¾Goô¾ïñ¾ïñ¾ïñ¾÷nï¾÷nï¾ ¯ð¾ã.î¾ã.î¾»®ë¾Ïîì¾Ïîì¾îç¾îç¾î羓.é¾k®æ¾k®æ¾îç¾Wnå¾Wnå¾C.ä¾C.ä¾/îâ¾/îâ¾®á¾nà¾nà¾nྮá¾nà¾nà¾ßíݾnà¾nྣ-ھ˭ܾ˭ܾ˭ܾ£-Ú¾£-Ú¾£-Ú¾íؾíؾS-Õ¾íؾíؾgmÖ¾{­×¾S-Õ¾+­Ò¾+­Ò¾S-Õ¾mѾmѾmѾ?íÓ¾?íÓ¾-о-о-оïìξïìξïìξ۬;۬;³,˾ŸìɾŸìɾ‹¬È¾‹¬È¾‹¬È¾OìľOìľOìľc,ƾ,Á¾,Á¾,Á¾'l¾'l¾×k½¾ë«¾¾×k½¾¯ëº¾‡k¸¾›«¹¾‡k¸¾‡k¸¾K«´¾_ëµ¾_ëµ¾7k³¾ë°¾ë°¾çj®¾çj®¾çj®¾Ó*­¾—j©¾—j©¾—j©¾oꦾoꦾ3*£¾꡾÷iŸ¾»©›¾“)™¾k©–¾Wi•¾Wi•¾ó(¾ßè¾ßè¾S(…¾(€¾(€¾%Nb¾õK?¾õK?¾±k½Á ¼Á ¼aæ¼i‹¶½µJ+¾+¨‚¾3*£¾›«¹¾³,˾³,˾nà¾Wnå¾Wnå¾Ïîì¾ ¯ð¾ ¯ð¾ïñ¾ïñ¾ïñ¾ ¯ð¾ïñ¾ïñ¾ïñ¾ ¯ð¾ ¯ð¾ïñ¾ã.î¾Ïîì¾ã.î¾ã.n꾧n꾧n꾓.龧n꾧nê¾îç¾k®æ¾k®æ¾îç¾k®æ¾k®æ¾Wnå¾k®æ¾k®æ¾C.ä¾nྮá¾C.ä¾C.ä¾ó-ß¾nà¾nà¾ßíݾßíݾßíݾ˭ܾ˭ܾ£-Ú¾·mÛ¾·mÛ¾·mÛ¾£-Ú¾£-Ú¾gmÖ¾{­×¾{­×¾{­×¾S-Õ¾S-Õ¾íؾS-Õ¾S-Õ¾?íÓ¾?íÓ¾S-Õ¾-о-о+­Ò¾mѾmѾ-о-о-о۬;Çl̾Çl̾³,˾³,˾³,˾‹¬È¾‹¬È¾c,ƾwlǾOìľ;¬Ã¾;¬Ã¾;¬Ã¾'l¾ÿ뿾ÿ뿾,Á¾ÿ뿾ÿ뿾Ã+¼¾×k½¾×k½¾Ã+¼¾›«¹¾s+·¾_ëµ¾‡k¸¾_ëµ¾#+²¾#+²¾#+²¾ûª¯¾ûª¯¾¿ê«¾«ªª¾«ªª¾ƒ*¨¾oꦾoꦾ3*£¾ ª ¾ ª ¾ã)ž¾§iš¾§iš¾“)™¾“)™¾/é’¾ó(¾ó(¾£(Š¾{¨‡¾{¨‡¾µO{¾%Nb¾%Nb¾ -ȾIˆ„½Iˆ„½p;!‚¼‰‰˜½Ê(¾µO{¾÷iŸ¾s+·¾s+·¾S-Õ¾ßíݾßíݾîç¾»®ë¾»®ë¾÷nï¾÷nï¾÷nï¾ïñ¾ ¯ð¾ ¯ð¾ïñ¾ïñ¾ïñ¾ ¯ð¾ ¯ð¾÷nï¾÷nï¾÷nï¾ã.î¾Ïîì¾Ïîì¾Ïîì¾Ïîì¾Ïî쾓.龧n꾓.é¾îç¾k®æ¾îç¾îç¾îç¾C.ä¾C.ä¾C.ä¾C.侮ᾮᾮᾮᾮá¾nà¾ßíݾßíݾó-ß¾ó-߾˭ܾßíݾßíݾ˭ܾíؾíؾ·mÛ¾·mÛ¾·mÛ¾·mÛ¾íؾíؾ{­×¾S-Õ¾gmÖ¾S-Õ¾S-Õ¾?íÓ¾+­Ò¾+­Ò¾+­Ò¾+­Ò¾+­Ò¾-оmѾmѾïìξ۬;۬;ïìξ³,˾³,˾³,˾Çl̾³,˾‹¬È¾‹¬È¾wlǾwlǾwlǾc,ƾOìľOìľ;¬Ã¾;¬Ã¾;¬Ã¾×k½¾ë«¾¾ë«¾¾¯ëº¾¯ëº¾›«¹¾›«¹¾›«¹¾_ëµ¾_ëµ¾_뵾밾밾밾ûª¯¾ûª¯¾ûª¯¾¿ê«¾—j©¾—j©¾ƒ*¨¾oꦾoꦾGj¤¾Gj¤¾÷iŸ¾Ï霾Ï霾“)™¾é—¾é—¾©‘¾i¾i¾{¨‡¾?胾?胾Îi¾åLN¾É¾yŠ§½yŠ§½ - º È» È»…H¾%Nb¾%Nb¾çj®¾,Á¾,Á¾Ë­Ü¾®á¾k®æ¾»®ë¾»®ë¾÷nï¾ ¯ð¾ ¯ð¾ïñ¾ ¯ð¾ ¯ð¾ ¯ð¾Goô¾Goô¾3/ó¾ïñ¾ïñ¾÷nï¾÷nï¾÷nï¾Ïîì¾Ïî쾧nê¾ã.î¾ã.î¾î羧n꾧n꾓.é¾Wnå¾Wnå¾Wnå¾C.ä¾C.ä¾Wnå¾C.ä¾/îâ¾Wnå¾Wnå¾ó-ß¾®á¾®á¾®á¾ó-ß¾ó-ß¾nà¾nà¾nà¾ßíݾßíݾßíݾ·mÛ¾·mÛ¾·mÛ¾íؾíؾíؾ{­×¾{­×¾gmÖ¾{­×¾{­×¾gmÖ¾?íÓ¾?íÓ¾?íÓ¾mѾmѾ+­Ò¾+­Ò¾ïìξ-о-о-о-о-оÇl̾³,˾Çl̾Çl̾Çl̾‹¬È¾‹¬È¾‹¬È¾‹¬È¾c,ƾc,ƾ;¬Ã¾;¬Ã¾,Á¾,Á¾,Á¾×k½¾×k½¾×k½¾ë«¾¾¯ëº¾¯ëº¾›«¹¾s+·¾s+·¾_ëµ¾s+·¾K«´¾#+²¾#+²¾#+²¾çj®¾çj®¾ûª¯¾¿ê«¾¿ê«¾ƒ*¨¾oꦾoꦾ꡾꡾ ª ¾÷iŸ¾Ï霾k©–¾“)™¾“)™¾/é’¾ó(¾ó(¾{¨‡¾{¨‡¾{¨‡¾=Ïs¾ýÍ_¾ýÍ_¾ -Ⱦ±k½±k½p;¡ -ª¼ÉŠ¬½µJ+¾µO{¾ ª ¾s+·¾s+·¾+­Ò¾ßíݾßíݾîç¾»®ë¾»®ë¾÷nï¾3/ó¾3/ó¾ïñ¾ïñ¾3/ó¾3/ó¾3/ó¾ ¯ð¾ïñ¾ïñ¾÷nï¾ã.î¾ã.î¾÷nï¾Ïîì¾Ïîì¾Ïî쾓.龓.龓.龧n꾧n꾧n꾧n꾓.é¾Wnå¾Wnå¾îç¾k®æ¾k®æ¾/îâ¾C.ä¾C.ä¾®á¾nྮᾮᾮá¾ßíݾ˭ܾ˭ܾó-߾˭ܾ˭ܾ£-Ú¾£-Ú¾·mÛ¾·mÛ¾·mÛ¾£-Ú¾£-Ú¾£-Ú¾gmÖ¾S-Õ¾S-Õ¾{­×¾S-Õ¾S-Õ¾?íÓ¾S-Õ¾S-Õ¾?íÓ¾?íÓ¾mѾmѾmѾmѾ۬;۬;Çl̾³,˾³,˾‹¬È¾³,˾³,˾c,ƾ‹¬È¾wlǾOìľOìľ;¬Ã¾;¬Ã¾;¬Ã¾,Á¾,Á¾,Á¾ë«¾¾ë«¾¾ë«¾¾×k½¾¯ëº¾Ã+¼¾›«¹¾s+·¾_ëµ¾_ëµ¾_ëµ¾#+²¾ë°¾ë°¾#+²¾¿ê«¾¿ê«¾«ªª¾ƒ*¨¾ƒ*¨¾Gj¤¾3*£¾3*£¾ ª ¾÷iŸ¾ã)ž¾»©›¾»©›¾é—¾Wi•¾Wi•¾ó(¾ó(¾ó(¾S(…¾?胾?胾Îi¾•LI¾•LI¾)Š¢½á ¾¼p; È» È»…H¾%Nb¾%Nb¾çj®¾,Á¾,Á¾·mÛ¾nà¾nྦྷnê¾÷nï¾÷nï¾Ïîì¾ ¯ð¾3/ó¾ïñ¾ïñ¾ïñ¾ïñ¾ïñ¾ ¯ð¾ ¯ð¾ã.î¾ã.î¾ã.î¾Ïîì¾ã.î¾ã.î¾÷nï¾Ïîì¾Ïî쾧nê¾»®ë¾»®ë¾îç¾îç¾îç¾îç¾Wnå¾Wnå¾Wnå¾Wnå¾/îâ¾C.ä¾C.ä¾nྮᾮᾮá¾ó-ß¾ó-ß¾ó-ß¾ßíݾßíݾ·mÛ¾ßíݾ˭ܾ£-Ú¾£-ھ˭ܾ·mÛ¾·mÛ¾£-Ú¾íؾíؾgmÖ¾{­×¾{­×¾S-Õ¾gmÖ¾gmÖ¾?íÓ¾+­Ò¾?íÓ¾+­Ò¾+­Ò¾ïìξ-о-оïìξÇl̾Çl̾۬;³,˾ŸìɾŸìɾ³,˾‹¬È¾wlǾwlǾwlǾwlǾwlǾOìľ'l¾'l¾'l¾,Á¾,Á¾×k½¾ë«¾¾ë«¾¾Ã+¼¾Ã+¼¾‡k¸¾›«¹¾›«¹¾ë°¾K«´¾K«´¾ûª¯¾çj®¾çj®¾¿ê«¾¿ê«¾¿ê«¾—j©¾oꦾGj¤¾Gj¤¾Gj¤¾÷iŸ¾÷iŸ¾÷iŸ¾Ï霾k©–¾k©–¾é—¾Wi•¾Wi•¾·h‹¾·h‹¾gh†¾h¾h¾uNg¾ELD¾ELD¾™ˆ‰½Á -\¼Á -\¼Á ¼Qu½%I¾MÎd¾MÎd¾#+²¾;¬Ã¾;¬Ã¾£-Ú¾C.ä¾C.侓.é¾ã.î¾ã.î¾ ¯ð¾ïñ¾ïñ¾3/ó¾ ¯ð¾ïñ¾ïñ¾ïñ¾ã.î¾ïñ¾ïñ¾ ¯ð¾ã.î¾ã.î¾ïñ¾»®ë¾»®ë¾Ïîì¾»®ë¾»®ë¾“.龓.龓.é¾îç¾Wnå¾îç¾k®æ¾k®æ¾Wnå¾C.ä¾C.ä¾®á¾/îâ¾/îâ¾ó-ß¾nà¾C.ä¾nà¾ó-ß¾nà¾ó-ß¾ó-ß¾ßíݾ£-Ú¾£-Ú¾ßíݾ˭ܾ˭ܾ·mÛ¾íؾíؾ{­×¾gmÖ¾gmÖ¾{­×¾íؾgmÖ¾+­Ò¾?íÓ¾gmÖ¾?íÓ¾?íÓ¾mѾmѾmѾïìξ۬;۬;ïìξ۬;³,˾Çl̾³,˾³,˾ŸìɾŸìɾc,ƾ‹¬È¾‹¬È¾Oìľ;¬Ã¾;¬Ã¾;¬Ã¾'l¾'l¾뫾¾ë«¾¾×k½¾¯ëº¾¯ëº¾¯ëº¾›«¹¾›«¹¾‡k¸¾K«´¾K«´¾7k³¾7k³¾7k³¾Ó*­¾ë°¾çj®¾¿ê«¾—j©¾«ªª¾«ªª¾Gj¤¾[ª¥¾3*£¾3*£¾ã)ž¾Ï霾Ï霾Ï霾闾闾/é’¾i¾i¾£(Š¾S(…¾S(…¾ÝÏ}¾íÎn¾]ÍU¾J!¾J!¾± ½ - : - : ½9Žã½9Žã½gh†¾oꦾoꦾÇl̾S-Õ¾S-Õ¾C.ä¾îç¾Ïîì¾ã.î¾ã.î¾ã.î¾3/ó¾3/ó¾ïñ¾ ¯ð¾ ¯ð¾ïñ¾÷nï¾÷nï¾ã.î¾ ¯ð¾ ¯ð¾»®ë¾ã.î¾ã.î¾»®ë¾§nê¾»®ë¾“.龓.é¾î羓.龓.é¾k®æ¾“.龓.é¾Wnå¾/îâ¾/îâ¾C.ä¾/îâ¾/îâ¾/î⾮ᾮá¾nà¾nà¾nà¾ó-ß¾ó-ß¾nà¾Ë­Ü¾Ë­Ü¾Ë­Ü¾íؾíؾ·mÛ¾·mÛ¾·mÛ¾gmÖ¾£-Ú¾gmÖ¾gmÖ¾gmÖ¾?íÓ¾íؾíؾ+­Ò¾?íÓ¾?íÓ¾?íÓ¾+­Ò¾+­Ò¾+­Ò¾-оmѾïìξïìξ³,˾Çl̾Çl̾ŸìɾŸìɾŸìɾŸìɾOìľOìľwlǾc,ƾc,ƾ'l¾'l¾,Á¾,Á¾ÿ뿾×k½¾ë«¾¾ë«¾¾¯ëº¾›«¹¾›«¹¾‡k¸¾›«¹¾›«¹¾7k³¾#+²¾#+²¾#+²¾ûª¯¾ûª¯¾çj®¾ûª¯¾ûª¯¾ƒ*¨¾—j©¾—j©¾[ª¥¾3*£¾꡾÷iŸ¾÷iŸ¾»©›¾§iš¾§iš¾k©–¾Wi•¾Wi•¾Ë¨Œ¾£(Š¾èˆ¾+¨‚¾+¨‚¾Îi¾%Nb¾%Nb¾)ò½a½a½Á <Á -\¼Á -\¼µJ+¾eOv¾Ï霾_ëµ¾_ëµ¾-о·mÛ¾·mÛ¾î羓.龓.é¾÷nï¾Ïîì¾Ïîì¾ ¯ð¾ïñ¾ïñ¾÷nï¾ ¯ð¾ ¯ð¾÷nï¾÷nï¾÷nï¾ã.î¾ã.î¾÷nï¾»®ë¾»®ë¾»®ë¾ã.î¾ã..龓.龓.龓.é¾k®æ¾îç¾îç¾îç¾C.ä¾C.ä¾C.ä¾C.ä¾/îâ¾/îâ¾®á¾nà¾nà¾nà¾ßíݾßíݾó-ß¾ßíݾßíݾ˭ܾßíݾ˭ܾ·mÛ¾·mÛ¾£-Ú¾·mÛ¾·mÛ¾{­×¾{­×¾{­×¾{­×¾íؾíؾ{­×¾S-Õ¾S-Õ¾?íÓ¾+­Ò¾+­Ò¾?íÓ¾?íÓ¾ïìξ۬;۬;mѾ۬;۬;³,˾۬;۬;‹¬È¾‹¬È¾‹¬È¾‹¬È¾wlǾwlǾc,ƾ;¬Ã¾;¬Ã¾;¬Ã¾'l¾뫾¾ÿ뿾ÿ뿾×k½¾×k½¾×k½¾Ã+¼¾‡k¸¾‡k¸¾‡k¸¾s+·¾s+·¾#+²¾7k³¾7k³¾çj®¾çj®¾çj®¾«ªª¾«ªª¾ƒ*¨¾[ª¥¾[ª¥¾3*£¾3*£¾3*£¾Ï霾Ï霾Ï霾§iš¾é—¾é—¾/é’¾/é’¾/é’¾·h‹¾{¨‡¾+¨‚¾Ïx¾Ïx¾]ÍU¾=Ê#¾=Ê#¾Q -%½p;p; ½IÔ½ÍË<¾S(…¾[ª¥¾›«¹¾‹¬È¾‹¬È¾Ë­Ü¾Wnå¾Wn徧nê¾Ïîì¾Ïîì¾÷nï¾ ¯ð¾ ¯ð¾3/ó¾ ¯ð¾ ¯ð¾ïñ¾÷nï¾Ïîì¾ïñ¾ïñ¾»®ë¾ã.î¾ã.î¾ã.î¾Ïîì¾Ïîì¾»®ë¾Ïîì¾Ïîì¾î羓.龓.é¾k®æ¾k®æ¾k®æ¾Wnå¾k®æ¾Wnå¾C.ä¾C.ä¾/îâ¾C.ä¾C.ä¾ó-ß¾nà¾nà¾nà¾ó-ß¾ó-ß¾nà¾nà¾nà¾Ë­Ü¾ßíݾßíݾ·mÛ¾·m۾˭ܾíؾíؾíؾíؾíؾgmÖ¾íؾíؾmѾ?íÓ¾?íÓ¾+­Ò¾-оmѾmѾmѾ-оïìξ۬;۬;³,˾³,˾۬;³,˾³,˾Ÿìɾ‹¬È¾‹¬È¾‹¬È¾‹¬È¾‹¬È¾'l¾OìľOìľ,Á¾,Á¾ë«¾¾ÿ뿾ÿ뿾›«¹¾Ã+¼¾Ã+¼¾s+·¾s+·¾s+·¾7k³¾7k³¾#+²¾ë°¾ë°¾¿ê«¾Ó*­¾Ó*­¾—j©¾ƒ*¨¾ƒ*¨¾oꦾGj¤¾Gj¤¾꡾꡾꡾Ï霾»©›¾“)™¾k©–¾k©–¾ó(¾ßè¾ßè¾gh†¾+¨‚¾+¨‚¾ÅNl¾­ÍZ¾­ÍZ¾ ŒÀ½± ½± ½ È;a –¼¹‹»½UK5¾UK5¾÷iŸ¾‡k¸¾‡k¸¾?íӾ˭ܾ˭ܾî羧n꾧nê¾ã.î¾ã.î¾ã.î¾ïñ¾3/ó¾3/ó¾÷nï¾3/ó¾3/ó¾÷nï¾÷nï¾÷nï¾÷nï¾÷nï¾Ïîì¾Ïîì¾Ïîì¾»®ë¾“.龓.龓.龧n꾧n꾓.é¾k®æ¾k®æ¾k®æ¾k®æ¾C.ä¾Wnå¾Wnå¾Wn微ᾮá¾C.ä¾C.ä¾C.ä¾ó-ß¾/îâ¾/îâ¾nà¾nà¾nà¾ßíݾßíݾßíݾ·mÛ¾£-Ú¾£-ھ˭ܾ˭ܾ{­×¾{­×¾{­×¾{­×¾?íÓ¾?íÓ¾{­×¾gmÖ¾gmÖ¾S-Õ¾S-Õ¾S-Õ¾+­Ò¾+­Ò¾-оïìξïìξïìξïìξïìξ۬;۬;۬;‹¬È¾‹¬È¾‹¬È¾wlǾc,ƾ'l¾OìľOìľ'l¾'l¾'l¾ÿ뿾뫾¾ë«¾¾Ã+¼¾¯ëº¾¯ëº¾›«¹¾_ëµ¾7k³¾‡k¸¾s+·¾7k³¾#+²¾#+²¾7k³¾ûª¯¾ûª¯¾Ó*­¾¿ê«¾¿ê«¾ƒ*¨¾[ª¥¾[ª¥¾Gj¤¾꡾꡾ã)ž¾Ï霾Ï霾é—¾C)”¾©‘¾/é’¾/钾舾gh†¾gh†¾h¾Oq¾Oq¾ÌA¾ -Ⱦ -Ⱦ!‚¼Á <Á <a½ÕH -¾%Nb¾/é’¾ûª¯¾,Á¾Û¬Í¾Û¬Í¾nà¾k®æ¾k®æ¾§nê¾÷nï¾÷nï¾ ¯ð¾ã.î¾ã.î¾ïñ¾ ¯ð¾ ¯ð¾3/ó¾÷nï¾÷nï¾÷nï¾÷nï¾Ïîì¾Ïîì¾Ïîì¾Ïîì¾Ïîì¾Ïîì¾Ïî쾧n꾧n꾧n꾓.龓.é¾Wnå¾k®æ¾k®æ¾îç¾îç¾Wnå¾îç¾îç¾C.ä¾/îâ¾/îâ¾nྮᾮᾮá¾ó-ß¾ó-ß¾®á¾ßíݾ˭ܾ·m۾˭ܾßíݾíؾíؾ·mÛ¾·mÛ¾·mÛ¾£-Ú¾íؾíؾ{­×¾S-Õ¾{­×¾S-Õ¾S-Õ¾?íÓ¾+­Ò¾+­Ò¾?íÓ¾?íÓ¾?íÓ¾Çl̾ïìξïìξ۬;Çl̾Çl̾۬;‹¬È¾wlǾ‹¬È¾‹¬È¾wlǾc,ƾc,ƾ'l¾'l¾'l¾,Á¾ÿ뿾ÿ뿾ÿ뿾×k½¾×k½¾¯ëº¾Ã+¼¾Ã+¼¾s+·¾s+·¾_ëµ¾_ëµ¾_ëµ¾#+²¾çj®¾çj®¾çj®¾«ªª¾«ªª¾—j©¾—j©¾—j©¾[ª¥¾꡾꡾꡾꡾§iš¾»©›¾»©›¾k©–¾©‘¾©‘¾©‘¾ßè¾ßè¾gh†¾h¾h¾íÎn¾]ÍU¾ÝÊ-¾ùŒÏ½1 C½p»A 4Ù¿>Ù¿>Ù¿49¿R¿R¿>Ù¿>Ù¿Hy¿\¹¿\¹¿\¹¿\¹¿\¹¿fY¿fY¿fY¿\¹¿pù¿pù¿pù¿pù¿„9¿ŽÙ¿ŽÙ¿„9¿„9¿„9¿˜y¿ŽÙ¿ŽÙ¿¢¿¢¿ŽÙ¿¬¹¿¬¹¿¢¿¢¿¢¿Ê™¿¬¹¿¬¹¿Àù¿¬¹¿¬¹¿Ô9¿Ô9¿Ô9¿¶Y¿Ô9¿Ô9¿¶Y¿Àù¿Ô9¿Ô9¿Ô9¿Ê™¿èy¿èy¿èy¿èy¿èy¿ÞÙ¿ò¿ò¿èy¿èy¿èy¿ü¹¿ò¿ò¿ò¿ú ¿Z ¿èy¿èy¿Z ¿ü¹¿ü¹¿ò¿Z ¿Z ¿ü¹¿ü¹¿ü¹¿ü¹¿ú ¿ú ¿ú ¿ü¹¿ú ¿ú ¿ú ¿ü¹¿š!¿š!¿ú ¿ú ¿ú ¿$:"¿š!¿š!¿š!¿$:"¿$:"¿$:"¿$:"¿$:"¿š!¿$:"¿$:"¿8z#¿$:"¿.Ú"¿.Ú"¿.Ú"¿š!¿$:"¿$:"¿š!¿.Ú"¿.Ú"¿8z#¿.Ú"¿.Ú"¿8z#¿8z#¿Lº$¿8z#¿8z#¿B$¿.Ú"¿.Ú"¿B$¿8z#¿8z#¿Lº$¿B$¿8z#¿B$¿B$¿VZ%¿8z#¿8z#¿B$¿Lº$¿Lº$¿B$¿Lº$¿Lº$¿B$¿B$¿Lº$¿8z#¿B$¿VZ%¿B$¿B$¿Lº$¿`ú%¿`ú%¿8z#¿VZ%¿VZ%¿VZ%¿VZ%¿VZ%¿`ú%¿VZ%¿VZ%¿Lº$¿Lº$¿`ú%¿VZ%¿VZ%¿`ú%¿Lº$¿Lº$¿VZ%¿VZ%¿VZ%¿VZ%¿`ú%¿`ú%¿Lº$¿VZ%¿VZ%¿VZ%¿`ú%¿`ú%¿`ú%¿VZ%¿VZ%¿t:'¿t:'¿`ú%¿`ú%¿`ú%¿`ú%¿jš&¿jš&¿t:'¿`ú%¿`ú%¿~Ú'¿t:'¿t:'¿jš&¿t:'¿t:'¿jš&¿jš&¿jš&¿~Ú'¿~Ú'¿`ú%¿jš&¿jš&¿jš&¿`ú%¿`ú%¿VZ%¿t:'¿t:'¿`ú%¿jš&¿jš&¿~Ú'¿jš&¿`ú%¿`ú%¿ˆz(¿~Ú'¿jš&¿jš&¿~Ú'¿~Ú'¿~Ú'¿t:'¿t:'¿t:'¿`ú%¿t:'¿t:'¿`ú%¿t:'¿t:'¿jš&¿jš&¿~Ú'¿t:'¿t:'¿jš&¿t:'¿t:'¿jš&¿jš&¿jš&¿t:'¿~Ú'¿~Ú'¿~Ú'¿t:'¿jš&¿t:'¿t:'¿~Ú'¿t:'¿t:'¿~Ú'¿~Ú'¿~Ú'¿ˆz(¿~Ú'¿~Ú'¿~Ú'¿t:'¿t:'¿jš&¿~Ú'¿~Ú'¿~Ú'¿t:'¿t:'¿~Ú'¿~Ú'¿~Ú'¿t:'¿t:'¿jš&¿t:'¿t:'¿~Ú'¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿t:'¿ˆz(¿’)¿t:'¿t:'¿ˆz(¿~Ú'¿~Ú'¿~Ú'¿ˆz(¿ˆz(¿~Ú'¿~Ú'¿~Ú'¿t:'¿t:'¿t:'¿t:'¿t:'¿~Ú'¿ˆz(¿t:'¿~Ú'¿t:'¿t:'¿~Ú'¿t:'¿t:'¿ˆz(¿’)¿’)¿~Ú'¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿t:'¿~Ú'¿’)¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿~Ú'¿~Ú'¿~Ú'¿t:'¿t:'¿t:'¿’)¿~Ú'¿t:'¿~Ú'¿~Ú'¿ˆz(¿t:'¿t:'¿’)¿ˆz(¿ˆz(¿’)¿~Ú'¿~Ú'¿ˆz(¿~Ú'¿~Ú'¿~Ú'¿ˆz(¿’)¿ˆz(¿ˆz(¿’)¿œº)¿œº)¿ˆz(¿’)¿’)¿~Ú'¿ˆz(¿ˆz(¿t:'¿ˆz(¿ˆz(¿t:'¿t:'¿t:'¿ˆz(¿ˆz(¿t:'¿~Ú'¿~Ú'¿~Ú'¿t:'¿t:'¿’)¿ˆz(¿ˆz(¿ˆz(¿’)¿’)¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿~Ú'¿’)¿’)¿t:'¿ˆz(¿ˆz(¿œº)¿~Ú'¿ˆz(¿ˆz(¿t:'¿ˆz(¿~Ú'¿~Ú'¿~Ú'¿’)¿’)¿’)¿ˆz(¿ˆz(¿’)¿’)¿’)¿’)¿œº)¿ˆz(¿~Ú'¿~Ú'¿~Ú'¿ˆz(¿ˆz(¿~Ú'¿’)¿’)¿ˆz(¿ˆz(¿ˆz(¿t:'¿ˆz(¿ˆz(¿~Ú'¿~Ú'¿~Ú'¿’)¿~Ú'¿~Ú'¿~Ú'¿~Ú'¿ˆz(¿~Ú'¿~Ú'¿œº)¿~Ú'¿~Ú'¿ˆz(¿œº)¿’)¿’)¿~Ú'¿~Ú'¿’)¿’)¿’)¿~Ú'¿~Ú'¿~Ú'¿ˆz(¿ˆz(¿t:'¿ˆz(¿ˆz(¿~Ú'¿t:'¿t:'¿’)¿ˆz(¿ˆz(¿ˆz(¿~Ú'¿~Ú'¿~Ú'¿~Ú'¿ˆz(¿~Ú'¿~Ú'¿’)¿~Ú'¿~Ú'¿œº)¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿t:'¿’)¿ˆz(¿’)¿’)¿~Ú'¿ˆz(¿ˆz(¿’)¿~Ú'¿~Ú'¿~Ú'¿~Ú'¿~Ú'¿~Ú'¿ˆz(¿~Ú'¿ˆz(¿ˆz(¿t:'¿’)¿’)¿’)¿~Ú'¿~Ú'¿ˆz(¿~Ú'¿~Ú'¿~Ú'¿ˆz(¿~Ú'¿ˆz(¿~Ú'¿ˆz(¿~Ú'¿~Ú'¿ˆz(¿~Ú'¿~Ú'¿’)¿~Ú'¿~Ú'¿~Ú'¿ˆz(¿ˆz(¿~Ú'¿ˆz(¿ˆz(¿’)¿’)¿~Ú'¿t:'¿t:'¿ˆz(¿’)¿’)¿~Ú'¿~Ú'¿~Ú'¿~Ú'¿t:'¿t:'¿ˆz(¿’)¿’)¿~Ú'¿~Ú'¿œº)¿~Ú'¿~Ú'¿ˆz(¿’)¿’)¿t:'¿ˆz(¿ˆz(¿t:'¿ˆz(¿ˆz(¿t:'¿~Ú'¿~Ú'¿~Ú'¿~Ú'¿~Ú'¿’)¿’)¿t:'¿~Ú'¿~Ú'¿ˆz(¿t:'¿t:'¿’)¿’)¿’)¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿~Ú'¿’)¿t:'¿t:'¿’)¿t:'¿t:'¿~Ú'¿ˆz(¿ˆz(¿t:'¿t:'¿t:'¿~Ú'¿jš&¿jš&¿t:'¿ˆz(¿t:'¿ˆz(¿~Ú'¿~Ú'¿’)¿’)¿ˆz(¿~Ú'¿~Ú'¿ˆz(¿~Ú'¿~Ú'¿ˆz(¿œº)¿œº)¿~Ú'¿ˆz(¿ˆz(¿t:'¿~Ú'¿~Ú'¿ˆz(¿ˆz(¿’)¿~Ú'¿~Ú'¿ˆz(¿~Ú'¿~Ú'¿t:'¿~Ú'¿~Ú'¿ˆz(¿jš&¿t:'¿’)¿~Ú'¿t:'¿ˆz(¿ˆz(¿’)¿~Ú'¿~Ú'¿ˆz(¿’)¿’)¿t:'¿ˆz(¿ˆz(¿’)¿~Ú'¿~Ú'¿ˆz(¿ˆz(¿ˆz(¿~Ú'¿~Ú'¿t:'¿’)¿’)¿t:'¿ˆz(¿ˆz(¿~Ú'¿~Ú'¿ˆz(¿ˆz(¿ˆz(¿~Ú'¿~Ú'¿~Ú'¿ˆz(¿’)¿’)¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿~Ú'¿ˆz(¿ˆz(¿’)¿~Ú'¿~Ú'¿ˆz(¿t:'¿t:'¿~Ú'¿~Ú'¿~Ú'¿~Ú'¿~Ú'¿ˆz(¿ˆz(¿ˆz(¿’)¿~Ú'¿~Ú'¿ˆz(¿’)¿’)¿t:'¿ˆz(¿ˆz(¿œº)¿jš&¿jš&¿’)¿ˆz(¿~Ú'¿~Ú'¿’)¿~Ú'¿œº)¿œº)¿’)¿ˆz(¿ˆz(¿’)¿ˆz(¿ˆz(¿ˆz(¿’)¿’)¿jš&¿ˆz(¿ˆz(¿~Ú'¿t:'¿~Ú'¿ˆz(¿ˆz(¿~Ú'¿’)¿’)¿~Ú'¿ˆz(¿ˆz(¿’)¿~Ú'¿~Ú'¿’)¿~Ú'¿~Ú'¿’)¿œº)¿œº)¿t:'¿’)¿’)¿jš&¿jš&¿~Ú'¿~Ú'¿~Ú'¿t:'¿~Ú'¿~Ú'¿’)¿~Ú'¿~Ú'¿~Ú'¿t:'¿ˆz(¿’)¿’)¿’)¿’)¿’)¿~Ú'¿~Ú'¿~Ú'¿’)¿~Ú'¿~Ú'¿’)¿ˆz(¿ˆz(¿’)¿’)¿~Ú'¿ˆz(¿ˆz(¿t:'¿t:'¿t:'¿’)¿~Ú'¿~Ú'¿t:'¿ˆz(¿ˆz(¿jš&¿ˆz(¿ˆz(¿ˆz(¿t:'¿~Ú'¿ˆz(¿ˆz(¿’)¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿’)¿ˆz(¿ˆz(¿’)¿~Ú'¿~Ú'¿’)¿ˆz(¿~Ú'¿t:'¿t:'¿’)¿t:'¿t:'¿~Ú'¿ˆz(¿ˆz(¿t:'¿~Ú'¿~Ú'¿jš&¿~Ú'¿~Ú'¿~Ú'¿t:'¿t:'¿’)¿~Ú'¿ˆz(¿’)¿’)¿jš&¿’)¿’)¿œº)¿ˆz(¿ˆz(¿ˆz(¿’)¿’)¿t:'¿’)¿’)¿~Ú'¿~Ú'¿~Ú'¿t:'¿t:'¿’)¿ˆz(¿ˆz(¿jš&¿ˆz(¿ˆz(¿t:'¿~Ú'¿~Ú'¿ˆz(¿t:'¿t:'¿ˆz(¿~Ú'¿~Ú'¿ˆz(¿ˆz(¿t:'¿ˆz(¿ˆz(¿~Ú'¿~Ú'¿’)¿ˆz(¿’)¿ˆz(¿ˆz(¿ˆz(¿t:'¿~Ú'¿~Ú'¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿~Ú'¿~Ú'¿t:'¿~Ú'¿t:'¿~Ú'¿~Ú'¿~Ú'¿’)¿’)¿ˆz(¿~Ú'¿~Ú'¿~Ú'¿~Ú'¿~Ú'¿jš&¿jš&¿ \ No newline at end of file diff -Nru matplotlib-0.99.3/doc/mpl_examples/data/msft.csv matplotlib-1.0.1/doc/mpl_examples/data/msft.csv --- matplotlib-0.99.3/doc/mpl_examples/data/msft.csv 2009-07-31 15:14:50.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/data/msft.csv 1970-01-01 00:00:00.000000000 +0000 @@ -1,66 +0,0 @@ -Date,Open,High,Low,Close,Volume,Adj. Close* -19-Sep-03,29.76,29.97,29.52,29.96,92433800,29.79 -18-Sep-03,28.49,29.51,28.42,29.50,67268096,29.34 -17-Sep-03,28.76,28.95,28.47,28.50,47221600,28.34 -16-Sep-03,28.41,28.95,28.32,28.90,52060600,28.74 -15-Sep-03,28.37,28.61,28.33,28.36,41432300,28.20 -12-Sep-03,27.48,28.40,27.45,28.34,55777200,28.18 -11-Sep-03,27.66,28.11,27.59,27.84,37813300,27.68 -10-Sep-03,28.03,28.18,27.48,27.55,54763500,27.40 -9-Sep-03,28.65,28.71,28.31,28.37,44315200,28.21 -8-Sep-03,28.39,28.92,28.34,28.84,46105300,28.68 -5-Sep-03,28.23,28.75,28.17,28.38,64024500,28.22 -4-Sep-03,28.10,28.47,27.99,28.43,59840800,28.27 -3-Sep-03,27.42,28.40,27.38,28.30,109437800,28.14 -2-Sep-03,26.70,27.30,26.47,27.26,74168896,27.11 -29-Aug-03,26.46,26.55,26.35,26.52,34503000,26.37 -28-Aug-03,26.50,26.58,26.24,26.51,46211200,26.36 -27-Aug-03,26.51,26.58,26.30,26.42,30633900,26.27 -26-Aug-03,26.31,26.67,25.96,26.57,47546000,26.42 -25-Aug-03,26.31,26.54,26.23,26.50,36132900,26.35 -22-Aug-03,26.78,26.95,26.21,26.22,65846300,26.07 -21-Aug-03,26.65,26.73,26.13,26.24,63802700,26.09 -20-Aug-03,26.30,26.53,26.00,26.45,56739300,26.30 -19-Aug-03,25.85,26.65,25.77,26.62,72952896,26.47 -18-Aug-03,25.56,25.83,25.46,25.70,45817400,25.56 -15-Aug-03,25.61,25.66,25.43,25.54,27607900,25.40 -14-Aug-03,25.66,25.71,25.52,25.63,37338300,25.49 -13-Aug-03,25.79,25.89,25.50,25.60,39636900,25.46 -12-Aug-03,25.71,25.77,25.45,25.73,38208400,25.59 -11-Aug-03,25.61,25.99,25.54,25.61,36433900,25.47 -8-Aug-03,25.88,25.98,25.50,25.58,33241400,25.44 -7-Aug-03,25.72,25.81,25.45,25.71,44258500,25.57 -6-Aug-03,25.54,26.19,25.43,25.65,56294900,25.51 -5-Aug-03,26.31,26.54,25.60,25.66,58825800,25.52 -4-Aug-03,26.15,26.41,25.75,26.18,51825600,26.03 -1-Aug-03,26.33,26.51,26.12,26.17,42649700,26.02 -31-Jul-03,26.60,26.99,26.31,26.41,64504800,26.26 -30-Jul-03,26.46,26.57,26.17,26.23,41240300,26.08 -29-Jul-03,26.88,26.90,26.24,26.47,62391100,26.32 -28-Jul-03,26.94,27.00,26.49,26.61,52658300,26.46 -25-Jul-03,26.28,26.95,26.07,26.89,54173000,26.74 -24-Jul-03,26.78,26.92,25.98,26.00,53556600,25.85 -23-Jul-03,26.42,26.65,26.14,26.45,49828200,26.30 -22-Jul-03,26.28,26.56,26.13,26.38,51791000,26.23 -21-Jul-03,26.87,26.91,26.00,26.04,48480800,25.89 -18-Jul-03,27.11,27.23,26.75,26.89,63388400,26.74 -17-Jul-03,27.14,27.27,26.54,26.69,72805000,26.54 -16-Jul-03,27.56,27.62,27.20,27.52,49838900,27.37 -15-Jul-03,27.47,27.53,27.10,27.27,53567600,27.12 -14-Jul-03,27.63,27.81,27.05,27.40,60464400,27.25 -11-Jul-03,26.95,27.45,26.89,27.31,50377300,27.16 -10-Jul-03,27.25,27.42,26.59,26.91,55350800,26.76 -9-Jul-03,27.56,27.70,27.25,27.47,62300700,27.32 -8-Jul-03,27.26,27.80,27.25,27.70,61896800,27.55 -7-Jul-03,27.02,27.55,26.95,27.42,88960800,27.27 -3-Jul-03,26.69,26.95,26.41,26.50,39440900,26.35 -2-Jul-03,26.50,26.93,26.45,26.88,94069296,26.73 -1-Jul-03,25.59,26.20,25.39,26.15,60926000,26.00 -30-Jun-03,25.94,26.12,25.50,25.64,48073100,25.50 -27-Jun-03,25.95,26.34,25.53,25.63,76040304,25.49 -26-Jun-03,25.39,26.51,25.21,25.75,51758100,25.61 -25-Jun-03,25.64,25.99,25.14,25.26,60483500,25.12 -24-Jun-03,25.65,26.04,25.52,25.70,51820300,25.56 -23-Jun-03,26.14,26.24,25.49,25.78,52584500,25.64 -20-Jun-03,26.34,26.38,26.01,26.33,86048896,26.18 -19-Jun-03,26.09,26.39,26.01,26.07,63626900,25.92 \ No newline at end of file diff -Nru matplotlib-0.99.3/doc/mpl_examples/data/msft_nasdaq_d.csv matplotlib-1.0.1/doc/mpl_examples/data/msft_nasdaq_d.csv --- matplotlib-0.99.3/doc/mpl_examples/data/msft_nasdaq_d.csv 2009-07-31 15:14:50.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/data/msft_nasdaq_d.csv 1970-01-01 00:00:00.000000000 +0000 @@ -1,2000 +0,0 @@ -"20040406093000",-1,-1,-1,25.951,0 -"20040405093000",25.8,25.98,25.73,25.951,53803929 -"20040402093000",25.47,25.9,25.44,25.85,98051438 -"20040401093000",24.95,25.11,24.85,25.08,69070246 -"20040331093000",25.19,25.2,24.8699,24.93,70546891 -"20040330093000",25.19,25.33,25.03,25.2,59015157 -"20040329093000",25.24,25.4,25,25.31,51888701 -"20040326093000",25.11,25.51,25,25.03,61593457 -"20040325093000",24.6,25.24,24.58,25.19,85689639 -"20040324093000",24.36,24.58,24.18,24.41,97589357 -"20040323093000",24.63,24.66,24.11,24.15,91728989 -"20040322093000",24.53,24.84,24.01,24.5,127820324 -"20040319093000",24.84,24.94,24.56,24.63,86679709 -"20040318093000",25.03,25.03,24.58,24.89,123243243 -"20040317093000",25.25,25.46,25.11,25.13,56265756 -"20040316093000",25.27,25.37,25.0999,25.18,65454169 -"20040315093000",25.33,25.43,25.06,25.16,68841599 -"20040312093000",25.38,25.51,25.23,25.38,64143859 -"20040311093000",25.2,25.78,25.07,25.09,90594370 -"20040310093000",25.66,25.8,25.35,25.37,75170933 -"20040309093000",25.8,25.97,25.54,25.73,81131386 -"20040308093000",26.31,26.35,25.81,25.83,69399003 -"20040305093000",26.23,26.6,26.2,26.35,59852306 -"20040304093000",26.37,26.42,26.21,26.37,44030373 -"20040303093000",26.35,26.55,26.22,26.37,55002830 -"20040302093000",26.63,26.69,26.35,26.37,66346629 -"20040301093000",26.65,26.72,26.5,26.7,52154834 -"20040227093000",26.48,26.62,26.35,26.53,58282185 -"20040226093000",26.63,26.65,26.41,26.5,66605896 -"20040225093000",26.89,26.99,26.61,26.7,64495129 -"20040224093000",26.6,26.95,26.55,26.88,55437308 -"20040223093000",26.75,26.76,26.4799,26.61,50274762 -"20040220093000",26.65,26.795,26.5,26.57,57835228 -"20040219093000",26.9,26.98,26.43,26.46,62151119 -"20040218093000",26.92,27.11,26.74,26.77,50342324 -"20040217093000",26.7,27.1,26.59,26.99,43486350 -"20040213093000",26.98,27.06,26.5,26.59,67550717 -"20040212093000",27.09,27.15,26.93,26.95,44792237 -"20040211093000",26.95,27.23,26.85,27.15,51515284 -"20040210093000",26.86,27.15,26.82,27.02,37843404 -"20040209093000",27.18,27.229,26.85,26.9,48110933 -"20040206093000",27,27.19,26.93,27.08,47216232 -"20040205093000",27.06,27.17,26.83,26.96,55565357 -"20040204093000",27.15,27.43,27.01,27.01,60938651 -"20040203093000",27.42,27.55,27.18,27.29,48206749 -"20040202093000",27.63,27.8,27.24,27.4,63305411 -"20040130093000",27.85,27.9,27.55,27.65,40531805 -"20040129093000",27.78,27.95,27.57,27.91,63750367 -"20040128093000",28.28,28.44,27.47,27.71,71251148 -"20040127093000",28.6,28.72,28.22,28.25,63227109 -"20040126093000",28.49,28.83,28.32,28.8,58316839 -"20040123093000",28.27,28.76,28.22,28.48,127268328 -"20040122093000",28.37,28.44,27.94,28.01,79830106 -"20040121093000",28.13,28.3,27.85,28.3,53641475 -"20040120093000",27.99,28.2,27.93,28.1,63096877 -"20040116093000",27.74,27.88,27.53,27.81,64008119 -"20040115093000",27.55,27.72,27.42,27.54,58526359 -"20040114093000",27.51,27.73,27.47,27.7,43940830 -"20040113093000",27.54,27.64,27.26,27.43,51558311 -"20040112093000",27.67,27.73,27.35,27.57,55860375 -"20040109093000",28.03,28.061,27.59,27.66,67144616 -"20040108093000",28.39,28.48,28,28.16,58818964 -"20040107093000",28.17,28.31,28.01,28.21,54330541 -"20040106093000",28.19,28.28,28.07,28.24,46958281 -"20040105093000",27.73,28.18,27.72,28.14,67341841 -"20040102093000",27.58,27.77,27.33,27.45,44487643 -"20031231093000",27.42,27.55,27.23,27.37,42251891 -"20031230093000",27.41,27.55,27.4,27.52,34407446 -"20031229093000",27.21,27.53,27.16,27.46,40436735 -"20031226093000",27.05,27.25,27,27.21,12076814 -"20031224093000",27.14,27.16,27,27.04,19924190 -"20031223093000",27.17,27.34,27.01,27.15,39615407 -"20031222093000",27.16,27.43,26.97,27.18,43931366 -"20031219093000",27.49,27.55,27.19,27.36,76923606 -"20031218093000",27.1,27.45,27.05,27.4,61190617 -"20031217093000",27.04,27.08,26.85,27.04,53753584 -"20031216093000",26.83,27.16,26.77,27.06,73984242 -"20031215093000",27.05,27.1,26.68,26.74,88870946 -"20031212093000",26.69,26.81,26.5,26.65,69212563 -"20031211093000",26.59,26.77,26.28,26.61,79332407 -"20031210093000",26.45,26.63,26.38,26.59,82868113 -"20031209093000",26.44,26.61,26.25,26.38,103563951 -"20031208093000",26.12,26.34,25.81,26.24,90611833 -"20031205093000",25.96,26.48,25.919,25.98,96622995 -"20031204093000",25.72,26.23,25.66,26.2,87238064 -"20031203093000",25.82,26.07,25.62,25.67,93121525 -"20031202093000",25.95,26.09,25.61,25.66,85121710 -"20031201093000",25.9,26.21,25.5,25.84,102442206 -"20031128093000",25.5,25.75,25.4,25.71,33404276 -"20031126093000",25.61,25.63,25.32,25.45,69767066 -"20031125093000",25.87,25.95,25.38,25.4,85997502 -"20031124093000",25.33,25.81,25.28,25.73,100276357 -"20031121093000",25.33,25.38,25.08,25.11,70823445 -"20031120093000",25.17,25.631,25.08,25.1,107168833 -"20031119093000",25.29,25.54,25.17,25.35,78862796 -"20031118093000",25.33,25.84,25.12,25.15,110110627 -"20031117093000",25.39,25.44,24.95,25.15,103808559 -"20031114093000",25.7,26.02,25.44,25.5,83171113 -"20031113093000",25.86,25.93,25.45,25.69,79154370 -"20031112093000",25.85,26.14,25.6,25.98,76231280 -"20031111093000",26.01,26.076,25.67,25.8,64999504 -"20031110093000",26.12,26.23,26,26.001,54596151 -"20031107093000",26.38,26.49,26.03,26.1,57862061 -"20031106093000",26.26,26.3,26,26.23,68225794 -"20031105093000",26.15,26.32,26,26.1,61569647 -"20031104093000",26.59,26.62,26.01,26.07,84035771 -"20031103093000",26.35,26.75,26.29,26.68,57790227 -"20031031093000",26.37,26.44,26.11,26.14,69659088 -"20031030093000",27.01,27.04,25.91,26.12,99139273 -"20031029093000",27.16,27.25,26.66,26.74,73595062 -"20031028093000",27.09,27.22,26.88,27.2,72144561 -"20031027093000",26.91,27.1,26.82,26.91,65641718 -"20031024093000",27.27,27.4,26.42,26.61,210918193 -"20031023093000",28.72,29.08,28.7,28.91,69346691 -"20031022093000",29.03,29.21,28.8,28.89,48852064 -"20031021093000",29.35,29.43,29.17,29.353,44176165 -"20031020093000",28.95,29.37,28.8,29.35,38831483 -"20031017093000",29.28,29.29,28.8,28.93,51135991 -"20031016093000",28.91,29.31,28.8,29.23,42270253 -"20031015093000",29.2,29.26,28.7,29.07,58358102 -"20031014093000",28.66,28.77,28.48,28.68,35191311 -"20031013093000",28.98,29.1,28.5,28.78,39342697 -"20031010093000",28.91,29.2,28.67,28.91,37611609 -"20031009093000",29.22,29.3496,28.8,28.94,62736808 -"20031008093000",29.36,29.36,28.68,28.82,47001129 -"20031007093000",29.01,29.372,28.92,29.14,52374444 -"20031006093000",29.15,29.3,28.91,29.19,34057031 -"20031003093000",29.16,29.46,28.93,29.08,57309125 -"20031002093000",28.45,28.75,28.19,28.5,38393640 -"20031001093000",28.03,28.63,27.81,28.52,59194078 -"20030930093000",28.59,28.61,27.75,27.8,63403292 -"20030929093000",28.41,28.91,28.1,28.83,47384602 -"20030926093000",28.27,28.78,28.14,28.19,49867950 -"20030925093000",28.47,28.9597,28.22,28.24,56263206 -"20030924093000",29.61,29.7,28.419,28.46,66476631 -"20030923093000",29.12,29.71,28.88,29.6,58359896 -"20030922093000",29.39,30,28.81,29.07,65714021 -"20030919093000",29.76,29.97,29.52,29.96,92380218 -"20030918093000",28.49,29.51,28.42,29.5,67278172 -"20030917093000",28.76,28.95,28.47,28.5,47232034 -"20030916093000",28.41,28.95,28.32,28.9,52369785 -"20030915093000",28.37,28.61,28.33,28.36,41446549 -"20030912093000",27.48,28.4,26.7,28.34,55787533 -"20030911093000",27.66,28.11,27.59,27.84,37958093 -"20030910093000",28.03,28.18,27.48,27.55,54770213 -"20030909093000",28.645,28.71,28.314,28.37,44455559 -"20030908093000",28.39,28.92,28.34,28.84,46161767 -"20030905093000",28.23,28.75,28.17,28.38,64049179 -"20030904093000",28.1,28.47,27.99,28.43,60199009 -"20030903093000",27.42,28.4,27.38,28.3,109502844 -"20030902093000",26.7,27.3,26.47,27.26,74314623 -"20030829093000",26.46,26.551,26.35,26.52,34776119 -"20030828093000",26.5,26.58,26.24,26.51,46220735 -"20030827093000",26.51,26.58,26.3,26.42,30638514 -"20030826093000",26.31,26.67,25.96,26.57,47557325 -"20030825093000",26.31,26.54,26.23,26.5,36157255 -"20030822093000",26.78,26.95,26.21,26.22,65864451 -"20030821093000",26.65,26.73,26.13,26.24,63920667 -"20030820093000",26.3,26.53,26,26.45,56805847 -"20030819093000",25.85,26.65,25.77,26.62,73001390 -"20030818093000",25.56,25.83,25.46,25.7,45970005 -"20030815093000",25.61,25.66,25.43,25.54,27613331 -"20030814093000",25.66,25.71,25.52,25.63,37416724 -"20030813093000",25.79,25.89,25.5,25.6,39689032 -"20030812093000",25.71,25.77,25.45,25.73,38219342 -"20030811093000",25.61,25.99,25.54,25.61,36438082 -"20030808093000",25.88,25.98,25.5,25.58,33329526 -"20030807093000",25.72,25.81,25.45,25.71,44295184 -"20030806093000",25.54,26.19,25.43,25.65,56301022 -"20030805093000",26.31,26.54,25.6,25.66,58918339 -"20030804093000",26.15,26.41,25.75,26.18,51837768 -"20030801093000",26.33,26.51,26.12,26.17,43200258 -"20030731093000",26.6,26.99,26.31,26.41,64532271 -"20030730093000",26.46,26.57,26.17,26.23,41252147 -"20030729093000",26.88,26.9,26.24,26.47,62427090 -"20030728093000",26.94,27,26.49,26.61,52711820 -"20030725093000",26.28,26.95,26.07,26.89,54185086 -"20030724093000",26.78,26.92,25.98,26,53573421 -"20030723093000",26.42,26.65,26.14,26.45,49831938 -"20030722093000",26.28,26.56,26.1311,26.38,51802602 -"20030721093000",26.87,26.91,26,26.04,49061777 -"20030718093000",27.11,27.23,26.75,26.89,63403704 -"20030717093000",27.14,27.27,26.54,26.69,73663317 -"20030716093000",27.56,27.62,27.2,27.52,50506829 -"20030715093000",27.47,27.53,27.1,27.27,53649884 -"20030714093000",27.63,27.81,27.05,27.4,60470938 -"20030711093000",26.95,27.45,26.89,27.309,50386814 -"20030710093000",27.25,27.45,26.59,26.91,55496602 -"20030709093000",27.56,27.7,27.248,27.47,62413894 -"20030708093000",27.26,27.8,27.249,27.7,61963586 -"20030707093000",27.02,27.551,26.95,27.42,89248289 -"20030703093000",26.7,26.95,26.41,26.45,39441210 -"20030702093000",26.5,26.93,26.45,26.88,95165555 -"20030701093000",25.59,26.201,25.39,26.15,61030761 -"20030630093000",25.94,26.12,25.5,25.64,53109054 -"20030627093000",25.95,26.34,25.53,25.63,76061812 -"20030626093000",25.39,26.51,25.21,25.75,51735860 -"20030625093000",25.64,25.987,25.139,25.26,60580527 -"20030624093000",25.65,26.04,25.52,25.7,51939104 -"20030623093000",26.14,26.24,25.49,25.78,53001295 -"20030620093000",26.344,26.38,26.01,26.33,86918549 -"20030619093000",26.09,26.39,26.01,26.07,63712208 -"20030618093000",25.98,26.43,25.71,26.07,89966720 -"20030617093000",25.64,26.14,25.53,25.959,122234258 -"20030616093000",24.8,25.42,24.669,25.39,70139491 -"20030613093000",25.2,25.25,24.49,24.65,55157665 -"20030612093000",24.97,25.14,24.74,24.99,66204796 -"20030611093000",24.669,24.96,24.422,24.88,75791784 -"20030610093000",23.94,24.75,23.85,24.68,80734302 -"20030609093000",23.72,23.982,23.5999,23.75,73629370 -"20030606093000",24.44,24.56,23.65,23.67,121172563 -"20030605093000",24.47,24.52,24.009,24.09,116136863 -"20030604093000",24.99,25.22,24.74,24.87,83566075 -"20030603093000",24.75,24.92,24.57,24.88,61069552 -"20030602093000",24.98,25.03,24.57,24.639,66328680 -"20030530093000",24.73,24.91,24.51,24.61,85397900 -"20030529093000",24.47,24.67,24.23,24.4,75491901 -"20030528093000",24.78,24.871,24.3,24.41,91524308 -"20030527093000",24.25,24.89,24.219,24.79,68514305 -"20030523093000",24.2,24.54,24.03,24.22,77053076 -"20030522093000",24.2,24.27,24.04,24.16,93413313 -"20030521093000",24.63,24.71,23.89,24.03,109343442 -"20030520093000",24.86,25,24.5,24.63,52775368 -"20030519093000",25.4,25.54,24.74,24.8,55447137 -"20030516093000",25.88,26.05,25.41,25.57,60488391 -"20030515093000",25.85,26.01,25.57,25.79,45696020 -"20030514093000",26.08,26.18,25.546,25.63,45131526 -"20030513093000",26.04,26.2,25.89,25.99,44620696 -"20030512093000",26.15,26.47,26.06,26.21,54013255 -"20030509093000",25.9,26.5,25.89,26.35,59018279 -"20030508093000",25.75,26.148,25.71,25.75,46541276 -"20030507093000",26.11,26.35,25.84,25.99,49234538 -"20030506093000",25.86,26.501,25.82,26.38,54468151 -"20030505093000",26.25,26.39,25.84,25.86,50537557 -"20030502093000",25.65,26.29,25.57,26.13,52815510 -"20030501093000",25.54,25.95,25.34,25.71,42214792 -"20030430093000",25.73,25.88,25.25,25.56,55690962 -"20030429093000",25.95,26.25,25.68,25.809,66022742 -"20030428093000",25.39,25.94,25.32,25.74,56393943 -"20030425093000",25.33,25.644,25.17,25.21,53778322 -"20030424093000",25.48,25.72,25.32,25.49,51884817 -"20030423093000",25.75,25.99,25.47,25.72,55821379 -"20030422093000",25.06,25.8,25.03,25.74,58986853 -"20030421093000",25.61,25.61,25.08,25.21,41678747 -"20030417093000",24.77,25.54,24.74,25.5,58519227 -"20030416093000",25.6,25.74,24.6,24.91,86373961 -"20030415093000",24.68,24.79,24.1,24.61,64340820 -"20030414093000",24.27,24.88,24,24.75,51950191 -"20030411093000",24.89,25.18,23.95,24.2,71742754 -"20030410093000",24.719,24.79,24.28,24.59,51638640 -"20030409093000",25.61,25.67,24.54,24.57,76927109 -"20030408093000",25.31,25.835,25.2,25.58,54145573 -"20030407093000",26.23,26.43,25.17,25.171,65658301 -"20030404093000",25.76,25.8,24.93,25.09,55755448 -"20030403093000",25.99,26.09,25.6,25.73,57710342 -"20030402093000",25.1,26,25.1,25.72,68328205 -"20030401093000",24.46,24.7,24.25,24.35,49803234 -"20030331093000",24.25,24.71,24.01,24.21,71461181 -"20030328093000",24.67,25.1,24.6,24.67,39582173 -"20030327093000",24.94,25.26,24.599,25.04,60045257 -"20030326093000",25.46,25.62,25.24,25.25,51687898 -"20030325093000",25.6,25.751,25.03,25.49,63608930 -"20030324093000",25.55,25.935,25.1899,25.29,61250394 -"20030321093000",26.79,26.9,26.03,26.57,85826301 -"20030320093000",26.02,26.52,25.67,26.25,72006425 -"20030319093000",25.98,26.43,25.74,26.32,73828591 -"20030318093000",25.89,26.04,25.5,26.04,78377645 -"20030317093000",24.52,25.95,24.33,25.93,101197122 -"20030314093000",24.68,24.961,24.26,24.86,75701349 -"20030313093000",23.72,24.74,23.44,24.67,81041416 -"20030312093000",22.818,23.44,22.55,23.39,72568874 -"20030311093000",23.06,23.2679,22.76,22.79,54268389 -"20030310093000",23.31,23.46,22.89,22.95,48721361 -"20030307093000",22.95,23.79,22.9,23.56,66167680 -"20030306093000",23.17,23.5,23.13,23.27,51553414 -"20030305093000",23.07,23.55,23.05,23.44,55631397 -"20030304093000",23.58,23.66,23.06,23.07,56803900 -"20030303093000",24.02,24.12,23.4068,23.54,50841129 -"20030228093000",23.74,24.07,23.559,23.7,56737928 -"20030227093000",23.9,24.21,23.3,23.58,75639266 -"20030226093000",24.079,24.47,23.58,23.6,57314562 -"20030225093000",23.54,24.27,23.38,24.19,68473109 -"20030224093000",24.44,24.5,23.84,24.07,62548553 -"20030221093000",24.29,24.8,23.7,24.61,57081029 -"20030220093000",24.77,24.87,24.1,24.15,51027895 -"20030219093000",24.82,24.88,24.17,24.53,47130583 -"20030218093000",24.62,24.99,24.4,24.96,57543713 -"20030214093000",23.625,24.25,23.385,24.15,90770856 -"20030213093000",23.205,23.56,23.0655,23.495,73839528 -"20030212093000",23.275,23.55,23.134,23.22,71576300 -"20030211093000",23.65,23.835,23,23.22,84596680 -"20030210093000",23.4,23.76,23.27,23.69,74333418 -"20030207093000",23.94,23.975,23.205,23.29,75852114 -"20030206093000",23.43,23.81,23.28,23.71,83617960 -"20030205093000",23.915,24.265,23.33,23.48,101376734 -"20030204093000",23.9,23.97,23.44,23.66,82124484 -"20030203093000",23.965,24.55,23.73,24.28,80820526 -"20030131093000",23.725,24.177,23.515,23.73,107182966 -"20030130093000",25.08,25.085,24.095,24.12,88387876 -"20030129093000",24.365,25.0245,23.965,24.955,107226456 -"20030128093000",24.845,24.85,24.2805,24.41,86413978 -"20030127093000",24.66,25.3,24.205,24.585,115186478 -"20030124093000",26.015,26.025,24.8505,24.925,103436814 -"20030123093000",25.975,26.27,25.73,26.14,71629620 -"20030122093000",25.795,26.2,25.455,25.5,87486264 -"20030121093000",25.935,26.075,25.645,25.665,86413486 -"20030117093000",26.47,26.5,25.655,25.73,156119200 -"20030116093000",28.16,28.325,27.555,27.675,83405140 -"20030115093000",28.5,28.66,28.095,28.135,59999384 -"20030114093000",28.16,28.5,28.095,28.485,54441838 -"20030113093000",28.2625,28.375,27.889,28.195,61040604 -"20030110093000",27.55,28.15,27.45,27.96,67985474 -"20030109093000",27.36,27.96,27.265,27.905,62048642 -"20030108093000",27.685,27.775,27.055,27.12,64749146 -"20030107093000",27.46,28.005,27.34,27.9,81113928 -"20030106093000",27.01,27.615,26.9,27.385,59691684 -"20030103093000",26.795,26.9,26.44,26.895,55744224 -"20030102093000",26.15,26.875,25.855,26.86,67208216 -"20021231093000",26.37,26.495,25.63,25.85,58385956 -"20021230093000",26.505,26.62,26.135,26.375,48298450 -"20021227093000",26.64,27,26.45,26.485,41013688 -"20021226093000",27.015,27.345,26.585,26.695,37341460 -"20021224093000",26.7705,27.115,26.76,26.9105,18427844 -"20021223093000",26.525,27.14,26.45,27,48904018 -"20021220093000",26.745,26.86,26.475,26.52,98535408 -"20021219093000",26.625,27.375,26.44,26.555,82925616 -"20021218093000",26.92,27.2,26.395,26.765,62897932 -"20021217093000",27.21,27.495,26.89,27.18,49820892 -"20021216093000",26.5,27.275,26.335,27.24,60273208 -"20021213093000",26.84,26.875,26.245,26.25,65405618 -"20021212093000",27.5,27.53,26.845,27.085,55394146 -"20021211093000",26.925,27.5095,26.7915,27.33,69323784 -"20021210093000",26.78,27.24,26.74,27.005,63924442 -"20021209093000",27.5,27.61,26.755,26.765,64040988 -"20021206093000",27.435,27.87,27.11,27.735,71820280 -"20021205093000",28.475,28.545,27.65,27.67,69034046 -"20021204093000",28.065,28.72,27.91,28.27,84090988 -"20021203093000",28.6405,28.675,28.205,28.355,58650318 -"20021202093000",29.325,29.48,28.505,28.845,63904216 -"20021129093000",29.215,29.315,28.8,28.84,28466796 -"20021127093000",28.8,29.307,28.7,29.04,55334804 -"20021126093000",28.82,29.125,28.39,28.45,69180644 -"20021125093000",29.03,29.32,28.7855,29.115,61738074 -"20021122093000",28.725,29.15,28.525,29.11,70139728 -"20021121093000",28.49,29,28.39,28.92,83128144 -"20021120093000",27.505,28.45,27.465,28.31,76738650 -"20021119093000",27.775,27.9,27.155,27.415,76558560 -"20021118093000",28.475,28.5185,27.87,27.925,58236538 -"20021115093000",28.335,28.46,27.835,28.35,78480722 -"20021114093000",27.995,28.5,27.935,28.495,78519768 -"20021113093000",27.12,27.965,27.055,27.685,107992828 -"20021112093000",27.05,27.715,26.95,27.255,81898940 -"20021111093000",27.535,27.55,26.91,26.93,58479334 -"20021108093000",28,28.275,27.505,27.55,66088754 -"20021107093000",28.1,28.31,27.75,28.045,73840362 -"20021106093000",28.495,28.552,27.765,28.5,115817030 -"20021105093000",27.89,28.4,27.79,28.34,76831422 -"20021104093000",28.375,28.625,27.76,28.045,140207228 -"20021101093000",26.215,26.62,25.95,26.5,105682436 -"20021031093000",26.595,27.035,26.425,26.735,106194640 -"20021030093000",26.1,26.695,25.815,26.555,94625004 -"20021029093000",26.075,26.245,25.425,26.035,90809122 -"20021028093000",26.7,26.75,25.755,26,80081818 -"20021025093000",25.625,26.4,25.58,26.34,75604510 -"20021024093000",26.66,26.685,25.45,25.615,96088000 -"20021023093000",25.715,26.63,25.5,26.595,111183962 -"20021022093000",25.715,25.965,25.515,25.835,87367430 -"20021021093000",25.985,26.495,25.68,26.255,112638800 -"20021018093000",26.3,26.6,25.57,26.575,153310760 -"20021017093000",26.14,26.25,25.025,25.375,183771030 -"20021016093000",25.195,25.63,25.14,25.205,95686356 -"20021015093000",25.6325,26.185,25.325,26.145,133729336 -"20021014093000",24.125,24.665,23.92,24.65,76551010 -"20021011093000",23.68,24.45,23.505,24.435,109088928 -"20021010093000",22,23.31,21.625,23.19,118830614 -"20021009093000",22.1135,22.725,21.905,21.995,123626070 -"20021008093000",22.375,22.99,22.065,22.48,116046636 -"20021007093000",21.905,22.53,21.845,22.06,90274004 -"20021004093000",22.695,22.785,21.845,21.885,107475586 -"20021003093000",22.65,23.297,22.3,22.4,105567092 -"20021002093000",23.05,23.408,22.58,22.805,103758332 -"20021001093000",22.125,23.125,21.595,23.115,110976456 -"20020930093000",22.435,22.52,21.5585,21.845,115849066 -"20020927093000",23.02,23.55,22.595,22.625,81222772 -"20020926093000",23.555,23.75,22.975,23.105,101115546 -"20020925093000",23.2,23.483,22.525,23.255,107405112 -"20020924093000",22.415,23.24,22.315,22.82,103789188 -"20020923093000",23.3,23.355,22.405,22.62,90025730 -"20020920093000",23.855,24,23.65,23.74,130785394 -"20020919093000",23.34,23.91,23.295,23.5865,77905338 -"20020918093000",23.36,24.12,23.33,23.875,84261030 -"20020917093000",24.335,24.4535,23.605,23.645,73707242 -"20020916093000",23.8,24.065,23.525,23.89,50320084 -"20020913093000",23.45,24.13,23.425,23.955,59695926 -"20020912093000",24.075,24.15,23.51,23.595,63976426 -"20020911110000",25.14,25.55,24.265,24.28,78213394 -"20020910093000",24.27,24.91,24.175,24.895,84133970 -"20020909093000",23.625,24.475,23.315,24.345,81844806 -"20020906093000",23.875,24.1395,23.735,23.91,70303318 -"20020905093000",23.75,23.76,22.94,22.955,90939744 -"20020904093000",23.725,24.3,23.575,24.05,80445182 -"20020903093000",24.26,24.26,23.5,23.51,74629474 -"20020830093000",25.07,25.24,24.5,24.56,58547076 -"20020829093000",24.445,25.5,24.26,25.29,94530678 -"20020828093000",25.24,25.33,24.65,24.69,69290570 -"20020827093000",26.17,26.225,25.325,25.42,65639262 -"20020826093000",26.25,26.325,25.59,26.05,55826724 -"20020823093000",26.33,26.425,25.92,26.11,58197160 -"20020822093000",26.43,26.725,26.3,26.615,72736384 -"20020821093000",25.78,26.19,25.575,26.14,81397866 -"20020820093000",25.69,25.85,25.375,25.52,70827940 -"20020819093000",25.02,26.025,24.925,25.995,79959898 -"20020816093000",24.715,25.115,24.46,24.995,69480666 -"20020815093000",24.98,25.37,24.375,24.885,99017036 -"20020814093000",23.625,24.95,23.605,24.855,97624276 -"20020813093000",23.995,24.85,23.46,23.525,100507942 -"20020812093000",23.805,24.375,23.8,24.235,57071304 -"20020809093000",24.075,24.575,23.83,24.06,69319848 -"20020808093000",23.555,24.5025,23.205,24.455,89001030 -"20020807093000",23.5,23.65,22.58,23.545,86685090 -"20020806093000",22.45,23.625,22.375,22.83,88996052 -"20020805093000",22.145,22.585,21.905,21.995,79442490 -"20020802093000",22.755,22.925,21.9,22.205,86261194 -"20020801093000",23.79,24.045,22.75,22.875,92222218 -"20020731093000",23.805,24,23.18,23.975,94116780 -"20020730093000",23.775,24.415,23.665,24.05,122988458 -"20020729093000",23.425,24.15,23.275,24.125,112379358 -"20020726093000",21.87,22.705,21.84,22.675,124122814 -"20020725093000",22.725,22.8575,21.22,21.41,163940526 -"20020724093000",20.875,23.18,20.705,23.115,203412788 -"20020723093000",23.155,23.4025,21.48495,21.50495,168061600 -"20020722093000",24.475,24.995,22.95,23.145,180678824 -"20020719093000",24.935,25.445,24.406,24.78,112572000 -"20020718093000",26.03,26.37,25.33,25.555,91493800 -"20020717093000",26.26,26.65,25.585,26,98062200 -"20020716093000",25.655,26.4,25.32,25.625,97267000 -"20020715093000",25.695,25.93,24,25.89,136966600 -"20020712093000",26.685,26.865,25.74,25.93,95786200 -"20020711093000",26.02,26.5375,25.625,26.45,129628600 -"20020710093000",26.845,27.1,26.065,26.12,90686600 -"20020709093000",26.655,27.365,26.485,26.605,85286800 -"20020708093000",27.205,27.465,26.2945,26.46,63216000 -"20020705093000",26.545,27.45,26.525,27.45,35673600 -"20020703093000",25.62,26.26,25.225,26.225,80959600 -"20020702093000",26.19,26.46,25.665,25.72,82822800 -"20020701093000",27.06,27.195,26.29,26.34,66654000 -"20020628093000",27.275,27.895,27,27.06,90210000 -"20020627093000",27.3015,27.47,26.43,27.46,95816400 -"20020626093000",25.52995,27.195,25.525,27.065,112187000 -"20020625093000",27.35,27.5,26.4,26.475,84059000 -"20020624093000",26.045,27.32,25.925,27.08,104562000 -"20020621093000",26.7,27.275,26.14,26.14,116844800 -"20020620093000",27.185,27.55,26.95,27.05,86432600 -"20020619093000",27.735,27.971,27.16,27.18,81679000 -"20020618093000",27.765,28.145,27.675,27.995,77931800 -"20020617093000",27.83,28.22,27.685,27.84,94580400 -"20020614093000",26.575,27.775,26.5,27.625,109433600 -"20020613093000",27.42,27.74,27.1,27.11,79931000 -"20020612093000",26.29,27.89,26.25,27.77,136476800 -"20020611093000",26.62,27.09,26.21,26.285,74375000 -"20020610093000",25.825,26.65,25.73,26.41,71838800 -"20020607093000",24.945,26.3,24.93,25.99,97839800 -"20020606093000",25.75,26.07,25,25.925,78987400 -"20020605093000",25.215,25.875,25.165,25.83,66978600 -"20020604093000",24.75,25.615,24.62,24.99,88057200 -"20020603093000",25.495,25.82,24.585,24.685,88448600 -"20020531093000",26.45,26.71,25.44,25.505,66475000 -"20020530093000",25.82,26.68,25.715,26.32,63522600 -"20020529093000",25.825,26.36,25.775,26.025,45399800 -"20020528093000",26.795,26.845,25.875,26.16,49602400 -"20020524093000",27.07,27.26,26.52,26.63,36015600 -"20020523093000",26.85,27.42,26.505,27.41,51433800 -"20020522093000",25.935,26.86,25.925,26.835,54170800 -"20020521093000",26.975,27.3,26.065,26.095,63128200 -"20020520093000",27.75,27.775,26.75,27.005,52121800 -"20020517093000",28.105,28.2,27.635,28.015,54647000 -"20020516093000",27.355,28.02,27.325,27.87,53417600 -"20020515093000",27.245,28.22,26.93,27.375,70460400 -"20020514093000",27.2,27.55,26.9935,27.495,64877000 -"20020513093000",25.225,26.455,24.875,26.345,64821800 -"20020510093000",26.265,26.338,24.998,25.025,64522400 -"20020509093000",27.2,27.5,25.95,26.06,83300000 -"20020508093000",25.635,27.485,25.61,27.485,101262000 -"20020507093000",24.59,25.145,24.1765,24.735,88535000 -"20020506093000",24.72,25.27,24.185,24.31,66315400 -"20020503093000",25.63,25.84,24.755,24.78,71649600 -"20020502093000",26.32,27.035,25.575,25.605,79011600 -"20020501093000",26.08,26.595,25.33,26.375,76423200 -"20020430093000",26.05,26.65,25.96,26.13,77394000 -"20020429093000",25.735,26.455,25.72,26.12,70330400 -"20020426093000",27.035,27.225,25.73,25.75,62785400 -"20020425093000",26.45,27.225,26.4445,26.865,57293200 -"20020424093000",26.925,27.215,26.5,26.51,61235200 -"20020423093000",27.85,27.91,26.65,26.995,68472600 -"20020422093000",28.26,28.35,27.5,27.795,51480000 -"20020419093000",28.72,28.99,28.43,28.6,104631800 -"20020418093000",28.395,28.655,27.92,28.185,77057200 -"20020417093000",28.975,29.14,28.21,28.315,55162800 -"20020416093000",28.2,29.05,28.18,28.905,52041000 -"20020415093000",28,28.385,27.7,27.845,47393800 -"20020412093000",27.575,28.13,27.43,27.965,52297600 -"20020411093000",27.945,28.225,27.25,27.395,58171000 -"20020410093000",27.56,28.555,27.53,28.15,75637800 -"20020409093000",28.665,28.7155,27.4,27.435,63424200 -"20020408093000",27.15,28.656,27.13,28.61,73392000 -"20020405093000",28.445,28.65,27.92,27.935,50176200 -"20020404093000",27.99,28.485,27.714,28.225,61769400 -"20020403093000",28.7225,28.805,27.75,28.165,76969000 -"20020402093000",29.45,29.5495,28.555,28.725,77037800 -"20020401093000",29.915,30.2,29.6,30.19,47010200 -"20020328093000",29.975,30.325,29.83,30.155,44393000 -"20020327093000",29.4,29.94,29.295,29.72,47322200 -"20020326093000",29.55,30.46,29.155,29.54,69403400 -"20020325093000",30.24,30.39,29.575,29.615,47942400 -"20020322093000",30.525,30.57,30.11,30.215,41341400 -"20020321093000",30.105,30.7995,29.915,30.68,46169600 -"20020320093000",30.7,31.01,30.05,30.05,55508600 -"20020319093000",31.09,31.5,30.75,31.115,36376400 -"20020318093000",31.37,31.495,30.6,31.07,44854600 -"20020315093000",30.5,31.255,30.485,31.245,69094000 -"20020314093000",31.07,31.12,30.525,30.61,51828400 -"20020313093000",31.04,31.51,30.975,31.05,44388000 -"20020312093000",31.26,31.4,30.835,31.27,66417800 -"20020311093000",31.755,32.5,31.5,32.17,43718200 -"20020308093000",31.815,32.35,31.585,31.975,57703800 -"20020307093000",31.835,31.9445,30.93,31.36,58081000 -"20020306093000",31.455,31.85,31.095,31.815,50160800 -"20020305093000",31.5,31.94,31.17,31.54,55926800 -"20020304093000",30.62,31.75,30.4395,31.595,74464400 -"20020301093000",29.525,30.71,29.425,30.685,62457600 -"20020228093000",29.39,29.85,29.07,29.17,68067000 -"20020227093000",29.5375,30.075,28.9995,29.195,65755400 -"20020226093000",29.551,30,28.95,29.275,63279000 -"20020225093000",28.97,29.945,28.945,29.54,51832400 -"20020222093000",29.025,29.3755,28.575,28.995,71348200 -"20020221093000",29.86,30.135,29.005,29.025,59449400 -"20020220093000",29.7,30.18,29.4,29.95,50498200 -"20020219093000",29.955,30.07,29.3045,29.415,52265200 -"20020215093000",30.85,31.03,30.1,30.115,50184400 -"20020214093000",31,31.495,30.66,30.8,57267600 -"20020213093000",30.13,30.94,29.975,30.875,54175200 -"20020212093000",30.245,30.425,30.01,30.07,44975200 -"20020211093000",30.005,30.62,29.795,30.565,50900400 -"20020208093000",30.06,30.33,29.415,30.325,61285200 -"20020207093000",30.15,30.805,29.875,29.9,63327800 -"20020206093000",30.805,30.945,30.125,30.225,66126200 -"20020205093000",30.4,31.115,30.25,30.575,66772800 -"20020204093000",31.2,31.345,30.375,30.56,70310400 -"20020201093000",32.075,32.2505,31.235,31.33,63462800 -"20020131093000",31.53,31.905,31.06,31.855,69572800 -"20020130093000",31.225,31.45,30.665,31.425,66104200 -"20020129093000",31.95,32.25,30.995,31.16,58669400 -"20020128093000",32.115,32.2,31.455,31.91,41623400 -"20020125093000",32.095,32.425,31.755,31.9,48981600 -"20020124093000",32.05,32.59,31.9,32.33,83959400 -"20020123093000",32.025,32.355,31.62,31.87,80408600 -"20020122093000",33.305,33.315,32.125,32.275,76840800 -"20020118093000",33.55,33.925,32.71,33.05,107271600 -"20020117093000",34.265,35.0005,34.2,34.93,80371200 -"20020116093000",34.425,34.92,33.925,33.935,61959000 -"20020115093000",34.33,34.81,34.25,34.775,60720200 -"20020114093000",34.15,34.52,33.87,34.235,50999800 -"20020111093000",34.76,35.16,34.05,34.305,72994600 -"20020110093000",34.24,34.9,34.065,34.64,50329000 -"20020109093000",34.86,35.31,34.235,34.345,76309000 -"20020108093000",34.345,34.93,34,34.685,47736600 -"20020107093000",34.875,35.01,34.175,34.28,58508800 -"20020104093000",34.625,34.955,34.335,34.45,52733600 -"20020103093000",33.555,34.625,33.545,34.615,67692400 -"20020102093000",33.325,33.555,32.755,33.52,48124800 -"20011231093000",33.92,34.24,33.125,33.135,43058200 -"20011228093000",34.115,34.425,33.85,33.925,28789000 -"20011227093000",33.99,34.355,33.63,33.925,32429000 -"20011226093000",33.71,34.535,33.695,33.84,29331800 -"20011224093000",33.86,34.015,33.6,33.625,11701600 -"20011221093000",34.005,34.365,33.5,33.77,84324600 -"20011220093000",34.575,34.7,33.313,33.38,78593000 -"20011219093000",34.31,34.9455,34.225,34.745,56996200 -"20011218093000",34.46,34.7,34.3045,34.635,47261200 -"20011217093000",33.585,34.555,33.58,34.49,57080600 -"20011214093000",33.01,33.975,32.965,33.72,43003800 -"20011213093000",33.565,34.19,33.0395,33.135,53234000 -"20011212093000",33.58,33.99,33.125,33.975,47884200 -"20011211093000",33.83,34.0695,33.535,33.66,54334000 -"20011210093000",33.76,34.225,33.43,33.53,38367400 -"20011207093000",34.1,34.42,33.275,33.915,42332400 -"20011206093000",33.99,34.5,33.775,34.27,56033600 -"20011205093000",33.245,34.085,33.19,34.05,74251200 -"20011204093000",32.5,33.04,32.05,33,51012600 -"20011203093000",31.915,32.615,31.9,32.385,47213600 -"20011130093000",32.33,32.54,31.965,32.105,48238400 -"20011129093000",31.56,32.45,31.4795,32.42,54042600 -"20011128093000",31.585,32.06,31.365,31.4,54593600 -"20011127093000",32.395,32.5385,31.375,31.87,90811200 -"20011126093000",32.495,32.855,32.2,32.57,41992400 -"20011123093000",32.19,32.405,31.81,32.355,15767200 -"20011121093000",32.18,32.3,31.7445,32.015,50788200 -"20011120093000",33.225,33.9,32.515,32.7,65934800 -"20011119093000",33.125,33.485,32.8525,33.27,56007600 -"20011116093000",33.15,33.3095,32.475,32.875,59262600 -"20011115093000",33.05,33.525,32.725,33.06,77944400 -"20011114093000",34.115,34.17,32.895,32.975,88634600 -"20011113093000",33.4,33.975,33.3,33.91,60175400 -"20011112093000",32.35,33.22,31.825,32.895,57754800 -"20011109093000",32.17,32.825,31.955,32.605,48017200 -"20011108093000",32.23,33.03,31.83,32.21,74239800 -"20011107093000",32.11,32.525,32.015,32.125,58910200 -"20011106093000",31.35,32.47,31.08,32.39,68621000 -"20011105093000",30.93,32.015,30.875,31.635,66367400 -"20011102093000",30.965,31.5105,30.255,30.7,83368800 -"20011101093000",30.04,31.1295,29.8,30.92,109690400 -"20011031093000",29.65,30.365,29.05,29.075,64736400 -"20011030093000",29.46,29.7745,29.095,29.44,57395600 -"20011029093000",31.05,31.1,29.77,29.82,55139000 -"20011026093000",31.16,31.815,31.04,31.1,64514200 -"20011025093000",30.305,31.3,29.785,31.28,75324600 -"20011024093000",30.25,30.81,29.81,30.66,79166800 -"20011023093000",30.235,30.72,29.7,30.215,80328000 -"20011022093000",28.95,30.09,28.735,30.08,72327400 -"20011019093000",28.7,29.005,27.815,28.95,91231800 -"20011018093000",28.17,28.79,27.75,28.4,78524600 -"20011017093000",29.56,29.65,27.99,28.015,73730400 -"20011016093000",28.935,29.455,28.605,29.225,66221800 -"20011015093000",27.95,29.25,27.75,29.03,68458400 -"20011012093000",27.85,28.32,27.275,28.19,63370000 -"20011011093000",27.8835,28.42,27.2995,28.16,83783600 -"20011010093000",26.8,27.875,26.5,27.755,86370000 -"20011009093000",28.75,28.7855,27.095,27.28,99485000 -"20011008093000",28.4,29.325,28.37,29.025,60611600 -"20011005093000",28.08,29,27.47,28.87,80875200 -"20011004093000",28.46,29.2005,28.105,28.22,101782400 -"20011003093000",26.24,28.465,26.2,28.125,97478200 -"20011002093000",25.8195,26.775,25.78,26.5,80863200 -"20011001093000",25.47,26.25,25.205,25.875,70035800 -"20010928093000",24.81,25.795,24.49,25.585,116647800 -"20010927093000",25.05,25.34,24,24.97,81194200 -"20010926093000",25.755,25.9,24.775,25.135,58531200 -"20010925093000",26.135,26.5,25.08,25.65,84952800 -"20010924093000",25.325,26.225,24.935,26.005,85568800 -"20010921093000",23.96,25.3,23.75,24.855,184985200 -"20010920093000",26.175,26.305,25.335,25.38,118076400 -"20010919093000",27.23,27.56,25.3,26.935,126951600 -"20010918093000",26.705,27.5,26.585,27.16,83249800 -"20010917093000",27.01,27.55,26.4,26.455,128096200 -"20010910093000",27.46,28.975,27.35,28.79,84474800 -"20010907093000",28.055,28.68,27.6595,27.7,89888400 -"20010906093000",28.28,29.195,27.95,28.01,112447000 -"20010905093000",28.09,29.195,27.645,28.87,89476800 -"20010904093000",28.595,29.54,28.035,28.05,67189600 -"20010831093000",28.425,29.03,28.15,28.525,57977200 -"20010830093000",29.52,29.83,28.26,28.47,97685600 -"20010829093000",30.525,30.65,29.77,30.125,48173600 -"20010828093000",31.17,31.475,30.29,30.37,47425000 -"20010827093000",30.95,31.68,30.785,31.155,44563000 -"20010824093000",29.8,31.14,29.615,31.025,63407000 -"20010823093000",30.335,30.765,29.5,29.5,52023400 -"20010822093000",30.565,30.575,29.54,30.33,78144800 -"20010821093000",31.35,31.6,30.356,30.39,47120600 -"20010820093000",30.83,31.375,30.55,31.35,48372200 -"20010817093000",31.89,32.065,30.75,30.94,52236600 -"20010816093000",31.42,32.355,31.35,32.31,43917600 -"20010815093000",32.355,32.525,31.6,31.6,39505200 -"20010814093000",32.875,33.045,32.225,32.345,36481600 -"20010813093000",32.62,32.995,32.375,32.855,32675600 -"20010810093000",32.385,32.93,31.45,32.76,51757000 -"20010809093000",32.49,32.775,32.15,32.505,45537800 -"20010808093000",33.255,33.62,32.245,32.415,55004000 -"20010807093000",33.02,33.525,32.995,33.175,31349800 -"20010806093000",33.265,33.56,32.84,33.065,27833400 -"20010803093000",33.65,33.68,33,33.445,43260600 -"20010802093000",33.605,33.77,33.13,33.725,54199600 -"20010801093000",33.4,33.405,32.88,33.235,55679400 -"20010731093000",33.005,33.695,32.925,33.095,59033200 -"20010730093000",32.825,33.44,32.77,32.9,42196800 -"20010727093000",33.025,33.125,32.525,32.735,65405200 -"20010726093000",33.56,33.66,32.75,33.305,78047200 -"20010725093000",33.13,33.76,32.68,33.67,74105000 -"20010724093000",33.5,33.995,32.85,33.16,67543600 -"20010723093000",34.62,34.63,33.35,33.545,80002400 -"20010720093000",34.015,34.7,33.9,34.59,124210200 -"20010719093000",35.61,36.5,35.57,36.255,76871800 -"20010718093000",35.3,35.75,34.935,35.285,57598400 -"20010717093000",35.33,36.005,35.07,35.91,63252400 -"20010716093000",35.725,36.08,35.075,35.59,55990800 -"20010713093000",35.7,36,35.47,35.67,58938400 -"20010712093000",35.35,36.025,35.165,35.8,128125800 -"20010711093000",32.105,33.375,32.1,33.25,74713800 -"20010710093000",32.95,33.125,32.175,32.24,66567200 -"20010709093000",33.1,33.455,32.52,32.845,66479600 -"20010706093000",34.15,34.2,32.835,33.03,67565200 -"20010705093000",35.11,35.36,34.22,34.255,49268400 -"20010703093000",35.15,35.4,34.965,35.225,28038000 -"20010702093000",36.025,36.575,35.075,35.3,72820800 -"20010629093000",36.3,36.705,35.68,36.3,94465400 -"20010628093000",35.775,38.075,35.125,36.355,129054000 -"20010627093000",34.93,35.765,34.68,35.58,69205800 -"20010626093000",33.91,35.105,33.85,35.04,63077800 -"20010625093000",34.55,34.905,33.885,34.425,49218800 -"20010622093000",35,35.305,34.29,34.415,51092200 -"20010621093000",34.575,35.275,34.46,34.92,69612200 -"20010620093000",33.57,34.795,33.55,34.705,64111600 -"20010619093000",34.105,34.425,33.425,33.66,63469000 -"20010618093000",33.975,33.98,33.005,33.44,56889600 -"20010615093000",33.755,34.15,33.2,33.995,108492400 -"20010614093000",35.11,35.275,34.2,34.65,72040400 -"20010613093000",36.025,36.15,35.32,35.345,55335600 -"20010612093000",35.51,36.205,35.405,36.035,66716000 -"20010611093000",36.425,36.425,35.755,36.06,47347600 -"20010608093000",36.85,36.875,36.025,36.595,51867400 -"20010607093000",36.06,36.865,36.04,36.825,66981000 -"20010606093000",36.445,36.74,35.775,36.18,80052000 -"20010605093000",35.38,36.54,35.25,36.3,89456200 -"20010604093000",35.275,35.51,34.9,35.4,43758200 -"20010601093000",34.8,35.35,34.35,35.17,57588200 -"20010531093000",34.745,35.19,34.2,34.59,70687800 -"20010530093000",34.78,35.29,34.325,34.595,86463400 -"20010529093000",35.4,35.875,35.025,35.17,71212400 -"20010525093000",35.83,35.95,35.18,35.455,52757200 -"20010524093000",34.97,35.89,34.635,35.86,80789800 -"20010523093000",35.195,35.8,34.75,34.85,93664800 -"20010522093000",34.725,35.175,34.57,35.14,83461000 -"20010521093000",34.025,34.995,33.875,34.395,103508200 -"20010518093000",33.845,34.6,33.625,34.045,90867200 -"20010517093000",34.55,35.07,33.775,34.08,107002000 -"20010516093000",33.85,34.94,33.665,34.58,91899800 -"20010515093000",34.37,34.65,34,34.135,61389600 -"20010514093000",34.565,34.6,34.15,34.36,45010600 -"20010511093000",34.98,35,34.325,34.7,51129800 -"20010510093000",35.565,35.62,34.98,35,64341800 -"20010509093000",35.62,35.65,34.93,35.2,76677000 -"20010508093000",35.875,36.05,35.375,36.03,75086200 -"20010507093000",35.415,36.075,35.35,35.675,109360200 -"20010504093000",34,35.525,33.98,35.375,119556800 -"20010503093000",34.625,35.09,34.07,34.265,66273600 -"20010502093000",35.5,35.575,34.675,34.88,92864400 -"20010501093000",33.83,35.15,33.8,35.09,83723400 -"20010430093000",34.265,34.53,33.84,33.875,74368200 -"20010427093000",34.765,34.84,33.105,33.565,127400000 -"20010426093000",35.035,35.5,34.125,34.565,118741000 -"20010425093000",33.785,34.895,33.625,34.845,76747200 -"20010424093000",34.1,34.965,33.57,33.775,89180600 -"20010423093000",34.055,34.235,33.45,34.125,92172200 -"20010420093000",35.15,35.55,34.25,34.5,192956000 -"20010419093000",32.905,34.5,32.875,34.01,160024000 -"20010418093000",31.695,33.155,31.5,32.715,156746400 -"20010417093000",30.26,31.055,30.02,30.74,85308000 -"20010416093000",30.7,30.79,30.06,30.395,65858000 -"20010412093000",29.78,31.155,29.675,31.09,87523800 -"20010411093000",30.325,30.75,29.85,30.5,109879800 -"20010410093000",28.975,30.045,28.89,29.84,109211000 -"20010409093000",28.285,28.71,27.83,28.575,56295600 -"20010406093000",28.19,28.595,27.53,28.09,92624200 -"20010405093000",26.875,28.6875,26.75,28.375,113459600 -"20010404093000",26.6875,27.5,25.53125,25.96875,104069800 -"20010403093000",27.65625,27.78125,26.375,26.6875,94192800 -"20010402093000",27.40625,28.46875,27.3125,27.90625,75924400 -"20010330093000",27.875,28.09375,26.9375,27.34375,91344200 -"20010329093000",27.6875,28.59375,27.28125,27.6875,86987400 -"20010328093000",28.6875,28.96875,27.6875,27.75,78704200 -"20010327093000",28.03125,29.28125,27.9375,29.125,95144400 -"20010326093000",28.5625,28.75,27.78125,28.03125,63118800 -"20010323093000",27.46875,28.5,27.1875,28.28125,99520200 -"20010322093000",25.28125,27.03125,25.25,27,126372200 -"20010321093000",26.125,26.625,24.875,24.96875,125052600 -"20010320093000",27.28125,28.0625,26.3125,26.34375,91825600 -"20010319093000",27.25,27.75,26.5625,27.15625,61036400 -"20010316093000",26.25,27.5625,26.23435,27.21875,112851600 -"20010315093000",27.65625,28.03125,26.75,26.84375,71638400 -"20010314093000",26.25,27.625,26.09375,27,90686600 -"20010313093000",26.09375,27.375,26,27.09375,91042400 -"20010312093000",27.34375,27.5,25.8125,25.96875,114377400 -"20010309093000",28.96875,29.09375,27.4375,28.34375,103794400 -"20010308093000",30.15625,30.29685,29.21875,29.625,54626000 -"20010307093000",29.9375,30.5625,29.65625,30.34375,59744600 -"20010306093000",29.3125,30,29.1875,29.71875,66781800 -"20010305093000",28.625,29.3125,28.28125,28.71875,49384000 -"20010302093000",28.75,29.0625,28.21875,28.34375,79800800 -"20010301093000",29.28125,29.75,28.125,29.67185,81781600 -"20010228093000",29.78125,30.03125,29.09375,29.5,84608800 -"20010227093000",29.6875,30.59375,29.3281,29.6875,99155400 -"20010226093000",28.8125,29.96875,28.6875,29.75,87936800 -"20010223093000",27.21875,28.75,27.15625,28.375,92620800 -"20010222093000",28.15625,28.40625,26.9375,27.59375,100828400 -"20010221093000",27.625,29.03125,27.59375,28.125,63947200 -"20010220093000",28.6875,29.125,27.6875,27.9375,60731400 -"20010216093000",28.5,29.125,28.0625,28.59375,66958400 -"20010215093000",29.5,30.09375,28.9375,29.40625,65627800 -"20010214093000",28.8125,29.5,28.1875,29.1875,61728400 -"20010213093000",29.8125,30.53125,29.0625,29.09375,73957000 -"20010212093000",29.40625,29.71875,28.59375,29.375,70263600 -"20010209093000",30.65625,30.78125,29.25,29.5625,100579600 -"20010208093000",31.875,32.25,31,31.125,88041200 -"20010207093000",31,32.53125,30.90625,32.34375,126061800 -"20010206093000",31.03125,31.90625,30.84375,31.28125,96442000 -"20010205093000",30.375,31.03125,30.125,30.96875,56092600 -"20010202093000",31.25,31.6875,30.375,30.40625,71117000 -"20010201093000",30.40625,31.3125,30.1875,31.15625,71796800 -"20010131093000",31.5,31.875,30.5,30.53125,81898800 -"20010130093000",32.25,32.375,31.4375,31.6875,57276800 -"20010129093000",31.78125,32.3125,31.5625,32.25,84983800 -"20010126093000",30.5,32.15625,30.46875,32,93080000 -"20010125093000",31.375,32,30.78125,30.90625,85687400 -"20010124093000",30.5,31.71875,30.375,31.46875,110455000 -"20010123093000",29.875,30.46875,29.46875,30.28125,70297000 -"20010122093000",30.375,30.5,29.5,30.0625,76673200 -"20010119093000",30,30.71875,29.4375,30.5,209348800 -"20010118093000",26.84375,28.09375,26.3125,27.8125,109801400 -"20010117093000",26.8125,27.4375,26.28125,26.46875,72850200 -"20010116093000",26.6875,26.75,25.5625,26.28125,68462400 -"20010112093000",27.4375,27.5,26.25,26.75,73712800 -"20010111093000",26.5,27.875,26.15625,27.5,101862200 -"20010110093000",25.5,26.90625,25.375,26.4375,90243400 -"20010109093000",25,26.3125,24.875,25.90625,114965400 -"20010108093000",24.46875,24.875,23.34375,24.46875,79784600 -"20010105093000",24.25,24.9375,23.78125,24.5,93416400 -"20010104093000",23.90625,25.25,23.4375,24.1875,112398400 -"20010103093000",21.59375,24.4375,21.5625,23.96875,135964000 -"20010102093000",22.0625,22.5,21.4375,21.6406,82413600 -"20001229093000",21.96875,22.90625,21.3125,21.6875,100072000 -"20001228093000",22.5625,23.125,21.9375,22.28125,77620600 -"20001227093000",23.0625,23.40625,22.5,23.21875,69003800 -"20001226093000",23.4375,24.28125,22.9375,23.4375,66942200 -"20001222093000",22.375,23.5625,22.375,23.21875,110185800 -"20001221093000",20.375,22.5625,20.125,21.71875,163177600 -"20001220093000",21.40625,22,20.6875,20.75,149037600 -"20001219093000",23.71875,24,22.25,22.375,120377000 -"20001218093000",24.5,25,23.5,23.90625,107187400 -"20001215093000",25.5156,26,23.875,24.59375,326615000 -"20001214093000",28.96875,29.35935,27.6875,27.75,71202800 -"20001213093000",30.25,30.25,28.40625,28.625,98360400 -"20001212093000",28.90625,30,28.375,29.1875,63106000 -"20001211093000",27.75,29.375,27.5,29.03125,95576200 -"20001208093000",27.3125,27.9375,26.71875,27.21875,120939800 -"20001207093000",26.71875,27,26.125,26.5625,145308200 -"20001206093000",30,30.03125,28.03125,28.34375,90560800 -"20001205093000",29.59375,30.25,29.125,29.9375,101734400 -"20001204093000",28.625,29.5,27.59375,28.1875,80407200 -"20001201093000",29.03125,30.3125,28.03125,28.3125,109810200 -"20001130093000",31,31.03125,28.5,28.6875,197206400 -"20001129093000",33.40625,33.5625,31.625,32.53125,98283400 -"20001128093000",34.6875,34.875,33.40625,33.5,127446200 -"20001127093000",35.71875,36.125,35.3125,35.34375,85307600 -"20001124093000",34.5,35.21875,34.25,34.96875,34439200 -"20001122093000",33.03125,34.75,33,34.125,76344200 -"20001121093000",33.6875,34.625,33.6875,33.875,59487600 -"20001120093000",34.0625,34.25,32.78125,33.59375,80157200 -"20001117093000",34.71875,35,33.8906,34.53125,106525600 -"20001116093000",34.71875,35.75,34.46875,34.46875,92128600 -"20001115093000",34.53125,35.4375,34.34375,35.03125,60422200 -"20001114093000",34,34.90625,33.65625,34.40625,84218600 -"20001113093000",33.34375,34.0625,32.2031,33.21875,83370400 -"20001110093000",34.96875,35.15625,33.40625,33.6875,93744400 -"20001109093000",34.25,35.65625,34.21875,35.4375,91058600 -"20001108093000",35.5625,36.1875,34,34.71875,206149400 -"20001107093000",34.875,35.9375,34.75,35.25,104345400 -"20001106093000",34.34375,35.0625,34.125,34.75,74851400 -"20001103093000",34.625,34.8125,34.03125,34.125,68711000 -"20001102093000",35.1875,35.42185,34.8125,35.15625,77985200 -"20001101093000",34.25,35.03125,34.21875,34.8125,81313400 -"20001031093000",34.5,34.75,34,34.4375,104474000 -"20001030093000",33.75,35.0625,33.6875,34.53125,110057600 -"20001027093000",32.34375,34.59375,32.3125,33.84375,124292600 -"20001026093000",30.5,32.53125,30.40625,32.21875,114832400 -"20001025093000",30.96875,31.71875,30.21875,30.625,167603800 -"20001024093000",31.3125,31.46875,30.09375,30.75,94427400 -"20001023093000",32.3125,33.125,30.34375,31.0625,185170400 -"20001020093000",30.65625,33.0625,30.5625,32.59375,160378600 -"20001019093000",29.21875,31.09375,29,30.9375,257015200 -"20001018093000",24.8125,26.625,24.21875,25.875,110537400 -"20001017093000",25.9375,26.21875,25.125,25.21875,81276600 -"20001016093000",26.75,26.90625,24.78125,25.1875,119759000 -"20001013093000",26.9375,27.4375,26.0625,26.84375,104522400 -"20001012093000",28.15625,28.4375,26.90625,27.21875,90224600 -"20001011093000",27,28.46875,27,27.875,101208400 -"20001010093000",26.96875,27.78125,26.90625,27.28125,62066200 -"20001009093000",27.8125,27.875,26.5,27.09375,58323600 -"20001006093000",27.90625,28.375,27.375,27.78125,61795200 -"20001005093000",27.75,28.625,27.625,27.625,81099400 -"20001004093000",28.1875,28.28125,27.25,27.71875,136540000 -"20001003093000",29.78125,29.90625,28.25,28.28125,85374000 -"20001002093000",30.25,30.40625,29.125,29.5625,58562400 -"20000929093000",30.5,30.65625,29.3125,30.125,74053600 -"20000928093000",30.40625,30.9375,30.3125,30.65625,52360400 -"20000927093000",31.71875,31.78125,29.90625,30.3125,106155600 -"20000926093000",30.46875,32.9375,30.21875,31.34375,155704800 -"20000925093000",31.625,31.75,30.21875,30.625,53479200 -"20000922093000",30.5625,31.75,30.46875,31.625,84476600 -"20000921093000",32,32.5625,31.78125,32.09375,48877200 -"20000920093000",32.4375,32.5,31.59375,32.125,67791400 -"20000919093000",31.8125,32.875,31.6875,32.5,79311400 -"20000918093000",32.125,32.3125,31.09375,31.5,69037800 -"20000915093000",32.71875,32.8125,31.65625,32.09375,99915200 -"20000914093000",34.34375,34.375,32.84375,32.9375,78503000 -"20000913093000",33.75,34.375,33.59375,34.15625,40744800 -"20000912093000",34.375,34.65625,33.8125,34.0625,46781200 -"20000911093000",34.5625,34.84375,34.03125,34.40625,48495200 -"20000908093000",35.1875,35.4375,34.59375,34.65625,56709600 -"20000907093000",35,36.03125,34.71875,34.96875,111720000 -"20000906093000",35.03125,35.34375,34.65625,34.71875,62960800 -"20000905093000",35,35.34375,34.90625,35.09375,50755200 -"20000901093000",35,35.3125,34.84375,35.09375,37629800 -"20000831093000",35.4375,35.65625,34.84375,34.90625,72575400 -"20000830093000",35.34375,35.46875,34.84375,35,53498800 -"20000829093000",35.59375,36.375,35.4375,35.46875,59400200 -"20000828093000",35.09375,36.0625,35.0625,35.65625,56421600 -"20000825093000",35.34375,35.84375,35.28125,35.3125,52729400 -"20000824093000",35.3125,35.59375,34.96875,35.5625,42405400 -"20000823093000",35.40625,35.5625,35.1875,35.375,36726800 -"20000822093000",35.40625,36.21875,35.3125,35.625,54428200 -"20000821093000",35.34375,35.40625,35,35.3125,34119800 -"20000818093000",35.5625,35.71875,35.1875,35.5,54438800 -"20000817093000",35.5625,36,35.28125,35.78125,36112800 -"20000816093000",35.9375,36.125,35.28125,35.5,44976200 -"20000815093000",36,36.5,35.75,35.8125,40714200 -"20000814093000",36.15625,36.6875,35.6875,36.125,53427000 -"20000811093000",36.21875,36.34375,35.8125,36.21875,35629600 -"20000810093000",36.90625,37.03125,35.875,36.3125,48986000 -"20000809093000",36.875,37.4375,36.5625,37.15625,63945600 -"20000808093000",35.03125,37.34375,35,37.0625,138038800 -"20000807093000",35.09375,35.5625,34.875,35,52741800 -"20000804093000",34.71875,34.9375,34.09375,34.5625,38107400 -"20000803093000",34.09375,35.1875,34.0625,35.125,54543400 -"20000802093000",34.28125,35.21875,34.25,34.6875,48269200 -"20000801093000",34.96875,35.03125,34.09375,34.375,47163600 -"20000731093000",35.09375,35.5625,34.625,34.90625,70283800 -"20000728093000",35.46875,35.90625,34.8125,34.84375,75650000 -"20000727093000",33.9375,35.0625,33.75,34.78125,74337600 -"20000726093000",34.53125,34.75,33.625,33.90625,85404600 -"20000725093000",35.40625,35.5,34.1875,34.5,64188600 -"20000724093000",36.03125,36.0625,35,35.25,56165600 -"20000721093000",37.375,37.5,35.9375,36.15625,56100600 -"20000720093000",36.71875,37.625,36.5625,37.40625,54690600 -"20000719093000",38.03125,38.75,36.40625,36.5625,139924600 -"20000718093000",38.8125,39.75,38.71875,39.21875,70617200 -"20000717093000",39.125,39.78125,38.75,39.09375,53992800 -"20000714093000",39.75,39.875,39.21875,39.46875,51180600 -"20000713093000",39.40625,40,38.6875,39.96875,80843200 -"20000712093000",39.125,40.5,38.59375,40.15625,58370200 -"20000711093000",39.40625,40.25,39.25,39.5625,37164800 -"20000710093000",40.34375,40.65625,39.6875,39.75,52689800 -"20000707093000",40.625,41.4375,40.28125,41,54153200 -"20000706093000",39.4375,40.84375,39.25,40.46875,47873200 -"20000705093000",39.9375,39.9375,39.125,39.25,34824400 -"20000703093000",39.84375,40.03125,39.6875,39.96875,15734800 -"20000630093000",38.53125,40,38.34375,40,52356400 -"20000629093000",39.125,39.46875,38.53125,38.59375,38449000 -"20000628093000",39.5,40.03125,39.3125,39.46875,37459200 -"20000627093000",39.625,40.0625,39.1875,39.40625,31071200 -"20000626093000",38.75,40.0625,38.75,39.75,48287000 -"20000623093000",39.96875,40.03125,38.5,38.875,49811600 -"20000622093000",40.6875,41,39.65625,39.9375,87315200 -"20000621093000",38.5,41.09375,38.46875,40.34375,160399600 -"20000620093000",36.9375,37.625,36.875,37.46875,62275000 -"20000619093000",36.28125,36.90625,36,36.84375,46604800 -"20000616093000",36.3125,36.5625,35.75,36.28125,68710600 -"20000615093000",35.40625,36.34375,35.3125,36.1875,65592600 -"20000614093000",34.90625,35.5,34.75,35.25,79992400 -"20000613093000",33.375,34,33.0625,33.9375,44289200 -"20000612093000",34.5,34.5,33.1875,33.46875,49260600 -"20000609093000",34.8125,34.84375,34.15625,34.40625,35560200 -"20000608093000",35.78125,36.0625,34.125,34.40625,94765600 -"20000607093000",34.625,35.375,33.5625,35.25,76311600 -"20000606093000",34.09375,34.9375,33.90625,34.8125,99019000 -"20000605093000",33.0156,34.1875,33,33.4375,64400000 -"20000602093000",33,33.375,32.5,33.15625,80463200 -"20000601093000",32.1875,33,31.90625,32.28125,94507200 -"20000531093000",31.8125,31.84375,31.03125,31.28125,54968200 -"20000530093000",31.21875,32.0625,31,31.6875,68536400 -"20000526093000",31.03125,31.46875,30.1875,30.71875,55822000 -"20000525093000",32.28125,32.375,30.5625,30.75,94348800 -"20000524093000",31.5625,33.28125,31.5,32.78125,85482400 -"20000523093000",31.9375,32.78125,31.53125,31.625,57962600 -"20000522093000",32.5625,32.625,31.21875,32.09375,69962800 -"20000519093000",32.6875,32.96875,32.25,32.53125,66578000 -"20000518093000",34.03125,34.03125,32.9375,33.09375,53640400 -"20000517093000",34.4375,34.5625,33.625,33.84375,53242000 -"20000516093000",34.78125,35.3125,34.53125,34.75,48410600 -"20000515093000",34.5,34.71875,34,34.6875,33899600 -"20000512093000",34.21875,34.875,34.125,34.40625,37886000 -"20000511093000",33.3125,34.0625,32.875,33.9375,58390800 -"20000510093000",33.875,33.9375,32.875,33.09375,67740000 -"20000509093000",35.09375,35.21875,33.75,33.90625,60778400 -"20000508093000",35.46875,35.6875,34.84375,34.90625,36187600 -"20000505093000",35.125,35.90625,34.9375,35.5625,36402200 -"20000504093000",35.15625,35.625,34.65625,35.28125,43317200 -"20000503093000",35.1875,35.40625,34.40625,35.28125,55354800 -"20000502093000",36.40625,36.75,34.75,34.9375,97716200 -"20000501093000",36.4375,37,35.84375,36.71875,107811000 -"20000428093000",35.375,35.5,34.125,34.875,78082600 -"20000427093000",33.71875,34.96875,33.6875,34.90625,77669800 -"20000426093000",35,35.5625,33.6875,34,107091400 -"20000425093000",34.375,34.75,33.8125,34.6875,159517400 -"20000424093000",33.625,34,32.5,33.3125,313681800 -"20000420093000",39.3125,39.9375,38.75,39.46875,52261800 -"20000419093000",40.71875,40.75,39.0625,39.34375,53715400 -"20000418093000",38.25,40.96875,37.9375,40.28125,91802000 -"20000417093000",37.125,38,36.5,37.8125,119773000 -"20000414093000",39.5625,39.75,36.625,37.0625,151221400 -"20000413093000",40.4375,41.125,39.5,39.625,94316200 -"20000412093000",41.0625,41.125,39.375,39.6875,153017800 -"20000411093000",42.5625,43.03125,41.75,41.9375,71961800 -"20000410093000",44.3125,44.3125,43,43.03125,60685400 -"20000407093000",43.5,44.6875,42.5,44.5625,82628200 -"20000406093000",43.9375,44,42.625,43,66421400 -"20000405093000",44.125,44.25,42.9375,43.1875,82888200 -"20000404093000",45.78125,46,42.46875,44.28125,181246600 -"20000403093000",47.21875,48.34375,45,45.4375,232158600 -"20000331093000",53,54.125,52.0625,53.125,64281400 -"20000330093000",53.09375,54.3125,51.25,51.71875,64178400 -"20000329093000",52.59375,54.46875,52.5625,53.59375,64365200 -"20000328093000",51.8125,53.71875,51.1875,52.15625,81114400 -"20000327093000",53.875,54.125,51.96875,52.03125,111434000 -"20000324093000",56.3125,57.5,54.78125,55.84375,112196800 -"20000323093000",53.40625,56.4375,53.3125,55.9375,148223800 -"20000322093000",51.40625,52.8125,50.5625,51.625,93976000 -"20000321093000",48.375,51.5625,48.25,51.375,81648800 -"20000320093000",49.375,49.875,48.25,48.6875,47773000 -"20000317093000",47.625,49.75,47.25,49.6875,81161600 -"20000316093000",47.96875,48.34375,46.625,47.6875,77300800 -"20000315093000",47.28125,48.3125,46.84375,47.6875,53208000 -"20000314093000",49.3125,49.625,47.5625,47.5625,73489200 -"20000313093000",48.8125,50.125,48.75,49,61831800 -"20000310093000",49.78125,51.25,49.75,50.5,85589000 -"20000309093000",47.65625,50,47.5,50,88198800 -"20000308093000",46.90625,48.09375,45.5,47.78125,94290000 -"20000307093000",48.0625,48.75,45.96875,46.4375,135061000 -"20000306093000",48,48.6875,45.04685,45.5,93609600 -"20000303093000",47.375,49.4375,46.9375,48.0625,101437400 -"20000302093000",45.90625,47.6875,45.5625,46.6875,106932600 -"20000301093000",44.8125,47.1875,44.46875,45.21875,106889800 -"20000229093000",45.875,45.875,44.4375,44.6875,58438200 -"20000228093000",45.125,46.0625,44.0625,45.78125,76131800 -"20000225093000",47.34375,47.34375,45.25,45.65625,65301400 -"20000224093000",47.125,47.9375,46,47.34375,69734000 -"20000223093000",46.75,47.875,46.03125,47.125,75847200 -"20000222093000",47.5625,48.5625,46.40625,46.90625,66296200 -"20000218093000",50,50.03125,47.4375,47.6875,79063000 -"20000217093000",49.25,49.84375,48.5625,49.8125,80344200 -"20000216093000",49.625,50.09375,48.5625,48.8125,65202600 -"20000215093000",49.875,50,48.1875,49.28125,71027600 -"20000214093000",50.60935,50.875,49.53125,49.8125,81028600 -"20000211093000",52.4375,52.4375,49.5625,49.96875,115559000 -"20000210093000",51.9375,53.28125,51.25,53,54528600 -"20000209093000",54.71875,54.71875,51.9375,52,55092800 -"20000208093000",53.21875,55,53.21875,54.96875,56231600 -"20000207093000",53.40625,53.4375,52.125,53.3125,40007800 -"20000204093000",52.1875,54,52.0625,53.28125,55365400 -"20000203093000",51.03125,52.09375,50.0625,51.8125,49186000 -"20000202093000",51.21875,51.96875,50.25,50.40625,49915600 -"20000201093000",49.25,51.625,48.84375,51.46875,70196600 -"20000131093000",48.8125,49.09375,47.4375,48.9375,73194200 -"20000128093000",49.0625,50.125,48.625,49.125,58227600 -"20000127093000",49.9375,50.59375,48.625,49.375,63654800 -"20000126093000",51.21875,51.75,49.5625,49.6875,49365000 -"20000125093000",50.5,51.9375,49.78125,51.40625,59827800 -"20000124093000",51.8906,52.84375,50.40625,50.625,63601400 -"20000121093000",53.5,53.625,51.625,51.875,68416200 -"20000120093000",53.53125,54.84375,52.9375,53,56349800 -"20000119093000",55.25,55.75,53,53.5,97566200 -"20000118093000",55.90625,58.25,55.875,57.65625,81484400 -"20000114093000",53.59375,56.96875,52.875,56.125,73417400 -"20000113093000",52.1875,54.3125,50.75,53.8125,83144000 -"20000112093000",54.25,54.4375,52.21875,52.90625,66538200 -"20000111093000",55.75,57.125,54.34375,54.6875,46747800 -"20000110093000",56.71875,56.84375,55.6875,56.125,44963600 -"20000107093000",54.3125,56.125,53.65625,55.71875,62013600 -"20000106093000",56.09375,56.9375,54.1875,55,54976600 -"20000105093000",55.5625,58.1875,54.6875,56.90625,64059600 -"20000104093000",56.78125,58.5625,56.125,56.3125,54094400 -"20000103093000",58.6875,59.3125,56,58.28125,53236000 -"19991231093000",58.75,58.875,58.125,58.375,12517600 -"19991230093000",58.9375,59.96875,58.5625,58.8125,22360000 -"19991229093000",58.46875,59.1875,58.40625,58.84375,17449000 -"19991228093000",59.375,59.40625,58.53125,58.75,24591000 -"19991227093000",59.21875,59.625,58.0625,59.54685,32202200 -"19991223093000",58.625,59.625,58.375,58.71875,31028400 -"19991222093000",58.1406,59,57.5625,58.78125,38565200 -"19991221093000",56.1875,58.3125,55.3125,57.9375,57446000 -"19991220093000",57.40625,57.5,55.59375,56.375,39433800 -"19991217093000",58.3125,58.5625,56.8125,57.625,105898800 -"19991216093000",54.625,57.5,54.46875,56.8125,128659600 -"19991215093000",49.28125,54.375,49.25,54.125,155571600 -"19991214093000",48.09375,50.5625,47.65625,49.34375,144121200 -"19991213093000",46.79685,48.46875,46.375,48.3125,52691600 -"19991210093000",46.6875,47.0625,46.125,46.9375,36836000 -"19991209093000",46,46.65625,45.71875,46.375,46258200 -"19991208093000",46.5625,47.15625,45.84375,45.875,40955800 -"19991207093000",47.375,47.4375,46.4375,46.5,56859200 -"19991206093000",47.625,48.59375,47.375,47.71875,49098200 -"19991203093000",47.90625,48.5625,47.85935,48.0625,64100600 -"19991202093000",46.53125,47.625,46.4375,47.34375,55473800 -"19991201093000",45.53125,46.96875,45.4375,46.59375,48864200 -"19991130093000",44.875,46.4375,44.78125,45.5156,64145600 -"19991129093000",45.0625,46.03125,44.75,45.09375,51512200 -"19991126093000",45.8125,46.6875,45.5,45.5625,28514200 -"19991124093000",44.78125,46.125,44.75,45.84375,53771000 -"19991123093000",44.625,45.6875,44.1875,44.84375,70787400 -"19991122093000",44.8125,45.1875,44.21875,44.90625,91029400 -"19991119093000",42.21875,43.28125,42.1875,43,58231200 -"19991118093000",42.46875,42.90625,42.25,42.40625,64493200 -"19991117093000",43.21875,43.53125,42.5,42.5,66819000 -"19991116093000",43.46875,43.875,42.9375,43.65625,59165400 -"19991115093000",44.125,44.25,43.46875,43.5,47073400 -"19991112093000",44.875,45,43.53125,44.59375,49414200 -"19991111093000",44.125,45.21875,44.125,44.8125,69269400 -"19991110093000",44.0625,44.5625,43.21875,43.5625,69385400 -"19991109093000",44.875,44.9375,43.21875,44.4375,109769800 -"19991108093000",42.40625,45.375,42.1875,44.96875,243832200 -"19991105093000",45.90625,46.4375,45.25,45.78125,70165400 -"19991104093000",46.15625,46.375,45.15625,45.78125,54239400 -"19991103093000",46.46875,46.75,45.75,46,44517000 -"19991102093000",46.375,47.25,45.96875,46.28125,46349000 -"19991101093000",46.625,47.09375,46.0625,46.1875,53261200 -"19991029093000",45.71875,47,45.625,46.28125,79452600 -"19991028093000",45,45.4375,44.65625,44.96875,70568400 -"19991027093000",45.75,45.8125,44.84375,45.4375,54416600 -"19991026093000",47.1875,47.625,46.125,46.1875,52467600 -"19991025093000",46,46.78125,45.5625,46.21875,30492200 -"19991022093000",46.78125,46.9375,45.875,46.34375,43650600 -"19991021093000",45.28125,46.5625,45.25,46.53125,60801200 -"19991020093000",45.78125,46.1875,45.125,46.125,88090600 -"19991019093000",44.125,44.625,42.625,43.15625,69945600 -"19991018093000",43.59375,44,42.53125,43.8906,75312800 -"19991015093000",44.75,44.90625,43.65625,44.03125,73788000 -"19991014093000",45.4375,46.10935,44.84375,45.34375,42737800 -"19991013093000",46,46.5625,45.15625,45.53125,38088400 -"19991012093000",47,47.0625,46.1875,46.28125,27663400 -"19991011093000",47.3125,47.5,47.0625,47.15625,19943800 -"19991008093000",46.75,47.59375,46.0625,47.46875,35697000 -"19991007093000",46.84375,47.53125,46.34375,46.875,46036400 -"19991006093000",46.15625,47,46.03125,46.84375,35501200 -"19991005093000",46.375,46.9375,44.75,45.96875,43397000 -"19991004093000",45.25,46.3125,45.125,46.28125,29998000 -"19991001093000",45.09375,45.3125,44.15625,44.98435,44239000 -"19990930093000",45,45.84375,44.40625,45.28125,47455400 -"19990929093000",45.78125,46.0625,44.5625,44.75,37484400 -"19990928093000",45.625,46.34375,44.53125,46.0625,46000600 -"19990927093000",46,46.46875,45.4375,45.71875,34132200 -"19990924093000",45.09375,45.6875,44.4375,45.46875,70277000 -"19990923093000",48.4375,48.4375,45.0156,45.59375,71073600 -"19990922093000",47.375,48.3125,46.84375,48.03125,48531600 -"19990921093000",48.28125,48.28125,47.0625,47.3125,47082800 -"19990920093000",48,48.9375,47.5,48.78125,48601800 -"19990917093000",47.1875,48.25,46.90625,48.21875,79773400 -"19990916093000",46.4375,47.03125,45.3125,46.875,45796000 -"19990915093000",47.75,47.875,46.1875,46.3125,48413800 -"19990914093000",46.84375,47.78125,46.8125,47.5,40207800 -"19990913093000",47.25,47.40625,46.6875,46.9375,27870800 -"19990910093000",47.53125,47.65625,47,47.5,34455000 -"19990909093000",46.21875,47.0625,45.8906,47.03125,38475200 -"19990908093000",46.84375,47.34375,46.03125,46.125,42568200 -"19990907093000",47.4375,48.34375,46.875,47.125,47028000 -"19990903093000",46.875,48.21875,46.75,47.875,52098000 -"19990902093000",45.75,46.28125,45.34375,45.90625,33340800 -"19990901093000",46.15625,46.71875,45.8125,46.1875,36607200 -"19990831093000",45.90625,46.5625,45.0625,46.28125,46882800 -"19990830093000",46.4375,46.71875,45.78125,46.125,33300800 -"19990827093000",47.53125,47.5625,46.1875,46.625,41948400 -"19990826093000",47.6875,48.1875,46.84375,47.3125,61246000 -"19990825093000",46.8125,48,46.59375,47.65625,81877600 -"19990824093000",43.53125,46.75,43.53125,46.09375,120450000 -"19990823093000",42.15625,43.3125,41.9375,43.21875,60447000 -"19990820093000",42,42.3906,41.53125,41.6875,46072800 -"19990819093000",42.28125,42.5625,41.5625,41.90625,71478200 -"19990818093000",42.21875,43.09375,42.03125,42.5,58361200 -"19990817093000",42.71875,42.75,41.46875,42.28125,51749000 -"19990816093000",42.53125,42.9375,41.15625,42.15625,57321800 -"19990813093000",41.46875,42.8125,41.375,42.34375,65099800 -"19990812093000",41.96875,42.09375,40.8125,40.875,61062000 -"19990811093000",42,42.34375,41.15625,42.09375,66105200 -"19990810093000",41.78125,42.03125,40.8125,41.46875,62743000 -"19990809093000",42.8125,42.90625,41.84375,41.90625,39333600 -"19990806093000",43.03125,43.21875,42.46875,42.5625,67205800 -"19990805093000",42.6875,43.1875,42.375,42.875,76634000 -"19990804093000",42.5625,43.59375,42.375,42.46875,75573400 -"19990803093000",42.9375,43.03125,42.1875,42.375,55051200 -"19990802093000",42.84375,43.46875,42.1875,42.40625,48050600 -"19990730093000",44.34375,44.3125,42.75,42.90625,51127400 -"19990729093000",44.34375,44.40625,43.15625,43.46875,57968200 -"19990728093000",44.59375,45.25,44.1875,45,62215200 -"19990727093000",44.40625,44.875,44,44.40625,65513000 -"19990726093000",44.4375,44.90625,43.8125,43.875,51107800 -"19990723093000",45.78125,45.875,44.84375,45.125,68810000 -"19990722093000",47.1875,47.25,45,45.53125,60892400 -"19990721093000",46.8125,47.65625,46.5,47.34375,54045600 -"19990720093000",48.21875,48.375,46.15625,46.65625,92269200 -"19990719093000",50,50.375,48.90625,49.1875,81169200 -"19990716093000",47.75,49.9375,47.5,49.71875,115419800 -"19990715093000",47.5,47.625,46.875,47.1875,40915000 -"19990714093000",46.875,47.5,46.25,47.46875,37985200 -"19990713093000",46.5625,47.03125,46.40625,46.8125,30844400 -"19990712093000",46.60935,47.375,46.1875,47.09375,43847800 -"19990709093000",46.1875,46.65625,46.125,46.625,33884200 -"19990708093000",46.1406,46.5,45.34375,46.28125,37790400 -"19990707093000",44.79685,46.15625,44.9375,46.15625,33834600 -"19990706093000",46.125,46.46875,44.625,44.78125,45413000 -"19990702093000",45.4375,46.0625,45.15625,46,32088400 -"19990701093000",44.9375,45.75,44.1875,45.59375,47752400 -"19990630093000",43.875,45.125,43.375,45.09375,57543400 -"19990629093000",43.34375,44.03125,43,44,38972400 -"19990628093000",42.75,43.40625,42.46875,43.375,31700800 -"19990625093000",42.6875,43.21875,42.1875,42.46875,24938200 -"19990624093000",42.875,43.125,42,42.3125,33557800 -"19990623093000",42.96875,43.6875,42.53125,43,33941200 -"19990622093000",44.21875,44.21875,43.125,43.25,38746200 -"19990621093000",42.4375,44.5,42.4375,44.46875,56083200 -"19990618093000",41.15625,42.5,41.0625,42.5,69341000 -"19990617093000",40.34375,41.5,40.25,41.4375,44460800 -"19990616093000",39.53125,40.8125,39.46875,40.5,48317800 -"19990615093000",39.03125,39.4375,38.34375,38.84375,36976400 -"19990614093000",39.375,39.84375,38.71875,38.78125,28364400 -"19990611093000",40,40.25,38.78125,39.0625,34543000 -"19990610093000",40.9375,41.15625,39.53125,39.9375,35269400 -"19990609093000",40.0625,41.3125,40,41.15625,53308800 -"19990608093000",39.9375,41.0625,39.5,39.6875,41502800 -"19990607093000",39.96875,40.53125,39.59375,40.125,32389800 -"19990604093000",38.46875,39.84375,38.375,39.78125,35666200 -"19990603093000",39.1875,39.46875,38.0625,38.21875,32940400 -"19990602093000",39.03125,39.3125,38.125,39.21875,42812600 -"19990601093000",40.3125,40.375,39.21875,39.25,36045800 -"19990528093000",39.375,40.4375,39.0625,40.34375,41548200 -"19990527093000",39.125,39.71875,38.75,39.1875,56700000 -"19990526093000",38.59375,39.25,37.75,39.25,52022800 -"19990525093000",38.375,39.625,38.0625,38.10935,50779200 -"19990524093000",38.9375,38.9375,38.03125,38.625,38987200 -"19990521093000",39.25,39.5,38.5,38.78125,56569800 -"19990520093000",39.78125,40,39.1875,39.21875,42371000 -"19990519093000",39.9375,39.9375,38.625,39.65625,46516000 -"19990518093000",39.90625,40.125,38.96875,39.34375,63857400 -"19990517093000",38.6875,39.78125,38.5,39.5625,66850000 -"19990514093000",39.4375,39.96875,38.3125,38.4375,84401200 -"19990513093000",40.5625,40.875,39.5625,39.5625,51735200 -"19990512093000",40.375,40.5,39.625,40.1875,60133400 -"19990511093000",40.375,40.5156,39.53125,39.9375,42784400 -"19990510093000",39.9375,40.25,39.125,39.84375,46218000 -"19990507093000",39.8125,40.1875,39,39.53125,48010200 -"19990506093000",40.34375,40.5625,38.75,39.0625,74011800 -"19990505093000",39.5625,39.9375,38.21875,39.5,67026400 -"19990504093000",40.25,40.90625,38.875,39.03125,66500200 -"19990503093000",40.71875,40.75,39.28125,39.875,67183000 -"19990430093000",41.375,41.875,39.9375,40.65625,58555200 -"19990429093000",41.1875,41.84375,40.2031,41.03125,60878600 -"19990428093000",42.65625,43.25,40.85935,41.0625,55961400 -"19990427093000",44.375,44.375,41.96875,42,58664400 -"19990426093000",43.59375,44.46875,43.375,44,48347400 -"19990423093000",42.5,43.5,41.5,43,56597800 -"19990422093000",42.5,42.625,41.6875,42.40625,55095200 -"19990421093000",41.0625,41.25,40,41,92759800 -"19990420093000",41.125,42,40,41.5625,108460000 -"19990419093000",43.4375,44.0625,40.1875,40.5,75380400 -"19990416093000",44.3125,44.5625,42.9375,43.3125,44772200 -"19990415093000",43.65625,44.9375,41.9375,44.4375,72594600 -"19990414093000",45.40625,45.5625,42.9375,42.9375,52944000 -"19990413093000",46.5625,46.5625,44.59375,45.0625,46744400 -"19990412093000",45.78125,46.8125,45.6875,46.5,37855200 -"19990409093000",47.125,47.5,46.5,47.125,31816400 -"19990408093000",46.625,47.3125,45.5,47.28125,38629600 -"19990407093000",47.4375,47.5,45.625,46.65625,46909600 -"19990406093000",47.59375,47.8125,46.625,47.03125,39673800 -"19990405093000",47.15625,47.5156,46.75,47.46875,39848600 -"19990401093000",45.625,46.4375,45.125,46.34375,41106000 -"19990331093000",47.25,47.3125,44.5625,44.8125,58764600 -"19990330093000",46.6875,46.75,46.125,46.5,67502200 -"19990329093000",45.0625,46.3125,43.9375,46.09375,79816800 -"19990326093000",44.734375,45.09375,43.9375,44.53125,94687600 -"19990325093000",43.265625,45.015625,43.125,44.953125,109448400 -"19990324093000",41.75,42.953125,40.78125,42.8125,82637600 -"19990323093000",43.171875,43.53125,41.5625,41.640625,69579600 -"19990322093000",43.234375,43.734375,43,43.203125,55748800 -"19990319093000",43.46875,43.53125,42.46875,42.796875,92175200 -"19990318093000",41.609375,43.140625,41.546875,43.109375,56231600 -"19990317093000",42.265625,42.359375,41.6875,41.78125,44919600 -"19990316093000",41.375,42.5,41.0625,42.265625,68555200 -"19990315093000",40.140625,41.5,39.46875,41.46875,60609600 -"19990312093000",40.65625,40.6875,39.203125,40.046875,73396800 -"19990311093000",40.25,41.140625,39.828125,40.359375,62948400 -"19990310093000",40.578125,40.625,39.796875,40.34375,53112800 -"19990309093000",39.96875,41.1875,39.9375,40.453125,90124800 -"19990308093000",38.875,39.804675,38.75,39.75,46754000 -"19990305093000",38.6875,38.84375,38.28125,38.734375,47296800 -"19990304093000",37.78125,38.375,37.03125,38.0625,61696400 -"19990303093000",37.25,37.671875,36.765625,37.40625,76798400 -"19990302093000",37.96875,38.53125,36.90625,37.140625,58587600 -"19990301093000",37.390625,38.140625,37.375,37.9375,58332000 -"19990226093000",38.09375,38.125,37.375,37.53125,59281200 -"19990225093000",38.09375,38.4375,37.40625,38.375,70276800 -"19990224093000",39.109375,39.84375,38.1875,38.21875,67695600 -"19990223093000",38.234375,38.90625,37.625,38.859375,95098800 -"19990222093000",37.0625,37.25,36.1875,37.25,92514800 -"19990219093000",36.859375,37.3125,36.4375,36.9375,73120000 -"19990218093000",37.734375,37.84375,35.992175,36.4375,117035200 -"19990217093000",38.234375,38.53125,37.125,37.5,101442800 -"19990216093000",39.9375,39.96875,38.640625,39.0625,73667600 -"19990212093000",40.421875,40.921875,39.28125,39.4375,62930400 -"19990211093000",40.6875,40.96875,40.09375,40.6875,60366000 -"19990210093000",39.96875,41.09375,39.65625,40.15625,73701600 -"19990209093000",41.234375,41.6875,39.9375,40.015625,77293600 -"19990208093000",40.640625,41.390625,40.40625,41.3125,109866800 -"19990205093000",40.0625,40.40625,38.71875,40,127945200 -"19990204093000",42.03125,42.09375,39.71875,39.765625,89151600 -"19990203093000",41.59375,42.46875,41.5,41.703125,73749600 -"19990202093000",43.125,43.140625,41.5625,41.90625,91965600 -"19990201093000",43.859375,43.984375,42.703125,43.234375,81727200 -"19990129093000",43.6875,43.78125,42.71875,43.75,79571600 -"19990128093000",42.9375,43.515625,42.453125,43.5,78838400 -"19990127093000",43.125,43.609375,42.125,42.1875,98048400 -"19990126093000",41.375,42.9375,41.125,42.890625,120203200 -"19990125093000",40.46875,40.828125,39.78125,40.46875,103076400 -"19990122093000",38.90625,40.054675,38.8125,39.0625,82160000 -"19990121093000",40.4375,40.828125,39.4375,39.578125,80077200 -"19990120093000",41.78125,41.9375,40.617175,40.625,125526800 -"19990119093000",37.84375,39.59375,37.71875,38.90625,102773600 -"19990115093000",35.734375,37.5,35.34375,37.4375,59344000 -"19990114093000",36.3125,36.390625,35.375,35.4375,59214000 -"19990113093000",34,36.9375,34,35.953125,75346000 -"19990112093000",37.03125,37.03125,35.25,35.546875,57907200 -"19990111093000",37.71875,37.734375,36.0625,36.875,46460000 -"19990108093000",38.046875,38.125,36.75,37.46875,50236000 -"19990107093000",37.4375,37.65625,37.0625,37.625,51150400 -"19990106093000",37.375,37.875,36.6875,37.8125,69077200 -"19990105093000",35.46875,37,35.359375,36.625,64278800 -"19990104093000",34.898425,36.3125,34.84375,35.25,69300400 -"19981231093000",34.796875,35,34.5,34.671875,23834400 -"19981230093000",35.21875,35.835925,34.71875,34.75,34942800 -"19981229093000",35.640625,35.640625,34.90625,35.0625,29652000 -"19981228093000",35.75,35.90625,35.375,35.59375,23636400 -"19981224093000",35.40625,35.5,35.375,35.4375,1250800 -"19981223093000",35.09375,35.953125,34.84375,35.890625,34940000 -"19981222093000",35.125,35.125,34.34375,34.609375,41350000 -"19981221093000",34.65625,35.546875,34.4375,35.109375,48112000 -"19981218093000",33.75,34.5625,33.53125,34.453125,59648000 -"19981217093000",33.546875,33.71875,33.0625,33.59375,46963600 -"19981216093000",33.125,33.78125,32.28125,33.4375,60024000 -"19981215093000",32.328125,33,32.3125,32.96875,51719600 -"19981214093000",33.1875,33.4375,31.921875,31.984375,64076400 -"19981211093000",32.75,33.671875,32.6875,33.5,51760800 -"19981210093000",33.28125,33.65625,32.84375,32.890625,57135600 -"19981209093000",33.03125,33.453125,32.5,33.40625,44781600 -"19981208093000",33.21875,33.5625,32.4375,32.796875,77583600 -"19981207093000",31.921875,33.4375,31.6875,33.390625,89809200 -"19981204093000",31.234375,31.84375,31,31.84375,44352000 -"19981203093000",31.71875,32.234375,30.5,30.53125,51426800 -"19981202093000",32.296875,32.4375,31.375,31.6875,65596000 -"19981201093000",30.0625,32.4375,30.03125,32.390625,86330400 -"19981130093000",32.34375,32.5625,30.484375,30.5,70900000 -"19981127093000",31.28125,32.03125,31.078125,32.015625,26335600 -"19981125093000",30.671875,31.09375,30.1875,31.0625,41356800 -"19981124093000",29.671875,31.265625,29.65625,30.421875,101114800 -"19981123093000",28.125,30.046875,28.125,29.796875,110885200 -"19981120093000",28.1875,28.4375,27.8125,28.40625,48405600 -"19981119093000",27.265625,28.125,27.265625,27.9375,45220800 -"19981118093000",27.390625,27.765625,27.28125,27.4375,41691600 -"19981117093000",27.25,28.09375,27.234375,27.96875,58744000 -"19981116093000",27.828125,27.9375,26.875,27.203125,42620800 -"19981113093000",27.109375,27.625,27.09375,27.5,28368800 -"19981112093000",27.5625,27.78125,27.125,27.1875,38526800 -"19981111093000",28.359375,28.6875,27.71875,27.765625,63899200 -"19981110093000",27.53125,28.359375,27.515625,28.015625,72087600 -"19981109093000",27.296875,27.84375,27.203125,27.671875,68956800 -"19981106093000",26.515625,27.4375,26.484375,27.328125,74461200 -"19981105093000",26.328125,26.90625,26.3125,26.59375,76727200 -"19981104093000",26.453125,26.828125,26.21875,26.375,67459600 -"19981103093000",26.375,26.640625,26.1875,26.296875,36546800 -"19981102093000",26.59375,26.71875,26.25,26.453125,48388400 -"19981030093000",26.8125,27.046875,26.28125,26.46875,59322800 -"19981029093000",26.359375,26.875,26.359375,26.640625,52403200 -"19981028093000",26.21875,26.65625,26.21875,26.421875,56808400 -"19981027093000",26.9375,26.96875,26.25,26.359375,65436800 -"19981026093000",26.703125,27,26.421875,26.765625,59678400 -"19981023093000",27.25,27.5,26.546875,26.59375,59891200 -"19981022093000",26.5,27.53125,26.3125,27.5,81912800 -"19981021093000",26.21875,26.71875,25.765625,26.578125,125381600 -"19981020093000",25.8125,25.84375,24.90625,25.0625,94369200 -"19981019093000",26.03125,26.046875,25.28125,25.734375,60177200 -"19981016093000",26.5,26.625,26,26.265625,68636000 -"19981015093000",25.03125,26.40625,24.90625,26.359375,66253600 -"19981014093000",23.96875,25.34375,23.96875,25.046875,62403200 -"19981013093000",24.875,24.9375,23.9375,24.109375,47987600 -"19981012093000",24.8125,25.25,24.625,24.9375,51502800 -"19981009093000",23.296875,24.25,23.0625,24.21875,72661600 -"19981008093000",22.640625,22.96875,21.9375,22.796875,144657600 -"19981007093000",24.34375,24.9375,23.34375,23.53125,90761600 -"19981006093000",25.625,25.90625,24.34375,24.40625,76550000 -"19981005093000",25.625,25.71875,24.125,25.1875,114938000 -"19981002093000",25.84375,26.296875,25.25,26.03125,65885600 -"19981001093000",27.015625,27.375,26,26.015625,65445200 -"19980930093000",28.078125,28.390625,27.5078,27.515625,38875600 -"19980929093000",27.953125,28.5,27.84375,28.21875,48743200 -"19980928093000",28.25,28.59375,27.4375,27.828125,41406400 -"19980925093000",27.28125,28.28125,27.15625,28.265625,47878400 -"19980924093000",28.28125,28.65625,27.25,27.53125,63521600 -"19980923093000",27.40625,28.46875,27.125,28.40625,65263600 -"19980922093000",27.109375,27.46875,26.6875,27.296875,43082000 -"19980921093000",25.625,27.015625,25.59375,26.96875,45872000 -"19980918093000",26.5625,26.5625,26.078125,26.34375,47361600 -"19980917093000",26.328125,26.625,26.203125,26.234375,45178400 -"19980916093000",26.96875,27.125,26.53125,27.046875,42886800 -"19980915093000",26.46875,27.109375,26.28125,27.078125,49413600 -"19980914093000",26.234375,26.765625,26.21875,26.5,45086800 -"19980911093000",25.28125,26.15625,25.03125,26.0625,58989200 -"19980910093000",25,25.28125,24.671875,25.1875,60758000 -"19980909093000",25.5625,26.109375,25.40625,25.5625,65494400 -"19980908093000",24.734375,25.515625,24.765625,25.492175,60625600 -"19980904093000",24.921875,25.0625,24.03125,24.15625,50890400 -"19980903093000",24.6875,25.1875,24.5625,24.8125,67468000 -"19980902093000",25.453125,26.0625,25.0625,25.140625,63438400 -"19980901093000",23.8125,25.4375,23.625,25.3125,140112400 -"19980831093000",26.21875,26.625,23.9375,23.984375,132688400 -"19980828093000",27.0625,27.40625,26.1875,26.3125,72730000 -"19980827093000",27.640625,28.1875,27.125,27.3125,74874000 -"19980826093000",27.8125,28.4375,27.71875,28.140625,44804400 -"19980825093000",27.84375,28.421875,27.78125,28.203125,58027200 -"19980824093000",27.578125,28,27.5,27.59375,26319200 -"19980821093000",27.78125,27.96875,27.1875,27.65625,59523600 -"19980820093000",27.53125,28.1875,27.421875,28.140625,49964000 -"19980819093000",28.0625,28.1875,27.5625,27.640625,55709600 -"19980818093000",26.96875,27.953125,26.84375,27.8125,70591200 -"19980817093000",25.875,26.84375,25.75,26.828125,54073200 -"19980814093000",26.171875,26.265625,25.875,26.0625,29566400 -"19980813093000",26.03125,26.5,25.9375,25.984375,51193200 -"19980812093000",26.078125,26.296875,25.75,26.265625,53760000 -"19980811093000",25.71875,26.09375,25.5,25.859375,60976400 -"19980810093000",26.453125,26.578125,26.109375,26.109375,46763200 -"19980807093000",26.859375,26.875,26.265625,26.46875,54972400 -"19980806093000",25.9375,26.734375,25.90625,26.71875,68308000 -"19980805093000",26.03125,26.5625,25.375,26.078125,120191200 -"19980804093000",27.15625,27.40625,26.046875,26.125,91412000 -"19980803093000",27.28125,27.71875,26.84375,27.109375,73566400 -"19980731093000",28.234375,28.375,27.484375,27.484375,53706000 -"19980730093000",27.984375,28.40625,27.6875,28.359375,72746400 -"19980729093000",28.3125,28.5625,27.515625,27.671875,59904800 -"19980728093000",29,29.21875,28,28.0625,78378800 -"19980727093000",28.28125,29.1875,27.671875,29.1875,58998000 -"19980724093000",28.4375,28.90625,28.109375,28.453125,60366800 -"19980723093000",29.078125,29.375,28.25,28.25,51029600 -"19980722093000",28,29.3125,27.96875,29.1875,71630400 -"19980721093000",29.21875,29.75,28.125,28.203125,74605200 -"19980720093000",29.546875,29.875,29.203125,29.25,45794800 -"19980717093000",29.4375,29.90625,28.984375,29.484375,83137600 -"19980716093000",29.515625,29.71875,29.15625,29.34375,65130800 -"19980715093000",29,29.5,28.90625,29.34375,48690000 -"19980714093000",29.5625,29.6875,28.875,29.125,56972400 -"19980713093000",28.53125,29.5625,28.40625,29.390625,69223200 -"19980710093000",27.78125,28.3125,27.46875,28.296875,45396800 -"19980709093000",27.5,28,27.4375,27.75,43690000 -"19980708093000",27.03125,27.53125,26.6875,27.46875,41553600 -"19980707093000",26.96875,27.140625,26.625,26.984375,32423600 -"19980706093000",26.71875,27.015625,26.34375,26.953125,35260400 -"19980702093000",27.203125,27.28125,26.78125,26.8125,27321200 -"19980701093000",27.28125,27.53125,26.796875,27.34375,53474000 -"19980630093000",26.3125,27.140625,26.15625,27.09375,77010000 -"19980629093000",26.375,26.921875,26.3125,26.859375,65906000 -"19980626093000",25.5625,26.15625,25.5,26.109375,55680400 -"19980625093000",26.46875,26.71875,25.34375,25.390625,88969600 -"19980624093000",25.421875,26.28125,24.984375,26.234375,105728800 -"19980623093000",23.953125,25.21875,23.8125,25.1875,124675200 -"19980622093000",23.6875,23.984375,23.421875,23.953125,48969600 -"19980619093000",23.375,23.6875,23.125,23.671875,91345600 -"19980618093000",22.703125,22.9375,22.59375,22.796875,39228400 -"19980617093000",22.484375,23.09375,22.4375,22.765625,76145200 -"19980616093000",21.578125,22.484375,21.375,22.46875,61138400 -"19980615093000",21.171875,21.828125,21.140625,21.484375,42846000 -"19980612093000",21.21875,21.53125,21,21.4375,41999600 -"19980611093000",21.609375,21.78125,21.28125,21.328125,41511200 -"19980610093000",21.65625,22.09375,21.46875,21.5,33305600 -"19980609093000",21.328125,21.890625,21.3125,21.765625,36171600 -"19980608093000",21.40625,21.578125,21.25,21.421875,18900400 -"19980605093000",21.46875,21.625,21.1875,21.5625,34654000 -"19980604093000",21.171875,21.53125,20.90625,21.515625,33815200 -"19980603093000",21.46875,21.609375,21,21.078125,35992800 -"19980602093000",21.015625,21.484375,20.96875,21.375,39188000 -"19980601093000",20.96875,21.148425,20.78125,20.9375,42441600 -"19980529093000",21.59375,21.625,21.1875,21.203125,34094400 -"19980528093000",21.4375,21.59375,21.265625,21.578125,30868400 -"19980527093000",20.71875,21.53125,20.71875,21.5,58689600 -"19980526093000",21.328125,21.546875,20.875,20.90625,44532000 -"19980522093000",21.65625,21.6875,21.359375,21.390625,32211600 -"19980521093000",21.453125,21.84375,21.375,21.59375,36680400 -"19980520093000",21.53125,21.71875,21.34375,21.4375,35532400 -"19980519093000",21.453125,21.734375,21.390625,21.625,51278800 -"19980518093000",21.125,21.90625,21.125,21.515625,80977600 -"19980515093000",22.53125,22.546875,22.1875,22.359375,48150800 -"19980514093000",21.46875,22.75,21.453125,22.234375,94771200 -"19980513093000",22.1875,22.1875,21.625,21.734375,80681200 -"19980512093000",20.8125,21.4375,20.8125,21.421875,64122400 -"19980511093000",21.53125,21.546875,21.015625,21.046875,51474400 -"19980508093000",20.46875,21.53125,20.46875,21.4375,96249200 -"19980507093000",21.546875,21.5625,20.796875,20.84375,78022800 -"19980506093000",21.875,21.875,21.5,21.59375,48110800 -"19980505093000",21.90625,22.390625,21.75,21.9375,50839600 -"19980504093000",22.296875,22.46875,21.984375,22.015625,37898800 -"19980501093000",22.546875,22.625,22.03125,22.40625,36135200 -"19980430093000",22.875,22.90625,22.421875,22.53125,54481600 -"19980429093000",22.515625,22.875,22.40625,22.625,50171600 -"19980428093000",23.03125,23.0625,22.25,22.46875,56769600 -"19980427093000",22.375,22.6328,22.125,22.578125,58748000 -"19980424093000",23.375,23.6875,22.96875,23,51436000 -"19980423093000",24.3125,24.3125,23.53125,23.625,64215600 -"19980422093000",24,24.78125,23.90625,24.6875,80153600 -"19980421093000",23.671875,23.75,23.28125,23.75,51932400 -"19980420093000",23.09375,23.75,23.046875,23.65625,45534400 -"19980417093000",22.875,23.0625,22.578125,23.046875,37402800 -"19980416093000",22.59375,23.015625,22.5625,22.921875,39695600 -"19980415093000",22.3125,22.84375,22.21875,22.84375,40498400 -"19980414093000",22.171875,22.390625,21.875,22.109375,28476800 -"19980413093000",22.203125,22.25,21.6875,22.15625,33156400 -"19980409093000",21.984375,22.40625,21.898425,22.25,33619200 -"19980408093000",21.6875,22.265625,21.65625,22.234375,36798800 -"19980407093000",22.328125,22.65625,21.6875,21.8125,63295200 -"19980406093000",23.15625,23.15625,22.265625,22.484375,74242800 -"19980403093000",23,23.265625,22.875,23.25,40987600 -"19980402093000",22.671875,22.984375,22.46875,22.828125,41412800 -"19980401093000",22.453125,22.65625,22.125,22.59375,36840000 -"19980331093000",22.15625,22.4375,22.125,22.375,38126400 -"19980330093000",22.015625,22.15625,21.78125,22,27463200 -"19980327093000",22.34375,22.34375,21.890625,21.953125,38940000 -"19980326093000",22.125,22.390625,21.875,22.0625,45442400 -"19980325093000",22.59375,22.734375,21.8125,22.203125,124248000 -"19980324093000",21.046875,21.265625,20.859375,21.234375,32281600 -"19980323093000",20.296875,21.15625,20.265625,20.96875,55090400 -"19980320093000",20.53125,20.75,20.125,20.46875,56310000 -"19980319093000",20.375,20.578125,20.3125,20.5,30297200 -"19980318093000",20.015625,20.453125,19.96875,20.4375,33887600 -"19980317093000",20.421875,20.421875,19.921875,20.09375,53842400 -"19980316093000",20.609375,20.6875,20.34375,20.5,27979600 -"19980313093000",20.609375,20.75,20.390625,20.59375,32542400 -"19980312093000",20.625,20.59375,20.203125,20.46875,47921200 -"19980311093000",20.5,20.5,19.9375,20.171875,39839600 -"19980310093000",20.296875,20.375,19.984375,20.390625,47406400 -"19980309093000",20.625,20.625,19.875,19.898425,52255600 -"19980306093000",20.078125,20.6875,20.0625,20.640625,51405200 -"19980305093000",19.8125,20.359375,19.875,20.015625,92256400 -"19980304093000",20.609375,20.953125,20.390625,20.578125,71513600 -"19980303093000",20.65625,21.140625,20.640625,21.125,50754400 -"19980302093000",21.46875,21.46875,20.765625,20.84375,50094000 -"19980227093000",21.390625,21.5,21.140625,21.1875,47528400 -"19980226093000",21.375,21.421875,21.109375,21.375,61388000 -"19980225093000",20.859375,21.25,20.765625,21.234375,94944800 -"19980224093000",20.84375,21.234375,20.46875,20.53125,118314400 -"19980223093000",20.21875,20.421875,19.84375,20.40625,120803600 -"19980220093000",19.4375,19.46875,19.109375,19.390625,86108000 -"19980219093000",19.4375,19.5078125,19.28125,19.359375,73773600 -"19980218093000",19.328125,19.5,19.21875,19.328125,76608800 -"19980217093000",19.8125,19.8125,19.234375,19.296875,85673600 -"19980213093000",19.828125,19.84375,19.671875,19.6875,42206400 -"19980212093000",19.7578125,19.8671875,19.5078125,19.84375,76698400 -"19980211093000",19.9921875,20.0078125,19.6328125,19.8671875,76460000 -"19980210093000",19.65625,19.9375,19.59375,19.90625,48099200 -"19980209093000",19.84375,19.859375,19.453125,19.6484375,54682400 -"19980206093000",19.421875,19.78125,19.390625,19.765625,50070400 -"19980205093000",19.765625,19.84375,19.34375,19.4296875,67014400 -"19980204093000",19.484375,19.75,19.3828125,19.6015625,61940800 -"19980203093000",19.390625,19.515625,19.2265625,19.484375,61374400 -"19980202093000",18.96875,19.390625,18.8125,19.34375,98392000 -"19980130093000",18.578125,18.75,18.453125,18.6484375,50071200 -"19980129093000",18.6171875,18.765625,18.4375,18.53125,73571200 -"19980128093000",18.28125,18.6875,18.1875,18.625,79388800 -"19980127093000",17.796875,18.234375,17.6953125,18.1484375,97540000 -"19980126093000",17.484375,17.734375,17.3046875,17.71875,74276000 -"19980123093000",17.34375,17.4296875,17.0859375,17.28125,63312000 -"19980122093000",16.9453125,17.484375,16.9140625,17.328125,159360800 -"19980121093000",17.15625,17.3046875,16.953125,17.125,85562400 -"19980120093000",16.765625,17.25,16.75,17.2265625,64956000 -"19980116093000",16.546875,16.921875,16.5390625,16.90625,72943200 -"19980115093000",16.296875,16.625,16.234375,16.5390625,50624000 -"19980114093000",16.515625,16.5625,16.15625,16.390625,54774400 -"19980113093000",16.1875,16.5234375,16.015625,16.515625,66945600 -"19980112093000",16.078125,16.25,15.546875,16.1953125,78400800 -"19980109093000",16.2578125,16.4375,15.734375,15.875,87534400 -"19980108093000",16.078125,16.515625,15.9375,16.3125,77657600 -"19980107093000",16.234375,16.328125,15.9375,16.1953125,61492800 -"19980106093000",16.21875,16.625,16.15625,16.390625,67836800 -"19980105093000",16.40625,16.703125,15.984375,16.296875,80377600 -"19980102093000",16.203125,16.4375,16.1875,16.390625,39748000 -"19971231093000",16.375,16.4375,16.125,16.15625,46146400 -"19971230093000",15.8046875,16.375,15.78125,16.28125,77881600 -"19971229093000",15.296875,15.84375,15.265625,15.7890625,67799200 -"19971226093000",14.859375,15.09375,14.84375,15.09375,32388800 -"19971224093000",15.46875,15.484375,14.75,14.8671875,88411200 -"19971223093000",15.8828125,16.03125,15.375,15.4140625,67195200 -"19971222093000",16.140625,16.25,15.734375,15.8828125,59063200 -"19971219093000",16.09375,16.2734375,15.78125,16.0703125,137783200 -"19971218093000",16.8125,16.84375,16.296875,16.359375,98774400 -"19971217093000",17.484375,17.546875,16.9453125,16.953125,51472000 -"19971216093000",16.984375,17.546875,16.875,17.3828125,65401600 -"19971215093000",17.0546875,17.125,16.515625,17.015625,84314400 -"19971212093000",17.21875,17.3125,17,17.09375,54375200 -"19971211093000",17.546875,17.625,17.359375,17.3828125,70189600 -"19971210093000",17.78125,17.90625,17.625,17.78125,66434400 -"19971209093000",18.125,18.171875,17.9375,18.0390625,51864000 -"19971208093000",17.9375,18.328125,17.890625,18.265625,49952800 -"19971205093000",17.765625,18.09375,17.765625,17.890625,48136000 -"19971204093000",18.09375,18.234375,17.78125,17.8203125,62627200 -"19971203093000",17.7109375,18.1328125,17.625,18.09375,57712000 -"19971202093000",17.9453125,18.109375,17.75,17.78125,50167200 -"19971201093000",17.7421875,18,17.703125,17.9765625,49006400 -"19971128093000",17.65625,17.78125,17.640625,17.6875,17392800 -"19971127093000",-1,-1,-1,-1,-1 -"19971126093000",17.375,17.734375,17.28125,17.6953125,63053600 -"19971125093000",16.984375,17.40625,16.96875,17.375,56464800 -"19971124093000",17.140625,17.265625,16.9375,16.9375,39084000 -"19971121093000",17.2265625,17.25,17.046875,17.234375,68220800 -"19971120093000",16.90625,17.140625,16.859375,17.109375,53680800 -"19971119093000",16.703125,16.890625,16.671875,16.8828125,31720800 -"19971118093000",16.8671875,16.9375,16.71875,16.75,36683200 -"19971117093000",16.8125,16.9765625,16.6796875,16.859375,60094400 -"19971114093000",16.453125,16.734375,16.421875,16.6640625,46663200 -"19971113093000",16.2578125,16.453125,16.1484375,16.4453125,60094400 -"19971112093000",16.265625,16.375,16.125,16.1484375,45784000 -"19971111093000",16.3046875,16.4296875,16.171875,16.328125,37013600 -"19971110093000",16.453125,16.5625,16.21875,16.2734375,36764800 -"19971107093000",16.2578125,16.5,16.234375,16.4453125,63631200 -"19971106093000",16.65625,16.6875,16.46875,16.5078125,40266400 -"19971105093000",16.8125,16.828125,16.5625,16.6953125,42512800 -"19971104093000",16.75,16.8671875,16.6484375,16.78125,49126400 -"19971103093000",16.453125,16.78125,16.4140625,16.765625,67714400 -"19971031093000",16.375,16.4375,16.203125,16.25,46808800 -"19971030093000",16.1875,16.453125,16.0625,16.078125,72097600 -"19971029093000",16.71875,16.8828125,16.265625,16.390625,85533600 -"19971028093000",15.5,16.78125,15.4375,16.671875,159689600 -"19971027093000",16.859375,17.03125,16.078125,16.109375,96792800 -"19971024093000",17.109375,17.15625,16.65625,16.921875,70030400 -"19971023093000",16.5,17.15625,16.5,16.953125,66413600 -"19971022093000",17.296875,17.3125,16.921875,16.9609375,55775200 -"19971021093000",17.015625,17.4023375,16.9140625,17.3125,115682400 -"19971020093000",16.625,16.90625,15.9375,16.5625,154052800 -"19971017093000",16.640625,16.828125,16.296875,16.53125,87720000 -"19971016093000",17.015625,17.078125,16.53125,16.738275,47327200 -"19971015093000",16.96875,17,16.921875,16.96875,44997600 -"19971014093000",17.140625,17.171875,16.921875,17.0859375,33361600 -"19971013093000",17.125,17.234375,17.0703125,17.09375,19051200 -"19971010093000",17.2890625,17.34375,17.03125,17.0625,24893600 -"19971009093000",17.3125,17.453125,17.265625,17.3671875,34482400 -"19971008093000",17.078125,17.3828125,17.03125,17.375,71196800 -"19971007093000",16.875,17.2109375,16.828125,17.0625,54548800 -"19971006093000",16.984375,17.03125,16.78125,16.890625,41776800 -"19971003093000",16.8671875,17.03125,16.671875,16.8671875,60287200 -"19971002093000",16.71875,16.828125,16.59375,16.6484375,28756000 -"19971001093000",16.5625,16.8125,16.421875,16.734375,61466400 -"19970930093000",16.8046875,16.96875,16.53125,16.5390625,43892800 -"19970929093000",16.6875,16.84375,16.609375,16.8125,27505600 -"19970926093000",16.703125,16.71875,16.453125,16.671875,36644000 -"19970925093000",16.609375,16.765625,16.5078125,16.59375,39272000 -"19970924093000",16.953125,17.0078125,16.515625,16.5546875,60043200 -"19970923093000",16.6953125,16.9375,16.640625,16.9375,39946400 -"19970922093000",16.875,16.984375,16.6484375,16.6640625,43251200 -"19970919093000",16.53125,16.90625,16.5,16.8984375,77428800 -"19970918093000",16.78125,16.890625,16.4296875,16.53125,61077600 -"19970917093000",17.078125,17.09375,16.578125,16.6484375,61609600 -"19970916093000",16.46875,17.125,16.375,17.046875,102540800 -"19970915093000",16.953125,17.15625,16.328125,16.3359375,129004000 -"19970912093000",17.109375,17.296875,16.953125,17.2421875,48576000 -"19970911093000",16.875,17.171875,16.609375,17.1015625,61779200 -"19970910093000",17.359375,17.390625,16.8828125,16.890625,53294400 -"19970909093000",17.40625,17.53125,17.296875,17.4375,39465600 -"19970908093000",17.21875,17.4765625,17.21875,17.4140625,42416000 -"19970905093000",17.3828125,17.4609375,17.03125,17.1640625,48398400 -"19970904093000",17,17.3125,17.015625,17.2734375,44481600 -"19970903093000",17.203125,17.359375,17.0234375,17.0703125,42872800 -"19970902093000",16.640625,17.1875,16.625,17.1484375,50106400 -"19970901093000",-1,-1,-1,-1,-1 -"19970829093000",16.5078125,16.734375,16.46875,16.5234375,37857600 -"19970828093000",16.6875,16.71875,16.5,16.5078125,43641600 -"19970827093000",16.90625,16.9140625,16.625,16.8203125,49372000 -"19970826093000",17,17.109375,16.84375,16.875,34124000 -"19970825093000",17.234375,17.375,16.953125,17.0625,38856800 -"19970822093000",16.90625,17.1875,16.765625,17.15625,72029600 -"19970821093000",17.703125,17.796875,17.1875,17.234375,64443200 -"19970820093000",17.375,17.5859375,17.125,17.5703125,50312800 -"19970819093000",16.84375,17.375,16.828125,17.3515625,91013600 -"19970818093000",16.625,16.734375,16.375,16.734375,69921600 -"19970815093000",16.9375,17,16.59375,16.609375,51078400 -"19970814093000",17,17.09375,16.765625,17.03125,45912800 -"19970813093000",17.265625,17.28125,16.84375,17.0078125,66731200 -"19970812093000",17.421875,17.46875,16.9765625,17,60887200 -"19970811093000",17.5,17.53125,17.046875,17.28125,72695200 -"19970808093000",17.8515625,17.890625,17.5,17.5,66811200 -"19970807093000",18.0390625,18.046875,17.75,18.0429625,43964800 -"19970806093000",17.9140625,18.078125,17.78125,17.9296875,43412000 -"19970805093000",17.78125,18.046875,17.75,17.9140625,59336000 -"19970804093000",17.53125,17.75,17.4296875,17.6953125,46312800 -"19970801093000",17.671875,17.7265625,17.3984375,17.578125,58912800 -"19970731093000",17.75,17.765625,17.609375,17.6875,42232800 -"19970730093000",17.59375,17.75,17.453125,17.640625,78323200 -"19970729093000",17.09375,17.5078125,17.015625,17.4921875,78816000 -"19970728093000",17.40625,17.421875,16.96875,17.125,56404000 -"19970725093000",17.3125,17.78125,17.15625,17.3125,90308800 -"19970724093000",17.296875,17.546875,16.953125,17.25,141855200 -"19970723093000",18.15625,18.359375,17.625,17.6796875,95857600 -"19970722093000",17.109375,18.1015625,17.09375,18.03125,101383200 -"19970721093000",17.609375,17.625,16.71875,16.9921875,127221600 -"19970718093000",18.1875,18.421875,17.5,17.5625,158937600 -"19970717093000",18.8125,18.84375,18.3125,18.6796875,131656800 -"19970716093000",17.765625,18.6875,17.5,18.5546875,110971200 -"19970715093000",17.2578125,17.40625,17.078125,17.3085875,75501600 -"19970714093000",16.3515625,17,16.3125,16.9921875,57424000 -"19970711093000",16.28125,16.3828125,16.0546875,16.21875,38096000 -"19970710093000",16.3125,16.40625,16.109375,16.234375,43780800 -"19970709093000",16.5625,16.578125,16.1875,16.34375,48239200 -"19970708093000",16.171875,16.4140625,16.1171875,16.40625,36007200 -"19970707093000",16.328125,16.46875,16.171875,16.1875,39320000 -"19970704093000",-1,-1,-1,-1,-1 -"19970703093000",16.2578125,16.2578125,16.0625,16.1953125,28764000 -"19970702093000",15.703125,16.0625,15.5078125,16.046875,53237600 -"19970701093000",15.8046875,15.859375,15.40625,15.6171875,59377600 -"19970630093000",15.984375,16.09375,15.7734375,15.796875,38286400 -"19970627093000",16.140625,16.25,15.90625,15.9375,38198400 -"19970626093000",16.265625,16.3515625,15.984375,16.03125,37212800 -"19970625093000",16.609375,16.65625,16.15625,16.3046875,49576800 -"19970624093000",16.1875,16.515625,16.046875,16.5078125,39319200 -"19970623093000",16.234375,16.4375,16,16.0078125,35724800 -"19970620093000",16.171875,16.421875,16.0625,16.234375,64236000 -"19970619093000",16.046875,16.34375,16,16.1640625,65515200 -"19970618093000",16.65625,16.6875,16.2578125,16.2734375,55648000 -"19970617093000",16.4375,16.8671875,16.359375,16.7734375,53191200 -"19970616093000",16.203125,16.421875,16.109375,16.421875,40612800 -"19970613093000",15.84375,16.2578125,15.8203125,16.203125,50116000 -"19970612093000",15.84375,16.015625,15.6875,15.84375,44620000 -"19970611093000",15.6015625,15.921875,15.4453125,15.875,49056800 -"19970610093000",15.640625,15.8828125,15.46875,15.6015625,53135200 -"19970609093000",15.609375,15.765625,15.3125,15.65625,48200000 -"19970606093000",15.171875,15.5390625,15.125,15.5,35964000 -"19970605093000",15.03125,15.1875,14.9375,15.046875,35892000 -"19970604093000",15.078125,15.28125,14.78125,14.8984375,54639200 -"19970603093000",15.421875,15.4375,15.078125,15.2578125,41987200 -"19970602093000",15.625,15.6875,15.390625,15.546875,38939200 -"19970530093000",14.6875,15.703125,14.6875,15.5,83340000 -"19970529093000",15.90625,16.1328125,15.625,15.734375,51103200 -"19970528093000",15.90625,15.90625,15.609375,15.734375,52241600 -"19970527093000",15.34375,15.921875,15.296875,15.828125,69036000 -"19970526093000",-1,-1,-1,-1,-1 -"19970523093000",15.171875,15.375,15.109375,15.359375,28904800 -"19970522093000",15.125,15.203125,14.96875,15.078125,33478400 -"19970521093000",15.078125,15.3671875,14.96875,15.046875,76620000 -"19970520093000",14.484375,14.90625,14.40625,14.890625,64876800 -"19970519093000",14.515625,14.640625,14.390625,14.390625,45632000 -"19970516093000",14.546875,14.625,14.359375,14.4296875,59913600 -"19970515093000",14.5,14.734375,14.484375,14.640625,41864800 -"19970514093000",14.796875,14.828125,14.453125,14.484375,60741600 -"19970513093000",14.796875,14.90625,14.609375,14.71875,49813600 -"19970512093000",14.6875,14.8125,14.625,14.765625,42974400 -"19970509093000",14.75,14.8125,14.46875,14.59375,58392000 -"19970508093000",14.40625,14.765625,14.390625,14.5625,53834400 -"19970507093000",14.546875,14.875,14.390625,14.4375,70532800 -"19970506093000",-1,-1,-1,-1,-1 -"19970505093000",14.953125,15.09375,14.4375,15,110850400 -"19970502093000",15.25,15.4375,14.8671875,15.09375,96188800 -"19970501093000",15.25,15.40625,14.90625,15.125,72317600 -"19970430093000",14.828125,15.328125,14.796875,15.1875,90204000 -"19970429093000",14.671875,14.890625,14.5625,14.875,73952000 -"19970428093000",14.21875,14.3828125,13.953125,14.359375,67224000 -"19970425093000",14.1875,14.421875,14.15625,14.203125,58565600 -"19970424093000",14.578125,14.734375,14.09375,14.265625,118175200 -"19970423093000",13.828125,14.46875,13.796875,14.390625,102813600 -"19970422093000",13.453125,13.8515625,13.4375,13.828125,82420800 -"19970421093000",13.375,13.984375,13.265625,13.453125,155708800 -"19970418093000",13,13.453125,12.953125,13.453125,231800800 -"19970417093000",12.3125,12.5,12.1875,12.265625,71829600 -"19970416093000",12.078125,12.3125,12.03125,12.28125,42710400 -"19970415093000",12.234375,12.375,11.984375,12.140625,84438400 -"19970414093000",11.84375,12.171875,11.671875,12.171875,59267200 -"19970411093000",11.9375,12.15625,11.8671875,11.875,60033600 -"19970410093000",12.21875,12.21875,11.9375,12.09375,67913600 -"19970409093000",12.390625,12.40625,12.21875,12.25,73760800 -"19970408093000",12.078125,12.28125,11.9375,12.28125,53331200 -"19970407093000",11.953125,12.203125,11.90625,12,76507200 -"19970404093000",11.71875,12.09375,11.71875,11.7734375,94963200 -"19970403093000",11.375,11.921875,11.328125,11.859375,92252800 -"19970402093000",11.609375,11.703125,11.375,11.5,63330400 -"19970401093000",11.265625,11.71875,11.21875,11.65625,86684000 -"19970331093000",11.640625,11.8125,11.40625,11.4609375,93826400 -"19970328093000",-1,-1,-1,-1,-1 -"19970327093000",11.5625,12.015625,11.5625,11.5625,93927200 -"19970326093000",11.34375,11.828125,11.328125,11.78125,81270400 -"19970325093000",11.328125,11.421875,11.109375,11.2890625,89712800 -"19970324093000",11.640625,11.6875,10.9375,11.296875,186269600 -"19970321093000",12.0625,12.140625,11.609375,11.75,85829600 -"19970320093000",12.078125,12.21875,11.921875,12,81410400 -"19970319093000",12.21875,12.28125,11.8671875,12.09375,111556800 -"19970318093000",12.578125,12.6015625,12.359375,12.453125,59007200 -"19970317093000",12.3125,12.59375,12.25,12.578125,83958400 -"19970314093000",12.46875,12.53125,12.359375,12.375,61327200 -"19970313093000",12.28125,12.515625,12.25,12.4375,45505600 -"19970312093000",12.21875,12.4375,12.21875,12.34375,43234400 -"19970311093000",12.453125,12.5703125,12.296875,12.296875,47577600 -"19970310093000",12.140625,12.515625,11.9921875,12.5,45997600 -"19970307093000",12.296875,12.4375,12.0625,12.09375,46032000 -"19970306093000",12.59375,12.609375,12.2148375,12.21875,57018400 -"19970305093000",12.4375,12.625,12.40625,12.609375,46393600 -"19970304093000",12.40625,12.515625,12.328125,12.390625,63920800 -"19970303093000",12.125,12.515625,12.078125,12.4375,53874400 -"19970228093000",12.015625,12.296875,11.9296875,12.1875,78412000 -"19970227093000",12.53125,12.53125,12,12.015625,56628800 -"19970226093000",12.4375,12.546875,12.296875,12.53125,48939200 -"19970225093000",12.5,12.625,12.359375,12.4375,63941600 -"19970224093000",11.78125,12.53125,11.75,12.515625,68599200 -"19970221093000",11.859375,11.921875,11.75,11.875,61131200 -"19970220093000",12.109375,12.15625,11.890625,11.90625,75395200 -"19970219093000",12.171875,12.265625,12.0625,12.1875,56383200 -"19970218093000",12.203125,12.234375,12.015625,12.171875,52546400 -"19970217093000",-1,-1,-1,-1,-1 -"19970214093000",12.421875,12.5625,12.203125,12.234375,57395200 -"19970213093000",12.5625,12.640625,12.421875,12.5,58277600 -"19970212093000",12.296875,12.5,12.1875,12.484375,72009600 -"19970211093000",12.28125,12.328125,11.890625,12.3125,88841600 -"19970210093000",12.59375,12.6875,12.203125,12.21875,66812800 -"19970207093000",12.296875,12.5625,12.1875,12.546875,62448000 -"19970206093000",12.28125,12.296875,12,12.140625,102122400 -"19970205093000",12.890625,12.9375,12.109375,12.296875,110099200 -"19970204093000",12.796875,12.90625,12.5625,12.890625,56464000 -"19970203093000",12.828125,12.921875,12.640625,12.796875,60804800 -"19970131093000",12.734375,12.90625,12.609375,12.75,86529600 -"19970130093000",12.28125,12.65625,12.25,12.640625,79946400 -"19970129093000",12.09375,12.171875,11.96875,12.15625,48933600 -"19970128093000",12.296875,12.34375,11.84375,11.953125,64657600 -"19970127093000",12.0625,12.171875,11.9375,12.015625,53263200 -"19970124093000",11.890625,12.21875,11.796875,11.9921875,89821600 -"19970123093000",12.265625,12.46875,11.8125,11.84375,105320000 -"19970122093000",11.890625,12.3125,11.828125,12.171875,129260800 -"19970121093000",11.328125,11.8828125,11.203125,11.875,114592000 -"19970120093000",10.875,11.609375,10.828125,11.34375,146220800 -"19970117093000",10.703125,10.96875,10.6875,10.890625,65368800 -"19970116093000",10.625,10.890625,10.625,10.75,58688000 -"19970115093000",10.703125,10.78125,10.546875,10.578125,53058400 -"19970114093000",10.53125,10.828125,10.53125,10.671875,63728000 -"19970113093000",10.640625,10.6875,10.4375,10.46875,50361600 -"19970110093000",10.25,10.546875,10.203125,10.53125,66578400 -"19970109093000",10.46875,10.46875,10.28125,10.296875,47764800 -"19970108093000",10.625,10.6523375,10.390625,10.421875,50593600 -"19970107093000",10.5625,10.640625,10.421875,10.625,36880800 -"19970106093000",10.578125,10.65625,10.390625,10.546875,55948800 -"19970103093000",10.28125,10.59375,10.25,10.578125,44124000 -"19970102093000",10.390625,10.390625,10.09375,10.203125,54419200 -"19970101093000",-1,-1,-1,-1,-1 -"19961231093000",10.5,10.53125,10.3125,10.328125,34367200 -"19961230093000",10.671875,10.703125,10.4375,10.4375,27279200 -"19961227093000",10.6875,10.71875,10.5,10.53125,19079200 -"19961226093000",10.65625,10.765625,10.640625,10.6875,27905600 -"19961225093000",-1,-1,-1,-1,-1 -"19961224093000",10.515625,10.640625,10.390625,10.609375,16246400 -"19961223093000",10.515625,10.59375,10.359375,10.46875,36892800 -"19961220093000",10.6875,10.703125,10.421875,10.453125,90414400 -"19961219093000",10.5,10.640625,10.375,10.609375,94609600 -"19961218093000",10.25,10.34375,10,10.328125,61796800 -"19961217093000",9.578125,10.015625,9.546875,9.984375,68952800 -"19961216093000",10.03125,10.09375,9.5625,9.59375,64883200 -"19961213093000",10.140625,10.25,9.9023375,10,74544000 -"19961212093000",10.625,10.65625,10.125,10.140625,78272800 -"19961211093000",10.125,10.453125,10.015625,10.421875,113576000 -"19961210093000",10.546875,10.5703125,10.21875,10.234375,125725600 -"19961209093000",9.796875,10.234375,9.75,10.21875,94718400 -"19961206093000",9.3125,9.65625,9.265625,9.5546875,110238400 -"19961205093000",9.5859375,9.7109375,9.4921875,9.5625,74950400 -"19961204093000",9.6953125,9.703125,9.5078125,9.578125,102542400 -"19961203093000",9.8984375,9.96875,9.6640625,9.6679625,77563200 -"19961202093000",9.84375,9.859375,9.703125,9.859375,64502400 -"19961129093000",9.71875,9.8203125,9.71875,9.8046875,17152000 -"19961128093000",-1,-1,-1,-1,-1 -"19961127093000",9.6328125,9.734375,9.609375,9.71875,44446400 -"19961126093000",9.625,9.7109375,9.5234375,9.609375,108238400 -"19961125093000",9.4453125,9.6015625,9.40625,9.59375,75131200 -"19961122093000",9.421875,9.53125,9.3359375,9.40625,94424000 -"19961121093000",9.65625,9.6640625,9.375,9.3984375,130718400 -"19961120093000",9.75,9.875,9.578125,9.578125,123857600 -"19961119093000",9.40625,9.7421875,9.390625,9.7421875,104739200 -"19961118093000",9.3359375,9.46875,9.2890625,9.3984375,98585600 -"19961115093000",9.421875,9.4296875,9.2109375,9.3125,104041600 -"19961114093000",9.078125,9.3515625,9.078125,9.3515625,114969600 -"19961113093000",8.9765625,9.109375,8.9453125,9.0625,90409600 -"19961112093000",9,9.1171875,8.84375,8.859375,81156800 -"19961111093000",8.9609375,9.046875,8.9375,8.9765625,38593600 -"19961108093000",8.9609375,8.96875,8.84375,8.96875,67369600 -"19961107093000",9.03125,9.1328125,8.9453125,8.96875,76742400 -"19961106093000",8.828125,9.03125,8.8125,9.03125,71438400 -"19961105093000",8.65625,8.84375,8.644525,8.84375,86417600 -"19961104093000",8.578125,8.6484375,8.546875,8.625,36006400 -"19961101093000",8.578125,8.671875,8.53125,8.5859375,56531200 -"19961031093000",8.5234375,8.5859375,8.5078125,8.578125,37028800 -"19961030093000",8.4609375,8.5625,8.4296875,8.515625,60526400 -"19961029093000",8.5546875,8.5859375,8.4296875,8.4609375,66756800 -"19961028093000",8.5429625,8.6015625,8.515625,8.5390625,51241600 -"19961025093000",8.5390625,8.6171875,8.5078125,8.5273375,53084800 -"19961024093000",8.4296875,8.5859375,8.3671875,8.5390625,81417600 -"19961023093000",8.2890625,8.421875,8.234375,8.40625,67408000 -"19961022093000",8.3203125,8.3359375,8.203125,8.28125,113806400 -"19961021093000",8.421875,8.5,8.34375,8.375,71401600 -"19961018093000",8.375,8.4375,8.34765,8.4375,69646400 -"19961017093000",8.640625,8.6875,8.46875,8.46875,49097600 -"19961016093000",8.671875,8.6835875,8.5625,8.625,36427200 -"19961015093000",8.671875,8.6953125,8.5859375,8.6796875,61206400 -"19961014093000",8.5859375,8.6328125,8.5234375,8.5390625,36091200 -"19961011093000",8.4140625,8.578125,8.390625,8.5703125,36523200 -"19961010093000",8.359375,8.5078125,8.3359375,8.359375,51739200 -"19961009093000",8.5,8.5078125,8.328125,8.40625,64960000 -"19961008093000",8.609375,8.609375,8.4375,8.4609375,48465600 -"19961007093000",8.5234375,8.6328125,8.4921875,8.59375,42432000 -"19961004093000",8.4140625,8.5390625,8.390625,8.5234375,45166400 -"19961003093000",8.421875,8.4453125,8.3515625,8.375,58294400 -"19961002093000",8.3046875,8.484375,8.2734375,8.421875,68760000 -"19961001093000",8.234375,8.3671875,8.1796875,8.2578125,69124800 -"19960930093000",8.34375,8.4296875,8.234375,8.2421875,89574400 -"19960927093000",8.28125,8.453125,8.203125,8.3984375,98372800 -"19960926093000",8.484375,8.5078125,8.234375,8.25,92604800 -"19960925093000",8.59375,8.6171875,8.4609375,8.4765625,44067200 -"19960924093000",8.59375,8.6484375,8.5078125,8.5546875,72520000 -"19960923093000",8.6015625,8.6328125,8.515625,8.609375,46385600 -"19960920093000",8.5625,8.6640625,8.4921875,8.6328125,104849600 -"19960919093000",8.53125,8.640625,8.484375,8.609375,75912000 -"19960918093000",8.375,8.6171875,8.328125,8.53125,86049600 -"19960917093000",8.3046875,8.4140625,8.265625,8.3671875,75624000 -"19960916093000",8.1953125,8.3203125,8.1875,8.21875,62409600 -"19960913093000",8.1015625,8.2109375,8.0546875,8.1875,80136000 -"19960912093000",7.84375,8.09375,7.8242125,8.019525,95944000 -"19960911093000",7.7460875,7.84375,7.7265625,7.8203125,36387200 -"19960910093000",7.796875,7.8203125,7.7265625,7.7734375,38904000 -"19960909093000",7.65625,7.8125,7.640625,7.8046875,41747200 -"19960906093000",7.625,7.671875,7.6015625,7.65625,41921600 -"19960905093000",7.671875,7.6875,7.59375,7.59375,40372800 -"19960904093000",7.7109375,7.7265625,7.6835875,7.7109375,27126400 -"19960903093000",7.625,7.7109375,7.5390625,7.7109375,48524800 -"19960902093000",-1,-1,-1,-1,-1 -"19960830093000",7.765625,7.765625,7.65625,7.65625,28088000 -"19960829093000",7.828125,7.828125,7.7265625,7.7578125,34182400 -"19960828093000",7.8125,7.859375,7.8046875,7.8515625,32070400 -"19960827093000",7.6875,7.796875,7.6875,7.796875,28038400 -"19960826093000",7.6875,7.734375,7.671875,7.6796875,31952000 -"19960823093000",7.8046875,7.8125,7.703125,7.703125,44006400 -"19960822093000",7.7578125,7.8203125,7.71875,7.8125,50236800 -"19960821093000",7.6484375,7.71875,7.609375,7.71875,49345600 -"19960820093000",7.734375,7.7578125,7.703125,7.7109375,25678400 -"19960819093000",7.7421875,7.7578125,7.640625,7.71875,43131200 -"19960816093000",7.8203125,7.828125,7.7265625,7.7265625,47598400 -"19960815093000",7.796875,7.859375,7.7734375,7.8203125,35556800 -"19960814093000",7.7421875,7.8203125,7.734375,7.8046875,52032000 -"19960813093000",7.8125,7.8671875,7.7109375,7.71875,72508800 -"19960812093000",7.765625,7.8828125,7.75,7.828125,66187200 -"19960809093000",7.796875,7.84375,7.7421875,7.78125,44313600 -"19960808093000",7.7578125,7.8671875,7.734375,7.828125,54379200 -"19960807093000",7.7734375,7.8203125,7.6796875,7.796875,76790400 -"19960806093000",7.6015625,7.7578125,7.5546875,7.75,67388800 -"19960805093000",7.71875,7.734375,7.578125,7.609375,55072000 -"19960802093000",7.6328125,7.7421875,7.5390625,7.7109375,109289600 -"19960801093000",7.3671875,7.5546875,7.3359375,7.5390625,96025600 -"19960731093000",7.4375,7.4765625,7.3515625,7.3671875,56320000 -"19960730093000",7.3671875,7.421875,7.2578125,7.4140625,66976000 -"19960729093000",7.453125,7.4921875,7.296875,7.3046875,56748800 -"19960726093000",7.46875,7.46875,7.390625,7.4453125,59304000 -"19960725093000",7.25,7.421875,7.1953125,7.40625,100920000 -"19960724093000",6.84375,7.234375,6.84375,7.171875,192176000 -"19960723093000",7.5,7.5078125,6.890625,7.0078125,257678400 -"19960722093000",7.5625,7.59375,7.3671875,7.484375,144475200 -"19960719093000",7.359375,7.6015625,7.359375,7.5605375,99208000 -"19960718093000",7.328125,7.5,7.2421875,7.4921875,98537600 -"19960717093000",7.359375,7.3828125,7.2265625,7.3203125,126272000 -"19960716093000",6.890625,7.2265625,6.71875,7.2109375,182116800 -"19960715093000",7.0234375,7.109375,6.8671875,6.9140625,111832000 -"19960712093000",7.1992125,7.1992125,6.9042875,7.0234375,139478400 -"19960711093000",7.390625,7.3984375,7.109375,7.15625,140915200 -"19960710093000",7.5,7.5,7.3828125,7.46875,77980800 -"19960709093000",7.5546875,7.5859375,7.5,7.5,32316800 -"19960708093000",7.40625,7.546875,7.3828125,7.519525,64440000 -"19960705093000",7.421875,7.5234375,7.3984375,7.3984375,35331200 -"19960704093000",-1,-1,-1,-1,-1 -"19960703093000",7.6015625,7.6796875,7.5390625,7.5703125,44243200 -"19960702093000",7.6484375,7.6640625,7.578125,7.6015625,38548800 -"19960701093000",7.515625,7.65625,7.5078125,7.644525,47859200 -"19960628093000",7.53125,7.5625,7.4453125,7.5078125,51960000 -"19960627093000",7.53125,7.5625,7.4375,7.4960875,77582400 -"19960626093000",7.6171875,7.625,7.4375,7.53125,71457600 -"19960625093000",7.765625,7.765625,7.5859375,7.625,41145600 -"19960624093000",7.75,7.8203125,7.6875,7.7578125,48102400 -"19960621093000",7.6484375,7.7578125,7.59375,7.7304625,56806400 -"19960620093000",7.625,7.6542875,7.4375,7.609375,102228800 -"19960619093000",7.65625,7.6953125,7.5859375,7.609375,73409600 -"19960618093000",7.78125,7.78125,7.625,7.6484375,74585600 -"19960617093000",7.6953125,7.8125,7.6484375,7.7890625,57499200 -"19960614093000",7.796875,7.8125,7.6796875,7.6875,55944000 -"19960613093000",7.8203125,7.8671875,7.734375,7.7890625,62577600 -"19960612093000",7.6796875,7.8359375,7.671875,7.8125,88844800 -"19960611093000",7.546875,7.703125,7.5390625,7.6328125,65259200 -"19960610093000",7.5625,7.578125,7.4980375,7.5390625,45819200 -"19960607093000",7.3515625,7.578125,7.3515625,7.578125,70198400 -"19960606093000",7.609375,7.6875,7.484375,7.488275,88136000 -"19960605093000",7.375,7.578125,7.3671875,7.5546875,50968000 -"19960604093000",7.4140625,7.4296875,7.265625,7.3671875,65854400 -"19960603093000",7.421875,7.46875,7.3828125,7.3984375,31684800 -"19960531093000",7.41015,7.4609375,7.375,7.421875,40259200 -"19960530093000",7.328125,7.390625,7.2890625,7.3828125,33824000 -"19960529093000",7.3359375,7.390625,7.2890625,7.3203125,33569600 -"19960528093000",7.421875,7.4453125,7.3203125,7.328125,43376000 -"19960527093000",-1,-1,-1,-1,-1 -"19960524093000",7.40625,7.4375,7.390625,7.40625,26443200 -"19960523093000",7.3046875,7.4453125,7.3046875,7.40625,51976000 -"19960522093000",7.1875,7.328125,7.1640625,7.3046875,45646400 -"19960521093000",7.296875,7.3046875,7.1953125,7.1953125,42113600 -"19960520093000",7.3359375,7.3671875,7.2890625,7.296875,38457600 -"19960517093000",7.3671875,7.375,7.2734375,7.3125,35392000 -"19960516093000",7.25,7.3359375,7.2265625,7.3203125,67092800 -"19960515093000",7.4375,7.484375,7.3359375,7.3515625,56323200 -"19960514093000",7.453125,7.5,7.3886625,7.4375,76832000 Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/doc/mpl_examples/data/s1045.ima and /tmp/GJbvHcIw6l/matplotlib-1.0.1/doc/mpl_examples/data/s1045.ima differ diff -Nru matplotlib-0.99.3/doc/mpl_examples/event_handling/close_event.py matplotlib-1.0.1/doc/mpl_examples/event_handling/close_event.py --- matplotlib-0.99.3/doc/mpl_examples/event_handling/close_event.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/event_handling/close_event.py 2010-07-07 01:41:54.000000000 +0000 @@ -0,0 +1,10 @@ +import matplotlib.pyplot as plt + +def handle_close(evt): + print 'Closed Figure!' + +fig = plt.figure() +fig.canvas.mpl_connect('close_event', handle_close) + +plt.text(0.35, 0.5, 'Close Me!', dict(size=30)) +plt.show() diff -Nru matplotlib-0.99.3/doc/mpl_examples/event_handling/legend_picking.py matplotlib-1.0.1/doc/mpl_examples/event_handling/legend_picking.py --- matplotlib-0.99.3/doc/mpl_examples/event_handling/legend_picking.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/event_handling/legend_picking.py 2010-07-07 01:41:54.000000000 +0000 @@ -0,0 +1,46 @@ +""" +Enable picking on the legend to toggle the legended line on and off +""" +import numpy as np +import matplotlib.pyplot as plt + +t = np.arange(0.0, 0.2, 0.1) +y1 = 2*np.sin(2*np.pi*t) +y2 = 4*np.sin(2*np.pi*2*t) + +fig = plt.figure() +ax = fig.add_subplot(111) +ax.set_title('Click on legend line to toggle line on/off') +line1, = ax.plot(t, y1, lw=2, color='red', label='1 HZ') +line2, = ax.plot(t, y2, lw=2, color='blue', label='2 HZ') +leg = ax.legend(loc='upper left', fancybox=True, shadow=True) +leg.get_frame().set_alpha(0.4) + + +# we will set up a dict mapping legend line to orig line, and enable +# picking on the legend line +lines = [line1, line2] +lined = dict() +for legline, origline in zip(leg.get_lines(), lines): + legline.set_picker(5) # 5 pts tolerance + lined[legline] = origline + + +def onpick(event): + # on the pick event, find the orig line corresponding to the + # legend proxy line, and toggle the visibilit + legline = event.artist + origline = lined[legline] + vis = not origline.get_visible() + origline.set_visible(vis) + # Change the alpha on the line in the legend so we can see what lines + # have been toggled + if vis: + legline.set_alpha(1.0) + else: + legline.set_alpha(0.2) + fig.canvas.draw() + +fig.canvas.mpl_connect('pick_event', onpick) + +plt.show() diff -Nru matplotlib-0.99.3/doc/mpl_examples/event_handling/pipong.py matplotlib-1.0.1/doc/mpl_examples/event_handling/pipong.py --- matplotlib-0.99.3/doc/mpl_examples/event_handling/pipong.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/event_handling/pipong.py 2010-07-07 01:41:54.000000000 +0000 @@ -12,17 +12,17 @@ 'e' up 'i' 'd' down 'k' -press 't' -- close these instructions +press 't' -- close these instructions (animation will be much faster) -press 'a' -- add a puck -press 'A' -- remove a puck -press '1' -- slow down all pucks -press '2' -- speed up all pucks -press '3' -- slow down distractors -press '4' -- speed up distractors +press 'a' -- add a puck +press 'A' -- remove a puck +press '1' -- slow down all pucks +press '2' -- speed up all pucks +press '3' -- slow down distractors +press '4' -- speed up distractors press ' ' -- reset the first puck -press 'n' -- toggle distractors on/off -press 'g' -- toggle the game on/off +press 'n' -- toggle distractors on/off +press 'g' -- toggle the game on/off """ @@ -56,7 +56,7 @@ def _reset(self,pad): self.x = pad.x + pad.xoffset if pad.y < 0: - self.y = pad.y + pad.yoffset + self.y = pad.y + pad.yoffset else: self.y = pad.y - pad.yoffset self.vx = pad.x - self.x @@ -84,7 +84,7 @@ self._reset(pads[1]) return True if self.y < -1+fudge or self.y > 1-fudge: - self.vy *= -1.0 + self.vy *= -1.0 # add some randomness, just to make it interesting self.vy -= (randn()/300.0 + 1/300.0) * np.sign(self.vy) self._speedlimit() @@ -106,7 +106,7 @@ if self.vy < -self.vmax: self.vy = -self.vmax -class Game(object): +class Game(object): def __init__(self, ax): # create the initial line @@ -137,7 +137,7 @@ self.pads = [] self.pads.append( Pad(pA,0,padAy)) self.pads.append( Pad(pB,padBx,padBy,'r')) - self.pucks =[] + self.pucks =[] self.i = self.ax.annotate(instructions,(.5,0.5), name='monospace', verticalalignment='center', @@ -180,8 +180,8 @@ for puck in self.pucks: if puck.update(self.pads): # we only get here if someone scored - self.pads[0].disp.set_label(" "+ str(self.pads[0].score)) - self.pads[1].disp.set_label(" "+ str(self.pads[1].score)) + self.pads[0].disp.set_label(" "+ str(self.pads[0].score)) + self.pads[1].disp.set_label(" "+ str(self.pads[1].score)) self.ax.legend(loc='center') self.leg = self.ax.get_legend() #self.leg.draw_frame(False) #don't draw the legend border @@ -189,7 +189,7 @@ plt.setp(self.leg.get_texts(),fontweight='bold',fontsize='xx-large') self.leg.get_frame().set_facecolor('0.2') self.background = None - self.ax.draw() + self.ax.figure.canvas.draw() return True puck.disp.set_offsets([puck.x,puck.y]) self.ax.draw_artist(puck.disp) @@ -229,7 +229,7 @@ self.pads[1].y -= .1 if self.pads[1].y < -1: self.pads[1].y = -1 - + if event.key == 'a': self.pucks.append(Puck(self.puckdisp,self.pads[randint(2)],self.ax.bbox)) if event.key == 'A' and len(self.pucks): @@ -242,7 +242,7 @@ if event.key == '2': for p in self.pucks: p._faster() - + if event.key == 'n': self.distract = not self.distract @@ -254,4 +254,4 @@ self.inst = not self.inst self.i.set_visible(self.i.get_visible()) if event.key == 'q': - plt.close() + plt.close() diff -Nru matplotlib-0.99.3/doc/mpl_examples/event_handling/pong_gtk.py matplotlib-1.0.1/doc/mpl_examples/event_handling/pong_gtk.py --- matplotlib-0.99.3/doc/mpl_examples/event_handling/pong_gtk.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/event_handling/pong_gtk.py 2010-07-07 01:41:54.000000000 +0000 @@ -12,7 +12,7 @@ import numpy as np import matplotlib.pyplot as plt -import pipong +import pipong from numpy.random import randn, randint @@ -22,7 +22,8 @@ def start_anim(event): - gobject.idle_add(animation.draw,animation) +# gobject.idle_add(animation.draw,animation) + gobject.timeout_add(10,animation.draw,animation) canvas.mpl_disconnect(start_anim.cid) animation = pipong.Game(ax) diff -Nru matplotlib-0.99.3/doc/mpl_examples/event_handling/pong_qt.py matplotlib-1.0.1/doc/mpl_examples/event_handling/pong_qt.py --- matplotlib-0.99.3/doc/mpl_examples/event_handling/pong_qt.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/event_handling/pong_qt.py 2010-07-07 01:41:54.000000000 +0000 @@ -18,7 +18,7 @@ import matplotlib.pyplot as plt import numpy as np import time -import pipong +import pipong from numpy.random import randn, randint class BlitQT(QObject): @@ -36,7 +36,7 @@ app = BlitQT() # for profiling app.tstart = time.time() -app.startTimer(0) +app.startTimer(10) plt.show() print 'FPS:' , app.animation.cnt/(time.time()-app.tstart) diff -Nru matplotlib-0.99.3/doc/mpl_examples/event_handling/resample.py matplotlib-1.0.1/doc/mpl_examples/event_handling/resample.py --- matplotlib-0.99.3/doc/mpl_examples/event_handling/resample.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/event_handling/resample.py 2010-07-07 01:41:54.000000000 +0000 @@ -0,0 +1,53 @@ +import numpy as np +import matplotlib.pyplot as plt +from scikits.audiolab import wavread + +# A class that will downsample the data and recompute when zoomed. +class DataDisplayDownsampler(object): + def __init__(self, xdata, ydata): + self.origYData = ydata + self.origXData = xdata + self.numpts = 3000 + self.delta = xdata[-1] - xdata[0] + + def resample(self, xstart, xend): + # Very simple downsampling that takes the points within the range + # and picks every Nth point + mask = (self.origXData > xstart) & (self.origXData < xend) + xdata = self.origXData[mask] + ratio = int(xdata.size / self.numpts) + 1 + xdata = xdata[::ratio] + + ydata = self.origYData[mask] + ydata = ydata[::ratio] + + return xdata, ydata + + def update(self, ax): + # Update the line + lims = ax.viewLim + if np.abs(lims.width - self.delta) > 1e-8: + self.delta = lims.width + xstart, xend = lims.intervalx + self.line.set_data(*self.downsample(xstart, xend)) + ax.figure.canvas.draw_idle() + +# Read data +data = wavread('/usr/share/sounds/purple/receive.wav')[0] +ydata = np.tile(data[:, 0], 100) +xdata = np.arange(ydata.size) + +d = DataDisplayDownsampler(xdata, ydata) + +fig = plt.figure() +ax = fig.add_subplot(1, 1, 1) + +#Hook up the line +xdata, ydata = d.downsample(xdata[0], xdata[-1]) +d.line, = ax.plot(xdata, ydata) +ax.set_autoscale_on(False) # Otherwise, infinite loop + +# Connect for changing the view limits +ax.callbacks.connect('xlim_changed', d.update) + +plt.show() diff -Nru matplotlib-0.99.3/doc/mpl_examples/event_handling/timers.py matplotlib-1.0.1/doc/mpl_examples/event_handling/timers.py --- matplotlib-0.99.3/doc/mpl_examples/event_handling/timers.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/event_handling/timers.py 2010-07-07 01:41:54.000000000 +0000 @@ -0,0 +1,29 @@ +# Simple example of using general timer objects. This is used to update +# the time placed in the title of the figure. +import matplotlib.pyplot as plt +import numpy as np +from datetime import datetime + +def update_title(axes): + axes.set_title(datetime.now()) + axes.figure.canvas.draw() + +fig = plt.figure() +ax = fig.add_subplot(1, 1, 1) + +x = np.linspace(-3, 3) +ax.plot(x, x*x) + +# Create a new timer object. Set the interval 500 milliseconds (1000 is default) +# and tell the timer what function should be called. +timer = fig.canvas.new_timer(interval=100) +timer.add_callback(update_title, ax) +timer.start() + +#Or could start the timer on first figure draw +#def start_timer(evt): +# timer.start() +# fig.canvas.mpl_disconnect(drawid) +#drawid = fig.canvas.mpl_connect('draw_event', start_timer) + +plt.show() diff -Nru matplotlib-0.99.3/doc/mpl_examples/event_handling/viewlims.py matplotlib-1.0.1/doc/mpl_examples/event_handling/viewlims.py --- matplotlib-0.99.3/doc/mpl_examples/event_handling/viewlims.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/event_handling/viewlims.py 2010-07-07 01:41:54.000000000 +0000 @@ -40,7 +40,7 @@ ax.set_autoscale_on(False) # Otherwise, infinite loop #Get the number of points from the number of pixels in the window - dims = ax.axesFrame.get_window_extent().bounds + dims = ax.axesPatch.get_window_extent().bounds self.width = int(dims[2] + 0.5) self.height = int(dims[2] + 0.5) diff -Nru matplotlib-0.99.3/doc/mpl_examples/misc/contour_manual.py matplotlib-1.0.1/doc/mpl_examples/misc/contour_manual.py --- matplotlib-0.99.3/doc/mpl_examples/misc/contour_manual.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/misc/contour_manual.py 2010-07-07 01:41:55.000000000 +0000 @@ -0,0 +1,50 @@ +""" +Example of displaying your own contour lines and polygons using ContourSet. +""" +import matplotlib.pyplot as plt +from matplotlib.contour import ContourSet +import matplotlib.cm as cm + +# Contour lines for each level are a list/tuple of polygons. +lines0 = [ [[0,0],[0,4]] ] +lines1 = [ [[2,0],[1,2],[1,3]] ] +lines2 = [ [[3,0],[3,2]], [[3,3],[3,4]] ] # Note two lines. + +# Filled contours between two levels are also a list/tuple of polygons. +# Points can be ordered clockwise or anticlockwise. +filled01 = [ [[0,0],[0,4],[1,3],[1,2],[2,0]] ] +filled12 = [ [[2,0],[3,0],[3,2],[1,3],[1,2]], # Note two polygons. + [[1,4],[3,4],[3,3]] ] + + +plt.figure() + +# Filled contours using filled=True. +cs = ContourSet(plt.gca(), [0,1,2], [filled01, filled12], filled=True, cmap=cm.bone) +cbar = plt.colorbar(cs) + +# Contour lines (non-filled). +lines = ContourSet(plt.gca(), [0,1,2], [lines0, lines1, lines2], cmap=cm.cool, + linewidths=3) +cbar.add_lines(lines) + +plt.axis([-0.5, 3.5, -0.5, 4.5]) +plt.title('User-specified contours') + + + +# Multiple filled contour lines can be specified in a single list of polygon +# vertices along with a list of vertex kinds (code types) as described in the +# Path class. This is particularly useful for polygons with holes. +# Here a code type of 1 is a MOVETO, and 2 is a LINETO. + +plt.figure() +filled01 = [ [[0,0],[3,0],[3,3],[0,3],[1,1],[1,2],[2,2],[2,1]] ] +kinds01 = [ [1,2,2,2,1,2,2,2] ] +cs = ContourSet(plt.gca(), [0,1], [filled01], [kinds01], filled=True) +cbar = plt.colorbar(cs) + +plt.axis([-0.5, 3.5, -0.5, 3.5]) +plt.title('User specified filled contours with holes') + +plt.show() \ No newline at end of file diff -Nru matplotlib-0.99.3/doc/mpl_examples/misc/rec_groupby_demo.py matplotlib-1.0.1/doc/mpl_examples/misc/rec_groupby_demo.py --- matplotlib-0.99.3/doc/mpl_examples/misc/rec_groupby_demo.py 2009-07-31 15:14:51.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/misc/rec_groupby_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,8 +1,10 @@ import numpy as np import matplotlib.mlab as mlab +import matplotlib.cbook as cbook - -r = mlab.csv2rec('../data/aapl.csv') +datafile = cbook.get_sample_data('aapl.csv', asfileobj=False) +print 'loading', datafile +r = mlab.csv2rec(datafile) r.sort() def daily_return(prices): diff -Nru matplotlib-0.99.3/doc/mpl_examples/misc/rec_join_demo.py matplotlib-1.0.1/doc/mpl_examples/misc/rec_join_demo.py --- matplotlib-0.99.3/doc/mpl_examples/misc/rec_join_demo.py 2009-07-31 15:14:51.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/misc/rec_join_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,8 +1,11 @@ import numpy as np import matplotlib.mlab as mlab +import matplotlib.cbook as cbook +datafile = cbook.get_sample_data('aapl.csv', asfileobj=False) +print 'loading', datafile +r = mlab.csv2rec(datafile) -r = mlab.csv2rec('../data/aapl.csv') r.sort() r1 = r[-10:] diff -Nru matplotlib-0.99.3/doc/mpl_examples/misc/sample_data_demo.py matplotlib-1.0.1/doc/mpl_examples/misc/sample_data_demo.py --- matplotlib-0.99.3/doc/mpl_examples/misc/sample_data_demo.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/misc/sample_data_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -0,0 +1,12 @@ +""" +Grab mpl data from the ~/.matplotlib/sample_data cache if it exists, else +fetch it from svn and cache it +""" +import matplotlib.cbook as cbook +import matplotlib.pyplot as plt +fname = cbook.get_sample_data('lena.png', asfileobj=False) + +print 'fname', fname +im = plt.imread(fname) +plt.imshow(im) +plt.show() diff -Nru matplotlib-0.99.3/doc/mpl_examples/misc/sample_data_test.py matplotlib-1.0.1/doc/mpl_examples/misc/sample_data_test.py --- matplotlib-0.99.3/doc/mpl_examples/misc/sample_data_test.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/misc/sample_data_test.py 2010-07-07 01:41:55.000000000 +0000 @@ -0,0 +1,26 @@ +""" +Demonstrate how get_sample_data works with svn revisions in the data. + + svn co https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/trunk/sample_data + +and edit testdata.csv to add a new row. After committing the changes, +when you rerun this script you will get the updated data (and the new +svn version will be cached in ~/.matplotlib/sample_data) +""" + +import matplotlib.mlab as mlab +import matplotlib.cbook as cbook + +# get the file handle to the cached data and print the contents +datafile = 'testdir/subdir/testsub.csv' +fh = cbook.get_sample_data(datafile) +print fh.read() + +# make sure we can read it using csv2rec +fh.seek(0) +r = mlab.csv2rec(fh) + +print mlab.rec2txt(r) + +fh.close() + diff -Nru matplotlib-0.99.3/doc/mpl_examples/mplot3d/2dcollections3d_demo.py matplotlib-1.0.1/doc/mpl_examples/mplot3d/2dcollections3d_demo.py --- matplotlib-0.99.3/doc/mpl_examples/mplot3d/2dcollections3d_demo.py 2009-08-22 21:06:13.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/mplot3d/2dcollections3d_demo.py 2010-08-03 14:22:42.000000000 +0000 @@ -3,7 +3,7 @@ import matplotlib.pyplot as plt fig = plt.figure() -ax = Axes3D(fig) +ax = fig.gca(projection='3d') x = np.linspace(0, 1, 100) y = np.sin(x * 2 * np.pi) / 2 + 0.5 diff -Nru matplotlib-0.99.3/doc/mpl_examples/mplot3d/bars3d_demo.py matplotlib-1.0.1/doc/mpl_examples/mplot3d/bars3d_demo.py --- matplotlib-0.99.3/doc/mpl_examples/mplot3d/bars3d_demo.py 2009-08-22 21:06:13.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/mplot3d/bars3d_demo.py 2010-08-03 14:22:42.000000000 +0000 @@ -3,11 +3,16 @@ import numpy as np fig = plt.figure() -ax = Axes3D(fig) +ax = fig.add_subplot(111, projection='3d') for c, z in zip(['r', 'g', 'b', 'y'], [30, 20, 10, 0]): xs = np.arange(20) ys = np.random.rand(20) - ax.bar(xs, ys, zs=z, zdir='y', color=c, alpha=0.8) + + # You can provide either a single color or an array. To demonstrate this, + # the first bar of each set will be colored cyan. + cs = [c] * len(xs) + cs[0] = 'c' + ax.bar(xs, ys, zs=z, zdir='y', color=cs, alpha=0.8) ax.set_xlabel('X') ax.set_ylabel('Y') diff -Nru matplotlib-0.99.3/doc/mpl_examples/mplot3d/contour3d_demo2.py matplotlib-1.0.1/doc/mpl_examples/mplot3d/contour3d_demo2.py --- matplotlib-0.99.3/doc/mpl_examples/mplot3d/contour3d_demo2.py 2009-08-22 21:06:13.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/mplot3d/contour3d_demo2.py 2010-08-03 14:22:42.000000000 +0000 @@ -2,7 +2,7 @@ import matplotlib.pyplot as plt fig = plt.figure() -ax = axes3d.Axes3D(fig) +ax = fig.gca(projection='3d') X, Y, Z = axes3d.get_test_data(0.05) cset = ax.contour(X, Y, Z, 16, extend3d=True) ax.clabel(cset, fontsize=9, inline=1) diff -Nru matplotlib-0.99.3/doc/mpl_examples/mplot3d/contour3d_demo3.py matplotlib-1.0.1/doc/mpl_examples/mplot3d/contour3d_demo3.py --- matplotlib-0.99.3/doc/mpl_examples/mplot3d/contour3d_demo3.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/mplot3d/contour3d_demo3.py 2010-08-03 14:22:42.000000000 +0000 @@ -0,0 +1,20 @@ +from mpl_toolkits.mplot3d import axes3d +import matplotlib.pyplot as plt + +fig = plt.figure() +ax = fig.gca(projection='3d') +X, Y, Z = axes3d.get_test_data(0.05) +ax.plot_surface(X, Y, Z, rstride=8, cstride=8, alpha=0.3) +cset = ax.contour(X, Y, Z, zdir='z', offset=-100) +cset = ax.contour(X, Y, Z, zdir='x', offset=-40) +cset = ax.contour(X, Y, Z, zdir='y', offset=40) + +ax.set_xlabel('X') +ax.set_xlim3d(-40, 40) +ax.set_ylabel('Y') +ax.set_ylim3d(-40, 40) +ax.set_zlabel('Z') +ax.set_zlim3d(-100, 100) + +plt.show() + diff -Nru matplotlib-0.99.3/doc/mpl_examples/mplot3d/contour3d_demo.py matplotlib-1.0.1/doc/mpl_examples/mplot3d/contour3d_demo.py --- matplotlib-0.99.3/doc/mpl_examples/mplot3d/contour3d_demo.py 2009-08-22 21:06:13.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/mplot3d/contour3d_demo.py 2010-08-03 14:22:42.000000000 +0000 @@ -2,7 +2,7 @@ import matplotlib.pyplot as plt fig = plt.figure() -ax = axes3d.Axes3D(fig) +ax = fig.add_subplot(111, projection='3d') X, Y, Z = axes3d.get_test_data(0.05) cset = ax.contour(X, Y, Z) ax.clabel(cset, fontsize=9, inline=1) diff -Nru matplotlib-0.99.3/doc/mpl_examples/mplot3d/contourf3d_demo.py matplotlib-1.0.1/doc/mpl_examples/mplot3d/contourf3d_demo.py --- matplotlib-0.99.3/doc/mpl_examples/mplot3d/contourf3d_demo.py 2009-08-22 21:06:13.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/mplot3d/contourf3d_demo.py 2010-08-03 14:22:42.000000000 +0000 @@ -2,7 +2,7 @@ import matplotlib.pyplot as plt fig = plt.figure() -ax = axes3d.Axes3D(fig) +ax = fig.gca(projection='3d') X, Y, Z = axes3d.get_test_data(0.05) cset = ax.contourf(X, Y, Z) ax.clabel(cset, fontsize=9, inline=1) diff -Nru matplotlib-0.99.3/doc/mpl_examples/mplot3d/hist3d_demo.py matplotlib-1.0.1/doc/mpl_examples/mplot3d/hist3d_demo.py --- matplotlib-0.99.3/doc/mpl_examples/mplot3d/hist3d_demo.py 2009-08-22 21:06:13.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/mplot3d/hist3d_demo.py 2010-08-03 14:22:42.000000000 +0000 @@ -3,7 +3,7 @@ import numpy as np fig = plt.figure() -ax = Axes3D(fig) +ax = fig.add_subplot(111, projection='3d') x, y = np.random.rand(2, 100) * 4 hist, xedges, yedges = np.histogram2d(x, y, bins=4) @@ -16,7 +16,8 @@ dx = 0.5 * np.ones_like(zpos) dy = dx.copy() dz = hist.flatten() -ax.bar3d(xpos, ypos, zpos, dx, dy, dz, color='b') + +ax.bar3d(xpos, ypos, zpos, dx, dy, dz, color='b', zsort='average') plt.show() diff -Nru matplotlib-0.99.3/doc/mpl_examples/mplot3d/lines3d_demo.py matplotlib-1.0.1/doc/mpl_examples/mplot3d/lines3d_demo.py --- matplotlib-0.99.3/doc/mpl_examples/mplot3d/lines3d_demo.py 2009-08-22 21:06:13.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/mplot3d/lines3d_demo.py 2010-08-03 14:22:42.000000000 +0000 @@ -6,7 +6,7 @@ mpl.rcParams['legend.fontsize'] = 10 fig = plt.figure() -ax = Axes3D(fig) +ax = fig.gca(projection='3d') theta = np.linspace(-4 * np.pi, 4 * np.pi, 100) z = np.linspace(-2, 2, 100) r = z**2 + 1 diff -Nru matplotlib-0.99.3/doc/mpl_examples/mplot3d/mixed_subplots_demo.py matplotlib-1.0.1/doc/mpl_examples/mplot3d/mixed_subplots_demo.py --- matplotlib-0.99.3/doc/mpl_examples/mplot3d/mixed_subplots_demo.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/mplot3d/mixed_subplots_demo.py 2010-08-03 14:22:42.000000000 +0000 @@ -0,0 +1,48 @@ +""" +Demonstrate the mixing of 2d and 3d subplots +""" +from mpl_toolkits.mplot3d import Axes3D +import matplotlib.pyplot as plt +import numpy as np + +def f(t): + s1 = np.cos(2*np.pi*t) + e1 = np.exp(-t) + return np.multiply(s1,e1) + + +################ +# First subplot +################ +t1 = np.arange(0.0, 5.0, 0.1) +t2 = np.arange(0.0, 5.0, 0.02) +t3 = np.arange(0.0, 2.0, 0.01) + +fig = plt.figure() +fig.suptitle('A tale of 2 subplots') +ax = fig.add_subplot(2, 1, 1) +l = ax.plot(t1, f(t1), 'bo', + t2, f(t2), 'k--', markerfacecolor='green') +ax.grid(True) +ax.set_ylabel('Damped oscillation') + + +################# +# Second subplot +################# +ax = fig.add_subplot(2, 1, 2, projection='3d') +X = np.arange(-5, 5, 0.25) +xlen = len(X) +Y = np.arange(-5, 5, 0.25) +ylen = len(Y) +X, Y = np.meshgrid(X, Y) +R = np.sqrt(X**2 + Y**2) +Z = np.sin(R) + +surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, + linewidth=0, antialiased=False) + +ax.set_zlim3d(-1, 1) + +plt.show() + diff -Nru matplotlib-0.99.3/doc/mpl_examples/mplot3d/pathpatch3d_demo.py matplotlib-1.0.1/doc/mpl_examples/mplot3d/pathpatch3d_demo.py --- matplotlib-0.99.3/doc/mpl_examples/mplot3d/pathpatch3d_demo.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/mplot3d/pathpatch3d_demo.py 2010-08-03 14:22:42.000000000 +0000 @@ -0,0 +1,52 @@ +import matplotlib.pyplot as plt +from matplotlib.patches import Circle, PathPatch +from mpl_toolkits.mplot3d import Axes3D +import mpl_toolkits.mplot3d.art3d as art3d +from matplotlib.text import TextPath +from matplotlib.transforms import Affine2D + + +def text3d(ax, (x, y, z), s, zdir="z", size=None, angle=0, usetex=False, + **kwargs): + + if zdir == "y": + xy1, z1 = (x, z), y + elif zdir == "y": + xy1, z1 = (y, z), x + else: + xy1, z1 = (x, y), z + + text_path = TextPath((0, 0), s, size=size, usetex=usetex) + trans = Affine2D().rotate(angle).translate(xy1[0], xy1[1]) + + p1 = PathPatch(trans.transform_path(text_path), **kwargs) + ax.add_patch(p1) + art3d.pathpatch_2d_to_3d(p1, z=z1, zdir=zdir) + + +fig = plt.figure() +ax = fig.add_subplot(111, projection='3d') + +p = Circle((5, 5), 3) +ax.add_patch(p) +art3d.pathpatch_2d_to_3d(p, z=0, zdir="x") + + +text3d(ax, (4, -2, 0), "X-axis", zdir="z", size=.5, usetex=False, + ec="none", fc="k") +text3d(ax, (12, 4, 0), "Y-axis", zdir="z", size=.5, usetex=False, angle=.5*3.14159, + ec="none", fc="k") +text3d(ax, (12, 10, 4), "Z-axis", zdir="y", size=.5, usetex=False, angle=.5*3.14159, + ec="none", fc="k") + +text3d(ax, (1, 5, 0), + r"$\displaystyle G_{\mu\nu} + \Lambda g_{\mu\nu} = \frac{8\pi G}{c^4} T_{\mu\nu} $", + zdir="z", size=1, usetex=True, + ec="none", fc="k") + +ax.set_xlim3d(0, 10) +ax.set_ylim3d(0, 10) +ax.set_zlim3d(0, 10) + +plt.show() + diff -Nru matplotlib-0.99.3/doc/mpl_examples/mplot3d/polys3d_demo.py matplotlib-1.0.1/doc/mpl_examples/mplot3d/polys3d_demo.py --- matplotlib-0.99.3/doc/mpl_examples/mplot3d/polys3d_demo.py 2009-08-22 21:06:13.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/mplot3d/polys3d_demo.py 2010-08-03 14:22:42.000000000 +0000 @@ -5,7 +5,7 @@ import numpy as np fig = plt.figure() -ax = Axes3D(fig) +ax = fig.gca(projection='3d') cc = lambda arg: colorConverter.to_rgba(arg, alpha=0.6) @@ -22,8 +22,11 @@ poly.set_alpha(0.7) ax.add_collection3d(poly, zs=zs, zdir='y') +ax.set_xlabel('X') ax.set_xlim3d(0, 10) +ax.set_ylabel('Y') ax.set_ylim3d(-1, 4) +ax.set_zlabel('Z') ax.set_zlim3d(0, 1) plt.show() diff -Nru matplotlib-0.99.3/doc/mpl_examples/mplot3d/rotate_axes3d_demo.py matplotlib-1.0.1/doc/mpl_examples/mplot3d/rotate_axes3d_demo.py --- matplotlib-0.99.3/doc/mpl_examples/mplot3d/rotate_axes3d_demo.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/mplot3d/rotate_axes3d_demo.py 2010-08-03 14:22:42.000000000 +0000 @@ -0,0 +1,15 @@ +from mpl_toolkits.mplot3d import axes3d +import matplotlib.pyplot as plt +import numpy as np + +plt.ion() + +fig = plt.figure() +ax = fig.add_subplot(111, projection='3d') +X, Y, Z = axes3d.get_test_data(0.1) +ax.plot_wireframe(X, Y, Z, rstride=5, cstride=5) + +for angle in range(0, 360): + ax.view_init(30, angle) + plt.draw() + diff -Nru matplotlib-0.99.3/doc/mpl_examples/mplot3d/scatter3d_demo.py matplotlib-1.0.1/doc/mpl_examples/mplot3d/scatter3d_demo.py --- matplotlib-0.99.3/doc/mpl_examples/mplot3d/scatter3d_demo.py 2009-08-22 21:06:13.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/mplot3d/scatter3d_demo.py 2010-08-03 14:22:42.000000000 +0000 @@ -2,18 +2,17 @@ from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt - def randrange(n, vmin, vmax): return (vmax-vmin)*np.random.rand(n) + vmin fig = plt.figure() -ax = Axes3D(fig) +ax = fig.add_subplot(111, projection='3d') n = 100 -for c, zl, zh in [('r', -50, -25), ('b', -30, -5)]: +for c, m, zl, zh in [('r', 'o', -50, -25), ('b', '^', -30, -5)]: xs = randrange(n, 23, 32) ys = randrange(n, 0, 100) zs = randrange(n, zl, zh) - ax.scatter(xs, ys, zs, c=c) + ax.scatter(xs, ys, zs, c=c, marker=m) ax.set_xlabel('X Label') ax.set_ylabel('Y Label') diff -Nru matplotlib-0.99.3/doc/mpl_examples/mplot3d/subplot3d_demo.py matplotlib-1.0.1/doc/mpl_examples/mplot3d/subplot3d_demo.py --- matplotlib-0.99.3/doc/mpl_examples/mplot3d/subplot3d_demo.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/mplot3d/subplot3d_demo.py 2010-08-03 14:22:42.000000000 +0000 @@ -0,0 +1,32 @@ +from mpl_toolkits.mplot3d.axes3d import Axes3D +import matplotlib.pyplot as plt + + +# imports specific to the plots in this example +import numpy as np +from matplotlib import cm +from mpl_toolkits.mplot3d.axes3d import get_test_data + + +fig = plt.figure(figsize=(9.5,5.0)) + +#---- First subplot +ax = fig.add_subplot(1, 2, 1, projection='3d') +X = np.arange(-5, 5, 0.25) +Y = np.arange(-5, 5, 0.25) +X, Y = np.meshgrid(X, Y) +R = np.sqrt(X**2 + Y**2) +Z = np.sin(R) +surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.jet, + linewidth=0, antialiased=False) +ax.set_zlim3d(-1.01, 1.01) + +fig.colorbar(surf, shrink=0.5, aspect=10) + +#---- Second subplot +ax = fig.add_subplot(1, 2, 2, projection='3d') +X, Y, Z = get_test_data(0.05) +ax.plot_wireframe(X, Y, Z, rstride=10, cstride=10) + +plt.show() + diff -Nru matplotlib-0.99.3/doc/mpl_examples/mplot3d/surface3d_demo2.py matplotlib-1.0.1/doc/mpl_examples/mplot3d/surface3d_demo2.py --- matplotlib-0.99.3/doc/mpl_examples/mplot3d/surface3d_demo2.py 2009-08-22 21:06:13.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/mplot3d/surface3d_demo2.py 2010-08-03 14:22:42.000000000 +0000 @@ -3,7 +3,7 @@ import numpy as np fig = plt.figure() -ax = Axes3D(fig) +ax = fig.add_subplot(111, projection='3d') u = np.linspace(0, 2 * np.pi, 100) v = np.linspace(0, np.pi, 100) diff -Nru matplotlib-0.99.3/doc/mpl_examples/mplot3d/surface3d_demo3.py matplotlib-1.0.1/doc/mpl_examples/mplot3d/surface3d_demo3.py --- matplotlib-0.99.3/doc/mpl_examples/mplot3d/surface3d_demo3.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/mplot3d/surface3d_demo3.py 2010-08-03 14:22:42.000000000 +0000 @@ -0,0 +1,31 @@ +from mpl_toolkits.mplot3d import Axes3D +from matplotlib import cm +from matplotlib.ticker import LinearLocator, FixedLocator, FormatStrFormatter +import matplotlib.pyplot as plt +import numpy as np + +fig = plt.figure() +ax = fig.gca(projection='3d') +X = np.arange(-5, 5, 0.25) +xlen = len(X) +Y = np.arange(-5, 5, 0.25) +ylen = len(Y) +X, Y = np.meshgrid(X, Y) +R = np.sqrt(X**2 + Y**2) +Z = np.sin(R) + +colortuple = ('y', 'b') +colors = np.empty(X.shape, dtype=str) +for y in range(ylen): + for x in range(xlen): + colors[x, y] = colortuple[(x + y) % len(colortuple)] + +surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, facecolors=colors, + linewidth=0, antialiased=False) + +ax.set_zlim3d(-1, 1) +ax.w_zaxis.set_major_locator(LinearLocator(6)) +ax.w_zaxis.set_major_formatter(FormatStrFormatter('%.03f')) + +plt.show() + diff -Nru matplotlib-0.99.3/doc/mpl_examples/mplot3d/surface3d_demo.py matplotlib-1.0.1/doc/mpl_examples/mplot3d/surface3d_demo.py --- matplotlib-0.99.3/doc/mpl_examples/mplot3d/surface3d_demo.py 2009-08-22 21:06:13.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/mplot3d/surface3d_demo.py 2010-08-03 14:22:42.000000000 +0000 @@ -1,16 +1,24 @@ from mpl_toolkits.mplot3d import Axes3D from matplotlib import cm +from matplotlib.ticker import LinearLocator, FixedLocator, FormatStrFormatter import matplotlib.pyplot as plt import numpy as np fig = plt.figure() -ax = Axes3D(fig) +ax = fig.gca(projection='3d') X = np.arange(-5, 5, 0.25) Y = np.arange(-5, 5, 0.25) X, Y = np.meshgrid(X, Y) R = np.sqrt(X**2 + Y**2) Z = np.sin(R) -ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.jet) +surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.jet, + linewidth=0, antialiased=False) +ax.set_zlim3d(-1.01, 1.01) + +ax.w_zaxis.set_major_locator(LinearLocator(10)) +ax.w_zaxis.set_major_formatter(FormatStrFormatter('%.03f')) + +fig.colorbar(surf, shrink=0.5, aspect=5) plt.show() diff -Nru matplotlib-0.99.3/doc/mpl_examples/mplot3d/surface3d_radial_demo.py matplotlib-1.0.1/doc/mpl_examples/mplot3d/surface3d_radial_demo.py --- matplotlib-0.99.3/doc/mpl_examples/mplot3d/surface3d_radial_demo.py 2010-05-30 20:31:09.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/mplot3d/surface3d_radial_demo.py 2010-08-03 14:22:42.000000000 +0000 @@ -8,7 +8,7 @@ step = 0.04 maxval = 1.0 fig = plt.figure() -ax = Axes3D(fig) +ax = fig.add_subplot(111, projection='3d') # create supporting points in polar coordinates r = np.linspace(0,1.25,50) diff -Nru matplotlib-0.99.3/doc/mpl_examples/mplot3d/text3d_demo.py matplotlib-1.0.1/doc/mpl_examples/mplot3d/text3d_demo.py --- matplotlib-0.99.3/doc/mpl_examples/mplot3d/text3d_demo.py 2009-08-22 21:06:13.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/mplot3d/text3d_demo.py 2010-08-03 14:22:42.000000000 +0000 @@ -2,7 +2,7 @@ import matplotlib.pyplot as plt fig = plt.figure() -ax = Axes3D(fig) +ax = fig.gca(projection='3d') zdirs = (None, 'x', 'y', 'z', (1, 1, 0), (1, 1, 1)) xs = (2, 6, 4, 9, 7, 2) @@ -13,6 +13,9 @@ label = '(%d, %d, %d), dir=%s' % (x, y, z, zdir) ax.text(x, y, z, label, zdir) +ax.text(1, 1, 1, "red", color='red') +ax.text2D(0.05, 0.95, "2D Text", transform=ax.transAxes) + ax.set_xlim3d(0, 10) ax.set_ylim3d(0, 10) ax.set_zlim3d(0, 10) diff -Nru matplotlib-0.99.3/doc/mpl_examples/mplot3d/wire3d_animation_demo.py matplotlib-1.0.1/doc/mpl_examples/mplot3d/wire3d_animation_demo.py --- matplotlib-0.99.3/doc/mpl_examples/mplot3d/wire3d_animation_demo.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/mplot3d/wire3d_animation_demo.py 2010-08-03 14:22:42.000000000 +0000 @@ -0,0 +1,37 @@ +""" +A very simple 'animation' of a 3D plot +""" +from mpl_toolkits.mplot3d import axes3d +import matplotlib.pyplot as plt +import numpy as np +import time + +def generate(X, Y, phi): + R = 1 - np.sqrt(X**2 + Y**2) + return np.cos(2 * np.pi * X + phi) * R + +plt.ion() +fig = plt.figure() +ax = fig.add_subplot(111, projection='3d') + +xs = np.linspace(-1, 1, 50) +ys = np.linspace(-1, 1, 50) +X, Y = np.meshgrid(xs, ys) +Z = generate(X, Y, 0.0) + +wframe = None +tstart = time.time() +for phi in np.linspace(0, 360 / 2 / np.pi, 100): + + oldcol = wframe + + Z = generate(X, Y, phi) + wframe = ax.plot_wireframe(X, Y, Z, rstride=2, cstride=2) + + # Remove old line collection before drawing + if oldcol is not None: + ax.collections.remove(oldcol) + + plt.draw() + +print 'FPS: %f' % (100 / (time.time() - tstart)) diff -Nru matplotlib-0.99.3/doc/mpl_examples/mplot3d/wire3d_demo.py matplotlib-1.0.1/doc/mpl_examples/mplot3d/wire3d_demo.py --- matplotlib-0.99.3/doc/mpl_examples/mplot3d/wire3d_demo.py 2009-08-22 21:06:13.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/mplot3d/wire3d_demo.py 2010-08-03 14:22:42.000000000 +0000 @@ -3,7 +3,7 @@ import numpy as np fig = plt.figure() -ax = axes3d.Axes3D(fig) +ax = fig.add_subplot(111, projection='3d') X, Y, Z = axes3d.get_test_data(0.05) ax.plot_wireframe(X, Y, Z, rstride=10, cstride=10) diff -Nru matplotlib-0.99.3/doc/mpl_examples/pylab_examples/accented_text.py matplotlib-1.0.1/doc/mpl_examples/pylab_examples/accented_text.py --- matplotlib-0.99.3/doc/mpl_examples/pylab_examples/accented_text.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/pylab_examples/accented_text.py 2010-09-23 19:54:49.000000000 +0000 @@ -11,6 +11,7 @@ """ from pylab import * +axes([0.1, 0.15, 0.8, 0.75]) plot(range(10)) title(r'$\ddot{o}\acute{e}\grave{e}\hat{O}\breve{i}\bar{A}\tilde{n}\vec{q}$', fontsize=20) diff -Nru matplotlib-0.99.3/doc/mpl_examples/pylab_examples/annotation_demo3.py matplotlib-1.0.1/doc/mpl_examples/pylab_examples/annotation_demo3.py --- matplotlib-0.99.3/doc/mpl_examples/pylab_examples/annotation_demo3.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/pylab_examples/annotation_demo3.py 2010-07-07 01:41:55.000000000 +0000 @@ -0,0 +1,101 @@ +import matplotlib.pyplot as plt + +fig = plt.figure(1) +fig.clf() + +ax1 = plt.subplot(121) +ax2 = plt.subplot(122) + +bbox_args = dict(boxstyle="round", fc="0.8") +arrow_args = dict(arrowstyle="->") + +ax1.annotate('figure fraction : 0, 0', xy=(0, 0), xycoords='figure fraction', + xytext=(20, 20), textcoords='offset points', + ha="left", va="bottom", + bbox=bbox_args, + arrowprops=arrow_args + ) + +ax1.annotate('figure fraction : 1, 1', xy=(1, 1), xycoords='figure fraction', + xytext=(-20, -20), textcoords='offset points', + ha="right", va="top", + bbox=bbox_args, + arrowprops=arrow_args + ) + +ax1.annotate('axes fraction : 0, 0', xy=(0, 0), xycoords='axes fraction', + xytext=(20, 20), textcoords='offset points', + ha="left", va="bottom", + bbox=bbox_args, + arrowprops=arrow_args + ) + +ax1.annotate('axes fraction : 1, 1', xy=(1, 1), xycoords='axes fraction', + xytext=(-20, -20), textcoords='offset points', + ha="right", va="top", + bbox=bbox_args, + arrowprops=arrow_args + ) + + +an1 = ax1.annotate('Drag me 1', xy=(.5, .7), xycoords='data', + #xytext=(.5, .7), textcoords='data', + ha="center", va="center", + bbox=bbox_args, + #arrowprops=arrow_args + ) + +an2 = ax1.annotate('Drag me 2', xy=(.5, .5), xycoords=an1, + xytext=(.5, .3), textcoords='axes fraction', + ha="center", va="center", + bbox=bbox_args, + arrowprops=dict(patchB=an1.get_bbox_patch(), + connectionstyle="arc3,rad=0.2", + **arrow_args) + ) + +an3 = ax1.annotate('', xy=(.5, .5), xycoords=an2, + xytext=(.5, .5), textcoords=an1, + ha="center", va="center", + bbox=bbox_args, + arrowprops=dict(patchA=an1.get_bbox_patch(), + patchB=an2.get_bbox_patch(), + connectionstyle="arc3,rad=0.2", + **arrow_args) + ) + + + +t = ax2.annotate('xy=(0, 1)\nxycoords=("data", "axes fraction")', + xy=(0, 1), xycoords=("data", 'axes fraction'), + xytext=(0, -20), textcoords='offset points', + ha="center", va="top", + bbox=bbox_args, + arrowprops=arrow_args + ) + +from matplotlib.text import OffsetFrom + +ax2.annotate('xy=(0.5, 0)\nxycoords=artist', + xy=(0.5, 0.), xycoords=t, + xytext=(0, -20), textcoords='offset points', + ha="center", va="top", + bbox=bbox_args, + arrowprops=arrow_args + ) + +ax2.annotate('xy=(0.8, 0.5)\nxycoords=ax1.transData', + xy=(0.8, 0.5), xycoords=ax1.transData, + xytext=(10, 10), textcoords=OffsetFrom(ax2.bbox, (0, 0), "points"), + ha="left", va="bottom", + bbox=bbox_args, + arrowprops=arrow_args + ) + +ax2.set_xlim(-2, 2) +ax2.set_ylim(-2, 2) + +an1.draggable() +an2.draggable() + +plt.show() diff -Nru matplotlib-0.99.3/doc/mpl_examples/pylab_examples/axes_props.py matplotlib-1.0.1/doc/mpl_examples/pylab_examples/axes_props.py --- matplotlib-0.99.3/doc/mpl_examples/pylab_examples/axes_props.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/pylab_examples/axes_props.py 2010-07-07 01:41:55.000000000 +0000 @@ -10,7 +10,7 @@ plot(t, s) grid(True) -# matlab style +# MATLAB style xticklines = getp(gca(), 'xticklines') yticklines = getp(gca(), 'yticklines') xgridlines = getp(gca(), 'xgridlines') diff -Nru matplotlib-0.99.3/doc/mpl_examples/pylab_examples/axes_zoom_effect.py matplotlib-1.0.1/doc/mpl_examples/pylab_examples/axes_zoom_effect.py --- matplotlib-0.99.3/doc/mpl_examples/pylab_examples/axes_zoom_effect.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/pylab_examples/axes_zoom_effect.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,7 +1,7 @@ from matplotlib.transforms import Bbox, TransformedBbox, \ blended_transform_factory -from mpl_toolkits.axes_grid.inset_locator import BboxPatch, BboxConnector,\ +from mpl_toolkits.axes_grid1.inset_locator import BboxPatch, BboxConnector,\ BboxConnectorPatch diff -Nru matplotlib-0.99.3/doc/mpl_examples/pylab_examples/barchart_demo.py matplotlib-1.0.1/doc/mpl_examples/pylab_examples/barchart_demo.py --- matplotlib-0.99.3/doc/mpl_examples/pylab_examples/barchart_demo.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/pylab_examples/barchart_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -12,11 +12,17 @@ plt.subplot(111) -rects1 = plt.bar(ind, menMeans, width, color='r', yerr=menStd) +rects1 = plt.bar(ind, menMeans, width, + color='r', + yerr=menStd, + error_kw=dict(elinewidth=6, ecolor='pink')) womenMeans = (25, 32, 34, 20, 25) womenStd = (3, 5, 2, 3, 3) -rects2 = plt.bar(ind+width, womenMeans, width, color='y', yerr=womenStd) +rects2 = plt.bar(ind+width, womenMeans, width, + color='y', + yerr=womenStd, + error_kw=dict(elinewidth=6, ecolor='yellow')) # add some plt.ylabel('Scores') diff -Nru matplotlib-0.99.3/doc/mpl_examples/pylab_examples/boxplot_demo3.py matplotlib-1.0.1/doc/mpl_examples/pylab_examples/boxplot_demo3.py --- matplotlib-0.99.3/doc/mpl_examples/pylab_examples/boxplot_demo3.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/pylab_examples/boxplot_demo3.py 2010-07-07 01:41:55.000000000 +0000 @@ -0,0 +1,27 @@ +import matplotlib.pyplot as plt +import matplotlib.transforms as mtransforms +import numpy as np + +np.random.seed(2) +inc = 0.1 +e1 = np.random.uniform(0,1, size=(500,)) +e2 = np.random.uniform(0,1, size=(500,)) +e3 = np.random.uniform(0,1 + inc, size=(500,)) +e4 = np.random.uniform(0,1 + 2*inc, size=(500,)) + +treatments = [e1,e2,e3,e4] + +fig = plt.figure() +ax = fig.add_subplot(111) +pos = np.array(range(len(treatments)))+1 +bp = ax.boxplot( treatments, sym='k+', patch_artist=True, + positions=pos, notch=1, bootstrap=5000 ) +text_transform= mtransforms.blended_transform_factory(ax.transData, + ax.transAxes) +ax.set_xlabel('treatment') +ax.set_ylabel('response') +ax.set_ylim(-0.2, 1.4) +plt.setp(bp['whiskers'], color='k', linestyle='-' ) +plt.setp(bp['fliers'], markersize=3.0) +fig.subplots_adjust(right=0.99,top=0.99) +plt.show() diff -Nru matplotlib-0.99.3/doc/mpl_examples/pylab_examples/centered_ticklabels.py matplotlib-1.0.1/doc/mpl_examples/pylab_examples/centered_ticklabels.py --- matplotlib-0.99.3/doc/mpl_examples/pylab_examples/centered_ticklabels.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/pylab_examples/centered_ticklabels.py 2010-07-07 01:41:55.000000000 +0000 @@ -15,12 +15,13 @@ import datetime import numpy as np import matplotlib +import matplotlib.cbook as cbook import matplotlib.dates as dates import matplotlib.ticker as ticker import matplotlib.pyplot as plt # load some financial data; apple's stock price -fh = matplotlib.get_example_data('aapl.npy') +fh = cbook.get_sample_data('aapl.npy') r = np.load(fh); fh.close() r = r[-250:] # get the last 250 days diff -Nru matplotlib-0.99.3/doc/mpl_examples/pylab_examples/clippedline.py matplotlib-1.0.1/doc/mpl_examples/pylab_examples/clippedline.py --- matplotlib-0.99.3/doc/mpl_examples/pylab_examples/clippedline.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/pylab_examples/clippedline.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,6 +1,11 @@ """ Clip a line according to the current xlimits, and change the marker -style when zoomed in +style when zoomed in. + +It is not clear this example is still needed or valid; clipping +is now automatic for Line2D objects when x is sorted in +ascending order. + """ from matplotlib.lines import Line2D @@ -19,8 +24,7 @@ def set_data(self, *args, **kwargs): Line2D.set_data(self, *args, **kwargs) - if self._invalid: - self.recache() + self.recache() self.xorig = np.array(self._x) self.yorig = np.array(self._y) diff -Nru matplotlib-0.99.3/doc/mpl_examples/pylab_examples/color_demo.py matplotlib-1.0.1/doc/mpl_examples/pylab_examples/color_demo.py --- matplotlib-0.99.3/doc/mpl_examples/pylab_examples/color_demo.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/pylab_examples/color_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -2,7 +2,7 @@ """ matplotlib gives you 4 ways to specify colors, - 1) as a single letter string, ala matlab + 1) as a single letter string, ala MATLAB 2) as an html style hex string or html color name diff -Nru matplotlib-0.99.3/doc/mpl_examples/pylab_examples/contourf_demo.py matplotlib-1.0.1/doc/mpl_examples/pylab_examples/contourf_demo.py --- matplotlib-0.99.3/doc/mpl_examples/pylab_examples/contourf_demo.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/pylab_examples/contourf_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -3,15 +3,7 @@ origin = 'lower' #origin = 'upper' -# The following controls only interior masking. -test_masking = False # There is a bug in filled contour masking with - # interior masks. - -if test_masking: - # Use a coarse grid so only a few masked points are needed. - delta = 0.5 -else: - delta = 0.025 +delta = 0.025 x = y = arange(-3.0, 3.01, delta) X, Y = meshgrid(x, y) @@ -19,19 +11,6 @@ Z2 = bivariate_normal(X, Y, 1.5, 0.5, 1, 1) Z = 10 * (Z1 - Z2) -# interior badmask doesn't work yet for filled contours -if test_masking: - badmask = zeros(shape(Z)) - - badmask[5,5] = 1 - badmask[5,6] = 1 - Z[5,5] = 0 - Z[5,6] = 0 - - badmask[0,0] = 1 - Z[0,0] = 0 - Z = ma.array(Z, mask=badmask) - nr, nc = Z.shape # put NaNs in one corner: @@ -43,6 +22,10 @@ # mask another corner: Z[:nr//6, :nc//6] = ma.masked +# mask a circle in the middle: +interior = sqrt((X**2) + (Y**2)) < 0.5 +Z[interior] = ma.masked + # We are using automatic selection of contour levels; # this is usually not such a good idea, because they don't @@ -55,14 +38,15 @@ # Note that in the following, we explicitly pass in a subset of # the contour levels used for the filled contours. Alternatively, -# We could pass in additional levels to provide extra resolution. +# We could pass in additional levels to provide extra resolution, +# or leave out the levels kwarg to use all of the original levels. -CS2 = contour(X, Y, Z, CS.levels[::2], +CS2 = contour(CS, levels=CS.levels[::2], colors = 'r', origin=origin, hold='on') -title('Nonsense (with 2 masked corners)') +title('Nonsense (3 masked regions)') xlabel('word length anomaly') ylabel('sentence length anomaly') @@ -77,17 +61,26 @@ # Now make a contour plot with the levels specified, # and with the colormap generated automatically from a list # of colors. -levels = [-2, -1.5, -1, -0.5, 0, 0.5, 1, 1.5] +levels = [-1.5, -1, -0.5, 0, 0.5, 1] CS3 = contourf(X, Y, Z, levels, colors = ('r', 'g', 'b'), - origin=origin) + origin=origin, + extend='both') +# Our data range extends outside the range of levels; make +# data below the lowest contour level yellow, and above the +# highest level cyan: +CS3.cmap.set_under('yellow') +CS3.cmap.set_over('cyan') CS4 = contour(X, Y, Z, levels, colors = ('k',), linewidths = (3,), origin = origin) -title('Listed colors (with 2 masked corners)') +title('Listed colors (3 masked regions)') clabel(CS4, fmt = '%2.1f', colors = 'w', fontsize=14) + +# Notice that the colorbar command gets all the information it +# needs from the ContourSet object, CS3. colorbar(CS3) show() diff -Nru matplotlib-0.99.3/doc/mpl_examples/pylab_examples/contour_image.py matplotlib-1.0.1/doc/mpl_examples/pylab_examples/contour_image.py --- matplotlib-0.99.3/doc/mpl_examples/pylab_examples/contour_image.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/pylab_examples/contour_image.py 2010-07-07 01:41:55.000000000 +0000 @@ -67,7 +67,7 @@ imshow(Z, extent=extent) v = axis() -contour(Z, cset3.levels, hold='on', colors = 'k', +contour(Z, levels, hold='on', colors = 'k', origin='upper', extent=extent) axis(v) title("Image, origin 'upper'") @@ -76,7 +76,7 @@ imshow(Z, origin='lower', extent=extent) v = axis() -contour(Z, cset3.levels, hold='on', colors = 'k', +contour(Z, levels, hold='on', colors = 'k', origin='lower', extent=extent) axis(v) title("Image, origin 'lower'") @@ -91,7 +91,7 @@ # domain that is contoured does not extend beyond these pixel centers. im = imshow(Z, interpolation='nearest', extent=extent) v = axis() -contour(Z, cset3.levels, hold='on', colors = 'k', +contour(Z, levels, hold='on', colors = 'k', origin='image', extent=extent) axis(v) ylim = get(gca(), 'ylim') diff -Nru matplotlib-0.99.3/doc/mpl_examples/pylab_examples/cursor_demo.py matplotlib-1.0.1/doc/mpl_examples/pylab_examples/cursor_demo.py --- matplotlib-0.99.3/doc/mpl_examples/pylab_examples/cursor_demo.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/pylab_examples/cursor_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -15,22 +15,19 @@ class Cursor: def __init__(self, ax): self.ax = ax - self.lx, = ax.plot( (0,0), (0,0), 'k-' ) # the horiz line - self.ly, = ax.plot( (0,0), (0,0), 'k-' ) # the vert line + self.lx = ax.axhline(color='k') # the horiz line + self.ly = ax.axvline(color='k') # the vert line # text location in axes coords self.txt = ax.text( 0.7, 0.9, '', transform=ax.transAxes) def mouse_move(self, event): if not event.inaxes: return - ax = event.inaxes - minx, maxx = ax.get_xlim() - miny, maxy = ax.get_ylim() x, y = event.xdata, event.ydata # update the line positions - self.lx.set_data( (minx, maxx), (y, y) ) - self.ly.set_data( (x, x), (miny, maxy) ) + self.lx.set_ydata(y ) + self.ly.set_xdata(x ) self.txt.set_text( 'x=%1.2f, y=%1.2f'%(x,y) ) draw() @@ -43,8 +40,8 @@ """ def __init__(self, ax, x, y): self.ax = ax - self.lx, = ax.plot( (0,0), (0,0), 'k-' ) # the horiz line - self.ly, = ax.plot( (0,0), (0,0), 'k-' ) # the vert line + self.lx = ax.axhline(color='k') # the horiz line + self.ly = ax.axvline(color='k') # the vert line self.x = x self.y = y # text location in axes coords @@ -53,9 +50,6 @@ def mouse_move(self, event): if not event.inaxes: return - ax = event.inaxes - minx, maxx = ax.get_xlim() - miny, maxy = ax.get_ylim() x, y = event.xdata, event.ydata @@ -63,8 +57,8 @@ x = self.x[indx] y = self.y[indx] # update the line positions - self.lx.set_data( (minx, maxx), (y, y) ) - self.ly.set_data( (x, x), (miny, maxy) ) + self.lx.set_ydata(y ) + self.ly.set_xdata(x ) self.txt.set_text( 'x=%1.2f, y=%1.2f'%(x,y) ) print 'x=%1.2f, y=%1.2f'%(x,y) @@ -81,3 +75,4 @@ ax.plot(t, s, 'o') axis([0,1,-1,1]) show() + diff -Nru matplotlib-0.99.3/doc/mpl_examples/pylab_examples/data_helper.py matplotlib-1.0.1/doc/mpl_examples/pylab_examples/data_helper.py --- matplotlib-0.99.3/doc/mpl_examples/pylab_examples/data_helper.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/pylab_examples/data_helper.py 2010-07-07 01:41:55.000000000 +0000 @@ -2,7 +2,7 @@ # Some functions to load a return data for the plot demos from numpy import fromstring, argsort, take, array, resize - +import matplotlib.cbook as cbook def get_two_stock_data(): """ load stock time and price data for two stocks The return values @@ -10,11 +10,14 @@ and 2 (intc and aapl) """ ticker1, ticker2 = 'INTC', 'AAPL' - M1 = fromstring( file('../data/%s.dat' % ticker1, 'rb').read(), '")) + ax.add_artist(ab) + + offsetbox = TextArea("Test", minimumdescent=False) + + ab = AnnotationBbox(offsetbox, xy, + xybox=(1.02, xy[1]), + xycoords='data', + boxcoords=("axes fraction", "data"), + box_alignment=(0.,0.5), + arrowprops=dict(arrowstyle="->")) + ax.add_artist(ab) + + + from matplotlib.patches import Circle + da = DrawingArea(20, 20, 0, 0) + p = Circle((10, 10), 10) + da.add_artist(p) + + xy = [0.3, 0.55] + ab = AnnotationBbox(da, xy, + xybox=(1.02, xy[1]), + xycoords='data', + boxcoords=("axes fraction", "data"), + box_alignment=(0.,0.5), + arrowprops=dict(arrowstyle="->")) + #arrowprops=None) + + ax.add_artist(ab) + + + arr = np.arange(100).reshape((10,10)) + im = OffsetImage(arr, zoom=2) + + ab = AnnotationBbox(im, xy, + xybox=(-50., 50.), + xycoords='data', + boxcoords="offset points", + pad=0.3, + arrowprops=dict(arrowstyle="->")) + #arrowprops=None) + + ax.add_artist(ab) + + + # another image + + + from matplotlib._png import read_png + fn = get_sample_data("lena.png", asfileobj=False) + arr_lena = read_png(fn) + + imagebox = OffsetImage(arr_lena, zoom=0.2) + + ab = AnnotationBbox(imagebox, xy, + xybox=(120., -80.), + xycoords='data', + boxcoords="offset points", + pad=0.5, + arrowprops=dict(arrowstyle="->", + connectionstyle="angle,angleA=0,angleB=90,rad=3") + ) + + + ax.add_artist(ab) + + ax.set_xlim(0, 1) + ax.set_ylim(0, 1) + + + plt.draw() + plt.show() diff -Nru matplotlib-0.99.3/doc/mpl_examples/pylab_examples/demo_bboximage.py matplotlib-1.0.1/doc/mpl_examples/pylab_examples/demo_bboximage.py --- matplotlib-0.99.3/doc/mpl_examples/pylab_examples/demo_bboximage.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/pylab_examples/demo_bboximage.py 2010-07-07 01:41:55.000000000 +0000 @@ -0,0 +1,62 @@ +import matplotlib.pyplot as plt +import numpy as np +from matplotlib.image import BboxImage +from matplotlib.transforms import Bbox, TransformedBbox + +if __name__ == "__main__": + + fig = plt.figure(1) + ax = plt.subplot(121) + + txt = ax.text(0.5, 0.5, "test", size=30, ha="center", color="w") + kwargs = dict() + + bbox_image = BboxImage(txt.get_window_extent, + norm = None, + origin=None, + clip_on=False, + **kwargs + ) + a = np.arange(256).reshape(1,256)/256. + bbox_image.set_data(a) + ax.add_artist(bbox_image) + + + ax = plt.subplot(122) + a = np.linspace(0, 1, 256).reshape(1,-1) + a = np.vstack((a,a)) + + maps = sorted(m for m in plt.cm.datad if not m.endswith("_r")) + #nmaps = len(maps) + 1 + + #fig.subplots_adjust(top=0.99, bottom=0.01, left=0.2, right=0.99) + + ncol = 2 + nrow = len(maps)//ncol + 1 + + xpad_fraction = 0.3 + dx = 1./(ncol + xpad_fraction*(ncol-1)) + + ypad_fraction = 0.3 + dy = 1./(nrow + ypad_fraction*(nrow-1)) + + for i,m in enumerate(maps): + ix, iy = divmod(i, nrow) + #plt.figimage(a, 10, i*10, cmap=plt.get_cmap(m), origin='lower') + bbox0 = Bbox.from_bounds(ix*dx*(1+xpad_fraction), + 1.-iy*dy*(1+ypad_fraction)-dy, + dx, dy) + bbox = TransformedBbox(bbox0, ax.transAxes) + + bbox_image = BboxImage(bbox, + cmap = plt.get_cmap(m), + norm = None, + origin=None, + **kwargs + ) + + bbox_image.set_data(a) + ax.add_artist(bbox_image) + + plt.draw() + plt.show() diff -Nru matplotlib-0.99.3/doc/mpl_examples/pylab_examples/demo_ribbon_box.py matplotlib-1.0.1/doc/mpl_examples/pylab_examples/demo_ribbon_box.py --- matplotlib-0.99.3/doc/mpl_examples/pylab_examples/demo_ribbon_box.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/pylab_examples/demo_ribbon_box.py 2010-07-07 01:41:55.000000000 +0000 @@ -0,0 +1,141 @@ +import matplotlib.pyplot as plt +import numpy as np +from matplotlib.image import BboxImage + +from matplotlib._png import read_png +import matplotlib.colors +from matplotlib.cbook import get_sample_data + +class RibbonBox(object): + + original_image = read_png(get_sample_data("Minduka_Present_Blue_Pack.png", + asfileobj=False)) + cut_location = 70 + b_and_h = original_image[:,:,2] + color = original_image[:,:,2] - original_image[:,:,0] + alpha = original_image[:,:,3] + nx = original_image.shape[1] + + def __init__(self, color): + rgb = matplotlib.colors.colorConverter.to_rgb(color) + + im = np.empty(self.original_image.shape, + self.original_image.dtype) + + + im[:,:,:3] = self.b_and_h[:,:,np.newaxis] + im[:,:,:3] -= self.color[:,:,np.newaxis]*(1.-np.array(rgb)) + im[:,:,3] = self.alpha + + self.im = im + + + def get_stretched_image(self, stretch_factor): + stretch_factor = max(stretch_factor, 1) + ny, nx, nch = self.im.shape + ny2 = int(ny*stretch_factor) + + stretched_image = np.empty((ny2, nx, nch), + self.im.dtype) + cut = self.im[self.cut_location,:,:] + stretched_image[:,:,:] = cut + stretched_image[:self.cut_location,:,:] = \ + self.im[:self.cut_location,:,:] + stretched_image[-(ny-self.cut_location):,:,:] = \ + self.im[-(ny-self.cut_location):,:,:] + + self._cached_im = stretched_image + return stretched_image + + + +class RibbonBoxImage(BboxImage): + zorder = 1 + + def __init__(self, bbox, color, + cmap = None, + norm = None, + interpolation=None, + origin=None, + filternorm=1, + filterrad=4.0, + resample = False, + **kwargs + ): + + BboxImage.__init__(self, bbox, + cmap = cmap, + norm = norm, + interpolation=interpolation, + origin=origin, + filternorm=filternorm, + filterrad=filterrad, + resample = resample, + **kwargs + ) + + self._ribbonbox = RibbonBox(color) + self._cached_ny = None + + + def draw(self, renderer, *args, **kwargs): + + bbox = self.get_window_extent(renderer) + stretch_factor = bbox.height / bbox.width + + ny = int(stretch_factor*self._ribbonbox.nx) + if self._cached_ny != ny: + arr = self._ribbonbox.get_stretched_image(stretch_factor) + self.set_array(arr) + self._cached_ny = ny + + BboxImage.draw(self, renderer, *args, **kwargs) + + +if 1: + from matplotlib.transforms import Bbox, TransformedBbox + from matplotlib.ticker import ScalarFormatter + + fig = plt.gcf() + fig.clf() + ax = plt.subplot(111) + + years = np.arange(2004, 2009) + box_colors = [(0.8, 0.2, 0.2), + (0.2, 0.8, 0.2), + (0.2, 0.2, 0.8), + (0.7, 0.5, 0.8), + (0.3, 0.8, 0.7), + ] + heights = np.random.random(years.shape) * 7000 + 3000 + + fmt = ScalarFormatter(useOffset=False) + ax.xaxis.set_major_formatter(fmt) + + for year, h, bc in zip(years, heights, box_colors): + bbox0 = Bbox.from_extents(year-0.4, 0., year+0.4, h) + bbox = TransformedBbox(bbox0, ax.transData) + rb_patch = RibbonBoxImage(bbox, bc, interpolation="bicubic") + + ax.add_artist(rb_patch) + + ax.annotate(r"%d" % (int(h/100.)*100), + (year, h), va="bottom", ha="center") + + patch_gradient = BboxImage(ax.bbox, + interpolation="bicubic", + zorder=0.1, + ) + gradient = np.zeros((2, 2, 4), dtype=np.float) + gradient[:,:,:3] = [1, 1, 0.] + gradient[:,:,3] = [[0.1, 0.3],[0.3, 0.5]] # alpha channel + patch_gradient.set_array(gradient) + ax.add_artist(patch_gradient) + + + ax.set_xlim(years[0]-0.5, years[-1]+0.5) + ax.set_ylim(0, 10000) + + fig.savefig('ribbon_box.png') + plt.show() + diff -Nru matplotlib-0.99.3/doc/mpl_examples/pylab_examples/demo_text_path.py matplotlib-1.0.1/doc/mpl_examples/pylab_examples/demo_text_path.py --- matplotlib-0.99.3/doc/mpl_examples/pylab_examples/demo_text_path.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/pylab_examples/demo_text_path.py 2010-11-09 13:28:22.000000000 +0000 @@ -0,0 +1,155 @@ + +# -*- coding: utf-8 -*- + +import matplotlib.pyplot as plt +from matplotlib.image import BboxImage +import numpy as np +from matplotlib.transforms import IdentityTransform + +import matplotlib.patches as mpatches + +from matplotlib.offsetbox import AnnotationBbox,\ + AnchoredOffsetbox, AuxTransformBox + +from matplotlib.cbook import get_sample_data + +from matplotlib.text import TextPath + + +class PathClippedImagePatch(mpatches.PathPatch): + """ + The given image is used to draw the face of the patch. Internally, + it uses BboxImage whose clippath set to the path of the patch. + + FIXME : The result is currently dpi dependent. + """ + def __init__(self, path, bbox_image, **kwargs): + mpatches.PathPatch.__init__(self, path, **kwargs) + self._init_bbox_image(bbox_image) + + def set_facecolor(self, color): + """simply ignore facecolor""" + mpatches.PathPatch.set_facecolor(self, "none") + + def _init_bbox_image(self, im): + + bbox_image = BboxImage(self.get_window_extent, + norm = None, + origin=None, + ) + bbox_image.set_transform(IdentityTransform()) + + bbox_image.set_data(im) + self.bbox_image = bbox_image + + def draw(self, renderer=None): + + + # the clip path must be updated every draw. any solution? -JJ + self.bbox_image.set_clip_path(self._path, self.get_transform()) + self.bbox_image.draw(renderer) + + mpatches.PathPatch.draw(self, renderer) + + +if 1: + + usetex = plt.rcParams["text.usetex"] + + fig = plt.figure(1) + + # EXAMPLE 1 + + ax = plt.subplot(211) + + from matplotlib._png import read_png + fn = get_sample_data("lena.png", asfileobj=False) + arr = read_png(fn) + + text_path = TextPath((0, 0), "!?", size=150) + p = PathClippedImagePatch(text_path, arr, ec="k", + transform=IdentityTransform()) + + #p.set_clip_on(False) + + # make offset box + offsetbox = AuxTransformBox(IdentityTransform()) + offsetbox.add_artist(p) + + # make anchored offset box + ao = AnchoredOffsetbox(loc=2, child=offsetbox, frameon=True, borderpad=0.2) + ax.add_artist(ao) + + # another text + from matplotlib.patches import PathPatch + if usetex: + r = r"\mbox{textpath supports mathtext \& \TeX}" + else: + r = r"textpath supports mathtext & TeX" + + text_path = TextPath((0, 0), r, + size=20, usetex=usetex) + + p1 = PathPatch(text_path, ec="w", lw=3, fc="w", alpha=0.9, + transform=IdentityTransform()) + p2 = PathPatch(text_path, ec="none", fc="k", + transform=IdentityTransform()) + + offsetbox2 = AuxTransformBox(IdentityTransform()) + offsetbox2.add_artist(p1) + offsetbox2.add_artist(p2) + + ab = AnnotationBbox(offsetbox2, (0.95, 0.05), + xycoords='axes fraction', + boxcoords="offset points", + box_alignment=(1.,0.), + frameon=False + ) + ax.add_artist(ab) + + ax.imshow([[0,1,2],[1,2,3]], cmap=plt.cm.gist_gray_r, + interpolation="bilinear", + aspect="auto") + + + + # EXAMPLE 2 + + ax = plt.subplot(212) + + arr = np.arange(256).reshape(1,256)/256. + + if usetex: + s = r"$\displaystyle\left[\sum_{n=1}^\infty\frac{-e^{i\pi}}{2^n}\right]$!" + else: + s = r"$\left[\sum_{n=1}^\infty\frac{-e^{i\pi}}{2^n}\right]$!" + text_path = TextPath((0, 0), s, size=40, usetex=usetex) + text_patch = PathClippedImagePatch(text_path, arr, ec="none", + transform=IdentityTransform()) + + shadow1 = mpatches.Shadow(text_patch, 1, -1, props=dict(fc="none", ec="0.6", lw=3)) + shadow2 = mpatches.Shadow(text_patch, 1, -1, props=dict(fc="0.3", ec="none")) + + + # make offset box + offsetbox = AuxTransformBox(IdentityTransform()) + offsetbox.add_artist(shadow1) + offsetbox.add_artist(shadow2) + offsetbox.add_artist(text_patch) + + # place the anchored offset box using AnnotationBbox + ab = AnnotationBbox(offsetbox, (0.5, 0.5), + xycoords='data', + boxcoords="offset points", + box_alignment=(0.5,0.5), + ) + #text_path.set_size(10) + + ax.add_artist(ab) + + ax.set_xlim(0, 1) + ax.set_ylim(0, 1) + + + plt.draw() + plt.show() diff -Nru matplotlib-0.99.3/doc/mpl_examples/pylab_examples/demo_text_rotation_mode.py matplotlib-1.0.1/doc/mpl_examples/pylab_examples/demo_text_rotation_mode.py --- matplotlib-0.99.3/doc/mpl_examples/pylab_examples/demo_text_rotation_mode.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/pylab_examples/demo_text_rotation_mode.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,11 +1,11 @@ #clf() -from mpl_toolkits.axes_grid.axes_grid import AxesGrid +from mpl_toolkits.axes_grid1.axes_grid import ImageGrid def test_rotation_mode(fig, mode, subplot_location): ha_list = "left center right".split() va_list = "top center baseline bottom".split() - grid = AxesGrid(fig, subplot_location, + grid = ImageGrid(fig, subplot_location, nrows_ncols=(len(va_list), len(ha_list)), share_all=True, aspect=True, #label_mode='1', cbar_mode=None) diff -Nru matplotlib-0.99.3/doc/mpl_examples/pylab_examples/dolphin.py matplotlib-1.0.1/doc/mpl_examples/pylab_examples/dolphin.py --- matplotlib-0.99.3/doc/mpl_examples/pylab_examples/dolphin.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/pylab_examples/dolphin.py 2010-07-07 01:41:55.000000000 +0000 @@ -20,7 +20,7 @@ im = plt.imshow(np.random.random((100, 100)), origin='lower', cmap=cm.winter, interpolation='spline36', - extent=([-1, 1, -1, 1]), zorder=1000) + extent=([-1, 1, -1, 1])) im.set_clip_path(circle) plt.plot(x, y, 'o', color=(0.9, 0.9, 1.0), alpha=0.8) diff -Nru matplotlib-0.99.3/doc/mpl_examples/pylab_examples/errorbar_demo.py matplotlib-1.0.1/doc/mpl_examples/pylab_examples/errorbar_demo.py --- matplotlib-0.99.3/doc/mpl_examples/pylab_examples/errorbar_demo.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/pylab_examples/errorbar_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,46 +1,48 @@ #!/usr/bin/env python -from pylab import * +import numpy as np +import matplotlib.pyplot as plt -t = arange(0.1, 4, 0.1) -s = exp(-t) -e = 0.1*abs(randn(len(s))) -f = 0.1*abs(randn(len(s))) -g = 2*e -h = 2*f +# example data +x = np.arange(0.1, 4, 0.5) +y = np.exp(-x) + +# example variable error bar values +yerr = 0.1 + 0.2*np.sqrt(x) +xerr = 0.1 + yerr + +# First illustrate basic pyplot interface, using defaults where possible. +plt.figure() +plt.errorbar(x, y, xerr=0.2, yerr=0.4) +plt.title("Simplest errorbars, 0.2 in x, 0.4 in y") + +# Now switch to a more OO interface to exercise more features. +fig, axs = plt.subplots(nrows=2, ncols=2, sharex=True) +ax = axs[0,0] +ax.errorbar(x, y, yerr=yerr, fmt='o') +ax.set_title('Vert. symmetric') + +# With 4 subplots, reduce the number of axis ticks to avoid crowding. +ax.locator_params(nbins=4) + +ax = axs[0,1] +ax.errorbar(x, y, xerr=xerr, fmt='o') +ax.set_title('Hor. symmetric') + +ax = axs[1,0] +ax.errorbar(x, y, yerr=[yerr, 2*yerr], xerr=[xerr, 2*xerr], fmt='--o') +ax.set_title('H, V asymmetric') -figure() -errorbar(t, s, e, fmt='o') # vertical symmetric - -figure() -errorbar(t, s, None, f, fmt='o') # horizontal symmetric - -figure() -errorbar(t, s, e, f, fmt='o') # both symmetric - -figure() -errorbar(t, s, [e,g], [f,h], fmt='--o') # both asymmetric - -figure() -errorbar(t, s, [e,g], f, fmt='o', ecolor='g') # both mixed - -figure() -errorbar(t, s, e, [f,h], fmt='o') # both mixed - -figure() -errorbar(t, s, [e,g], fmt='o') # vertical asymmetric +ax = axs[1,1] +ax.set_yscale('log') +# Here we have to be careful to keep all y values positive: +ylower = np.maximum(1e-2, y - yerr) +yerr_lower = y - ylower -figure() -errorbar(t, s, yerr=e, fmt='o') # named +ax.errorbar(x, y, yerr=[yerr_lower, 2*yerr], xerr=xerr, + fmt='o', ecolor='g') +ax.set_title('Mixed sym., log y') -figure() -errorbar(t, s, xerr=f, fmt='o') # named -xlabel('Distance (m)') -ylabel('Height (m)') -title('Mean and standard error as a function of distance') +fig.suptitle('Variable errorbars') -figure() -ax = subplot(111) -ax.set_yscale('log') -errorbar(t, s+2, e, f, fmt='o') # both symmetric +plt.show() -show() diff -Nru matplotlib-0.99.3/doc/mpl_examples/pylab_examples/fancyarrow_demo.py matplotlib-1.0.1/doc/mpl_examples/pylab_examples/fancyarrow_demo.py --- matplotlib-0.99.3/doc/mpl_examples/pylab_examples/fancyarrow_demo.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/pylab_examples/fancyarrow_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -4,7 +4,7 @@ styles = mpatches.ArrowStyle.get_styles() ncol=2 -nrow = len(styles) // ncol + 1 +nrow = (len(styles)+1) // ncol figheight = (nrow+0.5) fig1 = plt.figure(1, (4.*ncol/1.5, figheight/1.5)) fontsize = 0.2 * 70 @@ -15,13 +15,19 @@ ax.set_xlim(0, 4*ncol) ax.set_ylim(0, figheight) +def to_texstring(s): + s = s.replace("<", r"$<$") + s = s.replace(">", r"$>$") + s = s.replace("|", r"$|$") + return s + for i, (stylename, styleclass) in enumerate(sorted(styles.items())): x = 3.2 + (i//nrow)*4 y = (figheight - 0.7 - i%nrow) # /figheight p = mpatches.Circle((x, y), 0.2, fc="w") ax.add_patch(p) - ax.annotate(stylename, (x, y), + ax.annotate(to_texstring(stylename), (x, y), (x-1.2, y), #xycoords="figure fraction", textcoords="figure fraction", ha="right", va="center", diff -Nru matplotlib-0.99.3/doc/mpl_examples/pylab_examples/figimage_demo.py matplotlib-1.0.1/doc/mpl_examples/pylab_examples/figimage_demo.py --- matplotlib-0.99.3/doc/mpl_examples/pylab_examples/figimage_demo.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/pylab_examples/figimage_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,5 +1,6 @@ """ -See pcolor_demo2 for a much faster way of generating pcolor plots +This illustrates placing images directly in the figure, with no axes. + """ import numpy as np import matplotlib @@ -15,13 +16,6 @@ im1 = plt.figimage(Z, xo=50, yo=0, cmap=cm.jet, origin='lower') im2 = plt.figimage(Z, xo=100, yo=100, alpha=.8, cmap=cm.jet, origin='lower') - -if 0: - dpi = 72 - plt.savefig('figimage_%d.png'%dpi, dpi=dpi, facecolor='gray') - plt.savefig('figimage_%d.pdf'%dpi, dpi=dpi, facecolor='gray') - plt.savefig('figimage_%d.svg'%dpi, dpi=dpi, facecolor='gray') - plt.savefig('figimage_%d.eps'%dpi, dpi=dpi, facecolor='gray') plt.show() diff -Nru matplotlib-0.99.3/doc/mpl_examples/pylab_examples/fill_between_demo.py matplotlib-1.0.1/doc/mpl_examples/pylab_examples/fill_between_demo.py --- matplotlib-0.99.3/doc/mpl_examples/pylab_examples/fill_between_demo.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/pylab_examples/fill_between_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -29,16 +29,16 @@ fig = figure() ax = fig.add_subplot(211) ax.plot(x, y1, x, y2, color='black') -ax.fill_between(x, y1, y2, where=y2>=y1, facecolor='green') -ax.fill_between(x, y1, y2, where=y2<=y1, facecolor='red') +ax.fill_between(x, y1, y2, where=y2>=y1, facecolor='green', interpolate=True) +ax.fill_between(x, y1, y2, where=y2<=y1, facecolor='red', interpolate=True) ax.set_title('fill between where') # Test support for masked arrays. y2 = np.ma.masked_greater(y2, 1.0) ax1 = fig.add_subplot(212, sharex=ax) ax1.plot(x, y1, x, y2, color='black') -ax1.fill_between(x, y1, y2, where=y2>=y1, facecolor='green') -ax1.fill_between(x, y1, y2, where=y2<=y1, facecolor='red') +ax1.fill_between(x, y1, y2, where=y2>=y1, facecolor='green', interpolate=True) +ax1.fill_between(x, y1, y2, where=y2<=y1, facecolor='red', interpolate=True) ax1.set_title('Now regions with y2>1 are masked') # This example illustrates a problem; because of the data diff -Nru matplotlib-0.99.3/doc/mpl_examples/pylab_examples/filledmarker_demo.py matplotlib-1.0.1/doc/mpl_examples/pylab_examples/filledmarker_demo.py --- matplotlib-0.99.3/doc/mpl_examples/pylab_examples/filledmarker_demo.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/pylab_examples/filledmarker_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -0,0 +1,38 @@ +import itertools + +import numpy as np +import matplotlib.lines as mlines +import matplotlib.pyplot as plt + +colors = itertools.cycle(['b', 'g', 'r', 'c', 'm', 'y', 'k']) +altcolor = 'lightgreen' + +plt.rcParams['text.usetex'] = False # otherwise, '^' will cause trouble + +y = np.arange(10) +for marker in mlines.Line2D.filled_markers: + f = plt.figure() + f.text(.5,.95, "marker = %r" % marker, ha='center') + for i,fs in enumerate(mlines.Line2D.fillStyles): + color = colors.next() + + ax = f.add_subplot(121) + ax.plot(2*(4-i)+y, c=color, + marker=marker, + markersize=20, + fillstyle=fs, + label=fs) + ax.legend(loc=2) + ax.set_title('fillstyle') + + ax = f.add_subplot(122) + ax.plot(2*(4-i)+y, c=color, + marker=marker, + markersize=20, + markerfacecoloralt=altcolor, + fillstyle=fs, + label=fs) + ax.legend(loc=2) + ax.set_title('fillstyle') + +plt.show() diff -Nru matplotlib-0.99.3/doc/mpl_examples/pylab_examples/finance_demo.py matplotlib-1.0.1/doc/mpl_examples/pylab_examples/finance_demo.py --- matplotlib-0.99.3/doc/mpl_examples/pylab_examples/finance_demo.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/pylab_examples/finance_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,14 +1,13 @@ #!/usr/bin/env python from pylab import * from matplotlib.dates import DateFormatter, WeekdayLocator, HourLocator, \ - DayLocator, MONDAY, timezone + DayLocator, MONDAY from matplotlib.finance import quotes_historical_yahoo, candlestick,\ plot_day_summary, candlestick2 -import datetime - -date1 = datetime.date( 2004, 2, 1) -date2 = datetime.date( 2004, 4, 12 ) +# (Year, month, day) tuples suffice as args for quotes_historical_yahoo +date1 = ( 2004, 2, 1) +date2 = ( 2004, 4, 12 ) mondays = WeekdayLocator(MONDAY) # major ticks on the mondays @@ -16,9 +15,8 @@ weekFormatter = DateFormatter('%b %d') # Eg, Jan 12 dayFormatter = DateFormatter('%d') # Eg, 12 -quotes = quotes_historical_yahoo( - 'INTC', date1, date2) -if not quotes: +quotes = quotes_historical_yahoo('INTC', date1, date2) +if len(quotes) == 0: raise SystemExit fig = figure() diff -Nru matplotlib-0.99.3/doc/mpl_examples/pylab_examples/griddata_demo.py matplotlib-1.0.1/doc/mpl_examples/pylab_examples/griddata_demo.py --- matplotlib-0.99.3/doc/mpl_examples/pylab_examples/griddata_demo.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/pylab_examples/griddata_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -11,15 +11,15 @@ z = x*np.exp(-x**2-y**2) # define grid. xi = np.linspace(-2.1,2.1,100) -yi = np.linspace(-2.1,2.1,100) +yi = np.linspace(-2.1,2.1,200) # grid the data. -zi = griddata(x,y,z,xi,yi) +zi = griddata(x,y,z,xi,yi,interp='linear') # contour the gridded data, plotting dots at the nonuniform data points. CS = plt.contour(xi,yi,zi,15,linewidths=0.5,colors='k') CS = plt.contourf(xi,yi,zi,15,cmap=plt.cm.jet) plt.colorbar() # draw colorbar # plot data points. -plt.scatter(x,y,marker='o',c='b',s=5) +plt.scatter(x,y,marker='o',c='b',s=5,zorder=10) plt.xlim(-2,2) plt.ylim(-2,2) plt.title('griddata test (%d points)' % npts) diff -Nru matplotlib-0.99.3/doc/mpl_examples/pylab_examples/histogram_demo_extended.py matplotlib-1.0.1/doc/mpl_examples/pylab_examples/histogram_demo_extended.py --- matplotlib-0.99.3/doc/mpl_examples/pylab_examples/histogram_demo_extended.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/pylab_examples/histogram_demo_extended.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,4 +1,5 @@ #!/usr/bin/env python +import numpy as np import pylab as P # @@ -63,13 +64,18 @@ # # histogram has the ability to plot multiple data in parallel ... +# Note the new color kwarg, used to override the default, which +# uses the line color cycle. # P.figure() # create a new data-set x = mu + sigma*P.randn(1000,3) -n, bins, patches = P.hist(x, 10, normed=1, histtype='bar') +n, bins, patches = P.hist(x, 10, normed=1, histtype='bar', + color=['crimson', 'burlywood', 'chartreuse'], + label=['Crimson', 'Burlywood', 'Chartreuse']) +P.legend() # # ... or we can stack the data @@ -85,8 +91,20 @@ x1 = mu + sigma*P.randn(7000) x2 = mu + sigma*P.randn(3000) +# and exercise the weights option by arbitrarily giving the first half +# of each series only half the weight of the others: + +w0 = np.ones_like(x0) +w0[:len(x0)/2] = 0.5 +w1 = np.ones_like(x1) +w1[:len(x1)/2] = 0.5 +w2 = np.ones_like(x2) +w0[:len(x2)/2] = 0.5 + + + P.figure() -n, bins, patches = P.hist( [x0,x1,x2], 10, histtype='bar') +n, bins, patches = P.hist( [x0,x1,x2], 10, weights=[w0, w1, w2], histtype='bar') P.show() diff -Nru matplotlib-0.99.3/doc/mpl_examples/pylab_examples/image_demo2.py matplotlib-1.0.1/doc/mpl_examples/pylab_examples/image_demo2.py --- matplotlib-0.99.3/doc/mpl_examples/pylab_examples/image_demo2.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/pylab_examples/image_demo2.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,8 +1,12 @@ #!/usr/bin/env python from pylab import * +import matplotlib.cbook as cbook w, h = 512, 512 -s = file('../data/ct.raw', 'rb').read() + +datafile = cbook.get_sample_data('ct.raw', asfileobj=False) +print 'loading', datafile +s = file(datafile, 'rb').read() A = fromstring(s, uint16).astype(float) A *= 1.0/max(A) A.shape = w, h diff -Nru matplotlib-0.99.3/doc/mpl_examples/pylab_examples/image_demo3.py matplotlib-1.0.1/doc/mpl_examples/pylab_examples/image_demo3.py --- matplotlib-0.99.3/doc/mpl_examples/pylab_examples/image_demo3.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/pylab_examples/image_demo3.py 2010-07-07 01:41:55.000000000 +0000 @@ -5,7 +5,10 @@ except ImportError, exc: raise SystemExit("PIL must be installed to run this example") -lena = Image.open('../data/lena.jpg') +import matplotlib.cbook as cbook + +datafile = cbook.get_sample_data('lena.jpg') +lena = Image.open(datafile) dpi = rcParams['figure.dpi'] figsize = lena.size[0]/dpi, lena.size[1]/dpi diff -Nru matplotlib-0.99.3/doc/mpl_examples/pylab_examples/line_styles.py matplotlib-1.0.1/doc/mpl_examples/pylab_examples/line_styles.py --- matplotlib-0.99.3/doc/mpl_examples/pylab_examples/line_styles.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/pylab_examples/line_styles.py 2010-07-07 01:41:55.000000000 +0000 @@ -17,19 +17,28 @@ except TypeError: pass -styles = linestyles + markers +styles = markers + [ + r'$\lambda$', + r'$\bowtie$', + r'$\circlearrowleft$', + r'$\clubsuit$', + r'$\checkmark$'] colors = ('b', 'g', 'r', 'c', 'm', 'y', 'k') +plt.figure(figsize=(8,8)) axisNum = 0 -for row in range(5): +for row in range(6): for col in range(5): axisNum += 1 - ax = plt.subplot(5, 5, axisNum) - style = styles[axisNum % len(styles) ] - color = colors[axisNum % len(colors) ] - plt.plot(t,s, style + color, markersize=10) + ax = plt.subplot(6, 5, axisNum) + color = colors[axisNum % len(colors)] + if axisNum < len(linestyles): + plt.plot(t, s, linestyles[axisNum], color=color, markersize=10) + else: + style = styles[(axisNum - len(linestyles)) % len(styles)] + plt.plot(t, s, linestyle='None', marker=style, color=color, markersize=10) ax.set_yticklabels([]) ax.set_xticklabels([]) diff -Nru matplotlib-0.99.3/doc/mpl_examples/pylab_examples/load_converter.py matplotlib-1.0.1/doc/mpl_examples/pylab_examples/load_converter.py --- matplotlib-0.99.3/doc/mpl_examples/pylab_examples/load_converter.py 2009-08-03 22:34:34.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/pylab_examples/load_converter.py 2010-07-07 01:41:55.000000000 +0000 @@ -2,9 +2,13 @@ #from matplotlib.mlab import load import numpy as np from pylab import figure, show +import matplotlib.cbook as cbook + +datafile = cbook.get_sample_data('msft.csv', asfileobj=False) +print 'loading', datafile dates, closes = np.loadtxt( - '../data/msft.csv', delimiter=',', + datafile, delimiter=',', converters={0:strpdate2num('%d-%b-%y')}, skiprows=1, usecols=(0,2), unpack=True) diff -Nru matplotlib-0.99.3/doc/mpl_examples/pylab_examples/loadrec.py matplotlib-1.0.1/doc/mpl_examples/pylab_examples/loadrec.py --- matplotlib-0.99.3/doc/mpl_examples/pylab_examples/loadrec.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/pylab_examples/loadrec.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,7 +1,10 @@ from matplotlib import mlab from pylab import figure, show +import matplotlib.cbook as cbook -a = mlab.csv2rec('../data/msft.csv') +datafile = cbook.get_sample_data('msft.csv', asfileobj=False) +print 'loading', datafile +a = mlab.csv2rec(datafile) a.sort() print a.dtype diff -Nru matplotlib-0.99.3/doc/mpl_examples/pylab_examples/logo.py matplotlib-1.0.1/doc/mpl_examples/pylab_examples/logo.py --- matplotlib-0.99.3/doc/mpl_examples/pylab_examples/logo.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/pylab_examples/logo.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,11 +1,13 @@ #!/usr/bin/env python # This file generates the matplotlib web page logo from pylab import * - +import matplotlib.cbook as cbook # convert data to mV -x = 1000*0.1*fromstring( - file('../data/membrane.dat', 'rb').read(), float32) +datafile = cbook.get_sample_data('membrane.dat', asfileobj=False) +print 'loading', datafile + +x = 1000*0.1*fromstring(file(datafile, 'rb').read(), float32) # 0.0005 is the sample interval t = 0.0005*arange(len(x)) figure(1, figsize=(7,1), dpi=100) diff -Nru matplotlib-0.99.3/doc/mpl_examples/pylab_examples/mri_demo.py matplotlib-1.0.1/doc/mpl_examples/pylab_examples/mri_demo.py --- matplotlib-0.99.3/doc/mpl_examples/pylab_examples/mri_demo.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/pylab_examples/mri_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,9 +1,10 @@ #!/usr/bin/env python from pylab import * - +import matplotlib.cbook as cbook # data are 256x256 16 bit integers -dfile = '../data/s1045.ima' -im = fromstring(file(dfile, 'rb').read(), uint16).astype(float) +dfile = cbook.get_sample_data('s1045.ima', asfileobj=False) +print 'loading image', dfile +im = np.fromstring(file(dfile, 'rb').read(), np.uint16).astype(float) im.shape = 256, 256 #imshow(im, ColormapJet(256)) diff -Nru matplotlib-0.99.3/doc/mpl_examples/pylab_examples/mri_with_eeg.py matplotlib-1.0.1/doc/mpl_examples/pylab_examples/mri_with_eeg.py --- matplotlib-0.99.3/doc/mpl_examples/pylab_examples/mri_with_eeg.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/pylab_examples/mri_with_eeg.py 2010-07-07 01:41:55.000000000 +0000 @@ -9,12 +9,13 @@ from matplotlib.pyplot import * from matplotlib.collections import LineCollection - +import matplotlib.cbook as cbook # I use if 1 to break up the different regions of code visually if 1: # load the data # data are 256x256 16 bit integers - dfile = '../data/s1045.ima' + dfile = cbook.get_sample_data('s1045.ima', asfileobj=False) + print 'loading image', dfile im = np.fromstring(file(dfile, 'rb').read(), np.uint16).astype(float) im.shape = 256, 256 @@ -38,7 +39,9 @@ # load the data numSamples, numRows = 800,4 - data = np.fromstring(file('../data/eeg.dat', 'rb').read(), float) + eegfile = cbook.get_sample_data('eeg.dat', asfileobj=False) + print 'loading eeg', eegfile + data = np.fromstring(file(eegfile, 'rb').read(), float) data.shape = numSamples, numRows t = 10.0 * np.arange(numSamples, dtype=float)/numSamples ticklocs = [] diff -Nru matplotlib-0.99.3/doc/mpl_examples/pylab_examples/multicolored_line.py matplotlib-1.0.1/doc/mpl_examples/pylab_examples/multicolored_line.py --- matplotlib-0.99.3/doc/mpl_examples/pylab_examples/multicolored_line.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/pylab_examples/multicolored_line.py 2010-07-07 01:41:55.000000000 +0000 @@ -0,0 +1,53 @@ +#!/usr/bin/env python +''' +Color parts of a line based on its properties, e.g., slope. +''' +import numpy as np +import matplotlib.pyplot as plt +from matplotlib.collections import LineCollection +from matplotlib.colors import ListedColormap, BoundaryNorm + +x = np.linspace(0, 3 * np.pi, 500) +y = np.sin(x) +z = np.cos(0.5 * (x[:-1] + x[1:])) # first derivative + +# Create a colormap for red, green and blue and a norm to color +# f' < -0.5 red, f' > 0.5 blue, and the rest green +cmap = ListedColormap(['r', 'g', 'b']) +norm = BoundaryNorm([-1, -0.5, 0.5, 1], cmap.N) + +# Create a set of line segments so that we can color them individually +# This creates the points as a N x 1 x 2 array so that we can stack points +# together easily to get the segments. The segments array for line collection +# needs to be numlines x points per line x 2 (x and y) +points = np.array([x, y]).T.reshape(-1, 1, 2) +segments = np.concatenate([points[:-1], points[1:]], axis=1) + +# Create the line collection object, setting the colormapping parameters. +# Have to set the actual values used for colormapping separately. +lc = LineCollection(segments, cmap=cmap, norm=norm) +lc.set_array(z) +lc.set_linewidth(3) + +fig1 = plt.figure() +plt.gca().add_collection(lc) +plt.xlim(x.min(), x.max()) +plt.ylim(-1.1, 1.1) + +# Now do a second plot coloring the curve using a continuous colormap +t = np.linspace(0, 10, 200) +x = np.cos(np.pi * t) +y = np.sin(t) +points = np.array([x, y]).T.reshape(-1, 1, 2) +segments = np.concatenate([points[:-1], points[1:]], axis=1) + +lc = LineCollection(segments, cmap=plt.get_cmap('copper'), + norm=plt.Normalize(0, 10)) +lc.set_array(t) +lc.set_linewidth(3) + +fig2 = plt.figure() +plt.gca().add_collection(lc) +plt.xlim(-1, 1) +plt.ylim(-1, 1) +plt.show() diff -Nru matplotlib-0.99.3/doc/mpl_examples/pylab_examples/multi_image.py matplotlib-1.0.1/doc/mpl_examples/pylab_examples/multi_image.py --- matplotlib-0.99.3/doc/mpl_examples/pylab_examples/multi_image.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/pylab_examples/multi_image.py 2010-07-07 01:41:55.000000000 +0000 @@ -5,7 +5,7 @@ It also illustrates colorbar tick labelling with a multiplier. ''' -from matplotlib.pyplot import figure, show, sci +from matplotlib.pyplot import figure, show, axes, sci from matplotlib import cm, colors from matplotlib.font_manager import FontProperties from numpy import amin, amax, ravel @@ -68,9 +68,11 @@ # The colorbar is also based on this master image. fig.colorbar(images[0], cax, orientation='horizontal') -# We need the following only if we want to run this +# We need the following only if we want to run this interactively and +# modify the colormap: -sci(images[0]) +axes(ax[0]) # Return the current axes to the first one, +sci(images[0]) # because the current image must be in current axes. show() diff -Nru matplotlib-0.99.3/doc/mpl_examples/pylab_examples/multipage_pdf.py matplotlib-1.0.1/doc/mpl_examples/pylab_examples/multipage_pdf.py --- matplotlib-0.99.3/doc/mpl_examples/pylab_examples/multipage_pdf.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/pylab_examples/multipage_pdf.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,5 +1,6 @@ # This is a demo of creating a pdf file with several pages. +import datetime import numpy as np import matplotlib from matplotlib.backends.backend_pdf import PdfPages @@ -29,5 +30,14 @@ pdf.savefig(fig) # or you can pass a Figure object to pdf.savefig close() +# We can also set the file's metadata via the PdfPages object: +d = pdf.infodict() +d['Title'] = 'Multipage PDF Example' +d['Author'] = u'Jouni K. Sepp\xe4nen' +d['Subject'] = 'How to create a multipage pdf file and set its metadata' +d['Keywords'] = 'PdfPages multipage keywords author title subject' +d['CreationDate'] = datetime.datetime(2009,11,13) +d['ModDate'] = datetime.datetime.today() + # Remember to close the object - otherwise the file will not be usable pdf.close() diff -Nru matplotlib-0.99.3/doc/mpl_examples/pylab_examples/multiple_yaxis_with_spines.py matplotlib-1.0.1/doc/mpl_examples/pylab_examples/multiple_yaxis_with_spines.py --- matplotlib-0.99.3/doc/mpl_examples/pylab_examples/multiple_yaxis_with_spines.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/pylab_examples/multiple_yaxis_with_spines.py 2010-07-07 01:41:55.000000000 +0000 @@ -0,0 +1,66 @@ +import matplotlib.pyplot as plt + +def make_patch_spines_invisible(ax): + par2.set_frame_on(True) + par2.patch.set_visible(False) + for sp in par2.spines.itervalues(): + sp.set_visible(False) + +def make_spine_invisible(ax, direction): + if direction in ["right", "left"]: + ax.yaxis.set_ticks_position(direction) + ax.yaxis.set_label_position(direction) + elif direction in ["top", "bottom"]: + ax.xaxis.set_ticks_position(direction) + ax.xaxis.set_label_position(direction) + else: + raise ValueError("Unknown Direction : %s" % (direction,)) + + ax.spines[direction].set_visible(True) + + +if 1: + fig = plt.figure(1) + + host = fig.add_subplot(111) + + host.set_xlabel("Distance") + + par1 = host.twinx() + par2 = host.twinx() + + par2.spines["right"].set_position(("axes", 1.2)) + make_patch_spines_invisible(par2) + make_spine_invisible(par2, "right") + + plt.subplots_adjust(right=0.75) + + + p1, = host.plot([0, 1, 2], [0, 1, 2], "b-", label="Density") + p2, = par1.plot([0, 1, 2], [0, 3, 2], "r-", label="Temperature") + p3, = par2.plot([0, 1, 2], [50, 30, 15], "g-", label="Velocity") + + host.set_xlim(0, 2) + host.set_ylim(0, 2) + par1.set_ylim(0, 4) + par2.set_ylim(1, 65) + + host.set_xlabel("Distance") + host.set_ylabel("Density") + par1.set_ylabel("Temperature") + par2.set_ylabel("Velocity") + + host.yaxis.label.set_color(p1.get_color()) + par1.yaxis.label.set_color(p2.get_color()) + par2.yaxis.label.set_color(p3.get_color()) + + tkw = dict(size=4, width=1.5) + host.tick_params(axis='y', colors=p1.get_color(), **tkw) + par1.tick_params(axis='y', colors=p2.get_color(), **tkw) + par2.tick_params(axis='y', colors=p3.get_color(), **tkw) + host.tick_params(axis='x', **tkw) + + lines = [p1, p2, p3] + host.legend(lines, [l.get_label() for l in lines]) + plt.show() + diff -Nru matplotlib-0.99.3/doc/mpl_examples/pylab_examples/patheffect_demo.py matplotlib-1.0.1/doc/mpl_examples/pylab_examples/patheffect_demo.py --- matplotlib-0.99.3/doc/mpl_examples/pylab_examples/patheffect_demo.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/pylab_examples/patheffect_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -0,0 +1,37 @@ +import matplotlib.pyplot as plt +import matplotlib.patheffects as PathEffects +import numpy as np + +if 1: + plt.figure(1, figsize=(8,3)) + ax1 = plt.subplot(131) + ax1.imshow([[1,2],[2,3]]) + txt = ax1.annotate("test", (1., 1.), (0., 0), + arrowprops=dict(arrowstyle="->", + connectionstyle="angle3", lw=2), + size=20, ha="center") + + txt.set_path_effects([PathEffects.withStroke(linewidth=3, + foreground="w")]) + txt.arrow_patch.set_path_effects([PathEffects.Stroke(linewidth=5, + foreground="w"), + PathEffects.Normal()]) + + ax2 = plt.subplot(132) + arr = np.arange(25).reshape((5,5)) + ax2.imshow(arr) + cntr = ax2.contour(arr, colors="k") + clbls = ax2.clabel(cntr, fmt="%2.0f", use_clabeltext=True) + plt.setp(clbls, + path_effects=[PathEffects.withStroke(linewidth=3, + foreground="w")]) + + + # shadow as a path effect + ax3 = plt.subplot(133) + p1, = ax3.plot([0, 1], [0, 1]) + leg = ax3.legend([p1], ["Line 1"], fancybox=True, loc=2) + leg.legendPatch.set_path_effects([PathEffects.withSimplePatchShadow()]) + + plt.show() + diff -Nru matplotlib-0.99.3/doc/mpl_examples/pylab_examples/plotfile_demo.py matplotlib-1.0.1/doc/mpl_examples/pylab_examples/plotfile_demo.py --- matplotlib-0.99.3/doc/mpl_examples/pylab_examples/plotfile_demo.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/pylab_examples/plotfile_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,7 +1,8 @@ from pylab import plotfile, show, gca +import matplotlib.cbook as cbook -fname = '../data/msft.csv' -fname2 = '../data/data_x_x2_x3.csv' +fname = cbook.get_sample_data('msft.csv', asfileobj=False) +fname2 = cbook.get_sample_data('data_x_x2_x3.csv', asfileobj=False) # test 1; use ints plotfile(fname, (0,5,6)) diff -Nru matplotlib-0.99.3/doc/mpl_examples/pylab_examples/polar_demo.py matplotlib-1.0.1/doc/mpl_examples/pylab_examples/polar_demo.py --- matplotlib-0.99.3/doc/mpl_examples/pylab_examples/polar_demo.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/pylab_examples/polar_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -28,7 +28,7 @@ # # you could change the radial bounding box (zoom out) by setting the # ylim (radial coordinate is the second argument to the plot command, -# as in matlab(TM), though this is not advised currently because it is not +# as in MATLAB, though this is not advised currently because it is not # clear to me how the axes should behave in the change of view limits. # Please advise me if you have opinions. Likewise, the pan/zoom # controls probably do not do what you think they do and are better @@ -48,7 +48,7 @@ rc('ytick', labelsize=15) # force square figure and square axes looks better for polar, IMO -width, height = matplotlib.rcParams['figure.figsize'] +width, height = matplotlib.rcParams['figure.figsize'] size = min(width, height) # make a square figure fig = figure(figsize=(size, size)) diff -Nru matplotlib-0.99.3/doc/mpl_examples/pylab_examples/psd_demo3.py matplotlib-1.0.1/doc/mpl_examples/pylab_examples/psd_demo3.py --- matplotlib-0.99.3/doc/mpl_examples/pylab_examples/psd_demo3.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/pylab_examples/psd_demo3.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,6 +1,6 @@ -#This is a ported version of a Matlab example from the signal processing +#This is a ported version of a MATLAB example from the signal processing #toolbox that showed some difference at one time between Matplotlib's and -#MatLab's scaling of the PSD. +#MATLAB's scaling of the PSD. import numpy as np import matplotlib.pyplot as plt diff -Nru matplotlib-0.99.3/doc/mpl_examples/pylab_examples/psd_demo_complex.py matplotlib-1.0.1/doc/mpl_examples/pylab_examples/psd_demo_complex.py --- matplotlib-0.99.3/doc/mpl_examples/pylab_examples/psd_demo_complex.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/pylab_examples/psd_demo_complex.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,6 +1,6 @@ -#This is a ported version of a Matlab example from the signal processing +#This is a ported version of a MATLAB example from the signal processing #toolbox that showed some difference at one time between Matplotlib's and -#MatLab's scaling of the PSD. This differs from psd_demo3.py in that +#MATLAB's scaling of the PSD. This differs from psd_demo3.py in that #this uses a complex signal, so we can see that complex PSD's work properly import numpy as np import matplotlib.pyplot as plt diff -Nru matplotlib-0.99.3/doc/mpl_examples/pylab_examples/psd_demo.py matplotlib-1.0.1/doc/mpl_examples/pylab_examples/psd_demo.py --- matplotlib-0.99.3/doc/mpl_examples/pylab_examples/psd_demo.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/pylab_examples/psd_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -19,7 +19,7 @@ show() """ -% compare with matlab(TM) +% compare with MATLAB dt = 0.01; t = [0:dt:10]; nse = randn(size(t)); diff -Nru matplotlib-0.99.3/doc/mpl_examples/pylab_examples/quadmesh_demo.py matplotlib-1.0.1/doc/mpl_examples/pylab_examples/quadmesh_demo.py --- matplotlib-0.99.3/doc/mpl_examples/pylab_examples/quadmesh_demo.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/pylab_examples/quadmesh_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -11,7 +11,7 @@ from matplotlib import cm, colors from numpy import ma -n = 56 +n = 12 x = np.linspace(-1.5,1.5,n) y = np.linspace(-1.5,1.5,n*2) X,Y = np.meshgrid(x,y); @@ -28,7 +28,7 @@ fig = figure() ax = fig.add_subplot(121) ax.set_axis_bgcolor("#bdb76b") -ax.pcolormesh(Qx,Qz,Z) +ax.pcolormesh(Qx,Qz,Z, shading='gouraud') ax.set_title('Without masked values') ax = fig.add_subplot(122) @@ -38,7 +38,7 @@ #cmap.set_bad('r', 1.0) #ax.pcolormesh(Qx,Qz,Zm, cmap=cmap) # Or use the default, which is transparent: -col = ax.pcolormesh(Qx,Qz,Zm) +col = ax.pcolormesh(Qx,Qz,Zm,shading='gouraud') ax.set_title('With masked values') diff -Nru matplotlib-0.99.3/doc/mpl_examples/pylab_examples/scatter_demo2.py matplotlib-1.0.1/doc/mpl_examples/pylab_examples/scatter_demo2.py --- matplotlib-0.99.3/doc/mpl_examples/pylab_examples/scatter_demo2.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/pylab_examples/scatter_demo2.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,16 +1,17 @@ """ make a scatter plot with varying color and size arguments """ -import matplotlib +import matplotlib import numpy as np import matplotlib.pyplot as plt import matplotlib.mlab as mlab +import matplotlib.cbook as cbook # load a numpy record array from yahoo csv data with fields date, # open, close, volume, adj_close from the mpl-data/example directory. # The record array stores python datetime.date as an object array in # the date column -datafile = matplotlib.get_example_data('goog.npy') +datafile = cbook.get_sample_data('goog.npy') r = np.load(datafile).view(np.recarray) r = r[-250:] # get the most recent 250 trading days diff -Nru matplotlib-0.99.3/doc/mpl_examples/pylab_examples/set_and_get.py matplotlib-1.0.1/doc/mpl_examples/pylab_examples/set_and_get.py --- matplotlib-0.99.3/doc/mpl_examples/pylab_examples/set_and_get.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/pylab_examples/set_and_get.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,6 +1,6 @@ """ -matlab(TM) and pylab allow you to use setp and get to set and get +MATLAB and pylab allow you to use setp and get to set and get object properties, as well as to do introspection on the object set diff -Nru matplotlib-0.99.3/doc/mpl_examples/pylab_examples/shading_example.py matplotlib-1.0.1/doc/mpl_examples/pylab_examples/shading_example.py --- matplotlib-0.99.3/doc/mpl_examples/pylab_examples/shading_example.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/pylab_examples/shading_example.py 2010-07-07 01:41:55.000000000 +0000 @@ -4,14 +4,14 @@ # example showing how to make shaded relief plots # like mathematica -# (http://reference.wolfram.com/mathematica/ref/ReliefPlot.html ) +# (http://reference.wolfram.com/mathematica/ref/ReliefPlot.html) # or Generic Mapping Tools # (http://gmt.soest.hawaii.edu/gmt/doc/gmt/html/GMT_Docs/node145.html) # test data X,Y=np.mgrid[-5:5:0.05,-5:5:0.05] Z=np.sqrt(X**2+Y**2)+np.sin(X**2+Y**2) -# creat light source object. +# create light source object. ls = LightSource(azdeg=0,altdeg=65) # shade data, creating an rgb array. rgb = ls.shade(Z,plt.cm.copper) diff -Nru matplotlib-0.99.3/doc/mpl_examples/pylab_examples/simplification_clipping_test.py matplotlib-1.0.1/doc/mpl_examples/pylab_examples/simplification_clipping_test.py --- matplotlib-0.99.3/doc/mpl_examples/pylab_examples/simplification_clipping_test.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/pylab_examples/simplification_clipping_test.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,72 +0,0 @@ -from pylab import * -import numpy as np -from matplotlib import patches, path -nan = np.nan -Path = path.Path - -t = arange(0.0, 2.0, 0.01) -s = sin(2*pi*t) -plot(t, s, linewidth=1.0) - -ylim((-0.20, -0.28)) - -title('Should see four lines extending from bottom to top') - -figure() - -x = np.array([1.0,2.0,3.0,2.0e5]) -y = np.arange(len(x)) -plot(x,y) -xlim(xmin=2,xmax=6) -title("Should be monotonically increasing") - -figure() - -x = np.array([0.0, 1.0, 0.0, -1.0, 0.0]) -y = np.array([1.0, 0.0, -1.0, 0.0, 1.0]) -plot(x, y) -xlim(xmin=-0.6, xmax=0.6) -ylim(ymin=-0.6, ymax=0.6) -title("Diamond shape, with segments visible in all four corners") - -figure() - -np.random.seed(0) -x = np.random.uniform(size=(5000,)) * 50 - -rcParams['path.simplify'] = True -p1 = plot(x,solid_joinstyle='round',linewidth=2.0) - -path = p1[0].get_path() -transform = p1[0].get_transform() -path = transform.transform_path(path) -simplified = list(path.iter_segments(simplify=(800, 600))) - -title("Original length: %d, simplified length: %d" % (len(path.vertices), len(simplified))) - -figure() - -x = np.sin(np.linspace(0, np.pi * 2.0, 1000)) + np.random.uniform(size=(1000,)) * 0.01 - -rcParams['path.simplify'] = True -p1 = plot(x,solid_joinstyle='round',linewidth=2.0) - -path = p1[0].get_path() -transform = p1[0].get_transform() -path = transform.transform_path(path) -simplified = list(path.iter_segments(simplify=(800, 600))) - -title("Original length: %d, simplified length: %d" % (len(path.vertices), len(simplified))) - -figure() -pp1 = patches.PathPatch( - Path([(0, 0), (1, 0), (1, 1), (nan, 1), (0, 0), (2, 0), (2, 2), (0, 0)], - [Path.MOVETO, Path.CURVE3, Path.CURVE3, Path.CURVE3, Path.CURVE3, Path.CURVE3, Path.CURVE3, Path.CLOSEPOLY]), - fc="none") - -gca().add_patch(pp1) -gca().set_xlim((0, 2)) -gca().set_ylim((0, 2)) -title("Should be one line with two curves below it") - -show() diff -Nru matplotlib-0.99.3/doc/mpl_examples/pylab_examples/spine_placement_demo.py matplotlib-1.0.1/doc/mpl_examples/pylab_examples/spine_placement_demo.py --- matplotlib-0.99.3/doc/mpl_examples/pylab_examples/spine_placement_demo.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/pylab_examples/spine_placement_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -37,6 +37,8 @@ ax.spines['right'].set_color('none') ax.spines['bottom'].set_position('center') ax.spines['top'].set_color('none') +ax.spines['left'].set_smart_bounds(True) +ax.spines['bottom'].set_smart_bounds(True) ax.xaxis.set_ticks_position('bottom') ax.yaxis.set_ticks_position('left') @@ -47,6 +49,8 @@ ax.spines['right'].set_color('none') ax.spines['bottom'].set_position('zero') ax.spines['top'].set_color('none') +ax.spines['left'].set_smart_bounds(True) +ax.spines['bottom'].set_smart_bounds(True) ax.xaxis.set_ticks_position('bottom') ax.yaxis.set_ticks_position('left') @@ -57,6 +61,8 @@ ax.spines['right'].set_color('none') ax.spines['bottom'].set_position(('axes',0.1)) ax.spines['top'].set_color('none') +ax.spines['left'].set_smart_bounds(True) +ax.spines['bottom'].set_smart_bounds(True) ax.xaxis.set_ticks_position('bottom') ax.yaxis.set_ticks_position('left') @@ -67,15 +73,17 @@ ax.spines['right'].set_color('none') ax.spines['bottom'].set_position(('data',2)) ax.spines['top'].set_color('none') +ax.spines['left'].set_smart_bounds(True) +ax.spines['bottom'].set_smart_bounds(True) ax.xaxis.set_ticks_position('bottom') ax.yaxis.set_ticks_position('left') - # ---------------------------------------------------- def adjust_spines(ax,spines): for loc, spine in ax.spines.iteritems(): if loc in spines: spine.set_position(('outward',10)) # outward by 10 points + spine.set_smart_bounds(True) else: spine.set_color('none') # don't draw spine @@ -113,4 +121,37 @@ ax.plot(x,y) adjust_spines(ax,['bottom']) +# ---------------------------------------------------- + +fig = plt.figure() + +x = np.linspace(0,2*np.pi,50) +y = np.sin(x) +y2 = y + 0.1*np.random.normal( size=x.shape ) + +# plot data +ax = fig.add_subplot(1,1,1) +line1,=ax.plot(x,y,'--') +line2,=ax.plot(x,y2,'bo') + +# adjust the spines +adjust_spines(ax,['left','bottom']) + +# set ticks and tick labels +# x +ax.set_xlim((0,2*np.pi)) +ax.set_xticks([0,np.pi,2*np.pi]) +pichr = unichr(0x03C0) +ax.set_xticklabels(['0',pichr,'2 '+pichr]) + +# y +ax.set_yticks([-1,0,1]) + +# disable clipping of data points by axes range +for artist in (line1,line2): + artist.set_clip_on(False) + +# adjust spine to be within ticks +ax.spines['left'].set_bounds( -1, 1 ) + show() diff -Nru matplotlib-0.99.3/doc/mpl_examples/pylab_examples/subplots_demo.py matplotlib-1.0.1/doc/mpl_examples/pylab_examples/subplots_demo.py --- matplotlib-0.99.3/doc/mpl_examples/pylab_examples/subplots_demo.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/pylab_examples/subplots_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -0,0 +1,63 @@ +"""Examples illustrating the use of plt.subplots(). + +This function creates a figure and a grid of subplots with a single call, while +providing reasonable control over how the individual plots are created. For +very refined tuning of subplot creation, you can still use add_subplot() +directly on a new figure. +""" + +import matplotlib.pyplot as plt +import numpy as np + +# Simple data to display in various forms +x = np.linspace(0, 2*np.pi, 400) +y = np.sin(x**2) + +plt.close('all') + +# Just a figure and one subplot +f, ax = plt.subplots() +ax.plot(x, y) +ax.set_title('Simple plot') + +# Two subplots, the axes array is 1-d +f, axarr = plt.subplots(2, sharex=True) +axarr[0].plot(x, y) +axarr[0].set_title('Sharing X axis') +axarr[1].scatter(x, y) + +# Two subplots, unpack the axes array immediately +f, (ax1, ax2) = plt.subplots(1, 2, sharey=True) +ax1.plot(x, y) +ax1.set_title('Sharing Y axis') +ax2.scatter(x, y) + +# Three subplots sharing both x/y axes +f, (ax1, ax2, ax3) = plt.subplots(3, sharex=True, sharey=True) +ax1.plot(x, y) +ax1.set_title('Sharing both axes') +ax2.scatter(x, y) +ax3.scatter(x, 2*y**2-1,color='r') +# Fine-tune figure; make subplots close to each other and hide x ticks for +# all but bottom plot. +f.subplots_adjust(hspace=0) +plt.setp([a.get_xticklabels() for a in f.axes[:-1]], visible=False) + +# Four axes, returned as a 2-d array +f, axarr = plt.subplots(2, 2) +axarr[0,0].plot(x, y) +axarr[0,0].set_title('Axis [0,0]') +axarr[0,1].scatter(x, y) +axarr[0,1].set_title('Axis [0,1]') +axarr[1,0].plot(x, y**2) +axarr[1,0].set_title('Axis [1,0]') +axarr[1,1].scatter(x, y**2) +axarr[1,1].set_title('Axis [1,1]') +# Fine-tune figure; hide x ticks for top plots and y ticks for right plots +plt.setp([a.get_xticklabels() for a in axarr[0,:]], visible=False) +plt.setp([a.get_yticklabels() for a in axarr[:,1]], visible=False) + +# Four polar axes +plt.subplots(2, 2, subplot_kw=dict(polar=True)) + +plt.show() diff -Nru matplotlib-0.99.3/doc/mpl_examples/pylab_examples/tex_demo.py matplotlib-1.0.1/doc/mpl_examples/pylab_examples/tex_demo.py --- matplotlib-0.99.3/doc/mpl_examples/pylab_examples/tex_demo.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/pylab_examples/tex_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -29,5 +29,5 @@ title(r"\TeX\ is Number $\displaystyle\sum_{n=1}^\infty\frac{-e^{i\pi}}{2^n}$!", fontsize=16, color='r') grid(True) - +savefig('tex_demo') show() diff -Nru matplotlib-0.99.3/doc/mpl_examples/pylab_examples/text_handles.py matplotlib-1.0.1/doc/mpl_examples/pylab_examples/text_handles.py --- matplotlib-0.99.3/doc/mpl_examples/pylab_examples/text_handles.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/pylab_examples/text_handles.py 2010-07-07 01:41:55.000000000 +0000 @@ -2,7 +2,7 @@ #Controlling the properties of axis text using handles # See examples/text_themes.py for a more elegant, pythonic way to control -# fonts. After all, if we were slaves to matlab(TM) , we wouldn't be +# fonts. After all, if we were slaves to MATLAB , we wouldn't be # using python! from pylab import * diff -Nru matplotlib-0.99.3/doc/mpl_examples/pylab_examples/to_numeric.py matplotlib-1.0.1/doc/mpl_examples/pylab_examples/to_numeric.py --- matplotlib-0.99.3/doc/mpl_examples/pylab_examples/to_numeric.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/pylab_examples/to_numeric.py 2010-07-07 01:41:55.000000000 +0000 @@ -29,5 +29,5 @@ X.shape = h, w, 3 im = Image.fromstring( "RGB", (w,h), s) -im.show() +# im.show() diff -Nru matplotlib-0.99.3/doc/mpl_examples/pylab_examples/tricontour_demo.py matplotlib-1.0.1/doc/mpl_examples/pylab_examples/tricontour_demo.py --- matplotlib-0.99.3/doc/mpl_examples/pylab_examples/tricontour_demo.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/pylab_examples/tricontour_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -0,0 +1,98 @@ +""" +Contour plots of unstructured triangular grids. +""" +import matplotlib.pyplot as plt +import matplotlib.tri as tri +import numpy as np +import math + +# Creating a Triangulation without specifying the triangles results in the +# Delaunay triangulation of the points. + +# First create the x and y coordinates of the points. +n_angles = 48 +n_radii = 8 +min_radius = 0.25 +radii = np.linspace(min_radius, 0.95, n_radii) + +angles = np.linspace(0, 2*math.pi, n_angles, endpoint=False) +angles = np.repeat(angles[...,np.newaxis], n_radii, axis=1) +angles[:,1::2] += math.pi/n_angles + +x = (radii*np.cos(angles)).flatten() +y = (radii*np.sin(angles)).flatten() +z = (np.cos(radii)*np.cos(angles*3.0)).flatten() + +# Create the Triangulation; no triangles so Delaunay triangulation created. +triang = tri.Triangulation(x, y) + +# Mask off unwanted triangles. +xmid = x[triang.triangles].mean(axis=1) +ymid = y[triang.triangles].mean(axis=1) +mask = np.where(xmid*xmid + ymid*ymid < min_radius*min_radius, 1, 0) +triang.set_mask(mask) + +# pcolor plot. +plt.figure() +plt.gca().set_aspect('equal') +plt.tricontourf(triang, z) +plt.colorbar() +plt.tricontour(triang, z, colors='k') +plt.title('Contour plot of Delaunay triangulation') + +# You can specify your own triangulation rather than perform a Delaunay +# triangulation of the points, where each triangle is given by the indices of +# the three points that make up the triangle, ordered in either a clockwise or +# anticlockwise manner. + +xy = np.asarray([ + [-0.101,0.872],[-0.080,0.883],[-0.069,0.888],[-0.054,0.890],[-0.045,0.897], + [-0.057,0.895],[-0.073,0.900],[-0.087,0.898],[-0.090,0.904],[-0.069,0.907], + [-0.069,0.921],[-0.080,0.919],[-0.073,0.928],[-0.052,0.930],[-0.048,0.942], + [-0.062,0.949],[-0.054,0.958],[-0.069,0.954],[-0.087,0.952],[-0.087,0.959], + [-0.080,0.966],[-0.085,0.973],[-0.087,0.965],[-0.097,0.965],[-0.097,0.975], + [-0.092,0.984],[-0.101,0.980],[-0.108,0.980],[-0.104,0.987],[-0.102,0.993], + [-0.115,1.001],[-0.099,0.996],[-0.101,1.007],[-0.090,1.010],[-0.087,1.021], + [-0.069,1.021],[-0.052,1.022],[-0.052,1.017],[-0.069,1.010],[-0.064,1.005], + [-0.048,1.005],[-0.031,1.005],[-0.031,0.996],[-0.040,0.987],[-0.045,0.980], + [-0.052,0.975],[-0.040,0.973],[-0.026,0.968],[-0.020,0.954],[-0.006,0.947], + [ 0.003,0.935],[ 0.006,0.926],[ 0.005,0.921],[ 0.022,0.923],[ 0.033,0.912], + [ 0.029,0.905],[ 0.017,0.900],[ 0.012,0.895],[ 0.027,0.893],[ 0.019,0.886], + [ 0.001,0.883],[-0.012,0.884],[-0.029,0.883],[-0.038,0.879],[-0.057,0.881], + [-0.062,0.876],[-0.078,0.876],[-0.087,0.872],[-0.030,0.907],[-0.007,0.905], + [-0.057,0.916],[-0.025,0.933],[-0.077,0.990],[-0.059,0.993] ]) +x = xy[:,0]*180/3.14159 +y = xy[:,1]*180/3.14159 +x0 = -5 +y0 = 52 +z = np.exp(-0.01*( (x-x0)*(x-x0) + (y-y0)*(y-y0) )) + +triangles = np.asarray([ + [67,66, 1],[65, 2,66],[ 1,66, 2],[64, 2,65],[63, 3,64],[60,59,57], + [ 2,64, 3],[ 3,63, 4],[ 0,67, 1],[62, 4,63],[57,59,56],[59,58,56], + [61,60,69],[57,69,60],[ 4,62,68],[ 6, 5, 9],[61,68,62],[69,68,61], + [ 9, 5,70],[ 6, 8, 7],[ 4,70, 5],[ 8, 6, 9],[56,69,57],[69,56,52], + [70,10, 9],[54,53,55],[56,55,53],[68,70, 4],[52,56,53],[11,10,12], + [69,71,68],[68,13,70],[10,70,13],[51,50,52],[13,68,71],[52,71,69], + [12,10,13],[71,52,50],[71,14,13],[50,49,71],[49,48,71],[14,16,15], + [14,71,48],[17,19,18],[17,20,19],[48,16,14],[48,47,16],[47,46,16], + [16,46,45],[23,22,24],[21,24,22],[17,16,45],[20,17,45],[21,25,24], + [27,26,28],[20,72,21],[25,21,72],[45,72,20],[25,28,26],[44,73,45], + [72,45,73],[28,25,29],[29,25,31],[43,73,44],[73,43,40],[72,73,39], + [72,31,25],[42,40,43],[31,30,29],[39,73,40],[42,41,40],[72,33,31], + [32,31,33],[39,38,72],[33,72,38],[33,38,34],[37,35,38],[34,38,35], + [35,37,36] ]) + +# Rather than create a Triangulation object, can simply pass x, y and triangles +# arrays to tripcolor directly. It would be better to use a Triangulation object +# if the same triangulation was to be used more than once to save duplicated +# calculations. +plt.figure() +plt.gca().set_aspect('equal') +plt.tricontourf(x, y, triangles, z) +plt.colorbar() +plt.title('Contour plot of user-specified triangulation') +plt.xlabel('Longitude (degrees)') +plt.ylabel('Latitude (degrees)') + +plt.show() diff -Nru matplotlib-0.99.3/doc/mpl_examples/pylab_examples/tricontour_vs_griddata.py matplotlib-1.0.1/doc/mpl_examples/pylab_examples/tricontour_vs_griddata.py --- matplotlib-0.99.3/doc/mpl_examples/pylab_examples/tricontour_vs_griddata.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/pylab_examples/tricontour_vs_griddata.py 2010-07-07 01:41:55.000000000 +0000 @@ -0,0 +1,47 @@ +""" +Comparison of griddata and tricontour for an unstructured triangular grid. +""" +import matplotlib.pyplot as plt +import matplotlib.tri as tri +import numpy as np +from numpy.random import uniform, seed +from matplotlib.mlab import griddata +import time + +seed(0) +npts = 200 +ngridx = 100 +ngridy = 200 +x = uniform(-2,2,npts) +y = uniform(-2,2,npts) +z = x*np.exp(-x**2-y**2) + +# griddata and contour. +start = time.clock() +plt.subplot(211) +xi = np.linspace(-2.1,2.1,ngridx) +yi = np.linspace(-2.1,2.1,ngridy) +zi = griddata(x,y,z,xi,yi,interp='linear') +plt.contour(xi,yi,zi,15,linewidths=0.5,colors='k') +plt.contourf(xi,yi,zi,15,cmap=plt.cm.jet) +plt.colorbar() # draw colorbar +plt.plot(x, y, 'ko', ms=3) +plt.xlim(-2,2) +plt.ylim(-2,2) +plt.title('griddata and contour (%d points, %d grid points)' % (npts, ngridx*ngridy)) +print 'griddata and contour seconds:', time.clock() - start + +# tricontour. +start = time.clock() +plt.subplot(212) +triang = tri.Triangulation(x, y) +plt.tricontour(x, y, z, 15, linewidths=0.5, colors='k') +plt.tricontourf(x, y, z, 15, cmap=plt.cm.jet) +plt.colorbar() +plt.plot(x, y, 'ko', ms=3) +plt.xlim(-2,2) +plt.ylim(-2,2) +plt.title('tricontour (%d points)' % npts) +print 'tricontour seconds:', time.clock() - start + +plt.show() diff -Nru matplotlib-0.99.3/doc/mpl_examples/pylab_examples/tripcolor_demo.py matplotlib-1.0.1/doc/mpl_examples/pylab_examples/tripcolor_demo.py --- matplotlib-0.99.3/doc/mpl_examples/pylab_examples/tripcolor_demo.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/pylab_examples/tripcolor_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -0,0 +1,98 @@ +""" +Pseudocolor plots of unstructured triangular grids. +""" +import matplotlib.pyplot as plt +import matplotlib.tri as tri +import numpy as np +import math + +# Creating a Triangulation without specifying the triangles results in the +# Delaunay triangulation of the points. + +# First create the x and y coordinates of the points. +n_angles = 36 +n_radii = 8 +min_radius = 0.25 +radii = np.linspace(min_radius, 0.95, n_radii) + +angles = np.linspace(0, 2*math.pi, n_angles, endpoint=False) +angles = np.repeat(angles[...,np.newaxis], n_radii, axis=1) +angles[:,1::2] += math.pi/n_angles + +x = (radii*np.cos(angles)).flatten() +y = (radii*np.sin(angles)).flatten() +z = (np.cos(radii)*np.cos(angles*3.0)).flatten() + +# Create the Triangulation; no triangles so Delaunay triangulation created. +triang = tri.Triangulation(x, y) + +# Mask off unwanted triangles. +xmid = x[triang.triangles].mean(axis=1) +ymid = y[triang.triangles].mean(axis=1) +mask = np.where(xmid*xmid + ymid*ymid < min_radius*min_radius, 1, 0) +triang.set_mask(mask) + +# pcolor plot. +plt.figure() +plt.gca().set_aspect('equal') +plt.tripcolor(triang, z, shading='faceted') +plt.colorbar() +plt.title('tripcolor of Delaunay triangulation') + + +# You can specify your own triangulation rather than perform a Delaunay +# triangulation of the points, where each triangle is given by the indices of +# the three points that make up the triangle, ordered in either a clockwise or +# anticlockwise manner. + +xy = np.asarray([ + [-0.101,0.872],[-0.080,0.883],[-0.069,0.888],[-0.054,0.890],[-0.045,0.897], + [-0.057,0.895],[-0.073,0.900],[-0.087,0.898],[-0.090,0.904],[-0.069,0.907], + [-0.069,0.921],[-0.080,0.919],[-0.073,0.928],[-0.052,0.930],[-0.048,0.942], + [-0.062,0.949],[-0.054,0.958],[-0.069,0.954],[-0.087,0.952],[-0.087,0.959], + [-0.080,0.966],[-0.085,0.973],[-0.087,0.965],[-0.097,0.965],[-0.097,0.975], + [-0.092,0.984],[-0.101,0.980],[-0.108,0.980],[-0.104,0.987],[-0.102,0.993], + [-0.115,1.001],[-0.099,0.996],[-0.101,1.007],[-0.090,1.010],[-0.087,1.021], + [-0.069,1.021],[-0.052,1.022],[-0.052,1.017],[-0.069,1.010],[-0.064,1.005], + [-0.048,1.005],[-0.031,1.005],[-0.031,0.996],[-0.040,0.987],[-0.045,0.980], + [-0.052,0.975],[-0.040,0.973],[-0.026,0.968],[-0.020,0.954],[-0.006,0.947], + [ 0.003,0.935],[ 0.006,0.926],[ 0.005,0.921],[ 0.022,0.923],[ 0.033,0.912], + [ 0.029,0.905],[ 0.017,0.900],[ 0.012,0.895],[ 0.027,0.893],[ 0.019,0.886], + [ 0.001,0.883],[-0.012,0.884],[-0.029,0.883],[-0.038,0.879],[-0.057,0.881], + [-0.062,0.876],[-0.078,0.876],[-0.087,0.872],[-0.030,0.907],[-0.007,0.905], + [-0.057,0.916],[-0.025,0.933],[-0.077,0.990],[-0.059,0.993] ]) +x = xy[:,0]*180/3.14159 +y = xy[:,1]*180/3.14159 +x0 = -5 +y0 = 52 +z = np.exp(-0.01*( (x-x0)*(x-x0) + (y-y0)*(y-y0) )) + +triangles = np.asarray([ + [67,66, 1],[65, 2,66],[ 1,66, 2],[64, 2,65],[63, 3,64],[60,59,57], + [ 2,64, 3],[ 3,63, 4],[ 0,67, 1],[62, 4,63],[57,59,56],[59,58,56], + [61,60,69],[57,69,60],[ 4,62,68],[ 6, 5, 9],[61,68,62],[69,68,61], + [ 9, 5,70],[ 6, 8, 7],[ 4,70, 5],[ 8, 6, 9],[56,69,57],[69,56,52], + [70,10, 9],[54,53,55],[56,55,53],[68,70, 4],[52,56,53],[11,10,12], + [69,71,68],[68,13,70],[10,70,13],[51,50,52],[13,68,71],[52,71,69], + [12,10,13],[71,52,50],[71,14,13],[50,49,71],[49,48,71],[14,16,15], + [14,71,48],[17,19,18],[17,20,19],[48,16,14],[48,47,16],[47,46,16], + [16,46,45],[23,22,24],[21,24,22],[17,16,45],[20,17,45],[21,25,24], + [27,26,28],[20,72,21],[25,21,72],[45,72,20],[25,28,26],[44,73,45], + [72,45,73],[28,25,29],[29,25,31],[43,73,44],[73,43,40],[72,73,39], + [72,31,25],[42,40,43],[31,30,29],[39,73,40],[42,41,40],[72,33,31], + [32,31,33],[39,38,72],[33,72,38],[33,38,34],[37,35,38],[34,38,35], + [35,37,36] ]) + +# Rather than create a Triangulation object, can simply pass x, y and triangles +# arrays to tripcolor directly. It would be better to use a Triangulation object +# if the same triangulation was to be used more than once to save duplicated +# calculations. +plt.figure() +plt.gca().set_aspect('equal') +plt.tripcolor(x, y, triangles, z, shading='faceted') +plt.colorbar() +plt.title('tripcolor of user-specified triangulation') +plt.xlabel('Longitude (degrees)') +plt.ylabel('Latitude (degrees)') + +plt.show() diff -Nru matplotlib-0.99.3/doc/mpl_examples/pylab_examples/triplot_demo.py matplotlib-1.0.1/doc/mpl_examples/pylab_examples/triplot_demo.py --- matplotlib-0.99.3/doc/mpl_examples/pylab_examples/triplot_demo.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/pylab_examples/triplot_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -0,0 +1,92 @@ +""" +Creating and plotting unstructured triangular grids. +""" +import matplotlib.pyplot as plt +import matplotlib.tri as tri +import numpy as np +import math + +# Creating a Triangulation without specifying the triangles results in the +# Delaunay triangulation of the points. + +# First create the x and y coordinates of the points. +n_angles = 36 +n_radii = 8 +min_radius = 0.25 +radii = np.linspace(min_radius, 0.95, n_radii) + +angles = np.linspace(0, 2*math.pi, n_angles, endpoint=False) +angles = np.repeat(angles[...,np.newaxis], n_radii, axis=1) +angles[:,1::2] += math.pi/n_angles + +x = (radii*np.cos(angles)).flatten() +y = (radii*np.sin(angles)).flatten() + +# Create the Triangulation; no triangles so Delaunay triangulation created. +triang = tri.Triangulation(x, y) + +# Mask off unwanted triangles. +xmid = x[triang.triangles].mean(axis=1) +ymid = y[triang.triangles].mean(axis=1) +mask = np.where(xmid*xmid + ymid*ymid < min_radius*min_radius, 1, 0) +triang.set_mask(mask) + +# Plot the triangulation. +plt.figure() +plt.gca().set_aspect('equal') +plt.triplot(triang, 'bo-') +plt.title('triplot of Delaunay triangulation') + + +# You can specify your own triangulation rather than perform a Delaunay +# triangulation of the points, where each triangle is given by the indices of +# the three points that make up the triangle, ordered in either a clockwise or +# anticlockwise manner. + +xy = np.asarray([ + [-0.101,0.872],[-0.080,0.883],[-0.069,0.888],[-0.054,0.890],[-0.045,0.897], + [-0.057,0.895],[-0.073,0.900],[-0.087,0.898],[-0.090,0.904],[-0.069,0.907], + [-0.069,0.921],[-0.080,0.919],[-0.073,0.928],[-0.052,0.930],[-0.048,0.942], + [-0.062,0.949],[-0.054,0.958],[-0.069,0.954],[-0.087,0.952],[-0.087,0.959], + [-0.080,0.966],[-0.085,0.973],[-0.087,0.965],[-0.097,0.965],[-0.097,0.975], + [-0.092,0.984],[-0.101,0.980],[-0.108,0.980],[-0.104,0.987],[-0.102,0.993], + [-0.115,1.001],[-0.099,0.996],[-0.101,1.007],[-0.090,1.010],[-0.087,1.021], + [-0.069,1.021],[-0.052,1.022],[-0.052,1.017],[-0.069,1.010],[-0.064,1.005], + [-0.048,1.005],[-0.031,1.005],[-0.031,0.996],[-0.040,0.987],[-0.045,0.980], + [-0.052,0.975],[-0.040,0.973],[-0.026,0.968],[-0.020,0.954],[-0.006,0.947], + [ 0.003,0.935],[ 0.006,0.926],[ 0.005,0.921],[ 0.022,0.923],[ 0.033,0.912], + [ 0.029,0.905],[ 0.017,0.900],[ 0.012,0.895],[ 0.027,0.893],[ 0.019,0.886], + [ 0.001,0.883],[-0.012,0.884],[-0.029,0.883],[-0.038,0.879],[-0.057,0.881], + [-0.062,0.876],[-0.078,0.876],[-0.087,0.872],[-0.030,0.907],[-0.007,0.905], + [-0.057,0.916],[-0.025,0.933],[-0.077,0.990],[-0.059,0.993] ]) +x = xy[:,0]*180/3.14159 +y = xy[:,1]*180/3.14159 + +triangles = np.asarray([ + [67,66, 1],[65, 2,66],[ 1,66, 2],[64, 2,65],[63, 3,64],[60,59,57], + [ 2,64, 3],[ 3,63, 4],[ 0,67, 1],[62, 4,63],[57,59,56],[59,58,56], + [61,60,69],[57,69,60],[ 4,62,68],[ 6, 5, 9],[61,68,62],[69,68,61], + [ 9, 5,70],[ 6, 8, 7],[ 4,70, 5],[ 8, 6, 9],[56,69,57],[69,56,52], + [70,10, 9],[54,53,55],[56,55,53],[68,70, 4],[52,56,53],[11,10,12], + [69,71,68],[68,13,70],[10,70,13],[51,50,52],[13,68,71],[52,71,69], + [12,10,13],[71,52,50],[71,14,13],[50,49,71],[49,48,71],[14,16,15], + [14,71,48],[17,19,18],[17,20,19],[48,16,14],[48,47,16],[47,46,16], + [16,46,45],[23,22,24],[21,24,22],[17,16,45],[20,17,45],[21,25,24], + [27,26,28],[20,72,21],[25,21,72],[45,72,20],[25,28,26],[44,73,45], + [72,45,73],[28,25,29],[29,25,31],[43,73,44],[73,43,40],[72,73,39], + [72,31,25],[42,40,43],[31,30,29],[39,73,40],[42,41,40],[72,33,31], + [32,31,33],[39,38,72],[33,72,38],[33,38,34],[37,35,38],[34,38,35], + [35,37,36] ]) + +# Rather than create a Triangulation object, can simply pass x, y and triangles +# arrays to triplot directly. It would be better to use a Triangulation object +# if the same triangulation was to be used more than once to save duplicated +# calculations. +plt.figure() +plt.gca().set_aspect('equal') +plt.triplot(x, y, triangles, 'go-') +plt.title('triplot of user-specified triangulation') +plt.xlabel('Longitude (degrees)') +plt.ylabel('Latitude (degrees)') + +plt.show() diff -Nru matplotlib-0.99.3/doc/mpl_examples/pylab_examples/usetex_demo.py matplotlib-1.0.1/doc/mpl_examples/pylab_examples/usetex_demo.py --- matplotlib-0.99.3/doc/mpl_examples/pylab_examples/usetex_demo.py 2009-07-31 15:51:41.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/pylab_examples/usetex_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -41,8 +41,8 @@ pylab.yticks((0, 0.5, 1), ('0', '.5', '1'), color = 'k', size = 20) ## Right Y-axis labels -pylab.text(1.05, 0.5, r"\bf{level set} $\phi$", {'color' : 'g', 'fontsize' : 20}, - horizontalalignment = 'left', +pylab.text(1.05, 0.5, r"\bf{level set} $\phi$", {'color' : 'g', 'fontsize' : 20}, + horizontalalignment = 'left', verticalalignment = 'center', rotation = 90, clip_on = False) diff -Nru matplotlib-0.99.3/doc/mpl_examples/tests/backend_driver.py matplotlib-1.0.1/doc/mpl_examples/tests/backend_driver.py --- matplotlib-0.99.3/doc/mpl_examples/tests/backend_driver.py 2009-08-03 22:34:34.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/tests/backend_driver.py 2010-07-07 01:41:54.000000000 +0000 @@ -181,7 +181,6 @@ 'shared_axis_across_figures.py', 'shared_axis_demo.py', 'simple_plot.py', - 'simplification_clipping_test.py', 'specgram_demo.py', 'spine_placement_demo.py', 'spy_demos.py', @@ -336,7 +335,6 @@ for fullpath in testcases: print ('\tdriving %-40s' % (fullpath)), sys.stdout.flush() - fpath, fname = os.path.split(fullpath) if fname in exclude: @@ -362,6 +360,8 @@ 'import matplotlib\n', 'matplotlib.use("%s")\n' % backend, 'from pylab import savefig\n', + 'import numpy\n', + 'numpy.seterr(invalid="ignore")\n', )) for line in file(fullpath): line_lstrip = line.lstrip() @@ -389,7 +389,7 @@ return failures def parse_options(): - doc = __doc__.split('\n\n') + doc = (__doc__ and __doc__.split('\n\n')) or " " op = OptionParser(description=doc[0].strip(), usage='%prog [options] [--] [backends and switches]', #epilog='\n'.join(doc[1:]) # epilog not supported on my python2.4 machine: JDH diff -Nru matplotlib-0.99.3/doc/mpl_examples/units/date_converter.py matplotlib-1.0.1/doc/mpl_examples/units/date_converter.py --- matplotlib-0.99.3/doc/mpl_examples/units/date_converter.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/units/date_converter.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,20 +0,0 @@ -import date_support # set up the date converters -import datetime -from matplotlib.dates import drange -from pylab import figure, show -import numpy as np - - -xmin = datetime.date(2007,1,1) -xmax = datetime.date.today() -delta = datetime.timedelta(days=1) -xdates = drange(xmin, xmax, delta) - -fig = figure() -fig.subplots_adjust(bottom=0.2) -ax = fig.add_subplot(111) -ax.plot(xdates, np.random.rand(len(xdates)), 'o') -ax.set_xlim(datetime.date(2007,2,1), datetime.date(2007,3,1)) - -fig.autofmt_xdate() -show() diff -Nru matplotlib-0.99.3/doc/mpl_examples/units/date_support.py matplotlib-1.0.1/doc/mpl_examples/units/date_support.py --- matplotlib-0.99.3/doc/mpl_examples/units/date_support.py 2009-07-31 15:14:44.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/units/date_support.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,36 +0,0 @@ -import matplotlib -matplotlib.rcParams['units'] = True -from matplotlib.cbook import iterable, is_numlike -import matplotlib.units as units -import matplotlib.dates as dates -import matplotlib.ticker as ticker -import datetime - -class DateConverter(units.ConversionInterface): - - @staticmethod - def axisinfo(unit, axis): - 'return the unit AxisInfo' - if unit=='date': - majloc = dates.AutoDateLocator() - majfmt = dates.AutoDateFormatter(majloc) - return units.AxisInfo( - majloc = majloc, - majfmt = majfmt, - label='date', - ) - else: return None - - @staticmethod - def convert(value, unit, axis): - if units.ConversionInterface.is_numlike(value): return value - return dates.date2num(value) - - @staticmethod - def default_units(x, axis): - 'return the default unit for x or None' - return 'date' - - -units.registry[datetime.date] = DateConverter() -units.registry[datetime.datetime] = DateConverter() diff -Nru matplotlib-0.99.3/doc/mpl_examples/user_interfaces/embedding_in_wx3.py matplotlib-1.0.1/doc/mpl_examples/user_interfaces/embedding_in_wx3.py --- matplotlib-0.99.3/doc/mpl_examples/user_interfaces/embedding_in_wx3.py 2009-07-31 15:14:44.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/user_interfaces/embedding_in_wx3.py 2010-07-07 01:41:53.000000000 +0000 @@ -27,6 +27,7 @@ import matplotlib matplotlib.use('WXAgg') import matplotlib.cm as cm +import matplotlib.cbook as cbook from matplotlib.backends.backend_wxagg import Toolbar, FigureCanvasWxAgg from matplotlib.figure import Figure import numpy as npy @@ -101,8 +102,9 @@ class MyApp(wx.App): def OnInit(self): - xrcfile = os.path.join(os.path.dirname(__file__),"..","data", - "embedding_in_wx3.xrc") + xrcfile = cbook.get_sample_data('embedding_in_wx3.xrc', asfileobj=False) + print 'loading', xrcfile + self.res = xrc.XmlResource(xrcfile) # main frame and panel --------- diff -Nru matplotlib-0.99.3/doc/mpl_examples/user_interfaces/interactive2.py matplotlib-1.0.1/doc/mpl_examples/user_interfaces/interactive2.py --- matplotlib-0.99.3/doc/mpl_examples/user_interfaces/interactive2.py 2009-07-31 15:14:44.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/user_interfaces/interactive2.py 2010-07-07 01:41:53.000000000 +0000 @@ -25,7 +25,7 @@ Welcome to matplotlib. - help(matplotlib) -- shows a list of all matlab(TM) compatible commands provided + help(matplotlib) -- some general information about matplotlib help(plotting) -- shows a list of plot specific commands """ diff -Nru matplotlib-0.99.3/doc/mpl_examples/user_interfaces/interactive.py matplotlib-1.0.1/doc/mpl_examples/user_interfaces/interactive.py --- matplotlib-0.99.3/doc/mpl_examples/user_interfaces/interactive.py 2009-07-31 15:14:44.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/user_interfaces/interactive.py 2010-07-07 01:41:53.000000000 +0000 @@ -1,6 +1,11 @@ #!/usr/bin/env python """Multithreaded interactive interpreter with GTK and Matplotlib support. +WARNING: +As of 2010/06/25, this is not working, at least on Linux. +I have disabled it as a runnable script. - EF + + Usage: pyint-gtk.py -> starts shell with gtk thread running separately @@ -183,7 +188,7 @@ specific GTK hooks in it.""" def __init__(self,banner=None): - banner = """\nWelcome to matplotlib, a matlab-like python environment. + banner = """\nWelcome to matplotlib, a MATLAB-like python environment. help(matlab) -> help on matlab compatible commands from matplotlib. help(plotting) -> help on plotting commands. """ @@ -221,6 +226,9 @@ matplotlib.interactive(1) # turn on interaction if __name__ == '__main__': + print "This demo is not presently functional, so running" + print "it as a script has been disabled." + sys.exit() # Quick sys.argv hack to extract the option and leave filenames in sys.argv. # For real option handling, use optparse or getopt. if len(sys.argv) > 1 and sys.argv[1]=='-pylab': diff -Nru matplotlib-0.99.3/doc/mpl_examples/user_interfaces/rec_edit_gtk_custom.py matplotlib-1.0.1/doc/mpl_examples/user_interfaces/rec_edit_gtk_custom.py --- matplotlib-0.99.3/doc/mpl_examples/user_interfaces/rec_edit_gtk_custom.py 2009-07-31 15:14:44.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/user_interfaces/rec_edit_gtk_custom.py 2010-07-07 01:41:53.000000000 +0000 @@ -6,9 +6,12 @@ import gtk import numpy as np import matplotlib.mlab as mlab +import matplotlib.cbook as cbook import mpl_toolkits.gtktools as gtktools -r = mlab.csv2rec('data/demodata.csv', converterd={'weekdays':str}) + +datafile = cbook.get_sample_data('demodata.csv', asfileobj=False) +r = mlab.csv2rec(datafile, converterd={'weekdays':str}) formatd = mlab.get_formatd(r) diff -Nru matplotlib-0.99.3/doc/mpl_examples/user_interfaces/rec_edit_gtk_simple.py matplotlib-1.0.1/doc/mpl_examples/user_interfaces/rec_edit_gtk_simple.py --- matplotlib-0.99.3/doc/mpl_examples/user_interfaces/rec_edit_gtk_simple.py 2009-07-31 15:14:44.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/user_interfaces/rec_edit_gtk_simple.py 2010-07-07 01:41:53.000000000 +0000 @@ -5,9 +5,11 @@ import gtk import numpy as np import matplotlib.mlab as mlab +import matplotlib.cbook as cbook import mpl_toolkits.gtktools as gtktools -r = mlab.csv2rec('data/demodata.csv', converterd={'weekdays':str}) +datafile = cbook.get_sample_data('demodata.csv', asfileobj=False) +r = mlab.csv2rec(datafile, converterd={'weekdays':str}) liststore, treeview, win = gtktools.edit_recarray(r) win.set_title('click to edit') diff -Nru matplotlib-0.99.3/doc/mpl_examples/widgets/buttons.py matplotlib-1.0.1/doc/mpl_examples/widgets/buttons.py --- matplotlib-0.99.3/doc/mpl_examples/widgets/buttons.py 2009-07-31 15:14:49.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/widgets/buttons.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,38 +1,40 @@ -from pylab import * + +import numpy as np +import matplotlib.pyplot as plt from matplotlib.widgets import Button -freqs = arange(2,20,3) +freqs = np.arange(2, 20, 3) -ax = subplot(111) -subplots_adjust(bottom=0.2) -t = arange(0.0, 1.0, 0.001) -s = sin(2*pi*freqs[0]*t) -l, = plot(t,s, lw=2) +ax = plt.subplot(111) +plt.subplots_adjust(bottom=0.2) +t = np.arange(0.0, 1.0, 0.001) +s = np.sin(2*np.pi*freqs[0]*t) +l, = plt.plot(t, s, lw=2) class Index: ind = 0 def next(self, event): self.ind += 1 - i = self.ind%len(freqs) - ydata = sin(2*pi*freqs[i]*t) + i = self.ind % len(freqs) + ydata = np.sin(2*np.pi*freqs[i]*t) l.set_ydata(ydata) - draw() + plt.draw() def prev(self, event): self.ind -= 1 - i = self.ind%len(freqs) - ydata = sin(2*pi*freqs[i]*t) + i = self.ind % len(freqs) + ydata = np.sin(2*np.pi*freqs[i]*t) l.set_ydata(ydata) - draw() + plt.draw() callback = Index() -axprev = axes([0.7, 0.05, 0.1, 0.075]) -axnext = axes([0.81, 0.05, 0.1, 0.075]) +axprev = plt.axes([0.7, 0.05, 0.1, 0.075]) +axnext = plt.axes([0.81, 0.05, 0.1, 0.075]) bnext = Button(axnext, 'Next') bnext.on_clicked(callback.next) bprev = Button(axprev, 'Previous') bprev.on_clicked(callback.prev) -show() +plt.show() diff -Nru matplotlib-0.99.3/doc/mpl_examples/widgets/check_buttons.py matplotlib-1.0.1/doc/mpl_examples/widgets/check_buttons.py --- matplotlib-0.99.3/doc/mpl_examples/widgets/check_buttons.py 2009-07-31 15:14:49.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/widgets/check_buttons.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,25 +1,26 @@ -from pylab import * +import numpy as np +import matplotlib.pyplot as plt from matplotlib.widgets import CheckButtons -t = arange(0.0, 2.0, 0.01) -s0 = sin(2*pi*t) -s1 = sin(4*pi*t) -s2 = sin(6*pi*t) +t = np.arange(0.0, 2.0, 0.01) +s0 = np.sin(2*np.pi*t) +s1 = np.sin(4*np.pi*t) +s2 = np.sin(6*np.pi*t) -ax = subplot(111) +ax = plt.subplot(111) l0, = ax.plot(t, s0, visible=False, lw=2) l1, = ax.plot(t, s1, lw=2) l2, = ax.plot(t, s2, lw=2) -subplots_adjust(left=0.2) +plt.subplots_adjust(left=0.2) -rax = axes([0.05, 0.4, 0.1, 0.15]) +rax = plt.axes([0.05, 0.4, 0.1, 0.15]) check = CheckButtons(rax, ('2 Hz', '4 Hz', '6 Hz'), (False, True, True)) def func(label): - if label=='2 Hz': l0.set_visible(not l0.get_visible()) - elif label=='4 Hz': l1.set_visible(not l1.get_visible()) - elif label=='6 Hz': l2.set_visible(not l2.get_visible()) - draw() + if label == '2 Hz': l0.set_visible(not l0.get_visible()) + elif label == '4 Hz': l1.set_visible(not l1.get_visible()) + elif label == '6 Hz': l2.set_visible(not l2.get_visible()) + plt.draw() check.on_clicked(func) -show() +plt.show() diff -Nru matplotlib-0.99.3/doc/mpl_examples/widgets/cursor.py matplotlib-1.0.1/doc/mpl_examples/widgets/cursor.py --- matplotlib-0.99.3/doc/mpl_examples/widgets/cursor.py 2009-07-31 15:14:49.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/widgets/cursor.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,20 +1,19 @@ #!/usr/bin/env python from matplotlib.widgets import Cursor -import pylab +import numpy as np +import matplotlib.pyplot as plt -fig = pylab.figure(figsize=(8,6)) -ax = fig.add_axes([0.075, 0.25, 0.9, 0.725], axisbg='#FFFFCC') -#ax = fig.add_subplot(111, axisbg='#FFFFCC') -canvas = ax.figure.canvas - -x,y = 4*(pylab.rand(2,100)-.5) -ax.plot(x,y,'o') -ax.set_xlim(-2,2) -ax.set_ylim(-2,2) +fig = plt.figure(figsize=(8, 6)) +ax = fig.add_subplot(111, axisbg='#FFFFCC') + +x, y = 4*(np.random.rand(2, 100)-.5) +ax.plot(x, y, 'o') +ax.set_xlim(-2, 2) +ax.set_ylim(-2, 2) # set useblit = True on gtkagg for enhanced performance cursor = Cursor(ax, useblit=True, color='red', linewidth=2 ) -pylab.show() +plt.show() diff -Nru matplotlib-0.99.3/doc/mpl_examples/widgets/menu.py matplotlib-1.0.1/doc/mpl_examples/widgets/menu.py --- matplotlib-0.99.3/doc/mpl_examples/widgets/menu.py 2009-07-31 15:14:49.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/widgets/menu.py 2010-07-07 01:41:55.000000000 +0000 @@ -9,7 +9,8 @@ class ItemProperties: - def __init__(self, fontsize=14, labelcolor='black', bgcolor='yellow', alpha=1.0): + def __init__(self, fontsize=14, labelcolor='black', bgcolor='yellow', + alpha=1.0): self.fontsize = fontsize self.labelcolor = labelcolor self.bgcolor = bgcolor @@ -21,8 +22,9 @@ class MenuItem(artist.Artist): parser = mathtext.MathTextParser("Bitmap") padx = 5 - pady =5 - def __init__(self, fig, labelstr, props=None, hoverprops=None, on_select=None): + pady = 5 + def __init__(self, fig, labelstr, props=None, hoverprops=None, + on_select=None): artist.Artist.__init__(self) self.set_figure(fig) @@ -44,14 +46,15 @@ labelstr, fontsize=props.fontsize, dpi=fig.dpi) if props.fontsize!=hoverprops.fontsize: - raise NotImplementedError('support for different font sizes not implemented') + raise NotImplementedError( + 'support for different font sizes not implemented') self.labelwidth = x.shape[1] self.labelheight = x.shape[0] self.labelArray = np.zeros((x.shape[0], x.shape[1], 4)) - self.labelArray[:,:,-1] = x/255. + self.labelArray[:, :, -1] = x/255. self.label = image.FigureImage(fig, origin='upper') self.label.set_array(self.labelArray) @@ -95,9 +98,9 @@ props = self.props r, g, b = props.labelcolor_rgb - self.labelArray[:,:,0] = r - self.labelArray[:,:,1] = g - self.labelArray[:,:,2] = b + self.labelArray[:, :, 0] = r + self.labelArray[:, :, 1] = g + self.labelArray[:, :, 2] = b self.label.set_array(self.labelArray) self.rect.set(facecolor=props.bgcolor, alpha=props.alpha) @@ -169,12 +172,9 @@ for label in ('open', 'close', 'save', 'save as', 'quit'): def on_select(item): print 'you selected', item.labelstr - item = MenuItem(fig, label, props=props, hoverprops=hoverprops, on_select=on_select) + item = MenuItem(fig, label, props=props, hoverprops=hoverprops, + on_select=on_select) menuitems.append(item) menu = Menu(fig, menuitems) plt.show() - - - - diff -Nru matplotlib-0.99.3/doc/mpl_examples/widgets/rectangle_selector.py matplotlib-1.0.1/doc/mpl_examples/widgets/rectangle_selector.py --- matplotlib-0.99.3/doc/mpl_examples/widgets/rectangle_selector.py 2009-07-31 15:14:49.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_examples/widgets/rectangle_selector.py 2010-07-07 01:41:55.000000000 +0000 @@ -8,27 +8,41 @@ """ from matplotlib.widgets import RectangleSelector -from pylab import subplot, arange, plot, sin, cos, pi, show -def line_select_callback(event1, event2): - 'event1 and event2 are the press and release events' - x1, y1 = event1.xdata, event1.ydata - x2, y2 = event2.xdata, event2.ydata - print "(%3.2f, %3.2f) --> (%3.2f, %3.2f)"%(x1,y1,x2,y2) - print " The button you used were: ",event1.button, event2.button - - -current_ax=subplot(111) # make a new plotingrange -N=100000 # If N is large one can see improvement -x=10.0*arange(N)/(N-1) # by use blitting! - -plot(x,sin(.2*pi*x),lw=3,c='b',alpha=.7) # plot something -plot(x,cos(.2*pi*x),lw=3.5,c='r',alpha=.5) -plot(x,-sin(.2*pi*x),lw=3.5,c='g',alpha=.3) +import numpy as np +import matplotlib.pyplot as plt + +def line_select_callback(eclick, erelease): + 'eclick and erelease are the press and release events' + x1, y1 = eclick.xdata, eclick.ydata + x2, y2 = erelease.xdata, erelease.ydata + print "(%3.2f, %3.2f) --> (%3.2f, %3.2f)" % (x1, y1, x2, y2) + print " The button you used were: ", eclick.button, erelease.button + +def toggle_selector(event): + print ' Key pressed.' + if event.key in ['Q', 'q'] and toggle_selector.RS.active: + print ' RectangleSelector deactivated.' + toggle_selector.RS.set_active(False) + if event.key in ['A', 'a'] and not toggle_selector.RS.active: + print ' RectangleSelector activated.' + toggle_selector.RS.set_active(True) + + +current_ax = plt.subplot(111) # make a new plotingrange +N = 100000 # If N is large one can see +x = np.linspace(0.0, 10.0, N) # improvement by use blitting! + +plt.plot(x, +np.sin(.2*np.pi*x), lw=3.5, c='b', alpha=.7) # plot something +plt.plot(x, +np.cos(.2*np.pi*x), lw=3.5, c='r', alpha=.5) +plt.plot(x, -np.sin(.2*np.pi*x), lw=3.5, c='g', alpha=.3) print "\n click --> release" # drawtype is 'box' or 'line' or 'none' -LS = RectangleSelector(current_ax, line_select_callback, - drawtype='box',useblit=True, - minspanx=5,minspany=5,spancoords='pixels') -show() +toggle_selector.RS = RectangleSelector(current_ax, line_select_callback, + drawtype='box', useblit=True, + button=[1,3], # don't use middle button + minspanx=5, minspany=5, + spancoords='pixels') +plt.connect('key_press_event', toggle_selector) +plt.show() diff -Nru matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/api/axes_grid_api.rst matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/api/axes_grid_api.rst --- matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/api/axes_grid_api.rst 2009-07-31 15:14:23.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/api/axes_grid_api.rst 2010-07-07 01:41:45.000000000 +0000 @@ -2,6 +2,10 @@ :mod:`mpl_toolkits.axes_grid.axes_grid` ======================================= -.. autoclass:: mpl_toolkits.axes_grid.axes_grid.AxesGrid +.. autoclass:: mpl_toolkits.axes_grid.axes_grid.Grid + :members: + :undoc-members: + +.. autoclass:: mpl_toolkits.axes_grid.axes_grid.ImageGrid :members: :undoc-members: diff -Nru matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/api/axis_artist_api.rst matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/api/axis_artist_api.rst --- matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/api/axis_artist_api.rst 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/api/axis_artist_api.rst 2010-07-07 01:41:45.000000000 +0000 @@ -0,0 +1,16 @@ + +:mod:`mpl_toolkits.axes_grid.axis_artist` +========================================= + +.. autoclass:: mpl_toolkits.axes_grid.axis_artist.AxisArtist + :members: + :undoc-members: + +.. autoclass:: mpl_toolkits.axes_grid.axis_artist.Ticks + :members: + +.. autoclass:: mpl_toolkits.axes_grid.axis_artist.AxisLabel + :members: + +.. autoclass:: mpl_toolkits.axes_grid.axis_artist.TickLabels + :members: diff -Nru matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/api/index.rst matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/api/index.rst --- matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/api/index.rst 2009-07-31 15:14:23.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/api/index.rst 2010-07-07 01:41:45.000000000 +0000 @@ -12,3 +12,4 @@ axes_size_api.rst axes_divider_api.rst axes_grid_api.rst + axis_artist_api.rst diff -Nru matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/examples/demo_axes_divider.py matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/examples/demo_axes_divider.py --- matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/examples/demo_axes_divider.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/examples/demo_axes_divider.py 2010-07-07 01:41:54.000000000 +0000 @@ -0,0 +1,129 @@ +import matplotlib.pyplot as plt + +def get_demo_image(): + import numpy as np + from matplotlib.cbook import get_sample_data + f = get_sample_data("axes_grid/bivariate_normal.npy", asfileobj=False) + z = np.load(f) + # z is a numpy array of 15x15 + return z, (-3,4,-4,3) + + +def demo_simple_image(ax): + Z, extent = get_demo_image() + + im = ax.imshow(Z, extent=extent, interpolation="nearest") + cb = plt.colorbar(im) + plt.setp(cb.ax.get_yticklabels(), visible=False) + + +def demo_locatable_axes_hard(fig1): + + from mpl_toolkits.axes_grid1 \ + import SubplotDivider, LocatableAxes, Size + + divider = SubplotDivider(fig1, 2, 2, 2, aspect=True) + + # axes for image + ax = LocatableAxes(fig1, divider.get_position()) + + # axes for coloarbar + ax_cb = LocatableAxes(fig1, divider.get_position()) + + h = [Size.AxesX(ax), # main axes + Size.Fixed(0.05), # padding, 0.1 inch + Size.Fixed(0.2), # colorbar, 0.3 inch + ] + + v = [Size.AxesY(ax)] + + divider.set_horizontal(h) + divider.set_vertical(v) + + ax.set_axes_locator(divider.new_locator(nx=0, ny=0)) + ax_cb.set_axes_locator(divider.new_locator(nx=2, ny=0)) + + fig1.add_axes(ax) + fig1.add_axes(ax_cb) + + ax_cb.axis["left"].toggle(all=False) + ax_cb.axis["right"].toggle(ticks=True) + + Z, extent = get_demo_image() + + im = ax.imshow(Z, extent=extent, interpolation="nearest") + plt.colorbar(im, cax=ax_cb) + plt.setp(ax_cb.get_yticklabels(), visible=False) + + +def demo_locatable_axes_easy(ax): + from mpl_toolkits.axes_grid1 import make_axes_locatable + + divider = make_axes_locatable(ax) + + ax_cb = divider.new_horizontal(size="5%", pad=0.05) + fig1 = ax.get_figure() + fig1.add_axes(ax_cb) + + Z, extent = get_demo_image() + im = ax.imshow(Z, extent=extent, interpolation="nearest") + + plt.colorbar(im, cax=ax_cb) + ax_cb.yaxis.tick_right() + for tl in ax_cb.get_yticklabels(): + tl.set_visible(False) + ax_cb.yaxis.tick_right() + + +def demo_images_side_by_sied(ax): + from mpl_toolkits.axes_grid1 import make_axes_locatable + + divider = make_axes_locatable(ax) + + Z, extent = get_demo_image() + ax2 = divider.new_horizontal(size="100%", pad=0.05) + fig1 = ax.get_figure() + fig1.add_axes(ax2) + + ax.imshow(Z, extent=extent, interpolation="nearest") + ax2.imshow(Z, extent=extent, interpolation="nearest") + for tl in ax2.get_yticklabels(): + tl.set_visible(False) + + +def demo(): + + fig1 = plt.figure(1, (6, 6)) + fig1.clf() + + ## PLOT 1 + # simple image & colorbar + ax = fig1.add_subplot(2, 2, 1) + demo_simple_image(ax) + + ## PLOT 2 + # image and colorbar whose location is adjusted in the drawing time. + # a hard way + + demo_locatable_axes_hard(fig1) + + + ## PLOT 3 + # image and colorbar whose location is adjusted in the drawing time. + # a easy way + + ax = fig1.add_subplot(2, 2, 3) + demo_locatable_axes_easy(ax) + + + ## PLOT 4 + # two images side by sied with fixed padding. + + ax = fig1.add_subplot(2, 2, 4) + demo_images_side_by_sied(ax) + + plt.draw() + plt.show() + + +demo() diff -Nru matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/examples/demo_axes_grid2.py matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/examples/demo_axes_grid2.py --- matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/examples/demo_axes_grid2.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/examples/demo_axes_grid2.py 2010-07-07 01:41:54.000000000 +0000 @@ -0,0 +1,113 @@ +import matplotlib.pyplot as plt +from mpl_toolkits.axes_grid1 import ImageGrid +import numpy as np + +def get_demo_image(): + from matplotlib.cbook import get_sample_data + f = get_sample_data("axes_grid/bivariate_normal.npy", asfileobj=False) + z = np.load(f) + # z is a numpy array of 15x15 + return z, (-3,4,-4,3) + + +def add_inner_title(ax, title, loc, size=None, **kwargs): + from matplotlib.offsetbox import AnchoredText + from matplotlib.patheffects import withStroke + if size is None: + size = dict(size=plt.rcParams['legend.fontsize']) + at = AnchoredText(title, loc=loc, prop=size, + pad=0., borderpad=0.5, + frameon=False, **kwargs) + ax.add_artist(at) + at.txt._text.set_path_effects([withStroke(foreground="w", linewidth=3)]) + return at + +if 1: + F = plt.figure(1, (6, 6)) + F.clf() + + # prepare images + Z, extent = get_demo_image() + ZS = [Z[i::3,:] for i in range(3)] + extent = extent[0], extent[1]/3., extent[2], extent[3] + + # demo 1 : colorbar at each axes + + grid = ImageGrid(F, 211, # similar to subplot(111) + nrows_ncols = (1, 3), + direction="row", + axes_pad = 0.05, + add_all=True, + label_mode = "1", + share_all = True, + cbar_location="top", + cbar_mode="each", + cbar_size="7%", + cbar_pad="1%", + ) + + + for ax, z in zip(grid, ZS): + im = ax.imshow(z, origin="lower", extent=extent, interpolation="nearest") + ax.cax.colorbar(im) + + for ax, im_title in zip(grid, ["Image 1", "Image 2", "Image 3"]): + t = add_inner_title(ax, im_title, loc=3) + t.patch.set_alpha(0.5) + + for ax, z in zip(grid, ZS): + ax.cax.toggle_label(True) + #axis = ax.cax.axis[ax.cax.orientation] + #axis.label.set_text("counts s$^{-1}$") + #axis.label.set_size(10) + #axis.major_ticklabels.set_size(6) + + # changing the colorbar ticks + grid[1].cax.set_xticks([-1, 0, 1]) + grid[2].cax.set_xticks([-1, 0, 1]) + + grid[0].set_xticks([-2, 0]) + grid[0].set_yticks([-2, 0, 2]) + + + # demo 2 : shared colorbar + + grid2 = ImageGrid(F, 212, + nrows_ncols = (1, 3), + direction="row", + axes_pad = 0.05, + add_all=True, + label_mode = "1", + share_all = True, + cbar_location="right", + cbar_mode="single", + cbar_size="10%", + cbar_pad=0.05, + ) + + grid2[0].set_xlabel("X") + grid2[0].set_ylabel("Y") + + vmax, vmin = np.max(ZS), np.min(ZS) + import matplotlib.colors + norm = matplotlib.colors.normalize(vmax=vmax, vmin=vmin) + + for ax, z in zip(grid2, ZS): + im = ax.imshow(z, norm=norm, + origin="lower", extent=extent, + interpolation="nearest") + + # With cbar_mode="single", cax attribute of all axes are identical. + ax.cax.colorbar(im) + ax.cax.toggle_label(True) + + for ax, im_title in zip(grid2, ["(a)", "(b)", "(c)"]): + t = add_inner_title(ax, im_title, loc=2) + t.patch.set_ec("none") + t.patch.set_alpha(0.5) + + grid2[0].set_xticks([-2, 0]) + grid2[0].set_yticks([-2, 0, 2]) + + plt.draw() + plt.show() diff -Nru matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/examples/demo_axes_grid.py matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/examples/demo_axes_grid.py --- matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/examples/demo_axes_grid.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/examples/demo_axes_grid.py 2010-07-07 01:41:54.000000000 +0000 @@ -0,0 +1,99 @@ +import matplotlib.pyplot as plt +from mpl_toolkits.axes_grid1 import AxesGrid + +def get_demo_image(): + import numpy as np + from matplotlib.cbook import get_sample_data + f = get_sample_data("axes_grid/bivariate_normal.npy", asfileobj=False) + z = np.load(f) + # z is a numpy array of 15x15 + return z, (-3,4,-4,3) + +def demo_simple_grid(fig): + """ + A grid of 2x2 images with 0.05 inch pad between images and only + the lower-left axes is labeld. + """ + grid = AxesGrid(fig, 131, # similar to subplot(131) + nrows_ncols = (2, 2), + axes_pad = 0.05, + label_mode = "1", + ) + + Z, extent = get_demo_image() + for i in range(4): + im = grid[i].imshow(Z, extent=extent, interpolation="nearest") + + # This only affects axes in first column and second row as share_all = False. + grid.axes_llc.set_xticks([-2, 0, 2]) + grid.axes_llc.set_yticks([-2, 0, 2]) + + +def demo_grid_with_single_cbar(fig): + """ + A grid of 2x2 images with a single colobar + """ + grid = AxesGrid(fig, 132, # similar to subplot(132) + nrows_ncols = (2, 2), + axes_pad = 0.0, + share_all=True, + label_mode = "L", + cbar_location = "top", + cbar_mode="single", + ) + + Z, extent = get_demo_image() + for i in range(4): + im = grid[i].imshow(Z, extent=extent, interpolation="nearest") + #plt.colorbar(im, cax = grid.cbar_axes[0]) + grid.cbar_axes[0].colorbar(im) + + for cax in grid.cbar_axes: + cax.toggle_label(False) + + # This affects all axes as share_all = True. + grid.axes_llc.set_xticks([-2, 0, 2]) + grid.axes_llc.set_yticks([-2, 0, 2]) + + +def demo_grid_with_each_cbar(fig): + """ + A grid of 2x2 images. Each image has its own colobar. + """ + + grid = AxesGrid(F, 133, # similar to subplot(122) + nrows_ncols = (2, 2), + axes_pad = 0.1, + label_mode = "1", + share_all = True, + cbar_location="top", + cbar_mode="each", + cbar_size="7%", + cbar_pad="2%", + ) + Z, extent = get_demo_image() + for i in range(4): + im = grid[i].imshow(Z, extent=extent, interpolation="nearest") + grid.cbar_axes[i].colorbar(im) + + for cax in grid.cbar_axes: + cax.toggle_label(False) + + # This affects all axes because we set share_all = True. + grid.axes_llc.set_xticks([-2, 0, 2]) + grid.axes_llc.set_yticks([-2, 0, 2]) + + + +if 1: + F = plt.figure(1, (5.5, 2.5)) + + F.subplots_adjust(left=0.05, right=0.98) + + demo_simple_grid(F) + demo_grid_with_single_cbar(F) + demo_grid_with_each_cbar(F) + + plt.draw() + plt.show() + diff -Nru matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/examples/demo_axes_rgb.py matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/examples/demo_axes_rgb.py --- matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/examples/demo_axes_rgb.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/examples/demo_axes_rgb.py 2010-07-07 01:41:54.000000000 +0000 @@ -0,0 +1,90 @@ +import numpy as np +import matplotlib.pyplot as plt + +from mpl_toolkits.axes_grid1.axes_rgb import make_rgb_axes, RGBAxes + +def get_demo_image(): + from matplotlib.cbook import get_sample_data + f = get_sample_data("axes_grid/bivariate_normal.npy", asfileobj=False) + z = np.load(f) + # z is a numpy array of 15x15 + return z, (-3,4,-4,3) + + + +def get_rgb(): + Z, extent = get_demo_image() + + Z[Z<0] = 0. + Z = Z/Z.max() + + R = Z[:13,:13] + G = Z[2:,2:] + B = Z[:13,2:] + + return R, G, B + + +def make_cube(r, g, b): + ny, nx = r.shape + R = np.zeros([ny, nx, 3], dtype="d") + R[:,:,0] = r + G = np.zeros_like(R) + G[:,:,1] = g + B = np.zeros_like(R) + B[:,:,2] = b + + RGB = R + G + B + + return R, G, B, RGB + + + +def demo_rgb(): + fig = plt.figure(1) + fig.clf() + + ax = fig.add_subplot(111) + ax_r, ax_g, ax_b = make_rgb_axes(ax, pad=0.02) + #fig.add_axes(ax_r) + #fig.add_axes(ax_g) + #fig.add_axes(ax_b) + + r, g, b = get_rgb() + im_r, im_g, im_b, im_rgb = make_cube(r, g, b) + kwargs = dict(origin="lower", interpolation="nearest") + ax.imshow(im_rgb, **kwargs) + ax_r.imshow(im_r, **kwargs) + ax_g.imshow(im_g, **kwargs) + ax_b.imshow(im_b, **kwargs) + + + + +def demo_rgb2(): + fig = plt.figure(2) + ax = RGBAxes(fig, [0.1, 0.1, 0.8, 0.8], pad=0.0) + #fig.add_axes(ax) + #ax.add_RGB_to_figure() + + r, g, b = get_rgb() + kwargs = dict(origin="lower", interpolation="nearest") + ax.imshow_rgb(r, g, b, **kwargs) + + ax.RGB.set_xlim(0., 9.5) + ax.RGB.set_ylim(0.9, 10.6) + + for ax1 in [ax.RGB, ax.R, ax.G, ax.B]: + for sp1 in ax1.spines.values(): + sp1.set_color("w") + for tick in ax1.xaxis.get_major_ticks() + ax1.yaxis.get_major_ticks(): + tick.tick1line.set_mec("w") + tick.tick2line.set_mec("w") + + return ax + + +demo_rgb() +ax = demo_rgb2() + +plt.show() diff -Nru matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/examples/demo_axisline_style.py matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/examples/demo_axisline_style.py --- matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/examples/demo_axisline_style.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/examples/demo_axisline_style.py 2010-07-07 01:41:54.000000000 +0000 @@ -0,0 +1,21 @@ + +from mpl_toolkits.axes_grid.axislines import SubplotZero +import matplotlib.pyplot as plt +import numpy as np + +if 1: + fig = plt.figure(1) + ax = SubplotZero(fig, 111) + fig.add_subplot(ax) + + for direction in ["xzero", "yzero"]: + ax.axis[direction].set_axisline_style("-|>") + ax.axis[direction].set_visible(True) + + for direction in ["left", "right", "bottom", "top"]: + ax.axis[direction].set_visible(False) + + x = np.linspace(-0.5, 1., 100) + ax.plot(x, np.sin(x*np.pi)) + + plt.show() diff -Nru matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/examples/demo_colorbar_with_inset_locator.py matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/examples/demo_colorbar_with_inset_locator.py --- matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/examples/demo_colorbar_with_inset_locator.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/examples/demo_colorbar_with_inset_locator.py 2010-07-07 01:41:54.000000000 +0000 @@ -0,0 +1,39 @@ +import matplotlib.pyplot as plt + +from mpl_toolkits.axes_grid1.inset_locator import inset_axes + +fig = plt.figure(1, [6, 3]) + +# first subplot +ax1 = fig.add_subplot(121) + +axins1 = inset_axes(ax1, + width="50%", # width = 10% of parent_bbox width + height="5%", # height : 50% + loc=1) + +im1=ax1.imshow([[1,2],[2, 3]]) +plt.colorbar(im1, cax=axins1, orientation="horizontal", ticks=[1,2,3]) +axins1.xaxis.set_ticks_position("bottom") + +# first subplot +ax = fig.add_subplot(122) + +axins = inset_axes(ax, + width="5%", # width = 10% of parent_bbox width + height="50%", # height : 50% + loc=3, + bbox_to_anchor=(1.05, 0., 1, 1), + bbox_transform=ax.transAxes, + borderpad=0, + ) + +# Controlling the placement of the inset axes is basically same as that +# of the legend. you may want to play with the borderpad value and +# the bbox_to_anchor coordinate. + +im=ax.imshow([[1,2],[2, 3]]) +plt.colorbar(im, cax=axins, ticks=[1,2,3]) + +plt.draw() +plt.show() diff -Nru matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/examples/demo_curvelinear_grid2.py matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/examples/demo_curvelinear_grid2.py --- matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/examples/demo_curvelinear_grid2.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/examples/demo_curvelinear_grid2.py 2010-07-07 01:41:54.000000000 +0000 @@ -0,0 +1,63 @@ +import numpy as np +#from matplotlib.path import Path + +import matplotlib.pyplot as plt + +from mpl_toolkits.axes_grid.grid_helper_curvelinear import GridHelperCurveLinear +from mpl_toolkits.axes_grid.axislines import Subplot + +import mpl_toolkits.axes_grid.angle_helper as angle_helper + +def curvelinear_test1(fig): + """ + grid for custom transform. + """ + + def tr(x, y): + sgn = np.sign(x) + x, y = np.abs(np.asarray(x)), np.asarray(y) + return sgn*x**.5, y + + def inv_tr(x,y): + sgn = np.sign(x) + x, y = np.asarray(x), np.asarray(y) + return sgn*x**2, y + + extreme_finder = angle_helper.ExtremeFinderCycle(20, 20, + lon_cycle = None, + lat_cycle = None, + lon_minmax = None, #(0, np.inf), + lat_minmax = None, + ) + + grid_helper = GridHelperCurveLinear((tr, inv_tr), + extreme_finder=extreme_finder) + + ax1 = Subplot(fig, 111, grid_helper=grid_helper) + # ax1 will have a ticks and gridlines defined by the given + # transform (+ transData of the Axes). Note that the transform of + # the Axes itself (i.e., transData) is not affected by the given + # transform. + + fig.add_subplot(ax1) + + ax1.imshow(np.arange(25).reshape(5,5), + vmax = 50, cmap=plt.cm.gray_r, + interpolation="nearest", + origin="lower") + + # tick density + grid_helper.grid_finder.grid_locator1._nbins = 6 + grid_helper.grid_finder.grid_locator2._nbins = 6 + + + +if 1: + fig = plt.figure(1, figsize=(7, 4)) + fig.clf() + + curvelinear_test1(fig) + plt.show() + + + diff -Nru matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/examples/demo_curvelinear_grid.py matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/examples/demo_curvelinear_grid.py --- matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/examples/demo_curvelinear_grid.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/examples/demo_curvelinear_grid.py 2010-07-07 01:41:54.000000000 +0000 @@ -0,0 +1,133 @@ +import numpy as np +#from matplotlib.path import Path + +import matplotlib.pyplot as plt +import matplotlib.cbook as cbook + +from mpl_toolkits.axisartist.grid_helper_curvelinear import GridHelperCurveLinear +from mpl_toolkits.axisartist import Subplot + +from mpl_toolkits.axisartist import SubplotHost, \ + ParasiteAxesAuxTrans + + +def curvelinear_test1(fig): + """ + grid for custom transform. + """ + + def tr(x, y): + x, y = np.asarray(x), np.asarray(y) + return x, y-x + + def inv_tr(x,y): + x, y = np.asarray(x), np.asarray(y) + return x, y+x + + + grid_helper = GridHelperCurveLinear((tr, inv_tr)) + + ax1 = Subplot(fig, 1, 2, 1, grid_helper=grid_helper) + # ax1 will have a ticks and gridlines defined by the given + # transform (+ transData of the Axes). Note that the transform of + # the Axes itself (i.e., transData) is not affected by the given + # transform. + + fig.add_subplot(ax1) + + xx, yy = tr([3, 6], [5.0, 10.]) + ax1.plot(xx, yy) + + ax1.set_aspect(1.) + ax1.set_xlim(0, 10.) + ax1.set_ylim(0, 10.) + + ax1.axis["t"]=ax1.new_floating_axis(0, 3.) + ax1.axis["t2"]=ax1.new_floating_axis(1, 7.) + ax1.grid(True) + + + +import mpl_toolkits.axisartist.angle_helper as angle_helper +from matplotlib.projections import PolarAxes +from matplotlib.transforms import Affine2D + +def curvelinear_test2(fig): + """ + polar projection, but in a rectangular box. + """ + + # PolarAxes.PolarTransform takes radian. However, we want our coordinate + # system in degree + tr = Affine2D().scale(np.pi/180., 1.) + PolarAxes.PolarTransform() + + # polar projection, which involves cycle, and also has limits in + # its coordinates, needs a special method to find the extremes + # (min, max of the coordinate within the view). + + # 20, 20 : number of sampling points along x, y direction + extreme_finder = angle_helper.ExtremeFinderCycle(20, 20, + lon_cycle = 360, + lat_cycle = None, + lon_minmax = None, + lat_minmax = (0, np.inf), + ) + + grid_locator1 = angle_helper.LocatorDMS(12) + # Find a grid values appropriate for the coordinate (degree, + # minute, second). + + tick_formatter1 = angle_helper.FormatterDMS() + # And also uses an appropriate formatter. Note that,the + # acceptable Locator and Formatter class is a bit different than + # that of mpl's, and you cannot directly use mpl's Locator and + # Formatter here (but may be possible in the future). + + grid_helper = GridHelperCurveLinear(tr, + extreme_finder=extreme_finder, + grid_locator1=grid_locator1, + tick_formatter1=tick_formatter1 + ) + + + ax1 = SubplotHost(fig, 1, 2, 2, grid_helper=grid_helper) + + # make ticklabels of right and top axis visible. + ax1.axis["right"].major_ticklabels.set_visible(True) + ax1.axis["top"].major_ticklabels.set_visible(True) + + # let right axis shows ticklabels for 1st coordinate (angle) + ax1.axis["right"].get_helper().nth_coord_ticks=0 + # let bottom axis shows ticklabels for 2nd coordinate (radius) + ax1.axis["bottom"].get_helper().nth_coord_ticks=1 + + fig.add_subplot(ax1) + + + # A parasite axes with given transform + ax2 = ParasiteAxesAuxTrans(ax1, tr, "equal") + # note that ax2.transData == tr + ax1.transData + # Anthing you draw in ax2 will match the ticks and grids of ax1. + ax1.parasites.append(ax2) + intp = cbook.simple_linear_interpolation + ax2.plot(intp(np.array([0, 30]), 50), + intp(np.array([10., 10.]), 50)) + + ax1.set_aspect(1.) + ax1.set_xlim(-5, 12) + ax1.set_ylim(-5, 10) + + ax1.grid(True) + +if 1: + fig = plt.figure(1, figsize=(7, 4)) + fig.clf() + + curvelinear_test1(fig) + curvelinear_test2(fig) + + plt.draw() + plt.show() + + + diff -Nru matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/examples/demo_floating_axes.py matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/examples/demo_floating_axes.py --- matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/examples/demo_floating_axes.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/examples/demo_floating_axes.py 2010-07-07 01:41:54.000000000 +0000 @@ -0,0 +1,154 @@ +from matplotlib.transforms import Affine2D + +import mpl_toolkits.axisartist.floating_axes as floating_axes + +import numpy as np +import mpl_toolkits.axisartist.angle_helper as angle_helper +from matplotlib.projections import PolarAxes +from mpl_toolkits.axisartist.grid_finder import FixedLocator, MaxNLocator, \ + DictFormatter + +def setup_axes1(fig, rect): + """ + A simple one. + """ + tr = Affine2D().scale(2, 1).rotate_deg(30) + + grid_helper = floating_axes.GridHelperCurveLinear(tr, extremes=(0, 4, 0, 4)) + + ax1 = floating_axes.FloatingSubplot(fig, rect, grid_helper=grid_helper) + fig.add_subplot(ax1) + + grid_helper.grid_finder.grid_locator1._nbins = 4 + grid_helper.grid_finder.grid_locator2._nbins = 4 + + return ax1 + + +def setup_axes2(fig, rect): + """ + With custom locator and formatter. + Note that the extreme values are swapped. + """ + + #tr_scale = Affine2D().scale(np.pi/180., 1.) + + tr = PolarAxes.PolarTransform() + + pi = np.pi + angle_ticks = [(0, r"$0$"), + (.25*pi, r"$\frac{1}{4}\pi$"), + (.5*pi, r"$\frac{1}{2}\pi$")] + grid_locator1 = FixedLocator([v for v, s in angle_ticks]) + tick_formatter1 = DictFormatter(dict(angle_ticks)) + + grid_locator2 = MaxNLocator(2) + + grid_helper = floating_axes.GridHelperCurveLinear(tr, + extremes=(.5*pi, 0, 2, 1), + grid_locator1=grid_locator1, + grid_locator2=grid_locator2, + tick_formatter1=tick_formatter1, + tick_formatter2=None, + ) + + ax1 = floating_axes.FloatingSubplot(fig, rect, grid_helper=grid_helper) + fig.add_subplot(ax1) + + # create a parasite axes whose transData in RA, cz + aux_ax = ax1.get_aux_axes(tr) + + aux_ax.patch = ax1.patch # for aux_ax to have a clip path as in ax + ax1.patch.zorder=0.9 # but this has a side effect that the patch is + # drawn twice, and possibly over some other + # artists. So, we decrease the zorder a bit to + # prevent this. + + return ax1, aux_ax + + +def setup_axes3(fig, rect): + """ + Sometimes, things like axis_direction need to be adjusted. + """ + + # rotate a bit for better orientation + tr_rotate = Affine2D().translate(-95, 0) + + # scale degree to radians + tr_scale = Affine2D().scale(np.pi/180., 1.) + + tr = tr_rotate + tr_scale + PolarAxes.PolarTransform() + + grid_locator1 = angle_helper.LocatorHMS(4) + tick_formatter1 = angle_helper.FormatterHMS() + + grid_locator2 = MaxNLocator(3) + + ra0, ra1 = 8.*15, 14.*15 + cz0, cz1 = 0, 14000 + grid_helper = floating_axes.GridHelperCurveLinear(tr, + extremes=(ra0, ra1, cz0, cz1), + grid_locator1=grid_locator1, + grid_locator2=grid_locator2, + tick_formatter1=tick_formatter1, + tick_formatter2=None, + ) + + ax1 = floating_axes.FloatingSubplot(fig, rect, grid_helper=grid_helper) + fig.add_subplot(ax1) + + # adjust axis + ax1.axis["left"].set_axis_direction("bottom") + ax1.axis["right"].set_axis_direction("top") + + ax1.axis["bottom"].set_visible(False) + ax1.axis["top"].set_axis_direction("bottom") + ax1.axis["top"].toggle(ticklabels=True, label=True) + ax1.axis["top"].major_ticklabels.set_axis_direction("top") + ax1.axis["top"].label.set_axis_direction("top") + + ax1.axis["left"].label.set_text(r"cz [km$^{-1}$]") + ax1.axis["top"].label.set_text(r"$\alpha_{1950}$") + + + # create a parasite axes whose transData in RA, cz + aux_ax = ax1.get_aux_axes(tr) + + aux_ax.patch = ax1.patch # for aux_ax to have a clip path as in ax + ax1.patch.zorder=0.9 # but this has a side effect that the patch is + # drawn twice, and possibly over some other + # artists. So, we decrease the zorder a bit to + # prevent this. + + return ax1, aux_ax + + + +if 1: + import matplotlib.pyplot as plt + fig = plt.figure(1, figsize=(8, 4)) + fig.subplots_adjust(wspace=0.3, left=0.05, right=0.95) + + ax1 = setup_axes1(fig, 131) + + #theta = np.random.rand(10) #*.5*np.pi + #radius = np.random.rand(10) #+1. + #aux_ax1.scatter(theta, radius) + + + ax2, aux_ax2 = setup_axes2(fig, 132) + + theta = np.random.rand(10)*.5*np.pi + radius = np.random.rand(10)+1. + aux_ax2.scatter(theta, radius) + + + ax3, aux_ax3 = setup_axes3(fig, 133) + + theta = (8 + np.random.rand(10)*(14-8))*15. # indegree + radius = np.random.rand(10)*14000. + aux_ax3.scatter(theta, radius) + + plt.show() + diff -Nru matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/examples/demo_floating_axis.py matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/examples/demo_floating_axis.py --- matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/examples/demo_floating_axis.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/examples/demo_floating_axis.py 2010-07-07 01:41:54.000000000 +0000 @@ -0,0 +1,71 @@ +""" +An experimental support for curvelinear grid. +""" + + +def curvelinear_test2(fig): + """ + polar projection, but in a rectangular box. + """ + global ax1 + import numpy as np + import mpl_toolkits.axisartist.angle_helper as angle_helper + from matplotlib.projections import PolarAxes + from matplotlib.transforms import Affine2D + + from mpl_toolkits.axisartist import SubplotHost + + from mpl_toolkits.axisartist import GridHelperCurveLinear + + # see demo_curvelinear_grid.py for details + tr = Affine2D().scale(np.pi/180., 1.) + PolarAxes.PolarTransform() + + extreme_finder = angle_helper.ExtremeFinderCycle(20, 20, + lon_cycle = 360, + lat_cycle = None, + lon_minmax = None, + lat_minmax = (0, np.inf), + ) + + grid_locator1 = angle_helper.LocatorDMS(12) + + tick_formatter1 = angle_helper.FormatterDMS() + + grid_helper = GridHelperCurveLinear(tr, + extreme_finder=extreme_finder, + grid_locator1=grid_locator1, + tick_formatter1=tick_formatter1 + ) + + + ax1 = SubplotHost(fig, 1, 1, 1, grid_helper=grid_helper) + + fig.add_subplot(ax1) + + # Now creates floating axis + + #grid_helper = ax1.get_grid_helper() + # floating axis whose first coordinate (theta) is fixed at 60 + ax1.axis["lat"] = axis = ax1.new_floating_axis(0, 60) + axis.label.set_text(r"$\theta = 60^{\circ}$") + axis.label.set_visible(True) + + # floating axis whose second coordinate (r) is fixed at 6 + ax1.axis["lon"] = axis = ax1.new_floating_axis(1, 6) + axis.label.set_text(r"$r = 6$") + + ax1.set_aspect(1.) + ax1.set_xlim(-5, 12) + ax1.set_ylim(-5, 10) + + ax1.grid(True) + +import matplotlib.pyplot as plt +fig = plt.figure(1, figsize=(5, 5)) +fig.clf() + +curvelinear_test2(fig) + +plt.show() + + diff -Nru matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/examples/demo_parasite_axes2.py matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/examples/demo_parasite_axes2.py --- matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/examples/demo_parasite_axes2.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/examples/demo_parasite_axes2.py 2010-07-07 01:41:54.000000000 +0000 @@ -0,0 +1,47 @@ +from mpl_toolkits.axes_grid1 import host_subplot +import mpl_toolkits.axisartist as AA +import matplotlib.pyplot as plt + +if 1: + + host = host_subplot(111, axes_class=AA.Axes) + plt.subplots_adjust(right=0.75) + + par1 = host.twinx() + par2 = host.twinx() + + offset = 60 + new_fixed_axis = par2.get_grid_helper().new_fixed_axis + par2.axis["right"] = new_fixed_axis(loc="right", + axes=par2, + offset=(offset, 0)) + + par2.axis["right"].toggle(all=True) + + + + host.set_xlim(0, 2) + host.set_ylim(0, 2) + + host.set_xlabel("Distance") + host.set_ylabel("Density") + par1.set_ylabel("Temperature") + par2.set_ylabel("Velocity") + + p1, = host.plot([0, 1, 2], [0, 1, 2], label="Density") + p2, = par1.plot([0, 1, 2], [0, 3, 2], label="Temperature") + p3, = par2.plot([0, 1, 2], [50, 30, 15], label="Velocity") + + par1.set_ylim(0, 4) + par2.set_ylim(1, 65) + + host.legend() + + host.axis["left"].label.set_color(p1.get_color()) + par1.axis["right"].label.set_color(p2.get_color()) + par2.axis["right"].label.set_color(p3.get_color()) + + plt.draw() + plt.show() + + #plt.savefig("Test") diff -Nru matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/examples/inset_locator_demo2.py matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/examples/inset_locator_demo2.py --- matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/examples/inset_locator_demo2.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/examples/inset_locator_demo2.py 2010-07-07 01:41:54.000000000 +0000 @@ -0,0 +1,48 @@ +import matplotlib.pyplot as plt + +from mpl_toolkits.axes_grid1.inset_locator import zoomed_inset_axes +from mpl_toolkits.axes_grid1.inset_locator import mark_inset + +import numpy as np + +def get_demo_image(): + from matplotlib.cbook import get_sample_data + import numpy as np + f = get_sample_data("axes_grid/bivariate_normal.npy", asfileobj=False) + z = np.load(f) + # z is a numpy array of 15x15 + return z, (-3,4,-4,3) + + +fig = plt.figure(1, [5,4]) +ax = fig.add_subplot(111) + +# prepare the demo image +Z, extent = get_demo_image() +Z2 = np.zeros([150, 150], dtype="d") +ny, nx = Z.shape +Z2[30:30+ny, 30:30+nx] = Z + +# extent = [-3, 4, -4, 3] +ax.imshow(Z2, extent=extent, interpolation="nearest", + origin="lower") + +axins = zoomed_inset_axes(ax, 6, loc=1) # zoom = 6 +axins.imshow(Z2, extent=extent, interpolation="nearest", + origin="lower") + +# sub region of the original image +x1, x2, y1, y2 = -1.5, -0.9, -2.5, -1.9 +axins.set_xlim(x1, x2) +axins.set_ylim(y1, y2) + +plt.xticks(visible=False) +plt.yticks(visible=False) + +# draw a bbox of the region of the inset axes in the parent axes and +# connecting lines between the bbox and the inset axes area +mark_inset(ax, axins, loc1=2, loc2=4, fc="none", ec="0.5") + +plt.draw() +plt.show() + diff -Nru matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/examples/inset_locator_demo.py matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/examples/inset_locator_demo.py --- matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/examples/inset_locator_demo.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/examples/inset_locator_demo.py 2010-07-07 01:41:54.000000000 +0000 @@ -0,0 +1,45 @@ +import matplotlib.pyplot as plt + +from mpl_toolkits.axes_grid1.inset_locator import inset_axes, zoomed_inset_axes +from mpl_toolkits.axes_grid1.anchored_artists import AnchoredSizeBar + + +def add_sizebar(ax, size): + asb = AnchoredSizeBar(ax.transData, + size, + str(size), + loc=8, + pad=0.1, borderpad=0.5, sep=5, + frameon=False) + ax.add_artist(asb) + + +fig = plt.figure(1, [5.5, 3]) + +# first subplot +ax = fig.add_subplot(1,2,1) +ax.set_aspect(1.) + +axins = inset_axes(ax, + width="30%", # width = 30% of parent_bbox + height=1., # height : 1 inch + loc=3) + +plt.xticks(visible=False) +plt.yticks(visible=False) + + +# second subplot +ax = fig.add_subplot(1,2,2) +ax.set_aspect(1.) + +axins = zoomed_inset_axes(ax, 0.5, loc=1) # zoom = 0.5 + +plt.xticks(visible=False) +plt.yticks(visible=False) + +add_sizebar(ax, 0.5) +add_sizebar(axins, 0.5) + +plt.draw() +plt.show() diff -Nru matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/examples/parasite_simple2.py matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/examples/parasite_simple2.py --- matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/examples/parasite_simple2.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/examples/parasite_simple2.py 2010-07-07 01:41:54.000000000 +0000 @@ -0,0 +1,42 @@ +import matplotlib.transforms as mtransforms +import matplotlib.pyplot as plt +from mpl_toolkits.axes_grid1.parasite_axes import SubplotHost + +obs = [["01_S1", 3.88, 0.14, 1970, 63], + ["01_S4", 5.6, 0.82, 1622, 150], + ["02_S1", 2.4, 0.54, 1570, 40], + ["03_S1", 4.1, 0.62, 2380, 170]] + + +fig = plt.figure() + +ax_kms = SubplotHost(fig, 1,1,1, aspect=1.) + +# angular proper motion("/yr) to linear velocity(km/s) at distance=2.3kpc +pm_to_kms = 1./206265.*2300*3.085e18/3.15e7/1.e5 + +aux_trans = mtransforms.Affine2D().scale(pm_to_kms, 1.) +ax_pm = ax_kms.twin(aux_trans) +ax_pm.set_viewlim_mode("transform") + +fig.add_subplot(ax_kms) + +for n, ds, dse, w, we in obs: + time = ((2007+(10. + 4/30.)/12)-1988.5) + v = ds / time * pm_to_kms + ve = dse / time * pm_to_kms + ax_kms.errorbar([v], [w], xerr=[ve], yerr=[we], color="k") + + +ax_kms.axis["bottom"].set_label("Linear velocity at 2.3 kpc [km/s]") +ax_kms.axis["left"].set_label("FWHM [km/s]") +ax_pm.axis["top"].set_label("Proper Motion [$^{''}$/yr]") +ax_pm.axis["top"].label.set_visible(True) +ax_pm.axis["right"].major_ticklabels.set_visible(False) + +ax_kms.set_xlim(950, 3700) +ax_kms.set_ylim(950, 3100) +# xlim and ylim of ax_pms will be automatically adjusted. + +plt.draw() +plt.show() diff -Nru matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/examples/scatter_hist.py matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/examples/scatter_hist.py --- matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/examples/scatter_hist.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/examples/scatter_hist.py 2010-07-07 01:41:54.000000000 +0000 @@ -0,0 +1,53 @@ +import numpy as np +import matplotlib.pyplot as plt + +# the random data +x = np.random.randn(1000) +y = np.random.randn(1000) + + +fig = plt.figure(1, figsize=(5.5,5.5)) + +from mpl_toolkits.axes_grid1 import make_axes_locatable + +# the scatter plot: +axScatter = plt.subplot(111) +axScatter.scatter(x, y) +axScatter.set_aspect(1.) + +# create new axes on the right and on the top of the current axes +# The first argument of the new_vertical(new_horizontal) method is +# the height (width) of the axes to be created in inches. +divider = make_axes_locatable(axScatter) +axHistx = divider.append_axes("top", 1.2, pad=0.1, sharex=axScatter) +axHisty = divider.append_axes("right", 1.2, pad=0.1, sharey=axScatter) + +# make some labels invisible +plt.setp(axHistx.get_xticklabels() + axHisty.get_yticklabels(), + visible=False) + +# now determine nice limits by hand: +binwidth = 0.25 +xymax = np.max( [np.max(np.fabs(x)), np.max(np.fabs(y))] ) +lim = ( int(xymax/binwidth) + 1) * binwidth + +bins = np.arange(-lim, lim + binwidth, binwidth) +axHistx.hist(x, bins=bins) +axHisty.hist(y, bins=bins, orientation='horizontal') + +# the xaxis of axHistx and yaxis of axHisty are shared with axScatter, +# thus there is no need to manually adjust the xlim and ylim of these +# axis. + +#axHistx.axis["bottom"].major_ticklabels.set_visible(False) +for tl in axHistx.get_xticklabels(): + tl.set_visible(False) +axHistx.set_yticks([0, 50, 100]) + +#axHisty.axis["left"].major_ticklabels.set_visible(False) +for tl in axHisty.get_yticklabels(): + tl.set_visible(False) +axHisty.set_xticks([0, 50, 100]) + +plt.draw() +plt.show() diff -Nru matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/examples/simple_anchored_artists.py matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/examples/simple_anchored_artists.py --- matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/examples/simple_anchored_artists.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/examples/simple_anchored_artists.py 2010-07-07 01:41:54.000000000 +0000 @@ -0,0 +1,61 @@ +import matplotlib.pyplot as plt + + +def draw_text(ax): + from mpl_toolkits.axes_grid1.anchored_artists import AnchoredText + at = AnchoredText("Figure 1a", + loc=2, prop=dict(size=8), frameon=True, + ) + at.patch.set_boxstyle("round,pad=0.,rounding_size=0.2") + ax.add_artist(at) + + at2 = AnchoredText("Figure 1(b)", + loc=3, prop=dict(size=8), frameon=True, + bbox_to_anchor=(0., 1.), + bbox_transform=ax.transAxes + ) + at2.patch.set_boxstyle("round,pad=0.,rounding_size=0.2") + ax.add_artist(at2) + +def draw_circle(ax): # circle in the canvas coordinate + from mpl_toolkits.axes_grid1.anchored_artists import AnchoredDrawingArea + from matplotlib.patches import Circle + ada = AnchoredDrawingArea(20, 20, 0, 0, + loc=1, pad=0., frameon=False) + p = Circle((10, 10), 10) + ada.da.add_artist(p) + ax.add_artist(ada) + +def draw_ellipse(ax): + from mpl_toolkits.axes_grid1.anchored_artists import AnchoredEllipse + # draw an ellipse of width=0.1, height=0.15 in the data coordinate + ae = AnchoredEllipse(ax.transData, width=0.1, height=0.15, angle=0., + loc=3, pad=0.5, borderpad=0.4, frameon=True) + + ax.add_artist(ae) + +def draw_sizebar(ax): + from mpl_toolkits.axes_grid1.anchored_artists import AnchoredSizeBar + # draw a horizontal bar with length of 0.1 in Data coordinate + # (ax.transData) with a label underneath. + asb = AnchoredSizeBar(ax.transData, + 0.1, + r"1$^{\prime}$", + loc=8, + pad=0.1, borderpad=0.5, sep=5, + frameon=False) + ax.add_artist(asb) + + +if 1: + ax = plt.gca() + ax.set_aspect(1.) + + draw_text(ax) + draw_circle(ax) + draw_ellipse(ax) + draw_sizebar(ax) + + plt.show() + + diff -Nru matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/examples/simple_axesgrid2.py matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/examples/simple_axesgrid2.py --- matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/examples/simple_axesgrid2.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/examples/simple_axesgrid2.py 2010-07-07 01:41:54.000000000 +0000 @@ -0,0 +1,31 @@ +import matplotlib.pyplot as plt +from mpl_toolkits.axes_grid1 import ImageGrid + +def get_demo_image(): + import numpy as np + from matplotlib.cbook import get_sample_data + f = get_sample_data("axes_grid/bivariate_normal.npy", asfileobj=False) + z = np.load(f) + # z is a numpy array of 15x15 + return z, (-3,4,-4,3) + +F = plt.figure(1, (5.5, 3.5)) +grid = ImageGrid(F, 111, # similar to subplot(111) + nrows_ncols = (1, 3), + axes_pad = 0.1, + add_all=True, + label_mode = "L", + ) + +Z, extent = get_demo_image() # demo image + +im1=Z +im2=Z[:,:10] +im3=Z[:,10:] +vmin, vmax = Z.min(), Z.max() +for i, im in enumerate([im1, im2, im3]): + ax = grid[i] + ax.imshow(im, origin="lower", vmin=vmin, vmax=vmax, interpolation="nearest") + +plt.draw() +plt.show() diff -Nru matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/examples/simple_axesgrid.py matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/examples/simple_axesgrid.py --- matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/examples/simple_axesgrid.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/examples/simple_axesgrid.py 2010-07-07 01:41:54.000000000 +0000 @@ -0,0 +1,17 @@ +import matplotlib.pyplot as plt +from mpl_toolkits.axes_grid1 import ImageGrid +import numpy as np + +im = np.arange(100) +im.shape = 10, 10 + +fig = plt.figure(1, (4., 4.)) +grid = ImageGrid(fig, 111, # similar to subplot(111) + nrows_ncols = (2, 2), # creates 2x2 grid of axes + axes_pad=0.1, # pad between axes in inch. + ) + +for i in range(4): + grid[i].imshow(im) # The AxesGrid object work as a list of axes. + +plt.show() diff -Nru matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/examples/simple_axisline4.py matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/examples/simple_axisline4.py --- matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/examples/simple_axisline4.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/examples/simple_axisline4.py 2010-07-07 01:41:54.000000000 +0000 @@ -0,0 +1,19 @@ +import matplotlib.pyplot as plt +from mpl_toolkits.axes_grid1 import host_subplot +import mpl_toolkits.axisartist as AA +import numpy as np + +ax = host_subplot(111, axes_class=AA.Axes) +xx = np.arange(0, 2*np.pi, 0.01) +ax.plot(xx, np.sin(xx)) + +ax2 = ax.twin() # ax2 is responsible for "top" axis and "right" axis +ax2.set_xticks([0., .5*np.pi, np.pi, 1.5*np.pi, 2*np.pi]) +ax2.set_xticklabels(["$0$", r"$\frac{1}{2}\pi$", + r"$\pi$", r"$\frac{3}{2}\pi$", r"$2\pi$"]) + +ax2.axis["right"].major_ticklabels.set_visible(False) + +plt.draw() +plt.show() + diff -Nru matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/figures/axis_direction_demo_step01.py matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/figures/axis_direction_demo_step01.py --- matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/figures/axis_direction_demo_step01.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/figures/axis_direction_demo_step01.py 2010-07-07 01:41:45.000000000 +0000 @@ -0,0 +1,25 @@ +import matplotlib.pyplot as plt +import mpl_toolkits.axisartist as axisartist + +def setup_axes(fig, rect): + ax = axisartist.Subplot(fig, rect) + fig.add_axes(ax) + + ax.set_ylim(-0.1, 1.5) + ax.set_yticks([0, 1]) + + ax.axis[:].set_visible(False) + + ax.axis["x"] = ax.new_floating_axis(1, 0.5) + ax.axis["x"].set_axisline_style("->", size=1.5) + + return ax + +fig = plt.figure(figsize=(3,2.5)) +fig.subplots_adjust(top=0.8) +ax1 = setup_axes(fig, "111") + +ax1.axis["x"].set_axis_direction("left") + + +plt.show() diff -Nru matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/figures/axis_direction_demo_step02.py matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/figures/axis_direction_demo_step02.py --- matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/figures/axis_direction_demo_step02.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/figures/axis_direction_demo_step02.py 2010-07-07 01:41:45.000000000 +0000 @@ -0,0 +1,36 @@ +import matplotlib.pyplot as plt +import mpl_toolkits.axisartist as axisartist + +def setup_axes(fig, rect): + ax = axisartist.Subplot(fig, rect) + fig.add_axes(ax) + + ax.set_ylim(-0.1, 1.5) + ax.set_yticks([0, 1]) + + #ax.axis[:].toggle(all=False) + #ax.axis[:].line.set_visible(False) + ax.axis[:].set_visible(False) + + ax.axis["x"] = ax.new_floating_axis(1, 0.5) + ax.axis["x"].set_axisline_style("->", size=1.5) + + return ax + +fig = plt.figure(figsize=(6,2.5)) +fig.subplots_adjust(bottom=0.2, top=0.8) + +ax1 = setup_axes(fig, "121") +ax1.axis["x"].set_ticklabel_direction("+") +ax1.annotate("ticklabel direction=$+$", (0.5, 0), xycoords="axes fraction", + xytext=(0, -10), textcoords="offset points", + va="top", ha="center") + +ax2 = setup_axes(fig, "122") +ax2.axis["x"].set_ticklabel_direction("-") +ax2.annotate("ticklabel direction=$-$", (0.5, 0), xycoords="axes fraction", + xytext=(0, -10), textcoords="offset points", + va="top", ha="center") + + +plt.show() diff -Nru matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/figures/axis_direction_demo_step03.py matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/figures/axis_direction_demo_step03.py --- matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/figures/axis_direction_demo_step03.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/figures/axis_direction_demo_step03.py 2010-07-07 01:41:45.000000000 +0000 @@ -0,0 +1,40 @@ +import matplotlib.pyplot as plt +import mpl_toolkits.axisartist as axisartist + +def setup_axes(fig, rect): + ax = axisartist.Subplot(fig, rect) + fig.add_axes(ax) + + ax.set_ylim(-0.1, 1.5) + ax.set_yticks([0, 1]) + + #ax.axis[:].toggle(all=False) + #ax.axis[:].line.set_visible(False) + ax.axis[:].set_visible(False) + + ax.axis["x"] = ax.new_floating_axis(1, 0.5) + ax.axis["x"].set_axisline_style("->", size=1.5) + + return ax + +fig = plt.figure(figsize=(6,2.5)) +fig.subplots_adjust(bottom=0.2, top=0.8) + +ax1 = setup_axes(fig, "121") +ax1.axis["x"].label.set_text("Label") +ax1.axis["x"].toggle(ticklabels=False) +ax1.axis["x"].set_axislabel_direction("+") +ax1.annotate("label direction=$+$", (0.5, 0), xycoords="axes fraction", + xytext=(0, -10), textcoords="offset points", + va="top", ha="center") + +ax2 = setup_axes(fig, "122") +ax2.axis["x"].label.set_text("Label") +ax2.axis["x"].toggle(ticklabels=False) +ax2.axis["x"].set_axislabel_direction("-") +ax2.annotate("label direction=$-$", (0.5, 0), xycoords="axes fraction", + xytext=(0, -10), textcoords="offset points", + va="top", ha="center") + + +plt.show() diff -Nru matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/figures/axis_direction_demo_step04.py matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/figures/axis_direction_demo_step04.py --- matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/figures/axis_direction_demo_step04.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/figures/axis_direction_demo_step04.py 2010-07-07 01:41:45.000000000 +0000 @@ -0,0 +1,54 @@ +import matplotlib.pyplot as plt +import mpl_toolkits.axisartist as axisartist + +def setup_axes(fig, rect): + ax = axisartist.Subplot(fig, rect) + fig.add_axes(ax) + + ax.set_ylim(-0.1, 1.5) + ax.set_yticks([0, 1]) + + ax.axis[:].set_visible(False) + + ax.axis["x1"] = ax.new_floating_axis(1, 0.3) + ax.axis["x1"].set_axisline_style("->", size=1.5) + + ax.axis["x2"] = ax.new_floating_axis(1, 0.7) + ax.axis["x2"].set_axisline_style("->", size=1.5) + + return ax + +fig = plt.figure(figsize=(6,2.5)) +fig.subplots_adjust(bottom=0.2, top=0.8) + +ax1 = setup_axes(fig, "121") +ax1.axis["x1"].label.set_text("rotation=0") +ax1.axis["x1"].toggle(ticklabels=False) + +ax1.axis["x2"].label.set_text("rotation=10") +ax1.axis["x2"].label.set_rotation(10) +ax1.axis["x2"].toggle(ticklabels=False) + +ax1.annotate("label direction=$+$", (0.5, 0), xycoords="axes fraction", + xytext=(0, -10), textcoords="offset points", + va="top", ha="center") + +ax2 = setup_axes(fig, "122") + +ax2.axis["x1"].set_axislabel_direction("-") +ax2.axis["x2"].set_axislabel_direction("-") + +ax2.axis["x1"].label.set_text("rotation=0") +ax2.axis["x1"].toggle(ticklabels=False) + +ax2.axis["x2"].label.set_text("rotation=10") +ax2.axis["x2"].label.set_rotation(10) +ax2.axis["x2"].toggle(ticklabels=False) + + +ax2.annotate("label direction=$-$", (0.5, 0), xycoords="axes fraction", + xytext=(0, -10), textcoords="offset points", + va="top", ha="center") + + +plt.show() diff -Nru matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/figures/demo_axes_divider.py matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/figures/demo_axes_divider.py --- matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/figures/demo_axes_divider.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/figures/demo_axes_divider.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,124 +0,0 @@ -import matplotlib.pyplot as plt -from demo_image import get_demo_image -#import mpl_toolkits.imaging.axes_grid as imaging - -def demo_simple_image(ax): - Z, extent = get_demo_image() - - im = ax.imshow(Z, extent=extent, interpolation="nearest") - cb = plt.colorbar(im) - plt.setp(cb.ax.get_yticklabels(), visible=False) - - -def demo_locatable_axes_hard(fig1): - - from mpl_toolkits.axes_grid \ - import SubplotDivider, LocatableAxes, Size - - divider = SubplotDivider(fig1, 2, 2, 2, aspect=True) - - # axes for image - ax = LocatableAxes(fig1, divider.get_position()) - - # axes for coloarbar - ax_cb = LocatableAxes(fig1, divider.get_position()) - - h = [Size.AxesX(ax), # main axes - Size.Fixed(0.05), # padding, 0.1 inch - Size.Fixed(0.2), # colorbar, 0.3 inch - ] - - v = [Size.AxesY(ax)] - - divider.set_horizontal(h) - divider.set_vertical(v) - - ax.set_axes_locator(divider.new_locator(nx=0, ny=0)) - ax_cb.set_axes_locator(divider.new_locator(nx=2, ny=0)) - - fig1.add_axes(ax) - fig1.add_axes(ax_cb) - - ax_cb.axis["left"].toggle(all=False) - ax_cb.axis["right"].toggle(ticks=True) - - Z, extent = get_demo_image() - - im = ax.imshow(Z, extent=extent, interpolation="nearest") - plt.colorbar(im, cax=ax_cb) - plt.setp(ax_cb.get_yticklabels(), visible=False) - - -def demo_locatable_axes_easy(ax): - from mpl_toolkits.axes_grid import make_axes_locatable - - divider = make_axes_locatable(ax) - - ax_cb = divider.new_horizontal(size="5%", pad=0.05) - fig1 = ax.get_figure() - fig1.add_axes(ax_cb) - - Z, extent = get_demo_image() - im = ax.imshow(Z, extent=extent, interpolation="nearest") - - plt.colorbar(im, cax=ax_cb) - ax_cb.yaxis.tick_right() - for tl in ax_cb.get_yticklabels(): - tl.set_visible(False) - ax_cb.yaxis.tick_right() - - -def demo_images_side_by_sied(ax): - from mpl_toolkits.axes_grid import make_axes_locatable - - divider = make_axes_locatable(ax) - - Z, extent = get_demo_image() - ax2 = divider.new_horizontal(size="100%", pad=0.05) - fig1 = ax.get_figure() - fig1.add_axes(ax2) - - ax.imshow(Z, extent=extent, interpolation="nearest") - ax2.imshow(Z, extent=extent, interpolation="nearest") - for tl in ax2.get_yticklabels(): - tl.set_visible(False) - - -def demo(): - - fig1 = plt.figure(1, (6, 6)) - fig1.clf() - - ## PLOT 1 - # simple image & colorbar - ax = fig1.add_subplot(2, 2, 1) - demo_simple_image(ax) - - ## PLOT 2 - # image and colorbar whose location is adjusted in the drawing time. - # a hard way - - demo_locatable_axes_hard(fig1) - - - ## PLOT 3 - # image and colorbar whose location is adjusted in the drawing time. - # a easy way - - ax = fig1.add_subplot(2, 2, 3) - demo_locatable_axes_easy(ax) - - - ## PLOT 4 - # two images side by sied with fixed padding. - - ax = fig1.add_subplot(2, 2, 4) - demo_images_side_by_sied(ax) - - plt.draw() - plt.show() - - - -if __name__ == "__main__": - demo() diff -Nru matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/figures/demo_axes_grid.py matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/figures/demo_axes_grid.py --- matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/figures/demo_axes_grid.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/figures/demo_axes_grid.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,87 +0,0 @@ -import matplotlib.pyplot as plt -from demo_image import get_demo_image -from mpl_toolkits.axes_grid import AxesGrid - - -def demo_simple_grid(fig): - """ - A grid of 2x2 images with 0.05 inch pad between images and only - the lower-left axes is labeld. - """ - grid = AxesGrid(fig, 131, # similar to subplot(131) - nrows_ncols = (2, 2), - axes_pad = 0.05, - label_mode = "1", - ) - - Z, extent = get_demo_image() - for i in range(4): - im = grid[i].imshow(Z, extent=extent, interpolation="nearest") - - # This only affects axes in first column and second row as share_all = False. - grid.axes_llc.set_xticks([-2, 0, 2]) - grid.axes_llc.set_yticks([-2, 0, 2]) - - -def demo_grid_with_single_cbar(fig): - """ - A grid of 2x2 images with a single colobar - """ - grid = AxesGrid(fig, 132, # similar to subplot(132) - nrows_ncols = (2, 2), - axes_pad = 0.0, - share_all=True, - label_mode = "L", - cbar_mode="single", - ) - - Z, extent = get_demo_image() - for i in range(4): - im = grid[i].imshow(Z, extent=extent, interpolation="nearest") - plt.colorbar(im, cax = grid.cbar_axes[0]) - grid.cbar_axes[0].colorbar(im) - - # This affects all axes as share_all = True. - grid.axes_llc.set_xticks([-2, 0, 2]) - grid.axes_llc.set_yticks([-2, 0, 2]) - - -def demo_grid_with_each_cbar(fig): - """ - A grid of 2x2 images. Each image has its own colobar. - """ - - grid = AxesGrid(F, 133, # similar to subplot(122) - nrows_ncols = (2, 2), - axes_pad = 0.1, - label_mode = "1", - share_all = True, - cbar_location="top", - cbar_mode="each", - cbar_size="7%", - cbar_pad="2%", - ) - Z, extent = get_demo_image() - for i in range(4): - im = grid[i].imshow(Z, extent=extent, interpolation="nearest") - grid.cbar_axes[i].colorbar(im) - - # This affects all axes because we set share_all = True. - grid.axes_llc.set_xticks([-2, 0, 2]) - grid.axes_llc.set_yticks([-2, 0, 2]) - - - -if __name__ == "__main__": - - F = plt.figure(1, (5.5, 2.5)) - - F.subplots_adjust(left=0.05, right=0.98) - - demo_simple_grid(F) - demo_grid_with_single_cbar(F) - demo_grid_with_each_cbar(F) - - plt.draw() - plt.show() - diff -Nru matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/figures/demo_axes_rgb.py matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/figures/demo_axes_rgb.py --- matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/figures/demo_axes_rgb.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/figures/demo_axes_rgb.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,82 +0,0 @@ -import numpy as np -import matplotlib.pyplot as plt - -from demo_axes_divider import get_demo_image -from mpl_toolkits.axes_grid.axes_rgb import make_rgb_axes, RGBAxes - -def get_rgb(): - Z, extent = get_demo_image() - - Z[Z<0] = 0. - Z = Z/Z.max() - - R = Z[:13,:13] - G = Z[2:,2:] - B = Z[:13,2:] - - return R, G, B - - -def make_cube(r, g, b): - ny, nx = r.shape - R = np.zeros([ny, nx, 3], dtype="d") - R[:,:,0] = r - G = np.zeros_like(R) - G[:,:,1] = g - B = np.zeros_like(R) - B[:,:,2] = b - - RGB = R + G + B - - return R, G, B, RGB - - - -def demo_rgb(): - fig = plt.figure(1) - fig.clf() - - ax = fig.add_subplot(111) - ax_r, ax_g, ax_b = make_rgb_axes(ax, pad=0.02) - #fig.add_axes(ax_r) - #fig.add_axes(ax_g) - #fig.add_axes(ax_b) - - r, g, b = get_rgb() - im_r, im_g, im_b, im_rgb = make_cube(r, g, b) - kwargs = dict(origin="lower", interpolation="nearest") - ax.imshow(im_rgb, **kwargs) - ax_r.imshow(im_r, **kwargs) - ax_g.imshow(im_g, **kwargs) - ax_b.imshow(im_b, **kwargs) - - - - -def demo_rgb2(): - fig = plt.figure(2) - ax = RGBAxes(fig, [0.1, 0.1, 0.8, 0.8], pad=0.0) - #fig.add_axes(ax) - #ax.add_RGB_to_figure() - - r, g, b = get_rgb() - kwargs = dict(origin="lower", interpolation="nearest") - ax.imshow_rgb(r, g, b, **kwargs) - - ax.RGB.set_xlim(0., 9.5) - ax.RGB.set_ylim(0.9, 10.6) - - for ax1 in [ax.RGB, ax.R, ax.G, ax.B]: - for axisline in ax1._axislines.values(): - axisline.line.set_color("w") - axisline.major_ticks.set_mec("w") - - return ax - - -if __name__ == "__main__": - demo_rgb() - ax = demo_rgb2() - - plt.draw() - plt.show() diff -Nru matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/figures/demo_axis_direction.py matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/figures/demo_axis_direction.py --- matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/figures/demo_axis_direction.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/figures/demo_axis_direction.py 2010-07-07 01:41:45.000000000 +0000 @@ -0,0 +1,98 @@ + + +import numpy as np +import mpl_toolkits.axisartist.angle_helper as angle_helper +import mpl_toolkits.axisartist.grid_finder as grid_finder +from matplotlib.projections import PolarAxes +from matplotlib.transforms import Affine2D + +import mpl_toolkits.axisartist as axisartist + +from mpl_toolkits.axisartist.grid_helper_curvelinear import GridHelperCurveLinear + + +def setup_axes(fig, rect): + """ + polar projection, but in a rectangular box. + """ + + # see demo_curvelinear_grid.py for details + tr = Affine2D().scale(np.pi/180., 1.) + PolarAxes.PolarTransform() + + extreme_finder = angle_helper.ExtremeFinderCycle(20, 20, + lon_cycle = 360, + lat_cycle = None, + lon_minmax = None, + lat_minmax = (0, np.inf), + ) + + grid_locator1 = angle_helper.LocatorDMS(12) + grid_locator2 = grid_finder.MaxNLocator(5) + + tick_formatter1 = angle_helper.FormatterDMS() + + grid_helper = GridHelperCurveLinear(tr, + extreme_finder=extreme_finder, + grid_locator1=grid_locator1, + grid_locator2=grid_locator2, + tick_formatter1=tick_formatter1 + ) + + + ax1 = axisartist.Subplot(fig, rect, grid_helper=grid_helper) + ax1.axis[:].toggle(ticklabels=False) + + fig.add_subplot(ax1) + + ax1.set_aspect(1.) + ax1.set_xlim(-5, 12) + ax1.set_ylim(-5, 10) + + #ax1.grid(True) + + return ax1 + + +def add_floating_axis1(ax1): + ax1.axis["lat"] = axis = ax1.new_floating_axis(0, 30) + axis.label.set_text(r"$\theta = 30^{\circ}$") + axis.label.set_visible(True) + + return axis + + +def add_floating_axis2(ax1): + ax1.axis["lon"] = axis = ax1.new_floating_axis(1, 6) + axis.label.set_text(r"$r = 6$") + axis.label.set_visible(True) + + return axis + + +import matplotlib.pyplot as plt +fig = plt.figure(1, figsize=(8, 4.)) +fig.clf() +fig.subplots_adjust(left=0.01, right=0.99, bottom=0.01, top=0.99, + wspace=0.01, hspace=0.01) + +for i, d in enumerate(["bottom", "left", "top", "right"]): + ax1 = setup_axes(fig, rect=241++i) + axis = add_floating_axis1(ax1) + axis.set_axis_direction(d) + ax1.annotate(d, (0, 1), (5, -5), + xycoords="axes fraction", textcoords="offset points", + va="top", ha="left") + +for i, d in enumerate(["bottom", "left", "top", "right"]): + ax1 = setup_axes(fig, rect=245++i) + axis = add_floating_axis2(ax1) + axis.set_axis_direction(d) + ax1.annotate(d, (0, 1), (5, -5), + xycoords="axes fraction", textcoords="offset points", + va="top", ha="left") + + + +plt.show() + + diff -Nru matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/figures/demo_colorbar_of_inset_axes.py matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/figures/demo_colorbar_of_inset_axes.py --- matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/figures/demo_colorbar_of_inset_axes.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/figures/demo_colorbar_of_inset_axes.py 2010-07-07 01:41:45.000000000 +0000 @@ -0,0 +1,49 @@ +import matplotlib.pyplot as plt + +from mpl_toolkits.axes_grid.inset_locator import inset_axes, zoomed_inset_axes +from mpl_toolkits.axes_grid.colorbar import colorbar + +def get_demo_image(): + from matplotlib.cbook import get_sample_data + import numpy as np + f = get_sample_data("axes_grid/bivariate_normal.npy", asfileobj=False) + z = np.load(f) + # z is a numpy array of 15x15 + return z, (-3,4,-4,3) + + +fig = plt.figure(1, [5,4]) +ax = fig.add_subplot(111) + +Z, extent = get_demo_image() + +ax.set(aspect=1, + xlim=(-15, 15), + ylim=(-20, 5)) + + +axins = zoomed_inset_axes(ax, 2, loc=2) # zoom = 6 +im = axins.imshow(Z, extent=extent, interpolation="nearest", + origin="lower") + +plt.xticks(visible=False) +plt.yticks(visible=False) + + +# colorbar +cax = inset_axes(axins, + width="5%", # width = 10% of parent_bbox width + height="100%", # height : 50% + loc=3, + bbox_to_anchor=(1.05, 0., 1, 1), + bbox_transform=axins.transAxes, + borderpad=0, + ) + + +colorbar(im, cax=cax) #, ticks=[1,2,3]) + + +plt.draw() +plt.show() + diff -Nru matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/figures/demo_colorbar_with_axes_divider.py matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/figures/demo_colorbar_with_axes_divider.py --- matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/figures/demo_colorbar_with_axes_divider.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/figures/demo_colorbar_with_axes_divider.py 2010-07-07 01:41:45.000000000 +0000 @@ -0,0 +1,25 @@ +import matplotlib.pyplot as plt +from mpl_toolkits.axes_grid.axes_divider import make_axes_locatable + +from mpl_toolkits.axes_grid.colorbar import colorbar +# from matplotlib.pyplot import colorbar + +fig = plt.figure(1, figsize=(6, 3)) +fig.subplots_adjust(wspace=0.5) + +ax1 = fig.add_subplot(121) +im1 = ax1.imshow([[1,2],[3,4]]) + +ax1_divider = make_axes_locatable(ax1) +cax1 = ax1_divider.append_axes("right", size="7%", pad="2%") +cb1 = colorbar(im1, cax=cax1) + +ax2 = fig.add_subplot(122) +im2 = ax2.imshow([[1,2],[3,4]]) + +ax2_divider = make_axes_locatable(ax2) +cax2 = ax2_divider.append_axes("top", size="7%", pad="2%") +cb2 = colorbar(im2, cax=cax2, orientation="horizontal") +cax2.xaxis.set_ticks_position("top") +plt.show() + diff -Nru matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/figures/demo_curvelinear_grid.py matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/figures/demo_curvelinear_grid.py --- matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/figures/demo_curvelinear_grid.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/figures/demo_curvelinear_grid.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,131 +0,0 @@ -import numpy as np -#from matplotlib.path import Path - -import matplotlib.pyplot as plt -import matplotlib.cbook as cbook - -from mpl_toolkits.axes_grid.grid_helper_curvelinear import GridHelperCurveLinear -from mpl_toolkits.axes_grid.axislines import Subplot - -from mpl_toolkits.axes_grid.parasite_axes import SubplotHost, \ - ParasiteAxesAuxTrans - - -def curvelinear_test1(fig): - """ - grid for custom transform. - """ - - def tr(x, y): - x, y = np.asarray(x), np.asarray(y) - return x, y-x - - def inv_tr(x,y): - x, y = np.asarray(x), np.asarray(y) - return x, y+x - - - grid_helper = GridHelperCurveLinear((tr, inv_tr)) - - ax1 = Subplot(fig, 1, 2, 1, grid_helper=grid_helper) - # ax1 will have a ticks and gridlines defined by the given - # transform (+ transData of the Axes). Note that the transform of - # the Axes itself (i.e., transData) is not affected by the given - # transform. - - fig.add_subplot(ax1) - - xx, yy = tr([3, 6], [5.0, 10.]) - ax1.plot(xx, yy) - - ax1.set_aspect(1.) - ax1.set_xlim(0, 10.) - ax1.set_ylim(0, 10.) - - ax1.grid(True) - - - -import mpl_toolkits.axes_grid.angle_helper as angle_helper -from matplotlib.projections import PolarAxes -from matplotlib.transforms import Affine2D - -def curvelinear_test2(fig): - """ - polar projection, but in a rectangular box. - """ - - # PolarAxes.PolarTransform takes radian. However, we want our coordinate - # system in degree - tr = Affine2D().scale(np.pi/180., 1.) + PolarAxes.PolarTransform() - - # polar projection, which involves cycle, and also has limits in - # its coordinates, needs a special method to find the extremes - # (min, max of the coordinate within the view). - - # 20, 20 : number of sampling points along x, y direction - extreme_finder = angle_helper.ExtremeFinderCycle(20, 20, - lon_cycle = 360, - lat_cycle = None, - lon_minmax = None, - lat_minmax = (0, np.inf), - ) - - grid_locator1 = angle_helper.LocatorDMS(12) - # Find a grid values appropriate for the coordinate (degree, - # minute, second). - - tick_formatter1 = angle_helper.FormatterDMS() - # And also uses an appropriate formatter. Note that,the - # acceptable Locator and Formatter class is a bit different than - # that of mpl's, and you cannot directly use mpl's Locator and - # Formatter here (but may be possible in the future). - - grid_helper = GridHelperCurveLinear(tr, - extreme_finder=extreme_finder, - grid_locator1=grid_locator1, - tick_formatter1=tick_formatter1 - ) - - - ax1 = SubplotHost(fig, 1, 2, 2, grid_helper=grid_helper) - - # make ticklabels of right and top axis visible. - ax1.axis["right"].major_ticklabels.set_visible(True) - ax1.axis["top"].major_ticklabels.set_visible(True) - - # let right axis shows ticklabels for 1st coordinate (angle) - ax1.axis["right"].get_helper().nth_coord_ticks=0 - # let bottom axis shows ticklabels for 2nd coordinate (radius) - ax1.axis["bottom"].get_helper().nth_coord_ticks=1 - - fig.add_subplot(ax1) - - - # A parasite axes with given transform - ax2 = ParasiteAxesAuxTrans(ax1, tr, "equal") - # note that ax2.transData == tr + ax1.transData - # Anthing you draw in ax2 will match the ticks and grids of ax1. - ax1.parasites.append(ax2) - intp = cbook.simple_linear_interpolation - ax2.plot(intp(np.array([0, 30]), 50), - intp(np.array([10., 10.]), 50)) - - ax1.set_aspect(1.) - ax1.set_xlim(-5, 12) - ax1.set_ylim(-5, 10) - - ax1.grid(True) - -if 1: - fig = plt.figure(1, figsize=(7, 4)) - fig.clf() - - curvelinear_test1(fig) - curvelinear_test2(fig) - - plt.draw() - plt.show() - - - diff -Nru matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/figures/demo_floating_axis.py matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/figures/demo_floating_axis.py --- matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/figures/demo_floating_axis.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/figures/demo_floating_axis.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,73 +0,0 @@ -""" -An experimental support for curvelinear grid. -""" - - -def curvelinear_test2(fig): - """ - polar projection, but in a rectangular box. - """ - global ax1 - import numpy as np - import mpl_toolkits.axes_grid.angle_helper as angle_helper - from matplotlib.projections import PolarAxes - from matplotlib.transforms import Affine2D - - from mpl_toolkits.axes_grid.parasite_axes import SubplotHost - - from mpl_toolkits.axes_grid.grid_helper_curvelinear import GridHelperCurveLinear - - # see demo_curvelinear_grid.py for details - tr = Affine2D().scale(np.pi/180., 1.) + PolarAxes.PolarTransform() - - extreme_finder = angle_helper.ExtremeFinderCycle(20, 20, - lon_cycle = 360, - lat_cycle = None, - lon_minmax = None, - lat_minmax = (0, np.inf), - ) - - grid_locator1 = angle_helper.LocatorDMS(12) - - tick_formatter1 = angle_helper.FormatterDMS() - - grid_helper = GridHelperCurveLinear(tr, - extreme_finder=extreme_finder, - grid_locator1=grid_locator1, - tick_formatter1=tick_formatter1 - ) - - - ax1 = SubplotHost(fig, 1, 1, 1, grid_helper=grid_helper) - - fig.add_subplot(ax1) - - # Now creates floating axis - - #grid_helper = ax1.get_grid_helper() - # floating axis whose first coordinate (theta) is fixed at 60 - ax1.axis["lat"] = axis = ax1.new_floating_axis(0, 60) - axis.label.set_text(r"$\theta = 60^{\circ}$") - axis.label.set_visible(True) - - # floating axis whose second coordinate (r) is fixed at 6 - ax1.axis["lon"] = axis = ax1.new_floating_axis(1, 6) - axis.label.set_text(r"$r = 6$") - - ax1.set_aspect(1.) - ax1.set_xlim(-5, 12) - ax1.set_ylim(-5, 10) - - ax1.grid(True) - -if __name__ == "__main__": - import matplotlib.pyplot as plt - fig = plt.figure(1, figsize=(5, 5)) - fig.clf() - - curvelinear_test2(fig) - - plt.draw() - plt.show() - - diff -Nru matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/figures/demo_image.py matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/figures/demo_image.py --- matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/figures/demo_image.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/figures/demo_image.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -import numpy as np - -def get_demo_image(): - # prepare image - delta = 0.5 - - extent = (-3,4,-4,3) - x = np.arange(-3.0, 4.001, delta) - y = np.arange(-4.0, 3.001, delta) - X, Y = np.meshgrid(x, y) - import matplotlib.mlab as mlab - Z1 = mlab.bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0) - Z2 = mlab.bivariate_normal(X, Y, 1.5, 0.5, 1, 1) - Z = (Z1 - Z2) * 10 - - return Z, extent - diff -Nru matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/figures/demo_new_colorbar.py matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/figures/demo_new_colorbar.py --- matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/figures/demo_new_colorbar.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/figures/demo_new_colorbar.py 2010-07-07 01:41:45.000000000 +0000 @@ -0,0 +1,21 @@ +import matplotlib.pyplot as plt + +plt.rcParams["text.usetex"]=False + +fig = plt.figure(1, figsize=(6, 3)) + +ax1 = fig.add_subplot(121) +im1 = ax1.imshow([[1,2],[3,4]]) +cb1 = plt.colorbar(im1) +cb1.ax.set_yticks([1, 3]) +ax1.set_title("Original MPL's colorbar w/\nset_yticks([1,3])", size=10) + +from mpl_toolkits.axes_grid.colorbar import colorbar +ax2 = fig.add_subplot(122) +im2 = ax2.imshow([[1,2],[3,4]]) +cb2 = colorbar(im2) +cb2.ax.set_yticks([1, 3]) +ax2.set_title("AxesGrid's colorbar w/\nset_yticks([1,3])", size=10) + +plt.show() + diff -Nru matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/figures/demo_parasite_axes2.py matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/figures/demo_parasite_axes2.py --- matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/figures/demo_parasite_axes2.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/figures/demo_parasite_axes2.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,54 +0,0 @@ -from mpl_toolkits.axes_grid.parasite_axes import SubplotHost -import matplotlib.pyplot as plt - -if 1: - fig = plt.figure(1) - - host = SubplotHost(fig, 111) - - host.set_ylabel("Density") - host.set_xlabel("Distance") - - par1 = host.twinx() - par2 = host.twinx() - - par1.set_ylabel("Temperature") - - par2.axis["right"].set_visible(False) - - offset = 60, 0 - new_axisline = par2.get_grid_helper().new_fixed_axis - par2.axis["right2"] = new_axisline(loc="right", - axes=par2, - offset=offset) - - par2.axis["right2"].label.set_visible(True) - par2.axis["right2"].set_label("Velocity") - - fig.add_axes(host) - plt.subplots_adjust(right=0.75) - - host.set_xlim(0, 2) - host.set_ylim(0, 2) - - host.set_xlabel("Distance") - host.set_ylabel("Density") - par1.set_ylabel("Temperature") - - p1, = host.plot([0, 1, 2], [0, 1, 2], label="Density") - p2, = par1.plot([0, 1, 2], [0, 3, 2], label="Temperature") - p3, = par2.plot([0, 1, 2], [50, 30, 15], label="Velocity") - - par1.set_ylim(0, 4) - par2.set_ylim(1, 65) - - host.legend() - - host.axis["left"].label.set_color(p1.get_color()) - par1.axis["right"].label.set_color(p2.get_color()) - par2.axis["right2"].label.set_color(p3.get_color()) - - plt.draw() - plt.show() - - #plt.savefig("Test") diff -Nru matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/figures/demo_ticklabel_alignment.py matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/figures/demo_ticklabel_alignment.py --- matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/figures/demo_ticklabel_alignment.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/figures/demo_ticklabel_alignment.py 2010-07-07 01:41:45.000000000 +0000 @@ -0,0 +1,38 @@ + + +import matplotlib.pyplot as plt +import mpl_toolkits.axisartist as axisartist + + +def setup_axes(fig, rect): + + ax = axisartist.Subplot(fig, rect) + fig.add_subplot(ax) + + ax.set_yticks([0.2, 0.8]) + ax.set_yticklabels(["short", "loooong"]) + ax.set_xticks([0.2, 0.8]) + ax.set_xticklabels([r"$\frac{1}{2}\pi$", r"$\pi$"]) + + return ax + +fig = plt.figure(1, figsize=(3, 5)) +fig.subplots_adjust(left=0.5, hspace=0.7) + + + +ax = setup_axes(fig, 311) +ax.set_ylabel("ha=right") +ax.set_xlabel("va=baseline") + +ax = setup_axes(fig, 312) +ax.axis["left"].major_ticklabels.set_ha("center") +ax.axis["bottom"].major_ticklabels.set_va("top") +ax.set_ylabel("ha=center") +ax.set_xlabel("va=top") + +ax = setup_axes(fig, 313) +ax.axis["left"].major_ticklabels.set_ha("left") +ax.axis["bottom"].major_ticklabels.set_va("bottom") +ax.set_ylabel("ha=left") +ax.set_xlabel("va=bottom") diff -Nru matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/figures/demo_ticklabel_direction.py matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/figures/demo_ticklabel_direction.py --- matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/figures/demo_ticklabel_direction.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/figures/demo_ticklabel_direction.py 2010-07-07 01:41:45.000000000 +0000 @@ -0,0 +1,52 @@ + +import matplotlib.pyplot as plt +import mpl_toolkits.axes_grid.axislines as axislines + + +def setup_axes(fig, rect): + + ax = axislines.Subplot(fig, rect) + fig.add_subplot(ax) + + ax.set_yticks([0.2, 0.8]) + #ax.set_yticklabels(["short", "loooong"]) + ax.set_xticks([0.2, 0.8]) + #ax.set_xticklabels([r"$\frac{1}{2}\pi$", r"$\pi$"]) + + return ax + +fig = plt.figure(1, figsize=(6, 3)) +fig.subplots_adjust(bottom=0.2) + + + +ax = setup_axes(fig, 131) +for axis in ax.axis.values(): axis.major_ticks.set_tick_out(True) +#or you can simply do "ax.axis[:].major_ticks.set_tick_out(True)" + + + + +ax = setup_axes(fig, 132) +ax.axis["left"].set_axis_direction("right") +ax.axis["bottom"].set_axis_direction("top") +ax.axis["right"].set_axis_direction("left") +ax.axis["top"].set_axis_direction("bottom") + +#ax.axis["left"].major_ticklabels.set_pad(0) +#ax.axis["bottom"].major_ticklabels.set_pad(10) + + + +ax = setup_axes(fig, 133) +ax.axis["left"].set_axis_direction("right") +ax.axis[:].major_ticks.set_tick_out(True) + +ax.axis["left"].label.set_text("Long Label Left") +ax.axis["bottom"].label.set_text("Label Bottom") +ax.axis["right"].label.set_text("Long Label Right") +ax.axis["right"].label.set_visible(True) +ax.axis["left"].label.set_pad(0) +ax.axis["bottom"].label.set_pad(10) + +plt.show() diff -Nru matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/figures/inset_locator_demo2.py matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/figures/inset_locator_demo2.py --- matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/figures/inset_locator_demo2.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/figures/inset_locator_demo2.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,42 +0,0 @@ -import matplotlib.pyplot as plt - -from mpl_toolkits.axes_grid.inset_locator import zoomed_inset_axes -from mpl_toolkits.axes_grid.inset_locator import mark_inset - -import numpy as np - -from demo_image import get_demo_image - - -fig = plt.figure(1, [5,4]) -ax = fig.add_subplot(111) - -# prepare the demo image -Z, extent = get_demo_image() -Z2 = np.zeros([150, 150], dtype="d") -ny, nx = Z.shape -Z2[30:30+ny, 30:30+nx] = Z - -# extent = [-3, 4, -4, 3] -ax.imshow(Z2, extent=extent, interpolation="nearest", - origin="lower") - -axins = zoomed_inset_axes(ax, 6, loc=1) # zoom = 6 -axins.imshow(Z2, extent=extent, interpolation="nearest", - origin="lower") - -# sub region of the original image -x1, x2, y1, y2 = -1.5, -0.9, -2.5, -1.9 -axins.set_xlim(x1, x2) -axins.set_ylim(y1, y2) - -plt.xticks(visible=False) -plt.yticks(visible=False) - -# draw a bbox of the region of the inset axes in the parent axes and -# connecting lines between the bbox and the inset axes area -mark_inset(ax, axins, loc1=2, loc2=4, fc="none", ec="0.5") - -plt.draw() -plt.show() - diff -Nru matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/figures/inset_locator_demo.py matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/figures/inset_locator_demo.py --- matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/figures/inset_locator_demo.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/figures/inset_locator_demo.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,45 +0,0 @@ -import matplotlib.pyplot as plt - -from mpl_toolkits.axes_grid.inset_locator import inset_axes, zoomed_inset_axes -from mpl_toolkits.axes_grid.anchored_artists import AnchoredSizeBar - - -def add_sizebar(ax, size): - asb = AnchoredSizeBar(ax.transData, - size, - str(size), - loc=8, - pad=0.1, borderpad=0.5, sep=5, - frameon=False) - ax.add_artist(asb) - - -fig = plt.figure(1, [5.5, 3]) - -# first subplot -ax = fig.add_subplot(1,2,1) -ax.set_aspect(1.) - -axins = inset_axes(ax, - width="30%", # width = 30% of parent_bbox - height=1., # height : 1 inch - loc=3) - -plt.xticks(visible=False) -plt.yticks(visible=False) - - -# second subplot -ax = fig.add_subplot(1,2,2) -ax.set_aspect(1.) - -axins = zoomed_inset_axes(ax, 0.5, loc=1) # zoom = 0.5 - -plt.xticks(visible=False) -plt.yticks(visible=False) - -add_sizebar(ax, 0.5) -add_sizebar(axins, 0.5) - -plt.draw() -plt.show() diff -Nru matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/figures/parasite_simple2.py matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/figures/parasite_simple2.py --- matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/figures/parasite_simple2.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/figures/parasite_simple2.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,42 +0,0 @@ -import matplotlib.transforms as mtransforms -import matplotlib.pyplot as plt -from mpl_toolkits.axes_grid.parasite_axes import SubplotHost - -obs = [["01_S1", 3.88, 0.14, 1970, 63], - ["01_S4", 5.6, 0.82, 1622, 150], - ["02_S1", 2.4, 0.54, 1570, 40], - ["03_S1", 4.1, 0.62, 2380, 170]] - - -fig = plt.figure() - -ax_kms = SubplotHost(fig, 1,1,1, aspect=1.) - -# angular proper motion("/yr) to linear velocity(km/s) at distance=2.3kpc -pm_to_kms = 1./206265.*2300*3.085e18/3.15e7/1.e5 - -aux_trans = mtransforms.Affine2D().scale(pm_to_kms, 1.) -ax_pm = ax_kms.twin(aux_trans) -ax_pm.set_viewlim_mode("transform") - -fig.add_subplot(ax_kms) - -for n, ds, dse, w, we in obs: - time = ((2007+(10. + 4/30.)/12)-1988.5) - v = ds / time * pm_to_kms - ve = dse / time * pm_to_kms - ax_kms.errorbar([v], [w], xerr=[ve], yerr=[we], color="k") - - -ax_kms.axis["bottom"].set_label("Linear velocity at 2.3 kpc [km/s]") -ax_kms.axis["left"].set_label("FWHM [km/s]") -ax_pm.axis["top"].set_label("Proper Motion [$^{''}$/yr]") -ax_pm.axis["top"].label.set_visible(True) -ax_pm.axis["right"].major_ticklabels.set_visible(False) - -ax_kms.set_xlim(950, 3700) -ax_kms.set_ylim(950, 3100) -# xlim and ylim of ax_pms will be automatically adjusted. - -plt.draw() -plt.show() diff -Nru matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/figures/parasite_simple.py matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/figures/parasite_simple.py --- matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/figures/parasite_simple.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/figures/parasite_simple.py 2010-07-07 01:41:45.000000000 +0000 @@ -1,10 +1,7 @@ -from mpl_toolkits.axes_grid.parasite_axes import SubplotHost +from mpl_toolkits.axes_grid1 import host_subplot import matplotlib.pyplot as plt -fig = plt.figure(1) - -host = SubplotHost(fig, 111) -fig.add_subplot(host) +host = host_subplot(111) par = host.twinx() @@ -15,10 +12,13 @@ p1, = host.plot([0, 1, 2], [0, 1, 2], label="Density") p2, = par.plot([0, 1, 2], [0, 3, 2], label="Temperature") -host.axis["left"].label.set_color(p1.get_color()) -par.axis["right"].label.set_color(p2.get_color()) +leg = plt.legend() + +host.yaxis.get_label().set_color(p1.get_color()) +leg.texts[0].set_color(p1.get_color()) -host.legend() +par.yaxis.get_label().set_color(p2.get_color()) +leg.texts[1].set_color(p2.get_color()) plt.show() diff -Nru matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/figures/scatter_hist.py matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/figures/scatter_hist.py --- matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/figures/scatter_hist.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/figures/scatter_hist.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,60 +0,0 @@ -import numpy as np -import matplotlib.pyplot as plt - -# the random data -x = np.random.randn(1000) -y = np.random.randn(1000) - - -fig = plt.figure(1, figsize=(5.5,5.5)) - -from mpl_toolkits.axes_grid import make_axes_locatable - -axScatter = plt.subplot(111) -divider = make_axes_locatable(axScatter) - -# create a new axes with a height of 1.2 inch above the axScatter -axHistx = divider.new_vertical(1.2, pad=0.1, sharex=axScatter) - -# create a new axes with a width of 1.2 inch on the right side of the -# axScatter -axHisty = divider.new_horizontal(1.2, pad=0.1, sharey=axScatter) - -fig.add_axes(axHistx) -fig.add_axes(axHisty) - - -# make some labels invisible -plt.setp(axHistx.get_xticklabels() + axHisty.get_yticklabels(), - visible=False) - -# the scatter plot: -axScatter.scatter(x, y) -axScatter.set_aspect(1.) - -# now determine nice limits by hand: -binwidth = 0.25 -xymax = np.max( [np.max(np.fabs(x)), np.max(np.fabs(y))] ) -lim = ( int(xymax/binwidth) + 1) * binwidth - -bins = np.arange(-lim, lim + binwidth, binwidth) -axHistx.hist(x, bins=bins) -axHisty.hist(y, bins=bins, orientation='horizontal') - -# the xaxis of axHistx and yaxis of axHisty are shared with axScatter, -# thus there is no need to manually adjust the xlim and ylim of these -# axis. - -#axHistx.axis["bottom"].major_ticklabels.set_visible(False) -for tl in axHistx.get_xticklabels(): - tl.set_visible(False) -axHistx.set_yticks([0, 50, 100]) - -#axHisty.axis["left"].major_ticklabels.set_visible(False) -for tl in axHisty.get_yticklabels(): - tl.set_visible(False) -axHisty.set_xticks([0, 50, 100]) - -plt.draw() -plt.show() -#plt.savefig("a.pdf") diff -Nru matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/figures/simple_anchored_artists.py matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/figures/simple_anchored_artists.py --- matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/figures/simple_anchored_artists.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/figures/simple_anchored_artists.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,61 +0,0 @@ -import matplotlib.pyplot as plt - - -def draw_text(ax): - from mpl_toolkits.axes_grid.anchored_artists import AnchoredText - at = AnchoredText("Figure 1a", - loc=2, prop=dict(size=8), frameon=True, - ) - at.patch.set_boxstyle("round,pad=0.,rounding_size=0.2") - ax.add_artist(at) - - at2 = AnchoredText("Figure 1(b)", - loc=3, prop=dict(size=8), frameon=True, - bbox_to_anchor=(0., 1.), - bbox_transform=ax.transAxes - ) - at2.patch.set_boxstyle("round,pad=0.,rounding_size=0.2") - ax.add_artist(at2) - -def draw_circle(ax): # circle in the canvas coordinate - from mpl_toolkits.axes_grid.anchored_artists import AnchoredDrawingArea - from matplotlib.patches import Circle - ada = AnchoredDrawingArea(20, 20, 0, 0, - loc=1, pad=0., frameon=False) - p = Circle((10, 10), 10) - ada.da.add_artist(p) - ax.add_artist(ada) - -def draw_ellipse(ax): - from mpl_toolkits.axes_grid.anchored_artists import AnchoredEllipse - # draw an ellipse of width=0.1, height=0.15 in the data coordinate - ae = AnchoredEllipse(ax.transData, width=0.1, height=0.15, angle=0., - loc=3, pad=0.5, borderpad=0.4, frameon=True) - - ax.add_artist(ae) - -def draw_sizebar(ax): - from mpl_toolkits.axes_grid.anchored_artists import AnchoredSizeBar - # draw a horizontal bar with length of 0.1 in Data coordinate - # (ax.transData) with a label underneath. - asb = AnchoredSizeBar(ax.transData, - 0.1, - r"1$^{\prime}$", - loc=8, - pad=0.1, borderpad=0.5, sep=5, - frameon=False) - ax.add_artist(asb) - - -if 1: - ax = plt.gca() - ax.set_aspect(1.) - - draw_text(ax) - draw_circle(ax) - draw_ellipse(ax) - draw_sizebar(ax) - - plt.show() - - diff -Nru matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/figures/simple_axesgrid2.py matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/figures/simple_axesgrid2.py --- matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/figures/simple_axesgrid2.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/figures/simple_axesgrid2.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,24 +0,0 @@ -import matplotlib.pyplot as plt -from mpl_toolkits.axes_grid import AxesGrid -from demo_image import get_demo_image - -F = plt.figure(1, (5.5, 3.5)) -grid = AxesGrid(F, 111, # similar to subplot(111) - nrows_ncols = (1, 3), - axes_pad = 0.1, - add_all=True, - label_mode = "L", - ) - -Z, extent = get_demo_image() # demo image - -im1=Z -im2=Z[:,:10] -im3=Z[:,10:] -vmin, vmax = Z.min(), Z.max() -for i, im in enumerate([im1, im2, im3]): - ax = grid[i] - ax.imshow(im, origin="lower", vmin=vmin, vmax=vmax, interpolation="nearest") - -plt.draw() -plt.show() diff -Nru matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/figures/simple_axesgrid.py matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/figures/simple_axesgrid.py --- matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/figures/simple_axesgrid.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/figures/simple_axesgrid.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -import matplotlib.pyplot as plt -from mpl_toolkits.axes_grid import AxesGrid -import numpy as np - -im = np.arange(100) -im.shape = 10, 10 - -fig = plt.figure(1, (4., 4.)) -grid = AxesGrid(fig, 111, # similar to subplot(111) - nrows_ncols = (2, 2), # creates 2x2 grid of axes - axes_pad=0.1, # pad between axes in inch. - ) - -for i in range(4): - grid[i].imshow(im) # The AxesGrid object work as a list of axes. - -plt.show() diff -Nru matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/figures/simple_axisartist1.py matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/figures/simple_axisartist1.py --- matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/figures/simple_axisartist1.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/figures/simple_axisartist1.py 2010-07-07 01:41:45.000000000 +0000 @@ -0,0 +1,22 @@ +import matplotlib.pyplot as plt +import mpl_toolkits.axisartist as AA + +fig = plt.figure(1) +fig.subplots_adjust(right=0.85) +ax = AA.Subplot(fig, 1, 1, 1) +fig.add_subplot(ax) + +# make some axis invisible +ax.axis["bottom", "top", "right"].set_visible(False) + +# make an new axis along the first axis axis (x-axis) which pass +# throught y=0. +ax.axis["y=0"] = ax.new_floating_axis(nth_coord=0, value=0, + axis_direction="bottom") +ax.axis["y=0"].toggle(all=True) +ax.axis["y=0"].label.set_text("y = 0") + +ax.set_ylim(-2, 4) + +plt.show() + diff -Nru matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/figures/simple_axis_direction01.py matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/figures/simple_axis_direction01.py --- matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/figures/simple_axis_direction01.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/figures/simple_axis_direction01.py 2010-07-07 01:41:45.000000000 +0000 @@ -0,0 +1,15 @@ +import matplotlib.pyplot as plt +import mpl_toolkits.axisartist as axisartist + +fig = plt.figure(figsize=(4,2.5)) +ax1 = fig.add_subplot(axisartist.Subplot(fig, "111")) +fig.subplots_adjust(right=0.8) + +ax1.axis["left"].major_ticklabels.set_axis_direction("top") +ax1.axis["left"].label.set_text("Label") + +ax1.axis["right"].label.set_visible(True) +ax1.axis["right"].label.set_text("Label") +ax1.axis["right"].label.set_axis_direction("left") + +plt.show() diff -Nru matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/figures/simple_axis_direction03.py matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/figures/simple_axis_direction03.py --- matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/figures/simple_axis_direction03.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/figures/simple_axis_direction03.py 2010-07-07 01:41:45.000000000 +0000 @@ -0,0 +1,31 @@ + +import matplotlib.pyplot as plt +import mpl_toolkits.axisartist as axisartist + +def setup_axes(fig, rect): + ax = axisartist.Subplot(fig, rect) + fig.add_subplot(ax) + + ax.set_yticks([0.2, 0.8]) + ax.set_xticks([0.2, 0.8]) + + return ax + +fig = plt.figure(1, figsize=(5, 2)) +fig.subplots_adjust(wspace=0.4, bottom=0.3) + +ax1 = setup_axes(fig, "121") +ax1.set_xlabel("X-label") +ax1.set_ylabel("Y-label") + +ax1.axis[:].invert_ticklabel_direction() + +ax2 = setup_axes(fig, "122") +ax2.set_xlabel("X-label") +ax2.set_ylabel("Y-label") + +ax2.axis[:].major_ticks.set_tick_out(True) + +plt.show() + + diff -Nru matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/figures/simple_axisline4.py matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/figures/simple_axisline4.py --- matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/figures/simple_axisline4.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/figures/simple_axisline4.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,22 +0,0 @@ -import matplotlib.pyplot as plt -from mpl_toolkits.axes_grid.parasite_axes import SubplotHost -import numpy as np - -fig = plt.figure(1, (4,3)) - -ax = SubplotHost(fig, 111) -fig.add_subplot(ax) - -xx = np.arange(0, 2*np.pi, 0.01) -ax.plot(xx, np.sin(xx)) - -ax2 = ax.twin() # ax2 is responsible for "top" axis and "right" axis -ax2.set_xticks([0., .5*np.pi, np.pi, 1.5*np.pi, 2*np.pi]) -ax2.set_xticklabels(["0", r"$\frac{1}{2}\pi$", - r"$\pi$", r"$\frac{3}{2}\pi$", r"$2\pi$"]) - -ax2.axis["right"].major_ticklabels.set_visible(False) - -plt.draw() -plt.show() - diff -Nru matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/figures/simple_axis_pad.py matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/figures/simple_axis_pad.py --- matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/figures/simple_axis_pad.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/figures/simple_axis_pad.py 2010-07-07 01:41:45.000000000 +0000 @@ -0,0 +1,112 @@ + + +import numpy as np +import mpl_toolkits.axisartist.angle_helper as angle_helper +import mpl_toolkits.axisartist.grid_finder as grid_finder +from matplotlib.projections import PolarAxes +from matplotlib.transforms import Affine2D + +import mpl_toolkits.axisartist as axisartist + +from mpl_toolkits.axisartist.grid_helper_curvelinear import GridHelperCurveLinear + + +def setup_axes(fig, rect): + """ + polar projection, but in a rectangular box. + """ + + # see demo_curvelinear_grid.py for details + tr = Affine2D().scale(np.pi/180., 1.) + PolarAxes.PolarTransform() + + extreme_finder = angle_helper.ExtremeFinderCycle(20, 20, + lon_cycle = 360, + lat_cycle = None, + lon_minmax = None, + lat_minmax = (0, np.inf), + ) + + grid_locator1 = angle_helper.LocatorDMS(12) + grid_locator2 = grid_finder.MaxNLocator(5) + + tick_formatter1 = angle_helper.FormatterDMS() + + grid_helper = GridHelperCurveLinear(tr, + extreme_finder=extreme_finder, + grid_locator1=grid_locator1, + grid_locator2=grid_locator2, + tick_formatter1=tick_formatter1 + ) + + + ax1 = axisartist.Subplot(fig, rect, grid_helper=grid_helper) + #ax1.axis[:].toggle(all=False) + ax1.axis[:].set_visible(False) + + fig.add_subplot(ax1) + + ax1.set_aspect(1.) + ax1.set_xlim(-5, 12) + ax1.set_ylim(-5, 10) + + #ax1.grid(True) + + return ax1 + + +def add_floating_axis1(ax1): + ax1.axis["lat"] = axis = ax1.new_floating_axis(0, 30) + axis.label.set_text(r"$\theta = 30^{\circ}$") + axis.label.set_visible(True) + + return axis + + +def add_floating_axis2(ax1): + ax1.axis["lon"] = axis = ax1.new_floating_axis(1, 6) + axis.label.set_text(r"$r = 6$") + axis.label.set_visible(True) + + return axis + + +import matplotlib.pyplot as plt +fig = plt.figure(1, figsize=(9, 3.)) +fig.clf() +fig.subplots_adjust(left=0.01, right=0.99, bottom=0.01, top=0.99, + wspace=0.01, hspace=0.01) + + +def ann(ax1, d): + if plt.rcParams["text.usetex"]: + d = d.replace("_", r"\_") + + ax1.annotate(d, (0.5, 1), (5, -5), + xycoords="axes fraction", textcoords="offset points", + va="top", ha="center") + +ax1 = setup_axes(fig, rect=141) +axis = add_floating_axis1(ax1) +ann(ax1, r"default") + +ax1 = setup_axes(fig, rect=142) +axis = add_floating_axis1(ax1) +axis.major_ticklabels.set_pad(10) +ann(ax1, r"ticklabels.set_pad(10)") + +ax1 = setup_axes(fig, rect=143) +axis = add_floating_axis1(ax1) +axis.label.set_pad(20) +ann(ax1, r"label.set_pad(20)") + +ax1 = setup_axes(fig, rect=144) +axis = add_floating_axis1(ax1) +axis.major_ticks.set_tick_out(True) +ann(ax1, "ticks.set_tick_out(True)") + + +#ax1.axis["bottom"].toggle(all=True) + +plt.show() + + diff -Nru matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/figures/simple_colorbar.py matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/figures/simple_colorbar.py --- matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/figures/simple_colorbar.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/figures/simple_colorbar.py 2010-07-07 01:41:45.000000000 +0000 @@ -0,0 +1,14 @@ +import matplotlib.pyplot as plt +from mpl_toolkits.axes_grid1 import make_axes_locatable +import numpy as np + +ax = plt.subplot(111) +im = ax.imshow(np.arange(100).reshape((10,10))) + +# create an axes on the right side of ax. The width of cax will be 5% +# of ax and the padding between cax and ax will be fixed at 0.05 inch. +divider = make_axes_locatable(ax) +cax = divider.append_axes("right", size="5%", pad=0.05) + +plt.colorbar(im, cax=cax) + diff -Nru matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/figures/simple_rgb.py matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/figures/simple_rgb.py --- matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/figures/simple_rgb.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/figures/simple_rgb.py 2010-07-07 01:41:45.000000000 +0000 @@ -1,7 +1,14 @@ import matplotlib.pyplot as plt -from demo_image import get_demo_image -from mpl_toolkits.axes_grid.axes_rgb import RGBAxes +from mpl_toolkits.axes_grid1.axes_rgb import RGBAxes + +def get_demo_image(): + import numpy as np + from matplotlib.cbook import get_sample_data + f = get_sample_data("axes_grid/bivariate_normal.npy", asfileobj=False) + z = np.load(f) + # z is a numpy array of 15x15 + return z, (-3,4,-4,3) def get_rgb(): Z, extent = get_demo_image() diff -Nru matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/index.rst matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/index.rst --- matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/index.rst 2009-07-31 15:14:23.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/index.rst 2010-07-07 01:41:45.000000000 +0000 @@ -8,7 +8,25 @@ ease displaying multiple images in matplotlib. While the aspect parameter in matplotlib adjust the position of the single axes, AxesGrid toolkit provides a framework to adjust the position of -multiple axes according to their aspects. +multiple axes according to their aspects. + + +.. image:: ../../_static/demo_axes_grid.png + +.. note:: + AxesGrid toolkit has been a part of matplotlib since v + 0.99. Originally, the toolkit had a single namespace of + *axes_grid*. In more recent version (since svn r8226), the toolkit + has divided into two separate namespace (*axes_grid1* and *axisartist*). + While *axes_grid* namespace is maintained for he backward compatibility, + use of *axes_grid1* and *axisartist* is recommended. + +.. warning:: + *axes_grid* and *axisartist* (but not *axes_grid1*) uses + a custome Axes class (derived from the mpl's original Axes class). + As a sideeffect, some commands (mostly tick-related) do not work. + Use *axes_grid1* to avoid this, or see how things are different in + *axes_grid* and *axisartist* (LINK needed) @@ -18,5 +36,7 @@ .. toctree:: :maxdepth: 2 + users/overview.rst users/index.rst + howtos/index.rst api/index.rst diff -Nru matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/users/axisartist.rst matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/users/axisartist.rst --- matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/users/axisartist.rst 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/users/axisartist.rst 2010-07-07 01:41:45.000000000 +0000 @@ -0,0 +1,456 @@ +.. _axisartist-manual: + +==================== +AXISARTIST namespace +==================== + +The AxisArtist namesapce includes a derived Axes implementation. The +biggest difference is that the artists responsible to draw axis line, +ticks, ticklabel and axis labels are separated out from the mpl's Axis +class, which are much more than artists in the original mpl. This +change was strongly motivated to support curvlinear grid. Here are a +few things that mpl_tootlkits.axisartist.Axes is different from original +Axes from mpl. + +* Axis elements (axis line(spine), ticks, ticklabel and axis labels) + are drawn by a AxisArtist instance. Unlike Axis, left, right, top + and bottom axis are drawn by separate artists. And each of them may + have different tick location and different tick labels. + +* gridlines are drawn by a Gridlines instance. The change was + motivated that in curvelinear coordinate, a gridline may not cross + axis-lines (i.e., no associated ticks). In the original Axes class, + gridlines are tied to ticks. + +* ticklines can be rotated if necessary (i.e, along the gridlines) + +In summary, all these changes was to support + +* a curvelinear grid. +* a floating axis + +.. plot:: mpl_toolkits/axes_grid/examples/demo_floating_axis.py + + +*mpl_toolkits.axisartist.Axes* class defines a *axis* attribute, which +is a dictionary of AxisArtist instances. By default, the dictionary +has 4 AxisArtist instances, responsible for drawing of left, right, +bottom and top axis. + +xaxis and yaxis attributes are still available, however they are set +to not visible. As separate artists are used for rendering axis, some +axis-related method in mpl may have no effect. +In addition to AxisArtist instances, the mpl_toolkits.axisartist.Axes will +have *gridlines* attribute (Gridlines), which obviously draws grid +lines. + +In both AxisArtist and Gridlines, the calculation of tick and grid +location is delegated to an instance of GridHelper class. +mpl_toolkits.axisartist.Axes class uses GridHelperRectlinear as a grid +helper. The GridHelperRectlinear class is a wrapper around the *xaxis* +and *yaxis* of mpl's original Axes, and it was meant to work as the +way how mpl's original axes works. For example, tick location changes +using set_ticks method and etc. should work as expected. But change in +artist properties (e.g., color) will not work in general, although +some effort has been made so that some often-change attributes (color, +etc.) are respected. + + +AxisArtist +========== + +AxisArtist can be considered as a container artist with following +attributes which will draw ticks, labels, etc. + + * line + * major_ticks, major_ticklabels + * minor_ticks, minor_ticklabels + * offsetText + * label + + +line +---- + +Derived from Line2d class. Responsible for drawing a spinal(?) line. + +major_ticks, minor_ticks +------------------------ + +Derived from Line2d class. Note that ticks are markers. + + +major_ticklabels, minor_ticklabels +---------------------------------- + +Derived from Text. Note that it is not a list of Text artist, but a +single artist (similar to a collection). + +axislabel +--------- + +Derived from Text. + + +Default AxisArtists +------------------- + +By default, following for axis artists are defined.:: + + ax.axis["left"], ax.axis["bottom"], ax.axis["right"], ax.axis["top"] + +The ticklabels and axislabel of the top and the right axis are set to +not visible. + +For example, if you want to change the color attributes of +major_ticklabels of the bottom x-axis :: + + ax.axis["bottom"].major_ticklabels.set_color("b") + +Similarly, to make ticklabels invisible :: + + ax.axis["bottom"].major_ticklabels.set_visible(False) + +AxisAritst provides a helper method to control the visibility of ticks, ticklabels, and label. To make ticklabel invisible, :: + + ax.axis["bottom"].toggle(ticklabels=False) + +To make all of ticks, ticklabels, and (axis) label invisible :: + + ax.axis["bottom"].toggle(all=False) + +To turn all off but ticks on :: + + ax.axis["bottom"].toggle(all=False, ticks=True) + +To turn all on but (axis) label off :: + + ax.axis["bottom"].toggle(all=True, label=False)) + + +ax.axis's __getitem__ method can take multiple axis names. For +example, to turn ticklabels of "top" and "right" axis on, :: + + ax.axis["top","right"].toggle(ticklabels=True)) + +Note that 'ax.axis["top","right"]' returns a simple proxy object that translate above code to something like below. :: + + for n in ["top","right"]: + ax.axis[n].toggle(ticklabels=True)) + +So, any return values in the for loop are ignored. And you shoud not +use it anything more than a simple method. + +Like the list indexing ":" means all items, i.e., :: + + ax.axis[:].major_ticks.set_color("r") + +changes tick color in all axis. + + +HowTo +===== + +1. Changing tick locations and label. + + Same as the original mpl's axes.:: + + ax.set_xticks([1,2,3]) + +2. Changing axis properties like color, etc. + + Change the properties of appropriate artists. For example, to change + the color of the ticklabels:: + + ax.axis["left"].major_ticklabels.set_color("r") + +3. To change the attributes of multiple axis:: + + ax.axis["left","bottom"].major_ticklabels.set_color("r") + + or to change the attributes of all axis:: + + ax.axis[:].major_ticklabels.set_color("r") + +4. To change the tick size (length), you need to use + axis.major_ticks.set_ticksize method. To change the direction of + the ticks (ticks are in opposite direction of ticklabels by + default), use axis.major_ticks.set_tick_out method. + + To change the pad between ticks and ticklabels, use + axis.major_ticklabels.set_pad method. + + To change the pad between ticklabels and axis label, + axis.label.set_pad method. + + +Rotaion and Alignment of TickLabels +=================================== + +This is also quite different from the original mpl and can be +confusing. When you want to rotate the ticklabels, first consider +using "set_axis_direction" method. :: + + ax1.axis["left"].major_ticklabels.set_axis_direction("top") + ax1.axis["right"].label.set_axis_direction("left") + +.. plot:: mpl_toolkits/axes_grid/figures/simple_axis_direction01.py + +The parameter for set_axis_direction is one of ["left", "right", +"bottom", "top"]. + +You must understand some underlying concept of directions. + + 1. There is a reference direction which is defined as the direction + of the axis line with increasing coordinate. For example, the + reference direction of the left x-axis is from bottom to top. + + .. plot:: mpl_toolkits/axes_grid/figures/axis_direction_demo_step01.py + + The direction, text angle, and alignments of the ticks, ticklabels and + axis-label is determined with respect to the reference direction + + 2. *ticklabel_direction* is either the right-hand side (+) of the + reference direction or the left-hand side (-). + + .. plot:: mpl_toolkits/axes_grid/figures/axis_direction_demo_step02.py + + 3. same for the *label_direction* + + .. plot:: mpl_toolkits/axes_grid/figures/axis_direction_demo_step03.py + + 4. ticks are by default drawn toward the opposite direction of the ticklabels. + + 5. text rotation of ticklabels and label is determined in reference + to the *ticklabel_direction* or *label_direction*, + respectively. The rotation of ticklabels and label is anchored. + + .. plot:: mpl_toolkits/axes_grid/figures/axis_direction_demo_step04.py + + +On the other hand, there is a concept of "axis_direction". This is a +default setting of above properties for each, "bottom", "left", "top", +and "right" axis. + + ========== =========== ========= ========== ========= ========== + ? ? left bottom right top + ---------- ----------- --------- ---------- --------- ---------- + axislabel direction '-' '+' '+' '-' + axislabel rotation 180 0 0 180 + axislabel va center top center bottom + axislabel ha right center right center + ticklabel direction '-' '+' '+' '-' + ticklabels rotation 90 0 -90 180 + ticklabel ha right center right center + ticklabel va center baseline center baseline + ========== =========== ========= ========== ========= ========== + + +And, 'set_axis_direction("top")' means to adjust the text rotation +etc, for settings suitable for "top" axis. The concept of axis +direction can be more clear with curved axis. + +.. plot:: mpl_toolkits/axes_grid/figures/demo_axis_direction.py + +The axis_drection can be adjusted in the AxisArtist level, or in the +level of its child arists, i.e., ticks, ticklabels, and axis-label. :: + + ax1.axis["left"].set_axis_direction("top") + +changes axis_direction of all the associated artist with the "left" +axis, while :: + + ax1.axis["left"].major_ticklabels.set_axis_direction("top") + +changes the axis_direction of only the major_ticklabels. Note that +set_axis_direction in the AxisArtist level changes the +ticklabel_direction and label_direction, while chainging the +axis_direction of ticks, ticklabels, and axis-label does not affect +them. + + +If you want to make ticks outward and ticklabels inside the axes, +use invert_ticklabel_direction method. :: + + ax.axis[:].invert_ticklabel_direction() + +A related method is "set_tick_out". It makes ticks outward (as a +matter of fact, it makes ticks toward the opposite direction of the +default direction). :: + + ax.axis[:].major_ticks.set_tick_out(True) + +.. plot:: mpl_toolkits/axes_grid/figures/simple_axis_direction03.py + + +So, in summary, + + * AxisArtist's methods + * set_axis_direction : "left", "right", "bottom", or "top" + * set_ticklabel_direction : "+" or "-" + * set_axislabel_direction : "+" or "-" + * invert_ticklabel_direction + * Ticks' methods (major_ticks and minor_ticks) + * set_tick_out : True or False + * set_ticksize : size in points + * TickLabels' methods (major_ticklabels and minor_ticklabels) + * set_axis_direction : "left", "right", "bottom", or "top" + * set_rotation : angle with respect to the renference direction + * set_ha and set_va : see below + * AxisLabels' methods (label) + * set_axis_direction : "left", "right", "bottom", or "top" + * set_rotation : angle with respect to the renference direction + * set_ha and set_va + + + +Adjusting ticklabels alignment +------------------------------ + +Alignment of TickLabels are treated specially. See below + +.. plot:: mpl_toolkits/axes_grid/figures/demo_ticklabel_alignment.py + +Adjusting pad +-------------- + +To change the pad between ticks and ticklabels :: + + ax.axis["left"].major_ticklabels.set_pad(10) + +Or ticklabels and axis-label :: + + ax.axis["left"].label.set_pad(10) + + +.. plot:: mpl_toolkits/axes_grid/figures/simple_axis_pad.py + + +GridHelper +========== + +To actually define a curvelinear coordinate, you have to use your own +grid helper. A generalised version of grid helper class is supplied +and this class should suffice in most of cases. A user may provide +two functions which defines a transformation (and its inverse pair) +from the curved coordinate to (rectlinear) image coordinate. Note that +while ticks and grids are drawn for curved coordinate, the data +transform of the axes itself (ax.transData) is still rectlinear +(image) coordinate. :: + + + from mpl_toolkits.axisartist.grid_helper_curvelinear \ + import GridHelperCurveLinear + from mpl_toolkits.axisartist import Subplot + + # from curved coordinate to rectlinear coordinate. + def tr(x, y): + x, y = np.asarray(x), np.asarray(y) + return x, y-x + + # from rectlinear coordinate to curved coordinate. + def inv_tr(x,y): + x, y = np.asarray(x), np.asarray(y) + return x, y+x + + + grid_helper = GridHelperCurveLinear((tr, inv_tr)) + + ax1 = Subplot(fig, 1, 1, 1, grid_helper=grid_helper) + + fig.add_subplot(ax1) + + +You may use matplotlib's Transform instance instead (but a +inverse transformation must be defined). Often, coordinate range in a +curved coordinate system may have a limited range, or may have +cycles. In those cases, a more customized version of grid helper is +required. :: + + + import mpl_toolkits.axisartist.angle_helper as angle_helper + + # PolarAxes.PolarTransform takes radian. However, we want our coordinate + # system in degree + tr = Affine2D().scale(np.pi/180., 1.) + PolarAxes.PolarTransform() + + + # extreme finder : find a range of coordinate. + # 20, 20 : number of sampling points along x, y direction + # The first coordinate (longitude, but theta in polar) + # has a cycle of 360 degree. + # The second coordinate (latitude, but radius in polar) has a minimum of 0 + extreme_finder = angle_helper.ExtremeFinderCycle(20, 20, + lon_cycle = 360, + lat_cycle = None, + lon_minmax = None, + lat_minmax = (0, np.inf), + ) + + # Find a grid values appropriate for the coordinate (degree, + # minute, second). The argument is a approximate number of grids. + grid_locator1 = angle_helper.LocatorDMS(12) + + # And also uses an appropriate formatter. Note that,the + # acceptable Locator and Formatter class is a bit different than + # that of mpl's, and you cannot directly use mpl's Locator and + # Formatter here (but may be possible in the future). + tick_formatter1 = angle_helper.FormatterDMS() + + grid_helper = GridHelperCurveLinear(tr, + extreme_finder=extreme_finder, + grid_locator1=grid_locator1, + tick_formatter1=tick_formatter1 + ) + + +Again, the *transData* of the axes is still a rectlinear coordinate +(image coordinate). You may manually do conversion between two +coordinates, or you may use Parasite Axes for convenience.:: + + ax1 = SubplotHost(fig, 1, 2, 2, grid_helper=grid_helper) + + # A parasite axes with given transform + ax2 = ParasiteAxesAuxTrans(ax1, tr, "equal") + # note that ax2.transData == tr + ax1.transData + # Anthing you draw in ax2 will match the ticks and grids of ax1. + ax1.parasites.append(ax2) + + +.. plot:: mpl_toolkits/axes_grid/examples/demo_curvelinear_grid.py + + + +FloatingAxis +============ + +A floating axis is an axis one of whose data coordinate is fixed, i.e, +its location is not fixed in Axes coordinate but changes as axes data +limits changes. A floating axis can be created using +*new_floating_axis* method. However, it is your responsibility that +the resulting AxisArtist is properly added to the axes. A recommended +way is to add it as an item of Axes's axis attribute.:: + + # floating axis whose first (index starts from 0) coordinate + # (theta) is fixed at 60 + + ax1.axis["lat"] = axis = ax1.new_floating_axis(0, 60) + axis.label.set_text(r"$\theta = 60^{\circ}$") + axis.label.set_visible(True) + + +See the first example of this page. + +Current Limitations and TODO's +============================== + +The code need more refinement. Here is a incomplete list of issues and TODO's + +* No easy way to support a user customized tick location (for + curvelinear grid). A new Locator class needs to be created. + +* FloatingAxis may have coordinate limits, e.g., a floating axis of x + = 0, but y only spans from 0 to 1. + +* The location of axislabel of FloatingAxis needs to be optionally + given as a coordinate value. ex, a floating axis of x=0 with label at y=1 diff -Nru matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/users/axislines.rst matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/users/axislines.rst --- matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/users/axislines.rst 2009-07-31 15:14:23.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/users/axislines.rst 1970-01-01 00:00:00.000000000 +0000 @@ -1,250 +0,0 @@ -.. _axislines-manual: - -========= -Axislines -========= - -Axislines includes a derived Axes implementation. The -biggest difference is that the artists responsible to draw axis line, -ticks, ticklabel and axis labels are separated out from the mpl's Axis -class, which are much more than artists in the original -mpl. This change was strongly motivated to support curvlinear -grid. Here are a few things that axes_grid.axislines.Axes is different -from original Axes from mpl. - -* Axis elements (axis line(spine), ticks, ticklabel and axis labels) - are drawn by a AxisArtist instance. Unlike Axis, left, right, top - and bottom axis are drawn by separate artists. And each of them may - have different tick location and different tick labels. - -* gridlines are drawn by a Gridlines instance. The change was - motivated that in curvelinear coordinate, a gridline may not cross - axislines (i.e., no associated ticks). In the original Axes class, - gridlines are tied to ticks. - -* ticklines can be rotated if necessary (i.e, along the gridlines) - -In summary, all these changes was to support - -* a curvelinear grid. -* a floating axis - -.. plot:: mpl_toolkits/axes_grid/figures/demo_floating_axis.py - - -*axes_grid.axislines.Axes* defines a *axis* attribute, which is a -dictionary of AxisArtist instances. By default, the dictionary has 4 -AxisArtist instances, responsible for drawing of left, right, bottom -and top axis. - -xaxis and yaxis attributes are still available, however they are set -to not visible. As separate artists are used for rendering axis, some -axis-related method in mpl may have no effect. -In addition to AxisArtist instances, the axes_grid.axislines.Axes will -have *gridlines* attribute (Gridlines), which obviously draws grid -lines. - -In both AxisArtist and Gridlines, the calculation of tick and grid -location is delegated to an instance of GridHelper class. -axes_grid.axislines.Axes class uses GridHelperRectlinear as a grid -helper. The GridHelperRectlinear class is a wrapper around the *xaxis* -and *yaxis* of mpl's original Axes, and it was meant to work as the -way how mpl's original axes works. For example, tick location changes -using set_ticks method and etc. should work as expected. But change in -artist properties (e.g., color) will not work in general, although -some effort has been made so that some often-change attributes (color, -etc.) are respected. - - -AxisArtist -========== - -AxisArtist can be considered as a container artist with following -attributes which will draw ticks, labels, etc. - - * line - * major_ticks, major_ticklabels - * minor_ticks, minor_ticklabels - * offsetText - * label - - -line ----- - -Derived from Line2d class. Responsible for drawing a spinal(?) line. - -major_ticks, minor_ticks ------------------------- - -Derived from Line2d class. Note that ticks are markers. - - -major_ticklabels, minor_ticklabels ----------------------------------- - -Derived from Text. Note that it is not a list of Text artist, but a -single artist (similar to a collection). - -axislabel ---------- - -Derived from Text. - - -Default AxisArtists -------------------- - -By default, following for axis artists are defined.:: - - ax.axis["left"], ax.axis["bottom"], ax.axis["right"], ax.axis["top"] - -The ticklabels and axislabel of the top and the right axis are set to -not visible. - - -HowTo -===== - -1. Changing tick locations and label. - - Same as the original mpl's axes.:: - - ax.set_xticks([1,2,3]) - -2. Changing axis properties like color, etc. - - Change the properties of appropriate artists. For example, to change - the color of the ticklabels:: - - ax.axis["left"].major_ticklabels.set_color("r") - - -GridHelper -========== - -To actually define a curvelinear coordinate, you have to use your own -grid helper. A generalised version of grid helper class is supplied -and this class should be suffice in most of cases. A user may provide -two functions which defines a transformation (and its inverse pair) -from the curved coordinate to (rectlinear) image coordinate. Note that -while ticks and grids are drawn for curved coordinate, the data -transform of the axes itself (ax.transData) is still rectlinear -(image) coordinate. :: - - - from mpl_toolkits.axes_grid.grid_helper_curvelinear \ - import GridHelperCurveLinear - from mpl_toolkits.axes_grid.axislines import Subplot - - # from curved coordinate to rectlinear coordinate. - def tr(x, y): - x, y = np.asarray(x), np.asarray(y) - return x, y-x - - # from rectlinear coordinate to curved coordinate. - def inv_tr(x,y): - x, y = np.asarray(x), np.asarray(y) - return x, y+x - - - grid_helper = GridHelperCurveLinear((tr, inv_tr)) - - ax1 = Subplot(fig, 1, 1, 1, grid_helper=grid_helper) - - fig.add_subplot(ax1) - - -You may use matplotlib's Transform instance instead (but a -inverse transformation must be defined). Often, coordinate range in a -curved coordinate system may have a limited range, or may have -cycles. In those cases, a more customized version of grid helper is -required. :: - - - import mpl_toolkits.axes_grid.angle_helper as angle_helper - - # PolarAxes.PolarTransform takes radian. However, we want our coordinate - # system in degree - tr = Affine2D().scale(np.pi/180., 1.) + PolarAxes.PolarTransform() - - - # extreme finder : find a range of coordinate. - # 20, 20 : number of sampling points along x, y direction - # The first coordinate (longitude, but theta in polar) - # has a cycle of 360 degree. - # The second coordinate (latitude, but radius in polar) has a minimum of 0 - extreme_finder = angle_helper.ExtremeFinderCycle(20, 20, - lon_cycle = 360, - lat_cycle = None, - lon_minmax = None, - lat_minmax = (0, np.inf), - ) - - # Find a grid values appropriate for the coordinate (degree, - # minute, second). The argument is a approximate number of grids. - grid_locator1 = angle_helper.LocatorDMS(12) - - # And also uses an appropriate formatter. Note that,the - # acceptable Locator and Formatter class is a bit different than - # that of mpl's, and you cannot directly use mpl's Locator and - # Formatter here (but may be possible in the future). - tick_formatter1 = angle_helper.FormatterDMS() - - grid_helper = GridHelperCurveLinear(tr, - extreme_finder=extreme_finder, - grid_locator1=grid_locator1, - tick_formatter1=tick_formatter1 - ) - - -Again, the *transData* of the axes is still a rectlinear coordinate -(image coordinate). You may manually do conversion between two -coordinates, or you may use Parasite Axes for convenience.:: - - ax1 = SubplotHost(fig, 1, 2, 2, grid_helper=grid_helper) - - # A parasite axes with given transform - ax2 = ParasiteAxesAuxTrans(ax1, tr, "equal") - # note that ax2.transData == tr + ax1.transData - # Anthing you draw in ax2 will match the ticks and grids of ax1. - ax1.parasites.append(ax2) - - -.. plot:: mpl_toolkits/axes_grid/figures/demo_curvelinear_grid.py - - - -FloatingAxis -============ - -A floating axis is an axis one of whose data coordinate is fixed, i.e, -its location is not fixed in Axes coordinate but changes as axes data -limits changes. A floating axis can be created using -*new_floating_axis* method. However, it is your responsibility that -the resulting AxisArtist is properly added to the axes. A recommended -way is to add it as an item of Axes's axis attribute.:: - - # floating axis whose first (index starts from 0) coordinate - # (theta) is fixed at 60 - - ax1.axis["lat"] = axis = ax1.new_floating_axis(0, 60) - axis.label.set_text(r"$\theta = 60^{\circ}$") - axis.label.set_visible(True) - - -See the first example of this page. - -Current Limitations and TODO's -============================== - -The code need more refinement. Here is a incomplete list of issues and TODO's - -* No easy way to support a user customized tick location (for - curvelinear grid). A new Locator class needs to be created. - -* FloatingAxis may have coordinate limits, e.g., a floating axis of x - = 0, but y only spans from 0 to 1. - -* The location of axislabel of FloatingAxis needs to be optionally - given as a coordinate value. ex, a floating axis of x=0 with label at y=1 diff -Nru matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/users/index.rst matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/users/index.rst --- matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/users/index.rst 2009-07-31 15:14:23.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/users/index.rst 2010-07-07 01:41:45.000000000 +0000 @@ -9,6 +9,6 @@ .. toctree:: - overview.rst axes_divider.rst - axislines.rst + axisartist.rst + diff -Nru matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/users/overview.rst matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/users/overview.rst --- matplotlib-0.99.3/doc/mpl_toolkits/axes_grid/users/overview.rst 2009-07-31 15:14:23.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_toolkits/axes_grid/users/overview.rst 2010-07-07 01:41:45.000000000 +0000 @@ -1,6 +1,9 @@ -======== -Overview -======== +============================ +Overview of AxesGrid toolkit +============================ + +What is AxesGrid toolkit? +========================= The matplotlib AxesGrid toolkit is a collection of helper classes, mainly to ease displaying (multiple) images in matplotlib. @@ -9,33 +12,68 @@ :depth: 1 :local: -`AxesGrid`_, `RGB Axes`_ and `AxesDivider`_ are helper classes that -deals with adjusting the location of (multiple) Axes, mainly for -displaying images. It provides a framework to adjust the position of -multiple axes at the drawing time. `ParasiteAxes`_ provides twinx(or -twiny)-like features so that you can plot different data (e.g., -different y-scale) in a same Axes. `AxisLine`_ is a custom Axes -class. Unlike default Axes in matpotlib, each axis (left, right, top -and bottom) is associated with a separate artist (which is resposible -to draw axis-line, ticks, ticklabels, label). `AnchoredArtists`_ +.. note:: + AxesGrid toolkit has been a part of matplotlib since v + 0.99. Originally, the toolkit had a single namespace of + *axes_grid*. In more recent version (since svn r8226), the toolkit + has divided into two separate namespace (*axes_grid1* and *axisartist*). + While *axes_grid* namespace is maintained for he backward compatibility, + use of *axes_grid1* and *axisartist* is recommended. + +.. warning:: + *axes_grid* and *axisartist* (but not *axes_grid1*) uses + a custome Axes class (derived from the mpl's original Axes class). + As a sideeffect, some commands (mostly tick-related) do not work. + Use *axes_grid1* to avoid this, or see how things are different in + *axes_grid* and *axisartist* (LINK needed) + + +AxesGrid toolkit has two namespaces (*axes_grid1* and *axisartist*). +*axisartist* contains custome Axes class that is meant to support for +curvilinear grids (e.g., the world coordinate system in astronomy). +Unlike mpl's original Axes class which uses Axes.xaxis and Axes.yaxis +to draw ticks, ticklines and etc., Axes in axisartist uses special +artist (AxisArtist) which can handle tick, ticklines and etc. for +curved coordinate systems. + +.. plot:: mpl_toolkits/axes_grid/examples/demo_floating_axis.py + +Since it uses a special artists, some mpl commands that work on +Axes.xaxis and Axes.yaxis may not work. See LINK for more detail. + + +*axes_grid1* is a collection of helper classes to ease displaying +(multiple) images with matplotlib. In matplotlib, the axes location +(and size) is specified in the normalized figure coordinates, which +may not be ideal for displaying images that needs to have a given +aspect ratio. For example, it helps you to have a colobar whose +height always matches that of the image. `AxesGrid`_, `RGB Axes`_ and +`AxesDivider`_ are helper classes that deals with adjusting the +location of (multiple) Axes. They provides a framework to adjust the +position of multiple axes at the drawing time. `ParasiteAxes`_ +provides twinx(or twiny)-like features so that you can plot different +data (e.g., different y-scale) in a same Axes. `AnchoredArtists`_ includes custom artists which are placed at some anchored position, like the legend. +.. plot:: mpl_toolkits/axes_grid/examples/demo_axes_grid.py +AXES_GRID1 +========== -AxesGrid -======== +ImageGrid +--------- A class that creates a grid of Axes. In matplotlib, the axes location (and size) is specified in the normalized figure coordinates. This may not be ideal for images that needs to be displayed with a given aspect ratio. For example, displaying images of a same size with some fixed -padding between them cannot be easily done in matplotlib. AxesGrid is +padding between them cannot be easily done in matplotlib. ImageGrid is used in such case. -.. plot:: mpl_toolkits/axes_grid/figures/simple_axesgrid.py +.. plot:: mpl_toolkits/axes_grid/examples/simple_axesgrid.py :include-source: * The postion of each axes is determined at the drawing time (see @@ -49,7 +87,7 @@ height. The widths (height) of the axes in the same row (column) are scaled according to their view limits (xlim or ylim). - .. plot:: mpl_toolkits/axes_grid/figures/simple_axesgrid2.py + .. plot:: mpl_toolkits/axes_grid/examples/simple_axesgrid2.py :include-source: * xaxis are shared among axes in a same column. Similarly, yaxis are @@ -60,7 +98,7 @@ -When initialized, AxesGrid creates given number (*ngrids* or *ncols* * +When initialized, ImageGrid creates given number (*ngrids* or *ncols* * *nrows* if *ngrids* is None) of Axes instances. A sequence-like interface is provided to access the individual Axes instances (e.g., grid[0] is the first Axes in the grid. See below for the order of @@ -137,35 +175,13 @@ The examples below show what you can do with AxesGrid. -.. plot:: mpl_toolkits/axes_grid/figures/demo_axes_grid.py - - -RGB Axes -======== - -RGBAxes is a helper clase to conveniently show RGB composite -images. Like AxesGrid, the location of axes are adjusted so that the -area occupied by them fits in a given rectangle. Also, the xaxis and -yaxis of each axes are shared. :: - - from mpl_toolkits.axes_grid.axes_rgb import RGBAxes - - fig = plt.figure(1) - ax = RGBAxes(fig, [0.1, 0.1, 0.8, 0.8]) - - r, g, b = get_rgb() # r,g,b are 2-d images - ax.imshow_rgb(r, g, b, - origin="lower", interpolation="nearest") - - -.. plot:: mpl_toolkits/axes_grid/figures/simple_rgb.py - +.. plot:: mpl_toolkits/axes_grid/examples/demo_axes_grid.py AxesDivider -=========== +----------- -Behind the scene, the AxesGrid class and the RGBAxes class utilize the +Behind the scene, the ImageGrid class and the RGBAxes class utilize the AxesDivider class, whose role is to calculate the location of the axes at drawing time. While a more about the AxesDivider is (will be) explained in (yet to be written) AxesDividerGuide, direct use of the @@ -181,45 +197,46 @@ *make_axes_locatable* returns an isntance of the AxesLocator class, -derived from the Locator. It has *new_vertical*, and *new_horizontal* -methods. The *new_vertical* (*new_horizontal*) creates a new axes on -the upper (right) side of the original axes. +derived from the Locator. It provides *append_axes* method that +creates a new axes on the given side of ("top", "right", "bottom" and +"left") of the original axes. -scatter_hist.py with AxesDivider --------------------------------- -The "scatter_hist.py" example in mpl can be rewritten using -*make_axes_locatable*. :: +colorbar whose height (or width) in sync with the master axes +------------------------------------------------------------- - from mpl_toolkits.axes_grid import make_axes_locatable +.. plot:: mpl_toolkits/axes_grid/figures/simple_colorbar.py + :include-source: - axScatter = subplot(111) - divider = make_axes_locatable(axScatter) - # create new axes on the right and on the top of the current axes - # The first argument of the new_vertical(new_horizontal) method is - # the height (width) of the axes to be created in inches. - axHistx = divider.new_vertical(1.2, pad=0.1, sharex=axScatter) - axHisty = divider.new_horizontal(1.2, pad=0.1, sharey=axScatter) - fig.add_axes(axHistx) - fig.add_axes(axHisty) +scatter_hist.py with AxesDivider +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - # the scatter plot: +The "scatter_hist.py" example in mpl can be rewritten using +*make_axes_locatable*. :: + + axScatter = subplot(111) axScatter.scatter(x, y) axScatter.set_aspect(1.) + # create new axes on the right and on the top of the current axes. + divider = make_axes_locatable(axScatter) + axHistx = divider.append_axes("top", size=1.2, pad=0.1, sharex=axScatter) + axHisty = divider.append_axes("right", size=1.2, pad=0.1, sharey=axScatter) + + # the scatter plot: # histograms bins = np.arange(-lim, lim + binwidth, binwidth) axHistx.hist(x, bins=bins) axHisty.hist(y, bins=bins, orientation='horizontal') -See the full source code below. +See the full source code below. -.. plot:: mpl_toolkits/axes_grid/figures/scatter_hist.py +.. plot:: mpl_toolkits/axes_grid/examples/scatter_hist.py The scatter_hist using the AxesDivider has some advantage over the @@ -229,85 +246,41 @@ ParasiteAxes -============ +------------ -The ParasiteAxes is a axes whose location is identical to its host +The ParasiteAxes is an axes whose location is identical to its host axes. The location is adjusted in the drawing time, thus it works even -if the host change its location (e.g., images). It provides *twinx*, -*twiny* (similar to twinx and twiny in the matplotlib). Also it -provides *twin*, which takes an arbitraty tranfromation that maps -between the data coordinates of the host and the parasite axes. -Artists in each axes are mergred and drawn acrroding to their zorder. -It also modifies some behavior of the axes. For example, color cycle -for plot lines are shared between host and parasites. Also, the legend -command in host, creates a legend that includes lines in the parasite -axes. +if the host change its location (e.g., images). + +In most cases, you first create a host axes, which provides a few +method that can be used to create parasite axes. They are *twinx*, +*twiny* (which are similar to twinx and twiny in the matplotlib) and +*twin*. *twin* takes an arbitraty tranfromation that maps between the +data coordinates of the host axes and the parasite axes. *draw* +method of the parasite axes are never called. Instead, host axes +collects artists in parasite axes and draw them as if they belong to +the host axes, i.e., artists in parasite axes are merged to those of +the host axes and then drawn according to their zorder. The host and +parasite axes modifies some of the axes behavior. For example, color +cycle for plot lines are shared between host and parasites. Also, the +legend command in host, creates a legend that includes lines in the +parasite axes. To create a host axes, you may use *host_suplot* or +*host_axes* command. + Example 1. twinx ----------------- +~~~~~~~~~~~~~~~~ .. plot:: mpl_toolkits/axes_grid/figures/parasite_simple.py :include-source: Example 2. twin ---------------- - -A more sophiscated example using twin. Note that if you change the -x-limit in the host axes, the x-limit of the parasite axes will change -accordingly. - - -.. plot:: mpl_toolkits/axes_grid/figures/parasite_simple2.py - - - -AxisLine -======== - -AxisLine is a custom (and very experimenta) Axes class, where each -axis (left, right, top and bottom) have a separate artist associated -(which is resposible to draw axis-line, ticks, ticklabels, label). -Also, you can create your own axis, which can pass through a fixed -position in the axes coordinate, or a fixed position in the data -coordinate (i.e., the axis floats around when viewlimit changes). - -Most of the class in this toolkit is based on this class. And it has -not been tested extensibly. You may go back to the original mpl -behanvior, by :: - - ax.toggle_axisline(False) - -The axes class, by default, provides 4 artists which are responsible -to draw axis in "left","right","bottom" and "top". They are accessed -as ax.axis["left"], ax.axis["right"], and so on, i.e., ax.axis is a -dictionary that contains artists (note that ax.axis is still a -callable methods and it behaves as an original Axes.axis method in -mpl). - -For example, you can hide right, and top axis by :: - - ax.axis["right"].set_visible(False) - ax.axis["top"].set_visible(False) - - -.. plot:: mpl_toolkits/axes_grid/figures/simple_axisline3.py - - -SubplotZero gives you two more additional (floating?) axis of x=0 and -y=0 (in data coordinate) - -.. plot:: mpl_toolkits/axes_grid/figures/simple_axisline2.py - :include-source: - - -Axisline with ParasiteAxes --------------------------- +~~~~~~~~~~~~~~~ -Most of axes class in the axes_grid toolkit, including ParasiteAxes, -is based on the Axisline axes. The combination of the two can be -useful in some case. For example, you can have different tick-location, -tick-label, or tick-formatter for bottom and top (or left and right) -axis. :: +*twin* without a transform argument treat the parasite axes to have a +same data transform as the host. This can be useful when you want the +top(or right)-axis to have different tick-locations, tick-labels, or +tick-formatter for bottom(or left)-axis. :: ax2 = ax.twin() # now, ax2 is responsible for "top" axis and "right" axis ax2.set_xticks([0., .5*np.pi, np.pi, 1.5*np.pi, 2*np.pi]) @@ -315,26 +288,20 @@ r"$\pi$", r"$\frac{3}{2}\pi$", r"$2\pi$"]) -.. plot:: mpl_toolkits/axes_grid/figures/simple_axisline4.py +.. plot:: mpl_toolkits/axes_grid/examples/simple_axisline4.py -AxisLine Axes lets you create a custom axis, :: - # make new (right-side) yaxis, but wth some offset - offset = (20, 0) - new_axisline = ax.get_grid_helper().new_fixed_axis - ax.axis["right2"] = new_axisline(loc="right", - offset=offset) - - -And, you can use it with parasiteAxes. +A more sophiscated example using twin. Note that if you change the +x-limit in the host axes, the x-limit of the parasite axes will change +accordingly. -.. plot:: mpl_toolkits/axes_grid/figures/demo_parasite_axes2.py +.. plot:: mpl_toolkits/axes_grid/examples/parasite_simple2.py AnchoredArtists -=============== +--------------- It's a collection of artists whose location is anchored to the (axes) bbox, like the legend. It is derived from *OffsetBox* in mpl, and @@ -343,12 +310,12 @@ in the example below will have width and height in the data coordinate. -.. plot:: mpl_toolkits/axes_grid/figures/simple_anchored_artists.py +.. plot:: mpl_toolkits/axes_grid/examples/simple_anchored_artists.py :include-source: InsetLocator -============ +------------ :mod:`mpl_toolkits.axes_grid.inset_locator` provides helper classes and functions to place your (inset) axes at the anchored position of @@ -377,7 +344,7 @@ creates an inset axes whose data scale is half of the parent axes. Here is complete examples. -.. plot:: mpl_toolkits/axes_grid/figures/inset_locator_demo.py +.. plot:: mpl_toolkits/axes_grid/examples/inset_locator_demo.py For example, :func:`zoomed_inset_axes` can be used when you want the inset represents the zoom-up of the small portion in the parent axes. @@ -385,16 +352,129 @@ function :func:`mark_inset` to mark the location of the area represented by the inset axes. -.. plot:: mpl_toolkits/axes_grid/figures/inset_locator_demo2.py +.. plot:: mpl_toolkits/axes_grid/examples/inset_locator_demo2.py + :include-source: + + +RGB Axes +~~~~~~~~ + +RGBAxes is a helper clase to conveniently show RGB composite +images. Like ImageGrid, the location of axes are adjusted so that the +area occupied by them fits in a given rectangle. Also, the xaxis and +yaxis of each axes are shared. :: + + from mpl_toolkits.axes_grid1.axes_rgb import RGBAxes + + fig = plt.figure(1) + ax = RGBAxes(fig, [0.1, 0.1, 0.8, 0.8]) + + r, g, b = get_rgb() # r,g,b are 2-d images + ax.imshow_rgb(r, g, b, + origin="lower", interpolation="nearest") + + +.. plot:: mpl_toolkits/axes_grid/figures/simple_rgb.py + + +AXISARTIST +========== + + +AxisArtist +---------- + +AxisArtist module provides a custom (and very experimental) Axes +class, where each axis (left, right, top and bottom) have a separate +artist associated which is resposible to draw axis-line, ticks, +ticklabels, label. Also, you can create your own axis, which can pass +through a fixed position in the axes coordinate, or a fixed position +in the data coordinate (i.e., the axis floats around when viewlimit +changes). + +The axes class, by default, have its xaxis and yaxis invisible, and +has 4 additional artists which are responsible to draw axis in +"left","right","bottom" and "top". They are accessed as +ax.axis["left"], ax.axis["right"], and so on, i.e., ax.axis is a +dictionary that contains artists (note that ax.axis is still a +callable methods and it behaves as an original Axes.axis method in +mpl). + +To create an axes, :: + + import mpl_toolkits.axisartist as AA + fig = plt.figure(1) + ax = AA.Axes(fig, [0.1, 0.1, 0.8, 0.8]) + fig.add_axes(ax) + +or to creat a subplot :: + + ax = AA.Subplot(fig, 111) + fig.add_subplot(ax) + +For example, you can hide the right, and top axis by :: + + ax.axis["right"].set_visible(False) + ax.axis["top"].set_visible(False) + + +.. plot:: mpl_toolkits/axes_grid/figures/simple_axisline3.py + + +It is also possible to add an extra axis. For example, you may have an +horizontal axis at y=0 (in data coordinate). :: + + ax.axis["y=0"] = ax.new_floating_axis(nth_coord=0, value=0) + +.. plot:: mpl_toolkits/axes_grid/figures/simple_axisartist1.py :include-source: +Or a fixed axis with some offset :: + + # make new (right-side) yaxis, but wth some offset + ax.axis["right2"] = ax.new_fixed_axis(loc="right", + offset=(20, 0)) + + + +AxisArtist with ParasiteAxes +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Most commands in the axes_grid toolkit1 can take a axes_class keyword +argument, and the commands creates an axes of the given class. For example, +to create a host subplot with axisartist.Axes, :: + + import mpl_tookits.axisartist as AA + from mpl_toolkits.axes_grid1 import host_subplot + + host = host_subplot(111, axes_class=AA.Axes) + + +Here is an example that uses parasiteAxes. + + +.. plot:: mpl_toolkits/axes_grid/examples/demo_parasite_axes2.py + + + Curvelinear Grid -================ +---------------- + +The motivation behind the AxisArtist module is to support cuvelinear grid +and ticks. + +.. plot:: mpl_toolkits/axes_grid/examples/demo_floating_axis.py + +See :ref:`axisartist-manual` for more details. + + +Floating Axes +------------- -You can draw a cuvelinear grid and ticks. Also a floating axis can be -created. See :ref:`axislines-manual` for more details. +This also suppport a Floating Axes whose outer axis are defined as +floating axis. -.. plot:: mpl_toolkits/axes_grid/figures/demo_floating_axis.py +.. plot:: mpl_toolkits/axes_grid/examples/demo_floating_axes.py diff -Nru matplotlib-0.99.3/doc/mpl_toolkits/mplot3d/api.rst matplotlib-1.0.1/doc/mpl_toolkits/mplot3d/api.rst --- matplotlib-0.99.3/doc/mpl_toolkits/mplot3d/api.rst 2009-07-31 15:14:23.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_toolkits/mplot3d/api.rst 2010-07-07 01:41:45.000000000 +0000 @@ -7,7 +7,6 @@ .. automodule:: mpl_toolkits.mplot3d.axes3d :members: - :exclude-members: contour3D, contourf3D, plot3D, scatter3D :show-inheritance: :mod:`mpl_toolkits.mplot3d.art3d` diff -Nru matplotlib-0.99.3/doc/mpl_toolkits/mplot3d/tutorial.rst matplotlib-1.0.1/doc/mpl_toolkits/mplot3d/tutorial.rst --- matplotlib-0.99.3/doc/mpl_toolkits/mplot3d/tutorial.rst 2009-09-21 18:56:13.000000000 +0000 +++ matplotlib-1.0.1/doc/mpl_toolkits/mplot3d/tutorial.rst 2011-01-05 15:59:55.000000000 +0000 @@ -7,13 +7,15 @@ Getting started =============== -Create a new :class:`matplotlib.figure.Figure` and an -:class:`~mpl_toolkits.mplot3d.Axes3D` object in it:: +An Axes3D object is created just like any other axes using +the projection='3d' keyword. +Create a new :class:`matplotlib.figure.Figure` and +add a new axes to it of type :class:`~mpl_toolkits.mplot3d.Axes3D`:: - import pylab - fig = pylab.figure() + import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D - ax = Axes3D(fig) + fig = plt.figure() + ax = fig.add_subplot(111, projection='3d') Line plots ==================== @@ -39,6 +41,7 @@ .. plot:: mpl_examples/mplot3d/surface3d_demo.py .. plot:: mpl_examples/mplot3d/surface3d_demo2.py +.. plot:: mpl_examples/mplot3d/surface3d_demo3.py Contour plots ============= @@ -46,6 +49,7 @@ .. plot:: mpl_examples/mplot3d/contour3d_demo.py .. plot:: mpl_examples/mplot3d/contour3d_demo2.py +.. plot:: mpl_examples/mplot3d/contour3d_demo3.py Filled contour plots ==================== @@ -75,3 +79,11 @@ .. plot:: mpl_examples/mplot3d/text3d_demo.py +Subplotting +==================== +Having multiple 3D plots in a single figure is the same +as it is for 2D plots. And you can mix 2D and 3D plots +into the same figure. + +.. plot:: mpl_examples/mplot3d/subplot3d_demo.py +.. plot:: mpl_examples/mplot3d/mixed_subplots_demo.py diff -Nru matplotlib-0.99.3/doc/pyplots/pyplot_simple.py matplotlib-1.0.1/doc/pyplots/pyplot_simple.py --- matplotlib-0.99.3/doc/pyplots/pyplot_simple.py 2009-07-31 15:14:32.000000000 +0000 +++ matplotlib-1.0.1/doc/pyplots/pyplot_simple.py 2010-07-07 01:41:47.000000000 +0000 @@ -1,4 +1,4 @@ import matplotlib.pyplot as plt -plt.plot([1,2,3]) +plt.plot([1,2,3,4]) plt.ylabel('some numbers') plt.show() Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/doc/pyplots/tex_demo.png and /tmp/GJbvHcIw6l/matplotlib-1.0.1/doc/pyplots/tex_demo.png differ diff -Nru matplotlib-0.99.3/doc/pyplots/whats_new_1_subplot3d.py matplotlib-1.0.1/doc/pyplots/whats_new_1_subplot3d.py --- matplotlib-0.99.3/doc/pyplots/whats_new_1_subplot3d.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/pyplots/whats_new_1_subplot3d.py 2010-07-07 01:41:47.000000000 +0000 @@ -0,0 +1,30 @@ +from mpl_toolkits.mplot3d.axes3d import Axes3D +from matplotlib import cm +#from matplotlib.ticker import LinearLocator, FixedLocator, FormatStrFormatter +import matplotlib.pyplot as plt +import numpy as np + +fig = plt.figure() + +ax = fig.add_subplot(1, 2, 1, projection='3d') +X = np.arange(-5, 5, 0.25) +Y = np.arange(-5, 5, 0.25) +X, Y = np.meshgrid(X, Y) +R = np.sqrt(X**2 + Y**2) +Z = np.sin(R) +surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.jet, + linewidth=0, antialiased=False) +ax.set_zlim3d(-1.01, 1.01) + +#ax.w_zaxis.set_major_locator(LinearLocator(10)) +#ax.w_zaxis.set_major_formatter(FormatStrFormatter('%.03f')) + +fig.colorbar(surf, shrink=0.5, aspect=5) + +from mpl_toolkits.mplot3d.axes3d import get_test_data +ax = fig.add_subplot(1, 2, 2, projection='3d') +X, Y, Z = get_test_data(0.05) +ax.plot_wireframe(X, Y, Z, rstride=10, cstride=10) + +plt.show() + diff -Nru matplotlib-0.99.3/doc/sphinxext/gen_gallery.py matplotlib-1.0.1/doc/sphinxext/gen_gallery.py --- matplotlib-0.99.3/doc/sphinxext/gen_gallery.py 2009-07-31 15:14:25.000000000 +0000 +++ matplotlib-1.0.1/doc/sphinxext/gen_gallery.py 2010-07-07 01:41:46.000000000 +0000 @@ -18,6 +18,13 @@ multiimage = re.compile('(.*)_\d\d') +def make_thumbnail(args): + image.thumbnail(args[0], args[1], 0.3) + +def out_of_date(original, derived): + return (not os.path.exists(derived) or + os.stat(derived).st_mtime < os.stat(original).st_mtime) + def gen_gallery(app, doctree): if app.builder.name != 'html': return @@ -35,15 +42,14 @@ 'matplotlib_icon', ]) - print - print "generating gallery: ", data = [] + thumbnails = {} + for subdir in ('api', 'pylab_examples', 'mplot3d', 'widgets', 'axes_grid' ): origdir = os.path.join('build', rootdir, subdir) thumbdir = os.path.join(outdir, rootdir, subdir, 'thumbnails') if not os.path.exists(thumbdir): os.makedirs(thumbdir) - print subdir, for filename in sorted(glob.glob(os.path.join(origdir, '*.png'))): if filename.endswith("hires.png"): @@ -52,16 +58,14 @@ path, filename = os.path.split(filename) basename, ext = os.path.splitext(filename) if basename in skips: - sys.stdout.write('[skipping %s]' % basename) - sys.stdout.flush() continue # Create thumbnails based on images in tmpdir, and place # them within the build tree - image.thumbnail( - str(os.path.join(origdir, filename)), - str(os.path.join(thumbdir, filename)), - scale=0.3) + orig_path = str(os.path.join(origdir, filename)) + thumb_path = str(os.path.join(thumbdir, filename)) + if out_of_date(orig_path, thumb_path) or True: + thumbnails[orig_path] = thumb_path m = multiimage.match(basename) if m is None: @@ -73,10 +77,6 @@ data.append((subdir, basename, os.path.join(rootdir, subdir, 'thumbnails', filename))) - sys.stdout.write(".") - sys.stdout.flush() - print - link_template = """\ %s """ @@ -90,10 +90,35 @@ link = 'examples/%s/%s.html'%(subdir, basename) rows.append(link_template%(link, thumbfile, basename)) - fh = file(os.path.join(app.builder.srcdir, '_templates', 'gallery.html'), - 'w') - fh.write(template%'\n'.join(rows)) - fh.close() + # Only write out the file if the contents have actually changed. + # Otherwise, this triggers a full rebuild of the docs + content = template%'\n'.join(rows) + gallery_path = os.path.join(app.builder.srcdir, '_templates', 'gallery.html') + if os.path.exists(gallery_path): + fh = file(gallery_path, 'r') + regenerate = fh.read() != content + fh.close() + else: + regenerate = True + if regenerate: + fh = file(gallery_path, 'w') + fh.write(content) + fh.close() + + try: + import multiprocessing + app.builder.info("generating thumbnails... ", nonl=True) + pool = multiprocessing.Pool() + pool.map(make_thumbnail, thumbnails.iteritems()) + pool.close() + pool.join() + app.builder.info("done") + + except ImportError: + for key in app.builder.status_iterator( + thumbnails.iterkeys(), "generating thumbnails... ", + length=len(thumbnails)): + image.thumbnail(key, thumbnails[key], 0.3) def setup(app): app.connect('env-updated', gen_gallery) diff -Nru matplotlib-0.99.3/doc/sphinxext/gen_rst.py matplotlib-1.0.1/doc/sphinxext/gen_rst.py --- matplotlib-0.99.3/doc/sphinxext/gen_rst.py 2009-07-31 15:14:25.000000000 +0000 +++ matplotlib-1.0.1/doc/sphinxext/gen_rst.py 2010-07-07 01:41:46.000000000 +0000 @@ -113,8 +113,7 @@ fhsubdirIndex.write(' %s\n'%rstfile) - if (not out_of_date(fullpath, outputfile) and - not out_of_date(fullpath, outrstfile)): + if not out_of_date(fullpath, outrstfile): continue fh = file(outrstfile, 'w') diff -Nru matplotlib-0.99.3/doc/sphinxext/ipython_console_highlighting.py matplotlib-1.0.1/doc/sphinxext/ipython_console_highlighting.py --- matplotlib-0.99.3/doc/sphinxext/ipython_console_highlighting.py 2009-07-31 15:14:25.000000000 +0000 +++ matplotlib-1.0.1/doc/sphinxext/ipython_console_highlighting.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,98 +0,0 @@ -"""reST directive for syntax-highlighting ipython interactive sessions. -""" - -#----------------------------------------------------------------------------- -# Needed modules - -# Standard library -import re - -# Third party -from pygments.lexer import Lexer, do_insertions -from pygments.lexers.agile import (PythonConsoleLexer, PythonLexer, - PythonTracebackLexer) -from pygments.token import Comment, Generic - -from sphinx import highlighting - - -#----------------------------------------------------------------------------- -# Global constants -line_re = re.compile('.*?\n') - -#----------------------------------------------------------------------------- -# Code begins - classes and functions - -class IPythonConsoleLexer(Lexer): - """ - For IPython console output or doctests, such as: - - .. sourcecode:: ipython - - In [1]: a = 'foo' - - In [2]: a - Out[2]: 'foo' - - In [3]: print a - foo - - In [4]: 1 / 0 - - Notes: - - - Tracebacks are not currently supported. - - - It assumes the default IPython prompts, not customized ones. - """ - - name = 'IPython console session' - aliases = ['ipython'] - mimetypes = ['text/x-ipython-console'] - input_prompt = re.compile("(In \[[0-9]+\]: )|( \.\.\.+:)") - output_prompt = re.compile("(Out\[[0-9]+\]: )|( \.\.\.+:)") - continue_prompt = re.compile(" \.\.\.+:") - tb_start = re.compile("\-+") - - def get_tokens_unprocessed(self, text): - pylexer = PythonLexer(**self.options) - tblexer = PythonTracebackLexer(**self.options) - - curcode = '' - insertions = [] - for match in line_re.finditer(text): - line = match.group() - input_prompt = self.input_prompt.match(line) - continue_prompt = self.continue_prompt.match(line.rstrip()) - output_prompt = self.output_prompt.match(line) - if line.startswith("#"): - insertions.append((len(curcode), - [(0, Comment, line)])) - elif input_prompt is not None: - insertions.append((len(curcode), - [(0, Generic.Prompt, input_prompt.group())])) - curcode += line[input_prompt.end():] - elif continue_prompt is not None: - insertions.append((len(curcode), - [(0, Generic.Prompt, continue_prompt.group())])) - curcode += line[continue_prompt.end():] - elif output_prompt is not None: - insertions.append((len(curcode), - [(0, Generic.Output, output_prompt.group())])) - curcode += line[output_prompt.end():] - else: - if curcode: - for item in do_insertions(insertions, - pylexer.get_tokens_unprocessed(curcode)): - yield item - curcode = '' - insertions = [] - yield match.start(), Generic.Output, line - if curcode: - for item in do_insertions(insertions, - pylexer.get_tokens_unprocessed(curcode)): - yield item - -#----------------------------------------------------------------------------- -# Register the extension as a valid pygments lexer -highlighting.lexers['ipython'] = IPythonConsoleLexer() diff -Nru matplotlib-0.99.3/doc/sphinxext/math_symbol_table.py matplotlib-1.0.1/doc/sphinxext/math_symbol_table.py --- matplotlib-0.99.3/doc/sphinxext/math_symbol_table.py 2009-07-31 15:14:25.000000000 +0000 +++ matplotlib-1.0.1/doc/sphinxext/math_symbol_table.py 2010-07-07 01:41:46.000000000 +0000 @@ -128,25 +128,14 @@ state_machine.insert_input(lines, "Symbol table") return [] -try: - from docutils.parsers.rst import Directive -except ImportError: - from docutils.parsers.rst.directives import _directives - def math_symbol_table_directive(name, arguments, options, content, lineno, - content_offset, block_text, state, state_machine): - return run(state_machine) - math_symbol_table_directive.arguments = None - math_symbol_table_directive.options = {} - math_symbol_table_directive.content = False - _directives['math_symbol_table'] = math_symbol_table_directive -else: - class math_symbol_table_directive(Directive): - has_content = False - def run(self): - return run(self.state_machine) - from docutils.parsers.rst import directives - directives.register_directive('math_symbol_table', - math_symbol_table_directive) +def math_symbol_table_directive(name, arguments, options, content, lineno, + content_offset, block_text, state, state_machine): + return run(state_machine) + +def setup(app): + app.add_directive( + 'math_symbol_table', math_symbol_table_directive, + False, (0, 1, 0)) if __name__ == "__main__": # Do some verification of the tables diff -Nru matplotlib-0.99.3/doc/_templates/index.html matplotlib-1.0.1/doc/_templates/index.html --- matplotlib-0.99.3/doc/_templates/index.html 2009-08-22 21:06:11.000000000 +0000 +++ matplotlib-1.0.1/doc/_templates/index.html 2010-08-03 14:22:39.000000000 +0000 @@ -1,7 +1,7 @@ {% extends "layout.html" %} {% set title = 'matplotlib: python plotting' %} - + {% block body %}

intro

@@ -9,10 +9,19 @@ publication quality figures in a variety of hardcopy formats and interactive environments across platforms. matplotlib can be used in python scripts, the python and ipython shell (ala matlab or - mathematica), web application servers, and six graphical user + href="http://ipython.scipy.org">ipython shell (ala + MATLAB®* + or + Mathematica®), + web application servers, and six graphical user interface toolkits.

+ + + + +

matplotlib tries to make easy things easy and hard things possible. You can generate plots, histograms, power spectra, bar charts, errorcharts, scatterplots, etc, with just a few lines of code. @@ -24,18 +33,18 @@ alt="screenshots"/>

-

For example, to generate 10,000 gaussian random numbers and make a - histogram plot binning the data into 100 bins, you simply need to +

For example, using "ipython -pylab" to provide an interactive + environment, to generate 10,000 gaussian random numbers and plot a + histogram with 100 bins, you simply need to type

-  >>> from pylab import randn, hist
-  >>> x = randn(10000)
-  >>> hist(x, 100)
+ x = randn(10000) + hist(x, 100)

For the power user, you have full control of line styles, font properties, axes properties, etc, via an object oriented interface - or via a set of functions familiar to Matlab® users. + or via a set of functions familiar to MATLAB users. The pylab mode provides all of the pyplot plotting functions listed below, as well as non-plotting functions from numpy and @@ -611,6 +620,18 @@ + locator_params + + + + + adjust parameters used in locating axis ticks + + + + + + loglog @@ -633,6 +654,18 @@ + margins + + + + + set margins used in autoscaling + + + + + + pcolor @@ -941,6 +974,28 @@ + tick_params + + + + + control the appearance of ticks and tick labels + + + + + + ticklabel_format + + + + + control the format of tick labels + + + + + title @@ -952,6 +1007,50 @@ + tricontour + + + + + make a contour plot on a triangular grid + + + + + + tricontourf + + + + + make a filled contour plot on a triangular grid + + + + + + tripcolor + + + + + make a pseudocolor plot on a triangular grid + + + + + + triplot + + + + + plot a triangular grid + + + + + xcorr @@ -1193,4 +1292,16 @@ + +

+* +MATLAB is a registered trademark of The MathWorks, Inc. +

+

+ +Mathematica is a registered trademark of Wolfram Research, Inc. +

+ + + {% endblock %} diff -Nru matplotlib-0.99.3/doc/_templates/indexsidebar.html matplotlib-1.0.1/doc/_templates/indexsidebar.html --- matplotlib-0.99.3/doc/_templates/indexsidebar.html 2010-03-09 14:20:18.000000000 +0000 +++ matplotlib-1.0.1/doc/_templates/indexsidebar.html 2010-10-15 13:33:56.000000000 +0000 @@ -1,18 +1,19 @@

News

+

Please donate to support matplotlib development.

-

matplotlib 0.99.1 is available for download. See what's new and tips on download. See what's new and tips on installing

Sandro Tosi has a new book -Matplotlib for python -developers -also -at amazon.

+ Matplotlib for python + developers + also + at amazon.

Build websites like matplotlib's, with sphinx and extensions for @@ -21,13 +22,17 @@ tutorial.

-

Videos

Watch the SciPy 2009 intro and advanced matplotlib tutorials

-

Watch a talk about matplotlib presented at NIPS 08 Workshop MLOSS. +

Watch +a talk about +matplotlib presented +at NIPS 08 +Workshop MLOSS and one presented +at ChiPy.

@@ -46,7 +51,7 @@

Check the user guide, the faq, the api docs, -archives, +archives, and join the matplotlib mailing lists. The search tool searches all of diff -Nru matplotlib-0.99.3/doc/_templates/layout.html matplotlib-1.0.1/doc/_templates/layout.html --- matplotlib-0.99.3/doc/_templates/layout.html 2010-03-09 14:20:18.000000000 +0000 +++ matplotlib-1.0.1/doc/_templates/layout.html 2010-07-07 01:41:46.000000000 +0000 @@ -4,7 +4,7 @@ {% block rootrellink %}

  • home
  • search
  • -
  • examples
  • +
  • examples
  • gallery
  • docs »
  • {% endblock %} @@ -13,17 +13,24 @@ {% block relbar1 %} + - - +
    ")) + + 2. :class:`~matplotlib.artist.Artist` instance. The xy value (or + xytext) is interpreted as a fractional coordinate of the bbox + (return value of *get_window_extent*) of the artist. :: + + an1 = ax.annotate("Test 1", xy=(0.5, 0.5), xycoords="data", + va="center", ha="center", + bbox=dict(boxstyle="round", fc="w")) + an2 = ax.annotate("Test 2", xy=(1, 0.5), xycoords=an1, # (1,0.5) of the an1's bbox + xytext=(30,0), textcoords="offset points", + va="center", ha="left", + bbox=dict(boxstyle="round", fc="w"), + arrowprops=dict(arrowstyle="->")) + + .. plot:: users/plotting/examples/annotate_simple_coord01.py + + Note that it is your responsibility that the extent of the + coordinate artist (*an1* in above example) is determined before *an2* + gets drawn. In most cases, it means that an2 needs to be drawn + later than *an1*. + + + 3. A callable object that returns an instance of either + :class:`~matplotlib.transforms.BboxBase` or + :class:`~matplotlib.transforms.Transform`. If a transform is + returned, it is same as 1 and if bbox is returned, it is same + as 2. The callable object should take a single argument of + renderer instance. For example, following two commands give + identical results :: + + an2 = ax.annotate("Test 2", xy=(1, 0.5), xycoords=an1, + xytext=(30,0), textcoords="offset points") + an2 = ax.annotate("Test 2", xy=(1, 0.5), xycoords=an1.get_window_extent, + xytext=(30,0), textcoords="offset points") + + + 4. A tuple of two coordinate specification. The first item is for + x-coordinate and the second is for y-coordinate. For example, :: + + annotate("Test", xy=(0.5, 1), xycoords=("data", "axes fraction")) + + 0.5 is in data coordinate, and 1 is in normalized axes coordinate. + You may use an atist or transform as with a tuple. For example, + + .. plot:: users/plotting/examples/annotate_simple_coord02.py + :include-source: + + + 5. Sometimes, you want your annotation with some "offset points", but + not from the annotated point but from other + point. :class:`~matplotlib.text.OffsetFrom` is a helper class for such + case. + + .. plot:: users/plotting/examples/annotate_simple_coord03.py + :include-source: + + You may take a look at this example :ref:`pylab_examples-annotation_demo3`. + +Using ConnectorPatch +==================== + +The ConnectorPatch is like an annotation without a text. While the +annotate function is recommended in most of situation, the +ConnectorPatch is useful when you want to connect points in different +axes. :: + + from matplotlib.patches import ConnectionPatch + xy = (0.2, 0.2) + con = ConnectionPatch(xyA=xy, xyB=xy, coordsA="data", coordsB="data", + axesA=ax1, axesB=ax2) + ax2.add_artist(con) + +The above code connects point xy in data coordinate of ``ax1`` to +point xy int data coordinate of ``ax2``. Here is a simple example. + +.. plot:: users/plotting/examples/connect_simple01.py + + +While the ConnectorPatch instance can be added to any axes, but you +may want it to be added to the axes in the latter (?) of the axes +drawing order to prevent overlap (?) by other axes. + + + + Advanced Topics *************** diff -Nru matplotlib-0.99.3/doc/users/artists.rst matplotlib-1.0.1/doc/users/artists.rst --- matplotlib-0.99.3/doc/users/artists.rst 2010-03-09 14:20:18.000000000 +0000 +++ matplotlib-1.0.1/doc/users/artists.rst 2010-07-07 01:41:46.000000000 +0000 @@ -1,610 +1,611 @@ -.. _artist-tutorial: - -*************** -Artist tutorial -*************** - -There are three layers to the matplotlib API. The -:class:`matplotlib.backend_bases.FigureCanvas` is the area onto which -the figure is drawn, the :class:`matplotlib.backend_bases.Renderer` is -the object which knows how to draw on the -:class:`~matplotlib.backend_bases.FigureCanvas`, and the -:class:`matplotlib.artist.Artist` is the object that knows how to use -a renderer to paint onto the canvas. The -:class:`~matplotlib.backend_bases.FigureCanvas` and -:class:`~matplotlib.backend_bases.Renderer` handle all the details of -talking to user interface toolkits like `wxPython -`_ or drawing languages like PostScript®, and -the ``Artist`` handles all the high level constructs like representing -and laying out the figure, text, and lines. The typical user will -spend 95% of his time working with the ``Artists``. - -There are two types of ``Artists``: primitives and containers. The primitives represent the standard graphical objects we want to paint onto our canvas: :class:`~matplotlib.lines.Line2D`, :class:`~matplotlib.patches.Rectangle`, :class:`~matplotlib.text.Text`, :class:`~matplotlib.image.AxesImage`, etc., and the containers are places to put them (:class:`~matplotlib.axis.Axis`, :class:`~matplotlib.axes.Axes` and :class:`~matplotlib.figure.Figure`). The standard use is to create a :class:`~matplotlib.figure.Figure` instance, use the ``Figure`` to create one or more :class:`~matplotlib.axes.Axes` or :class:`~matplotlib.axes.Subplot` instances, and use the ``Axes`` instance helper methods to create the primitives. In the example below, we create a ``Figure`` instance using :func:`matplotlib.pyplot.figure`, which is a convenience method for instantiating ``Figure`` instances and connecting them with your user interface or drawing toolkit ``FigureCanvas``. As we will discuss below, this is not necessary -- you can work directly with PostScript, PDF Gtk+, or wxPython ``FigureCanvas`` instances, instantiate your ``Figures`` directly and connect them yourselves -- but since we are focusing here on the ``Artist`` API we'll let :mod:`~matplotlib.pyplot` handle some of those details for us:: - - import matplotlib.pyplot as plt - fig = plt.figure() - ax = fig.add_subplot(2,1,1) # two rows, one column, first plot - -The :class:`~matplotlib.axes.Axes` is probably the most important -class in the matplotlib API, and the one you will be working with most -of the time. This is because the ``Axes`` is the plotting area into -which most of the objects go, and the ``Axes`` has many special helper -methods (:meth:`~matplotlib.axes.Axes.plot`, -:meth:`~matplotlib.axes.Axes.text`, -:meth:`~matplotlib.axes.Axes.hist`, -:meth:`~matplotlib.axes.Axes.imshow`) to create the most common -graphics primitives (:class:`~matplotlib.lines.Line2D`, -:class:`~matplotlib.text.Text`, -:class:`~matplotlib.patches.Rectangle`, -:class:`~matplotlib.image.Image`, respectively). These helper methods -will take your data (eg. ``numpy`` arrays and strings) and create -primitive ``Artist`` instances as needed (eg. ``Line2D``), add them to -the relevant containers, and draw them when requested. Most of you -are probably familiar with the :class:`~matplotlib.axes.Subplot`, -which is just a special case of an ``Axes`` that lives on a regular -rows by columns grid of ``Subplot`` instances. If you want to create -an ``Axes`` at an arbitrary location, simply use the -:meth:`~matplotlib.figure.Figure.add_axes` method which takes a list -of ``[left, bottom, width, height]`` values in 0-1 relative figure -coordinates:: - - fig2 = plt.figure() - ax2 = fig2.add_axes([0.15, 0.1, 0.7, 0.3]) - -Continuing with our example:: - - import numpy as np - t = np.arange(0.0, 1.0, 0.01) - s = np.sin(2*np.pi*t) - line, = ax.plot(t, s, color='blue', lw=2) - -In this example, ``ax`` is the ``Axes`` instance created by the -``fig.add_subplot`` call above (remember ``Subplot`` is just a -subclass of ``Axes``) and when you call ``ax.plot``, it creates a -``Line2D`` instance and adds it to the :attr:`Axes.lines -` list. In the interactive `ipython -`_ session below, you can see that the -``Axes.lines`` list is length one and contains the same line that was -returned by the ``line, = ax.plot...`` call: - -.. sourcecode:: ipython - - In [101]: ax.lines[0] - Out[101]: - - In [102]: line - Out[102]: - -If you make subsequent calls to ``ax.plot`` (and the hold state is "on" -which is the default) then additional lines will be added to the list. -You can remove lines later simply by calling the list methods; either -of these will work:: - - del ax.lines[0] - ax.lines.remove(line) # one or the other, not both! - -The Axes also has helper methods to configure and decorate the x-axis -and y-axis tick, tick labels and axis labels:: - - xtext = ax.set_xlabel('my xdata') # returns a Text instance - ytext = ax.set_ylabel('my xdata') - -When you call :meth:`ax.set_xlabel `, -it passes the information on the :class:`~matplotlib.text.Text` -instance of the :class:`~matplotlib.axis.XAxis`. Each ``Axes`` -instance contains an :class:`~matplotlib.axis.XAxis` and a -:class:`~matplotlib.axis.YAxis` instance, which handle the layout and -drawing of the ticks, tick labels and axis labels. - -.. I'm commenting this out, since the new Sphinx cross-references -.. sort of take care of this above - MGD - -.. Here are the most important matplotlib modules that contain the -.. classes referenced above - -.. =============== ================== -.. Artist Module -.. =============== ================== -.. Artist matplotlib.artist -.. Rectangle matplotlib.patches -.. Line2D matplotlib.lines -.. Axes matplotlib.axes -.. XAxis and YAxis matplotlib.axis -.. Figure matplotlib.figure -.. Text matplotlib.text -.. =============== ================== - -Try creating the figure below. - -.. plot:: pyplots/fig_axes_labels_simple.py - -.. _customizing-artists: - -Customizing your objects -======================== - -Every element in the figure is represented by a matplotlib -:class:`~matplotlib.artist.Artist`, and each has an extensive list of -properties to configure its appearance. The figure itself contains a -:class:`~matplotlib.patches.Rectangle` exactly the size of the figure, -which you can use to set the background color and transparency of the -figures. Likewise, each :class:`~matplotlib.axes.Axes` bounding box -(the standard white box with black edges in the typical matplotlib -plot, has a ``Rectangle`` instance that determines the color, -transparency, and other properties of the Axes. These instances are -stored as member variables :attr:`Figure.patch -` and :attr:`Axes.patch -` ("Patch" is a name inherited from -MATLABâ„¢, and is a 2D "patch" of color on the figure, eg. rectangles, -circles and polygons). Every matplotlib ``Artist`` has the following -properties - -========== ====================================================================== -Property Description -========== ====================================================================== -alpha The transparency - a scalar from 0-1 -animated A boolean that is used to facilitate animated drawing -axes The axes that the Artist lives in, possibly None -clip_box The bounding box that clips the Artist -clip_on Whether clipping is enabled -clip_path The path the artist is clipped to -contains A picking function to test whether the artist contains the pick point -figure The figure instance the artist lives in, possibly None -label A text label (eg. for auto-labeling) -picker A python object that controls object picking -transform The transformation -visible A boolean whether the artist should be drawn -zorder A number which determines the drawing order -========== ====================================================================== - -Each of the properties is accessed with an old-fashioned setter or -getter (yes we know this irritates Pythonistas and we plan to support -direct access via properties or traits but it hasn't been done yet). -For example, to multiply the current alpha by a half:: - - a = o.get_alpha() - o.set_alpha(0.5*a) - -If you want to set a number of properties at once, you can also use -the ``set`` method with keyword arguments. For example:: - - o.set(alpha=0.5, zorder=2) - -If you are working interactively at the python shell, a handy way to -inspect the ``Artist`` properties is to use the -:func:`matplotlib.artist.getp` function (simply -:func:`~matplotlib.pylab.getp` in pylab), which lists the properties -and their values. This works for classes derived from ``Artist`` as -well, eg. ``Figure`` and ``Rectangle``. Here are the ``Figure`` rectangle -properties mentioned above: - -.. sourcecode:: ipython - - In [149]: matplotlib.artist.getp(fig.patch) - alpha = 1.0 - animated = False - antialiased or aa = True - axes = None - clip_box = None - clip_on = False - clip_path = None - contains = None - edgecolor or ec = w - facecolor or fc = 0.75 - figure = Figure(8.125x6.125) - fill = 1 - hatch = None - height = 1 - label = - linewidth or lw = 1.0 - picker = None - transform = - verts = ((0, 0), (0, 1), (1, 1), (1, 0)) - visible = True - width = 1 - window_extent = - x = 0 - y = 0 - zorder = 1 - -.. TODO: Update these URLs - -The docstrings for all of the classes also contain the ``Artist`` -properties, so you can consult the interactive "help" or the -:ref:`artist-api` for a listing of properties for a given object. - -.. _object-containers: - -Object containers -================= - - -Now that we know how to inspect and set the properties of a given -object we want to configure, we need to now how to get at that object. -As mentioned in the introduction, there are two kinds of objects: -primitives and containers. The primitives are usually the things you -want to configure (the font of a :class:`~matplotlib.text.Text` -instance, the width of a :class:`~matplotlib.lines.Line2D`) although -the containers also have some properties as well -- for example the -:class:`~matplotlib.axes.Axes` :class:`~matplotlib.artist.Artist` is a -container that contains many of the primitives in your plot, but it -also has properties like the ``xscale`` to control whether the xaxis -is 'linear' or 'log'. In this section we'll review where the various -container objects store the ``Artists`` that you want to get at. - -.. _figure-container: - -Figure container -================ - -The top level container ``Artist`` is the -:class:`matplotlib.figure.Figure`, and it contains everything in the -figure. The background of the figure is a -:class:`~matplotlib.patches.Rectangle` which is stored in -:attr:`Figure.patch `. As -you add subplots (:meth:`~matplotlib.figure.Figure.add_subplot`) and -axes (:meth:`~matplotlib.figure.Figure.add_axes`) to the figure -these will be appended to the :attr:`Figure.axes -`. These are also returned by the -methods that create them: - -.. sourcecode:: ipython - - In [156]: fig = plt.figure() - - In [157]: ax1 = fig.add_subplot(211) - - In [158]: ax2 = fig.add_axes([0.1, 0.1, 0.7, 0.3]) - - In [159]: ax1 - Out[159]: - - In [160]: print fig.axes - [, ] - -Because the figure maintains the concept of the "current axes" (see -:meth:`Figure.gca ` and -:meth:`Figure.sca `) to support the -pylab/pyplot state machine, you should not insert or remove axes -directly from the axes list, but rather use the -:meth:`~matplotlib.figure.Figure.add_subplot` and -:meth:`~matplotlib.figure.Figure.add_axes` methods to insert, and the -:meth:`~matplotlib.figure.Figure.delaxes` method to delete. You are -free however, to iterate over the list of axes or index into it to get -access to ``Axes`` instances you want to customize. Here is an -example which turns all the axes grids on:: - - for ax in fig.axes: - ax.grid(True) - - -The figure also has its own text, lines, patches and images, which you -can use to add primitives directly. The default coordinate system for -the ``Figure`` will simply be in pixels (which is not usually what you -want) but you can control this by setting the transform property of -the ``Artist`` you are adding to the figure. - -.. TODO: Is that still true? - -More useful is "figure coordinates" where (0, 0) is the bottom-left of -the figure and (1, 1) is the top-right of the figure which you can -obtain by setting the ``Artist`` transform to :attr:`fig.transFigure -`: - -.. sourcecode:: ipython - - In [191]: fig = plt.figure() - - In [192]: l1 = matplotlib.lines.Line2D([0, 1], [0, 1], - transform=fig.transFigure, figure=fig) - - In [193]: l2 = matplotlib.lines.Line2D([0, 1], [1, 0], - transform=fig.transFigure, figure=fig) - - In [194]: fig.lines.extend([l1, l2]) - - In [195]: fig.canvas.draw() - -.. plot:: pyplots/fig_x.py - - -Here is a summary of the Artists the figure contains - -.. TODO: Add xrefs to this table - -================ =============================================================== -Figure attribute Description -================ =============================================================== -axes A list of Axes instances (includes Subplot) -patch The Rectangle background -images A list of FigureImages patches - useful for raw pixel display -legends A list of Figure Legend instances (different from Axes.legends) -lines A list of Figure Line2D instances (rarely used, see Axes.lines) -patches A list of Figure patches (rarely used, see Axes.patches) -texts A list Figure Text instances -================ =============================================================== - -.. _axes-container: - -Axes container -============== - -The :class:`matplotlib.axes.Axes` is the center of the matplotlib -universe -- it contains the vast majority of all the ``Artists`` used -in a figure with many helper methods to create and add these -``Artists`` to itself, as well as helper methods to access and -customize the ``Artists`` it contains. Like the -:class:`~matplotlib.figure.Figure`, it contains a -:class:`~matplotlib.patches.Patch` -:attr:`~matplotlib.axes.Axes.patch` which is a -:class:`~matplotlib.patches.Rectangle` for Cartesian coordinates and a -:class:`~matplotlib.patches.Circle` for polar coordinates; this patch -determines the shape, background and border of the plotting region:: - - ax = fig.add_subplot(111) - rect = ax.patch # a Rectangle instance - rect.set_facecolor('green') - -When you call a plotting method, eg. the canonical -:meth:`~matplotlib.axes.Axes.plot` and pass in arrays or lists of -values, the method will create a :meth:`matplotlib.lines.Line2D` -instance, update the line with all the ``Line2D`` properties passed as -keyword arguments, add the line to the :attr:`Axes.lines -` container, and returns it to you: - -.. sourcecode:: ipython - - In [213]: x, y = np.random.rand(2, 100) - - In [214]: line, = ax.plot(x, y, '-', color='blue', linewidth=2) - -``plot`` returns a list of lines because you can pass in multiple x, y -pairs to plot, and we are unpacking the first element of the length -one list into the line variable. The line has been added to the -``Axes.lines`` list: - -.. sourcecode:: ipython - - In [229]: print ax.lines - [] - -Similarly, methods that create patches, like -:meth:`~matplotlib.axes.Axes.bar` creates a list of rectangles, will -add the patches to the :attr:`Axes.patches -` list: - -.. sourcecode:: ipython - - In [233]: n, bins, rectangles = ax.hist(np.random.randn(1000), 50, facecolor='yellow') - - In [234]: rectangles - Out[234]: - - In [235]: print len(ax.patches) - -You should not add objects directly to the ``Axes.lines`` or -``Axes.patches`` lists unless you know exactly what you are doing, -because the ``Axes`` needs to do a few things when it creates and adds -an object. It sets the figure and axes property of the ``Artist``, as -well as the default ``Axes`` transformation (unless a transformation -is set). It also inspects the data contained in the ``Artist`` to -update the data structures controlling auto-scaling, so that the view -limits can be adjusted to contain the plotted data. You can, -nonetheless, create objects yourself and add them directly to the -``Axes`` using helper methods like -:meth:`~matplotlib.axes.Axes.add_line` and -:meth:`~matplotlib.axes.Axes.add_patch`. Here is an annotated -interactive session illustrating what is going on: - -.. sourcecode:: ipython - - In [261]: fig = plt.figure() - - In [262]: ax = fig.add_subplot(111) - - # create a rectangle instance - In [263]: rect = matplotlib.patches.Rectangle( (1,1), width=5, height=12) - - # by default the axes instance is None - In [264]: print rect.get_axes() - None - - # and the transformation instance is set to the "identity transform" - In [265]: print rect.get_transform() - - - # now we add the Rectangle to the Axes - In [266]: ax.add_patch(rect) - - # and notice that the ax.add_patch method has set the axes - # instance - In [267]: print rect.get_axes() - Axes(0.125,0.1;0.775x0.8) - - # and the transformation has been set too - In [268]: print rect.get_transform() - - - # the default axes transformation is ax.transData - In [269]: print ax.transData - - - # notice that the xlimits of the Axes have not been changed - In [270]: print ax.get_xlim() - (0.0, 1.0) - - # but the data limits have been updated to encompass the rectangle - In [271]: print ax.dataLim.bounds - (1.0, 1.0, 5.0, 12.0) - - # we can manually invoke the auto-scaling machinery - In [272]: ax.autoscale_view() - - # and now the xlim are updated to encompass the rectangle - In [273]: print ax.get_xlim() - (1.0, 6.0) - - # we have to manually force a figure draw - In [274]: ax.figure.canvas.draw() - - -There are many, many ``Axes`` helper methods for creating primitive -``Artists`` and adding them to their respective containers. The table -below summarizes a small sampling of them, the kinds of ``Artist`` they -create, and where they store them - -============================== ==================== ======================= -Helper method Artist Container -============================== ==================== ======================= -ax.annotate - text annotations Annotate ax.texts -ax.bar - bar charts Rectangle ax.patches -ax.errorbar - error bar plots Line2D and Rectangle ax.lines and ax.patches -ax.fill - shared area Polygon ax.patches -ax.hist - histograms Rectangle ax.patches -ax.imshow - image data AxesImage ax.images -ax.legend - axes legends Legend ax.legends -ax.plot - xy plots Line2D ax.lines -ax.scatter - scatter charts PolygonCollection ax.collections -ax.text - text Text ax.texts -============================== ==================== ======================= - - -In addition to all of these ``Artists``, the ``Axes`` contains two -important ``Artist`` containers: the :class:`~matplotlib.axis.XAxis` -and :class:`~matplotlib.axis.YAxis`, which handle the drawing of the -ticks and labels. These are stored as instance variables -:attr:`~matplotlib.axes.Axes.xaxis` and -:attr:`~matplotlib.axes.Axes.yaxis`. The ``XAxis`` and ``YAxis`` -containers will be detailed below, but note that the ``Axes`` contains -many helper methods which forward calls on to the -:class:`~matplotlib.axis.Axis` instances so you often do not need to -work with them directly unless you want to. For example, you can set -the font size of the ``XAxis`` ticklabels using the ``Axes`` helper -method:: - - for label in ax.get_xticklabels(): - label.set_color('orange') - -Below is a summary of the Artists that the Axes contains - -============== ====================================== -Axes attribute Description -============== ====================================== -artists A list of Artist instances -patch Rectangle instance for Axes background -collections A list of Collection instances -images A list of AxesImage -legends A list of Legend instances -lines A list of Line2D instances -patches A list of Patch instances -texts A list of Text instances -xaxis matplotlib.axis.XAxis instance -yaxis matplotlib.axis.YAxis instance -============== ====================================== - -.. _axis-container: - -Axis containers -=============== - -The :class:`matplotlib.axis.Axis` instances handle the drawing of the -tick lines, the grid lines, the tick labels and the axis label. You -can configure the left and right ticks separately for the y-axis, and -the upper and lower ticks separately for the x-axis. The ``Axis`` -also stores the data and view intervals used in auto-scaling, panning -and zooming, as well as the :class:`~matplotlib.ticker.Locator` and -:class:`~matplotlib.ticker.Formatter` instances which control where -the ticks are placed and how they are represented as strings. - -Each ``Axis`` object contains a :attr:`~matplotlib.axis.Axis.label` attribute (this is what :mod:`~matplotlib.pylab` modifies in calls to :func:`~matplotlib.pylab.xlabel` and :func:`~matplotlib.pylab.ylabel`) as well as a list of major and minor ticks. The ticks are :class:`~matplotlib.axis.XTick` and :class:`~matplotlib.axis.YTick` instances, which contain the actual line and text primitives that render the ticks and ticklabels. Because the ticks are dynamically created as needed (eg. when panning and zooming), you should access the lists of major and minor ticks through their accessor methods :meth:`~matplotlib.axis.Axis.get_major_ticks` and :meth:`~matplotlib.axis.Axis.get_minor_ticks`. Although the ticks contain all the primitives and will be covered below, the ``Axis`` methods contain accessor methods to return the tick lines, tick labels, tick locations etc.: - -.. sourcecode:: ipython - - In [285]: axis = ax.xaxis - - In [286]: axis.get_ticklocs() - Out[286]: array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.]) - - In [287]: axis.get_ticklabels() - Out[287]: - - # note there are twice as many ticklines as labels because by - # default there are tick lines at the top and bottom but only tick - # labels below the xaxis; this can be customized - In [288]: axis.get_ticklines() - Out[288]: - - # by default you get the major ticks back - In [291]: axis.get_ticklines() - Out[291]: - - # but you can also ask for the minor ticks - In [292]: axis.get_ticklines(minor=True) - Out[292]: - -Here is a summary of some of the useful accessor methods of the ``Axis`` -(these have corresponding setters where useful, such as -set_major_formatter) - -====================== ========================================================= -Accessor method Description -====================== ========================================================= -get_scale The scale of the axis, eg 'log' or 'linear' -get_view_interval The interval instance of the axis view limits -get_data_interval The interval instance of the axis data limits -get_gridlines A list of grid lines for the Axis -get_label The axis label - a Text instance -get_ticklabels A list of Text instances - keyword minor=True|False -get_ticklines A list of Line2D instances - keyword minor=True|False -get_ticklocs A list of Tick locations - keyword minor=True|False -get_major_locator The matplotlib.ticker.Locator instance for major ticks -get_major_formatter The matplotlib.ticker.Formatter instance for major ticks -get_minor_locator The matplotlib.ticker.Locator instance for minor ticks -get_minor_formatter The matplotlib.ticker.Formatter instance for minor ticks -get_major_ticks A list of Tick instances for major ticks -get_minor_ticks A list of Tick instances for minor ticks -grid Turn the grid on or off for the major or minor ticks -====================== ========================================================= - -Here is an example, not recommended for its beauty, which customizes -the axes and tick properties - -.. plot:: pyplots/fig_axes_customize_simple.py - :include-source: - - -.. _tick-container: - -Tick containers -=============== - -The :class:`matplotlib.axis.Tick` is the final container object in our -descent from the :class:`~matplotlib.figure.Figure` to the -:class:`~matplotlib.axes.Axes` to the :class:`~matplotlib.axis.Axis` -to the :class:`~matplotlib.axis.Tick`. The ``Tick`` contains the tick -and grid line instances, as well as the label instances for the upper -and lower ticks. Each of these is accessible directly as an attribute -of the ``Tick``. In addition, there are boolean variables that determine -whether the upper labels and ticks are on for the x-axis and whether -the right labels and ticks are on for the y-axis. - -============== ========================================================== -Tick attribute Description -============== ========================================================== -tick1line Line2D instance -tick2line Line2D instance -gridline Line2D instance -label1 Text instance -label2 Text instance -gridOn boolean which determines whether to draw the tickline -tick1On boolean which determines whether to draw the 1st tickline -tick2On boolean which determines whether to draw the 2nd tickline -label1On boolean which determines whether to draw tick label -label2On boolean which determines whether to draw tick label -============== ========================================================== - -Here is an example which sets the formatter for the right side ticks with -dollar signs and colors them green on the right side of the yaxis - -.. plot:: pyplots/dollar_ticks.py - :include-source: +.. _artist-tutorial: + +*************** +Artist tutorial +*************** + +There are three layers to the matplotlib API. The +:class:`matplotlib.backend_bases.FigureCanvas` is the area onto which +the figure is drawn, the :class:`matplotlib.backend_bases.Renderer` is +the object which knows how to draw on the +:class:`~matplotlib.backend_bases.FigureCanvas`, and the +:class:`matplotlib.artist.Artist` is the object that knows how to use +a renderer to paint onto the canvas. The +:class:`~matplotlib.backend_bases.FigureCanvas` and +:class:`~matplotlib.backend_bases.Renderer` handle all the details of +talking to user interface toolkits like `wxPython +`_ or drawing languages like PostScript®, and +the ``Artist`` handles all the high level constructs like representing +and laying out the figure, text, and lines. The typical user will +spend 95% of his time working with the ``Artists``. + +There are two types of ``Artists``: primitives and containers. The primitives represent the standard graphical objects we want to paint onto our canvas: :class:`~matplotlib.lines.Line2D`, :class:`~matplotlib.patches.Rectangle`, :class:`~matplotlib.text.Text`, :class:`~matplotlib.image.AxesImage`, etc., and the containers are places to put them (:class:`~matplotlib.axis.Axis`, :class:`~matplotlib.axes.Axes` and :class:`~matplotlib.figure.Figure`). The standard use is to create a :class:`~matplotlib.figure.Figure` instance, use the ``Figure`` to create one or more :class:`~matplotlib.axes.Axes` or :class:`~matplotlib.axes.Subplot` instances, and use the ``Axes`` instance helper methods to create the primitives. In the example below, we create a ``Figure`` instance using :func:`matplotlib.pyplot.figure`, which is a convenience method for instantiating ``Figure`` instances and connecting them with your user interface or drawing toolkit ``FigureCanvas``. As we will discuss below, this is not necessary -- you +can work directly with PostScript, PDF Gtk+, or wxPython ``FigureCanvas`` instances, instantiate your ``Figures`` directly and connect them yourselves -- but since we are focusing here on the ``Artist`` API we'll let :mod:`~matplotlib.pyplot` handle some of those details for us:: + + import matplotlib.pyplot as plt + fig = plt.figure() + ax = fig.add_subplot(2,1,1) # two rows, one column, first plot + +The :class:`~matplotlib.axes.Axes` is probably the most important +class in the matplotlib API, and the one you will be working with most +of the time. This is because the ``Axes`` is the plotting area into +which most of the objects go, and the ``Axes`` has many special helper +methods (:meth:`~matplotlib.axes.Axes.plot`, +:meth:`~matplotlib.axes.Axes.text`, +:meth:`~matplotlib.axes.Axes.hist`, +:meth:`~matplotlib.axes.Axes.imshow`) to create the most common +graphics primitives (:class:`~matplotlib.lines.Line2D`, +:class:`~matplotlib.text.Text`, +:class:`~matplotlib.patches.Rectangle`, +:class:`~matplotlib.image.Image`, respectively). These helper methods +will take your data (eg. ``numpy`` arrays and strings) and create +primitive ``Artist`` instances as needed (eg. ``Line2D``), add them to +the relevant containers, and draw them when requested. Most of you +are probably familiar with the :class:`~matplotlib.axes.Subplot`, +which is just a special case of an ``Axes`` that lives on a regular +rows by columns grid of ``Subplot`` instances. If you want to create +an ``Axes`` at an arbitrary location, simply use the +:meth:`~matplotlib.figure.Figure.add_axes` method which takes a list +of ``[left, bottom, width, height]`` values in 0-1 relative figure +coordinates:: + + fig2 = plt.figure() + ax2 = fig2.add_axes([0.15, 0.1, 0.7, 0.3]) + +Continuing with our example:: + + import numpy as np + t = np.arange(0.0, 1.0, 0.01) + s = np.sin(2*np.pi*t) + line, = ax.plot(t, s, color='blue', lw=2) + +In this example, ``ax`` is the ``Axes`` instance created by the +``fig.add_subplot`` call above (remember ``Subplot`` is just a +subclass of ``Axes``) and when you call ``ax.plot``, it creates a +``Line2D`` instance and adds it to the :attr:`Axes.lines +` list. In the interactive `ipython +`_ session below, you can see that the +``Axes.lines`` list is length one and contains the same line that was +returned by the ``line, = ax.plot...`` call: + +.. sourcecode:: ipython + + In [101]: ax.lines[0] + Out[101]: + + In [102]: line + Out[102]: + +If you make subsequent calls to ``ax.plot`` (and the hold state is "on" +which is the default) then additional lines will be added to the list. +You can remove lines later simply by calling the list methods; either +of these will work:: + + del ax.lines[0] + ax.lines.remove(line) # one or the other, not both! + +The Axes also has helper methods to configure and decorate the x-axis +and y-axis tick, tick labels and axis labels:: + + xtext = ax.set_xlabel('my xdata') # returns a Text instance + ytext = ax.set_ylabel('my xdata') + +When you call :meth:`ax.set_xlabel `, +it passes the information on the :class:`~matplotlib.text.Text` +instance of the :class:`~matplotlib.axis.XAxis`. Each ``Axes`` +instance contains an :class:`~matplotlib.axis.XAxis` and a +:class:`~matplotlib.axis.YAxis` instance, which handle the layout and +drawing of the ticks, tick labels and axis labels. + +.. I'm commenting this out, since the new Sphinx cross-references +.. sort of take care of this above - MGD + +.. Here are the most important matplotlib modules that contain the +.. classes referenced above + +.. =============== ================== +.. Artist Module +.. =============== ================== +.. Artist matplotlib.artist +.. Rectangle matplotlib.patches +.. Line2D matplotlib.lines +.. Axes matplotlib.axes +.. XAxis and YAxis matplotlib.axis +.. Figure matplotlib.figure +.. Text matplotlib.text +.. =============== ================== + +Try creating the figure below. + +.. plot:: pyplots/fig_axes_labels_simple.py + +.. _customizing-artists: + +Customizing your objects +======================== + +Every element in the figure is represented by a matplotlib +:class:`~matplotlib.artist.Artist`, and each has an extensive list of +properties to configure its appearance. The figure itself contains a +:class:`~matplotlib.patches.Rectangle` exactly the size of the figure, +which you can use to set the background color and transparency of the +figures. Likewise, each :class:`~matplotlib.axes.Axes` bounding box +(the standard white box with black edges in the typical matplotlib +plot, has a ``Rectangle`` instance that determines the color, +transparency, and other properties of the Axes. These instances are +stored as member variables :attr:`Figure.patch +` and :attr:`Axes.patch +` ("Patch" is a name inherited from +MATLAB, and is a 2D "patch" of color on the figure, eg. rectangles, +circles and polygons). Every matplotlib ``Artist`` has the following +properties + +========== ====================================================================== +Property Description +========== ====================================================================== +alpha The transparency - a scalar from 0-1 +animated A boolean that is used to facilitate animated drawing +axes The axes that the Artist lives in, possibly None +clip_box The bounding box that clips the Artist +clip_on Whether clipping is enabled +clip_path The path the artist is clipped to +contains A picking function to test whether the artist contains the pick point +figure The figure instance the artist lives in, possibly None +label A text label (eg. for auto-labeling) +picker A python object that controls object picking +transform The transformation +visible A boolean whether the artist should be drawn +zorder A number which determines the drawing order +========== ====================================================================== + +Each of the properties is accessed with an old-fashioned setter or +getter (yes we know this irritates Pythonistas and we plan to support +direct access via properties or traits but it hasn't been done yet). +For example, to multiply the current alpha by a half:: + + a = o.get_alpha() + o.set_alpha(0.5*a) + +If you want to set a number of properties at once, you can also use +the ``set`` method with keyword arguments. For example:: + + o.set(alpha=0.5, zorder=2) + +If you are working interactively at the python shell, a handy way to +inspect the ``Artist`` properties is to use the +:func:`matplotlib.artist.getp` function (simply +:func:`~matplotlib.pylab.getp` in pylab), which lists the properties +and their values. This works for classes derived from ``Artist`` as +well, eg. ``Figure`` and ``Rectangle``. Here are the ``Figure`` rectangle +properties mentioned above: + +.. sourcecode:: ipython + + In [149]: matplotlib.artist.getp(fig.patch) + alpha = 1.0 + animated = False + antialiased or aa = True + axes = None + clip_box = None + clip_on = False + clip_path = None + contains = None + edgecolor or ec = w + facecolor or fc = 0.75 + figure = Figure(8.125x6.125) + fill = 1 + hatch = None + height = 1 + label = + linewidth or lw = 1.0 + picker = None + transform = + verts = ((0, 0), (0, 1), (1, 1), (1, 0)) + visible = True + width = 1 + window_extent = + x = 0 + y = 0 + zorder = 1 + +.. TODO: Update these URLs + +The docstrings for all of the classes also contain the ``Artist`` +properties, so you can consult the interactive "help" or the +:ref:`artist-api` for a listing of properties for a given object. + +.. _object-containers: + +Object containers +================= + + +Now that we know how to inspect and set the properties of a given +object we want to configure, we need to now how to get at that object. +As mentioned in the introduction, there are two kinds of objects: +primitives and containers. The primitives are usually the things you +want to configure (the font of a :class:`~matplotlib.text.Text` +instance, the width of a :class:`~matplotlib.lines.Line2D`) although +the containers also have some properties as well -- for example the +:class:`~matplotlib.axes.Axes` :class:`~matplotlib.artist.Artist` is a +container that contains many of the primitives in your plot, but it +also has properties like the ``xscale`` to control whether the xaxis +is 'linear' or 'log'. In this section we'll review where the various +container objects store the ``Artists`` that you want to get at. + +.. _figure-container: + +Figure container +================ + +The top level container ``Artist`` is the +:class:`matplotlib.figure.Figure`, and it contains everything in the +figure. The background of the figure is a +:class:`~matplotlib.patches.Rectangle` which is stored in +:attr:`Figure.patch `. As +you add subplots (:meth:`~matplotlib.figure.Figure.add_subplot`) and +axes (:meth:`~matplotlib.figure.Figure.add_axes`) to the figure +these will be appended to the :attr:`Figure.axes +`. These are also returned by the +methods that create them: + +.. sourcecode:: ipython + + In [156]: fig = plt.figure() + + In [157]: ax1 = fig.add_subplot(211) + + In [158]: ax2 = fig.add_axes([0.1, 0.1, 0.7, 0.3]) + + In [159]: ax1 + Out[159]: + + In [160]: print fig.axes + [, ] + +Because the figure maintains the concept of the "current axes" (see +:meth:`Figure.gca ` and +:meth:`Figure.sca `) to support the +pylab/pyplot state machine, you should not insert or remove axes +directly from the axes list, but rather use the +:meth:`~matplotlib.figure.Figure.add_subplot` and +:meth:`~matplotlib.figure.Figure.add_axes` methods to insert, and the +:meth:`~matplotlib.figure.Figure.delaxes` method to delete. You are +free however, to iterate over the list of axes or index into it to get +access to ``Axes`` instances you want to customize. Here is an +example which turns all the axes grids on:: + + for ax in fig.axes: + ax.grid(True) + + +The figure also has its own text, lines, patches and images, which you +can use to add primitives directly. The default coordinate system for +the ``Figure`` will simply be in pixels (which is not usually what you +want) but you can control this by setting the transform property of +the ``Artist`` you are adding to the figure. + +.. TODO: Is that still true? + +More useful is "figure coordinates" where (0, 0) is the bottom-left of +the figure and (1, 1) is the top-right of the figure which you can +obtain by setting the ``Artist`` transform to :attr:`fig.transFigure +`: + +.. sourcecode:: ipython + + In [191]: fig = plt.figure() + + In [192]: l1 = matplotlib.lines.Line2D([0, 1], [0, 1], + transform=fig.transFigure, figure=fig) + + In [193]: l2 = matplotlib.lines.Line2D([0, 1], [1, 0], + transform=fig.transFigure, figure=fig) + + In [194]: fig.lines.extend([l1, l2]) + + In [195]: fig.canvas.draw() + +.. plot:: pyplots/fig_x.py + + +Here is a summary of the Artists the figure contains + +.. TODO: Add xrefs to this table + +================ =============================================================== +Figure attribute Description +================ =============================================================== +axes A list of Axes instances (includes Subplot) +patch The Rectangle background +images A list of FigureImages patches - useful for raw pixel display +legends A list of Figure Legend instances (different from Axes.legends) +lines A list of Figure Line2D instances (rarely used, see Axes.lines) +patches A list of Figure patches (rarely used, see Axes.patches) +texts A list Figure Text instances +================ =============================================================== + +.. _axes-container: + +Axes container +============== + +The :class:`matplotlib.axes.Axes` is the center of the matplotlib +universe -- it contains the vast majority of all the ``Artists`` used +in a figure with many helper methods to create and add these +``Artists`` to itself, as well as helper methods to access and +customize the ``Artists`` it contains. Like the +:class:`~matplotlib.figure.Figure`, it contains a +:class:`~matplotlib.patches.Patch` +:attr:`~matplotlib.axes.Axes.patch` which is a +:class:`~matplotlib.patches.Rectangle` for Cartesian coordinates and a +:class:`~matplotlib.patches.Circle` for polar coordinates; this patch +determines the shape, background and border of the plotting region:: + + ax = fig.add_subplot(111) + rect = ax.patch # a Rectangle instance + rect.set_facecolor('green') + +When you call a plotting method, eg. the canonical +:meth:`~matplotlib.axes.Axes.plot` and pass in arrays or lists of +values, the method will create a :meth:`matplotlib.lines.Line2D` +instance, update the line with all the ``Line2D`` properties passed as +keyword arguments, add the line to the :attr:`Axes.lines +` container, and returns it to you: + +.. sourcecode:: ipython + + In [213]: x, y = np.random.rand(2, 100) + + In [214]: line, = ax.plot(x, y, '-', color='blue', linewidth=2) + +``plot`` returns a list of lines because you can pass in multiple x, y +pairs to plot, and we are unpacking the first element of the length +one list into the line variable. The line has been added to the +``Axes.lines`` list: + +.. sourcecode:: ipython + + In [229]: print ax.lines + [] + +Similarly, methods that create patches, like +:meth:`~matplotlib.axes.Axes.bar` creates a list of rectangles, will +add the patches to the :attr:`Axes.patches +` list: + +.. sourcecode:: ipython + + In [233]: n, bins, rectangles = ax.hist(np.random.randn(1000), 50, facecolor='yellow') + + In [234]: rectangles + Out[234]: + + In [235]: print len(ax.patches) + +You should not add objects directly to the ``Axes.lines`` or +``Axes.patches`` lists unless you know exactly what you are doing, +because the ``Axes`` needs to do a few things when it creates and adds +an object. It sets the figure and axes property of the ``Artist``, as +well as the default ``Axes`` transformation (unless a transformation +is set). It also inspects the data contained in the ``Artist`` to +update the data structures controlling auto-scaling, so that the view +limits can be adjusted to contain the plotted data. You can, +nonetheless, create objects yourself and add them directly to the +``Axes`` using helper methods like +:meth:`~matplotlib.axes.Axes.add_line` and +:meth:`~matplotlib.axes.Axes.add_patch`. Here is an annotated +interactive session illustrating what is going on: + +.. sourcecode:: ipython + + In [261]: fig = plt.figure() + + In [262]: ax = fig.add_subplot(111) + + # create a rectangle instance + In [263]: rect = matplotlib.patches.Rectangle( (1,1), width=5, height=12) + + # by default the axes instance is None + In [264]: print rect.get_axes() + None + + # and the transformation instance is set to the "identity transform" + In [265]: print rect.get_transform() + + + # now we add the Rectangle to the Axes + In [266]: ax.add_patch(rect) + + # and notice that the ax.add_patch method has set the axes + # instance + In [267]: print rect.get_axes() + Axes(0.125,0.1;0.775x0.8) + + # and the transformation has been set too + In [268]: print rect.get_transform() + + + # the default axes transformation is ax.transData + In [269]: print ax.transData + + + # notice that the xlimits of the Axes have not been changed + In [270]: print ax.get_xlim() + (0.0, 1.0) + + # but the data limits have been updated to encompass the rectangle + In [271]: print ax.dataLim.bounds + (1.0, 1.0, 5.0, 12.0) + + # we can manually invoke the auto-scaling machinery + In [272]: ax.autoscale_view() + + # and now the xlim are updated to encompass the rectangle + In [273]: print ax.get_xlim() + (1.0, 6.0) + + # we have to manually force a figure draw + In [274]: ax.figure.canvas.draw() + + +There are many, many ``Axes`` helper methods for creating primitive +``Artists`` and adding them to their respective containers. The table +below summarizes a small sampling of them, the kinds of ``Artist`` they +create, and where they store them + +============================== ==================== ======================= +Helper method Artist Container +============================== ==================== ======================= +ax.annotate - text annotations Annotate ax.texts +ax.bar - bar charts Rectangle ax.patches +ax.errorbar - error bar plots Line2D and Rectangle ax.lines and ax.patches +ax.fill - shared area Polygon ax.patches +ax.hist - histograms Rectangle ax.patches +ax.imshow - image data AxesImage ax.images +ax.legend - axes legends Legend ax.legends +ax.plot - xy plots Line2D ax.lines +ax.scatter - scatter charts PolygonCollection ax.collections +ax.text - text Text ax.texts +============================== ==================== ======================= + + +In addition to all of these ``Artists``, the ``Axes`` contains two +important ``Artist`` containers: the :class:`~matplotlib.axis.XAxis` +and :class:`~matplotlib.axis.YAxis`, which handle the drawing of the +ticks and labels. These are stored as instance variables +:attr:`~matplotlib.axes.Axes.xaxis` and +:attr:`~matplotlib.axes.Axes.yaxis`. The ``XAxis`` and ``YAxis`` +containers will be detailed below, but note that the ``Axes`` contains +many helper methods which forward calls on to the +:class:`~matplotlib.axis.Axis` instances so you often do not need to +work with them directly unless you want to. For example, you can set +the font size of the ``XAxis`` ticklabels using the ``Axes`` helper +method:: + + for label in ax.get_xticklabels(): + label.set_color('orange') + +Below is a summary of the Artists that the Axes contains + +============== ====================================== +Axes attribute Description +============== ====================================== +artists A list of Artist instances +patch Rectangle instance for Axes background +collections A list of Collection instances +images A list of AxesImage +legends A list of Legend instances +lines A list of Line2D instances +patches A list of Patch instances +texts A list of Text instances +xaxis matplotlib.axis.XAxis instance +yaxis matplotlib.axis.YAxis instance +============== ====================================== + +.. _axis-container: + +Axis containers +=============== + +The :class:`matplotlib.axis.Axis` instances handle the drawing of the +tick lines, the grid lines, the tick labels and the axis label. You +can configure the left and right ticks separately for the y-axis, and +the upper and lower ticks separately for the x-axis. The ``Axis`` +also stores the data and view intervals used in auto-scaling, panning +and zooming, as well as the :class:`~matplotlib.ticker.Locator` and +:class:`~matplotlib.ticker.Formatter` instances which control where +the ticks are placed and how they are represented as strings. + +Each ``Axis`` object contains a :attr:`~matplotlib.axis.Axis.label` attribute (this is what :mod:`~matplotlib.pylab` modifies in calls to :func:`~matplotlib.pylab.xlabel` and :func:`~matplotlib.pylab.ylabel`) as well as a list of major and minor ticks. The ticks are :class:`~matplotlib.axis.XTick` and :class:`~matplotlib.axis.YTick` instances, which contain the actual line and text primitives that render the ticks and ticklabels. Because the ticks are dynamically created as needed (eg. when panning and zooming), you should access the lists of major and minor ticks through their accessor methods :meth:`~matplotlib.axis.Axis.get_major_ticks` and :meth:`~matplotlib.axis.Axis.get_minor_ticks`. Although the ticks contain all the primitives and will be covered below, the ``Axis`` methods contain accessor methods to return the tick lines, tick labels, tick locations etc.: + +.. sourcecode:: ipython + + In [285]: axis = ax.xaxis + + In [286]: axis.get_ticklocs() + Out[286]: array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.]) + + In [287]: axis.get_ticklabels() + Out[287]: + + # note there are twice as many ticklines as labels because by + # default there are tick lines at the top and bottom but only tick + # labels below the xaxis; this can be customized + In [288]: axis.get_ticklines() + Out[288]: + + # by default you get the major ticks back + In [291]: axis.get_ticklines() + Out[291]: + + # but you can also ask for the minor ticks + In [292]: axis.get_ticklines(minor=True) + Out[292]: + +Here is a summary of some of the useful accessor methods of the ``Axis`` +(these have corresponding setters where useful, such as +set_major_formatter) + +====================== ========================================================= +Accessor method Description +====================== ========================================================= +get_scale The scale of the axis, eg 'log' or 'linear' +get_view_interval The interval instance of the axis view limits +get_data_interval The interval instance of the axis data limits +get_gridlines A list of grid lines for the Axis +get_label The axis label - a Text instance +get_ticklabels A list of Text instances - keyword minor=True|False +get_ticklines A list of Line2D instances - keyword minor=True|False +get_ticklocs A list of Tick locations - keyword minor=True|False +get_major_locator The matplotlib.ticker.Locator instance for major ticks +get_major_formatter The matplotlib.ticker.Formatter instance for major ticks +get_minor_locator The matplotlib.ticker.Locator instance for minor ticks +get_minor_formatter The matplotlib.ticker.Formatter instance for minor ticks +get_major_ticks A list of Tick instances for major ticks +get_minor_ticks A list of Tick instances for minor ticks +grid Turn the grid on or off for the major or minor ticks +====================== ========================================================= + +Here is an example, not recommended for its beauty, which customizes +the axes and tick properties + +.. plot:: pyplots/fig_axes_customize_simple.py + :include-source: + + +.. _tick-container: + +Tick containers +=============== + +The :class:`matplotlib.axis.Tick` is the final container object in our +descent from the :class:`~matplotlib.figure.Figure` to the +:class:`~matplotlib.axes.Axes` to the :class:`~matplotlib.axis.Axis` +to the :class:`~matplotlib.axis.Tick`. The ``Tick`` contains the tick +and grid line instances, as well as the label instances for the upper +and lower ticks. Each of these is accessible directly as an attribute +of the ``Tick``. In addition, there are boolean variables that determine +whether the upper labels and ticks are on for the x-axis and whether +the right labels and ticks are on for the y-axis. + +============== ========================================================== +Tick attribute Description +============== ========================================================== +tick1line Line2D instance +tick2line Line2D instance +gridline Line2D instance +label1 Text instance +label2 Text instance +gridOn boolean which determines whether to draw the tickline +tick1On boolean which determines whether to draw the 1st tickline +tick2On boolean which determines whether to draw the 2nd tickline +label1On boolean which determines whether to draw tick label +label2On boolean which determines whether to draw tick label +============== ========================================================== + +Here is an example which sets the formatter for the right side ticks with +dollar signs and colors them green on the right side of the yaxis + +.. plot:: pyplots/dollar_ticks.py + :include-source: diff -Nru matplotlib-0.99.3/doc/users/credits.rst matplotlib-1.0.1/doc/users/credits.rst --- matplotlib-0.99.3/doc/users/credits.rst 2009-09-21 18:56:13.000000000 +0000 +++ matplotlib-1.0.1/doc/users/credits.rst 2010-07-07 01:41:46.000000000 +0000 @@ -155,7 +155,8 @@ Charlie Moad contributed work to matplotlib's Cocoa support and has done a lot of work on the OSX and win32 binary releases. -Jouni K. Seppaenen wrote the PDF backend and contributed numerous +Jouni K. Seppänen + wrote the PDF backend and contributed numerous fixes to the code, to tex support and to the get_sample_data handler Paul Kienzle @@ -179,4 +180,4 @@ Jae-Joon Lee implemented fancy arrows and boxes, rewrote the legend support to handle multiple columns and fancy text boxes, wrote the axes grid toolkit, and has made numerous contributions to the code - and documentation \ No newline at end of file + and documentation diff -Nru matplotlib-0.99.3/doc/users/event_handling.rst matplotlib-1.0.1/doc/users/event_handling.rst --- matplotlib-0.99.3/doc/users/event_handling.rst 2009-08-23 18:42:15.000000000 +0000 +++ matplotlib-1.0.1/doc/users/event_handling.rst 2010-10-12 16:14:42.000000000 +0000 @@ -46,6 +46,13 @@ fig.canvas.mpl_disconnect(cid) +.. note:: + The canvas retains only weak references to the callbacks. Therefore + if a callback is a method of a class instance, you need to retain + a reference to that instance. Otherwise the instance will be + garbage-collected and the callback will vanish. + + Here are the events that you can connect to, the class instances that are sent back to you when the event occurs, and the event descriptions @@ -111,6 +118,8 @@ Let's look a simple example of a canvas, where a simple line segment is created every time a mouse is pressed:: + from matplotlib import pyplot as plt + class LineBuilder: def __init__(self, line): self.line = line @@ -132,6 +141,7 @@ line, = ax.plot([0], [0]) # empty line linebuilder = LineBuilder(line) + plt.show() The :class:`~matplotlib.backend_bases.MouseEvent` that we just used is a diff -Nru matplotlib-0.99.3/doc/users/gridspec.rst matplotlib-1.0.1/doc/users/gridspec.rst --- matplotlib-0.99.3/doc/users/gridspec.rst 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/users/gridspec.rst 2010-11-09 13:48:44.000000000 +0000 @@ -0,0 +1,151 @@ +\.. _gridspec-guide: + + +************************************************ + Customizing Location of Subplot Using GridSpec +************************************************ + + ``GridSpec`` + specifies the geometry of the grid that a subplot will be + placed. The number of rows and number of columns of the grid + need to be set. Optionally, the subplot layout parameters + (e.g., left, right, etc.) can be tuned. + + ``SubplotSpec`` + specifies the location of the subplot in the given *GridSpec*. + + ``subplot2grid`` + a helper function that is similar to "pyplot.subplot" but uses + 0-based indexing and let subplot to occupy multiple cells. + + + Basic Example of using subplot2grid +==================================== + +To use subplot2grid, you provide geometry of the grid and the location +of the subplot in the grid. For a simple single-cell subplot:: + + ax = plt.subplot2grid((2,2),(0, 0)) + +is identical to :: + + ax = plt.subplot(2,2,1) + +Note that, unlike matplotlib's subplot, the index starts from 0 in gridspec. + +To create a subplot that spans multiple cells, :: + + ax2 = plt.subplot2grid((3,3), (1, 0), colspan=2) + ax3 = plt.subplot2grid((3,3), (1, 2), rowspan=2) + +For example, the following commands :: + + ax1 = plt.subplot2grid((3,3), (0,0), colspan=3) + ax2 = plt.subplot2grid((3,3), (1,0), colspan=2) + ax3 = plt.subplot2grid((3,3), (1, 2), rowspan=2) + ax4 = plt.subplot2grid((3,3), (2, 0)) + ax5 = plt.subplot2grid((3,3), (2, 1)) + +creates + +.. plot:: users/plotting/examples/demo_gridspec01.py + + +GridSpec and SubplotSpec +======================== + +You can create GridSpec explicitly and use them to create a Subplot. + +For example, :: + + ax = plt.subplot2grid((2,2),(0, 0)) + +is equal to :: + + import matplotlib.gridspec as gridspec + gs = gridspec.GridSpec(2, 2) + ax = plt.subplot(gs[0, 0]) + +A gridspec instance provides array-like (2d or 1d) indexing that +returns the SubplotSpec instance. For, SubplotSpec that spans multiple +cells, use slice. :: + + ax2 = plt.subplot(gs[1,:-1]) + ax3 = plt.subplot(gs[1:, -1]) + +The above example becomes :: + + gs = gridspec.GridSpec(3, 3) + ax1 = plt.subplot(gs[0, :]) + ax2 = plt.subplot(gs[1,:-1]) + ax3 = plt.subplot(gs[1:, -1]) + ax4 = plt.subplot(gs[-1,0]) + ax5 = plt.subplot(gs[-1,-2]) + +.. plot:: users/plotting/examples/demo_gridspec02.py + +Adjust GridSpec layout +====================== + +When a GridSpec is explicitly used, you can adjust the layout +parameters of subplots that are created from the gridspec. :: + + gs1 = gridspec.GridSpec(3, 3) + gs1.update(left=0.05, right=0.48, wspace=0.05) + +This is similar to *subplots_adjust*, but it only affects the subplots +that are created from the given GridSpec. + +The code below :: + + gs1 = gridspec.GridSpec(3, 3) + gs1.update(left=0.05, right=0.48, wspace=0.05) + ax1 = plt.subplot(gs1[:-1, :]) + ax2 = plt.subplot(gs1[-1, :-1]) + ax3 = plt.subplot(gs1[-1, -1]) + + gs2 = gridspec.GridSpec(3, 3) + gs2.update(left=0.55, right=0.98, hspace=0.05) + ax4 = plt.subplot(gs2[:, :-1]) + ax5 = plt.subplot(gs2[:-1, -1]) + ax6 = plt.subplot(gs2[-1, -1]) + +creates + +.. plot:: users/plotting/examples/demo_gridspec03.py + +GridSpec using SubplotSpec +========================== + +You can create GridSpec from the SubplotSpec, in which case its layout +parameters are set to that of the location of the given SubplotSpec. :: + + gs0 = gridspec.GridSpec(1, 2) + + gs00 = gridspec.GridSpecFromSubplotSpec(3, 3, subplot_spec=gs0[0]) + gs01 = gridspec.GridSpecFromSubplotSpec(3, 3, subplot_spec=gs0[1]) + + +.. plot:: users/plotting/examples/demo_gridspec04.py + + +GridSpec with Varying Cell Sizes +================================ + +By default, GridSpec creates cells of equal sizes. You can adjust +relative heights and widths of rows and columns. Note that absolute +values are meaningless, only their relative ratios matter. :: + + gs = gridspec.GridSpec(2, 2, + width_ratios=[1,2], + height_ratios=[4,1] + ) + + ax1 = plt.subplot(gs[0]) + ax2 = plt.subplot(gs[1]) + ax3 = plt.subplot(gs[2]) + ax4 = plt.subplot(gs[3]) + + +.. plot:: users/plotting/examples/demo_gridspec05.py + diff -Nru matplotlib-0.99.3/doc/users/image_tutorial.rst matplotlib-1.0.1/doc/users/image_tutorial.rst --- matplotlib-0.99.3/doc/users/image_tutorial.rst 2010-03-09 14:20:19.000000000 +0000 +++ matplotlib-1.0.1/doc/users/image_tutorial.rst 2010-11-09 13:48:44.000000000 +0000 @@ -40,8 +40,7 @@ Importing image data into Numpy arrays =============================================== -Plotting image data is supported by the Python Image Library (`PIL -`_), . Natively, matplotlib +Plotting image data is supported by the Python Image Library (`PIL `_), . Natively, matplotlib only supports PNG images. The commands shown below fall back on PIL if the native read fails. @@ -122,8 +121,7 @@ data. Why 8 bits? Most displays can only render 8 bits per channel worth of color gradation. Why can they only render 8 bits/channel? Because that's about all the human eye can see. More here (from a -photography standpoint): `Luminous Landscape bit depth tutorial -`_. +photography standpoint): `Luminous Landscape bit depth tutorial `_. Each inner list represents a pixel. Here, with an RGB image, there are 3 values. Since it's a black and white image, R, G, and B are all @@ -179,8 +177,7 @@ In [6]: lum_img = img[:,:,0] -This is array slicing. You can read more in the `Numpy tutorial -`_. +This is array slicing. You can read more in the `Numpy tutorial `_. .. sourcecode:: ipython @@ -229,9 +226,7 @@ imgplot = plt.imshow(lum_img) imgplot.set_cmap('spectral') -There are many other colormap schemes available. See the `list and -images of the colormaps -`_. +There are many other colormap schemes available. See the `list and images of the colormaps `_. .. _Color Bars diff -Nru matplotlib-0.99.3/doc/users/index.rst matplotlib-1.0.1/doc/users/index.rst --- matplotlib-0.99.3/doc/users/index.rst 2009-09-21 18:56:13.000000000 +0000 +++ matplotlib-1.0.1/doc/users/index.rst 2010-11-04 18:28:09.000000000 +0000 @@ -21,11 +21,13 @@ index_text.rst image_tutorial.rst artists.rst + gridspec.rst legend_guide.rst event_handling.rst transforms_tutorial.rst path_tutorial.rst annotations_guide.rst + recipes.rst toolkits.rst screenshots.rst whats_new.rst diff -Nru matplotlib-0.99.3/doc/users/installing.rst matplotlib-1.0.1/doc/users/installing.rst --- matplotlib-0.99.3/doc/users/installing.rst 2010-03-09 14:20:19.000000000 +0000 +++ matplotlib-1.0.1/doc/users/installing.rst 2010-07-07 01:41:46.000000000 +0000 @@ -64,7 +64,7 @@ Once you have ipython, numpy and matplotlib installed, in ipython's -"pylab" mode you have a matlab-like environment that automatically +"pylab" mode you have a MATLAB-like environment that automatically handles most of the configuration details for you, so you can get up and running quickly:: @@ -79,6 +79,9 @@ In [2]: hist(x, 100) +Instructions for installing our OSX binaries are found in the FAQ +ref:`install_osx_binaries`. + Note that when testing matplotlib installations from the interactive python console, there are some issues relating to user interface toolkits and interactive settings that are discussed in @@ -123,7 +126,10 @@ installing matplotlib. Windows users only need the first two (python and numpy) since the others are built into the matplotlib windows installers available for download at the sourceforge site. If you are -building on OSX, see :ref:`build_osx` +building on OSX, see :ref:`build_osx`. If you are installing +dependencies with a package manager, you may need to install the +development packages (look for a "-dev" postfix) in addition to the +libraries themselves. :term:`python` 2.4 (or later but not python3) matplotlib requires python 2.4 or later (`download `__) @@ -159,14 +165,17 @@ :term:`pyqt` 4.0 or later The Qt4 widgets library python wrappers for the Qt4Agg backend -:term:`pygtk` 2.2 or later - The python wrappers for the GTK widgets library for use with the GTK or GTKAgg backend +:term:`pygtk` 2.4 or later + The python wrappers for the GTK widgets library for use with the + GTK or GTKAgg backend :term:`wxpython` 2.6 or later - The python wrappers for the wx widgets library for use with the WXAgg backend + The python wrappers for the wx widgets library for use with the + WXAgg backend :term:`wxpython` 2.8 or later - The python wrappers for the wx widgets library for use with the WX backend + The python wrappers for the wx widgets library for use with the + WX backend :term:`pyfltk` 1.0 or later The python wrappers of the FLTK widgets library for use with FLTKAgg diff -Nru matplotlib-0.99.3/doc/users/intro.rst matplotlib-1.0.1/doc/users/intro.rst --- matplotlib-0.99.3/doc/users/intro.rst 2009-07-31 15:14:26.000000000 +0000 +++ matplotlib-1.0.1/doc/users/intro.rst 2010-07-07 01:41:46.000000000 +0000 @@ -3,12 +3,15 @@ matplotlib is a library for making 2D plots of arrays in `Python `_. Although it has its origins in emulating -the `MATLABâ„¢ `_ graphics commands, it is +the MATLAB |reg| [*]_ graphics commands, it is independent of MATLAB, and can be used in a Pythonic, object oriented way. Although matplotlib is written primarily in pure Python, it makes heavy use of `NumPy `_ and other extension code to provide good performance even for large arrays. +.. |reg| unicode:: 0xAE + :ltrim: + matplotlib is designed with the philosophy that you should be able to create simple plots with just a few commands, or just one! If you want to see a histogram of your data, you shouldn't need to @@ -87,3 +90,6 @@ embed matplotlib in a Gtk+ EEG application that runs on Windows, Linux and Macintosh OS X. +.. [*] MATLAB is a registered trademark of The MathWorks, Inc. + + diff -Nru matplotlib-0.99.3/doc/users/legend_guide.rst matplotlib-1.0.1/doc/users/legend_guide.rst --- matplotlib-0.99.3/doc/users/legend_guide.rst 2009-08-22 21:06:12.000000000 +0000 +++ matplotlib-1.0.1/doc/users/legend_guide.rst 2010-07-07 01:41:46.000000000 +0000 @@ -12,14 +12,14 @@ ==================== The legend command has a following call signature:: - + legend(*args, **kwargs) - + If len(args) is 2, the first argument should be a list of artist to be labeled, and the second argument should a list of string labels. If len(args) is 0, it automatically generate the legend from label properties of the child artists by calling -:meth:`~matplotlib.axes.Axes.get_legend_handles_labels` method. +:meth:`~matplotlib.axes.Axes.get_legend_handles_labels` method. For example, *ax.legend()* is equivalent to:: handles, labels = ax.get_legend_handles_labels() @@ -44,7 +44,7 @@ * :class:`~matplotlib.patches.Patch` * :class:`~matplotlib.collections.LineCollection` * :class:`~matplotlib.collections.RegularPolyCollection` - + Unfortunately, there is no easy workaround when you need legend for an artist not in the above list (You may use one of the supported artist as a proxy. See below), or customize it beyond what is @@ -84,28 +84,28 @@ p1, = ax.plot([1,2,3], label="line 1") p2, = ax.plot([3,2,1], label="line 2") p3, = ax.plot([2,3,1], label="line 3") - + handles, labels = ax.get_legend_handles_labels() # reverse the order ax.legend(handles[::-1], labels[::-1]) - + # or sort them by labels import operator hl = sorted(zip(handles, labels), key=operator.itemgetter(1)) handles2, labels2 = zip(*hl) - + ax.legend(handles2, labels2) Using Proxy Artist ------------------ -When you want to display legend for an artist not supported by the -matplotlib, you may use other supported artist as a proxy. For -example, you may creates an proxy artist without adding it to the axes -(so the proxy artist will not be drawn in the main axes) and feet it +When you want to display legend for an artist not supported by +matplotlib, you may use another artist as a proxy. For +example, you may create a proxy artist without adding it to the axes +(so the proxy artist will not be drawn in the main axes) and feed it to the legend function.:: p = Rectangle((0, 0), 1, 1, fc="r") diff -Nru matplotlib-0.99.3/doc/users/mathtext.rst matplotlib-1.0.1/doc/users/mathtext.rst --- matplotlib-0.99.3/doc/users/mathtext.rst 2009-07-31 15:14:26.000000000 +0000 +++ matplotlib-1.0.1/doc/users/mathtext.rst 2010-07-07 01:41:46.000000000 +0000 @@ -23,6 +23,13 @@ customization variable ``mathtext.fontset`` (see :ref:`customizing-matplotlib`) +.. note:: + On `"narrow" `_ builds + of Python, if you use the STIX fonts you should also set + ``ps.fonttype`` and ``pdf.fonttype`` to 3 (the default), not 42. + Otherwise `some characters will not be visible + `_. + Here is a simple example:: # plain text @@ -78,18 +85,20 @@ \sum_{i=0}^\infty x_i -Fractions ---------- +Fractions, binomials and stacked numbers +---------------------------------------- -Fractions can be created with the ``\frac{}{}`` command:: +Fractions, binomials and stacked numbers can be created with the +``\frac{}{}``, ``\binom{}{}`` and ``\stackrel{}{}`` commands, +respectively:: - r'$\frac{3}{4}$' + r'$\frac{3}{4} \binom{3}{4} \stackrel{3}{4}$' produces .. math:: - \frac{3}{4} + \frac{3}{4} \binom{3}{4} \stackrel{3}{4} Fractions can be arbitrarily nested:: diff -Nru matplotlib-0.99.3/doc/users/navigation_toolbar.rst matplotlib-1.0.1/doc/users/navigation_toolbar.rst --- matplotlib-0.99.3/doc/users/navigation_toolbar.rst 2009-08-22 21:06:12.000000000 +0000 +++ matplotlib-1.0.1/doc/users/navigation_toolbar.rst 2010-07-07 01:41:46.000000000 +0000 @@ -39,11 +39,11 @@ the right mouse button to zoom, dragging it to a new position. The x axis will be zoomed in proportionate to the rightward movement and zoomed out proportionate to the leftward movement. - Ditto for the yaxis and up/down motions. The point under your + Ditto for the y axis and up/down motions. The point under your mouse when you begin the zoom remains stationary, allowing you to zoom to an arbitrary point in the figure. You can use the modifier keys 'x', 'y' or 'CONTROL' to constrain the zoom to the x - axes, the y axes, or aspect ratio preserve, respectively. + axis, the y axis, or aspect ratio preserve, respectively. With polar plots, the pan and zoom functionality behaves differently. The radius axis labels can be dragged using the left @@ -79,6 +79,8 @@ Navigation Keyboard Shortcuts ----------------------------- +The following table holds all the default keys, which can be overwritten by use of your matplotlibrc (#keymap.\*). + ================================== ============================================== Command Keyboard Shortcut(s) ================================== ============================================== @@ -93,6 +95,7 @@ Constrain pan/zoom to y axis hold **y** Preserve aspect ratio hold **CONTROL** Toggle grid **g** +Toggle x axis scale (log/linear) **L** or **k** Toggle y axis scale (log/linear) **l** ================================== ============================================== diff -Nru matplotlib-0.99.3/doc/users/plotting/examples/annotate_simple_coord01.py matplotlib-1.0.1/doc/users/plotting/examples/annotate_simple_coord01.py --- matplotlib-0.99.3/doc/users/plotting/examples/annotate_simple_coord01.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/users/plotting/examples/annotate_simple_coord01.py 2010-07-07 01:41:46.000000000 +0000 @@ -0,0 +1,15 @@ + +import matplotlib.pyplot as plt + +plt.figure(figsize=(3,2)) +ax=plt.subplot(111) +an1 = ax.annotate("Test 1", xy=(0.5, 0.5), xycoords="data", + va="center", ha="center", + bbox=dict(boxstyle="round", fc="w")) +an2 = ax.annotate("Test 2", xy=(1, 0.5), xycoords=an1, + xytext=(30,0), textcoords="offset points", + va="center", ha="left", + bbox=dict(boxstyle="round", fc="w"), + arrowprops=dict(arrowstyle="->")) +plt.show() + diff -Nru matplotlib-0.99.3/doc/users/plotting/examples/annotate_simple_coord02.py matplotlib-1.0.1/doc/users/plotting/examples/annotate_simple_coord02.py --- matplotlib-0.99.3/doc/users/plotting/examples/annotate_simple_coord02.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/users/plotting/examples/annotate_simple_coord02.py 2010-07-07 01:41:46.000000000 +0000 @@ -0,0 +1,16 @@ + +import matplotlib.pyplot as plt + +plt.figure(figsize=(3,2)) +ax=plt.axes([0.1, 0.1, 0.8, 0.7]) +an1 = ax.annotate("Test 1", xy=(0.5, 0.5), xycoords="data", + va="center", ha="center", + bbox=dict(boxstyle="round", fc="w")) + +an2 = ax.annotate("Test 2", xy=(0.5, 1.), xycoords=an1, + xytext=(0.5,1.1), textcoords=(an1, "axes fraction"), + va="bottom", ha="center", + bbox=dict(boxstyle="round", fc="w"), + arrowprops=dict(arrowstyle="->")) +plt.show() + diff -Nru matplotlib-0.99.3/doc/users/plotting/examples/annotate_simple_coord03.py matplotlib-1.0.1/doc/users/plotting/examples/annotate_simple_coord03.py --- matplotlib-0.99.3/doc/users/plotting/examples/annotate_simple_coord03.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/users/plotting/examples/annotate_simple_coord03.py 2010-07-07 01:41:46.000000000 +0000 @@ -0,0 +1,19 @@ + +import matplotlib.pyplot as plt + +plt.figure(figsize=(3,2)) +ax=plt.axes([0.1, 0.1, 0.8, 0.7]) +an1 = ax.annotate("Test 1", xy=(0.5, 0.5), xycoords="data", + va="center", ha="center", + bbox=dict(boxstyle="round", fc="w")) + +from matplotlib.text import OffsetFrom +offset_from = OffsetFrom(an1, (0.5, 0)) +an2 = ax.annotate("Test 2", xy=(0.1, 0.1), xycoords="data", + xytext=(0, -10), textcoords=offset_from, + # xytext is offset points from "xy=(0.5, 0), xycoords=an1" + va="top", ha="center", + bbox=dict(boxstyle="round", fc="w"), + arrowprops=dict(arrowstyle="->")) +plt.show() + diff -Nru matplotlib-0.99.3/doc/users/plotting/examples/demo_gridspec01.py matplotlib-1.0.1/doc/users/plotting/examples/demo_gridspec01.py --- matplotlib-0.99.3/doc/users/plotting/examples/demo_gridspec01.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/users/plotting/examples/demo_gridspec01.py 2010-07-07 01:41:46.000000000 +0000 @@ -0,0 +1,20 @@ +import matplotlib.pyplot as plt + +def make_ticklabels_invisible(fig): + for i, ax in enumerate(fig.axes): + ax.text(0.5, 0.5, "ax%d" % (i+1), va="center", ha="center") + for tl in ax.get_xticklabels() + ax.get_yticklabels(): + tl.set_visible(False) + + +plt.figure(0) +ax1 = plt.subplot2grid((3,3), (0,0), colspan=3) +ax2 = plt.subplot2grid((3,3), (1,0), colspan=2) +ax3 = plt.subplot2grid((3,3), (1, 2), rowspan=2) +ax4 = plt.subplot2grid((3,3), (2, 0)) +ax5 = plt.subplot2grid((3,3), (2, 1)) + +plt.suptitle("subplot2grid") +make_ticklabels_invisible(plt.gcf()) +plt.show() + diff -Nru matplotlib-0.99.3/doc/users/plotting/examples/demo_gridspec02.py matplotlib-1.0.1/doc/users/plotting/examples/demo_gridspec02.py --- matplotlib-0.99.3/doc/users/plotting/examples/demo_gridspec02.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/users/plotting/examples/demo_gridspec02.py 2010-07-07 01:41:46.000000000 +0000 @@ -0,0 +1,26 @@ +import matplotlib.pyplot as plt +from matplotlib.gridspec import GridSpec + + +def make_ticklabels_invisible(fig): + for i, ax in enumerate(fig.axes): + ax.text(0.5, 0.5, "ax%d" % (i+1), va="center", ha="center") + for tl in ax.get_xticklabels() + ax.get_yticklabels(): + tl.set_visible(False) + + +plt.figure() + +gs = GridSpec(3, 3) +ax1 = plt.subplot(gs[0, :]) +# identical to ax1 = plt.subplot(gs.new_subplotspec((0,0), colspan=3)) +ax2 = plt.subplot(gs[1,:-1]) +ax3 = plt.subplot(gs[1:, -1]) +ax4 = plt.subplot(gs[-1,0]) +ax5 = plt.subplot(gs[-1,-2]) + +plt.suptitle("GridSpec") +make_ticklabels_invisible(plt.gcf()) + +plt.show() + diff -Nru matplotlib-0.99.3/doc/users/plotting/examples/demo_gridspec03.py matplotlib-1.0.1/doc/users/plotting/examples/demo_gridspec03.py --- matplotlib-0.99.3/doc/users/plotting/examples/demo_gridspec03.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/users/plotting/examples/demo_gridspec03.py 2010-07-07 01:41:46.000000000 +0000 @@ -0,0 +1,34 @@ +import matplotlib.pyplot as plt +from matplotlib.gridspec import GridSpec + + +def make_ticklabels_invisible(fig): + for i, ax in enumerate(fig.axes): + ax.text(0.5, 0.5, "ax%d" % (i+1), va="center", ha="center") + for tl in ax.get_xticklabels() + ax.get_yticklabels(): + tl.set_visible(False) + + + +# demo 3 : gridspec with subplotpars set. + +f = plt.figure() + +plt.suptitle("GirdSpec w/ different subplotpars") + +gs1 = GridSpec(3, 3) +gs1.update(left=0.05, right=0.48, wspace=0.05) +ax1 = plt.subplot(gs1[:-1, :]) +ax2 = plt.subplot(gs1[-1, :-1]) +ax3 = plt.subplot(gs1[-1, -1]) + +gs2 = GridSpec(3, 3) +gs2.update(left=0.55, right=0.98, hspace=0.05) +ax4 = plt.subplot(gs2[:, :-1]) +ax5 = plt.subplot(gs2[:-1, -1]) +ax6 = plt.subplot(gs2[-1, -1]) + +make_ticklabels_invisible(plt.gcf()) + +plt.show() + diff -Nru matplotlib-0.99.3/doc/users/plotting/examples/demo_gridspec04.py matplotlib-1.0.1/doc/users/plotting/examples/demo_gridspec04.py --- matplotlib-0.99.3/doc/users/plotting/examples/demo_gridspec04.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/users/plotting/examples/demo_gridspec04.py 2010-07-07 01:41:46.000000000 +0000 @@ -0,0 +1,41 @@ +import matplotlib.pyplot as plt +import matplotlib.gridspec as gridspec + +def make_ticklabels_invisible(fig): + for i, ax in enumerate(fig.axes): + ax.text(0.5, 0.5, "ax%d" % (i+1), va="center", ha="center") + for tl in ax.get_xticklabels() + ax.get_yticklabels(): + tl.set_visible(False) + + + +# gridspec inside gridspec + +f = plt.figure() + +gs0 = gridspec.GridSpec(1, 2) + +gs00 = gridspec.GridSpecFromSubplotSpec(3, 3, subplot_spec=gs0[0]) + +ax1 = plt.Subplot(f, gs00[:-1, :]) +f.add_subplot(ax1) +ax2 = plt.Subplot(f, gs00[-1, :-1]) +f.add_subplot(ax2) +ax3 = plt.Subplot(f, gs00[-1, -1]) +f.add_subplot(ax3) + + +gs01 = gridspec.GridSpecFromSubplotSpec(3, 3, subplot_spec=gs0[1]) + +ax4 = plt.Subplot(f, gs01[:, :-1]) +f.add_subplot(ax4) +ax5 = plt.Subplot(f, gs01[:-1, -1]) +f.add_subplot(ax5) +ax6 = plt.Subplot(f, gs01[-1, -1]) +f.add_subplot(ax6) + +plt.suptitle("GirdSpec Inside GridSpec") +make_ticklabels_invisible(plt.gcf()) + +plt.show() + diff -Nru matplotlib-0.99.3/doc/users/plotting/examples/demo_gridspec05.py matplotlib-1.0.1/doc/users/plotting/examples/demo_gridspec05.py --- matplotlib-0.99.3/doc/users/plotting/examples/demo_gridspec05.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/users/plotting/examples/demo_gridspec05.py 2010-07-07 01:41:46.000000000 +0000 @@ -0,0 +1,26 @@ +import matplotlib.pyplot as plt +import matplotlib.gridspec as gridspec + +def make_ticklabels_invisible(fig): + for i, ax in enumerate(fig.axes): + ax.text(0.5, 0.5, "ax%d" % (i+1), va="center", ha="center") + for tl in ax.get_xticklabels() + ax.get_yticklabels(): + tl.set_visible(False) + + + +f = plt.figure() + +gs = gridspec.GridSpec(2, 2, + width_ratios=[1,2], + height_ratios=[4,1] + ) + +ax1 = plt.subplot(gs[0]) +ax2 = plt.subplot(gs[1]) +ax3 = plt.subplot(gs[2]) +ax4 = plt.subplot(gs[3]) + +make_ticklabels_invisible(f) +plt.show() + diff -Nru matplotlib-0.99.3/doc/users/pyplot_tutorial.rst matplotlib-1.0.1/doc/users/pyplot_tutorial.rst --- matplotlib-0.99.3/doc/users/pyplot_tutorial.rst 2009-09-21 18:56:13.000000000 +0000 +++ matplotlib-1.0.1/doc/users/pyplot_tutorial.rst 2010-07-07 01:41:46.000000000 +0000 @@ -5,7 +5,8 @@ *************** :mod:`matplotlib.pyplot` is a collection of command style functions -that make matplotlib work like matlab. Each ``pyplot`` function makes +that make matplotlib work like MATLAB. +Each ``pyplot`` function makes some change to a figure: eg, create a figure, create a plotting area in a figure, plot some lines in a plotting area, decorate the plot with labels, etc.... :mod:`matplotlib.pyplot` is stateful, in that it @@ -29,10 +30,10 @@ plt.plot([1,2,3,4], [1,4,9,16]) -For every x, y pair of arguments, there is a optional third argument +For every x, y pair of arguments, there is an optional third argument which is the format string that indicates the color and line type of the plot. The letters and symbols of the format string are from -matlab, and you concatenate a color string with a line style string. +MATLAB, and you concatenate a color string with a line style string. The default format string is 'b-', which is a solid blue line. For example, to plot the above with red circles, you would issue @@ -74,19 +75,19 @@ one line so it is a list of length 1. I use tuple unpacking in the ``line, = plot(x, y, 'o')`` to get the first element of the list:: - line, = plt.plot(x, y, '-') + line, = plt.plot(x, y, '-') line.set_antialiased(False) # turn off antialising * Use the :func:`~matplotlib.pyplot.setp` command. The example below - uses a Matlab-style command to set multiple properties + uses a MATLAB-style command to set multiple properties on a list of lines. ``setp`` works transparently with a list of objects or a single object. You can either use python keyword arguments or - Matlab-style string/value pairs:: + MATLAB-style string/value pairs:: lines = plt.plot(x1, y1, x2, y2) # use keyword args plt.setp(lines, color='r', linewidth=2.0) - # or matlab style string value pairs + # or MATLAB style string value pairs plt.setp(lines, 'color', 'r', 'linewidth', 2.0) @@ -149,7 +150,7 @@ ====================================== -Matlab, and :mod:`~matplotlib.pyplot`, have the concept of the current +MATLAB, and :mod:`~matplotlib.pyplot`, have the concept of the current figure and the current axes. All plotting commands apply to the current axes. The function :func:`~matplotlib.pyplot.gca` returns the current axes (a :class:`matplotlib.axes.Axes` instance), and @@ -204,6 +205,15 @@ stateful wrapper around an object oriented API, which you can use instead (see :ref:`artist-tutorial`) +If you are making a long sequence of figures, you need to be aware of one +more thing: the memory required for a figure is not completely +released until the figure is explicitly closed with +:func:`~matplotlib.pyplot.close`. Deleting all references to the +figure, and/or using the window manager to kill the window in which +the figure appears on the screen, is not enough, because pyplot +maintains internal references until :func:`~matplotlib.pyplot.close` +is called. + .. _working-with-text: Working with text @@ -270,3 +280,4 @@ :ref:`annotations-tutorial` and :ref:`plotting-guide-annotation` for details. More examples can be found in :ref:`pylab_examples-annotation_demo`. + diff -Nru matplotlib-0.99.3/doc/users/recipes.rst matplotlib-1.0.1/doc/users/recipes.rst --- matplotlib-0.99.3/doc/users/recipes.rst 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/doc/users/recipes.rst 2010-11-09 15:21:37.000000000 +0000 @@ -0,0 +1,367 @@ +.. _recipes: + +******************** +Our Favorite Recipes +******************** + +Here is a collection of short tutorials, examples and code snippets +that illustrate some of the useful idioms and tricks to make snazzier +figures and overcome some matplotlib warts. + + +Sharing axis limits and views +============================= + +It's common to make two or more plots which share an axis, eg two +subplots with time as a common axis. When you pan and zoom around on +one, you want the other to move around with you. To facilitate this, +matplotlib Axes support a ``sharex`` and ``sharey`` attribute. When +you create a :func:`~matplotlib.pyplot.subplot` or +:func:`~matplotlib.pyplot.axes` instance, you can pass in a keyword +indicating what axes you want to share with + +.. sourcecode:: ipython + + In [96]: t = np.arange(0, 10, 0.01) + + In [97]: ax1 = plt.subplot(211) + + In [98]: ax1.plot(t, np.sin(2*np.pi*t)) + Out[98]: [] + + In [99]: ax2 = plt.subplot(212, sharex=ax1) + + In [100]: ax2.plot(t, np.sin(4*np.pi*t)) + Out[100]: [] + +Easily creating subplots +======================== + +In early versions of matplotlib, if you wanted to use the pythonic API +and create a figure instance and from that create a grid of subplots, +possibly with shared axes, it involved a fair amount of boilerplate +code. Eg + +.. sourcecode:: python + + # old style + fig = plt.figure() + ax1 = fig.add_subplot(221) + ax2 = fig.add_subplot(222, sharex=ax1, sharey=ax1) + ax3 = fig.add_subplot(223, sharex=ax1, sharey=ax1) + ax3 = fig.add_subplot(224, sharex=ax1, sharey=ax1) + +Fernando Perez has provided a nice top level method to create in +:func:`~matplotlib.pyplots.subplots` (note the "s" at the end) +everything at once, and turn off x and y sharing for the whole bunch. +You can either unpack the axes individually:: + + # new style method 1; unpack the axes + fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2, sharex=True, sharey=True) + ax1.plot(x) + +or get them back as a numrows x numcolumns object array which supports +numpy indexing:: + + # new style method 2; use an axes array + fig, axs = plt.subplots(2, 2, sharex=True, sharey=True) + axs[0,0].plot(x) + + + +Fixing common date annoyances +============================= + + +.. plot:: + :nofigs: + :context: + + # clear the state for context use below + plt.close('all') + +matplotlib allows you to natively plots python datetime instances, and +for the most part does a good job picking tick locations and string +formats. There are a couple of things it does not handle so +gracefully, and here are some tricks to help you work around them. +We'll load up some sample date data which contains datetime.date +objects in a numpy record array:: + + In [63]: datafile = cbook.get_sample_data('goog.npy') + + In [64]: r = np.load(datafile).view(np.recarray) + + In [65]: r.dtype + Out[65]: dtype([('date', '|O4'), ('', '|V4'), ('open', '] + +you will see that the x tick labels are all squashed together. + +.. plot:: + :context: + + import matplotlib.cbook as cbook + datafile = cbook.get_sample_data('goog.npy') + r = np.load(datafile).view(np.recarray) + plt.figure() + plt.plot(r.date, r.close) + plt.title('Default date handling can cause overlapping labels') + +Another annoyance is that if you hover the mouse over a the window and +look in the lower right corner of the matplotlib toolbar +(:ref:`navigation-toolbar`) at the x and y coordinates, you see that +the x locations are formatted the same way the tick labels are, eg +"Dec 2004". What we'd like is for the location in the toolbar to have +a higher degree of precision, eg giving us the exact date out mouse is +hovering over. To fix the first problem, we can use +method:`matplotlib.figure.Figure.autofmt_xdate` and to fix the second +problem we can use the ``ax.fmt_xdata`` attribute which can be set to +any function that takes a scalar and returns a string. matplotlib has +a number of date formatters built in, so we'll use one of those. + +.. plot:: + :include-source: + :context: + + plt.close('all') + fig, ax = plt.subplots(1) + ax.plot(r.date, r.close) + + # rotate and align the tick labels so they look better + fig.autofmt_xdate() + + # use a more precise date string for the x axis locations in the + # toolbar + import matplotlib.dates as mdates + ax.fmt_xdata = mdates.DateFormatter('%Y-%m-%d') + plt.title('fig.autofmt_xdate fixes the labels') + +Now when you hover your mouse over the plotted data, you'll see date +format strings like 2004-12-01 in the toolbar. + +Fill Between and Alpha +====================== + +The :meth:`~matplotlib.axes.Axes.fill_between` function generates a +shaded region between a min and max boundary that is useful for +illustrating ranges. It has a very handy ``where`` argument to +combine filling with logical ranges, eg to just fill in a curve over +some threshold value. + +At its most basic level, ``fill_between`` can be use to enhance a +graphs visual appearance. Let's compare two graphs of a financial +times with a simple line plot on the left and a filled line on the +right. + +.. plot:: + :include-source: + + import matplotlib.pyplot as plt + import numpy as np + + import matplotlib.cbook as cbook + + # load up some sample financial data + datafile = cbook.get_sample_data('goog.npy') + r = np.load(datafile).view(np.recarray) + + # create two subplots with the shared x and y axes + fig, (ax1, ax2) = plt.subplots(1,2, sharex=True, sharey=True) + + pricemin = r.close.min() + + ax1.plot(r.date, r.close, lw=2) + ax2.fill_between(r.date, pricemin, r.close, facecolor='blue', alpha=0.5) + + for ax in ax1, ax2: + ax.grid(True) + + ax1.set_ylabel('price') + for label in ax2.get_yticklabels(): + label.set_visible(False) + + fig.suptitle('Google (GOOG) daily closing price') + fig.autofmt_xdate() + +The alpha channel is not necessary here, but it can be used to soften +colors for more visually appealing plots. In other examples, as we'll +see below, the alpha channel is functionally useful as the shaded +regions can overlap and alpha allows you to see both. Note that the +postscript format does not support alpha (this is a postscript +limitation, not a matplotlib limitation), so when using alpha save +your figures in PNG, PDF or SVG. + +Our next example computes two populations of random walkers with a +different mean and standard deviation of the normal distributions from +which the steps are drawn. We use shared regions to plot +/- one +standard deviation of the mean position of the population. Here the +alpha channel is useful, not just aesthetic. + +.. plot:: + :include-source: + + import matplotlib.pyplot as plt + import numpy as np + + Nsteps, Nwalkers = 100, 250 + t = np.arange(Nsteps) + + # an (Nsteps x Nwalkers) array of random walk steps + S1 = 0.002 + 0.01*np.random.randn(Nsteps, Nwalkers) + S2 = 0.004 + 0.02*np.random.randn(Nsteps, Nwalkers) + + # an (Nsteps x Nwalkers) array of random walker positions + X1 = S1.cumsum(axis=0) + X2 = S2.cumsum(axis=0) + + + # Nsteps length arrays empirical means and standard deviations of both + # populations over time + mu1 = X1.mean(axis=1) + sigma1 = X1.std(axis=1) + mu2 = X2.mean(axis=1) + sigma2 = X2.std(axis=1) + + # plot it! + fig, ax = plt.subplots(1) + ax.plot(t, mu1, lw=2, label='mean population 1', color='blue') + ax.plot(t, mu1, lw=2, label='mean population 2', color='yellow') + ax.fill_between(t, mu1+sigma1, mu1-sigma1, facecolor='blue', alpha=0.5) + ax.fill_between(t, mu2+sigma2, mu2-sigma2, facecolor='yellow', alpha=0.5) + ax.set_title('random walkers empirical $\mu$ and $\pm \sigma$ interval') + ax.legend(loc='upper left') + ax.set_xlabel('num steps') + ax.set_ylabel('position') + ax.grid() + + +The ``where`` keyword argument is very handy for highlighting certain +regions of the graph. ``where`` takes a boolean mask the same length +as the x, ymin and ymax arguments, and only fills in the region where +the boolean mask is True. In the example below, we simulate a single +random walker and compute the analytic mean and standard deviation of +the population positions. The population mean is shown as the black +dashed line, and the plus/minus one sigma deviation from the mean is +showsn as the yellow filled region. We use the where mask +``X>upper_bound`` to find the region where the walker is above the one +sigma boundary, and shade that region blue. + +.. plot:: + :include-source: + + np.random.seed(1234) + + Nsteps = 500 + t = np.arange(Nsteps) + + mu = 0.002 + sigma = 0.01 + + # the steps and position + S = mu + sigma*np.random.randn(Nsteps) + X = S.cumsum() + + # the 1 sigma upper and lower analytic population bounds + lower_bound = mu*t - sigma*np.sqrt(t) + upper_bound = mu*t + sigma*np.sqrt(t) + + fig, ax = plt.subplots(1) + ax.plot(t, X, lw=2, label='walker position', color='blue') + ax.plot(t, mu*t, lw=1, label='population mean', color='black', ls='--') + ax.fill_between(t, lower_bound, upper_bound, facecolor='yellow', alpha=0.5, + label='1 sigma range') + ax.legend(loc='upper left') + + # here we use the where argument to only fill the region where the + # walker is above the population 1 sigma boundary + ax.fill_between(t, upper_bound, X, where=X>upper_bound, facecolor='blue', alpha=0.5) + ax.set_xlabel('num steps') + ax.set_ylabel('position') + ax.grid() + + +Another handy use of filled regions is to highlight horizontal or +vertical spans of an axes -- for that matplotlib has some helper +functions :meth:`~matplotlib.axes.Axes.axhspan` and +:meth:`~matplotlib.axes.Axes.axvspan` and example +:ref:`pylab_examples-axhspan_demo`. + + +Transparent, fancy legends +========================== + +Sometimes you know what your data looks like before you plot it, and +mak know for instance that there won't be much data in the upper right +hand corner. Then you can safely create a legend that doesn't overlay +your data:: + + ax.legend(loc='upper right') + +Other times you don't know where your data is, and loc='best' will try +and place the legend:: + + ax.legend(loc='upper right') + +but still, your legend may overlap your data, and in these cases it's +nice to make the legend frame transparent. + + +.. plot:: + :include-source: + + np.random.seed(1234) + fig, ax = plt.subplots(1) + ax.plot(np.random.randn(300), 'o-', label='normal distribution') + ax.plot(np.random.rand(300), 's-', label='uniform distribution') + ax.set_ylim(-3, 3) + leg = ax.legend(loc='best', fancybox=True) + leg.get_frame().set_alpha(0.5) + + ax.set_title('fancy, transparent legends') + + +Placing text boxes +================== + +When decorating axes with text boxes, two useful tricks are to place +the text in axes coordinates (see :ref:`transforms_tutorial`), so the +text doesn't move around with changes in x or y limits. You can also +use the ``bbox`` property of text to surround the text with a +:class:`~matplotlib.patches.Patch` instance -- the ``bbox`` keyword +argument takes a dictionary with keys that are Patch properties. + +.. plot:: + :include-source: + + np.random.seed(1234) + fig, ax = plt.subplots(1) + x = 30*np.random.randn(10000) + mu = x.mean() + median = np.median(x) + sigma = x.std() + textstr = '$\mu=%.2f$\n$\mathrm{median}=%.2f$\n$\sigma=%.2f$'%(mu, median, sigma) + + ax.hist(x, 50) + # these are matplotlib.patch.Patch properies + props = dict(boxstyle='round', facecolor='wheat', alpha=0.5) + + # place a text box in upper left in axes coords + ax.text(0.05, 0.95, textstr, transform=ax.transAxes, fontsize=14, + verticalalignment='top', bbox=props) + diff -Nru matplotlib-0.99.3/doc/users/screenshots.rst matplotlib-1.0.1/doc/users/screenshots.rst --- matplotlib-0.99.3/doc/users/screenshots.rst 2009-08-22 21:06:12.000000000 +0000 +++ matplotlib-1.0.1/doc/users/screenshots.rst 2010-07-07 01:41:46.000000000 +0000 @@ -97,7 +97,7 @@ ========== The :func:`~matplotlib.pyplot.pie` command -uses a matlab(TM) compatible syntax to produce pie charts. Optional +uses a MATLAB compatible syntax to produce pie charts. Optional features include auto-labeling the percentage of area, exploding one or more wedges out from the center of the pie, and a shadow effect. Take a close look at the attached code that produced this figure; nine @@ -230,7 +230,7 @@ ======= The :func:`~matplotlib.pyplot.legend` command automatically -generates figure legends, with Matlab compatible legend placement +generates figure legends, with MATLAB compatible legend placement commands. Thanks to Charles Twardy for input on the legend command diff -Nru matplotlib-0.99.3/doc/users/toolkits.rst matplotlib-1.0.1/doc/users/toolkits.rst --- matplotlib-0.99.3/doc/users/toolkits.rst 2009-07-31 15:14:26.000000000 +0000 +++ matplotlib-1.0.1/doc/users/toolkits.rst 2010-09-23 19:54:48.000000000 +0000 @@ -31,7 +31,7 @@ mpl_toolkits.exceltools provides some utilities for working with Excel. This toolkit ships with matplotlib, but requires -`pyExcelerator `_ +`xlwt `_ .. _toolkit_natgrid: @@ -66,5 +66,5 @@ distributed with matplotlib source. .. image:: ../_static/demo_axes_grid.png - + See :ref:`toolkit_axesgrid-index` for documentations. diff -Nru matplotlib-0.99.3/doc/users/transforms_tutorial.rst matplotlib-1.0.1/doc/users/transforms_tutorial.rst --- matplotlib-0.99.3/doc/users/transforms_tutorial.rst 2009-08-31 03:25:48.000000000 +0000 +++ matplotlib-1.0.1/doc/users/transforms_tutorial.rst 2010-10-15 13:14:14.000000000 +0000 @@ -261,6 +261,18 @@ plt.show() +.. note:: + + The blended transformations where x is in data coords and y in axes + coordinates is so useful that we have helper methods to return the + versions mpl uses internally for drawing ticks, ticklabels, etc. + The methods are :meth:`matplotlib.axes.Axes.get_xaxis_transform` and + :meth:`matplotlib.axes.Axes.get_yaxis_transform`. So in the example + above, the call to + :meth:`~matplotlib.transforms.blended_transform_factory` can be + replaced by ``get_xaxis_transform``:: + + trans = ax.get_xaxis_transform() .. offset-transforms-shadow: @@ -268,8 +280,8 @@ ================================================= One use of transformations is to create a new transformation that is -offset from another annotation, eg to place one object shifted a bit -relative to another object. Typically you want the shift to be in +offset from another transformation, eg to place one object shifted a +bit relative to another object. Typically you want the shift to be in some physical dimension, like points or inches rather than in data coordinates, so that the shift effect is constant at different zoom levels and dpi settings. @@ -301,8 +313,11 @@ shadow_transform = ax.transData + offset showing that can chain transformations using the addition operator. -This code says: first apply the data transformation ``ax.transData`` and -then translate the data by `dx` and `dy` points. +This code says: first apply the data transformation ``ax.transData`` +and then translate the data by `dx` and `dy` points. In typography, +a`point `_ is +1/72 inches, and by specifying your offsets in points, your figure +will look the same regardless of the dpi resolution it is saved in. .. plot:: :include-source: diff -Nru matplotlib-0.99.3/doc/users/whats_new.rst matplotlib-1.0.1/doc/users/whats_new.rst --- matplotlib-0.99.3/doc/users/whats_new.rst 2009-08-31 03:25:48.000000000 +0000 +++ matplotlib-1.0.1/doc/users/whats_new.rst 2010-07-07 01:41:46.000000000 +0000 @@ -7,10 +7,142 @@ This page just covers the highlights -- for the full story, see the `CHANGELOG `_ +new in matplotlib-1.0 +====================== + +.. _whats-new-html5: + +HTML5/Canvas backend +--------------------- + +Simon Ratcliffe and Ludwig Schwardt have released an `HTML5/Canvas +`_ backend for matplotlib. The +backend is almost feature complete, and they have done a lot of work +comparing their html5 rendered images with our core renderer Agg. The +backend features client/server interactive navigation of matplotlib +figures in an html5 compliant browser. + +Sophisticated subplot grid layout +--------------------------------- + +Jae-Joon Lee has written :mod:`~matplotlib.gridspec`, a new module for +doing complex subplot layouts, featuring row and column spans and +more. See :ref:`gridspec-guide` for a tutorial overview. + +.. plot:: users/plotting/examples/demo_gridspec01.py + +Easy pythonic subplots +----------------------- + +Fernando Perez got tired of all the boilerplate code needed to create a +figure and multiple subplots when using the matplotlib API, and wrote +a :func:`~matplotlib.pyplot.subplots` helper function. Basic usage +allows you to create the figure and an array of subplots with numpy +indexing (starts with 0). Eg:: + + fig, axarr = plt.subplots(2, 2) + axarr[0,0].plot([1,2,3]) # upper, left + +See :ref:`pylab_examples-subplots_demo` for several code examples. + +Contour fixes and and triplot +--------------------------------- + +Ian Thomas has fixed a long-standing bug that has vexed our most +talented developers for years. :func:`~matplotlib.pyplot.contourf` +now handles interior masked regions, and the boundaries of line and +filled contours coincide. + +Additionally, he has contributed a new module `matplotlib.tri` and +helper function :func:`~matplotlib.pyplot.triplot` for creating and +plotting unstructured triangular grids. + +.. plot:: mpl_examples/pylab_examples/triplot_demo.py + +multiple calls to show supported +--------------------------------- + +A long standing request is to support multiple calls to +:func:`~matplotlib.pyplot.show`. This has been difficult because it +is hard to get consistent behavior across operating systems, user +interface toolkits and versions. Eric Firing has done a lot of work +on rationalizing show across backends, with the desired behavior to +make show raise all newly created figures and block execution until +they are closed. Repeated calls to show should raise newly created +figures since the last call. Eric has done a lot of testing on the +user interface toolkits and versions and platforms he has access to, +but it is not possible to test them all, so please report problems to +the `mailing list +`_ +and `bug tracker +`_. + + +mplot3d graphs can be embedded in arbitrary axes +------------------------------------------------- + +You can now place an mplot3d graph into an arbitrary axes location, +supporting mixing of 2D and 3D graphs in the same figure, and/or +multiple 3D graphs in a single figure, using the "projection" keyword +argument to add_axes or add_subplot. Thanks Ben Root. + +.. plot:: pyplots/whats_new_1_subplot3d.py + +tick_params +------------ + +Eric Firing wrote tick_params, a convenience method for changing the +appearance of ticks and tick labels. See pyplot function +:func:`~matplotlib.pyplot.tick_params` and associated Axes method +:meth:`~matplotlib.axes.Axes.tick_params`. + +Lots of performance and feature enhancements +--------------------------------------------- + + +* Faster magnification of large images, and the ability to zoom in to + a single pixel + +* Local installs of documentation work better + +* Improved "widgets" -- mouse grabbing is supported + +* More accurate snapping of lines to pixel boundaries + +* More consistent handling of color, particularly the alpha channel, + throughout the API + +Much improved software carpentry +--------------------------------- + +The matplotlib trunk is probably in as good a shape as it has ever +been, thanks to improved `software carpentry +`_. We now have a `buildbot +`_ which runs a suite of `nose +`_ regression tests on every +svn commit, auto-generating a set of images and comparing them against +a set of known-goods, sending emails to developers on failures with a +pixel-by-pixel `image comparison +`_. Releases and release +bugfixes happen in branches, allowing active new feature development +to happen in the trunk while keeping the release branches stable. +Thanks to Andrew Straw, Michael Droettboom and other matplotlib +developers for the heavy lifting. + +Bugfix marathon +---------------- + +Eric Firing went on a bug fixing and closing marathon, closing over +100 bugs on the `bug tracker +`_ with +help from Jae-Joon Lee, Michael Droettboom, Christoph Gohlke and +Michiel de Hoon. + + new in matplotlib-0.99 ====================== -.. _whats-new-mplot3d: + New documentation ----------------- @@ -21,6 +153,7 @@ working with paths and transformations: :ref:`path_tutorial` and :ref:`transforms_tutorial`. +.. _whats-new-mplot3d: mplot3d -------- @@ -76,7 +209,7 @@ and 3.0 will not be available until numpy is available on those releases). Thanks to the many developers who contributed to this release, with contributions from Jae-Joon Lee, Michael Droettboom, -Ryan May, Eric Firing, Manuel Metz, Jouni K. Seppaenen, Jeff Whitaker, +Ryan May, Eric Firing, Manuel Metz, Jouni K. Seppänen, Jeff Whitaker, Darren Dale, David Kaplan, Michiel de Hoon and many others who submitted patches @@ -130,7 +263,7 @@ Ryan May did a lot of work to rationalize the amplitude scaling of :func:`~matplotlib.pyplot.psd` and friends. See :ref:`pylab_examples-psd_demo2`. and :ref:`pylab_examples-psd_demo3`. -The changes should increase `MATLABâ„¢ `_ +The changes should increase MATLAB compatabililty and increase scaling options. .. _fill-between: @@ -167,7 +300,7 @@ Updated spectral methods (psd, csd, etc.) to scale one-sided densities by a factor of 2 and, optionally, scale all densities by - the sampling frequency. This gives better MatLab + the sampling frequency. This gives better MATLAB compatibility. -RM Fixed alignment of ticks in colorbars. -MGD diff -Nru matplotlib-0.99.3/examples/animation/animation_blit_gtk2.py matplotlib-1.0.1/examples/animation/animation_blit_gtk2.py --- matplotlib-0.99.3/examples/animation/animation_blit_gtk2.py 2009-07-31 15:14:44.000000000 +0000 +++ matplotlib-1.0.1/examples/animation/animation_blit_gtk2.py 2011-01-05 15:59:56.000000000 +0000 @@ -20,9 +20,9 @@ class UpdateLine(object): def get_bg_bbox(self): - + return self.ax.bbox.padded(-3) - + def __init__(self, canvas, ax): self.cnt = 0 self.canvas = canvas @@ -31,7 +31,7 @@ self.prev_time = time.time() self.start_time = self.prev_time self.prev_pixel_offset = 0. - + self.x0 = 0 self.phases = np.random.random_sample((20,)) * np.pi * 2 @@ -70,7 +70,7 @@ # restore the clean slate background self.canvas.restore_region(self.background1) - # restore subregion (x1+dx, y1, x2, y2) of the second bg + # restore subregion (x1+dx, y1, x2, y2) of the second bg # in a offset position (x1-dx, y1) x1, y1, x2, y2 = self.background2.get_extents() self.canvas.restore_region(self.background2, @@ -82,18 +82,18 @@ def on_draw(self, *args): self.save_bg() return False - + def update_line(self, *args): if self.background1 is None: return True - + cur_time = time.time() pixel_offset = int((cur_time - self.start_time)*100.) dx_pixel = pixel_offset - self.prev_pixel_offset self.prev_pixel_offset = pixel_offset dx_data = self.get_dx_data(dx_pixel) #cur_time - self.prev_time) - + x0 = self.x0 self.x0 += dx_data self.prev_time = cur_time @@ -109,7 +109,7 @@ self.line.set_color(self.color_cycle.next()) - # now plot line segment within [x0, x0+dx_data], + # now plot line segment within [x0, x0+dx_data], # Note that we're only plotting a line between [x0, x0+dx_data]. xx = np.array([x0, self.x0]) self.line.set_xdata(xx) diff -Nru matplotlib-0.99.3/examples/animation/animation_blit_gtk.py matplotlib-1.0.1/examples/animation/animation_blit_gtk.py --- matplotlib-0.99.3/examples/animation/animation_blit_gtk.py 2009-07-31 15:14:44.000000000 +0000 +++ matplotlib-1.0.1/examples/animation/animation_blit_gtk.py 2011-01-05 15:59:56.000000000 +0000 @@ -29,15 +29,28 @@ # for profiling tstart = time.time() +def on_draw(event): + background = canvas.copy_from_bbox(ax.bbox) + if on_draw.background is None: + gobject.idle_add(update_line) + + on_draw.background = background + +on_draw.background = None + +fig.canvas.mpl_connect('draw_event', on_draw) + def update_line(*args): - print 'you are here', update_line.cnt - if update_line.background is None: - update_line.background = canvas.copy_from_bbox(ax.bbox) + if on_draw.background is None: + return True + + print 'frame', update_line.cnt # restore the clean slate background - canvas.restore_region(update_line.background) + canvas.restore_region(on_draw.background) # update the data line.set_ydata(np.sin(x+update_line.cnt/10.0)) + # just draw the animated artist ax.draw_artist(line) @@ -54,14 +67,6 @@ return True update_line.cnt = 0 -update_line.background = None - - -def start_anim(event): - gobject.idle_add(update_line) - canvas.mpl_disconnect(start_anim.cid) - -start_anim.cid = canvas.mpl_connect('draw_event', start_anim) diff -Nru matplotlib-0.99.3/examples/animation/draggable_legend.py matplotlib-1.0.1/examples/animation/draggable_legend.py --- matplotlib-0.99.3/examples/animation/draggable_legend.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/examples/animation/draggable_legend.py 2010-07-07 01:41:53.000000000 +0000 @@ -0,0 +1,43 @@ +import matplotlib.pyplot as plt + + +ax = plt.subplot(111) +ax.plot([1,2,3], label="test") + +l = ax.legend() +d1 = l.draggable() + +xy = 1, 2 +txt = ax.annotate("Test", xy, xytext=(-30, 30), + textcoords="offset points", + bbox=dict(boxstyle="round",fc=(0.2, 1, 1)), + arrowprops=dict(arrowstyle="->")) +d2 = txt.draggable() + + +from matplotlib._png import read_png +from matplotlib.cbook import get_sample_data + +from matplotlib.offsetbox import OffsetImage, AnnotationBbox + +fn = get_sample_data("lena.png", asfileobj=False) +arr_lena = read_png(fn) + +imagebox = OffsetImage(arr_lena, zoom=0.2) + +ab = AnnotationBbox(imagebox, xy, + xybox=(120., -80.), + xycoords='data', + boxcoords="offset points", + pad=0.5, + arrowprops=dict(arrowstyle="->", + connectionstyle="angle,angleA=0,angleB=90,rad=3") + ) + + +ax.add_artist(ab) + +d3 = ab.draggable(use_blit=True) + + +plt.show() diff -Nru matplotlib-0.99.3/examples/animation/dynamic_image_gtkagg.py matplotlib-1.0.1/examples/animation/dynamic_image_gtkagg.py --- matplotlib-0.99.3/examples/animation/dynamic_image_gtkagg.py 2009-07-31 15:14:44.000000000 +0000 +++ matplotlib-1.0.1/examples/animation/dynamic_image_gtkagg.py 2010-07-07 01:41:53.000000000 +0000 @@ -9,7 +9,6 @@ import matplotlib matplotlib.use('GTKAgg') -from matplotlib import rcParams from pylab import * diff -Nru matplotlib-0.99.3/examples/animation/movie_demo.py matplotlib-1.0.1/examples/animation/movie_demo.py --- matplotlib-0.99.3/examples/animation/movie_demo.py 2009-07-31 15:14:44.000000000 +0000 +++ matplotlib-1.0.1/examples/animation/movie_demo.py 2010-07-07 01:41:53.000000000 +0000 @@ -87,7 +87,7 @@ for i in range(len(y)) : # - # The next four lines are just like Matlab. + # The next four lines are just like MATLAB. # plt.plot(x,y[i],'b.') plt.axis((x[0],x[-1],-0.25,1)) diff -Nru matplotlib-0.99.3/examples/animation/strip_chart_demo.py matplotlib-1.0.1/examples/animation/strip_chart_demo.py --- matplotlib-0.99.3/examples/animation/strip_chart_demo.py 2009-07-31 15:14:44.000000000 +0000 +++ matplotlib-1.0.1/examples/animation/strip_chart_demo.py 2010-07-07 01:41:53.000000000 +0000 @@ -9,7 +9,7 @@ different GUI that supports animation (GTKAgg, TkAgg, WXAgg) and use your toolkits idle/timer functions. """ -import gobject, gtk +import gobject import matplotlib matplotlib.use('GTKAgg') import numpy as np diff -Nru matplotlib-0.99.3/examples/api/artist_demo.py matplotlib-1.0.1/examples/api/artist_demo.py --- matplotlib-0.99.3/examples/api/artist_demo.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/examples/api/artist_demo.py 2010-09-23 19:54:50.000000000 +0000 @@ -0,0 +1,119 @@ +""" +Show examples of matplotlib artists +http://matplotlib.sourceforge.net/api/artist_api.html + +Several examples of standard matplotlib graphics primitives (artists) +are drawn using matplotlib API. Full list of artists and the +documentation is available at +http://matplotlib.sourceforge.net/api/artist_api.html + +Copyright (c) 2010, Bartosz Telenczuk + +License: This work is licensed under the BSD. A copy should be +included with this source code, and is also available at +http://www.opensource.org/licenses/bsd-license.php +""" + + +import numpy as np +import matplotlib.pyplot as plt +import matplotlib +from matplotlib.collections import PatchCollection +import matplotlib.path as mpath +import matplotlib.patches as mpatches +import matplotlib.lines as mlines + +font = "sans-serif" +fig = plt.figure(figsize=(5,5)) +ax = plt.axes([0,0,1,1]) + +# create 3x3 grid to plot the artists +pos = np.mgrid[0.2:0.8:3j, 0.2:0.8:3j].reshape(2, -1) + +patches = [] + +# add a circle +art = mpatches.Circle(pos[:,0], 0.1,ec="none") +patches.append(art) +plt.text(pos[0,0], pos[1,0]-0.15, "Circle", ha="center", + family=font, size=14) + +# add a rectangle +art = mpatches.Rectangle(pos[:,1] - np.array([0.025, 0.05]), 0.05, 0.1, + ec="none") +patches.append(art) +plt.text(pos[0,1], pos[1,1]-0.15, "Rectangle", ha="center", + family=font, size=14) + +# add a wedge +wedge = mpatches.Wedge(pos[:,2], 0.1, 30, 270, ec="none") +patches.append(wedge) +plt.text(pos[0,2], pos[1,2]-0.15, "Wedge", ha="center", + family=font, size=14) + +# add a Polygon +polygon = mpatches.RegularPolygon(pos[:,3], 5, 0.1) +patches.append(polygon) +plt.text(pos[0,3], pos[1,3]-0.15, "Polygon", ha="center", + family=font, size=14) + +#add an ellipse +ellipse = mpatches.Ellipse(pos[:,4], 0.2, 0.1) +patches.append(ellipse) +plt.text(pos[0,4], pos[1,4]-0.15, "Ellipse", ha="center", + family=font, size=14) + +#add an arrow +arrow = mpatches.Arrow(pos[0,5]-0.05, pos[1,5]-0.05, 0.1, 0.1, width=0.1) +patches.append(arrow) +plt.text(pos[0,5], pos[1,5]-0.15, "Arrow", ha="center", + family=font, size=14) + +# add a path patch +Path = mpath.Path +verts = np.array([ + (0.158, -0.257), + (0.035, -0.11), + (-0.175, 0.20), + (0.0375, 0.20), + (0.085, 0.115), + (0.22, 0.32), + (0.3, 0.005), + (0.20, -0.05), + (0.158, -0.257), + ]) +verts = verts-verts.mean(0) +codes = [Path.MOVETO, + Path.CURVE4, Path.CURVE4, Path.CURVE4, Path.LINETO, + Path.CURVE4, Path.CURVE4, Path.CURVE4, Path.CLOSEPOLY] + +path = mpath.Path(verts/2.5+pos[:,6], codes) +patch = mpatches.PathPatch(path) +patches.append(patch) +plt.text(pos[0,6], pos[1,6]-0.15, "PathPatch", ha="center", + family=font, size=14) + +# add a fancy box +fancybox = mpatches.FancyBboxPatch( + pos[:,7]-np.array([0.025, 0.05]), 0.05, 0.1, + boxstyle=mpatches.BoxStyle("Round", pad=0.02)) +patches.append(fancybox) +plt.text(pos[0,7], pos[1,7]-0.15, "FancyBoxPatch", ha="center", + family=font, size=14) + +# add a line +x,y = np.array([[-0.06, 0.0, 0.1], [0.05,-0.05, 0.05]]) +line = mlines.Line2D(x+pos[0,8], y+pos[1,8], lw=5., + alpha=0.4) +plt.text(pos[0,8], pos[1,8]-0.15, "Line2D", ha="center", + family=font, size=14) + +colors = 100*np.random.rand(len(patches)) +collection = PatchCollection(patches, cmap=matplotlib.cm.jet, alpha=0.4) +collection.set_array(np.array(colors)) +ax.add_collection(collection) +ax.add_line(line) +ax.set_xticks([]) +ax.set_yticks([]) + +plt.show() diff -Nru matplotlib-0.99.3/examples/api/color_cycle.py matplotlib-1.0.1/examples/api/color_cycle.py --- matplotlib-0.99.3/examples/api/color_cycle.py 2009-07-31 15:14:49.000000000 +0000 +++ matplotlib-1.0.1/examples/api/color_cycle.py 2010-07-07 01:41:55.000000000 +0000 @@ -13,7 +13,7 @@ mpl.rc('lines', linewidth=4) fig = plt.figure() -mpl.axes.set_default_color_cycle(['r', 'g', 'b', 'c']) +mpl.rcParams['axes.color_cycle'] = ['r', 'g', 'b', 'c'] ax = fig.add_subplot(2,1,1) ax.plot(yy) ax.set_title('Changed default color cycle to rgbc') diff -Nru matplotlib-0.99.3/examples/api/compound_path.py matplotlib-1.0.1/examples/api/compound_path.py --- matplotlib-0.99.3/examples/api/compound_path.py 2009-07-31 15:14:49.000000000 +0000 +++ matplotlib-1.0.1/examples/api/compound_path.py 2010-07-07 01:41:55.000000000 +0000 @@ -21,7 +21,7 @@ vertices = np.array(vertices, float) path = Path(vertices, codes) -pathpatch = PathPatch(path, facecolor='red', edgecolor='green') +pathpatch = PathPatch(path, facecolor='None', edgecolor='green') fig = plt.figure() ax = fig.add_subplot(111) diff -Nru matplotlib-0.99.3/examples/api/date_demo.py matplotlib-1.0.1/examples/api/date_demo.py --- matplotlib-0.99.3/examples/api/date_demo.py 2009-07-31 15:14:49.000000000 +0000 +++ matplotlib-1.0.1/examples/api/date_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -17,6 +17,7 @@ import matplotlib.pyplot as plt import matplotlib.dates as mdates import matplotlib.mlab as mlab +import matplotlib.cbook as cbook years = mdates.YearLocator() # every year months = mdates.MonthLocator() # every month @@ -26,7 +27,7 @@ # open, close, volume, adj_close from the mpl-data/example directory. # The record array stores python datetime.date as an object array in # the date column -datafile = matplotlib.get_example_data('goog.npy') +datafile = cbook.get_sample_data('goog.npy') r = np.load(datafile).view(np.recarray) fig = plt.figure() diff -Nru matplotlib-0.99.3/examples/api/date_index_formatter.py matplotlib-1.0.1/examples/api/date_index_formatter.py --- matplotlib-0.99.3/examples/api/date_index_formatter.py 2009-07-31 15:14:49.000000000 +0000 +++ matplotlib-1.0.1/examples/api/date_index_formatter.py 2010-07-07 01:41:55.000000000 +0000 @@ -6,9 +6,13 @@ import numpy as np import matplotlib.pyplot as plt import matplotlib.mlab as mlab +import matplotlib.cbook as cbook import matplotlib.ticker as ticker -r = mlab.csv2rec('../data/aapl.csv') +datafile = cbook.get_sample_data('aapl.csv', asfileobj=False) +print 'loading', datafile +r = mlab.csv2rec(datafile) + r.sort() r = r[-30:] # get the last 30 days diff -Nru matplotlib-0.99.3/examples/api/demo_affine_image.py matplotlib-1.0.1/examples/api/demo_affine_image.py --- matplotlib-0.99.3/examples/api/demo_affine_image.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/examples/api/demo_affine_image.py 2010-07-07 01:41:55.000000000 +0000 @@ -0,0 +1,66 @@ +#!/usr/bin/env python + + +""" +For the backends that supports draw_image with optional affine +transform (e.g., agg, ps backend), the image of the output should +have its boundary matches the red rectangles. +""" + +import numpy as np +import matplotlib.cm as cm +import matplotlib.mlab as mlab +import matplotlib.pyplot as plt +import matplotlib.transforms as mtransforms + +def get_image(): + delta = 0.25 + x = y = np.arange(-3.0, 3.0, delta) + X, Y = np.meshgrid(x, y) + Z1 = mlab.bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0) + Z2 = mlab.bivariate_normal(X, Y, 1.5, 0.5, 1, 1) + Z = Z2-Z1 # difference of Gaussians + return Z + +def imshow_affine(ax, z, *kl, **kwargs): + im = ax.imshow(z, *kl, **kwargs) + x1, x2, y1, y2 = im.get_extent() + im._image_skew_coordinate = (x2, y1) + return im + + +if 1: + + # image rotation + + ax1 = plt.subplot(121) + Z = get_image() + im1 = imshow_affine(ax1, Z, interpolation='nearest', cmap=cm.jet, + origin='lower', + extent=[-2, 4, -3, 2], clip_on=True) + + trans_data2 = mtransforms.Affine2D().rotate_deg(30) + ax1.transData + im1.set_transform(trans_data2) + + # display intended extent of the image + x1, x2, y1, y2 = im1.get_extent() + x3, y3 = x2, y1 + + ax1.plot([x1, x2, x2, x1, x1], [y1, y1, y2, y2, y1], "r--", lw=3, + transform=trans_data2) + + ax1.set_xlim(-3, 5) + ax1.set_ylim(-4, 4) + + + # image skew + + ax2 = plt.subplot(122) + im2 = ax2.imshow(Z, interpolation='nearest', cmap=cm.jet, + origin='lower', + extent=[-2, 4, -3, 2], clip_on=True) + im2._image_skew_coordinate = (3, -2) + + + plt.show() + #plt.savefig("demo_affine_image") diff -Nru matplotlib-0.99.3/examples/api/engineering_formatter.py matplotlib-1.0.1/examples/api/engineering_formatter.py --- matplotlib-0.99.3/examples/api/engineering_formatter.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/examples/api/engineering_formatter.py 2010-07-07 01:41:55.000000000 +0000 @@ -0,0 +1,19 @@ +''' +Demo to show use of the engineering Formatter. +''' + +import matplotlib.pyplot as plt +import numpy as np + +from matplotlib.ticker import EngFormatter + +ax = plt.subplot(111) +ax.set_xscale('log') +formatter = EngFormatter(unit='Hz', places=1) +ax.xaxis.set_major_formatter(formatter) + +xs = np.logspace(1, 9, 100) +ys = (0.8 + 0.4 * np.random.uniform(size=100)) * np.log10(xs)**2 +ax.plot(xs, ys) + +plt.show() diff -Nru matplotlib-0.99.3/examples/api/font_file.py matplotlib-1.0.1/examples/api/font_file.py --- matplotlib-0.99.3/examples/api/font_file.py 2009-07-31 15:14:49.000000000 +0000 +++ matplotlib-1.0.1/examples/api/font_file.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,19 +1,40 @@ -# -*- noplot -*- -""" -Although it is usually not a good idea to explicitly point to a single -ttf file for a font instance, you can do so using the -font_manager.FontProperties fname argument (for a more flexible -solution, see the font_fmaily_rc.py and fonts_demo.py examples). -""" -import matplotlib.font_manager as fm - -import matplotlib.pyplot as plt - -fig = plt.figure() -ax = fig.add_subplot(111) -ax.plot([1,2,3]) - -prop = fm.FontProperties(fname='/Library/Fonts/Tahoma.ttf') -ax.set_title('this is a special font', fontproperties=prop) -plt.show() - +# -*- noplot -*- +""" +Although it is usually not a good idea to explicitly point to a single +ttf file for a font instance, you can do so using the +font_manager.FontProperties fname argument (for a more flexible +solution, see the font_fmaily_rc.py and fonts_demo.py examples). +""" +import sys +import os +import matplotlib.font_manager as fm + +import matplotlib.pyplot as plt + +fig = plt.figure() +ax = fig.add_subplot(111) +ax.plot([1,2,3]) + +if sys.platform == 'win32': + fpath = 'C:\\Windows\\Fonts\\Tahoma.ttf' +elif sys.platform == 'linux2': + fonts = ['/usr/share/fonts/truetype/freefont/FreeSansBoldOblique.ttf', + '/usr/share/fonts/truetype/ttf-liberation/LiberationSans-BoldItalic.ttf', + '/usr/share/fonts/truetype/msttcorefonts/Comic_Sans_MS.ttf', + ] + for fpath in fonts: + if os.path.exists(fpath): + break +else: + fpath = '/Library/Fonts/Tahoma.ttf' + +if os.path.exists(fpath): + prop = fm.FontProperties(fname=fpath) + fname = os.path.split(fpath)[1] + ax.set_title('this is a special font: %s' % fname, fontproperties=prop) +else: + ax.set_title('Demo fails--cannot find a demo font') +ax.set_xlabel('This is the default font') + +plt.show() + diff -Nru matplotlib-0.99.3/examples/api/hinton_demo.py matplotlib-1.0.1/examples/api/hinton_demo.py --- matplotlib-0.99.3/examples/api/hinton_demo.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/examples/api/hinton_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -0,0 +1,60 @@ +#Initial idea from David Warde-Farley on the SciPy Cookbook +import numpy as np +import matplotlib.pyplot as plt +from matplotlib.patches import Rectangle +from matplotlib.ticker import NullLocator +#from matplotlib.collections import RegularPolyCollection +#from matplotlib.colors import BoundaryNorm, ListedColormap + +def hinton(W, maxWeight=None, ax=None): + """ + Draws a Hinton diagram for visualizing a weight matrix. + """ + if not ax: + fig = plt.figure() + ax = fig.add_subplot(1, 1, 1) + + if not maxWeight: + maxWeight = 2**np.ceil(np.log(np.abs(W).max())/np.log(2)) + + ax.patch.set_facecolor('gray') + ax.set_aspect('equal', 'box') + ax.xaxis.set_major_locator(NullLocator()) + ax.yaxis.set_major_locator(NullLocator()) + + for (x,y),w in np.ndenumerate(W): + if w > 0: color = 'white' + else: color = 'black' + size = np.sqrt(np.abs(w)) + rect = Rectangle([x - size / 2, y - size / 2], size, size, + facecolor=color, edgecolor=color) + ax.add_patch(rect) + ax.autoscale_view() + + # Reverse the yaxis limits + ax.set_ylim(*ax.get_ylim()[::-1]) + +## Potential way using polygon collections that just has an issue with +## easily getting the squares scaled by the data. + +# height,width = W.shape +# x = np.arange(width) +# y = np.arange(height) +# X,Y = np.meshgrid(x, y) +# xy = np.array([X.flatten(),Y.flatten()]).T +# scaled_data = W.flatten() / maxWeight +# cmap = ListedColormap(['black', 'white']) +# norm = BoundaryNorm([-1., 0., 1.], cmap.N) + +# rect_col = RegularPolyCollection(4, rotation=np.pi/4, +# sizes=np.abs(scaled_data) * 72 / ax.figure.get_dpi(), offsets=xy, +# transOffset=ax.transData, norm=norm, cmap=cmap, edgecolor='none') +# ax.add_collection(rect_col) +# rect_col.set_array(scaled_data) +# ax.autoscale_view() + +if __name__ == '__main__': + hinton(np.random.rand(20, 20) - 0.5) + plt.title('Hinton Example') + plt.show() + diff -Nru matplotlib-0.99.3/examples/api/sankey_demo.py matplotlib-1.0.1/examples/api/sankey_demo.py --- matplotlib-0.99.3/examples/api/sankey_demo.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/examples/api/sankey_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -0,0 +1,188 @@ +#!/usr/bin/env python + +__author__ = "Yannick Copin " +__version__ = "Time-stamp: <10/02/2010 16:49 ycopin@lyopc548.in2p3.fr>" + +import numpy as N + +def sankey(ax, + outputs=[100.], outlabels=None, + inputs=[100.], inlabels='', + dx=40, dy=10, outangle=45, w=3, inangle=30, offset=2, **kwargs): + """Draw a Sankey diagram. + + outputs: array of outputs, should sum up to 100% + outlabels: output labels (same length as outputs), + or None (use default labels) or '' (no labels) + inputs and inlabels: similar for inputs + dx: horizontal elongation + dy: vertical elongation + outangle: output arrow angle [deg] + w: output arrow shoulder + inangle: input dip angle + offset: text offset + **kwargs: propagated to Patch (e.g. fill=False) + + Return (patch,[intexts,outtexts]).""" + + import matplotlib.patches as mpatches + from matplotlib.path import Path + + outs = N.absolute(outputs) + outsigns = N.sign(outputs) + outsigns[-1] = 0 # Last output + + ins = N.absolute(inputs) + insigns = N.sign(inputs) + insigns[0] = 0 # First input + + assert sum(outs)==100, "Outputs don't sum up to 100%" + assert sum(ins)==100, "Inputs don't sum up to 100%" + + def add_output(path, loss, sign=1): + h = (loss/2+w)*N.tan(outangle/180.*N.pi) # Arrow tip height + move,(x,y) = path[-1] # Use last point as reference + if sign==0: # Final loss (horizontal) + path.extend([(Path.LINETO,[x+dx,y]), + (Path.LINETO,[x+dx,y+w]), + (Path.LINETO,[x+dx+h,y-loss/2]), # Tip + (Path.LINETO,[x+dx,y-loss-w]), + (Path.LINETO,[x+dx,y-loss])]) + outtips.append((sign,path[-3][1])) + else: # Intermediate loss (vertical) + path.extend([(Path.CURVE4,[x+dx/2,y]), + (Path.CURVE4,[x+dx,y]), + (Path.CURVE4,[x+dx,y+sign*dy]), + (Path.LINETO,[x+dx-w,y+sign*dy]), + (Path.LINETO,[x+dx+loss/2,y+sign*(dy+h)]), # Tip + (Path.LINETO,[x+dx+loss+w,y+sign*dy]), + (Path.LINETO,[x+dx+loss,y+sign*dy]), + (Path.CURVE3,[x+dx+loss,y-sign*loss]), + (Path.CURVE3,[x+dx/2+loss,y-sign*loss])]) + outtips.append((sign,path[-5][1])) + + def add_input(path, gain, sign=1): + h = (gain/2)*N.tan(inangle/180.*N.pi) # Dip depth + move,(x,y) = path[-1] # Use last point as reference + if sign==0: # First gain (horizontal) + path.extend([(Path.LINETO,[x-dx,y]), + (Path.LINETO,[x-dx+h,y+gain/2]), # Dip + (Path.LINETO,[x-dx,y+gain])]) + xd,yd = path[-2][1] # Dip position + indips.append((sign,[xd-h,yd])) + else: # Intermediate gain (vertical) + path.extend([(Path.CURVE4,[x-dx/2,y]), + (Path.CURVE4,[x-dx,y]), + (Path.CURVE4,[x-dx,y+sign*dy]), + (Path.LINETO,[x-dx-gain/2,y+sign*(dy-h)]), # Dip + (Path.LINETO,[x-dx-gain,y+sign*dy]), + (Path.CURVE3,[x-dx-gain,y-sign*gain]), + (Path.CURVE3,[x-dx/2-gain,y-sign*gain])]) + xd,yd = path[-4][1] # Dip position + indips.append((sign,[xd,yd+sign*h])) + + outtips = [] # Output arrow tip dir. and positions + urpath = [(Path.MOVETO,[0,100])] # 1st point of upper right path + lrpath = [(Path.LINETO,[0,0])] # 1st point of lower right path + for loss,sign in zip(outs,outsigns): + add_output(sign>=0 and urpath or lrpath, loss, sign=sign) + + indips = [] # Input arrow tip dir. and positions + llpath = [(Path.LINETO,[0,0])] # 1st point of lower left path + ulpath = [(Path.MOVETO,[0,100])] # 1st point of upper left path + for gain,sign in zip(ins,insigns)[::-1]: + add_input(sign<=0 and llpath or ulpath, gain, sign=sign) + + def revert(path): + """A path is not just revertable by path[::-1] because of Bezier + curves.""" + rpath = [] + nextmove = Path.LINETO + for move,pos in path[::-1]: + rpath.append((nextmove,pos)) + nextmove = move + return rpath + + # Concatenate subpathes in correct order + path = urpath + revert(lrpath) + llpath + revert(ulpath) + + codes,verts = zip(*path) + verts = N.array(verts) + + # Path patch + path = Path(verts,codes) + patch = mpatches.PathPatch(path, **kwargs) + ax.add_patch(patch) + + if False: # DEBUG + print "urpath", urpath + print "lrpath", revert(lrpath) + print "llpath", llpath + print "ulpath", revert(ulpath) + + xs,ys = zip(*verts) + ax.plot(xs,ys,'go-') + + # Labels + + def set_labels(labels,values): + """Set or check labels according to values.""" + if labels=='': # No labels + return labels + elif labels is None: # Default labels + return [ '%2d%%' % val for val in values ] + else: + assert len(labels)==len(values) + return labels + + def put_labels(labels,positions,output=True): + """Put labels to positions.""" + texts = [] + lbls = output and labels or labels[::-1] + for i,label in enumerate(lbls): + s,(x,y) = positions[i] # Label direction and position + if s==0: + t = ax.text(x+offset,y,label, + ha=output and 'left' or 'right', va='center') + elif s>0: + t = ax.text(x,y+offset,label, ha='center', va='bottom') + else: + t = ax.text(x,y-offset,label, ha='center', va='top') + texts.append(t) + return texts + + outlabels = set_labels(outlabels, outs) + outtexts = put_labels(outlabels, outtips, output=True) + + inlabels = set_labels(inlabels, ins) + intexts = put_labels(inlabels, indips, output=False) + + # Axes management + ax.set_xlim(verts[:,0].min()-dx, verts[:,0].max()+dx) + ax.set_ylim(verts[:,1].min()-dy, verts[:,1].max()+dy) + ax.set_aspect('equal', adjustable='datalim') + + return patch,[intexts,outtexts] + +if __name__=='__main__': + + import matplotlib.pyplot as P + + outputs = [10.,-20.,5.,15.,-10.,40.] + outlabels = ['First','Second','Third','Fourth','Fifth','Hurray!'] + outlabels = [ s+'\n%d%%' % abs(l) for l,s in zip(outputs,outlabels) ] + + inputs = [60.,-25.,15.] + + fig = P.figure() + ax = fig.add_subplot(1,1,1, xticks=[],yticks=[], + title="Sankey diagram" + ) + + patch,(intexts,outtexts) = sankey(ax, outputs=outputs, outlabels=outlabels, + inputs=inputs, inlabels=None, + fc='g', alpha=0.2) + outtexts[1].set_color('r') + outtexts[-1].set_fontweight('bold') + + P.show() diff -Nru matplotlib-0.99.3/examples/api/span_regions.py matplotlib-1.0.1/examples/api/span_regions.py --- matplotlib-0.99.3/examples/api/span_regions.py 2009-07-31 15:14:49.000000000 +0000 +++ matplotlib-1.0.1/examples/api/span_regions.py 2010-07-07 01:41:55.000000000 +0000 @@ -21,11 +21,11 @@ ax.axhline(0, color='black', lw=2) collection = collections.BrokenBarHCollection.span_where( - t, ymin=0, ymax=1, where=s1>0, facecolor='green', alpha=0.5) + t, ymin=0, ymax=1, where=s1>0, facecolor='green', alpha=0.5) ax.add_collection(collection) collection = collections.BrokenBarHCollection.span_where( - t, ymin=-1, ymax=0, where=s1<0, facecolor='red', alpha=0.5) + t, ymin=-1, ymax=0, where=s1<0, facecolor='red', alpha=0.5) ax.add_collection(collection) diff -Nru matplotlib-0.99.3/examples/api/watermark_image.py matplotlib-1.0.1/examples/api/watermark_image.py --- matplotlib-0.99.3/examples/api/watermark_image.py 2009-07-31 15:14:49.000000000 +0000 +++ matplotlib-1.0.1/examples/api/watermark_image.py 2010-07-07 01:41:55.000000000 +0000 @@ -3,12 +3,13 @@ """ import numpy as np import matplotlib -matplotlib.use('Agg') - +import matplotlib.cbook as cbook import matplotlib.image as image import matplotlib.pyplot as plt -im = image.imread('../data/logo2.png') +datafile = cbook.get_sample_data('logo2.png', asfileobj=False) +print 'loading', datafile +im = image.imread(datafile) im[:,:,-1] = 0.5 # set the alpha channel fig = plt.figure() diff -Nru matplotlib-0.99.3/examples/axes_grid/demo_axes_divider.py matplotlib-1.0.1/examples/axes_grid/demo_axes_divider.py --- matplotlib-0.99.3/examples/axes_grid/demo_axes_divider.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/examples/axes_grid/demo_axes_divider.py 2010-07-07 01:41:54.000000000 +0000 @@ -1,6 +1,13 @@ import matplotlib.pyplot as plt -from demo_image import get_demo_image -#import mpl_toolkits.imaging.axes_grid as imaging + +def get_demo_image(): + import numpy as np + from matplotlib.cbook import get_sample_data + f = get_sample_data("axes_grid/bivariate_normal.npy", asfileobj=False) + z = np.load(f) + # z is a numpy array of 15x15 + return z, (-3,4,-4,3) + def demo_simple_image(ax): Z, extent = get_demo_image() @@ -12,7 +19,7 @@ def demo_locatable_axes_hard(fig1): - from mpl_toolkits.axes_grid \ + from mpl_toolkits.axes_grid1 \ import SubplotDivider, LocatableAxes, Size divider = SubplotDivider(fig1, 2, 2, 2, aspect=True) @@ -50,7 +57,7 @@ def demo_locatable_axes_easy(ax): - from mpl_toolkits.axes_grid import make_axes_locatable + from mpl_toolkits.axes_grid1 import make_axes_locatable divider = make_axes_locatable(ax) @@ -69,7 +76,7 @@ def demo_images_side_by_sied(ax): - from mpl_toolkits.axes_grid import make_axes_locatable + from mpl_toolkits.axes_grid1 import make_axes_locatable divider = make_axes_locatable(ax) @@ -119,6 +126,4 @@ plt.show() - -if __name__ == "__main__": - demo() +demo() diff -Nru matplotlib-0.99.3/examples/axes_grid/demo_axes_grid2.py matplotlib-1.0.1/examples/axes_grid/demo_axes_grid2.py --- matplotlib-0.99.3/examples/axes_grid/demo_axes_grid2.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/examples/axes_grid/demo_axes_grid2.py 2010-07-07 01:41:54.000000000 +0000 @@ -0,0 +1,113 @@ +import matplotlib.pyplot as plt +from mpl_toolkits.axes_grid1 import ImageGrid +import numpy as np + +def get_demo_image(): + from matplotlib.cbook import get_sample_data + f = get_sample_data("axes_grid/bivariate_normal.npy", asfileobj=False) + z = np.load(f) + # z is a numpy array of 15x15 + return z, (-3,4,-4,3) + + +def add_inner_title(ax, title, loc, size=None, **kwargs): + from matplotlib.offsetbox import AnchoredText + from matplotlib.patheffects import withStroke + if size is None: + size = dict(size=plt.rcParams['legend.fontsize']) + at = AnchoredText(title, loc=loc, prop=size, + pad=0., borderpad=0.5, + frameon=False, **kwargs) + ax.add_artist(at) + at.txt._text.set_path_effects([withStroke(foreground="w", linewidth=3)]) + return at + +if 1: + F = plt.figure(1, (6, 6)) + F.clf() + + # prepare images + Z, extent = get_demo_image() + ZS = [Z[i::3,:] for i in range(3)] + extent = extent[0], extent[1]/3., extent[2], extent[3] + + # demo 1 : colorbar at each axes + + grid = ImageGrid(F, 211, # similar to subplot(111) + nrows_ncols = (1, 3), + direction="row", + axes_pad = 0.05, + add_all=True, + label_mode = "1", + share_all = True, + cbar_location="top", + cbar_mode="each", + cbar_size="7%", + cbar_pad="1%", + ) + + + for ax, z in zip(grid, ZS): + im = ax.imshow(z, origin="lower", extent=extent, interpolation="nearest") + ax.cax.colorbar(im) + + for ax, im_title in zip(grid, ["Image 1", "Image 2", "Image 3"]): + t = add_inner_title(ax, im_title, loc=3) + t.patch.set_alpha(0.5) + + for ax, z in zip(grid, ZS): + ax.cax.toggle_label(True) + #axis = ax.cax.axis[ax.cax.orientation] + #axis.label.set_text("counts s$^{-1}$") + #axis.label.set_size(10) + #axis.major_ticklabels.set_size(6) + + # changing the colorbar ticks + grid[1].cax.set_xticks([-1, 0, 1]) + grid[2].cax.set_xticks([-1, 0, 1]) + + grid[0].set_xticks([-2, 0]) + grid[0].set_yticks([-2, 0, 2]) + + + # demo 2 : shared colorbar + + grid2 = ImageGrid(F, 212, + nrows_ncols = (1, 3), + direction="row", + axes_pad = 0.05, + add_all=True, + label_mode = "1", + share_all = True, + cbar_location="right", + cbar_mode="single", + cbar_size="10%", + cbar_pad=0.05, + ) + + grid2[0].set_xlabel("X") + grid2[0].set_ylabel("Y") + + vmax, vmin = np.max(ZS), np.min(ZS) + import matplotlib.colors + norm = matplotlib.colors.normalize(vmax=vmax, vmin=vmin) + + for ax, z in zip(grid2, ZS): + im = ax.imshow(z, norm=norm, + origin="lower", extent=extent, + interpolation="nearest") + + # With cbar_mode="single", cax attribute of all axes are identical. + ax.cax.colorbar(im) + ax.cax.toggle_label(True) + + for ax, im_title in zip(grid2, ["(a)", "(b)", "(c)"]): + t = add_inner_title(ax, im_title, loc=2) + t.patch.set_ec("none") + t.patch.set_alpha(0.5) + + grid2[0].set_xticks([-2, 0]) + grid2[0].set_yticks([-2, 0, 2]) + + plt.draw() + plt.show() diff -Nru matplotlib-0.99.3/examples/axes_grid/demo_axes_grid.py matplotlib-1.0.1/examples/axes_grid/demo_axes_grid.py --- matplotlib-0.99.3/examples/axes_grid/demo_axes_grid.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/examples/axes_grid/demo_axes_grid.py 2010-07-07 01:41:54.000000000 +0000 @@ -1,7 +1,13 @@ import matplotlib.pyplot as plt -from demo_image import get_demo_image -from mpl_toolkits.axes_grid import AxesGrid +from mpl_toolkits.axes_grid1 import AxesGrid +def get_demo_image(): + import numpy as np + from matplotlib.cbook import get_sample_data + f = get_sample_data("axes_grid/bivariate_normal.npy", asfileobj=False) + z = np.load(f) + # z is a numpy array of 15x15 + return z, (-3,4,-4,3) def demo_simple_grid(fig): """ @@ -32,15 +38,19 @@ axes_pad = 0.0, share_all=True, label_mode = "L", + cbar_location = "top", cbar_mode="single", ) Z, extent = get_demo_image() for i in range(4): im = grid[i].imshow(Z, extent=extent, interpolation="nearest") - plt.colorbar(im, cax = grid.cbar_axes[0]) + #plt.colorbar(im, cax = grid.cbar_axes[0]) grid.cbar_axes[0].colorbar(im) + for cax in grid.cbar_axes: + cax.toggle_label(False) + # This affects all axes as share_all = True. grid.axes_llc.set_xticks([-2, 0, 2]) grid.axes_llc.set_yticks([-2, 0, 2]) @@ -66,14 +76,16 @@ im = grid[i].imshow(Z, extent=extent, interpolation="nearest") grid.cbar_axes[i].colorbar(im) + for cax in grid.cbar_axes: + cax.toggle_label(False) + # This affects all axes because we set share_all = True. grid.axes_llc.set_xticks([-2, 0, 2]) grid.axes_llc.set_yticks([-2, 0, 2]) -if __name__ == "__main__": - +if 1: F = plt.figure(1, (5.5, 2.5)) F.subplots_adjust(left=0.05, right=0.98) diff -Nru matplotlib-0.99.3/examples/axes_grid/demo_axes_rgb.py matplotlib-1.0.1/examples/axes_grid/demo_axes_rgb.py --- matplotlib-0.99.3/examples/axes_grid/demo_axes_rgb.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/examples/axes_grid/demo_axes_rgb.py 2010-07-07 01:41:54.000000000 +0000 @@ -1,8 +1,16 @@ import numpy as np import matplotlib.pyplot as plt -from demo_axes_divider import get_demo_image -from mpl_toolkits.axes_grid.axes_rgb import make_rgb_axes, RGBAxes +from mpl_toolkits.axes_grid1.axes_rgb import make_rgb_axes, RGBAxes + +def get_demo_image(): + from matplotlib.cbook import get_sample_data + f = get_sample_data("axes_grid/bivariate_normal.npy", asfileobj=False) + z = np.load(f) + # z is a numpy array of 15x15 + return z, (-3,4,-4,3) + + def get_rgb(): Z, extent = get_demo_image() @@ -67,16 +75,16 @@ ax.RGB.set_ylim(0.9, 10.6) for ax1 in [ax.RGB, ax.R, ax.G, ax.B]: - for axisline in ax1._axislines.values(): - axisline.line.set_color("w") - axisline.major_ticks.set_mec("w") + for sp1 in ax1.spines.values(): + sp1.set_color("w") + for tick in ax1.xaxis.get_major_ticks() + ax1.yaxis.get_major_ticks(): + tick.tick1line.set_mec("w") + tick.tick2line.set_mec("w") return ax -if __name__ == "__main__": - demo_rgb() - ax = demo_rgb2() +demo_rgb() +ax = demo_rgb2() - plt.draw() - plt.show() +plt.show() diff -Nru matplotlib-0.99.3/examples/axes_grid/demo_axisline_style.py matplotlib-1.0.1/examples/axes_grid/demo_axisline_style.py --- matplotlib-0.99.3/examples/axes_grid/demo_axisline_style.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/examples/axes_grid/demo_axisline_style.py 2010-07-07 01:41:54.000000000 +0000 @@ -0,0 +1,21 @@ + +from mpl_toolkits.axes_grid.axislines import SubplotZero +import matplotlib.pyplot as plt +import numpy as np + +if 1: + fig = plt.figure(1) + ax = SubplotZero(fig, 111) + fig.add_subplot(ax) + + for direction in ["xzero", "yzero"]: + ax.axis[direction].set_axisline_style("-|>") + ax.axis[direction].set_visible(True) + + for direction in ["left", "right", "bottom", "top"]: + ax.axis[direction].set_visible(False) + + x = np.linspace(-0.5, 1., 100) + ax.plot(x, np.sin(x*np.pi)) + + plt.show() diff -Nru matplotlib-0.99.3/examples/axes_grid/demo_colorbar_with_inset_locator.py matplotlib-1.0.1/examples/axes_grid/demo_colorbar_with_inset_locator.py --- matplotlib-0.99.3/examples/axes_grid/demo_colorbar_with_inset_locator.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/examples/axes_grid/demo_colorbar_with_inset_locator.py 2010-07-07 01:41:54.000000000 +0000 @@ -0,0 +1,39 @@ +import matplotlib.pyplot as plt + +from mpl_toolkits.axes_grid1.inset_locator import inset_axes + +fig = plt.figure(1, [6, 3]) + +# first subplot +ax1 = fig.add_subplot(121) + +axins1 = inset_axes(ax1, + width="50%", # width = 10% of parent_bbox width + height="5%", # height : 50% + loc=1) + +im1=ax1.imshow([[1,2],[2, 3]]) +plt.colorbar(im1, cax=axins1, orientation="horizontal", ticks=[1,2,3]) +axins1.xaxis.set_ticks_position("bottom") + +# first subplot +ax = fig.add_subplot(122) + +axins = inset_axes(ax, + width="5%", # width = 10% of parent_bbox width + height="50%", # height : 50% + loc=3, + bbox_to_anchor=(1.05, 0., 1, 1), + bbox_transform=ax.transAxes, + borderpad=0, + ) + +# Controlling the placement of the inset axes is basically same as that +# of the legend. you may want to play with the borderpad value and +# the bbox_to_anchor coordinate. + +im=ax.imshow([[1,2],[2, 3]]) +plt.colorbar(im, cax=axins, ticks=[1,2,3]) + +plt.draw() +plt.show() diff -Nru matplotlib-0.99.3/examples/axes_grid/demo_curvelinear_grid2.py matplotlib-1.0.1/examples/axes_grid/demo_curvelinear_grid2.py --- matplotlib-0.99.3/examples/axes_grid/demo_curvelinear_grid2.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/examples/axes_grid/demo_curvelinear_grid2.py 2010-07-07 01:41:54.000000000 +0000 @@ -0,0 +1,63 @@ +import numpy as np +#from matplotlib.path import Path + +import matplotlib.pyplot as plt + +from mpl_toolkits.axes_grid.grid_helper_curvelinear import GridHelperCurveLinear +from mpl_toolkits.axes_grid.axislines import Subplot + +import mpl_toolkits.axes_grid.angle_helper as angle_helper + +def curvelinear_test1(fig): + """ + grid for custom transform. + """ + + def tr(x, y): + sgn = np.sign(x) + x, y = np.abs(np.asarray(x)), np.asarray(y) + return sgn*x**.5, y + + def inv_tr(x,y): + sgn = np.sign(x) + x, y = np.asarray(x), np.asarray(y) + return sgn*x**2, y + + extreme_finder = angle_helper.ExtremeFinderCycle(20, 20, + lon_cycle = None, + lat_cycle = None, + lon_minmax = None, #(0, np.inf), + lat_minmax = None, + ) + + grid_helper = GridHelperCurveLinear((tr, inv_tr), + extreme_finder=extreme_finder) + + ax1 = Subplot(fig, 111, grid_helper=grid_helper) + # ax1 will have a ticks and gridlines defined by the given + # transform (+ transData of the Axes). Note that the transform of + # the Axes itself (i.e., transData) is not affected by the given + # transform. + + fig.add_subplot(ax1) + + ax1.imshow(np.arange(25).reshape(5,5), + vmax = 50, cmap=plt.cm.gray_r, + interpolation="nearest", + origin="lower") + + # tick density + grid_helper.grid_finder.grid_locator1._nbins = 6 + grid_helper.grid_finder.grid_locator2._nbins = 6 + + + +if 1: + fig = plt.figure(1, figsize=(7, 4)) + fig.clf() + + curvelinear_test1(fig) + plt.show() + + + diff -Nru matplotlib-0.99.3/examples/axes_grid/demo_curvelinear_grid.py matplotlib-1.0.1/examples/axes_grid/demo_curvelinear_grid.py --- matplotlib-0.99.3/examples/axes_grid/demo_curvelinear_grid.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/examples/axes_grid/demo_curvelinear_grid.py 2010-07-07 01:41:54.000000000 +0000 @@ -4,10 +4,10 @@ import matplotlib.pyplot as plt import matplotlib.cbook as cbook -from mpl_toolkits.axes_grid.grid_helper_curvelinear import GridHelperCurveLinear -from mpl_toolkits.axes_grid.axislines import Subplot +from mpl_toolkits.axisartist.grid_helper_curvelinear import GridHelperCurveLinear +from mpl_toolkits.axisartist import Subplot -from mpl_toolkits.axes_grid.parasite_axes import SubplotHost, \ +from mpl_toolkits.axisartist import SubplotHost, \ ParasiteAxesAuxTrans @@ -42,11 +42,13 @@ ax1.set_xlim(0, 10.) ax1.set_ylim(0, 10.) + ax1.axis["t"]=ax1.new_floating_axis(0, 3.) + ax1.axis["t2"]=ax1.new_floating_axis(1, 7.) ax1.grid(True) -import mpl_toolkits.axes_grid.angle_helper as angle_helper +import mpl_toolkits.axisartist.angle_helper as angle_helper from matplotlib.projections import PolarAxes from matplotlib.transforms import Affine2D diff -Nru matplotlib-0.99.3/examples/axes_grid/demo_fixed_size_axes.py matplotlib-1.0.1/examples/axes_grid/demo_fixed_size_axes.py --- matplotlib-0.99.3/examples/axes_grid/demo_fixed_size_axes.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/examples/axes_grid/demo_fixed_size_axes.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,57 +0,0 @@ -import matplotlib.pyplot as plt - -from mpl_toolkits.axes_grid \ - import Divider, LocatableAxes, Size - -def demo_fixed_size_axes(): - - fig1 = plt.figure(1, (6, 6)) - - # The first items are for padding and the second items are for the axes. - # sizes are in inch. - h = [Size.Fixed(1.0), Size.Fixed(4.5)] - v = [Size.Fixed(0.7), Size.Fixed(5.)] - - divider = Divider(fig1, (0.0, 0.0, 1., 1.), h, v, aspect=False) - # the width and height of the rectangle is ignored. - - ax = LocatableAxes(fig1, divider.get_position()) - ax.set_axes_locator(divider.new_locator(nx=1, ny=1)) - - fig1.add_axes(ax) - - ax.plot([1,2,3]) - - - - -def demo_fixed_pad_axes(): - - fig = plt.figure(2, (6, 6)) - - # The first & third items are for padding and the second items are for the axes. - # sizes are in inch. - h = [Size.Fixed(1.0), Size.Scaled(1.), Size.Fixed(.2),] - v = [Size.Fixed(0.7), Size.Scaled(1.), Size.Fixed(.5),] - - divider = Divider(fig, (0.0, 0.0, 1., 1.), h, v, aspect=False) - # the width and height of the rectangle is ignored. - - ax = LocatableAxes(fig, divider.get_position()) - ax.set_axes_locator(divider.new_locator(nx=1, ny=1)) - - fig.add_axes(ax) - - ax.plot([1,2,3]) - - - - - - -if __name__ == "__main__": - demo_fixed_size_axes() - demo_fixed_pad_axes() - - plt.draw() - plt.show() diff -Nru matplotlib-0.99.3/examples/axes_grid/demo_floating_axes.py matplotlib-1.0.1/examples/axes_grid/demo_floating_axes.py --- matplotlib-0.99.3/examples/axes_grid/demo_floating_axes.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/examples/axes_grid/demo_floating_axes.py 2010-07-07 01:41:54.000000000 +0000 @@ -0,0 +1,154 @@ +from matplotlib.transforms import Affine2D + +import mpl_toolkits.axisartist.floating_axes as floating_axes + +import numpy as np +import mpl_toolkits.axisartist.angle_helper as angle_helper +from matplotlib.projections import PolarAxes +from mpl_toolkits.axisartist.grid_finder import FixedLocator, MaxNLocator, \ + DictFormatter + +def setup_axes1(fig, rect): + """ + A simple one. + """ + tr = Affine2D().scale(2, 1).rotate_deg(30) + + grid_helper = floating_axes.GridHelperCurveLinear(tr, extremes=(0, 4, 0, 4)) + + ax1 = floating_axes.FloatingSubplot(fig, rect, grid_helper=grid_helper) + fig.add_subplot(ax1) + + grid_helper.grid_finder.grid_locator1._nbins = 4 + grid_helper.grid_finder.grid_locator2._nbins = 4 + + return ax1 + + +def setup_axes2(fig, rect): + """ + With custom locator and formatter. + Note that the extreme values are swapped. + """ + + #tr_scale = Affine2D().scale(np.pi/180., 1.) + + tr = PolarAxes.PolarTransform() + + pi = np.pi + angle_ticks = [(0, r"$0$"), + (.25*pi, r"$\frac{1}{4}\pi$"), + (.5*pi, r"$\frac{1}{2}\pi$")] + grid_locator1 = FixedLocator([v for v, s in angle_ticks]) + tick_formatter1 = DictFormatter(dict(angle_ticks)) + + grid_locator2 = MaxNLocator(2) + + grid_helper = floating_axes.GridHelperCurveLinear(tr, + extremes=(.5*pi, 0, 2, 1), + grid_locator1=grid_locator1, + grid_locator2=grid_locator2, + tick_formatter1=tick_formatter1, + tick_formatter2=None, + ) + + ax1 = floating_axes.FloatingSubplot(fig, rect, grid_helper=grid_helper) + fig.add_subplot(ax1) + + # create a parasite axes whose transData in RA, cz + aux_ax = ax1.get_aux_axes(tr) + + aux_ax.patch = ax1.patch # for aux_ax to have a clip path as in ax + ax1.patch.zorder=0.9 # but this has a side effect that the patch is + # drawn twice, and possibly over some other + # artists. So, we decrease the zorder a bit to + # prevent this. + + return ax1, aux_ax + + +def setup_axes3(fig, rect): + """ + Sometimes, things like axis_direction need to be adjusted. + """ + + # rotate a bit for better orientation + tr_rotate = Affine2D().translate(-95, 0) + + # scale degree to radians + tr_scale = Affine2D().scale(np.pi/180., 1.) + + tr = tr_rotate + tr_scale + PolarAxes.PolarTransform() + + grid_locator1 = angle_helper.LocatorHMS(4) + tick_formatter1 = angle_helper.FormatterHMS() + + grid_locator2 = MaxNLocator(3) + + ra0, ra1 = 8.*15, 14.*15 + cz0, cz1 = 0, 14000 + grid_helper = floating_axes.GridHelperCurveLinear(tr, + extremes=(ra0, ra1, cz0, cz1), + grid_locator1=grid_locator1, + grid_locator2=grid_locator2, + tick_formatter1=tick_formatter1, + tick_formatter2=None, + ) + + ax1 = floating_axes.FloatingSubplot(fig, rect, grid_helper=grid_helper) + fig.add_subplot(ax1) + + # adjust axis + ax1.axis["left"].set_axis_direction("bottom") + ax1.axis["right"].set_axis_direction("top") + + ax1.axis["bottom"].set_visible(False) + ax1.axis["top"].set_axis_direction("bottom") + ax1.axis["top"].toggle(ticklabels=True, label=True) + ax1.axis["top"].major_ticklabels.set_axis_direction("top") + ax1.axis["top"].label.set_axis_direction("top") + + ax1.axis["left"].label.set_text(r"cz [km$^{-1}$]") + ax1.axis["top"].label.set_text(r"$\alpha_{1950}$") + + + # create a parasite axes whose transData in RA, cz + aux_ax = ax1.get_aux_axes(tr) + + aux_ax.patch = ax1.patch # for aux_ax to have a clip path as in ax + ax1.patch.zorder=0.9 # but this has a side effect that the patch is + # drawn twice, and possibly over some other + # artists. So, we decrease the zorder a bit to + # prevent this. + + return ax1, aux_ax + + + +if 1: + import matplotlib.pyplot as plt + fig = plt.figure(1, figsize=(8, 4)) + fig.subplots_adjust(wspace=0.3, left=0.05, right=0.95) + + ax1 = setup_axes1(fig, 131) + + #theta = np.random.rand(10) #*.5*np.pi + #radius = np.random.rand(10) #+1. + #aux_ax1.scatter(theta, radius) + + + ax2, aux_ax2 = setup_axes2(fig, 132) + + theta = np.random.rand(10)*.5*np.pi + radius = np.random.rand(10)+1. + aux_ax2.scatter(theta, radius) + + + ax3, aux_ax3 = setup_axes3(fig, 133) + + theta = (8 + np.random.rand(10)*(14-8))*15. # indegree + radius = np.random.rand(10)*14000. + aux_ax3.scatter(theta, radius) + + plt.show() + diff -Nru matplotlib-0.99.3/examples/axes_grid/demo_floating_axis.py matplotlib-1.0.1/examples/axes_grid/demo_floating_axis.py --- matplotlib-0.99.3/examples/axes_grid/demo_floating_axis.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/examples/axes_grid/demo_floating_axis.py 2010-07-07 01:41:54.000000000 +0000 @@ -9,13 +9,13 @@ """ global ax1 import numpy as np - import mpl_toolkits.axes_grid.angle_helper as angle_helper + import mpl_toolkits.axisartist.angle_helper as angle_helper from matplotlib.projections import PolarAxes from matplotlib.transforms import Affine2D - from mpl_toolkits.axes_grid.parasite_axes import SubplotHost + from mpl_toolkits.axisartist import SubplotHost - from mpl_toolkits.axes_grid.grid_helper_curvelinear import GridHelperCurveLinear + from mpl_toolkits.axisartist import GridHelperCurveLinear # see demo_curvelinear_grid.py for details tr = Affine2D().scale(np.pi/180., 1.) + PolarAxes.PolarTransform() @@ -60,14 +60,12 @@ ax1.grid(True) -if __name__ == "__main__": - import matplotlib.pyplot as plt - fig = plt.figure(1, figsize=(5, 5)) - fig.clf() +import matplotlib.pyplot as plt +fig = plt.figure(1, figsize=(5, 5)) +fig.clf() - curvelinear_test2(fig) +curvelinear_test2(fig) - plt.draw() - plt.show() +plt.show() diff -Nru matplotlib-0.99.3/examples/axes_grid/demo_image.py matplotlib-1.0.1/examples/axes_grid/demo_image.py --- matplotlib-0.99.3/examples/axes_grid/demo_image.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/examples/axes_grid/demo_image.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -import numpy as np - -def get_demo_image(): - # prepare image - delta = 0.5 - - extent = (-3,4,-4,3) - x = np.arange(-3.0, 4.001, delta) - y = np.arange(-4.0, 3.001, delta) - X, Y = np.meshgrid(x, y) - import matplotlib.mlab as mlab - Z1 = mlab.bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0) - Z2 = mlab.bivariate_normal(X, Y, 1.5, 0.5, 1, 1) - Z = (Z1 - Z2) * 10 - - return Z, extent - diff -Nru matplotlib-0.99.3/examples/axes_grid/demo_parasite_axes2.py matplotlib-1.0.1/examples/axes_grid/demo_parasite_axes2.py --- matplotlib-0.99.3/examples/axes_grid/demo_parasite_axes2.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/examples/axes_grid/demo_parasite_axes2.py 2010-07-07 01:41:54.000000000 +0000 @@ -1,32 +1,24 @@ -from mpl_toolkits.axes_grid.parasite_axes import SubplotHost +from mpl_toolkits.axes_grid1 import host_subplot +import mpl_toolkits.axisartist as AA import matplotlib.pyplot as plt if 1: - fig = plt.figure(1) - host = SubplotHost(fig, 111) - - host.set_ylabel("Density") - host.set_xlabel("Distance") + host = host_subplot(111, axes_class=AA.Axes) + plt.subplots_adjust(right=0.75) par1 = host.twinx() par2 = host.twinx() - par1.set_ylabel("Temperature") - - par2.axis["right"].set_visible(False) + offset = 60 + new_fixed_axis = par2.get_grid_helper().new_fixed_axis + par2.axis["right"] = new_fixed_axis(loc="right", + axes=par2, + offset=(offset, 0)) + + par2.axis["right"].toggle(all=True) - offset = 60, 0 - new_axisline = par2.get_grid_helper().new_fixed_axis - par2.axis["right2"] = new_axisline(loc="right", - axes=par2, - offset=offset) - par2.axis["right2"].label.set_visible(True) - par2.axis["right2"].set_label("Velocity") - - fig.add_axes(host) - plt.subplots_adjust(right=0.75) host.set_xlim(0, 2) host.set_ylim(0, 2) @@ -34,6 +26,7 @@ host.set_xlabel("Distance") host.set_ylabel("Density") par1.set_ylabel("Temperature") + par2.set_ylabel("Velocity") p1, = host.plot([0, 1, 2], [0, 1, 2], label="Density") p2, = par1.plot([0, 1, 2], [0, 3, 2], label="Temperature") @@ -46,7 +39,7 @@ host.axis["left"].label.set_color(p1.get_color()) par1.axis["right"].label.set_color(p2.get_color()) - par2.axis["right2"].label.set_color(p3.get_color()) + par2.axis["right"].label.set_color(p3.get_color()) plt.draw() plt.show() diff -Nru matplotlib-0.99.3/examples/axes_grid/demo_parasite_axes.py matplotlib-1.0.1/examples/axes_grid/demo_parasite_axes.py --- matplotlib-0.99.3/examples/axes_grid/demo_parasite_axes.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/examples/axes_grid/demo_parasite_axes.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,54 +0,0 @@ -from mpl_toolkits.axes_grid.parasite_axes import HostAxes, ParasiteAxes -import matplotlib.pyplot as plt - -if __name__ == "__main__": - fig = plt.figure(1) - - host = HostAxes(fig, [0.15, 0.1, 0.65, 0.8]) - par1 = ParasiteAxes(host, sharex=host) - par2 = ParasiteAxes(host, sharex=host) - host.parasites.append(par1) - host.parasites.append(par2) - - host.set_ylabel("Density") - host.set_xlabel("Distance") - - host.axis["right"].set_visible(False) - par1.axis["right"].set_visible(True) - par1.set_ylabel("Temperature") - - par1.axis["right"].major_ticklabels.set_visible(True) - par1.axis["right"].label.set_visible(True) - - par2.set_ylabel("Velocity") - offset = (60, 0) - new_axisline = par2._grid_helper.new_fixed_axis - par2.axis["right2"] = new_axisline(loc="right", - axes=par2, - offset=offset) - - - fig.add_axes(host) - - host.set_xlim(0, 2) - host.set_ylim(0, 2) - - host.set_xlabel("Distance") - host.set_ylabel("Density") - par1.set_ylabel("Temperature") - - p1, = host.plot([0, 1, 2], [0, 1, 2], label="Density") - p2, = par1.plot([0, 1, 2], [0, 3, 2], label="Temperature") - p3, = par2.plot([0, 1, 2], [50, 30, 15], label="Velocity") - - par1.set_ylim(0, 4) - par2.set_ylim(1, 65) - - host.legend() - - host.axis["left"].label.set_color(p1.get_color()) - par1.axis["right"].label.set_color(p2.get_color()) - par2.axis["right2"].label.set_color(p3.get_color()) - - plt.draw() - plt.show() diff -Nru matplotlib-0.99.3/examples/axes_grid/inset_locator_demo2.py matplotlib-1.0.1/examples/axes_grid/inset_locator_demo2.py --- matplotlib-0.99.3/examples/axes_grid/inset_locator_demo2.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/examples/axes_grid/inset_locator_demo2.py 2010-07-07 01:41:54.000000000 +0000 @@ -1,11 +1,17 @@ import matplotlib.pyplot as plt -from mpl_toolkits.axes_grid.inset_locator import zoomed_inset_axes -from mpl_toolkits.axes_grid.inset_locator import mark_inset +from mpl_toolkits.axes_grid1.inset_locator import zoomed_inset_axes +from mpl_toolkits.axes_grid1.inset_locator import mark_inset import numpy as np -from demo_image import get_demo_image +def get_demo_image(): + from matplotlib.cbook import get_sample_data + import numpy as np + f = get_sample_data("axes_grid/bivariate_normal.npy", asfileobj=False) + z = np.load(f) + # z is a numpy array of 15x15 + return z, (-3,4,-4,3) fig = plt.figure(1, [5,4]) diff -Nru matplotlib-0.99.3/examples/axes_grid/inset_locator_demo.py matplotlib-1.0.1/examples/axes_grid/inset_locator_demo.py --- matplotlib-0.99.3/examples/axes_grid/inset_locator_demo.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/examples/axes_grid/inset_locator_demo.py 2010-07-07 01:41:54.000000000 +0000 @@ -1,7 +1,7 @@ import matplotlib.pyplot as plt -from mpl_toolkits.axes_grid.inset_locator import inset_axes, zoomed_inset_axes -from mpl_toolkits.axes_grid.anchored_artists import AnchoredSizeBar +from mpl_toolkits.axes_grid1.inset_locator import inset_axes, zoomed_inset_axes +from mpl_toolkits.axes_grid1.anchored_artists import AnchoredSizeBar def add_sizebar(ax, size): diff -Nru matplotlib-0.99.3/examples/axes_grid/parasite_simple2.py matplotlib-1.0.1/examples/axes_grid/parasite_simple2.py --- matplotlib-0.99.3/examples/axes_grid/parasite_simple2.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/examples/axes_grid/parasite_simple2.py 2010-07-07 01:41:54.000000000 +0000 @@ -1,6 +1,6 @@ import matplotlib.transforms as mtransforms import matplotlib.pyplot as plt -from mpl_toolkits.axes_grid.parasite_axes import SubplotHost +from mpl_toolkits.axes_grid1.parasite_axes import SubplotHost obs = [["01_S1", 3.88, 0.14, 1970, 63], ["01_S4", 5.6, 0.82, 1622, 150], diff -Nru matplotlib-0.99.3/examples/axes_grid/parasite_simple.py matplotlib-1.0.1/examples/axes_grid/parasite_simple.py --- matplotlib-0.99.3/examples/axes_grid/parasite_simple.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/examples/axes_grid/parasite_simple.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,24 +0,0 @@ -from mpl_toolkits.axes_grid.parasite_axes import SubplotHost -import matplotlib.pyplot as plt - -fig = plt.figure(1) - -host = SubplotHost(fig, 111) -fig.add_subplot(host) - -par = host.twinx() - -host.set_xlabel("Distance") -host.set_ylabel("Density") -par.set_ylabel("Temperature") - -p1, = host.plot([0, 1, 2], [0, 1, 2], label="Density") -p2, = par.plot([0, 1, 2], [0, 3, 2], label="Temperature") - -host.axis["left"].label.set_color(p1.get_color()) -par.axis["right"].label.set_color(p2.get_color()) - -host.legend() - -plt.show() - diff -Nru matplotlib-0.99.3/examples/axes_grid/scatter_hist.py matplotlib-1.0.1/examples/axes_grid/scatter_hist.py --- matplotlib-0.99.3/examples/axes_grid/scatter_hist.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/examples/axes_grid/scatter_hist.py 2010-07-07 01:41:54.000000000 +0000 @@ -8,30 +8,24 @@ fig = plt.figure(1, figsize=(5.5,5.5)) -from mpl_toolkits.axes_grid import make_axes_locatable +from mpl_toolkits.axes_grid1 import make_axes_locatable +# the scatter plot: axScatter = plt.subplot(111) -divider = make_axes_locatable(axScatter) - -# create a new axes with a height of 1.2 inch above the axScatter -axHistx = divider.new_vertical(1.2, pad=0.1, sharex=axScatter) - -# create a new axes with a width of 1.2 inch on the right side of the -# axScatter -axHisty = divider.new_horizontal(1.2, pad=0.1, sharey=axScatter) - -fig.add_axes(axHistx) -fig.add_axes(axHisty) +axScatter.scatter(x, y) +axScatter.set_aspect(1.) +# create new axes on the right and on the top of the current axes +# The first argument of the new_vertical(new_horizontal) method is +# the height (width) of the axes to be created in inches. +divider = make_axes_locatable(axScatter) +axHistx = divider.append_axes("top", 1.2, pad=0.1, sharex=axScatter) +axHisty = divider.append_axes("right", 1.2, pad=0.1, sharey=axScatter) # make some labels invisible plt.setp(axHistx.get_xticklabels() + axHisty.get_yticklabels(), visible=False) -# the scatter plot: -axScatter.scatter(x, y) -axScatter.set_aspect(1.) - # now determine nice limits by hand: binwidth = 0.25 xymax = np.max( [np.max(np.fabs(x)), np.max(np.fabs(y))] ) @@ -57,4 +51,3 @@ plt.draw() plt.show() -#plt.savefig("a.pdf") diff -Nru matplotlib-0.99.3/examples/axes_grid/simple_anchored_artists.py matplotlib-1.0.1/examples/axes_grid/simple_anchored_artists.py --- matplotlib-0.99.3/examples/axes_grid/simple_anchored_artists.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/examples/axes_grid/simple_anchored_artists.py 2010-07-07 01:41:54.000000000 +0000 @@ -2,7 +2,7 @@ def draw_text(ax): - from mpl_toolkits.axes_grid.anchored_artists import AnchoredText + from mpl_toolkits.axes_grid1.anchored_artists import AnchoredText at = AnchoredText("Figure 1a", loc=2, prop=dict(size=8), frameon=True, ) @@ -18,7 +18,7 @@ ax.add_artist(at2) def draw_circle(ax): # circle in the canvas coordinate - from mpl_toolkits.axes_grid.anchored_artists import AnchoredDrawingArea + from mpl_toolkits.axes_grid1.anchored_artists import AnchoredDrawingArea from matplotlib.patches import Circle ada = AnchoredDrawingArea(20, 20, 0, 0, loc=1, pad=0., frameon=False) @@ -27,7 +27,7 @@ ax.add_artist(ada) def draw_ellipse(ax): - from mpl_toolkits.axes_grid.anchored_artists import AnchoredEllipse + from mpl_toolkits.axes_grid1.anchored_artists import AnchoredEllipse # draw an ellipse of width=0.1, height=0.15 in the data coordinate ae = AnchoredEllipse(ax.transData, width=0.1, height=0.15, angle=0., loc=3, pad=0.5, borderpad=0.4, frameon=True) @@ -35,7 +35,7 @@ ax.add_artist(ae) def draw_sizebar(ax): - from mpl_toolkits.axes_grid.anchored_artists import AnchoredSizeBar + from mpl_toolkits.axes_grid1.anchored_artists import AnchoredSizeBar # draw a horizontal bar with length of 0.1 in Data coordinate # (ax.transData) with a label underneath. asb = AnchoredSizeBar(ax.transData, diff -Nru matplotlib-0.99.3/examples/axes_grid/simple_axes_divider1.py matplotlib-1.0.1/examples/axes_grid/simple_axes_divider1.py --- matplotlib-0.99.3/examples/axes_grid/simple_axes_divider1.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/examples/axes_grid/simple_axes_divider1.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,30 +0,0 @@ -from mpl_toolkits.axes_grid import Size, Divider -import matplotlib.pyplot as plt - - -fig1 = plt.figure(1, (6, 6)) - -# fixed size in inch -horiz = [Size.Fixed(1.), Size.Fixed(.5), Size.Fixed(1.5), - Size.Fixed(.5)] -vert = [Size.Fixed(1.5), Size.Fixed(.5), Size.Fixed(1.)] - -rect = (0.1, 0.1, 0.8, 0.8) -# divide the axes rectangle into grid whose size is specified by horiz * vert -divider = Divider(fig1, rect, horiz, vert, aspect=False) - -# the rect parameter will be ignore as we will set axes_locator -ax1 = fig1.add_axes(rect, label="1") -ax2 = fig1.add_axes(rect, label="2") -ax3 = fig1.add_axes(rect, label="3") -ax4 = fig1.add_axes(rect, label="4") - -ax1.set_axes_locator(divider.new_locator(nx=0, ny=0)) -ax2.set_axes_locator(divider.new_locator(nx=0, ny=2)) -ax3.set_axes_locator(divider.new_locator(nx=2, ny=2)) -ax4.set_axes_locator(divider.new_locator(nx=2, nx1=4, ny=0)) - - - -plt.draw() -plt.show() diff -Nru matplotlib-0.99.3/examples/axes_grid/simple_axes_divider2.py matplotlib-1.0.1/examples/axes_grid/simple_axes_divider2.py --- matplotlib-0.99.3/examples/axes_grid/simple_axes_divider2.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/examples/axes_grid/simple_axes_divider2.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,29 +0,0 @@ -import mpl_toolkits.axes_grid.axes_size as Size -from mpl_toolkits.axes_grid import Divider -import matplotlib.pyplot as plt - -fig1 = plt.figure(1, (5.5, 4.)) - -# the rect parameter will be ignore as we will set axes_locator -rect = (0.1, 0.1, 0.8, 0.8) -ax = [fig1.add_axes(rect, label="%d"%i) for i in range(4)] - -horiz = [Size.Scaled(1.5), Size.Fixed(.5), Size.Scaled(1.), - Size.Scaled(.5)] - -vert = [Size.Scaled(1.), Size.Fixed(.5), Size.Scaled(1.5)] - -# divide the axes rectangle into grid whose size is specified by horiz * vert -divider = Divider(fig1, rect, horiz, vert, aspect=False) - -ax[0].set_axes_locator(divider.new_locator(nx=0, ny=0)) -ax[1].set_axes_locator(divider.new_locator(nx=0, ny=2)) -ax[2].set_axes_locator(divider.new_locator(nx=2, ny=2)) -ax[3].set_axes_locator(divider.new_locator(nx=2, nx1=4, ny=0)) - -for ax1 in ax: - plt.setp(ax1.get_xticklabels()+ax1.get_yticklabels(), - visible=False) - -plt.draw() -plt.show() diff -Nru matplotlib-0.99.3/examples/axes_grid/simple_axes_divider3.py matplotlib-1.0.1/examples/axes_grid/simple_axes_divider3.py --- matplotlib-0.99.3/examples/axes_grid/simple_axes_divider3.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/examples/axes_grid/simple_axes_divider3.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,38 +0,0 @@ -import mpl_toolkits.axes_grid.axes_size as Size -from mpl_toolkits.axes_grid import Divider -import matplotlib.pyplot as plt - - -fig1 = plt.figure(1, (5.5, 4)) - -# the rect parameter will be ignore as we will set axes_locator -rect = (0.1, 0.1, 0.8, 0.8) -ax = [fig1.add_axes(rect, label="%d"%i) for i in range(4)] - - -horiz = [Size.AxesX(ax[0]), Size.Fixed(.5), Size.AxesX(ax[1])] -vert = [Size.AxesY(ax[0]), Size.Fixed(.5), Size.AxesY(ax[2])] - -# divide the axes rectangle into grid whose size is specified by horiz * vert -divider = Divider(fig1, rect, horiz, vert, aspect=False) - - -ax[0].set_axes_locator(divider.new_locator(nx=0, ny=0)) -ax[1].set_axes_locator(divider.new_locator(nx=2, ny=0)) -ax[2].set_axes_locator(divider.new_locator(nx=0, ny=2)) -ax[3].set_axes_locator(divider.new_locator(nx=2, ny=2)) - -ax[0].set_xlim(0, 2) -ax[1].set_xlim(0, 1) - -ax[0].set_ylim(0, 1) -ax[2].set_ylim(0, 2) - -divider.set_aspect(1.) - -for ax1 in ax: - plt.setp(ax1.get_xticklabels()+ax1.get_yticklabels(), - visible=False) - -plt.draw() -plt.show() diff -Nru matplotlib-0.99.3/examples/axes_grid/simple_axesgrid2.py matplotlib-1.0.1/examples/axes_grid/simple_axesgrid2.py --- matplotlib-0.99.3/examples/axes_grid/simple_axesgrid2.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/examples/axes_grid/simple_axesgrid2.py 2010-07-07 01:41:54.000000000 +0000 @@ -1,9 +1,16 @@ import matplotlib.pyplot as plt -from mpl_toolkits.axes_grid import AxesGrid -from demo_image import get_demo_image +from mpl_toolkits.axes_grid1 import ImageGrid + +def get_demo_image(): + import numpy as np + from matplotlib.cbook import get_sample_data + f = get_sample_data("axes_grid/bivariate_normal.npy", asfileobj=False) + z = np.load(f) + # z is a numpy array of 15x15 + return z, (-3,4,-4,3) F = plt.figure(1, (5.5, 3.5)) -grid = AxesGrid(F, 111, # similar to subplot(111) +grid = ImageGrid(F, 111, # similar to subplot(111) nrows_ncols = (1, 3), axes_pad = 0.1, add_all=True, diff -Nru matplotlib-0.99.3/examples/axes_grid/simple_axesgrid.py matplotlib-1.0.1/examples/axes_grid/simple_axesgrid.py --- matplotlib-0.99.3/examples/axes_grid/simple_axesgrid.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/examples/axes_grid/simple_axesgrid.py 2010-07-07 01:41:54.000000000 +0000 @@ -1,12 +1,12 @@ import matplotlib.pyplot as plt -from mpl_toolkits.axes_grid import AxesGrid +from mpl_toolkits.axes_grid1 import ImageGrid import numpy as np im = np.arange(100) im.shape = 10, 10 fig = plt.figure(1, (4., 4.)) -grid = AxesGrid(fig, 111, # similar to subplot(111) +grid = ImageGrid(fig, 111, # similar to subplot(111) nrows_ncols = (2, 2), # creates 2x2 grid of axes axes_pad=0.1, # pad between axes in inch. ) diff -Nru matplotlib-0.99.3/examples/axes_grid/simple_axisline2.py matplotlib-1.0.1/examples/axes_grid/simple_axisline2.py --- matplotlib-0.99.3/examples/axes_grid/simple_axisline2.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/examples/axes_grid/simple_axisline2.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,24 +0,0 @@ -import matplotlib.pyplot as plt -from mpl_toolkits.axes_grid.axislines import SubplotZero -import numpy as np - -fig = plt.figure(1, (4,3)) - -# a subplot with two additiona axis, "xzero" and "yzero". "xzero" is -# y=0 line, and "yzero" is x=0 line. -ax = SubplotZero(fig, 1, 1, 1) -fig.add_subplot(ax) - -# make xzero axis (horizontal axis line through y=0) visible. -ax.axis["xzero"].set_visible(True) -ax.axis["xzero"].label.set_text("Axis Zero") - -# make other axis (bottom, top, right) invisible. -for n in ["bottom", "top", "right"]: - ax.axis[n].set_visible(False) - -xx = np.arange(0, 2*np.pi, 0.01) -ax.plot(xx, np.sin(xx)) - -plt.show() - diff -Nru matplotlib-0.99.3/examples/axes_grid/simple_axisline3.py matplotlib-1.0.1/examples/axes_grid/simple_axisline3.py --- matplotlib-0.99.3/examples/axes_grid/simple_axisline3.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/examples/axes_grid/simple_axisline3.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,13 +0,0 @@ -import matplotlib.pyplot as plt -from mpl_toolkits.axes_grid.axislines import Subplot - -fig = plt.figure(1, (3,3)) - -ax = Subplot(fig, 111) -fig.add_subplot(ax) - -ax.axis["right"].set_visible(False) -ax.axis["top"].set_visible(False) - -plt.show() - diff -Nru matplotlib-0.99.3/examples/axes_grid/simple_axisline4.py matplotlib-1.0.1/examples/axes_grid/simple_axisline4.py --- matplotlib-0.99.3/examples/axes_grid/simple_axisline4.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/examples/axes_grid/simple_axisline4.py 2010-07-07 01:41:54.000000000 +0000 @@ -1,18 +1,15 @@ import matplotlib.pyplot as plt -from mpl_toolkits.axes_grid.parasite_axes import SubplotHost +from mpl_toolkits.axes_grid1 import host_subplot +import mpl_toolkits.axisartist as AA import numpy as np -fig = plt.figure(1, (4,3)) - -ax = SubplotHost(fig, 111) -fig.add_subplot(ax) - +ax = host_subplot(111, axes_class=AA.Axes) xx = np.arange(0, 2*np.pi, 0.01) ax.plot(xx, np.sin(xx)) ax2 = ax.twin() # ax2 is responsible for "top" axis and "right" axis ax2.set_xticks([0., .5*np.pi, np.pi, 1.5*np.pi, 2*np.pi]) -ax2.set_xticklabels(["0", r"$\frac{1}{2}\pi$", +ax2.set_xticklabels(["$0$", r"$\frac{1}{2}\pi$", r"$\pi$", r"$\frac{3}{2}\pi$", r"$2\pi$"]) ax2.axis["right"].major_ticklabels.set_visible(False) diff -Nru matplotlib-0.99.3/examples/axes_grid/simple_axisline.py matplotlib-1.0.1/examples/axes_grid/simple_axisline.py --- matplotlib-0.99.3/examples/axes_grid/simple_axisline.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/examples/axes_grid/simple_axisline.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,39 +0,0 @@ -import matplotlib.pyplot as plt - -from mpl_toolkits.axes_grid.axislines import SubplotZero - -if 1: - - fig = plt.figure(1) - fig.subplots_adjust(right=0.85) - ax = SubplotZero(fig, 1, 1, 1) - fig.add_subplot(ax) - - # make right and top axis invisible - ax.axis["right"].set_visible(False) - ax.axis["top"].set_visible(False) - - # make xzero axis (horizontal axis line through y=0) visible. - ax.axis["xzero"].set_visible(True) - ax.axis["xzero"].label.set_text("Axis Zero") - - ax.set_ylim(-2, 4) - ax.set_xlabel("Label X") - ax.set_ylabel("Label Y") - # or - #ax.axis["bottom"].label.set_text("Label X") - #ax.axis["left"].label.set_text("Label Y") - - # make new (right-side) yaxis, but wth some offset - offset = (20, 0) - new_axisline = ax.get_grid_helper().new_fixed_axis - - ax.axis["right2"] = new_axisline(loc="right", - offset=offset, - axes=ax) - ax.axis["right2"].label.set_text("Label Y2") - - ax.plot([-2,3,2]) - plt.draw() - plt.show() - diff -Nru matplotlib-0.99.3/examples/axes_grid/simple_rgb.py matplotlib-1.0.1/examples/axes_grid/simple_rgb.py --- matplotlib-0.99.3/examples/axes_grid/simple_rgb.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/examples/axes_grid/simple_rgb.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -import matplotlib.pyplot as plt - -from demo_image import get_demo_image -from mpl_toolkits.axes_grid.axes_rgb import RGBAxes - -def get_rgb(): - Z, extent = get_demo_image() - - Z[Z<0] = 0. - Z = Z/Z.max() - - R = Z[:13,:13] - G = Z[2:,2:] - B = Z[:13,2:] - - return R, G, B - - -fig = plt.figure(1) -ax = RGBAxes(fig, [0.1, 0.1, 0.8, 0.8]) - -r, g, b = get_rgb() -kwargs = dict(origin="lower", interpolation="nearest") -ax.imshow_rgb(r, g, b, **kwargs) - -ax.RGB.set_xlim(0., 9.5) -ax.RGB.set_ylim(0.9, 10.6) - - -plt.draw() -plt.show() diff -Nru matplotlib-0.99.3/examples/data/aapl.csv matplotlib-1.0.1/examples/data/aapl.csv --- matplotlib-0.99.3/examples/data/aapl.csv 2009-07-31 15:14:50.000000000 +0000 +++ matplotlib-1.0.1/examples/data/aapl.csv 1970-01-01 00:00:00.000000000 +0000 @@ -1,6082 +0,0 @@ -Date,Open,High,Low,Close,Volume,Adj Close -2008-10-14,116.26,116.40,103.14,104.08,70749800,104.08 -2008-10-13,104.55,110.53,101.02,110.26,54967000,110.26 -2008-10-10,85.70,100.00,85.00,96.80,79260700,96.80 -2008-10-09,93.35,95.80,86.60,88.74,57763700,88.74 -2008-10-08,85.91,96.33,85.68,89.79,78847900,89.79 -2008-10-07,100.48,101.50,88.95,89.16,67099000,89.16 -2008-10-06,91.96,98.78,87.54,98.14,75264900,98.14 -2008-10-03,104.00,106.50,94.65,97.07,81942800,97.07 -2008-10-02,108.01,108.79,100.00,100.10,57477300,100.10 -2008-10-01,111.92,112.36,107.39,109.12,46303000,109.12 -2008-09-30,108.25,115.00,106.30,113.66,58095800,113.66 -2008-09-29,119.62,119.68,100.59,105.26,93581400,105.26 -2008-09-26,124.91,129.80,123.00,128.24,40208700,128.24 -2008-09-25,129.80,134.79,128.52,131.93,35865600,131.93 -2008-09-24,127.27,130.95,125.15,128.71,37393400,128.71 -2008-09-23,131.85,135.80,126.66,126.84,45727300,126.84 -2008-09-22,139.94,140.25,130.66,131.05,30577300,131.05 -2008-09-19,142.60,144.20,136.31,140.91,51102700,140.91 -2008-09-18,130.57,135.43,120.68,134.09,59819300,134.09 -2008-09-17,138.49,138.51,127.83,127.83,42847200,127.83 -2008-09-16,133.86,142.50,132.15,139.88,42804800,139.88 -2008-09-15,142.03,147.69,140.36,140.36,32852600,140.36 -2008-09-12,150.91,150.91,146.50,148.94,28322400,148.94 -2008-09-11,148.18,152.99,146.00,152.65,34666800,152.65 -2008-09-10,152.32,154.99,148.80,151.61,34755100,151.61 -2008-09-09,156.86,159.96,149.79,151.68,44442500,151.68 -2008-09-08,164.57,164.89,151.46,157.92,37356400,157.92 -2008-09-05,158.59,162.40,157.65,160.18,28083800,160.18 -2008-09-04,165.86,167.91,160.81,161.22,26549500,161.22 -2008-09-03,166.84,168.68,164.00,166.96,26244100,166.96 -2008-09-02,172.40,173.50,165.00,166.19,27884400,166.19 -2008-08-29,172.96,173.50,169.04,169.53,21403200,169.53 -2008-08-28,175.28,176.25,172.75,173.74,15394500,173.74 -2008-08-27,173.31,175.76,172.19,174.67,17045900,174.67 -2008-08-26,172.76,174.88,172.61,173.64,15912500,173.64 -2008-08-25,176.15,176.23,171.66,172.55,17300900,172.55 -2008-08-22,175.82,177.50,175.57,176.79,15700400,176.79 -2008-08-21,174.47,175.45,171.89,174.29,19276600,174.29 -2008-08-20,174.77,176.94,173.61,175.84,18105400,175.84 -2008-08-19,174.54,177.07,171.81,173.53,21997000,173.53 -2008-08-18,175.57,177.81,173.82,175.39,19691200,175.39 -2008-08-15,179.04,179.75,175.05,175.74,25294700,175.74 -2008-08-14,178.33,180.45,177.84,179.32,25393200,179.32 -2008-08-13,177.98,180.00,175.90,179.30,30083800,179.30 -2008-08-12,173.52,179.29,173.51,176.73,29867100,176.73 -2008-08-11,170.07,176.50,169.67,173.56,31821100,173.56 -2008-08-08,163.86,169.65,163.75,169.55,25499900,169.55 -2008-08-07,162.71,166.15,161.50,163.57,24013300,163.57 -2008-08-06,159.97,167.40,158.00,164.19,28264600,164.19 -2008-08-05,155.42,160.80,154.82,160.64,24584700,160.64 -2008-08-04,156.60,157.90,152.91,153.23,21161700,153.23 -2008-08-01,159.90,159.99,155.75,156.66,19451400,156.66 -2008-07-31,157.54,162.20,156.98,158.95,22767800,158.95 -2008-07-30,157.78,160.49,156.08,159.88,25899400,159.88 -2008-07-29,155.41,159.45,153.65,157.08,24431100,157.08 -2008-07-28,162.34,162.47,154.02,154.40,27882600,154.40 -2008-07-25,160.40,163.00,158.65,162.12,22629900,162.12 -2008-07-24,164.32,165.26,158.45,159.03,29986400,159.03 -2008-07-23,164.99,168.37,161.56,166.26,37920300,166.26 -2008-07-22,149.00,162.76,146.53,162.02,67128300,162.02 -2008-07-21,166.90,167.50,161.12,166.29,48588200,166.29 -2008-07-18,168.52,169.65,165.00,165.15,31014800,165.15 -2008-07-17,174.10,174.98,171.39,171.81,27054500,171.81 -2008-07-16,170.20,172.93,168.60,172.81,26706800,172.81 -2008-07-15,172.48,173.74,166.39,169.64,37144400,169.64 -2008-07-14,179.24,179.30,173.08,173.88,31644800,173.88 -2008-07-11,175.47,177.11,171.00,172.58,33214700,172.58 -2008-07-10,174.92,177.34,171.37,176.63,30024600,176.63 -2008-07-09,180.20,180.91,174.14,174.25,31992000,174.25 -2008-07-08,175.40,179.70,172.74,179.55,31726800,179.55 -2008-07-07,173.16,177.13,171.90,175.16,29299700,175.16 -2008-07-03,169.59,172.17,165.75,170.12,18691500,170.12 -2008-07-02,175.20,177.45,168.18,168.18,29911400,168.18 -2008-07-01,164.23,174.72,164.00,174.68,39688600,174.68 -2008-06-30,170.19,172.00,166.62,167.44,24435600,167.44 -2008-06-27,166.51,170.57,164.15,170.09,37223200,170.09 -2008-06-26,174.07,174.84,168.01,168.26,31057500,168.26 -2008-06-25,174.61,178.83,173.88,177.39,23016100,177.39 -2008-06-24,172.37,175.78,171.63,173.25,22212400,173.25 -2008-06-23,174.74,175.88,171.56,173.16,23063600,173.16 -2008-06-20,179.35,181.00,175.00,175.27,31727400,175.27 -2008-06-19,178.55,182.34,176.80,180.90,28283900,180.90 -2008-06-18,181.12,182.20,177.35,178.75,28981000,178.75 -2008-06-17,178.10,181.99,177.41,181.43,32130600,181.43 -2008-06-16,171.30,177.90,169.07,176.84,37561800,176.84 -2008-06-13,171.64,174.16,165.31,172.37,48069900,172.37 -2008-06-12,181.49,182.60,171.20,173.26,46726200,173.26 -2008-06-11,184.34,186.00,179.59,180.81,34341100,180.81 -2008-06-10,180.51,186.78,179.02,185.64,40728600,185.64 -2008-06-09,184.79,184.94,175.75,181.61,67442600,181.61 -2008-06-06,188.00,189.95,185.55,185.64,34438700,185.64 -2008-06-05,186.34,189.84,185.70,189.43,26980200,189.43 -2008-06-04,184.02,187.09,183.23,185.19,25963700,185.19 -2008-06-03,186.86,188.20,182.34,185.37,26804300,185.37 -2008-06-02,188.60,189.65,184.53,186.10,24280000,186.10 -2008-05-30,187.45,189.54,187.38,188.75,21792300,188.75 -2008-05-29,186.76,188.20,185.50,186.69,23113800,186.69 -2008-05-28,187.41,187.95,183.72,187.01,26570700,187.01 -2008-05-27,182.75,186.43,181.84,186.43,28210900,186.43 -2008-05-23,180.77,181.99,177.80,181.17,32389900,181.17 -2008-05-22,179.26,181.33,172.00,177.05,43097700,177.05 -2008-05-21,185.67,187.95,176.25,178.19,41344900,178.19 -2008-05-20,181.82,186.16,180.12,185.90,34637500,185.90 -2008-05-19,187.86,188.69,181.30,183.60,33779300,183.60 -2008-05-16,190.11,190.30,187.00,187.62,27348900,187.62 -2008-05-15,186.81,189.90,184.20,189.73,31186000,189.73 -2008-05-14,191.23,192.24,185.57,186.26,32743700,186.26 -2008-05-13,188.61,191.45,187.86,189.96,29401300,189.96 -2008-05-12,185.21,188.87,182.85,188.16,29234400,188.16 -2008-05-09,183.16,184.25,181.37,183.45,24038300,183.45 -2008-05-08,183.77,186.50,183.07,185.06,32110200,185.06 -2008-05-07,186.05,188.20,180.54,182.59,41326200,182.59 -2008-05-06,184.66,187.12,182.18,186.66,32816800,186.66 -2008-05-05,181.92,185.31,181.05,184.73,30519900,184.73 -2008-05-02,180.19,181.92,178.55,180.94,35931500,180.94 -2008-05-01,174.96,180.00,174.86,180.00,32270600,180.00 -2008-04-30,176.19,180.00,172.92,173.95,40697300,173.95 -2008-04-29,171.11,175.66,170.25,175.05,32981300,175.05 -2008-04-28,169.75,173.75,169.13,172.24,28114800,172.24 -2008-04-25,170.70,171.10,166.42,169.73,35445500,169.73 -2008-04-24,165.34,169.98,159.19,168.94,60573800,168.94 -2008-04-23,164.05,164.84,161.08,162.89,53721100,162.89 -2008-04-22,167.40,168.00,158.09,160.20,51413300,160.20 -2008-04-21,162.21,168.50,161.76,168.16,37112600,168.16 -2008-04-18,159.12,162.26,158.38,161.04,36670200,161.04 -2008-04-17,154.17,156.00,153.35,154.49,25152400,154.49 -2008-04-16,151.72,154.10,150.62,153.70,28420500,153.70 -2008-04-15,149.40,149.72,145.72,148.38,24929900,148.38 -2008-04-14,146.77,149.25,144.54,147.78,30181700,147.78 -2008-04-11,152.72,153.30,146.40,147.14,43217000,147.14 -2008-04-10,151.13,155.42,150.60,154.55,34134400,154.55 -2008-04-09,153.31,153.89,150.46,151.44,31192800,151.44 -2008-04-08,153.55,156.45,152.32,152.84,36224800,152.84 -2008-04-07,156.13,159.69,155.11,155.89,41368800,155.89 -2008-04-04,152.19,154.71,150.75,153.08,30514900,153.08 -2008-04-03,147.06,153.63,147.00,151.61,37556000,151.61 -2008-04-02,148.78,151.20,145.85,147.49,37320300,147.49 -2008-04-01,146.30,149.66,143.61,149.53,36877400,149.53 -2008-03-31,143.27,145.71,142.52,143.50,27430900,143.50 -2008-03-28,141.80,144.65,141.60,143.01,25521800,143.01 -2008-03-27,144.95,145.31,139.99,140.25,35708200,140.25 -2008-03-26,140.87,145.74,140.64,145.06,42217300,145.06 -2008-03-25,139.96,143.10,137.33,140.98,37585400,140.98 -2008-03-24,134.01,140.85,133.64,139.53,38104300,139.53 -2008-03-20,131.12,133.29,129.18,133.27,32456700,133.27 -2008-03-19,133.12,134.29,129.67,129.67,36090600,129.67 -2008-03-18,129.18,133.00,128.67,132.82,43040000,132.82 -2008-03-17,122.55,128.59,122.55,126.73,38307100,126.73 -2008-03-14,129.88,130.30,124.20,126.61,41308600,126.61 -2008-03-13,124.10,129.50,123.00,127.94,45075100,127.94 -2008-03-12,127.04,128.68,125.17,126.03,37843900,126.03 -2008-03-11,124.10,127.48,122.00,127.35,41569400,127.35 -2008-03-10,121.98,123.46,119.37,119.69,35699600,119.69 -2008-03-07,120.41,122.98,119.05,122.25,43945100,122.25 -2008-03-06,124.61,127.50,120.81,120.93,52632100,120.93 -2008-03-05,123.58,125.14,122.25,124.49,43637000,124.49 -2008-03-04,121.99,124.88,120.40,124.62,63763700,124.62 -2008-03-03,124.44,125.98,118.00,121.73,56894400,121.73 -2008-02-29,129.29,130.21,124.80,125.02,44838600,125.02 -2008-02-28,127.20,132.20,125.77,129.91,57794800,129.91 -2008-02-27,118.23,123.05,118.09,122.96,52683500,122.96 -2008-02-26,117.64,121.09,115.44,119.15,53746000,119.15 -2008-02-25,118.59,120.17,116.66,119.74,44884800,119.74 -2008-02-22,122.48,122.51,115.87,119.46,54638500,119.46 -2008-02-21,126.05,126.47,120.86,121.54,33504100,121.54 -2008-02-20,122.20,124.60,121.68,123.82,34551400,123.82 -2008-02-19,125.99,126.75,121.44,122.18,35894500,122.18 -2008-02-15,126.27,127.08,124.06,124.63,32189300,124.63 -2008-02-14,129.40,130.80,127.01,127.46,34074900,127.46 -2008-02-13,126.68,129.78,125.63,129.40,34590500,129.40 -2008-02-12,130.70,131.00,123.62,124.86,43785000,124.86 -2008-02-11,128.01,129.98,127.20,129.45,42908300,129.45 -2008-02-08,122.08,125.70,121.60,125.48,48427600,125.48 -2008-02-07,119.97,124.78,117.27,121.24,74404700,121.24 -2008-02-06,130.83,131.92,121.77,122.00,56188300,122.00 -2008-02-05,130.43,134.00,128.90,129.36,40751500,129.36 -2008-02-04,134.21,135.90,131.42,131.65,32115500,131.65 -2008-02-01,136.24,136.59,132.18,133.75,36098000,133.75 -2008-01-31,129.45,136.65,129.40,135.36,48059800,135.36 -2008-01-30,131.37,135.45,130.00,132.18,44394700,132.18 -2008-01-29,131.15,132.79,129.05,131.54,39285100,131.54 -2008-01-28,128.16,133.20,126.45,130.01,52673000,130.01 -2008-01-25,138.99,139.09,129.61,130.01,55526400,130.01 -2008-01-24,139.99,140.70,132.01,135.60,71638100,135.60 -2008-01-23,136.19,140.00,126.14,139.07,120463200,139.07 -2008-01-22,148.06,159.98,146.00,155.64,86955500,155.64 -2008-01-18,161.71,165.75,159.61,161.36,61583700,161.36 -2008-01-17,161.51,165.36,158.42,160.89,62780700,160.89 -2008-01-16,165.23,169.01,156.70,159.64,79065900,159.64 -2008-01-15,177.72,179.22,164.66,169.04,83688500,169.04 -2008-01-14,177.52,179.42,175.17,178.78,39301800,178.78 -2008-01-11,176.00,177.85,170.00,172.69,44010200,172.69 -2008-01-10,177.58,181.00,175.41,178.02,52963400,178.02 -2008-01-09,171.30,179.50,168.30,179.40,64781500,179.40 -2008-01-08,180.14,182.46,170.80,171.25,54422000,171.25 -2008-01-07,181.25,183.60,170.23,177.64,74006900,177.64 -2008-01-04,191.45,193.00,178.89,180.05,51994000,180.05 -2008-01-03,195.41,197.39,192.69,194.93,30073800,194.93 -2008-01-02,199.27,200.26,192.55,194.84,38542100,194.84 -2007-12-31,199.50,200.50,197.75,198.08,19261900,198.08 -2007-12-28,200.59,201.56,196.88,199.83,24987400,199.83 -2007-12-27,198.95,202.96,197.80,198.57,28411700,198.57 -2007-12-26,199.01,200.96,196.82,198.95,25133300,198.95 -2007-12-24,195.03,199.33,194.79,198.80,17150100,198.80 -2007-12-21,190.12,193.91,189.89,193.91,35498600,193.91 -2007-12-20,185.43,187.83,183.33,187.21,27644900,187.21 -2007-12-19,182.98,184.64,180.90,183.12,29552800,183.12 -2007-12-18,186.52,187.33,178.60,182.98,43664400,182.98 -2007-12-17,190.72,192.65,182.98,184.40,36596200,184.40 -2007-12-14,190.37,193.20,189.54,190.39,24082600,190.39 -2007-12-13,190.19,192.12,187.82,191.83,30879200,191.83 -2007-12-12,193.44,194.48,185.76,190.86,43773600,190.86 -2007-12-11,194.75,196.83,187.39,188.54,39675900,188.54 -2007-12-10,193.59,195.66,192.69,194.21,25799200,194.21 -2007-12-07,190.54,194.99,188.04,194.30,38073800,194.30 -2007-12-06,186.19,190.10,186.12,189.95,32136100,189.95 -2007-12-05,182.89,186.00,182.41,185.50,31871500,185.50 -2007-12-04,177.15,180.90,176.99,179.81,27635700,179.81 -2007-12-03,181.86,184.14,177.70,178.86,34338200,178.86 -2007-11-30,187.34,187.70,179.70,182.22,42421500,182.22 -2007-11-29,179.43,185.17,179.15,184.29,37533100,184.29 -2007-11-28,176.82,180.60,175.35,180.22,41104000,180.22 -2007-11-27,175.22,175.79,170.01,174.81,47036800,174.81 -2007-11-26,173.59,177.27,172.35,172.54,46634100,172.54 -2007-11-23,172.00,172.05,169.75,171.54,16634200,171.54 -2007-11-21,165.84,172.35,164.67,168.46,43493200,168.46 -2007-11-20,165.67,171.79,163.53,168.85,55130100,168.85 -2007-11-19,166.10,168.20,162.10,163.95,41196800,163.95 -2007-11-16,165.30,167.02,159.33,166.39,49391300,166.39 -2007-11-15,166.39,169.59,160.30,164.30,53095600,164.30 -2007-11-14,177.16,177.57,163.74,166.11,51695400,166.11 -2007-11-13,160.85,170.98,153.76,169.96,62034100,169.96 -2007-11-12,165.28,167.70,150.63,153.76,63057700,153.76 -2007-11-09,171.15,175.12,165.21,165.37,54458700,165.37 -2007-11-08,186.67,186.90,167.77,175.47,67458500,175.47 -2007-11-07,190.61,192.68,186.13,186.30,35473400,186.30 -2007-11-06,187.05,192.00,185.27,191.79,34097400,191.79 -2007-11-05,185.29,188.96,184.24,186.18,28720600,186.18 -2007-11-02,189.21,189.44,183.49,187.87,35789800,187.87 -2007-11-01,188.60,190.10,180.00,187.44,28751300,187.44 -2007-10-31,187.63,190.12,184.95,189.95,29761100,189.95 -2007-10-30,186.18,189.37,184.73,187.00,33550500,187.00 -2007-10-29,185.45,186.59,184.70,185.09,19305500,185.09 -2007-10-26,185.29,185.37,182.88,184.70,25219800,184.70 -2007-10-25,184.87,185.90,181.66,182.78,34771500,182.78 -2007-10-24,185.81,187.21,179.24,185.93,46017200,185.93 -2007-10-23,188.56,188.60,182.76,186.16,64113000,186.16 -2007-10-22,170.35,174.90,169.96,174.36,58910700,174.36 -2007-10-19,174.24,174.63,170.00,170.42,46135000,170.42 -2007-10-18,171.50,174.19,171.05,173.50,29417000,173.50 -2007-10-17,172.69,173.04,169.18,172.75,40271900,172.75 -2007-10-16,165.54,170.18,165.15,169.58,38136800,169.58 -2007-10-15,167.98,169.57,163.50,166.98,38497500,166.98 -2007-10-12,163.01,167.28,161.80,167.25,35292000,167.25 -2007-10-11,169.49,171.88,153.21,162.23,58714000,162.23 -2007-10-10,167.55,167.88,165.60,166.79,23842500,166.79 -2007-10-09,170.20,171.11,166.68,167.86,39438800,167.86 -2007-10-08,163.49,167.91,162.97,167.91,29854600,167.91 -2007-10-05,158.37,161.58,157.70,161.45,33695400,161.45 -2007-10-04,158.00,158.08,153.50,156.24,23462800,156.24 -2007-10-03,157.78,159.18,157.01,157.92,24732800,157.92 -2007-10-02,156.55,158.59,155.89,158.45,28288200,158.45 -2007-10-01,154.63,157.41,152.93,156.34,29895300,156.34 -2007-09-28,153.44,154.60,152.75,153.47,21967900,153.47 -2007-09-27,153.77,154.52,152.32,154.50,23507100,154.50 -2007-09-26,154.47,155.00,151.25,152.77,34831000,152.77 -2007-09-25,146.84,153.22,146.82,153.18,42591100,153.18 -2007-09-24,146.73,149.85,146.65,148.28,37577200,148.28 -2007-09-21,141.14,144.65,140.31,144.15,40674300,144.15 -2007-09-20,140.15,141.79,139.32,140.31,24708600,140.31 -2007-09-19,143.02,143.16,139.40,140.77,36674300,140.77 -2007-09-18,139.06,142.85,137.83,140.92,38003200,140.92 -2007-09-17,138.99,140.59,137.60,138.41,28334700,138.41 -2007-09-14,136.57,138.98,136.20,138.81,21690000,138.81 -2007-09-13,138.83,139.00,136.65,137.20,23434400,137.20 -2007-09-12,135.99,139.40,135.75,136.85,36527500,136.85 -2007-09-11,137.90,138.30,133.75,135.49,34710200,135.49 -2007-09-10,136.99,138.04,133.95,136.71,53137100,136.71 -2007-09-07,132.01,132.30,130.00,131.77,51092000,131.77 -2007-09-06,135.56,137.57,132.71,135.01,67902200,135.01 -2007-09-05,144.97,145.84,136.10,136.76,83150800,136.76 -2007-09-04,139.94,145.73,139.84,144.16,47030100,144.16 -2007-08-31,139.49,139.65,137.41,138.48,31317400,138.48 -2007-08-30,132.67,138.25,132.30,136.25,51270800,136.25 -2007-08-29,129.88,134.18,129.54,134.08,41673600,134.08 -2007-08-28,130.99,132.41,126.63,126.82,42120200,126.82 -2007-08-27,133.39,134.66,132.10,132.25,25265700,132.25 -2007-08-24,130.53,135.37,129.81,135.30,32565500,135.30 -2007-08-23,133.09,133.34,129.76,131.07,30958500,131.07 -2007-08-22,131.22,132.75,130.33,132.51,37920200,132.51 -2007-08-21,122.21,128.96,121.00,127.57,46537400,127.57 -2007-08-20,123.96,124.50,120.50,122.22,28689900,122.22 -2007-08-17,122.01,123.50,119.82,122.06,42680800,122.06 -2007-08-16,117.01,118.50,111.62,117.05,66667500,117.05 -2007-08-15,122.74,124.86,119.65,119.90,35459000,119.90 -2007-08-14,128.29,128.30,123.71,124.03,26393100,124.03 -2007-08-13,128.32,129.35,126.50,127.79,26889700,127.79 -2007-08-10,123.12,127.75,120.30,125.00,50383900,125.00 -2007-08-09,131.11,133.00,125.09,126.39,40192700,126.39 -2007-08-08,136.76,136.86,132.00,134.01,28860600,134.01 -2007-08-07,134.94,137.24,132.63,135.03,33926300,135.03 -2007-08-06,132.90,135.27,128.30,135.25,33041800,135.25 -2007-08-03,135.26,135.95,131.50,131.85,24256700,131.85 -2007-08-02,136.65,136.96,134.15,136.49,30451600,136.49 -2007-08-01,133.64,135.38,127.77,135.00,62505600,135.00 -2007-07-31,142.97,143.48,131.52,131.76,62942600,131.76 -2007-07-30,144.33,145.45,139.57,141.43,39535300,141.43 -2007-07-27,146.19,148.92,143.78,143.85,41467800,143.85 -2007-07-26,145.91,148.50,136.96,146.00,78093900,146.00 -2007-07-25,137.35,138.36,135.00,137.26,53435100,137.26 -2007-07-24,138.88,141.00,134.15,134.89,64117600,134.89 -2007-07-23,143.31,145.22,140.93,143.70,37017500,143.70 -2007-07-20,141.65,144.18,140.00,143.75,41706200,143.75 -2007-07-19,140.30,140.81,139.65,140.00,26174700,140.00 -2007-07-18,138.19,138.44,136.04,138.12,27030600,138.12 -2007-07-17,138.30,139.60,137.50,138.91,25355700,138.91 -2007-07-16,138.39,139.98,137.50,138.10,33432600,138.10 -2007-07-13,135.03,137.85,134.52,137.73,32414500,137.73 -2007-07-12,133.85,134.24,132.39,134.07,25164600,134.07 -2007-07-11,132.07,133.70,131.31,132.39,29349000,132.39 -2007-07-10,128.88,134.50,128.81,132.35,44821700,132.35 -2007-07-09,132.38,132.90,129.18,130.33,35565000,130.33 -2007-07-06,133.13,133.34,130.40,132.30,31239100,132.30 -2007-07-05,128.80,132.97,128.69,132.75,51894700,132.75 -2007-07-03,122.00,127.40,121.50,127.17,41517200,127.17 -2007-07-02,121.05,122.09,119.30,121.26,35530800,121.26 -2007-06-29,121.97,124.00,121.09,122.04,40637200,122.04 -2007-06-28,122.36,122.49,120.00,120.56,29933700,120.56 -2007-06-27,120.61,122.04,119.26,121.89,34810600,121.89 -2007-06-26,123.98,124.00,118.72,119.65,48035900,119.65 -2007-06-25,124.19,125.09,121.06,122.34,34478700,122.34 -2007-06-22,123.85,124.45,122.38,123.00,22567000,123.00 -2007-06-21,121.70,124.29,120.72,123.90,30965900,123.90 -2007-06-20,123.87,124.66,121.50,121.55,32054000,121.55 -2007-06-19,124.69,125.01,122.91,123.66,33679500,123.66 -2007-06-18,123.28,125.18,122.54,125.09,32521600,125.09 -2007-06-15,120.62,120.67,119.86,120.50,28972100,120.50 -2007-06-14,117.20,119.45,116.42,118.75,34759500,118.75 -2007-06-13,121.15,121.19,115.40,117.50,61476900,117.50 -2007-06-12,119.35,121.71,118.31,120.38,50948800,120.38 -2007-06-11,126.00,126.15,119.54,120.19,66937800,120.19 -2007-06-08,125.82,125.83,122.29,124.49,44345800,124.49 -2007-06-07,124.99,127.61,123.19,124.07,68395700,124.07 -2007-06-06,122.30,124.05,121.95,123.64,39722900,123.64 -2007-06-05,121.41,122.69,120.50,122.67,32885200,122.67 -2007-06-04,118.63,121.73,117.90,121.33,31666900,121.33 -2007-06-01,121.10,121.19,118.29,118.40,31616500,118.40 -2007-05-31,120.07,122.17,119.54,121.19,46323800,121.19 -2007-05-30,114.30,118.88,113.53,118.77,52801600,118.77 -2007-05-29,114.45,114.86,112.69,114.35,23060500,114.35 -2007-05-25,112.00,113.78,111.50,113.62,22605700,113.62 -2007-05-24,112.81,114.46,110.37,110.69,31691500,110.69 -2007-05-23,114.02,115.00,112.59,112.89,32549100,112.89 -2007-05-22,112.49,113.75,112.01,113.54,20443200,113.54 -2007-05-21,110.31,112.45,110.05,111.98,22853300,111.98 -2007-05-18,110.23,110.64,109.77,110.02,22190900,110.02 -2007-05-17,107.15,109.87,107.15,109.44,26260400,109.44 -2007-05-16,108.53,108.83,103.42,107.34,40241700,107.34 -2007-05-15,109.57,110.20,106.48,107.52,34089800,107.52 -2007-05-14,109.62,110.00,108.25,109.36,23283800,109.36 -2007-05-11,107.74,109.13,106.78,108.74,23346300,108.74 -2007-05-10,106.63,108.84,105.92,107.34,42759200,107.34 -2007-05-09,104.91,106.96,104.89,106.88,25634200,106.88 -2007-05-08,103.47,105.15,103.42,105.06,27999900,105.06 -2007-05-07,101.08,104.35,101.01,103.92,30769900,103.92 -2007-05-04,100.80,101.60,100.50,100.81,13642400,100.81 -2007-05-03,100.73,101.45,100.01,100.40,20574200,100.40 -2007-05-02,99.65,100.54,99.47,100.39,18040900,100.39 -2007-05-01,99.59,100.35,98.55,99.47,19018700,99.47 -2007-04-30,100.09,101.00,99.67,99.80,22018200,99.80 -2007-04-27,98.18,99.95,97.69,99.92,24978700,99.92 -2007-04-26,101.58,102.50,98.30,98.84,62063500,98.84 -2007-04-25,94.23,95.40,93.80,95.35,42398000,95.35 -2007-04-24,93.96,96.39,91.30,93.24,37687600,93.24 -2007-04-23,91.59,93.80,91.42,93.51,27867500,93.51 -2007-04-20,90.89,91.18,90.55,90.97,18670700,90.97 -2007-04-19,90.19,91.25,89.83,90.27,15211200,90.27 -2007-04-18,90.16,90.85,89.60,90.40,16573000,90.40 -2007-04-17,92.00,92.30,89.70,90.35,26854300,90.35 -2007-04-16,90.57,91.50,90.25,91.43,21751200,91.43 -2007-04-13,90.90,91.40,90.06,90.24,25712200,90.24 -2007-04-12,92.04,92.31,90.72,92.19,23452700,92.19 -2007-04-11,93.90,93.95,92.33,92.59,19607800,92.59 -2007-04-10,93.67,94.26,93.41,94.25,12588100,94.25 -2007-04-09,95.21,95.30,93.04,93.65,14762200,93.65 -2007-04-05,94.12,94.68,93.52,94.68,12697000,94.68 -2007-04-04,94.94,95.14,94.13,94.27,17028000,94.27 -2007-04-03,94.14,95.23,93.76,94.50,20854800,94.50 -2007-04-02,94.14,94.25,93.02,93.65,17928300,93.65 -2007-03-30,94.28,94.68,92.75,92.91,21448500,92.91 -2007-03-29,94.19,94.19,92.23,93.75,25918700,93.75 -2007-03-28,94.88,95.40,93.15,93.24,33654900,93.24 -2007-03-27,95.71,96.83,95.00,95.46,33287600,95.46 -2007-03-26,93.99,95.90,93.30,95.85,30892400,95.85 -2007-03-23,93.35,94.07,93.30,93.52,16103000,93.52 -2007-03-22,93.73,94.36,93.00,93.96,20053300,93.96 -2007-03-21,91.99,94.00,91.65,93.87,24532000,93.87 -2007-03-20,91.35,91.84,91.06,91.48,17461300,91.48 -2007-03-19,90.24,91.55,89.59,91.13,25462900,91.13 -2007-03-16,89.54,89.99,89.32,89.59,20418000,89.59 -2007-03-15,89.96,90.36,89.31,89.57,19982100,89.57 -2007-03-14,88.60,90.00,87.92,90.00,28449500,90.00 -2007-03-13,89.41,90.60,88.40,88.40,30996100,88.40 -2007-03-12,88.07,89.99,87.99,89.87,26050300,89.87 -2007-03-09,88.80,88.85,87.40,87.97,16137000,87.97 -2007-03-08,88.59,88.72,87.46,88.00,18250400,88.00 -2007-03-07,88.05,88.97,87.45,87.72,22367300,87.72 -2007-03-06,87.80,88.31,87.40,88.19,25828100,88.19 -2007-03-05,85.89,88.65,85.76,86.32,29960700,86.32 -2007-03-02,86.77,87.54,85.21,85.41,30714300,85.41 -2007-03-01,84.03,88.31,83.75,87.06,50554600,87.06 -2007-02-28,83.00,85.60,83.00,84.61,32838400,84.61 -2007-02-27,86.30,87.08,83.41,83.93,40921900,83.93 -2007-02-26,89.84,90.00,87.61,88.51,21994600,88.51 -2007-02-23,89.16,90.34,88.85,89.07,18496200,89.07 -2007-02-22,90.80,90.81,88.53,89.51,29936600,89.51 -2007-02-21,85.98,89.49,85.96,89.20,41261200,89.20 -2007-02-20,84.65,86.16,84.16,85.90,22060800,85.90 -2007-02-16,85.25,85.41,84.66,84.83,14281000,84.83 -2007-02-15,85.44,85.62,84.78,85.21,12987900,85.21 -2007-02-14,84.63,85.64,84.57,85.30,18142200,85.30 -2007-02-13,85.16,85.29,84.30,84.70,20749500,84.70 -2007-02-12,84.43,85.18,83.63,84.88,25859700,84.88 -2007-02-09,85.88,86.20,83.21,83.27,30733600,83.27 -2007-02-08,85.43,86.51,85.41,86.18,24251100,86.18 -2007-02-07,84.48,86.38,83.55,86.15,38100900,86.15 -2007-02-06,84.45,84.47,82.86,84.15,30871200,84.15 -2007-02-05,84.30,85.23,83.94,83.94,20673300,83.94 -2007-02-02,84.12,85.25,83.70,84.75,22197500,84.75 -2007-02-01,86.23,86.27,84.74,84.74,23726500,84.74 -2007-01-31,84.86,86.00,84.35,85.73,30573900,85.73 -2007-01-30,86.43,86.49,85.25,85.55,20641800,85.55 -2007-01-29,86.30,86.65,85.53,85.94,32202300,85.94 -2007-01-26,87.11,87.37,84.99,85.38,35245500,85.38 -2007-01-25,87.11,88.50,86.03,86.25,32356200,86.25 -2007-01-24,86.68,87.15,86.08,86.70,33136200,86.70 -2007-01-23,85.73,87.51,85.51,85.70,43122300,85.70 -2007-01-22,89.14,89.16,85.65,86.79,51929500,86.79 -2007-01-19,88.63,89.65,88.12,88.50,48731200,88.50 -2007-01-18,92.10,92.11,89.05,89.07,84450200,89.07 -2007-01-17,97.56,97.60,94.82,94.95,58795000,94.95 -2007-01-16,95.68,97.25,95.45,97.10,44431300,97.10 -2007-01-12,94.59,95.06,93.23,94.62,46881800,94.62 -2007-01-11,95.94,96.78,95.10,95.80,51437600,95.80 -2007-01-10,94.75,97.80,93.45,97.00,105460000,97.00 -2007-01-09,86.45,92.98,85.15,92.57,119617800,92.57 -2007-01-08,85.96,86.53,85.28,85.47,28468100,85.47 -2007-01-05,85.77,86.20,84.40,85.05,29812200,85.05 -2007-01-04,84.05,85.95,83.82,85.66,30259300,85.66 -2007-01-03,86.29,86.58,81.90,83.80,44225700,83.80 -2006-12-29,83.95,85.40,83.36,84.84,38443900,84.84 -2006-12-28,80.22,81.25,79.65,80.87,39995600,80.87 -2006-12-27,78.15,82.00,76.77,81.52,69134100,81.52 -2006-12-26,82.15,82.57,80.89,81.51,17524600,81.51 -2006-12-22,83.46,84.04,81.60,82.20,21903700,82.20 -2006-12-21,84.70,85.48,82.20,82.90,32271400,82.90 -2006-12-20,86.47,86.67,84.74,84.76,20274700,84.76 -2006-12-19,84.73,86.68,83.62,86.31,32550200,86.31 -2006-12-18,87.63,88.00,84.59,85.47,25770600,85.47 -2006-12-15,89.02,89.22,87.33,87.72,26426400,87.72 -2006-12-14,89.05,90.00,88.26,88.55,29726100,88.55 -2006-12-13,87.95,89.07,87.15,89.05,30609000,89.05 -2006-12-12,88.61,88.84,85.53,86.14,36665000,86.14 -2006-12-11,88.90,89.30,88.05,88.75,17849300,88.75 -2006-12-08,87.23,89.39,87.00,88.26,28009900,88.26 -2006-12-07,90.03,90.50,86.90,87.04,35886700,87.04 -2006-12-06,90.64,91.39,89.67,89.83,22792300,89.83 -2006-12-05,91.65,92.33,90.87,91.27,23672800,91.27 -2006-12-04,91.88,92.05,90.50,91.12,25340600,91.12 -2006-12-01,91.80,92.33,90.10,91.32,28395700,91.32 -2006-11-30,92.21,92.68,91.06,91.66,31088800,91.66 -2006-11-29,93.00,93.15,90.25,91.80,41324400,91.80 -2006-11-28,90.36,91.97,89.91,91.81,37006200,91.81 -2006-11-27,92.51,93.16,89.50,89.54,38387000,89.54 -2006-11-24,89.53,93.08,89.50,91.63,18524200,91.63 -2006-11-22,88.99,90.75,87.85,90.31,23997900,90.31 -2006-11-21,87.42,88.60,87.11,88.60,22238100,88.60 -2006-11-20,85.40,87.00,85.20,86.47,20385500,86.47 -2006-11-17,85.14,85.94,85.00,85.85,16658000,85.85 -2006-11-16,84.87,86.30,84.62,85.61,24783600,85.61 -2006-11-15,85.05,85.90,84.00,84.05,23404400,84.05 -2006-11-14,84.80,85.00,83.90,85.00,21034100,85.00 -2006-11-13,83.22,84.45,82.64,84.35,16095500,84.35 -2006-11-10,83.55,83.60,82.50,83.12,13352300,83.12 -2006-11-09,82.90,84.69,82.12,83.34,32966200,83.34 -2006-11-08,80.02,82.69,79.89,82.45,24675600,82.45 -2006-11-07,80.45,81.00,80.13,80.51,18783300,80.51 -2006-11-06,78.95,80.06,78.43,79.71,15520600,79.71 -2006-11-03,79.36,79.53,77.79,78.29,15424600,78.29 -2006-11-02,78.92,79.32,78.50,78.98,16624400,78.98 -2006-11-01,81.10,81.38,78.36,79.16,21828300,79.16 -2006-10-31,81.45,81.68,80.23,81.08,17909800,81.08 -2006-10-30,79.99,80.90,79.50,80.42,17854200,80.42 -2006-10-27,81.75,82.45,80.01,80.41,21248800,80.41 -2006-10-26,81.90,82.60,81.13,82.19,15455600,82.19 -2006-10-25,81.35,82.00,81.01,81.68,17329100,81.68 -2006-10-24,81.21,81.68,80.20,81.05,16543300,81.05 -2006-10-23,79.99,81.90,79.75,81.46,29732400,81.46 -2006-10-20,78.97,79.99,78.67,79.95,22836200,79.95 -2006-10-19,79.26,79.95,78.16,78.99,54034900,78.99 -2006-10-18,74.75,75.37,73.91,74.53,40496700,74.53 -2006-10-17,75.04,75.27,74.04,74.29,17175900,74.29 -2006-10-16,75.19,75.88,74.79,75.40,18167600,75.40 -2006-10-13,75.63,76.88,74.74,75.02,24435600,75.02 -2006-10-12,73.61,75.39,73.60,75.26,21173400,75.26 -2006-10-11,73.42,73.98,72.60,73.23,20423400,73.23 -2006-10-10,74.54,74.58,73.08,73.81,18985300,73.81 -2006-10-09,73.80,75.08,73.53,74.63,15650800,74.63 -2006-10-06,74.42,75.04,73.81,74.22,16677100,74.22 -2006-10-05,74.53,76.16,74.13,74.83,24424400,74.83 -2006-10-04,74.10,75.46,73.16,75.38,29610100,75.38 -2006-10-03,74.45,74.95,73.19,74.08,28239600,74.08 -2006-10-02,75.10,75.87,74.30,74.86,25451400,74.86 -2006-09-29,77.11,77.52,76.68,76.98,14493300,76.98 -2006-09-28,77.02,77.48,75.95,77.01,25843200,77.01 -2006-09-27,77.17,77.47,75.82,76.41,28941900,76.41 -2006-09-26,76.18,77.78,76.10,77.61,39391000,77.61 -2006-09-25,73.81,75.86,73.72,75.75,30678300,75.75 -2006-09-22,74.30,74.34,72.58,73.00,23754000,73.00 -2006-09-21,75.25,76.06,74.02,74.65,28361600,74.65 -2006-09-20,74.38,75.68,74.22,75.26,29385400,75.26 -2006-09-19,74.10,74.36,72.80,73.77,25358900,73.77 -2006-09-18,73.80,74.86,73.30,73.89,25188500,73.89 -2006-09-15,74.60,74.98,73.29,74.10,35066200,74.10 -2006-09-14,73.72,74.67,73.46,74.17,28633200,74.17 -2006-09-13,72.85,74.32,72.30,74.20,40933500,74.20 -2006-09-12,72.81,73.45,71.45,72.63,60167400,72.63 -2006-09-11,72.43,73.73,71.42,72.50,33897300,72.50 -2006-09-08,73.37,73.57,71.91,72.52,31997200,72.52 -2006-09-07,70.60,73.48,70.25,72.80,45284200,72.80 -2006-09-06,71.08,71.69,69.70,70.03,34789400,70.03 -2006-09-05,68.97,71.50,68.55,71.48,36159200,71.48 -2006-09-01,68.48,68.65,67.82,68.38,14589100,68.38 -2006-08-31,67.28,68.30,66.66,67.85,20524900,67.85 -2006-08-30,67.34,67.82,66.68,66.96,24290800,66.96 -2006-08-29,66.99,67.26,65.12,66.48,33833300,66.48 -2006-08-28,68.50,68.61,66.68,66.98,26362900,66.98 -2006-08-25,67.34,69.05,67.31,68.75,19427100,68.75 -2006-08-24,67.89,68.19,66.27,67.81,23399700,67.81 -2006-08-23,68.00,68.65,66.94,67.31,19152100,67.31 -2006-08-22,66.68,68.32,66.50,67.62,20606000,67.62 -2006-08-21,67.30,67.31,66.15,66.56,18793800,66.56 -2006-08-18,67.71,68.40,67.26,67.91,19155500,67.91 -2006-08-17,68.00,68.66,67.18,67.59,20755300,67.59 -2006-08-16,67.10,68.07,66.33,67.98,27903000,67.98 -2006-08-15,65.34,66.50,64.80,66.45,30762600,66.45 -2006-08-14,64.05,65.22,63.60,63.94,25629300,63.94 -2006-08-11,63.23,64.13,62.58,63.65,27768900,63.65 -2006-08-10,63.25,64.81,62.70,64.07,24920000,64.07 -2006-08-09,65.43,65.60,63.40,63.59,34137100,63.59 -2006-08-08,67.09,67.11,64.51,64.78,35638000,64.78 -2006-08-07,67.72,69.60,66.31,67.21,44482600,67.21 -2006-08-04,67.05,68.61,64.96,68.30,66173800,68.30 -2006-08-03,67.91,70.00,67.81,69.59,30037300,69.59 -2006-08-02,67.65,68.68,67.51,68.16,19670300,68.16 -2006-08-01,67.22,67.93,65.94,67.18,25420200,67.18 -2006-07-31,66.83,68.63,66.28,67.96,31887200,67.96 -2006-07-28,63.94,65.68,63.50,65.59,24696700,65.59 -2006-07-27,64.50,65.02,62.86,63.40,26251600,63.40 -2006-07-26,62.00,64.64,61.68,63.87,32086700,63.87 -2006-07-25,61.78,62.09,60.78,61.93,21038200,61.93 -2006-07-24,61.26,62.10,60.43,61.42,25816300,61.42 -2006-07-21,59.82,61.15,59.64,60.72,31853300,60.72 -2006-07-20,60.96,61.59,59.72,60.50,70433800,60.50 -2006-07-19,52.96,55.08,52.36,54.10,49669400,54.10 -2006-07-18,53.16,53.85,51.85,52.90,35730300,52.90 -2006-07-17,51.73,53.11,51.65,52.37,36590800,52.37 -2006-07-14,52.50,52.89,50.16,50.67,35465600,50.67 -2006-07-13,52.03,54.12,51.41,52.25,44639500,52.25 -2006-07-12,55.17,55.24,52.92,52.96,33118900,52.96 -2006-07-11,55.11,55.99,54.53,55.65,29465100,55.65 -2006-07-10,55.70,56.49,54.50,55.00,18905200,55.00 -2006-07-07,55.48,56.55,54.67,55.40,28548600,55.40 -2006-07-06,57.09,57.40,55.61,55.77,22614600,55.77 -2006-07-05,57.15,57.60,56.56,57.00,18508600,57.00 -2006-07-03,57.52,58.18,57.34,57.95,6956100,57.95 -2006-06-30,57.59,57.75,56.50,57.27,26417700,57.27 -2006-06-29,56.76,59.09,56.39,58.97,31192800,58.97 -2006-06-28,57.29,57.30,55.41,56.02,30382300,56.02 -2006-06-27,59.09,59.22,57.40,57.43,19664700,57.43 -2006-06-26,59.17,59.20,58.37,58.99,16662000,58.99 -2006-06-23,59.72,60.17,58.73,58.83,23578700,58.83 -2006-06-22,58.20,59.75,58.07,59.58,34486900,59.58 -2006-06-21,57.74,58.71,57.30,57.86,30832000,57.86 -2006-06-20,57.61,58.35,57.29,57.47,24034800,57.47 -2006-06-19,57.83,58.18,57.00,57.20,25163400,57.20 -2006-06-16,58.96,59.19,57.52,57.56,29932200,57.56 -2006-06-15,57.30,59.74,56.75,59.38,42513700,59.38 -2006-06-14,58.28,58.78,56.69,57.61,31362000,57.61 -2006-06-13,57.61,59.10,57.36,58.33,38594400,58.33 -2006-06-12,59.40,59.73,56.96,57.00,25635200,57.00 -2006-06-09,61.18,61.56,59.10,59.24,27708500,59.24 -2006-06-08,58.44,60.93,57.15,60.76,49910100,60.76 -2006-06-07,60.10,60.40,58.35,58.56,26803800,58.56 -2006-06-06,60.22,60.63,58.91,59.72,25929900,59.72 -2006-06-05,61.15,61.15,59.97,60.00,21635200,60.00 -2006-06-02,62.99,63.10,60.88,61.66,24492400,61.66 -2006-06-01,59.85,62.28,59.52,62.17,33661000,62.17 -2006-05-31,61.76,61.79,58.69,59.77,45749200,59.77 -2006-05-30,63.29,63.30,61.22,61.22,20121500,61.22 -2006-05-26,64.31,64.56,63.14,63.55,15462500,63.55 -2006-05-25,64.26,64.45,63.29,64.33,16549000,64.33 -2006-05-24,62.99,63.65,61.56,63.34,32715400,63.34 -2006-05-23,64.86,65.19,63.00,63.15,24800500,63.15 -2006-05-22,63.87,63.99,62.77,63.38,25677700,63.38 -2006-05-19,63.26,64.88,62.82,64.51,35209500,64.51 -2006-05-18,65.68,66.26,63.12,63.18,23515800,63.18 -2006-05-17,64.71,65.70,64.07,65.26,26935500,65.26 -2006-05-16,68.10,68.25,64.75,64.98,33455000,64.98 -2006-05-15,67.37,68.38,67.12,67.79,18899200,67.79 -2006-05-12,67.85,68.69,66.86,67.70,22920500,67.70 -2006-05-11,70.79,70.84,67.55,68.15,29024600,68.15 -2006-05-10,71.29,71.33,69.61,70.60,16424600,70.60 -2006-05-09,71.82,72.56,70.62,71.03,18988100,71.03 -2006-05-08,72.99,73.80,71.72,71.89,21244700,71.89 -2006-05-05,71.86,72.25,71.15,71.89,20139700,71.89 -2006-05-04,71.22,72.89,70.46,71.13,30729300,71.13 -2006-05-03,71.83,71.95,70.18,71.14,24535400,71.14 -2006-05-02,70.15,71.98,70.11,71.62,27559400,71.62 -2006-05-01,70.77,71.54,69.16,69.60,26799300,69.60 -2006-04-28,69.38,71.30,69.20,70.39,27144200,70.39 -2006-04-27,67.73,69.86,67.35,69.36,30212400,69.36 -2006-04-26,66.65,68.28,66.40,68.15,25388800,68.15 -2006-04-25,65.96,66.59,65.56,66.17,18895100,66.17 -2006-04-24,66.85,66.92,65.50,65.75,25251000,65.75 -2006-04-21,68.19,68.64,66.47,67.04,28178100,67.04 -2006-04-20,69.51,70.00,66.20,67.63,59535100,67.63 -2006-04-19,66.82,67.00,65.47,65.65,38786900,65.65 -2006-04-18,65.04,66.47,64.79,66.22,28387300,66.22 -2006-04-17,66.51,66.84,64.35,64.81,25783500,64.81 -2006-04-13,66.34,67.44,65.81,66.47,26238500,66.47 -2006-04-12,68.01,68.17,66.30,66.71,26424800,66.71 -2006-04-11,68.99,69.30,67.07,67.99,33547000,67.99 -2006-04-10,70.29,70.93,68.45,68.67,32268400,68.67 -2006-04-07,70.93,71.21,68.47,69.79,55187100,69.79 -2006-04-06,68.30,72.05,68.20,71.24,95134600,71.24 -2006-04-05,64.71,67.21,64.15,67.21,79764600,67.21 -2006-04-04,62.10,62.22,61.05,61.17,33283000,61.17 -2006-04-03,63.67,64.12,62.61,62.65,29135400,62.65 -2006-03-31,63.25,63.61,62.24,62.72,29119900,62.72 -2006-03-30,62.82,63.30,61.53,62.75,49666100,62.75 -2006-03-29,59.13,62.52,57.67,62.33,83815500,62.33 -2006-03-28,59.63,60.14,58.25,58.71,48940100,58.71 -2006-03-27,60.35,61.38,59.40,59.51,39574000,59.51 -2006-03-24,60.25,60.94,59.03,59.96,38285000,59.96 -2006-03-23,61.82,61.90,59.61,60.16,50993800,60.16 -2006-03-22,62.16,63.25,61.27,61.67,48067700,61.67 -2006-03-21,64.29,64.34,61.39,61.81,47991700,61.81 -2006-03-20,65.22,65.46,63.87,63.99,21622900,63.99 -2006-03-17,64.75,65.54,64.11,64.66,29001500,64.66 -2006-03-16,66.85,66.90,64.30,64.31,26772800,64.31 -2006-03-15,67.71,68.04,65.52,66.23,31857000,66.23 -2006-03-14,65.77,67.32,65.50,67.32,22929300,67.32 -2006-03-13,65.05,66.28,64.79,65.68,30756700,65.68 -2006-03-10,64.05,64.49,62.45,63.19,37255100,63.19 -2006-03-09,65.98,66.47,63.81,63.93,28546600,63.93 -2006-03-08,66.29,67.20,65.35,65.66,23330400,65.66 -2006-03-07,65.76,66.90,65.08,66.31,31174200,66.31 -2006-03-06,67.69,67.72,64.94,65.48,32595200,65.48 -2006-03-03,69.40,69.91,67.53,67.72,26345300,67.72 -2006-03-02,68.99,69.99,68.67,69.61,22331200,69.61 -2006-03-01,68.84,69.49,68.02,69.10,27279200,69.10 -2006-02-28,71.58,72.40,68.10,68.49,45249300,68.49 -2006-02-27,71.99,72.12,70.65,70.99,28258600,70.99 -2006-02-24,72.14,72.89,71.20,71.46,19098000,71.46 -2006-02-23,71.79,73.00,71.43,71.75,30604200,71.75 -2006-02-22,69.00,71.67,68.00,71.32,34937100,71.32 -2006-02-21,70.59,70.80,68.68,69.08,27843100,69.08 -2006-02-17,70.30,70.89,69.61,70.29,20571400,70.29 -2006-02-16,69.91,71.01,69.48,70.57,33863400,70.57 -2006-02-15,67.16,69.62,66.75,69.22,41420400,69.22 -2006-02-14,65.10,68.10,65.00,67.64,41462100,67.64 -2006-02-13,66.63,66.75,64.64,64.71,31553500,64.71 -2006-02-10,65.18,67.67,62.90,67.31,62874200,67.31 -2006-02-09,69.10,69.23,64.53,64.95,41063000,64.95 -2006-02-08,68.49,69.08,66.00,68.81,34039800,68.81 -2006-02-07,68.27,69.48,66.68,67.60,49601100,67.60 -2006-02-06,72.02,72.51,66.74,67.30,58991700,67.30 -2006-02-03,72.24,72.79,71.04,71.85,24718700,71.85 -2006-02-02,75.10,75.36,72.05,72.10,25261500,72.10 -2006-02-01,74.95,76.46,74.64,75.42,18613800,75.42 -2006-01-31,75.50,76.34,73.75,75.51,32626500,75.51 -2006-01-30,71.17,76.60,70.87,75.00,49942900,75.00 -2006-01-27,72.95,73.60,71.10,72.03,34066600,72.03 -2006-01-26,74.53,75.43,71.93,72.33,42192400,72.33 -2006-01-25,77.39,77.50,73.25,74.20,45563800,74.20 -2006-01-24,78.76,79.42,75.77,76.04,40794800,76.04 -2006-01-23,76.10,79.56,76.00,77.67,37847500,77.67 -2006-01-20,79.28,80.04,75.83,76.09,40527100,76.09 -2006-01-19,81.25,81.66,78.74,79.04,60566000,79.04 -2006-01-18,83.08,84.05,81.85,82.49,42879900,82.49 -2006-01-17,85.70,86.38,83.87,84.71,29843700,84.71 -2006-01-13,84.99,86.01,84.60,85.59,27725200,85.59 -2006-01-12,84.97,86.40,83.62,84.29,45743200,84.29 -2006-01-11,83.84,84.80,82.59,83.90,53349800,83.90 -2006-01-10,76.25,81.89,75.83,80.86,81423900,80.86 -2006-01-09,76.73,77.20,75.74,76.05,24108600,76.05 -2006-01-06,75.25,76.70,74.55,76.30,25159200,76.30 -2006-01-05,74.83,74.90,73.75,74.38,16050800,74.38 -2006-01-04,75.13,75.98,74.50,74.97,22128700,74.97 -2006-01-03,72.38,74.75,72.25,74.75,28829800,74.75 -2005-12-30,70.91,72.43,70.34,71.89,22295100,71.89 -2005-12-29,73.78,73.82,71.42,71.45,17500900,71.45 -2005-12-28,74.47,74.76,73.32,73.57,14218400,73.57 -2005-12-27,74.00,75.18,73.95,74.23,21092500,74.23 -2005-12-23,74.17,74.26,73.30,73.35,8209200,73.35 -2005-12-22,73.91,74.49,73.60,74.02,13236100,74.02 -2005-12-21,72.60,73.61,72.54,73.50,16990600,73.50 -2005-12-20,71.63,72.38,71.12,72.11,17111000,72.11 -2005-12-19,71.11,72.60,71.04,71.38,18903400,71.38 -2005-12-16,72.14,72.30,71.06,71.11,23970400,71.11 -2005-12-15,72.68,72.86,71.35,72.18,20041500,72.18 -2005-12-14,72.53,73.30,70.27,72.01,51811300,72.01 -2005-12-13,74.85,75.46,74.21,74.98,17636300,74.98 -2005-12-12,74.87,75.35,74.56,74.91,18749800,74.91 -2005-12-09,74.21,74.59,73.35,74.33,19835800,74.33 -2005-12-08,73.20,74.17,72.60,74.08,28231500,74.08 -2005-12-07,74.23,74.46,73.12,73.95,24266600,73.95 -2005-12-06,73.93,74.83,73.35,74.05,30608200,74.05 -2005-12-05,71.95,72.53,71.49,71.82,20845400,71.82 -2005-12-02,72.27,72.74,70.70,72.63,31991500,72.63 -2005-12-01,68.95,71.73,68.81,71.60,29031900,71.60 -2005-11-30,68.43,68.85,67.52,67.82,21274100,67.82 -2005-11-29,69.99,70.30,67.35,68.10,31836900,68.10 -2005-11-28,70.72,71.07,69.07,69.66,36375700,69.66 -2005-11-25,67.66,69.54,67.50,69.34,14107600,69.34 -2005-11-23,66.88,67.98,66.69,67.11,17351900,67.11 -2005-11-22,64.84,66.76,64.52,66.52,19295800,66.52 -2005-11-21,64.82,65.19,63.72,64.96,18275400,64.96 -2005-11-18,65.31,65.43,64.37,64.56,18748700,64.56 -2005-11-17,65.59,65.88,64.25,64.52,24150200,64.52 -2005-11-16,63.15,65.06,63.09,64.95,28018400,64.95 -2005-11-15,61.60,63.08,61.46,62.28,19172900,62.28 -2005-11-14,61.54,61.98,60.91,61.45,13211900,61.45 -2005-11-11,61.54,62.11,61.34,61.54,15194600,61.54 -2005-11-10,60.64,61.20,59.01,61.18,23762300,61.18 -2005-11-09,60.00,61.21,60.00,60.11,19747500,60.11 -2005-11-08,59.95,60.38,59.10,59.90,16920200,59.90 -2005-11-07,60.85,61.67,60.14,60.23,22815400,60.23 -2005-11-04,60.35,61.24,59.62,61.15,31358400,61.15 -2005-11-03,60.26,62.32,60.07,61.85,31585100,61.85 -2005-11-02,57.72,60.00,57.60,59.95,30609300,59.95 -2005-11-01,57.24,58.14,56.87,57.50,26774500,57.50 -2005-10-31,55.20,57.98,54.75,57.59,33601600,57.59 -2005-10-28,56.04,56.43,54.17,54.47,27492400,54.47 -2005-10-27,56.99,57.01,55.41,55.41,14697900,55.41 -2005-10-26,56.28,57.56,55.92,57.03,22556900,57.03 -2005-10-25,56.40,56.85,55.69,56.10,16611700,56.10 -2005-10-24,55.25,56.79,55.09,56.79,21776900,56.79 -2005-10-21,56.84,56.98,55.36,55.66,28454500,55.66 -2005-10-20,54.47,56.50,54.35,56.14,48491500,56.14 -2005-10-19,52.07,54.96,51.21,54.94,36024400,54.94 -2005-10-18,53.25,53.95,52.20,52.21,21771000,52.21 -2005-10-17,53.98,54.23,52.68,53.44,22029800,53.44 -2005-10-14,54.03,54.35,52.79,54.00,36984000,54.00 -2005-10-13,49.44,53.95,49.27,53.74,66627700,53.74 -2005-10-12,48.65,50.30,47.87,49.25,96338800,49.25 -2005-10-11,51.23,51.87,50.40,51.59,43781600,51.59 -2005-10-10,51.76,51.91,50.28,50.37,18125200,50.37 -2005-10-07,51.72,51.93,50.55,51.30,24210100,51.30 -2005-10-06,53.20,53.49,50.87,51.70,27054900,51.70 -2005-10-05,54.33,54.36,52.75,52.78,21813200,52.78 -2005-10-04,54.95,55.35,53.64,53.75,19266400,53.75 -2005-10-03,54.16,54.54,53.68,54.44,18126900,54.44 -2005-09-30,52.33,53.65,51.88,53.61,18986900,53.61 -2005-09-29,51.23,52.59,50.81,52.34,22744500,52.34 -2005-09-28,53.07,53.11,50.59,51.08,40198000,51.08 -2005-09-27,53.92,54.24,53.43,53.44,12203700,53.44 -2005-09-26,54.03,54.56,53.32,53.84,19520100,53.84 -2005-09-23,52.10,53.50,51.84,53.20,19944900,53.20 -2005-09-22,51.88,52.47,51.32,51.90,16561700,51.90 -2005-09-21,52.96,53.05,51.86,52.11,15526700,52.11 -2005-09-20,52.99,53.81,52.92,53.19,29279600,53.19 -2005-09-19,51.05,52.89,51.05,52.64,27990400,52.64 -2005-09-16,50.23,51.21,49.95,51.21,21107300,51.21 -2005-09-15,50.00,50.18,49.33,49.87,14827000,49.87 -2005-09-14,51.06,51.19,49.46,49.61,16943800,49.61 -2005-09-13,51.02,51.29,50.32,50.82,17603000,50.82 -2005-09-12,51.10,51.63,50.58,51.40,16171300,51.40 -2005-09-09,50.07,51.35,49.79,51.31,21987200,51.31 -2005-09-08,49.35,50.12,49.14,49.78,25094300,49.78 -2005-09-07,49.05,49.40,47.92,48.68,34395500,48.68 -2005-09-06,46.70,48.88,46.55,48.80,29236400,48.80 -2005-09-02,46.30,46.80,46.12,46.22,7942100,46.22 -2005-09-01,47.00,47.17,46.09,46.26,12727400,46.26 -2005-08-31,46.86,47.03,46.27,46.89,14391300,46.89 -2005-08-30,45.99,46.79,45.92,46.57,18527200,46.57 -2005-08-29,45.27,46.03,45.26,45.84,9153400,45.84 -2005-08-26,46.12,46.34,45.36,45.74,9323500,45.74 -2005-08-25,46.12,46.49,45.81,46.06,9866200,46.06 -2005-08-24,45.60,47.12,45.59,45.77,20431100,45.77 -2005-08-23,45.85,46.10,45.32,45.74,10557300,45.74 -2005-08-22,46.15,46.75,45.26,45.87,13847600,45.87 -2005-08-19,46.28,46.70,45.77,45.83,13448900,45.83 -2005-08-18,46.91,47.00,45.75,46.30,15805700,46.30 -2005-08-17,46.40,47.44,46.37,47.15,17847300,47.15 -2005-08-16,47.39,47.50,46.21,46.25,19200800,46.25 -2005-08-15,46.48,48.33,46.45,47.68,38811700,47.68 -2005-08-12,43.46,46.22,43.36,46.10,32715600,46.10 -2005-08-11,43.39,44.12,43.25,44.00,9713700,44.00 -2005-08-10,44.00,44.39,43.31,43.38,12890900,43.38 -2005-08-09,42.93,43.89,42.91,43.82,13601400,43.82 -2005-08-08,43.00,43.25,42.61,42.65,6299400,42.65 -2005-08-05,42.49,43.36,42.02,42.99,8640400,42.99 -2005-08-04,42.89,43.00,42.29,42.71,9618000,42.71 -2005-08-03,43.19,43.31,42.77,43.22,9225800,43.22 -2005-08-02,42.89,43.50,42.61,43.19,10602700,43.19 -2005-08-01,42.57,43.08,42.08,42.75,11223200,42.75 -2005-07-29,43.56,44.38,42.26,42.65,20074300,42.65 -2005-07-28,43.85,44.00,43.30,43.80,8975400,43.80 -2005-07-27,43.83,44.07,42.67,43.99,10133900,43.99 -2005-07-26,44.01,44.11,43.36,43.63,9592600,43.63 -2005-07-25,43.99,44.28,43.73,43.81,10522400,43.81 -2005-07-22,43.44,44.00,43.39,44.00,10753800,44.00 -2005-07-21,43.70,44.04,42.90,43.29,14438000,43.29 -2005-07-20,42.86,43.80,42.65,43.63,16192700,43.63 -2005-07-19,41.52,43.23,41.07,43.19,23966500,43.19 -2005-07-18,41.41,42.10,41.37,41.49,20939200,41.49 -2005-07-15,40.97,41.57,40.46,41.55,24560100,41.55 -2005-07-14,40.79,42.01,40.23,40.75,74859300,40.75 -2005-07-13,38.29,38.50,37.90,38.35,24458400,38.35 -2005-07-12,38.23,38.40,37.91,38.24,13822800,38.24 -2005-07-11,38.37,38.65,37.78,38.10,13885300,38.10 -2005-07-08,37.87,38.28,37.47,38.25,10383400,38.25 -2005-07-07,36.81,37.76,36.80,37.63,13704400,37.63 -2005-07-06,37.71,38.16,37.20,37.39,14093800,37.39 -2005-07-05,36.55,38.15,36.50,37.98,16223900,37.98 -2005-07-01,36.83,36.97,36.29,36.50,8928600,36.50 -2005-06-30,36.61,37.16,36.31,36.81,14942500,36.81 -2005-06-29,37.23,37.29,36.12,36.37,16012800,36.37 -2005-06-28,37.49,37.59,37.17,37.31,12510700,37.31 -2005-06-27,36.84,38.10,36.68,37.10,21434700,37.10 -2005-06-24,39.09,39.12,37.68,37.76,14668200,37.76 -2005-06-23,38.83,39.78,38.65,38.89,24080500,38.89 -2005-06-22,38.26,38.60,38.14,38.55,15175900,38.55 -2005-06-21,37.72,38.19,37.38,37.86,13233100,37.86 -2005-06-20,37.85,38.09,37.45,37.61,11561300,37.61 -2005-06-17,38.47,38.54,37.83,38.31,21290200,38.31 -2005-06-16,37.19,38.08,36.82,37.98,19559800,37.98 -2005-06-15,36.87,37.30,36.30,37.13,20119400,37.13 -2005-06-14,35.92,36.15,35.75,36.00,12423100,36.00 -2005-06-13,35.89,36.61,35.82,35.90,15563300,35.90 -2005-06-10,37.40,37.40,35.52,35.81,24247600,35.81 -2005-06-09,37.00,37.94,36.82,37.65,13937700,37.65 -2005-06-08,36.63,37.25,36.57,36.92,14428800,36.92 -2005-06-07,37.60,37.73,36.45,36.54,26616600,36.54 -2005-06-06,38.33,38.63,37.56,37.92,28998800,37.92 -2005-06-03,38.16,38.58,37.77,38.24,34173900,38.24 -2005-06-02,40.05,40.32,39.60,40.04,13356200,40.04 -2005-06-01,39.89,40.76,39.86,40.30,16207600,40.30 -2005-05-31,40.66,40.74,39.58,39.76,14435900,39.76 -2005-05-27,40.64,40.79,40.01,40.56,11286000,40.56 -2005-05-26,39.94,40.94,39.94,40.74,18768600,40.74 -2005-05-25,39.50,39.95,39.32,39.78,14143100,39.78 -2005-05-24,39.45,39.99,39.03,39.70,21195000,39.70 -2005-05-23,37.85,39.90,37.85,39.76,37234800,39.76 -2005-05-20,37.25,37.65,37.19,37.55,16166100,37.55 -2005-05-19,35.78,37.68,35.78,37.55,28327200,37.55 -2005-05-18,35.45,37.56,34.99,35.84,22740100,35.84 -2005-05-17,35.14,35.46,34.54,35.36,21012300,35.36 -2005-05-16,34.56,35.70,34.53,35.55,16939100,35.55 -2005-05-13,34.20,35.23,34.07,34.77,25096900,34.77 -2005-05-12,35.42,35.59,34.00,34.13,34651500,34.13 -2005-05-11,35.20,35.67,33.11,35.61,72927900,35.61 -2005-05-10,36.75,37.25,36.33,36.42,15723700,36.42 -2005-05-09,37.28,37.45,36.75,36.97,12703400,36.97 -2005-05-06,36.89,37.33,36.79,37.24,11651700,37.24 -2005-05-05,37.25,37.27,36.47,36.68,13834500,36.68 -2005-05-04,36.11,37.20,36.10,37.15,16006300,37.15 -2005-05-03,36.40,36.74,36.03,36.21,17740700,36.21 -2005-05-02,36.21,36.65,36.02,36.43,16640000,36.43 -2005-04-29,36.15,36.23,35.22,36.06,23986800,36.06 -2005-04-28,36.29,36.34,35.24,35.54,20539500,35.54 -2005-04-27,35.89,36.36,35.51,35.95,21924600,35.95 -2005-04-26,36.78,37.51,36.12,36.19,28946700,36.19 -2005-04-25,36.49,37.02,36.11,36.98,26659300,36.98 -2005-04-22,36.84,37.00,34.90,35.50,29968900,35.50 -2005-04-21,36.40,37.21,35.90,37.18,27128300,37.18 -2005-04-20,37.66,37.74,35.44,35.51,33754700,35.51 -2005-04-19,36.60,37.44,35.87,37.09,38630100,37.09 -2005-04-18,35.00,36.30,34.00,35.62,47399200,35.62 -2005-04-15,36.62,37.25,35.28,35.35,61717400,35.35 -2005-04-14,38.81,39.56,36.84,37.26,98328300,37.26 -2005-04-13,42.95,42.99,40.39,41.04,48998100,41.04 -2005-04-12,42.49,43.19,42.01,42.66,35037900,42.66 -2005-04-11,44.15,44.25,41.91,41.92,29345100,41.92 -2005-04-08,43.70,44.45,43.54,43.74,23212500,43.74 -2005-04-07,42.33,43.75,42.25,43.56,18106700,43.56 -2005-04-06,42.40,42.81,42.15,42.33,14815200,42.33 -2005-04-05,41.22,42.24,41.09,41.89,19865700,41.89 -2005-04-04,40.99,41.31,40.16,41.09,20714800,41.09 -2005-04-01,42.09,42.18,40.57,40.89,22903000,40.89 -2005-03-31,42.45,42.52,41.59,41.67,22719100,41.67 -2005-03-30,42.07,42.80,41.82,42.80,14105700,42.80 -2005-03-29,42.56,42.83,41.50,41.75,16477000,41.75 -2005-03-28,42.75,42.96,42.47,42.53,9836100,42.53 -2005-03-24,42.91,43.00,42.50,42.50,12596600,42.50 -2005-03-23,42.45,43.40,42.02,42.55,21779400,42.55 -2005-03-22,43.71,43.96,42.68,42.83,19693400,42.83 -2005-03-21,43.29,43.97,42.86,43.70,19326000,43.70 -2005-03-18,43.33,43.44,42.50,42.96,33576800,42.96 -2005-03-17,41.53,42.88,41.32,42.25,28640000,42.25 -2005-03-16,41.21,42.31,40.78,41.18,24921900,41.18 -2005-03-15,40.64,41.14,40.25,40.96,18164600,40.96 -2005-03-14,40.52,40.79,39.52,40.32,21620900,40.32 -2005-03-11,40.21,40.59,39.80,40.27,22601100,40.27 -2005-03-10,39.53,40.26,39.10,39.83,27753900,39.83 -2005-03-09,39.64,40.28,38.83,39.35,47230900,39.35 -2005-03-08,41.90,42.16,40.10,40.53,36480400,40.53 -2005-03-07,42.80,43.25,42.35,42.75,16094000,42.75 -2005-03-04,42.76,43.01,41.85,42.81,27022100,42.81 -2005-03-03,44.37,44.41,41.22,41.79,50416200,41.79 -2005-03-02,44.25,44.89,44.08,44.12,16362900,44.12 -2005-03-01,44.99,45.11,44.16,44.50,16721000,44.50 -2005-02-28,44.68,45.14,43.96,44.86,23271800,44.86 -2005-02-25,89.62,89.91,88.19,88.99,32696800,44.49 -2005-02-24,88.48,89.31,87.73,88.93,54251000,44.47 -2005-02-23,86.72,88.45,85.55,88.23,48042200,44.12 -2005-02-22,86.30,88.30,85.29,85.29,43546200,42.65 -2005-02-18,87.74,87.86,86.25,86.81,41544800,43.40 -2005-02-17,90.65,90.88,87.45,87.81,54231200,43.90 -2005-02-16,88.15,90.20,87.35,90.13,58544400,45.06 -2005-02-15,86.66,89.08,86.00,88.41,82579200,44.21 -2005-02-14,82.73,84.79,82.05,84.63,45409400,42.31 -2005-02-11,79.86,81.76,78.94,81.21,42894800,40.60 -2005-02-10,78.72,79.28,76.66,78.36,39036400,39.18 -2005-02-09,81.04,81.99,78.10,78.74,42552000,39.37 -2005-02-08,79.07,81.38,78.79,80.90,31786400,40.45 -2005-02-07,78.93,79.35,77.50,78.94,18730600,39.47 -2005-02-04,77.87,78.93,77.53,78.84,20127000,39.42 -2005-02-03,79.10,79.43,77.33,77.81,26130400,38.90 -2005-02-02,77.95,79.91,77.69,79.63,36430800,39.81 -2005-02-01,77.05,77.77,76.58,77.53,24228400,38.76 -2005-01-31,74.58,77.89,74.51,76.90,60039200,38.45 -2005-01-28,72.62,73.98,72.44,73.98,28629000,36.99 -2005-01-27,72.16,72.92,71.55,72.64,17722400,36.32 -2005-01-26,72.66,72.75,71.22,72.25,26410600,36.12 -2005-01-25,71.37,72.84,70.94,72.05,34615400,36.03 -2005-01-24,70.98,71.78,70.55,70.76,30058200,35.38 -2005-01-21,71.31,71.60,70.00,70.49,32547600,35.24 -2005-01-20,69.65,71.27,69.47,70.46,32675800,35.23 -2005-01-19,70.49,71.46,69.75,69.88,26853400,34.94 -2005-01-18,69.85,70.70,67.75,70.65,35945000,35.33 -2005-01-14,70.25,71.72,69.19,70.20,63240800,35.10 -2005-01-13,73.71,74.42,69.73,69.80,113025600,34.90 -2005-01-12,65.45,65.90,63.30,65.46,68560800,32.73 -2005-01-11,68.25,69.15,64.14,64.56,93272400,32.28 -2005-01-10,69.83,70.70,67.88,68.96,61618200,34.48 -2005-01-07,65.00,69.63,64.75,69.25,79551800,34.62 -2005-01-06,64.67,64.91,63.33,64.55,25198400,32.28 -2005-01-05,64.46,65.25,64.05,64.50,24301200,32.25 -2005-01-04,63.79,65.47,62.97,63.94,39171800,31.97 -2005-01-03,64.78,65.11,62.60,63.29,24714000,31.65 -2004-12-31,64.89,65.00,64.03,64.40,9949600,32.20 -2004-12-30,64.81,65.03,64.22,64.80,12333600,32.40 -2004-12-29,63.81,64.98,63.57,64.44,16055800,32.22 -2004-12-28,63.30,64.25,62.05,64.18,21848400,32.09 -2004-12-27,64.80,65.15,62.88,63.16,19981800,31.58 -2004-12-23,63.75,64.25,63.60,64.01,8783200,32.01 -2004-12-22,63.66,64.36,63.40,63.75,20208200,31.88 -2004-12-21,63.56,63.77,61.60,63.69,38014800,31.84 -2004-12-20,65.47,66.00,61.76,62.72,41718800,31.36 -2004-12-17,66.84,67.04,64.90,64.99,27982000,32.49 -2004-12-16,66.15,67.50,66.05,66.60,40218400,33.30 -2004-12-15,65.24,65.46,64.66,65.26,14227200,32.63 -2004-12-14,65.40,65.88,65.02,65.29,14847200,32.65 -2004-12-13,65.62,65.90,64.60,64.91,14108600,32.46 -2004-12-10,65.03,66.05,64.70,65.15,27706200,32.58 -2004-12-09,62.81,64.40,62.07,63.99,26482200,32.00 -2004-12-08,63.08,64.43,62.05,63.28,24710800,31.64 -2004-12-07,65.93,66.73,62.56,62.89,37746400,31.44 -2004-12-06,64.25,66.24,62.95,65.78,44568600,32.89 -2004-12-03,64.53,65.00,61.75,62.68,44244600,31.34 -2004-12-02,66.13,66.90,64.66,65.21,35265800,32.60 -2004-12-01,67.79,67.95,66.27,67.79,28591200,33.90 -2004-11-30,68.79,68.79,67.05,67.05,36732800,33.53 -2004-11-29,68.95,69.57,67.41,68.44,61175600,34.22 -2004-11-26,65.35,65.76,64.34,64.55,19648000,32.28 -2004-11-24,61.69,65.20,61.55,64.05,49671000,32.03 -2004-11-23,62.30,62.45,61.05,61.27,32551800,30.64 -2004-11-22,61.80,64.00,57.90,61.35,91721800,30.67 -2004-11-19,55.49,56.91,54.50,55.17,27331400,27.58 -2004-11-18,54.30,55.45,54.29,55.39,16398200,27.69 -2004-11-17,55.19,55.45,54.22,54.90,14205400,27.45 -2004-11-16,55.16,55.20,54.48,54.94,10539400,27.47 -2004-11-15,55.20,55.46,54.34,55.24,13430200,27.62 -2004-11-12,55.01,55.69,54.84,55.50,14132200,27.75 -2004-11-11,54.95,55.43,54.23,55.30,14546400,27.65 -2004-11-10,53.95,55.39,53.91,54.75,18167000,27.38 -2004-11-09,54.23,54.55,53.38,54.05,16991600,27.02 -2004-11-08,54.27,55.45,53.86,54.38,18818600,27.19 -2004-11-05,54.86,55.00,52.04,54.72,43037400,27.36 -2004-11-04,55.03,55.55,54.37,54.45,33165200,27.23 -2004-11-03,54.37,56.11,53.99,55.31,43006200,27.66 -2004-11-02,52.40,54.08,52.40,53.50,26071000,26.75 -2004-11-01,52.50,53.26,52.04,52.45,21501800,26.23 -2004-10-29,51.84,53.20,51.80,52.40,28936400,26.20 -2004-10-28,49.98,52.22,49.50,52.19,30866600,26.09 -2004-10-27,48.51,50.62,48.17,50.30,42624800,25.15 -2004-10-26,47.45,48.05,46.97,47.97,21227200,23.99 -2004-10-25,47.20,47.84,47.07,47.55,14023000,23.77 -2004-10-22,47.54,47.67,47.02,47.41,17252400,23.70 -2004-10-21,47.48,48.13,47.36,47.94,25875200,23.97 -2004-10-20,47.18,47.60,46.65,47.47,21611000,23.74 -2004-10-19,48.10,48.35,47.31,47.42,28642600,23.71 -2004-10-18,44.70,47.75,44.70,47.75,42884000,23.88 -2004-10-15,44.88,45.61,44.19,45.50,36826000,22.75 -2004-10-14,43.19,45.75,42.55,44.98,98872400,22.49 -2004-10-13,38.87,39.76,38.74,39.75,41536000,19.88 -2004-10-12,38.50,38.58,37.65,38.29,16435400,19.15 -2004-10-11,38.80,39.06,38.20,38.59,11566800,19.30 -2004-10-08,39.56,39.77,38.84,39.06,12829600,19.53 -2004-10-07,40.54,40.93,39.46,39.62,15219600,19.81 -2004-10-06,39.50,40.76,39.47,40.64,15939400,20.32 -2004-10-05,38.56,39.67,38.40,39.37,14505800,19.68 -2004-10-04,39.18,39.18,38.75,38.79,20503000,19.40 -2004-10-01,39.12,39.19,38.58,38.67,16621600,19.33 -2004-09-30,39.00,39.27,38.45,38.75,15179000,19.38 -2004-09-29,37.93,38.86,37.82,38.68,9768200,19.34 -2004-09-28,37.46,38.29,37.45,38.04,12613800,19.02 -2004-09-27,36.95,37.98,36.83,37.53,14197000,18.76 -2004-09-24,37.45,38.00,37.15,37.29,13196000,18.65 -2004-09-23,37.04,37.50,36.93,37.27,14193000,18.64 -2004-09-22,38.10,38.14,36.81,36.92,14346000,18.46 -2004-09-21,37.75,38.87,37.46,38.01,13809000,19.00 -2004-09-20,36.88,37.98,36.87,37.71,8750000,18.85 -2004-09-17,36.55,37.38,36.40,37.14,17939600,18.57 -2004-09-16,35.20,36.76,35.08,36.35,17925600,18.17 -2004-09-15,35.36,35.48,34.80,35.20,8309600,17.60 -2004-09-14,35.24,35.55,34.78,35.49,9100800,17.75 -2004-09-13,35.88,36.07,35.32,35.59,10070600,17.80 -2004-09-10,35.66,36.23,35.46,35.87,11714800,17.93 -2004-09-09,36.10,36.30,35.28,35.70,16476400,17.85 -2004-09-08,35.70,36.57,35.68,36.35,12268800,18.17 -2004-09-07,35.40,36.19,35.23,35.76,10784200,17.88 -2004-09-03,35.01,35.92,35.01,35.23,10481000,17.61 -2004-09-02,35.50,35.81,34.83,35.66,14511600,17.83 -2004-09-01,34.30,35.99,34.19,35.86,18418800,17.93 -2004-08-31,34.07,34.95,34.00,34.49,13448600,17.25 -2004-08-30,34.00,34.72,33.96,34.12,7790800,17.06 -2004-08-27,34.68,34.76,34.00,34.35,13886200,17.17 -2004-08-26,33.04,35.18,32.74,34.66,34137800,17.33 -2004-08-25,31.87,33.15,31.73,33.05,18057800,16.52 -2004-08-24,31.26,31.95,31.19,31.95,13362000,15.98 -2004-08-23,30.86,31.27,30.60,31.08,9095000,15.54 -2004-08-20,30.71,30.99,30.49,30.80,11313600,15.40 -2004-08-19,31.51,31.86,30.36,30.71,13890000,15.35 -2004-08-18,30.51,31.85,30.49,31.74,13023400,15.87 -2004-08-17,30.58,31.13,30.35,30.87,11536400,15.44 -2004-08-16,31.00,31.72,30.64,30.78,15559800,15.39 -2004-08-13,30.60,31.28,30.40,30.84,11716000,15.42 -2004-08-12,30.45,30.85,30.28,30.37,8078600,15.19 -2004-08-11,31.10,31.13,30.26,31.01,11514000,15.51 -2004-08-10,30.39,31.54,30.35,31.52,12537000,15.76 -2004-08-09,29.85,30.45,29.81,30.30,10387400,15.15 -2004-08-06,30.90,31.10,29.70,29.78,17581800,14.89 -2004-08-05,31.81,32.30,31.25,31.39,8732200,15.69 -2004-08-04,31.19,32.12,31.17,31.79,9874600,15.90 -2004-08-03,31.45,31.72,31.15,31.29,7558200,15.65 -2004-08-02,31.18,32.20,31.13,31.58,13039000,15.79 -2004-07-30,32.65,33.00,32.00,32.34,8679400,16.17 -2004-07-29,32.47,32.82,32.13,32.64,7934200,16.32 -2004-07-28,32.31,32.41,31.16,32.27,10180400,16.14 -2004-07-27,31.80,32.75,31.57,32.43,15178800,16.22 -2004-07-26,30.85,31.45,30.78,31.26,14069000,15.63 -2004-07-23,31.53,31.75,30.48,30.70,9770400,15.35 -2004-07-22,31.25,31.73,31.06,31.68,11932800,15.84 -2004-07-21,32.42,32.71,31.34,31.62,10759200,15.81 -2004-07-20,31.95,32.20,31.55,32.20,11562400,16.10 -2004-07-19,32.01,32.22,31.66,31.97,19041800,15.98 -2004-07-16,32.80,32.92,32.12,32.20,17442200,16.10 -2004-07-15,32.66,33.63,32.11,32.93,63133000,16.47 -2004-07-14,28.86,29.97,28.74,29.58,29850000,14.79 -2004-07-13,29.25,29.60,29.02,29.22,11292000,14.61 -2004-07-12,30.02,30.04,28.93,29.14,18272200,14.57 -2004-07-09,30.27,30.50,30.03,30.03,7459400,15.02 -2004-07-08,30.13,30.68,29.95,30.14,8335000,15.07 -2004-07-07,30.85,31.36,30.13,30.39,14214000,15.19 -2004-07-06,31.27,31.42,30.80,30.95,12463600,15.48 -2004-07-02,30.48,31.18,29.73,31.08,32524400,15.54 -2004-07-01,32.10,32.48,31.90,32.30,12212200,16.15 -2004-06-30,32.56,32.97,31.89,32.54,13323000,16.27 -2004-06-29,32.07,32.99,31.41,32.50,21091200,16.25 -2004-06-28,34.18,34.19,32.21,32.49,18610600,16.25 -2004-06-25,33.07,33.70,33.00,33.70,11551000,16.85 -2004-06-24,33.51,33.70,32.98,33.18,9018400,16.59 -2004-06-23,33.00,33.83,32.89,33.70,13959600,16.85 -2004-06-22,32.30,33.09,32.29,33.00,12875400,16.50 -2004-06-21,33.12,33.50,32.12,32.33,13936200,16.17 -2004-06-18,32.66,33.41,32.43,32.91,14509000,16.45 -2004-06-17,32.56,33.13,32.21,32.81,19690000,16.41 -2004-06-16,30.66,33.32,30.53,32.74,32487200,16.37 -2004-06-15,30.54,31.14,30.26,30.69,15879800,15.35 -2004-06-14,30.65,30.68,29.50,30.12,8713800,15.06 -2004-06-10,30.20,30.97,30.20,30.74,9199200,15.37 -2004-06-09,30.09,30.71,30.00,30.20,12471600,15.10 -2004-06-08,29.99,30.44,29.83,30.35,14843600,15.18 -2004-06-07,29.04,29.98,28.81,29.81,10567000,14.90 -2004-06-04,28.56,29.25,28.51,28.78,14254000,14.39 -2004-06-03,28.72,28.99,28.29,28.40,8961800,14.20 -2004-06-02,28.03,29.17,27.80,28.92,11382600,14.46 -2004-06-01,27.79,28.20,27.61,28.06,6504800,14.03 -2004-05-28,28.08,28.27,27.80,28.06,5204200,14.03 -2004-05-27,28.46,28.60,27.82,28.17,8427600,14.09 -2004-05-26,28.33,28.78,28.00,28.51,11506000,14.26 -2004-05-25,27.50,28.51,27.29,28.41,11427800,14.20 -2004-05-24,27.29,27.90,27.11,27.34,8414400,13.67 -2004-05-21,26.90,27.20,26.73,27.11,6424800,13.56 -2004-05-20,26.63,27.00,26.47,26.71,7010600,13.35 -2004-05-19,27.40,27.50,26.42,26.47,13414000,13.23 -2004-05-18,26.97,27.29,26.80,27.06,7359400,13.53 -2004-05-17,26.70,27.06,26.36,26.64,10730200,13.32 -2004-05-14,27.25,27.32,26.45,27.06,9207200,13.53 -2004-05-13,27.10,27.72,26.90,27.19,8209000,13.60 -2004-05-12,26.79,27.34,26.24,27.30,8765000,13.65 -2004-05-11,26.40,27.19,26.40,27.14,10899000,13.57 -2004-05-10,26.27,26.60,25.94,26.28,8927800,13.14 -2004-05-07,26.55,27.57,26.55,26.67,14965600,13.34 -2004-05-06,26.40,26.75,25.90,26.58,9412800,13.29 -2004-05-05,26.20,26.75,25.96,26.65,8503800,13.32 -2004-05-04,25.97,26.55,25.50,26.14,9999400,13.07 -2004-05-03,26.00,26.33,25.74,26.07,10629800,13.03 -2004-04-30,26.71,26.96,25.49,25.78,16660800,12.89 -2004-04-29,26.45,27.00,25.98,26.77,16456800,13.39 -2004-04-28,26.82,27.01,26.34,26.45,8256000,13.23 -2004-04-27,27.24,27.44,26.69,26.94,10138000,13.47 -2004-04-26,27.58,27.64,27.00,27.13,8254600,13.56 -2004-04-23,27.70,28.00,27.05,27.70,11279600,13.85 -2004-04-22,27.56,28.18,27.11,27.78,12306600,13.89 -2004-04-21,27.60,28.12,27.37,27.73,11638400,13.86 -2004-04-20,28.21,28.41,27.56,27.73,12661400,13.86 -2004-04-19,28.12,28.75,27.83,28.35,25441200,14.18 -2004-04-16,29.15,29.31,28.50,29.18,14390400,14.59 -2004-04-15,28.82,29.58,28.16,29.30,62908800,14.65 -2004-04-14,26.74,27.07,26.31,26.64,22847600,13.32 -2004-04-13,27.98,28.03,26.84,26.93,15585600,13.47 -2004-04-12,27.50,28.10,27.49,28.04,8233600,14.02 -2004-04-08,27.88,28.00,27.20,27.53,8604200,13.77 -2004-04-07,27.61,27.70,26.92,27.31,9111400,13.65 -2004-04-06,27.71,28.15,27.43,27.83,9214000,13.91 -2004-04-05,27.48,28.37,27.44,28.32,13774000,14.16 -2004-04-02,27.75,27.93,27.23,27.50,9802800,13.75 -2004-04-01,26.89,27.27,26.62,27.11,11369000,13.56 -2004-03-31,27.92,27.98,26.95,27.04,13956200,13.52 -2004-03-30,27.74,27.95,27.34,27.92,12845600,13.96 -2004-03-29,27.37,27.99,27.20,27.91,12526000,13.95 -2004-03-26,27.00,27.36,26.91,27.04,14996200,13.52 -2004-03-25,26.14,26.91,25.89,26.87,20230200,13.44 -2004-03-24,25.27,25.75,25.27,25.50,15293400,12.75 -2004-03-23,25.88,26.00,25.22,25.29,13768400,12.65 -2004-03-22,25.37,26.17,25.25,25.86,14965400,12.93 -2004-03-19,25.56,26.94,25.54,25.86,14592000,12.93 -2004-03-18,25.94,26.06,25.59,25.67,11467200,12.84 -2004-03-17,25.96,26.38,25.78,26.19,14694000,13.10 -2004-03-16,26.55,26.61,25.39,25.82,21622600,12.91 -2004-03-15,27.03,27.35,26.26,26.45,17204200,13.23 -2004-03-12,27.32,27.78,27.17,27.56,11758000,13.78 -2004-03-11,27.27,28.04,27.09,27.15,21280400,13.57 -2004-03-10,27.04,28.14,26.94,27.68,35963000,13.84 -2004-03-09,25.90,27.23,25.75,27.10,22084400,13.55 -2004-03-08,26.62,26.79,25.80,26.00,18674000,13.00 -2004-03-05,24.95,27.49,24.90,26.74,55021400,13.37 -2004-03-04,23.93,25.22,23.91,25.16,23579400,12.58 -2004-03-03,23.60,24.19,23.60,23.92,8040400,11.96 -2004-03-02,24.00,24.10,23.77,23.81,9167400,11.90 -2004-03-01,24.10,24.30,23.87,24.02,11488600,12.01 -2004-02-27,22.96,24.02,22.95,23.92,16744200,11.96 -2004-02-26,22.88,23.18,22.80,23.04,7086000,11.52 -2004-02-25,22.28,22.90,22.21,22.81,9867000,11.40 -2004-02-24,22.14,22.74,22.00,22.36,9252000,11.18 -2004-02-23,22.34,22.46,21.89,22.19,6931400,11.10 -2004-02-20,22.50,22.51,22.21,22.40,9914400,11.20 -2004-02-19,23.33,23.64,22.41,22.47,11538600,11.23 -2004-02-18,23.18,23.44,23.05,23.26,5058400,11.63 -2004-02-17,23.10,23.49,23.10,23.16,6105600,11.58 -2004-02-13,23.85,24.10,22.83,23.00,11285000,11.50 -2004-02-12,23.61,23.99,23.60,23.73,6571000,11.86 -2004-02-11,23.09,23.87,23.05,23.80,12448000,11.90 -2004-02-10,22.62,23.12,22.44,22.98,9119400,11.49 -2004-02-09,22.62,22.86,22.50,22.67,6723600,11.34 -2004-02-06,22.45,22.89,22.40,22.71,6905000,11.35 -2004-02-05,21.82,22.91,21.81,22.42,12601600,11.21 -2004-02-04,22.00,22.09,21.70,21.79,10912600,10.90 -2004-02-03,22.30,22.40,22.00,22.26,6457600,11.13 -2004-02-02,22.46,22.81,22.08,22.32,10265400,11.16 -2004-01-30,22.65,22.87,22.42,22.56,6617800,11.28 -2004-01-29,22.63,22.80,22.19,22.68,7596400,11.34 -2004-01-28,22.84,23.38,22.41,22.52,9835800,11.26 -2004-01-27,23.04,23.25,22.80,23.07,10966800,11.53 -2004-01-26,22.46,23.06,22.43,23.01,9688200,11.51 -2004-01-23,22.42,22.74,22.25,22.56,8113200,11.28 -2004-01-22,22.56,22.83,22.18,22.18,7321600,11.09 -2004-01-21,22.70,22.97,22.43,22.61,8095000,11.31 -2004-01-20,22.67,22.80,22.25,22.73,11283800,11.36 -2004-01-16,22.89,23.04,22.61,22.72,13315000,11.36 -2004-01-15,22.91,23.40,22.50,22.85,36364600,11.43 -2004-01-14,24.40,24.54,23.78,24.20,22144400,12.10 -2004-01-13,24.70,24.84,23.86,24.12,24250600,12.06 -2004-01-12,23.25,24.00,23.10,23.73,17412400,11.86 -2004-01-09,23.23,24.13,22.79,23.00,15266400,11.50 -2004-01-08,22.84,23.73,22.65,23.36,16439400,11.68 -2004-01-07,22.10,22.83,21.93,22.59,20959800,11.30 -2004-01-06,22.25,22.42,21.71,22.09,18191000,11.05 -2004-01-05,21.42,22.39,21.42,22.17,14107800,11.09 -2004-01-02,21.55,21.75,21.18,21.28,5165800,10.64 -2003-12-31,21.35,21.53,21.18,21.37,6230400,10.69 -2003-12-30,21.18,21.50,21.15,21.28,7316200,10.64 -2003-12-29,20.91,21.16,20.86,21.15,8337800,10.57 -2003-12-26,20.35,20.91,20.34,20.78,3703400,10.39 -2003-12-24,19.72,20.59,19.65,20.41,6338400,10.20 -2003-12-23,19.92,19.95,19.60,19.81,11017800,9.90 -2003-12-22,19.65,19.89,19.25,19.85,13466600,9.93 -2003-12-19,20.19,20.42,19.62,19.70,16198600,9.85 -2003-12-18,19.90,20.18,19.90,20.04,11818400,10.02 -2003-12-17,20.08,20.13,19.79,19.88,9795000,9.94 -2003-12-16,20.19,20.49,20.01,20.12,13355600,10.06 -2003-12-15,21.49,21.49,20.07,20.17,13889600,10.09 -2003-12-12,21.32,21.32,20.70,20.89,6881200,10.44 -2003-12-11,20.25,21.34,20.21,21.21,6540600,10.60 -2003-12-10,20.45,20.61,19.96,20.38,9690600,10.19 -2003-12-09,21.17,21.25,20.40,20.45,4826600,10.23 -2003-12-08,20.78,21.08,20.41,21.05,5294200,10.52 -2003-12-05,20.90,21.15,20.73,20.85,6649200,10.43 -2003-12-04,20.94,21.17,20.77,21.15,6355000,10.57 -2003-12-03,21.54,21.84,20.96,21.03,6832000,10.52 -2003-12-02,21.60,21.90,21.41,21.54,7332000,10.77 -2003-12-01,21.04,21.85,21.00,21.71,12912000,10.85 -2003-11-28,20.78,21.07,20.52,20.91,2717800,10.45 -2003-11-26,20.89,21.15,20.25,20.72,8754600,10.36 -2003-11-25,21.23,21.25,20.61,20.68,9594800,10.34 -2003-11-24,20.50,21.27,20.45,21.15,13636600,10.57 -2003-11-21,20.34,20.58,19.85,20.28,8637000,10.14 -2003-11-20,20.10,21.08,20.10,20.38,8556800,10.19 -2003-11-19,20.56,20.65,20.26,20.42,12306600,10.21 -2003-11-18,21.21,21.34,20.35,20.41,9542600,10.20 -2003-11-17,21.35,21.37,20.95,21.13,8152000,10.56 -2003-11-14,22.48,22.61,21.28,21.46,8466000,10.73 -2003-11-13,22.07,22.56,21.92,22.42,7599000,11.21 -2003-11-12,21.48,22.72,21.48,22.33,10714400,11.16 -2003-11-11,21.90,22.02,21.48,21.54,7681200,10.77 -2003-11-10,22.45,22.65,21.84,21.90,8367000,10.95 -2003-11-07,23.19,23.24,22.45,22.50,7505200,11.25 -2003-11-06,22.91,23.15,22.65,23.12,14181200,11.56 -2003-11-05,22.82,23.13,22.47,23.03,11516800,11.52 -2003-11-04,23.07,23.10,22.59,22.91,8901200,11.45 -2003-11-03,22.83,23.30,22.78,23.15,10815800,11.57 -2003-10-31,23.30,23.35,22.78,22.89,7791200,11.44 -2003-10-30,23.99,24.00,22.87,23.09,9305600,11.55 -2003-10-29,23.51,23.90,23.34,23.69,9538600,11.85 -2003-10-28,22.56,23.77,22.40,23.72,8989800,11.86 -2003-10-27,22.75,22.89,22.49,22.60,5786200,11.30 -2003-10-24,22.56,22.85,22.23,22.60,7852000,11.30 -2003-10-23,22.73,23.15,22.59,22.99,5900400,11.49 -2003-10-22,22.94,23.20,22.68,22.76,5771400,11.38 -2003-10-21,23.31,23.40,22.75,23.18,6302200,11.59 -2003-10-20,22.60,23.34,22.38,23.22,9969000,11.61 -2003-10-17,23.38,23.49,22.43,22.75,12850400,11.38 -2003-10-16,23.80,23.84,22.41,23.25,34845800,11.62 -2003-10-15,24.85,25.01,24.58,24.82,21789400,12.41 -2003-10-14,24.32,24.74,24.19,24.55,9836400,12.27 -2003-10-13,23.73,24.41,23.72,24.35,9995200,12.18 -2003-10-10,23.50,23.81,23.37,23.68,6244200,11.84 -2003-10-09,23.30,23.67,22.79,23.45,12419600,11.73 -2003-10-08,23.25,23.54,22.73,23.06,15309600,11.53 -2003-10-07,22.05,23.41,21.91,23.22,14934800,11.61 -2003-10-06,21.67,22.33,21.58,22.29,9583200,11.15 -2003-10-03,20.99,21.86,20.88,21.69,10700000,10.85 -2003-10-02,20.80,20.80,20.28,20.57,7287800,10.28 -2003-10-01,20.71,21.10,20.19,20.79,8432600,10.40 -2003-09-30,21.09,21.22,20.44,20.72,10193800,10.36 -2003-09-29,21.49,21.67,20.65,21.30,13060800,10.65 -2003-09-26,20.30,21.70,20.15,20.69,12401800,10.35 -2003-09-25,21.34,21.37,20.25,20.43,20513600,10.22 -2003-09-24,22.21,22.31,21.08,21.32,10760200,10.66 -2003-09-23,22.02,22.46,21.88,22.43,4730400,11.22 -2003-09-22,22.18,22.50,21.92,22.08,6422200,11.04 -2003-09-19,22.88,23.05,22.43,22.58,7355600,11.29 -2003-09-18,22.10,22.99,21.95,22.88,9032400,11.44 -2003-09-17,22.37,22.38,21.85,22.12,10335600,11.06 -2003-09-16,22.21,22.69,22.20,22.36,9607400,11.18 -2003-09-15,22.81,22.90,22.12,22.21,8101600,11.10 -2003-09-12,22.51,23.14,22.31,23.10,6428200,11.55 -2003-09-11,22.25,22.79,22.10,22.56,7631600,11.28 -2003-09-10,22.25,22.61,22.11,22.18,8031800,11.09 -2003-09-09,22.53,22.67,22.12,22.37,6441800,11.19 -2003-09-08,22.48,22.79,22.47,22.74,5973000,11.37 -2003-09-05,22.73,23.15,22.41,22.50,8576200,11.25 -2003-09-04,23.16,23.25,22.77,22.83,7135000,11.41 -2003-09-03,22.80,23.32,22.76,22.95,9601000,11.48 -2003-09-02,22.66,22.90,22.40,22.85,8647600,11.43 -2003-08-29,22.20,22.85,22.05,22.61,9398400,11.31 -2003-08-28,21.33,22.22,21.33,22.19,11415200,11.10 -2003-08-27,20.91,21.48,20.66,21.48,8060800,10.74 -2003-08-26,20.75,21.07,20.35,21.05,5891400,10.52 -2003-08-25,20.78,20.91,20.49,20.86,4920800,10.43 -2003-08-22,21.81,22.00,20.64,20.88,8938000,10.44 -2003-08-21,21.03,21.71,20.95,21.68,9118800,10.84 -2003-08-20,20.18,21.27,20.14,21.01,9757600,10.51 -2003-08-19,20.37,20.45,20.00,20.32,4774600,10.16 -2003-08-18,19.86,20.41,19.72,20.34,6884800,10.17 -2003-08-15,20.02,20.07,19.66,19.71,4495200,9.85 -2003-08-14,20.21,20.33,19.94,19.97,6885000,9.98 -2003-08-13,19.86,20.34,19.58,20.18,10146400,10.09 -2003-08-12,19.76,19.80,19.46,19.70,5872800,9.85 -2003-08-11,19.82,19.93,19.51,19.66,4901000,9.83 -2003-08-08,20.11,20.13,19.60,19.64,4916400,9.82 -2003-08-07,19.73,20.09,19.42,19.93,6227800,9.97 -2003-08-06,20.06,20.17,19.50,19.63,8766600,9.81 -2003-08-05,21.35,21.40,20.10,20.38,8908600,10.19 -2003-08-04,20.53,21.50,20.28,21.21,8218400,10.60 -2003-08-01,21.00,21.27,20.64,20.73,5343000,10.36 -2003-07-31,20.74,21.35,20.57,21.08,10766600,10.54 -2003-07-30,20.77,20.90,20.17,20.28,6199800,10.14 -2003-07-29,20.99,21.08,20.52,20.72,7040000,10.36 -2003-07-28,21.50,21.50,20.86,20.99,6084200,10.49 -2003-07-25,20.41,21.57,20.40,21.54,7738800,10.77 -2003-07-24,21.04,21.50,20.38,20.51,8187000,10.26 -2003-07-23,20.95,20.96,20.46,20.79,5108400,10.40 -2003-07-22,20.87,20.96,20.50,20.80,7086600,10.40 -2003-07-21,20.69,20.80,20.30,20.61,6564600,10.31 -2003-07-18,20.90,21.18,20.40,20.86,10672800,10.43 -2003-07-17,20.19,20.95,20.13,20.90,26829000,10.45 -2003-07-16,19.97,20.00,19.38,19.87,8961800,9.94 -2003-07-15,20.02,20.24,19.43,19.61,7380200,9.81 -2003-07-14,20.01,20.40,19.87,19.90,6728800,9.95 -2003-07-11,19.66,20.00,19.53,19.85,4887800,9.93 -2003-07-10,19.88,19.94,19.37,19.58,6104800,9.79 -2003-07-09,20.21,20.45,19.89,19.89,7630200,9.94 -2003-07-08,19.52,20.50,19.49,20.40,9169200,10.20 -2003-07-07,19.27,20.18,19.13,19.87,10224000,9.94 -2003-07-03,19.00,19.55,18.98,19.13,4920400,9.56 -2003-07-02,19.03,19.40,19.02,19.27,11617800,9.64 -2003-07-01,18.87,19.18,18.51,19.09,6464000,9.55 -2003-06-30,18.68,19.21,18.59,19.06,7934000,9.53 -2003-06-27,19.30,19.31,18.48,18.73,13064000,9.36 -2003-06-26,18.70,19.32,18.70,19.29,5775200,9.65 -2003-06-25,18.86,19.40,18.71,19.09,11779000,9.55 -2003-06-24,19.47,19.67,18.72,18.78,18370800,9.39 -2003-06-23,19.30,19.69,18.75,19.06,10977200,9.53 -2003-06-20,19.35,19.58,18.90,19.20,12733800,9.60 -2003-06-19,19.36,19.61,18.77,19.14,13626000,9.57 -2003-06-18,18.45,19.48,18.31,19.12,16249400,9.56 -2003-06-17,18.41,18.50,17.99,18.19,6338000,9.10 -2003-06-16,17.60,18.27,17.45,18.27,8518800,9.14 -2003-06-13,17.75,17.95,17.13,17.42,6830200,8.71 -2003-06-12,17.55,17.88,17.45,17.77,9021000,8.89 -2003-06-11,17.15,17.51,16.81,17.45,8039800,8.73 -2003-06-10,16.89,17.29,16.75,17.18,6308800,8.59 -2003-06-09,16.94,17.04,16.63,16.79,9284000,8.40 -2003-06-06,17.74,18.04,17.14,17.15,8621000,8.57 -2003-06-05,17.45,17.74,17.33,17.64,7339200,8.82 -2003-06-04,17.30,17.79,17.14,17.60,9685800,8.80 -2003-06-03,17.44,17.67,17.02,17.31,12887800,8.65 -2003-06-02,18.10,18.29,17.27,17.45,14949600,8.73 -2003-05-30,18.12,18.18,17.53,17.95,13669600,8.98 -2003-05-29,18.29,18.50,17.90,18.10,11920200,9.05 -2003-05-28,18.50,18.66,18.15,18.28,12131400,9.14 -2003-05-27,17.96,18.90,17.91,18.88,10361800,9.44 -2003-05-23,18.21,18.46,17.96,18.32,7382800,9.16 -2003-05-22,17.89,18.40,17.74,18.24,6373600,9.12 -2003-05-21,17.79,18.09,17.67,17.85,10893200,8.93 -2003-05-20,18.10,18.16,17.60,17.79,14865000,8.90 -2003-05-19,18.53,18.65,18.06,18.10,15924600,9.05 -2003-05-16,18.59,19.01,18.28,18.80,12201000,9.40 -2003-05-15,18.60,18.85,18.47,18.73,10178400,9.36 -2003-05-14,18.83,18.84,18.43,18.55,12696000,9.27 -2003-05-13,18.43,18.97,17.95,18.67,15957000,9.34 -2003-05-12,18.15,18.74,18.13,18.56,14977600,9.28 -2003-05-09,18.33,18.40,17.88,18.30,21013800,9.15 -2003-05-08,17.70,18.07,17.29,18.00,24562000,9.00 -2003-05-07,17.33,18.24,17.11,17.65,37656400,8.82 -2003-05-06,16.12,17.90,16.10,17.50,54089000,8.75 -2003-05-05,14.77,16.88,14.75,16.09,55561000,8.05 -2003-05-02,14.46,14.59,14.34,14.45,11470800,7.22 -2003-05-01,14.25,14.39,14.00,14.36,12241400,7.18 -2003-04-30,13.93,14.35,13.85,14.22,16363400,7.11 -2003-04-29,13.98,14.16,13.58,14.06,16365600,7.03 -2003-04-28,13.48,13.96,13.43,13.86,22742800,6.93 -2003-04-25,13.46,13.58,13.23,13.35,7332800,6.68 -2003-04-24,13.52,13.61,13.00,13.44,11611000,6.72 -2003-04-23,13.53,13.63,13.36,13.58,7488600,6.79 -2003-04-22,13.18,13.62,13.09,13.51,10734600,6.76 -2003-04-21,13.13,13.19,12.98,13.14,5440000,6.57 -2003-04-17,13.20,13.25,12.72,13.12,22009200,6.56 -2003-04-16,12.99,13.67,12.92,13.24,36292000,6.62 -2003-04-15,13.59,13.60,13.30,13.39,10856000,6.70 -2003-04-14,13.71,13.75,13.50,13.58,17962800,6.79 -2003-04-11,14.05,14.44,12.93,13.20,49739600,6.60 -2003-04-10,14.20,14.39,14.20,14.37,3825000,7.18 -2003-04-09,14.52,14.62,14.14,14.19,5240200,7.09 -2003-04-08,14.51,14.65,14.36,14.45,4604800,7.22 -2003-04-07,14.85,14.95,14.41,14.49,7030800,7.24 -2003-04-04,14.52,14.67,14.39,14.41,5215000,7.20 -2003-04-03,14.56,14.70,14.35,14.46,5204000,7.23 -2003-04-02,14.36,14.69,14.27,14.60,6120400,7.30 -2003-04-01,14.20,14.31,14.07,14.16,5512200,7.08 -2003-03-31,14.33,14.53,14.04,14.14,9166400,7.07 -2003-03-28,14.40,14.62,14.37,14.57,5189400,7.28 -2003-03-27,14.32,14.70,14.32,14.49,4371200,7.24 -2003-03-26,14.55,14.56,14.30,14.41,6369400,7.20 -2003-03-25,14.41,14.83,14.37,14.55,5989200,7.28 -2003-03-24,14.67,14.80,14.35,14.37,5753600,7.18 -2003-03-21,15.09,15.15,14.82,15.00,10641000,7.50 -2003-03-20,14.93,14.99,14.60,14.91,5827800,7.45 -2003-03-19,15.07,15.15,14.79,14.95,5047000,7.47 -2003-03-18,15.00,15.09,14.82,15.00,8213600,7.50 -2003-03-17,14.89,15.07,14.71,15.01,14282600,7.51 -2003-03-14,14.68,15.01,14.64,14.78,5467800,7.39 -2003-03-13,14.47,14.80,14.17,14.72,11980200,7.36 -2003-03-12,14.17,14.39,14.06,14.22,7948600,7.11 -2003-03-11,14.36,14.49,14.12,14.23,5756800,7.11 -2003-03-10,14.51,14.67,14.30,14.37,4806200,7.18 -2003-03-07,14.47,14.71,14.31,14.53,7178000,7.26 -2003-03-06,14.58,14.60,14.40,14.56,3566400,7.28 -2003-03-05,14.61,14.80,14.52,14.62,4524400,7.31 -2003-03-04,14.74,14.81,14.44,14.56,4514800,7.28 -2003-03-03,15.01,15.16,14.55,14.65,7277200,7.32 -2003-02-28,14.86,15.09,14.77,15.01,6967800,7.51 -2003-02-27,14.57,15.00,14.51,14.86,5512200,7.43 -2003-02-26,14.99,15.02,14.48,14.50,7753400,7.25 -2003-02-25,14.68,15.08,14.58,15.02,6737200,7.51 -2003-02-24,14.86,15.03,13.80,14.74,6437600,7.37 -2003-02-21,14.82,15.06,14.65,15.00,5623000,7.50 -2003-02-20,14.85,14.96,14.71,14.77,8012600,7.39 -2003-02-19,15.07,15.15,14.68,14.85,8584600,7.43 -2003-02-18,14.75,15.30,14.72,15.27,10389200,7.64 -2003-02-14,14.61,14.72,14.35,14.67,8689200,7.34 -2003-02-13,14.41,14.64,14.24,14.54,7446200,7.27 -2003-02-12,14.27,14.60,14.27,14.39,8167400,7.20 -2003-02-11,14.50,14.63,14.20,14.35,5885000,7.18 -2003-02-10,14.26,14.57,14.06,14.35,5996000,7.18 -2003-02-07,14.55,14.60,14.07,14.15,9632200,7.07 -2003-02-06,14.36,14.59,14.22,14.43,6398200,7.22 -2003-02-05,14.71,14.93,14.44,14.45,7914800,7.22 -2003-02-04,14.45,14.65,14.31,14.60,11336200,7.30 -2003-02-03,14.41,14.91,14.35,14.66,9456600,7.33 -2003-01-31,14.19,14.55,14.05,14.36,12186600,7.18 -2003-01-30,14.98,15.07,14.29,14.32,14537800,7.16 -2003-01-29,14.55,15.10,14.30,14.93,13323000,7.47 -2003-01-28,14.24,14.69,14.16,14.58,10223400,7.29 -2003-01-27,13.68,14.50,13.65,14.13,13978800,7.07 -2003-01-24,14.24,14.24,13.56,13.80,10909600,6.90 -2003-01-23,14.05,14.36,13.95,14.17,8152000,7.09 -2003-01-22,13.98,14.15,13.80,13.88,7683600,6.94 -2003-01-21,14.21,14.41,14.00,14.02,9052000,7.01 -2003-01-17,14.56,14.56,14.08,14.10,9527200,7.05 -2003-01-16,14.21,14.76,14.21,14.62,19966800,7.31 -2003-01-15,14.59,14.70,14.26,14.43,13254600,7.22 -2003-01-14,14.69,14.82,14.49,14.61,6673600,7.30 -2003-01-13,14.90,14.90,14.36,14.63,6390800,7.32 -2003-01-10,14.58,14.82,14.49,14.72,6253600,7.36 -2003-01-09,14.62,14.92,14.50,14.68,7687600,7.34 -2003-01-08,14.58,14.71,14.44,14.55,8201600,7.28 -2003-01-07,14.79,15.00,14.47,14.85,12226600,7.43 -2003-01-06,15.03,15.38,14.88,14.90,13947600,7.45 -2003-01-03,14.80,14.93,14.59,14.90,5266200,7.45 -2003-01-02,14.36,14.92,14.35,14.80,6479600,7.40 -2002-12-31,14.00,14.36,13.95,14.33,7168800,7.16 -2002-12-30,14.08,14.15,13.84,14.07,5537200,7.03 -2002-12-27,14.31,14.38,14.01,14.06,2858400,7.03 -2002-12-26,14.42,14.81,14.28,14.40,3050800,7.20 -2002-12-24,14.44,14.47,14.30,14.36,1405000,7.18 -2002-12-23,14.16,14.55,14.12,14.49,4493800,7.24 -2002-12-20,14.29,14.56,13.78,14.14,11360600,7.07 -2002-12-19,14.53,14.92,14.10,14.20,12411400,7.10 -2002-12-18,14.80,14.86,14.50,14.57,5382200,7.28 -2002-12-17,14.85,15.19,14.66,15.08,7952200,7.54 -2002-12-16,14.81,15.10,14.61,14.85,8986600,7.43 -2002-12-13,15.14,15.15,14.65,14.79,5885000,7.39 -2002-12-12,15.51,15.55,15.01,15.19,5333600,7.59 -2002-12-11,15.30,15.49,15.08,15.49,9053600,7.74 -2002-12-10,14.75,15.45,14.73,15.28,11021800,7.64 -2002-12-09,14.94,14.95,14.67,14.75,8431600,7.38 -2002-12-06,14.65,15.19,14.52,14.95,8762800,7.47 -2002-12-05,15.03,15.08,14.53,14.63,8692800,7.32 -2002-12-04,15.18,15.19,14.50,14.97,11634200,7.49 -2002-12-03,15.20,15.34,15.10,15.16,8138200,7.58 -2002-12-02,15.90,16.10,15.01,15.18,14240800,7.59 -2002-11-29,15.79,15.88,15.41,15.50,5122600,7.75 -2002-11-27,15.60,15.86,15.45,15.72,10242800,7.86 -2002-11-26,15.85,15.90,15.27,15.41,8580800,7.70 -2002-11-25,16.03,16.14,15.71,15.97,7122400,7.99 -2002-11-22,16.09,16.30,15.90,16.01,8137800,8.01 -2002-11-21,15.90,16.44,15.75,16.35,14945800,8.18 -2002-11-20,15.30,15.70,15.25,15.53,7455000,7.76 -2002-11-19,15.55,15.75,15.01,15.27,7534000,7.64 -2002-11-18,16.19,16.20,15.52,15.65,5877800,7.82 -2002-11-15,16.23,16.24,15.76,15.95,5749800,7.97 -2002-11-14,15.90,16.41,15.78,16.30,5061200,8.15 -2002-11-13,15.50,16.07,15.28,15.59,8276400,7.80 -2002-11-12,15.32,16.04,15.28,15.64,7992600,7.82 -2002-11-11,15.74,15.89,15.12,15.16,5463400,7.58 -2002-11-08,16.01,16.20,15.52,15.84,6788000,7.92 -2002-11-07,16.94,17.10,15.81,16.00,12006400,8.00 -2002-11-06,17.08,17.32,16.70,17.22,7728200,8.61 -2002-11-05,16.75,16.96,16.35,16.90,7524800,8.45 -2002-11-04,16.50,17.38,16.35,16.89,13457800,8.44 -2002-11-01,15.94,16.50,15.89,16.36,6779600,8.18 -2002-10-31,15.99,16.44,15.92,16.07,10565600,8.03 -2002-10-30,15.49,16.37,15.48,15.98,9667000,7.99 -2002-10-29,15.57,15.88,14.96,15.44,9256400,7.72 -2002-10-28,15.55,15.95,15.25,15.61,12475000,7.80 -2002-10-25,14.69,15.45,14.59,15.42,9966800,7.71 -2002-10-24,15.02,15.21,14.55,14.69,6241000,7.34 -2002-10-23,14.63,14.98,14.50,14.88,7465600,7.44 -2002-10-22,14.47,14.88,14.26,14.70,7791000,7.35 -2002-10-21,14.26,14.63,14.00,14.56,8518600,7.28 -2002-10-18,14.00,14.35,13.93,14.34,10296400,7.17 -2002-10-17,14.21,14.38,13.98,14.11,16760600,7.05 -2002-10-16,14.86,15.13,13.90,14.56,10986600,7.28 -2002-10-15,15.22,15.25,14.78,15.16,14482800,7.58 -2002-10-14,14.55,14.98,14.44,14.77,6943000,7.39 -2002-10-11,14.25,14.78,14.10,14.51,10524200,7.26 -2002-10-10,13.63,14.22,13.58,14.11,11484800,7.05 -2002-10-09,13.54,13.85,13.41,13.59,12738800,6.80 -2002-10-08,13.90,13.96,13.36,13.68,16201600,6.84 -2002-10-07,13.97,14.21,13.76,13.77,8739200,6.89 -2002-10-04,14.36,14.40,13.99,14.03,6815200,7.01 -2002-10-03,14.18,14.60,14.06,14.30,7782000,7.15 -2002-10-02,14.33,14.63,14.10,14.17,8191000,7.09 -2002-10-01,14.59,14.60,14.00,14.51,12229400,7.26 -2002-09-30,14.40,14.57,14.14,14.50,8489200,7.25 -2002-09-27,14.49,14.85,14.48,14.72,7362600,7.36 -2002-09-26,15.10,15.19,14.55,14.70,7451600,7.35 -2002-09-25,14.69,15.17,14.65,14.93,9095800,7.47 -2002-09-24,14.40,14.82,14.40,14.64,8952200,7.32 -2002-09-23,14.76,14.96,14.45,14.85,9418200,7.43 -2002-09-20,14.62,14.94,14.52,14.87,12599600,7.43 -2002-09-19,14.75,14.80,14.48,14.58,7355200,7.29 -2002-09-18,14.69,15.09,14.52,15.02,11737200,7.51 -2002-09-17,14.57,15.03,14.57,14.80,15285600,7.40 -2002-09-16,14.14,14.61,14.12,14.50,10237200,7.25 -2002-09-13,14.13,14.34,14.05,14.17,10105400,7.09 -2002-09-12,14.20,14.51,14.12,14.14,9636800,7.07 -2002-09-11,14.34,14.60,14.15,14.29,7229000,7.14 -2002-09-10,14.41,14.49,14.12,14.33,8909600,7.16 -2002-09-09,14.28,14.53,14.15,14.37,5651600,7.18 -2002-09-06,14.51,14.65,14.23,14.38,6485400,7.19 -2002-09-05,14.22,14.36,14.05,14.18,8077800,7.09 -2002-09-04,14.20,14.78,14.17,14.48,15023600,7.24 -2002-09-03,14.49,14.55,14.05,14.05,9890600,7.03 -2002-08-30,14.73,15.14,14.58,14.75,6911400,7.38 -2002-08-29,14.65,15.08,14.51,14.70,5863200,7.35 -2002-08-28,14.80,15.12,14.65,14.70,8856200,7.35 -2002-08-27,15.71,15.74,14.71,14.85,9365400,7.43 -2002-08-26,15.95,15.95,15.16,15.53,6784600,7.76 -2002-08-23,15.90,15.93,15.45,15.73,5830200,7.86 -2002-08-22,16.20,16.25,15.66,15.97,9225400,7.99 -2002-08-21,16.01,16.24,15.45,16.12,7229600,8.06 -2002-08-20,15.97,16.09,15.53,15.91,6665200,7.95 -2002-08-19,15.78,16.25,15.72,15.98,7734200,7.99 -2002-08-16,15.45,16.10,15.28,15.81,8758000,7.91 -2002-08-15,15.25,15.75,15.01,15.61,11502800,7.80 -2002-08-14,14.67,15.35,14.54,15.17,14253000,7.59 -2002-08-13,14.90,15.21,14.55,14.59,9638200,7.30 -2002-08-12,14.90,15.02,14.69,14.99,6420200,7.49 -2002-08-09,15.25,15.25,14.75,15.00,7347000,7.50 -2002-08-08,14.77,15.38,14.77,15.30,8119600,7.65 -2002-08-07,15.09,15.36,14.35,15.03,11909800,7.51 -2002-08-06,14.21,15.23,14.08,14.74,9716200,7.37 -2002-08-05,14.51,14.70,13.97,13.99,7286600,6.99 -2002-08-02,14.74,15.00,14.25,14.45,6395000,7.22 -2002-08-01,15.11,15.42,14.73,14.80,8177000,7.40 -2002-07-31,15.40,15.42,14.90,15.26,11096400,7.63 -2002-07-30,14.85,15.51,14.56,15.43,12672800,7.72 -2002-07-29,14.48,15.10,14.37,15.02,9820000,7.51 -2002-07-26,14.46,14.53,13.80,14.34,7418000,7.17 -2002-07-25,14.93,14.95,14.01,14.36,17119800,7.18 -2002-07-24,14.33,15.22,14.25,15.20,14521200,7.60 -2002-07-23,14.90,15.13,14.44,14.47,14281800,7.24 -2002-07-22,14.75,15.19,14.61,14.92,15389200,7.46 -2002-07-19,14.70,15.17,14.53,14.96,13757400,7.48 -2002-07-18,15.50,15.56,14.75,14.99,19980800,7.49 -2002-07-17,16.13,16.20,15.19,15.63,43410200,7.82 -2002-07-16,18.15,18.57,17.61,17.86,15956000,8.93 -2002-07-15,17.43,18.60,16.81,18.23,10571200,9.11 -2002-07-12,18.55,18.79,17.26,17.51,15839000,8.76 -2002-07-11,17.26,18.35,16.97,18.30,13345600,9.15 -2002-07-10,17.71,18.17,17.25,17.32,7388600,8.66 -2002-07-09,18.09,18.29,17.46,17.53,8098200,8.77 -2002-07-08,18.52,18.61,17.68,18.01,7543000,9.01 -2002-07-05,17.71,18.75,17.71,18.74,5773200,9.37 -2002-07-03,16.81,17.68,16.75,17.55,7108200,8.77 -2002-07-02,17.03,17.16,16.83,16.94,10899600,8.47 -2002-07-01,17.71,17.88,17.05,17.06,7953200,8.53 -2002-06-28,17.10,17.82,17.00,17.72,9637800,8.86 -2002-06-27,16.79,17.27,16.42,17.06,8987800,8.53 -2002-06-26,16.80,17.29,15.98,16.55,19962600,8.27 -2002-06-25,17.40,17.68,16.86,17.14,10757200,8.57 -2002-06-24,16.77,17.73,16.70,17.27,15426200,8.64 -2002-06-21,16.97,17.49,16.79,16.85,15899200,8.43 -2002-06-20,17.17,17.60,16.85,17.11,14165600,8.56 -2002-06-19,17.37,17.60,16.88,17.12,61052400,8.56 -2002-06-18,20.42,20.59,19.98,20.15,12620000,10.07 -2002-06-17,20.24,20.63,19.85,20.54,11593200,10.27 -2002-06-14,19.24,20.36,18.11,20.10,15175000,10.05 -2002-06-13,20.02,20.05,19.38,19.54,12574400,9.77 -2002-06-12,20.41,20.75,19.94,20.09,18882800,10.05 -2002-06-11,21.64,21.70,20.41,20.46,12482000,10.23 -2002-06-10,21.48,21.84,21.34,21.48,9913400,10.74 -2002-06-07,21.76,21.94,20.93,21.40,21870600,10.70 -2002-06-06,22.96,23.23,22.04,22.16,9285600,11.08 -2002-06-05,22.83,22.83,22.35,22.72,9895800,11.36 -2002-06-04,22.88,23.04,22.18,22.78,12422200,11.39 -2002-06-03,23.39,23.45,22.58,22.91,8396800,11.45 -2002-05-31,24.09,24.25,23.28,23.30,13053400,11.65 -2002-05-30,23.77,24.38,23.51,24.20,7013400,12.10 -2002-05-29,23.92,24.44,23.45,23.98,7921200,11.99 -2002-05-28,23.69,24.20,23.43,23.98,5347000,11.99 -2002-05-24,24.99,24.99,23.96,24.15,5934800,12.07 -2002-05-23,24.45,25.24,24.07,25.18,13192800,12.59 -2002-05-22,23.37,24.37,23.32,24.32,10388400,12.16 -2002-05-21,24.83,25.00,23.40,23.46,10035400,11.73 -2002-05-20,24.57,24.93,24.53,24.74,9639800,12.37 -2002-05-17,25.49,25.78,24.61,25.01,8446200,12.51 -2002-05-16,25.06,25.45,24.75,25.21,8109000,12.60 -2002-05-15,25.37,25.98,24.84,25.28,11993800,12.64 -2002-05-14,24.45,25.68,24.22,25.61,18803800,12.81 -2002-05-13,23.52,24.09,22.94,23.94,9486000,11.97 -2002-05-10,24.29,24.29,22.98,23.32,8407000,11.66 -2002-05-09,24.25,24.35,23.80,24.19,8022000,12.10 -2002-05-08,23.20,24.52,23.04,24.37,15595800,12.19 -2002-05-07,22.94,22.95,22.14,22.47,8669600,11.23 -2002-05-06,23.35,23.50,22.46,22.65,8916600,11.32 -2002-05-03,23.57,24.02,23.43,23.51,8242200,11.76 -2002-05-02,23.81,24.34,23.60,23.69,8548000,11.85 -2002-05-01,24.29,24.29,23.36,23.98,7668000,11.99 -2002-04-30,23.89,24.38,23.75,24.27,10034400,12.14 -2002-04-29,23.16,24.06,23.09,23.96,9724600,11.98 -2002-04-26,24.28,24.37,23.00,23.01,10892200,11.51 -2002-04-25,23.56,24.34,23.55,24.12,6935800,12.06 -2002-04-24,24.30,24.50,23.68,23.77,5016000,11.89 -2002-04-23,24.54,24.78,24.09,24.25,8338200,12.12 -2002-04-22,24.84,24.93,24.23,24.53,9622400,12.27 -2002-04-19,25.49,25.49,24.93,24.98,13407400,12.49 -2002-04-18,25.50,25.52,24.88,25.41,14346800,12.70 -2002-04-17,25.93,26.17,25.38,26.11,14151800,13.06 -2002-04-16,25.15,25.99,25.12,25.74,21949200,12.87 -2002-04-15,25.06,25.15,24.80,25.00,10691800,12.50 -2002-04-12,25.01,25.17,24.57,25.06,11437200,12.53 -2002-04-11,25.03,25.20,24.75,24.86,14544800,12.43 -2002-04-10,24.21,24.95,24.01,24.66,8035000,12.33 -2002-04-09,24.59,25.00,24.01,24.10,6840400,12.05 -2002-04-08,24.16,24.68,23.78,24.56,9339800,12.28 -2002-04-05,24.95,25.19,24.10,24.74,9941000,12.37 -2002-04-04,23.67,25.05,23.67,24.90,12089200,12.45 -2002-04-03,24.05,24.49,23.60,23.75,7661800,11.88 -2002-04-02,24.00,24.30,23.87,24.07,7278400,12.03 -2002-04-01,23.38,24.70,23.28,24.46,7108800,12.23 -2002-03-28,23.70,23.88,23.46,23.67,3873400,11.84 -2002-03-27,23.35,23.72,23.26,23.47,4560800,11.73 -2002-03-26,23.20,23.64,23.00,23.46,9208600,11.73 -2002-03-25,24.07,24.09,23.24,23.35,9386800,11.68 -2002-03-22,24.22,24.56,23.87,24.09,7221200,12.05 -2002-03-21,23.86,24.30,23.26,24.27,22012600,12.14 -2002-03-20,24.66,25.14,24.50,24.92,10511400,12.46 -2002-03-19,24.69,25.30,24.30,24.85,8655200,12.43 -2002-03-18,24.95,25.05,24.32,24.74,10877000,12.37 -2002-03-15,24.46,24.96,24.25,24.95,8603600,12.48 -2002-03-14,24.30,24.60,23.87,24.43,7760600,12.22 -2002-03-13,24.37,24.85,24.15,24.49,7170200,12.24 -2002-03-12,24.51,24.74,24.10,24.72,9073400,12.36 -2002-03-11,24.60,25.14,24.10,25.06,9385200,12.53 -2002-03-08,24.74,25.09,24.30,24.66,9634800,12.33 -2002-03-07,24.06,24.53,23.61,24.38,9223200,12.19 -2002-03-06,23.48,24.34,22.93,24.07,8078800,12.03 -2002-03-05,24.15,24.43,23.40,23.53,9810800,11.77 -2002-03-04,23.26,24.58,22.76,24.29,12437800,12.15 -2002-03-01,21.93,23.50,21.82,23.45,12464000,11.73 -2002-02-28,22.15,22.59,21.35,21.70,16319200,10.85 -2002-02-27,23.94,24.25,20.94,21.96,36791400,10.98 -2002-02-26,23.91,24.37,23.25,23.67,9290400,11.84 -2002-02-25,22.85,24.72,22.36,23.81,15244600,11.90 -2002-02-22,21.66,22.95,21.50,22.74,14517000,11.37 -2002-02-21,22.92,23.00,21.45,21.50,15955400,10.75 -2002-02-20,22.77,23.20,22.35,23.13,10194400,11.56 -2002-02-19,23.76,23.87,22.48,22.62,13937800,11.31 -2002-02-15,24.53,24.98,23.85,23.90,9292400,11.95 -2002-02-14,25.05,25.23,24.38,24.60,9291800,12.30 -2002-02-13,24.73,25.24,24.65,25.01,11174000,12.51 -2002-02-12,24.66,25.04,24.45,24.71,8010000,12.35 -2002-02-11,23.93,25.00,23.74,24.98,14235800,12.49 -2002-02-08,24.40,24.64,23.37,24.03,12690400,12.02 -2002-02-07,24.65,25.29,24.08,24.30,12422600,12.15 -2002-02-06,25.60,25.98,24.15,24.67,21342000,12.34 -2002-02-05,25.09,25.98,25.08,25.45,16317400,12.73 -2002-02-04,24.32,25.52,24.20,25.35,18656200,12.68 -2002-02-01,24.34,24.96,24.34,24.41,14225200,12.20 -2002-01-31,24.16,24.73,24.11,24.72,16730200,12.36 -2002-01-30,23.07,24.14,22.94,24.09,16842000,12.05 -2002-01-29,23.22,23.54,22.85,23.07,8583000,11.53 -2002-01-28,23.40,23.55,22.72,23.27,6658800,11.64 -2002-01-25,22.89,23.42,22.66,23.25,6639800,11.62 -2002-01-24,22.91,23.51,22.90,23.21,12285800,11.60 -2002-01-23,21.80,23.04,21.59,23.02,15831400,11.51 -2002-01-22,22.27,22.37,21.82,21.82,11689800,10.91 -2002-01-18,22.00,22.60,21.96,22.17,12100400,11.09 -2002-01-17,21.96,22.74,21.87,22.48,23592000,11.24 -2002-01-16,21.41,21.41,20.50,20.78,20246200,10.39 -2002-01-15,21.32,21.76,21.21,21.70,10368600,10.85 -2002-01-14,21.01,21.40,20.90,21.15,14857000,10.57 -2002-01-11,21.39,21.84,20.60,21.05,12457200,10.52 -2002-01-10,21.22,21.46,20.25,21.23,16169200,10.61 -2002-01-09,22.80,22.93,21.28,21.65,11708400,10.82 -2002-01-08,22.75,23.05,22.46,22.61,16072800,11.31 -2002-01-07,23.72,24.00,22.75,22.90,15878000,11.45 -2002-01-04,23.34,23.95,22.99,23.69,14642000,11.85 -2002-01-03,23.00,23.75,22.77,23.58,21857400,11.79 -2002-01-02,22.05,23.30,21.96,23.30,18910600,11.65 -2001-12-31,22.51,22.66,21.83,21.90,4920800,10.95 -2001-12-28,21.97,23.00,21.96,22.43,10683000,11.22 -2001-12-27,21.58,22.25,21.58,22.07,6839600,11.03 -2001-12-26,21.35,22.30,21.14,21.49,5228600,10.74 -2001-12-24,20.90,21.45,20.90,21.36,1808200,10.68 -2001-12-21,21.01,21.54,20.80,21.00,9154800,10.50 -2001-12-20,21.40,21.47,20.62,20.67,7888000,10.34 -2001-12-19,20.58,21.68,20.47,21.62,10355600,10.81 -2001-12-18,20.89,21.33,20.22,21.01,8401400,10.51 -2001-12-17,20.40,21.00,20.19,20.62,6204000,10.31 -2001-12-14,20.73,20.83,20.09,20.39,6781600,10.19 -2001-12-13,21.49,21.55,20.50,21.00,7065800,10.50 -2001-12-12,21.87,21.92,21.25,21.49,6873600,10.74 -2001-12-11,22.67,22.85,21.65,21.78,7338400,10.89 -2001-12-10,22.29,22.99,22.23,22.54,6071800,11.27 -2001-12-07,22.46,22.71,22.00,22.54,7268400,11.27 -2001-12-06,23.48,23.50,22.14,22.78,12104800,11.39 -2001-12-05,22.36,24.03,22.17,23.76,20306400,11.88 -2001-12-04,21.05,22.56,20.72,22.40,13586400,11.20 -2001-12-03,21.06,21.28,20.60,21.05,6470200,10.52 -2001-11-30,20.47,21.44,20.25,21.30,10854000,10.65 -2001-11-29,20.60,20.70,20.19,20.42,7241600,10.21 -2001-11-28,20.85,21.21,20.41,20.53,8950400,10.27 -2001-11-27,21.20,21.52,20.50,21.00,9591200,10.50 -2001-11-26,19.94,21.55,19.88,21.37,16453200,10.69 -2001-11-23,19.71,19.95,19.57,19.84,2143000,9.92 -2001-11-21,19.61,19.80,19.26,19.68,7199400,9.84 -2001-11-20,19.82,20.20,19.50,19.53,9878000,9.77 -2001-11-19,19.00,20.05,18.96,20.00,11878200,10.00 -2001-11-16,19.27,19.29,18.40,18.97,8238000,9.48 -2001-11-15,19.45,19.90,19.23,19.45,7608200,9.73 -2001-11-14,19.59,19.90,19.15,19.61,7898200,9.81 -2001-11-13,19.08,19.39,18.71,19.37,8024000,9.69 -2001-11-12,18.66,19.17,17.96,18.75,7196400,9.38 -2001-11-09,18.60,19.25,18.55,18.71,4796200,9.35 -2001-11-08,19.63,19.89,18.57,18.71,12219400,9.35 -2001-11-07,19.46,20.13,19.33,19.59,13678200,9.80 -2001-11-06,18.96,19.62,18.53,19.57,11286400,9.78 -2001-11-05,18.84,19.25,18.61,19.07,8421200,9.53 -2001-11-02,18.52,18.86,18.16,18.57,7043000,9.28 -2001-11-01,17.65,18.78,17.25,18.59,11178400,9.30 -2001-10-31,17.73,18.40,17.44,17.56,9776800,8.78 -2001-10-30,17.38,18.00,17.06,17.60,9884400,8.80 -2001-10-29,18.57,18.67,17.60,17.63,8542200,8.81 -2001-10-26,18.86,19.25,18.62,18.67,9963000,9.34 -2001-10-25,18.44,19.25,18.16,19.19,9105400,9.60 -2001-10-24,18.06,19.09,17.75,18.95,13372400,9.48 -2001-10-23,19.12,19.42,17.87,18.14,24463600,9.07 -2001-10-22,18.21,19.07,18.09,19.02,13997800,9.51 -2001-10-19,17.94,18.40,17.88,18.30,5956800,9.15 -2001-10-18,17.29,18.23,17.29,18.00,21877600,9.00 -2001-10-17,18.34,18.41,16.96,16.99,10197800,8.49 -2001-10-16,18.09,18.20,17.77,18.01,7248200,9.01 -2001-10-15,17.95,18.38,17.95,17.99,11384000,8.99 -2001-10-12,17.31,18.08,16.86,18.01,10279000,9.01 -2001-10-11,16.92,17.74,16.85,17.74,11934400,8.87 -2001-10-10,16.10,16.85,15.95,16.82,10991400,8.41 -2001-10-09,16.05,16.20,15.63,16.00,6215200,8.00 -2001-10-08,15.57,16.35,15.50,16.20,7428000,8.10 -2001-10-05,15.40,16.15,14.99,16.14,12238800,8.07 -2001-10-04,15.35,16.25,14.99,15.88,14325800,7.94 -2001-10-03,14.95,15.36,14.83,14.98,24394400,7.49 -2001-10-02,15.43,15.83,14.88,15.05,8424400,7.53 -2001-10-01,15.49,15.99,15.23,15.54,7436000,7.77 -2001-09-28,15.71,15.91,15.39,15.51,13039600,7.76 -2001-09-27,15.25,15.75,15.20,15.51,11508600,7.76 -2001-09-26,15.81,15.89,14.93,15.15,17635600,7.57 -2001-09-25,16.14,16.22,15.35,15.54,13371600,7.77 -2001-09-24,16.11,16.84,15.95,16.45,10519200,8.23 -2001-09-21,14.80,16.25,14.68,15.73,20375600,7.86 -2001-09-20,16.29,16.95,15.50,15.68,14684800,7.84 -2001-09-19,16.50,17.10,15.60,17.02,13332800,8.51 -2001-09-18,16.90,17.72,16.17,16.28,11682200,8.14 -2001-09-17,16.00,17.07,15.73,16.99,16357400,8.49 -2001-09-10,17.00,17.50,16.92,17.37,11030200,8.69 -2001-09-07,17.50,18.10,17.20,17.28,8636800,8.64 -2001-09-06,18.40,18.93,17.65,17.72,10084600,8.86 -2001-09-05,18.24,18.95,18.12,18.55,12859200,9.27 -2001-09-04,18.50,19.08,18.18,18.25,12436200,9.12 -2001-08-31,17.73,18.60,17.65,18.55,7746600,9.27 -2001-08-30,17.74,18.18,17.28,17.83,13167600,8.91 -2001-08-29,18.44,18.83,17.83,17.83,8570400,8.91 -2001-08-28,18.90,19.14,18.40,18.40,6133400,9.20 -2001-08-27,18.60,19.30,18.16,18.92,6273000,9.46 -2001-08-24,18.00,18.62,17.65,18.57,10369000,9.28 -2001-08-23,18.20,18.34,17.58,17.81,7752800,8.90 -2001-08-22,17.94,18.25,17.61,18.21,6213400,9.10 -2001-08-21,18.14,18.14,17.70,17.92,6632200,8.96 -2001-08-20,18.14,18.23,17.81,18.12,9010800,9.06 -2001-08-17,18.00,18.45,17.99,18.07,7443800,9.03 -2001-08-16,18.27,18.75,17.97,18.65,10289000,9.32 -2001-08-15,18.76,18.94,18.20,18.44,10331400,9.22 -2001-08-14,19.20,19.36,18.67,18.73,8176800,9.36 -2001-08-13,19.10,19.33,18.76,19.09,5285600,9.55 -2001-08-10,19.04,19.32,18.59,19.02,6677200,9.51 -2001-08-09,18.96,19.15,18.72,19.05,7166600,9.52 -2001-08-08,19.26,19.70,18.54,18.90,9863200,9.45 -2001-08-07,19.33,19.67,18.98,19.25,6019600,9.62 -2001-08-06,19.04,19.66,19.00,19.13,3559000,9.56 -2001-08-03,19.89,19.90,19.00,19.50,6644800,9.75 -2001-08-02,19.65,19.87,19.26,19.82,9003200,9.91 -2001-08-01,19.01,19.78,18.95,19.06,10862000,9.53 -2001-07-31,19.27,19.42,18.51,18.79,8393800,9.40 -2001-07-30,19.12,19.36,18.51,18.93,8691400,9.47 -2001-07-27,18.75,19.25,18.50,18.96,11933400,9.48 -2001-07-26,18.48,18.80,17.85,18.59,13183600,9.30 -2001-07-25,19.12,19.30,17.97,18.47,15852800,9.23 -2001-07-24,19.39,19.92,18.73,19.09,12442000,9.55 -2001-07-23,20.09,20.50,19.51,19.54,8620000,9.77 -2001-07-20,19.70,20.06,19.49,19.98,15878000,9.99 -2001-07-19,21.23,21.42,19.75,19.96,30755000,9.98 -2001-07-18,21.78,22.78,20.42,20.79,40607600,10.40 -2001-07-17,23.98,25.22,23.01,25.10,23136800,12.55 -2001-07-16,24.88,25.10,23.91,23.96,9952400,11.98 -2001-07-13,24.13,25.01,23.84,24.85,16240800,12.43 -2001-07-12,23.30,24.81,23.30,24.36,21957200,12.18 -2001-07-11,21.03,22.55,21.00,22.54,16803800,11.27 -2001-07-10,22.95,23.07,20.84,21.14,14116800,10.57 -2001-07-09,22.09,23.00,21.68,22.70,12052400,11.35 -2001-07-06,22.76,22.96,21.72,22.03,10818600,11.02 -2001-07-05,23.60,23.77,23.01,23.19,5439000,11.60 -2001-07-03,23.51,24.18,23.50,23.84,4019400,11.92 -2001-07-02,23.64,24.23,23.14,23.90,8216000,11.95 -2001-06-29,23.66,25.10,23.20,23.25,18406800,11.62 -2001-06-28,23.05,23.91,22.94,23.54,12443200,11.77 -2001-06-27,23.83,24.00,22.50,23.34,13361800,11.67 -2001-06-26,23.34,23.77,23.01,23.75,9742200,11.88 -2001-06-25,22.50,24.00,22.45,23.99,15698200,11.99 -2001-06-22,22.48,23.00,21.76,22.26,10215200,11.13 -2001-06-21,21.55,23.00,21.10,22.49,12190400,11.24 -2001-06-20,20.00,21.85,19.98,21.67,15415000,10.84 -2001-06-19,20.85,21.40,20.01,20.19,11467400,10.10 -2001-06-18,20.41,20.85,20.00,20.33,12354000,10.16 -2001-06-15,20.10,20.75,19.35,20.44,16236600,10.22 -2001-06-14,20.04,20.45,19.77,19.88,10619600,9.94 -2001-06-13,21.42,21.73,20.06,20.47,18267400,10.23 -2001-06-12,19.77,20.69,19.76,20.31,10849800,10.15 -2001-06-11,21.05,21.07,19.95,20.04,10500000,10.02 -2001-06-08,21.65,21.65,20.71,21.32,12236600,10.66 -2001-06-07,20.71,21.70,20.45,21.66,11613600,10.83 -2001-06-06,20.93,20.93,20.33,20.73,7970600,10.36 -2001-06-05,20.80,21.10,20.35,20.94,16849800,10.47 -2001-06-04,21.08,21.11,20.46,20.66,10068600,10.33 -2001-06-01,20.13,21.09,19.98,20.89,16288400,10.44 -2001-05-31,19.80,20.24,19.49,19.95,15817600,9.98 -2001-05-30,20.76,20.76,19.30,19.78,27752800,9.89 -2001-05-29,22.32,22.50,20.81,21.47,18428200,10.73 -2001-05-25,23.20,23.29,22.50,22.76,5669400,11.38 -2001-05-24,23.29,23.30,22.62,23.20,9705600,11.60 -2001-05-23,23.75,23.75,22.86,23.23,10037200,11.61 -2001-05-22,24.00,24.13,23.40,23.50,14747000,11.75 -2001-05-21,23.63,23.91,23.05,23.56,16464200,11.78 -2001-05-18,23.36,23.64,23.12,23.53,5680400,11.77 -2001-05-17,24.23,24.33,23.25,23.55,11861400,11.77 -2001-05-16,23.26,24.50,22.85,24.10,11511800,12.05 -2001-05-15,23.37,25.50,23.04,23.18,8465200,11.59 -2001-05-14,22.89,23.68,22.75,23.29,11043600,11.65 -2001-05-11,23.01,23.49,22.76,22.85,7251600,11.43 -2001-05-10,24.21,24.50,22.95,23.00,10320600,11.50 -2001-05-09,24.14,24.55,23.67,23.98,11603200,11.99 -2001-05-08,25.35,25.45,23.95,24.57,11265600,12.28 -2001-05-07,25.62,25.76,24.84,24.96,9876800,12.48 -2001-05-04,24.24,25.85,23.96,25.75,10037600,12.88 -2001-05-03,25.97,26.25,24.73,24.96,10769400,12.48 -2001-05-02,26.34,26.70,25.76,26.59,13161600,13.30 -2001-05-01,25.41,26.50,25.20,25.93,15259000,12.97 -2001-04-30,26.70,27.12,24.87,25.49,17670600,12.74 -2001-04-27,25.20,26.29,24.75,26.20,16179000,13.10 -2001-04-26,25.17,26.10,24.68,24.69,28560600,12.35 -2001-04-25,24.21,24.86,23.57,24.72,11813600,12.36 -2001-04-24,24.33,24.75,23.51,24.03,13469200,12.02 -2001-04-23,24.34,25.00,24.00,24.25,19340200,12.12 -2001-04-20,24.93,25.63,24.60,25.04,24764400,12.52 -2001-04-19,25.55,25.75,23.60,25.72,66916800,12.86 -2001-04-18,21.57,24.08,21.08,22.79,39315800,11.40 -2001-04-17,21.20,21.21,19.60,20.40,24471400,10.20 -2001-04-16,22.09,22.40,20.86,21.44,10186600,10.72 -2001-04-12,21.42,23.02,21.15,22.42,10676200,11.21 -2001-04-11,22.98,23.00,21.28,21.80,11932000,10.90 -2001-04-10,20.90,22.70,20.78,22.04,16334800,11.02 -2001-04-09,20.69,21.34,20.06,20.54,9520800,10.27 -2001-04-06,20.80,21.04,19.90,20.59,11603200,10.30 -2001-04-05,20.60,22.50,20.00,20.87,15955800,10.44 -2001-04-04,19.76,20.25,18.75,19.50,24481600,9.75 -2001-04-03,21.36,21.40,20.13,20.24,13167400,10.12 -2001-04-02,22.09,22.66,21.40,21.59,12175400,10.80 -2001-03-30,22.55,22.72,21.34,22.07,14298200,11.03 -2001-03-29,21.77,23.45,21.50,22.53,21895200,11.27 -2001-03-28,22.08,22.50,21.50,22.17,20880800,11.09 -2001-03-27,21.94,23.05,21.90,22.87,19422200,11.44 -2001-03-26,23.13,23.75,21.13,21.78,26230400,10.89 -2001-03-23,22.06,23.56,22.00,23.00,33749400,11.50 -2001-03-22,20.37,21.75,20.19,21.62,25839000,10.81 -2001-03-21,19.78,20.87,19.37,20.12,13265400,10.06 -2001-03-20,20.72,20.94,19.69,19.69,17833800,9.85 -2001-03-19,19.75,20.62,19.50,20.56,12722800,10.28 -2001-03-16,19.00,20.31,18.87,19.62,16806600,9.81 -2001-03-15,20.87,21.37,19.69,19.69,18906600,9.85 -2001-03-14,18.50,20.50,18.44,20.44,17065400,10.22 -2001-03-13,18.87,19.56,18.19,19.56,15840600,9.78 -2001-03-12,19.69,19.87,18.12,18.62,13967800,9.31 -2001-03-09,20.62,20.69,20.00,20.25,10685400,10.12 -2001-03-08,20.69,21.12,20.44,20.81,7325600,10.40 -2001-03-07,21.31,21.62,20.75,21.25,14985600,10.62 -2001-03-06,20.72,22.06,20.69,21.50,26144600,10.75 -2001-03-05,19.37,20.50,19.25,20.37,11587600,10.19 -2001-03-02,18.31,20.44,18.25,19.25,14511200,9.62 -2001-03-01,17.81,18.75,17.19,18.75,11803400,9.38 -2001-02-28,19.37,19.44,18.12,18.25,18157600,9.12 -2001-02-27,19.28,19.44,18.69,19.37,12451000,9.69 -2001-02-26,19.06,19.69,18.56,19.50,7380000,9.75 -2001-02-23,18.62,18.87,18.25,18.81,10503800,9.40 -2001-02-22,19.06,19.37,18.00,18.81,15431200,9.40 -2001-02-21,18.25,19.94,18.25,18.87,13947800,9.44 -2001-02-20,19.19,19.44,18.19,18.31,11249600,9.15 -2001-02-16,19.00,19.50,18.75,19.00,9428400,9.50 -2001-02-15,19.69,20.56,19.69,20.06,11123200,10.03 -2001-02-14,19.19,19.62,18.50,19.50,11040000,9.75 -2001-02-13,19.94,20.44,19.00,19.12,8470600,9.56 -2001-02-12,19.06,20.00,18.81,19.69,9795600,9.85 -2001-02-09,20.50,20.81,18.69,19.12,21082600,9.56 -2001-02-08,20.56,21.06,20.19,20.75,21585000,10.38 -2001-02-07,20.66,20.87,19.81,20.75,14071600,10.38 -2001-02-06,20.16,21.39,20.00,21.12,16528400,10.56 -2001-02-05,20.50,20.56,19.75,20.19,10228800,10.10 -2001-02-02,21.12,21.94,20.50,20.62,15263400,10.31 -2001-02-01,20.69,21.50,20.50,21.12,13205400,10.56 -2001-01-31,21.50,22.50,21.44,21.62,26106000,10.81 -2001-01-30,21.56,22.00,20.87,21.75,24734600,10.88 -2001-01-29,19.56,21.75,19.56,21.69,30562800,10.85 -2001-01-26,19.50,19.81,19.06,19.56,17245600,9.78 -2001-01-25,20.56,20.56,19.75,19.94,17495000,9.97 -2001-01-24,20.62,20.69,19.56,20.50,25616200,10.25 -2001-01-23,19.31,20.94,19.06,20.50,31418400,10.25 -2001-01-22,19.06,19.62,18.44,19.25,18551600,9.62 -2001-01-19,19.44,19.56,18.69,19.50,27748200,9.75 -2001-01-18,17.81,18.75,17.62,18.69,43822800,9.35 -2001-01-17,17.56,17.56,16.50,16.81,30037600,8.40 -2001-01-16,17.44,18.25,17.00,17.12,10940000,8.56 -2001-01-12,17.87,18.00,17.06,17.19,15121000,8.60 -2001-01-11,16.25,18.50,16.25,18.00,28707600,9.00 -2001-01-10,16.69,17.00,16.06,16.56,20743400,8.28 -2001-01-09,16.81,17.64,16.56,17.19,21040600,8.60 -2001-01-08,16.94,16.98,15.94,16.56,13350000,8.28 -2001-01-05,16.94,17.37,16.06,16.37,14731000,8.19 -2001-01-04,18.14,18.50,16.81,17.06,26411000,8.53 -2001-01-03,14.50,16.69,14.44,16.37,29181800,8.19 -2001-01-02,14.88,15.25,14.56,14.88,16161800,7.44 -2000-12-29,14.69,15.00,14.50,14.88,22518800,7.44 -2000-12-28,14.38,14.94,14.31,14.81,10910000,7.41 -2000-12-27,14.34,14.81,14.19,14.81,11626000,7.41 -2000-12-26,14.88,15.00,14.25,14.69,7745400,7.34 -2000-12-22,14.13,15.00,14.13,15.00,11369600,7.50 -2000-12-21,14.25,15.00,13.88,14.06,13102600,7.03 -2000-12-20,13.78,14.63,13.63,14.38,20196200,7.19 -2000-12-19,14.38,15.25,14.00,14.00,13367200,7.00 -2000-12-18,14.56,14.63,13.94,14.25,11645000,7.12 -2000-12-15,14.56,14.69,14.00,14.06,18363800,7.03 -2000-12-14,15.03,15.25,14.44,14.44,9406600,7.22 -2000-12-13,15.56,15.56,14.88,15.00,12327200,7.50 -2000-12-12,15.25,16.00,15.00,15.38,13803400,7.69 -2000-12-11,15.19,15.38,14.88,15.19,11884000,7.59 -2000-12-08,14.81,15.31,14.44,15.06,15568200,7.53 -2000-12-07,14.44,14.88,14.00,14.31,14606600,7.16 -2000-12-06,14.63,15.00,14.00,14.31,49092400,7.16 -2000-12-05,16.94,17.44,16.37,17.00,21932200,8.50 -2000-12-04,17.19,17.19,16.44,16.69,13273400,8.35 -2000-12-01,17.00,17.50,16.81,17.06,13783800,8.53 -2000-11-30,16.69,17.00,16.12,16.50,28922200,8.25 -2000-11-29,18.09,18.31,17.25,17.56,17586200,8.78 -2000-11-28,18.69,19.00,17.94,18.03,9618200,9.02 -2000-11-27,19.87,19.94,18.50,18.69,9244000,9.35 -2000-11-24,18.86,19.50,18.81,19.31,5751800,9.65 -2000-11-22,18.81,19.12,18.37,18.50,10029600,9.25 -2000-11-21,19.19,19.50,18.75,18.81,10786200,9.40 -2000-11-20,18.59,19.50,18.25,18.94,14581600,9.47 -2000-11-17,19.19,19.25,18.25,18.50,15943400,9.25 -2000-11-16,19.50,19.81,18.87,19.00,8554000,9.50 -2000-11-15,20.03,20.19,19.25,19.87,10086600,9.94 -2000-11-14,19.94,20.50,19.56,20.25,14611200,10.12 -2000-11-13,18.75,20.00,18.25,19.37,15423200,9.69 -2000-11-10,19.36,19.87,19.06,19.06,15080600,9.53 -2000-11-09,19.87,20.50,19.06,20.19,17035400,10.10 -2000-11-08,21.37,21.44,19.81,20.06,15082800,10.03 -2000-11-07,21.50,21.81,20.81,21.31,10786800,10.65 -2000-11-06,22.44,22.62,20.87,21.44,14060000,10.72 -2000-11-03,23.00,23.00,21.94,22.25,18423400,11.12 -2000-11-02,21.12,22.44,21.06,22.31,21105400,11.15 -2000-11-01,19.44,20.87,19.44,20.50,20553800,10.25 -2000-10-31,19.75,20.25,19.25,19.56,31649000,9.78 -2000-10-30,19.12,19.94,18.75,19.31,22832800,9.65 -2000-10-27,18.87,19.19,17.87,18.56,26594600,9.28 -2000-10-26,18.81,18.87,17.50,18.50,25780600,9.25 -2000-10-25,19.06,19.19,18.44,18.50,23720600,9.25 -2000-10-24,20.69,20.87,18.81,18.87,28736200,9.44 -2000-10-23,20.27,20.56,19.44,20.37,19694000,10.19 -2000-10-20,19.06,20.37,18.94,19.50,28270400,9.75 -2000-10-19,19.16,19.81,18.31,18.94,53818200,9.47 -2000-10-18,19.44,21.06,18.75,20.12,29803800,10.06 -2000-10-17,21.69,21.94,19.69,20.12,21495600,10.06 -2000-10-16,22.31,23.25,21.37,21.50,29298800,10.75 -2000-10-13,20.25,22.12,20.00,22.06,44564000,11.03 -2000-10-12,20.31,20.81,19.50,20.00,42548200,10.00 -2000-10-11,20.12,21.00,19.12,19.62,42801200,9.81 -2000-10-10,21.62,22.44,20.50,20.87,24683400,10.44 -2000-10-09,22.62,22.87,21.12,21.75,21342600,10.88 -2000-10-06,22.69,22.94,21.00,22.19,21881000,11.10 -2000-10-05,23.50,24.50,22.00,22.06,31189400,11.03 -2000-10-04,22.37,23.75,21.87,23.62,52368200,11.81 -2000-10-03,24.94,25.00,22.19,22.31,72795600,11.15 -2000-10-02,26.69,26.75,23.50,24.25,86610600,12.12 -2000-09-29,28.19,29.00,25.37,25.75,265069000,12.88 -2000-09-28,49.31,53.81,48.13,53.50,34988200,26.75 -2000-09-27,51.75,52.75,48.25,48.94,14370000,24.47 -2000-09-26,53.31,54.75,51.38,51.44,10396600,25.72 -2000-09-25,52.75,55.50,52.06,53.50,15564000,26.75 -2000-09-22,50.31,52.44,50.00,52.19,25961200,26.09 -2000-09-21,58.50,59.63,55.25,56.69,18238400,28.34 -2000-09-20,59.41,61.44,58.56,61.05,8121600,30.52 -2000-09-19,59.75,60.50,58.56,59.94,9706200,29.97 -2000-09-18,55.25,60.75,55.06,60.66,15163200,30.33 -2000-09-15,57.75,58.19,54.25,55.23,14095400,27.61 -2000-09-14,58.56,59.63,56.81,56.86,15241800,28.43 -2000-09-13,56.75,59.50,56.75,58.00,10932600,29.00 -2000-09-12,57.34,60.06,57.00,57.75,6722200,28.88 -2000-09-11,58.69,60.38,58.13,58.44,6699000,29.22 -2000-09-08,61.63,61.63,58.50,58.88,6984400,29.44 -2000-09-07,59.13,62.56,58.25,62.00,7770400,31.00 -2000-09-06,61.38,62.38,57.75,58.44,12700400,29.22 -2000-09-05,62.66,64.12,62.25,62.44,10669000,31.22 -2000-09-01,61.31,63.63,61.13,63.44,9181800,31.72 -2000-08-31,58.97,61.50,58.94,60.94,14988800,30.47 -2000-08-30,59.00,60.00,58.70,59.50,10199600,29.75 -2000-08-29,57.88,59.44,57.69,59.19,9546200,29.59 -2000-08-28,57.25,59.00,57.06,58.06,12822600,29.03 -2000-08-25,56.50,57.50,56.38,56.81,11947800,28.41 -2000-08-24,54.67,56.63,53.38,56.11,11109400,28.06 -2000-08-23,51.47,54.75,51.06,54.31,8470400,27.16 -2000-08-22,50.63,52.81,50.38,51.69,9889000,25.84 -2000-08-21,50.25,51.56,49.63,50.50,4803800,25.25 -2000-08-18,51.38,51.81,49.88,50.00,6798800,25.00 -2000-08-17,48.38,52.44,48.31,51.44,9683400,25.72 -2000-08-16,46.88,49.00,46.81,48.50,5137600,24.25 -2000-08-15,47.25,47.94,46.50,46.69,4089000,23.34 -2000-08-14,47.59,47.69,46.31,47.06,5603400,23.53 -2000-08-11,46.84,48.00,45.56,47.69,8503200,23.84 -2000-08-10,48.00,48.44,47.38,47.56,8995400,23.78 -2000-08-09,48.13,48.44,47.25,47.50,13569000,23.75 -2000-08-08,47.94,48.00,46.31,46.75,6315400,23.38 -2000-08-07,47.88,49.06,47.19,47.94,6697200,23.97 -2000-08-04,49.47,51.25,46.31,47.38,9406800,23.69 -2000-08-03,45.56,48.06,44.25,48.00,12150000,24.00 -2000-08-02,49.00,49.94,47.19,47.25,5808800,23.62 -2000-08-01,50.31,51.16,49.25,49.31,4904600,24.66 -2000-07-31,49.16,51.63,48.75,50.81,5550000,25.41 -2000-07-28,52.28,52.50,46.88,48.31,8505400,24.16 -2000-07-27,50.00,53.25,49.88,52.00,10543800,26.00 -2000-07-26,49.84,51.25,49.25,50.06,7526200,25.03 -2000-07-25,50.31,50.63,49.06,50.06,7567200,25.03 -2000-07-24,52.56,52.88,47.50,48.69,14720600,24.34 -2000-07-21,54.36,55.63,52.94,53.56,7013200,26.78 -2000-07-20,55.00,57.06,54.13,55.13,16631800,27.57 -2000-07-19,55.19,56.81,51.75,52.69,16359600,26.34 -2000-07-18,58.50,58.88,56.88,57.25,11378200,28.62 -2000-07-17,58.25,58.81,57.13,58.31,9289000,29.16 -2000-07-14,57.13,59.00,56.88,57.69,6804400,28.84 -2000-07-13,58.50,60.63,54.75,56.50,15925600,28.25 -2000-07-12,58.13,58.94,56.38,58.88,8057600,29.44 -2000-07-11,57.00,59.25,55.44,56.94,12783200,28.47 -2000-07-10,54.09,58.25,53.75,57.13,14211000,28.57 -2000-07-07,52.59,54.81,52.13,54.44,9422600,27.22 -2000-07-06,52.50,52.94,49.63,51.81,11063800,25.91 -2000-07-05,53.25,55.19,50.75,51.63,9478800,25.82 -2000-07-03,52.13,54.31,52.13,53.31,2535000,26.66 -2000-06-30,52.81,54.94,51.69,52.38,11550000,26.19 -2000-06-29,53.06,53.94,51.06,51.25,7281200,25.62 -2000-06-28,53.31,55.38,51.50,54.44,10235000,27.22 -2000-06-27,53.78,55.50,51.63,51.75,7270600,25.88 -2000-06-26,52.50,54.75,52.13,54.13,6631000,27.07 -2000-06-23,53.78,54.63,50.81,51.69,7320400,25.84 -2000-06-22,55.75,57.63,53.56,53.75,16706200,26.88 -2000-06-21,50.50,56.94,50.31,55.63,17500000,27.82 -2000-06-20,98.50,103.94,98.37,101.25,17922000,25.31 -2000-06-19,90.56,97.87,89.81,96.62,14089200,24.16 -2000-06-16,93.50,93.75,89.06,91.19,10842400,22.80 -2000-06-15,91.25,93.37,89.00,92.37,8898800,23.09 -2000-06-14,94.69,96.25,90.12,90.44,9925200,22.61 -2000-06-13,91.19,94.69,88.19,94.50,12570000,23.62 -2000-06-12,96.37,96.44,90.87,91.19,10374400,22.80 -2000-06-09,96.75,97.94,94.37,95.75,9020000,23.94 -2000-06-08,97.62,98.50,93.12,94.81,8540800,23.70 -2000-06-07,93.62,97.00,91.62,96.56,12056800,24.14 -2000-06-06,91.97,96.75,90.31,92.87,18771200,23.22 -2000-06-05,93.31,95.25,89.69,91.31,11582000,22.83 -2000-06-02,93.75,99.75,89.00,92.56,28336400,23.14 -2000-06-01,81.75,89.56,80.37,89.12,32280000,22.28 -2000-05-31,86.87,91.25,83.81,84.00,15483600,21.00 -2000-05-30,87.62,88.12,81.75,87.56,25481200,21.89 -2000-05-26,88.00,89.87,85.25,86.37,6486400,21.59 -2000-05-25,88.50,92.66,86.00,87.27,14530800,21.82 -2000-05-24,86.19,89.75,83.00,87.69,24248000,21.92 -2000-05-23,90.50,93.37,85.62,85.81,18488000,21.45 -2000-05-22,93.75,93.75,86.00,89.94,26995200,22.49 -2000-05-19,99.25,99.25,93.37,94.00,26459200,23.50 -2000-05-18,103.00,104.94,100.62,100.75,13365600,25.19 -2000-05-17,103.62,103.69,100.37,101.37,14227600,25.34 -2000-05-16,104.52,109.06,102.75,105.69,15736400,26.42 -2000-05-15,108.06,108.06,100.12,101.00,24252000,25.25 -2000-05-12,106.00,110.50,104.77,107.62,10962000,26.91 -2000-05-11,101.37,104.25,99.00,102.81,17852400,25.70 -2000-05-10,104.06,105.00,98.75,99.31,19127600,24.83 -2000-05-09,110.31,111.25,104.87,105.44,11685600,26.36 -2000-05-08,112.09,113.69,110.00,110.12,6605600,27.53 -2000-05-05,110.81,114.75,110.72,113.12,10160000,28.28 -2000-05-04,115.12,115.25,110.56,110.69,14284400,27.67 -2000-05-03,118.94,121.25,111.62,115.06,17500000,28.76 -2000-05-02,123.25,126.25,117.50,117.87,8446400,29.47 -2000-05-01,124.87,125.12,121.87,124.31,8100000,31.08 -2000-04-28,127.12,127.50,121.31,124.06,8932400,31.01 -2000-04-27,117.19,127.00,116.58,126.75,11678000,31.69 -2000-04-26,126.62,128.00,120.00,121.31,13117600,30.33 -2000-04-25,122.12,128.75,122.06,128.31,14002400,32.08 -2000-04-24,115.00,120.50,114.75,120.50,15845600,30.12 -2000-04-20,123.69,124.75,117.06,118.87,25806800,29.72 -2000-04-19,126.19,130.25,119.75,121.12,18586400,30.28 -2000-04-18,123.50,126.87,119.37,126.87,13962400,31.72 -2000-04-17,109.50,123.94,109.06,123.87,14642400,30.97 -2000-04-14,109.31,118.00,109.00,111.87,23845600,27.97 -2000-04-13,111.50,120.00,108.50,113.81,18923600,28.45 -2000-04-12,119.00,119.00,104.87,109.25,33618800,27.31 -2000-04-11,123.50,124.87,118.06,119.44,19368000,29.86 -2000-04-10,131.69,132.75,124.75,125.00,7592400,31.25 -2000-04-07,127.25,131.88,125.50,131.75,8668800,32.94 -2000-04-06,130.63,134.50,123.25,125.19,9290800,31.30 -2000-04-05,126.47,132.88,124.00,130.38,16359200,32.60 -2000-04-04,132.63,133.00,116.75,127.31,23596400,31.83 -2000-04-03,135.50,139.50,129.44,133.31,11742400,33.33 -2000-03-31,127.44,137.25,126.00,135.81,14457600,33.95 -2000-03-30,133.56,137.69,125.44,125.75,14800000,31.44 -2000-03-29,139.38,139.44,133.83,135.94,8568800,33.99 -2000-03-28,137.25,142.00,137.13,139.13,7253600,34.78 -2000-03-27,137.63,144.75,136.88,139.56,9976800,34.89 -2000-03-24,142.44,143.94,135.50,138.69,15962000,34.67 -2000-03-23,142.00,150.38,140.00,141.31,20098000,35.33 -2000-03-22,132.78,144.38,131.56,144.19,20288800,36.05 -2000-03-21,122.56,136.75,121.62,134.94,18729200,33.74 -2000-03-20,123.50,126.25,122.37,123.00,7316400,30.75 -2000-03-17,120.12,125.00,119.62,125.00,10902400,31.25 -2000-03-16,117.31,122.00,114.50,121.56,13516800,30.39 -2000-03-15,115.62,120.25,114.12,116.25,15845200,29.06 -2000-03-14,121.22,124.25,114.00,114.25,15321200,28.56 -2000-03-13,122.12,126.50,119.50,121.31,10864400,30.33 -2000-03-10,121.69,127.94,121.00,125.75,8900800,31.44 -2000-03-09,120.87,125.00,118.25,122.25,9884400,30.56 -2000-03-08,122.87,123.94,118.56,122.00,9690800,30.50 -2000-03-07,126.44,127.44,121.12,122.87,9767600,30.72 -2000-03-06,126.00,129.13,125.00,125.69,7520000,31.42 -2000-03-03,124.87,128.23,120.00,128.00,11565200,32.00 -2000-03-02,127.00,127.94,120.69,122.00,11136800,30.50 -2000-03-01,118.56,132.06,118.50,130.31,38478000,32.58 -2000-02-29,113.56,117.25,112.56,114.62,13186800,28.66 -2000-02-28,110.12,115.00,108.37,113.25,11729200,28.31 -2000-02-25,114.81,117.00,110.12,110.37,8908000,27.59 -2000-02-24,117.31,119.12,111.75,115.20,13446400,28.80 -2000-02-23,113.23,119.00,111.00,116.25,16905600,29.06 -2000-02-22,110.12,116.94,106.69,113.81,15083200,28.45 -2000-02-18,114.62,115.37,110.87,111.25,8346800,27.81 -2000-02-17,115.19,115.50,113.12,114.87,10350000,28.72 -2000-02-16,117.75,118.12,112.12,114.12,13525200,28.53 -2000-02-15,115.25,119.94,115.19,119.00,17363600,29.75 -2000-02-14,109.31,115.87,108.62,115.81,13130000,28.95 -2000-02-11,113.62,114.12,108.25,108.75,7592000,27.19 -2000-02-10,112.87,113.87,110.00,113.50,10832400,28.38 -2000-02-09,114.12,117.12,112.44,112.62,10698000,28.16 -2000-02-08,114.00,116.12,111.25,114.87,14613600,28.72 -2000-02-07,108.00,114.25,105.94,114.06,15770800,28.51 -2000-02-04,103.94,110.00,103.62,108.00,15206800,27.00 -2000-02-03,100.31,104.25,100.25,103.31,16977600,25.83 -2000-02-02,100.75,102.12,97.00,98.81,16588800,24.70 -2000-02-01,104.00,105.00,100.00,100.25,11380000,25.06 -2000-01-31,101.00,103.87,94.50,103.75,25071200,25.94 -2000-01-28,108.19,110.87,100.62,101.62,15142000,25.41 -2000-01-27,108.81,113.00,107.00,110.00,12163600,27.50 -2000-01-26,110.00,114.19,109.75,110.19,13131200,27.55 -2000-01-25,105.00,113.12,102.37,112.25,17775200,28.06 -2000-01-24,108.44,112.75,105.12,106.25,15760000,26.56 -2000-01-21,114.25,114.25,110.19,111.31,17729200,27.83 -2000-01-20,115.50,121.50,113.50,113.50,65418800,28.38 -2000-01-19,105.62,108.75,103.37,106.56,21358000,26.64 -2000-01-18,101.00,106.00,100.44,103.94,16421200,25.99 -2000-01-14,100.00,102.25,99.37,100.44,13954400,25.11 -2000-01-13,94.48,98.75,92.50,96.75,36882400,24.19 -2000-01-12,95.00,95.50,86.50,87.19,34870800,21.80 -2000-01-11,95.94,99.37,90.50,92.75,15775200,23.19 -2000-01-10,102.00,102.25,94.75,97.75,18059200,24.44 -2000-01-07,96.50,101.00,95.50,99.50,16463200,24.88 -2000-01-06,106.12,107.00,95.00,95.00,27443200,23.75 -2000-01-05,103.75,110.56,103.00,104.00,27818000,26.00 -2000-01-04,108.25,110.62,101.19,102.50,18310000,25.62 -2000-01-03,104.87,112.50,101.69,111.94,19144400,27.99 -1999-12-31,100.94,102.87,99.50,102.81,5856400,25.70 -1999-12-30,102.19,104.12,99.62,100.31,7419200,25.08 -1999-12-29,96.81,102.19,95.50,100.69,10161200,25.17 -1999-12-28,99.12,99.62,95.00,98.19,8843200,24.55 -1999-12-27,104.37,104.44,99.25,99.31,6022000,24.83 -1999-12-23,101.81,104.25,101.06,103.50,8218800,25.88 -1999-12-22,102.87,104.56,98.75,99.94,11682000,24.99 -1999-12-21,98.19,103.06,97.94,102.50,11000000,25.62 -1999-12-20,99.56,99.62,96.62,98.00,10155200,24.50 -1999-12-17,100.87,102.00,98.50,100.00,17700800,25.00 -1999-12-16,98.00,98.37,94.00,98.31,16568000,24.58 -1999-12-15,93.25,97.25,91.06,97.00,22254400,24.25 -1999-12-14,98.37,99.75,94.75,94.87,15570800,23.72 -1999-12-13,102.39,102.50,98.94,99.00,18931200,24.75 -1999-12-10,105.31,109.25,99.00,103.00,22786800,25.75 -1999-12-09,111.00,111.00,100.87,105.25,30555600,26.31 -1999-12-08,116.25,117.87,109.50,110.06,14730800,27.51 -1999-12-07,116.56,118.00,114.00,117.81,15901200,29.45 -1999-12-06,114.56,117.31,111.44,116.00,16688000,29.00 -1999-12-03,112.19,115.56,111.87,115.00,23151200,28.75 -1999-12-02,103.12,110.62,101.75,110.19,20275600,27.55 -1999-12-01,101.00,104.50,100.06,103.06,22098000,25.76 -1999-11-30,98.12,103.75,97.37,97.87,30132400,24.47 -1999-11-29,94.25,99.75,93.25,94.56,16586800,23.64 -1999-11-26,94.75,95.50,94.12,95.06,4737600,23.76 -1999-11-24,93.00,95.00,91.69,94.69,7683600,23.67 -1999-11-23,91.75,95.25,88.50,92.81,19406400,23.20 -1999-11-22,91.75,91.75,89.25,90.62,7242400,22.66 -1999-11-19,89.50,92.87,88.06,92.44,11162000,23.11 -1999-11-18,91.06,91.12,88.44,89.62,13043600,22.41 -1999-11-17,90.69,94.75,90.00,90.25,13032000,22.56 -1999-11-16,90.00,91.75,88.50,91.19,8370000,22.80 -1999-11-15,89.62,92.87,88.50,89.44,9283600,22.36 -1999-11-12,91.94,92.00,87.37,90.62,9970000,22.66 -1999-11-11,91.59,92.62,89.87,92.25,9660000,23.06 -1999-11-10,88.25,93.25,88.12,91.44,20661200,22.86 -1999-11-09,94.37,94.50,88.00,89.62,28910000,22.41 -1999-11-08,87.75,97.73,86.75,96.37,33962400,24.09 -1999-11-05,84.62,88.37,84.00,88.31,14889200,22.08 -1999-11-04,82.06,85.37,80.62,83.62,13549200,20.91 -1999-11-03,81.62,83.25,81.00,81.50,11736800,20.38 -1999-11-02,78.00,81.69,77.31,80.25,14268800,20.06 -1999-11-01,80.00,80.69,77.37,77.62,9965600,19.41 -1999-10-29,78.81,81.06,78.81,80.12,18680800,20.03 -1999-10-28,77.06,79.00,76.06,77.87,18005200,19.47 -1999-10-27,74.37,76.62,73.44,76.37,15837600,19.09 -1999-10-26,74.94,75.50,73.31,75.06,12924400,18.76 -1999-10-25,74.25,76.12,73.75,74.50,11677600,18.62 -1999-10-22,77.12,77.25,73.37,73.94,14995200,18.49 -1999-10-21,72.56,77.06,72.37,76.12,28347600,19.03 -1999-10-20,70.00,75.25,70.00,75.12,38633600,18.78 -1999-10-19,71.62,75.00,68.44,68.50,36521200,17.12 -1999-10-18,73.87,74.25,71.12,73.25,27733600,18.31 -1999-10-15,71.12,75.81,70.19,74.56,41910000,18.64 -1999-10-14,69.25,73.31,69.00,73.19,67822400,18.30 -1999-10-13,66.62,69.50,63.75,64.03,22752000,16.01 -1999-10-12,67.87,69.62,67.00,67.69,20142000,16.92 -1999-10-11,66.00,68.25,66.00,66.69,9418000,16.67 -1999-10-08,66.19,66.31,63.50,65.56,13689200,16.39 -1999-10-07,68.44,68.62,64.87,66.37,21660800,16.59 -1999-10-06,69.37,69.62,67.00,67.19,28726400,16.80 -1999-10-05,65.62,68.12,64.75,67.94,29100800,16.99 -1999-10-04,62.38,64.87,62.38,64.56,16408800,16.14 -1999-10-01,62.13,62.44,59.50,61.72,21977600,15.43 -1999-09-30,59.56,64.19,59.25,63.31,32449200,15.83 -1999-09-29,60.25,61.25,58.00,59.06,23493600,14.77 -1999-09-28,61.50,62.00,57.44,59.63,50542400,14.91 -1999-09-27,66.37,66.75,61.19,61.31,33877600,15.33 -1999-09-24,63.38,67.02,63.00,64.94,42148800,16.24 -1999-09-23,71.12,71.25,63.00,63.31,40853200,15.83 -1999-09-22,69.75,71.62,69.02,70.31,40132000,17.58 -1999-09-21,73.19,73.25,69.00,69.25,119931200,17.31 -1999-09-20,77.00,80.12,76.87,79.06,16326400,19.76 -1999-09-17,77.31,77.75,76.25,76.94,9915600,19.24 -1999-09-16,76.06,78.06,73.87,76.81,15793600,19.20 -1999-09-15,78.87,79.12,75.25,75.37,12843200,18.84 -1999-09-14,74.72,78.50,74.69,77.81,13883200,19.45 -1999-09-13,77.06,77.06,74.81,75.00,9000000,18.75 -1999-09-10,76.00,77.69,74.69,77.44,16398000,19.36 -1999-09-09,75.50,75.94,73.87,75.56,19093600,18.89 -1999-09-08,76.19,77.69,74.50,74.50,27233600,18.62 -1999-09-07,73.75,77.94,73.50,76.37,35177600,19.09 -1999-09-03,71.94,75.25,70.50,73.50,58403600,18.38 -1999-09-02,67.62,71.44,66.87,70.56,31975200,17.64 -1999-09-01,67.00,68.81,66.00,68.62,28168000,17.16 -1999-08-31,62.59,65.87,62.06,65.25,22675200,16.31 -1999-08-30,65.00,65.00,62.00,62.06,12033200,15.52 -1999-08-27,62.75,65.00,62.69,64.75,15980000,16.19 -1999-08-26,61.13,63.13,61.13,62.13,14449200,15.53 -1999-08-25,60.69,61.50,60.13,61.38,10553600,15.35 -1999-08-24,60.38,60.75,59.94,60.38,17948000,15.10 -1999-08-23,59.38,61.38,59.31,60.75,12709200,15.19 -1999-08-20,59.25,59.38,58.19,59.19,11730800,14.80 -1999-08-19,59.81,60.50,58.56,58.75,19645600,14.69 -1999-08-18,60.06,62.00,59.63,60.13,16743200,15.03 -1999-08-17,60.31,60.38,58.94,60.31,11474400,15.08 -1999-08-16,59.81,60.69,59.50,60.50,9896400,15.12 -1999-08-13,60.63,62.00,59.88,60.06,10668800,15.02 -1999-08-12,59.06,61.38,58.63,60.00,23806400,15.00 -1999-08-11,56.00,59.75,55.94,59.69,30374400,14.92 -1999-08-10,54.00,56.00,53.63,55.38,14879200,13.85 -1999-08-09,54.34,55.19,54.25,54.44,8338000,13.61 -1999-08-06,54.06,55.31,53.50,54.13,15575600,13.53 -1999-08-05,53.50,54.88,52.13,54.75,11541200,13.69 -1999-08-04,55.19,55.88,53.25,53.81,13279200,13.45 -1999-08-03,56.75,57.44,53.63,55.25,13176800,13.81 -1999-08-02,55.63,58.00,55.50,55.75,12958000,13.94 -1999-07-30,54.50,56.13,54.50,55.69,13685600,13.92 -1999-07-29,53.38,55.25,53.13,53.88,9860000,13.47 -1999-07-28,53.88,55.38,53.00,54.38,11762000,13.60 -1999-07-27,52.63,53.94,52.50,53.69,14150800,13.42 -1999-07-26,52.88,53.00,50.88,50.94,12555200,12.73 -1999-07-23,52.81,53.75,52.69,53.31,8192000,13.33 -1999-07-22,53.63,53.88,51.13,52.38,14529200,13.10 -1999-07-21,54.06,55.44,52.88,54.06,25653600,13.52 -1999-07-20,54.56,55.50,52.75,52.88,15804400,13.22 -1999-07-19,53.94,55.81,52.31,54.44,20050000,13.61 -1999-07-16,53.63,54.50,53.00,53.06,14705600,13.27 -1999-07-15,55.88,55.94,51.31,53.25,60433600,13.31 -1999-07-14,54.50,56.63,54.50,55.94,22320000,13.98 -1999-07-13,53.50,54.19,52.88,53.69,10136800,13.42 -1999-07-12,55.50,55.63,54.19,54.50,10862000,13.62 -1999-07-09,54.50,55.63,53.00,55.63,21750000,13.91 -1999-07-08,51.13,55.06,50.88,54.50,58058000,13.62 -1999-07-07,47.38,50.75,47.00,49.88,39264400,12.47 -1999-07-06,45.94,47.63,45.81,47.38,16212000,11.85 -1999-07-02,45.53,46.88,45.19,46.31,4426800,11.58 -1999-07-01,46.31,46.56,45.25,45.31,5334400,11.33 -1999-06-30,45.69,46.94,44.94,46.31,12270800,11.58 -1999-06-29,42.72,45.56,42.63,45.38,13599200,11.35 -1999-06-28,42.44,42.94,42.38,42.56,9938800,10.64 -1999-06-25,42.50,42.69,42.06,42.19,10518800,10.55 -1999-06-24,43.63,43.63,42.25,42.31,15498000,10.58 -1999-06-23,45.06,45.09,43.56,43.69,18994400,10.92 -1999-06-22,46.31,46.94,45.38,45.38,5415600,11.35 -1999-06-21,47.00,47.25,46.00,46.50,4842000,11.62 -1999-06-18,45.38,47.25,45.19,47.13,7448000,11.78 -1999-06-17,47.63,48.00,45.75,46.38,8022400,11.60 -1999-06-16,46.38,48.06,46.38,47.94,8056800,11.98 -1999-06-15,45.19,46.75,45.13,46.06,4666400,11.52 -1999-06-14,46.50,46.63,45.13,45.44,5615600,11.36 -1999-06-11,48.13,48.50,46.25,46.44,6613600,11.61 -1999-06-10,47.88,48.25,47.31,48.13,11325200,12.03 -1999-06-09,47.44,48.50,47.44,48.44,12655200,12.11 -1999-06-08,48.75,48.81,47.56,47.69,11203200,11.92 -1999-06-07,48.13,49.00,47.50,48.94,14949200,12.23 -1999-06-04,47.63,48.19,47.25,48.13,13171200,12.03 -1999-06-03,46.88,48.00,46.81,47.44,17450800,11.86 -1999-06-02,44.50,47.94,44.00,46.56,18614400,11.64 -1999-06-01,45.00,45.31,44.38,44.81,16479200,11.20 -1999-05-28,43.31,44.31,43.13,44.06,7196400,11.02 -1999-05-27,43.19,43.75,42.69,43.50,12042400,10.88 -1999-05-26,41.75,44.38,41.25,44.06,15642000,11.02 -1999-05-25,41.56,42.44,40.94,41.50,13095200,10.38 -1999-05-24,43.63,44.31,41.88,41.94,9340800,10.48 -1999-05-21,43.00,44.31,42.56,43.94,16555200,10.98 -1999-05-20,45.44,45.75,42.50,42.50,14940000,10.62 -1999-05-19,45.50,45.75,43.50,45.19,10660000,11.30 -1999-05-18,44.81,46.00,44.38,45.25,14954400,11.31 -1999-05-17,43.75,44.69,43.00,44.38,7531200,11.10 -1999-05-14,45.13,45.81,44.38,44.38,8102000,11.10 -1999-05-13,46.44,46.81,45.50,46.19,10573600,11.55 -1999-05-12,44.88,46.50,44.13,46.50,14129200,11.62 -1999-05-11,44.88,46.19,43.56,44.75,16388800,11.19 -1999-05-10,46.75,46.94,44.63,45.25,14055600,11.31 -1999-05-07,44.63,45.88,42.75,45.88,15528800,11.47 -1999-05-06,46.56,46.88,44.00,44.50,15486400,11.12 -1999-05-05,46.31,47.00,44.63,47.00,20694400,11.75 -1999-05-04,48.25,48.63,46.19,46.50,28980000,11.62 -1999-05-03,46.06,50.00,45.75,49.56,52535600,12.39 -1999-04-30,44.00,47.13,44.00,46.00,52596400,11.50 -1999-04-29,43.25,44.38,41.78,43.00,28206400,10.75 -1999-04-28,44.63,45.69,43.63,44.06,34122000,11.02 -1999-04-27,43.00,45.81,43.00,45.75,75225200,11.44 -1999-04-26,39.50,41.25,39.25,40.94,33152000,10.23 -1999-04-23,36.25,39.44,36.25,39.19,37402400,9.80 -1999-04-22,35.06,36.63,35.06,36.38,26454400,9.10 -1999-04-21,34.00,34.38,33.50,34.38,12566800,8.60 -1999-04-20,33.88,34.75,33.50,34.06,18725600,8.52 -1999-04-19,35.69,36.00,33.50,33.88,32923200,8.47 -1999-04-16,35.88,36.06,35.25,35.44,17945600,8.86 -1999-04-15,35.38,36.19,34.31,35.75,61960000,8.94 -1999-04-14,35.25,37.06,35.00,35.53,24323600,8.88 -1999-04-13,36.31,36.81,34.50,34.63,14732400,8.66 -1999-04-12,35.00,36.88,34.88,36.25,14145600,9.06 -1999-04-09,36.25,37.25,35.94,36.75,9608000,9.19 -1999-04-08,36.88,37.06,36.00,36.88,10600800,9.22 -1999-04-07,38.06,38.25,36.38,37.13,14723200,9.28 -1999-04-06,36.81,38.31,36.81,38.00,22455200,9.50 -1999-04-05,36.00,37.88,36.00,37.06,16474400,9.27 -1999-04-01,36.06,36.69,35.75,36.06,9381200,9.02 -1999-03-31,36.38,37.13,35.88,35.94,15086400,8.98 -1999-03-30,35.00,36.38,35.00,35.88,19806800,8.97 -1999-03-29,33.50,35.44,33.44,35.38,20337600,8.85 -1999-03-26,33.75,33.81,33.00,33.25,9080000,8.31 -1999-03-25,34.38,34.88,33.38,33.81,14286800,8.45 -1999-03-24,33.25,33.75,32.50,33.69,14297600,8.42 -1999-03-23,34.44,34.44,32.75,33.00,14842000,8.25 -1999-03-22,34.00,35.19,32.94,35.06,21200800,8.77 -1999-03-19,35.94,36.00,32.88,33.50,19161200,8.38 -1999-03-18,34.38,35.63,34.25,35.50,8126800,8.88 -1999-03-17,35.94,36.06,33.94,34.06,13084400,8.52 -1999-03-16,35.00,35.56,34.94,35.50,14302000,8.88 -1999-03-15,33.31,35.00,33.25,34.06,12586800,8.52 -1999-03-12,32.31,33.50,32.31,33.19,9700000,8.30 -1999-03-11,32.25,33.88,32.00,32.19,16936800,8.05 -1999-03-10,34.19,34.19,32.44,32.56,19526800,8.14 -1999-03-09,34.31,34.38,33.50,34.13,11427600,8.53 -1999-03-08,33.25,34.69,33.19,34.38,19682000,8.60 -1999-03-05,34.31,34.31,32.38,33.19,16735600,8.30 -1999-03-04,34.50,34.50,32.38,33.44,13137600,8.36 -1999-03-03,34.75,35.13,33.50,34.19,10497600,8.55 -1999-03-02,34.13,35.31,33.75,34.63,24414400,8.66 -1999-03-01,34.81,34.81,33.63,33.75,17435200,8.44 -1999-02-26,36.50,37.00,34.50,34.81,23847600,8.70 -1999-02-25,37.31,37.69,36.50,36.94,9455600,9.23 -1999-02-24,38.81,39.00,37.38,37.44,7620000,9.36 -1999-02-23,38.56,39.56,37.94,38.44,11521200,9.61 -1999-02-22,37.38,38.88,37.25,38.44,10682000,9.61 -1999-02-19,36.25,37.69,36.19,37.19,12938800,9.30 -1999-02-18,37.56,37.88,35.56,36.00,17876400,9.00 -1999-02-17,38.13,38.69,36.94,37.00,10581200,9.25 -1999-02-16,38.88,38.88,37.88,38.31,10723600,9.58 -1999-02-12,39.13,39.13,37.00,37.69,15339200,9.42 -1999-02-11,38.75,39.75,38.56,39.63,20200000,9.91 -1999-02-10,36.88,38.69,36.00,38.31,20135200,9.58 -1999-02-09,37.94,39.06,37.06,37.19,25042000,9.30 -1999-02-08,36.69,37.94,36.25,37.75,16723600,9.44 -1999-02-05,38.25,38.38,35.50,36.31,27778000,9.08 -1999-02-04,40.19,40.25,37.75,37.88,16565600,9.47 -1999-02-03,39.00,40.56,38.75,40.19,12108000,10.05 -1999-02-02,40.38,40.75,39.00,39.19,10975600,9.80 -1999-02-01,41.69,41.94,40.31,40.94,9962000,10.23 -1999-01-29,41.19,41.56,40.00,41.19,8684400,10.30 -1999-01-28,40.88,41.25,40.31,40.88,12015600,10.22 -1999-01-27,41.00,41.38,39.94,40.13,13053200,10.03 -1999-01-26,39.94,40.88,39.63,40.50,20002400,10.12 -1999-01-25,39.25,39.56,38.81,39.38,13763200,9.85 -1999-01-22,37.69,39.50,37.06,38.75,12365200,9.69 -1999-01-21,40.44,40.56,37.50,38.81,21449200,9.70 -1999-01-20,41.06,42.00,40.50,40.56,27806800,10.14 -1999-01-19,41.94,42.31,40.38,40.88,19116400,10.22 -1999-01-15,41.81,42.13,40.00,41.31,35933600,10.33 -1999-01-14,45.50,46.00,41.06,41.38,61570000,10.35 -1999-01-13,42.88,47.31,42.25,46.50,37434400,11.62 -1999-01-12,46.31,46.63,44.13,46.13,29330000,11.53 -1999-01-11,45.75,46.06,44.88,45.88,20054400,11.47 -1999-01-08,46.56,46.88,44.00,45.00,24246400,11.25 -1999-01-07,42.25,45.06,42.13,45.00,51056800,11.25 -1999-01-06,44.13,44.13,41.00,41.75,48165200,10.44 -1999-01-05,41.94,43.94,41.50,43.31,50362000,10.83 -1999-01-04,42.13,42.25,40.00,41.25,34049200,10.31 -1998-12-31,40.50,41.38,39.50,40.94,9716400,10.23 -1998-12-30,40.13,41.13,40.00,40.06,8498000,10.02 -1998-12-29,41.13,41.50,40.25,40.81,13853200,10.20 -1998-12-28,39.00,41.13,39.00,40.88,25917600,10.22 -1998-12-24,39.88,40.00,39.19,39.25,7155200,9.81 -1998-12-23,38.63,40.50,38.38,39.81,44124400,9.95 -1998-12-22,36.38,38.13,36.00,38.00,41111200,9.50 -1998-12-21,35.38,35.63,34.25,35.06,12769200,8.77 -1998-12-18,33.38,35.38,33.25,35.19,28283200,8.80 -1998-12-17,32.94,33.75,32.75,33.44,11812000,8.36 -1998-12-16,33.75,34.19,32.63,32.81,13375200,8.20 -1998-12-15,32.75,33.63,32.75,33.56,9462000,8.39 -1998-12-14,32.88,33.31,32.25,32.50,17925200,8.12 -1998-12-11,32.25,34.00,32.00,33.75,24644400,8.44 -1998-12-10,32.69,32.94,31.87,32.00,13980800,8.00 -1998-12-09,32.69,32.88,31.62,32.00,21184400,8.00 -1998-12-08,33.94,33.94,32.00,32.06,24295200,8.02 -1998-12-07,33.38,33.75,32.75,33.75,20255600,8.44 -1998-12-04,34.31,34.44,32.00,32.75,25765200,8.19 -1998-12-03,36.31,36.50,33.63,33.69,22380800,8.42 -1998-12-02,34.13,36.88,33.50,36.00,34382400,9.00 -1998-12-01,32.00,34.81,31.62,34.13,30941200,8.53 -1998-11-30,34.56,34.81,31.75,31.94,20060800,7.99 -1998-11-27,35.06,35.13,34.75,35.06,5483600,8.77 -1998-11-25,35.88,36.06,34.94,35.13,10855600,8.78 -1998-11-24,36.13,36.75,35.75,35.94,11430800,8.98 -1998-11-23,35.56,36.81,35.19,36.25,20642000,9.06 -1998-11-20,36.44,36.75,34.75,35.31,14268000,8.83 -1998-11-19,35.50,37.19,35.44,35.75,12385200,8.94 -1998-11-18,35.19,36.00,34.88,35.44,11781200,8.86 -1998-11-17,35.75,35.81,34.75,34.81,7529200,8.70 -1998-11-16,35.94,36.75,35.44,36.00,13740800,9.00 -1998-11-13,34.94,36.06,34.69,35.69,28301200,8.92 -1998-11-12,33.13,34.44,32.88,34.00,21261200,8.50 -1998-11-11,35.75,35.81,32.75,33.56,33895200,8.39 -1998-11-10,36.19,36.25,35.00,35.13,31576800,8.78 -1998-11-09,37.69,38.13,35.50,36.63,23622000,9.16 -1998-11-06,37.88,38.25,37.25,38.06,28496800,9.52 -1998-11-05,38.38,39.38,38.06,38.19,21684400,9.55 -1998-11-04,38.56,39.13,38.13,38.69,22438000,9.67 -1998-11-03,37.38,38.25,37.31,37.81,13247600,9.45 -1998-11-02,37.50,37.75,37.25,37.63,9076400,9.41 -1998-10-30,36.81,37.50,36.25,37.13,11358000,9.28 -1998-10-29,36.44,37.44,35.81,36.44,12321200,9.11 -1998-10-28,35.25,37.00,35.13,36.81,13006400,9.20 -1998-10-27,38.00,38.94,35.06,35.25,19233200,8.81 -1998-10-26,36.06,37.75,35.50,37.44,17013600,9.36 -1998-10-23,36.75,36.88,35.13,35.50,12732400,8.88 -1998-10-22,36.88,37.63,36.25,36.75,11343200,9.19 -1998-10-21,36.75,37.44,35.75,37.13,15390000,9.28 -1998-10-20,37.94,38.19,36.00,36.06,13649200,9.02 -1998-10-19,36.69,38.06,35.88,37.50,17010000,9.38 -1998-10-16,37.13,38.06,36.50,36.69,21998000,9.17 -1998-10-15,36.25,37.25,35.50,36.63,30037600,9.16 -1998-10-14,39.75,41.31,36.81,37.38,81445600,9.35 -1998-10-13,38.06,39.19,36.00,38.75,33646400,9.69 -1998-10-12,37.50,38.44,36.56,37.44,22250000,9.36 -1998-10-09,31.75,35.25,30.75,35.13,23880000,8.78 -1998-10-08,31.00,31.19,28.50,30.81,24623200,7.70 -1998-10-07,32.38,33.31,31.87,31.94,16920000,7.99 -1998-10-06,33.69,34.31,32.50,32.56,14281200,8.14 -1998-10-05,34.00,34.56,31.50,32.19,19726800,8.05 -1998-10-02,35.50,36.25,34.13,35.06,16998800,8.77 -1998-10-01,36.75,38.00,35.38,35.69,13234400,8.92 -1998-09-30,38.75,39.25,38.00,38.13,5976800,9.53 -1998-09-29,39.06,40.00,38.13,39.50,10907600,9.88 -1998-09-28,39.75,40.19,38.00,39.06,14501200,9.77 -1998-09-25,38.19,39.19,37.63,38.75,8172000,9.69 -1998-09-24,37.88,39.56,37.75,38.50,17246800,9.62 -1998-09-23,37.25,38.38,36.56,38.31,10284400,9.58 -1998-09-22,37.13,37.63,36.38,37.00,9218800,9.25 -1998-09-21,35.69,36.94,35.31,36.94,10570800,9.23 -1998-09-18,36.06,36.75,35.56,36.75,10904400,9.19 -1998-09-17,36.06,37.13,35.88,36.00,9627600,9.00 -1998-09-16,38.63,38.75,37.00,37.31,9248800,9.33 -1998-09-15,36.75,38.56,36.50,38.19,15492000,9.55 -1998-09-14,38.25,38.81,37.13,37.19,8837600,9.30 -1998-09-11,38.50,39.63,36.88,37.63,12593600,9.41 -1998-09-10,36.25,38.25,35.75,38.13,18826800,9.53 -1998-09-09,38.06,38.13,37.00,37.38,12683200,9.35 -1998-09-08,38.00,38.25,36.75,38.25,14400000,9.56 -1998-09-04,35.50,36.44,33.75,35.13,13493200,8.78 -1998-09-03,35.00,35.13,34.00,34.63,14653200,8.66 -1998-09-02,35.50,37.38,35.25,35.56,30122400,8.89 -1998-09-01,31.37,35.38,30.62,34.13,31060000,8.53 -1998-08-31,34.75,34.88,31.00,31.19,31012400,7.80 -1998-08-28,37.13,38.50,34.13,34.19,33303200,8.55 -1998-08-27,39.25,39.25,35.63,37.50,39813600,9.38 -1998-08-26,39.88,41.13,39.50,40.38,14538000,10.10 -1998-08-25,42.38,42.38,40.31,40.81,17709200,10.20 -1998-08-24,43.44,43.50,40.13,41.19,21810000,10.30 -1998-08-21,40.00,43.56,39.00,43.00,29054400,10.75 -1998-08-20,41.00,41.13,40.25,40.63,14018000,10.16 -1998-08-19,43.50,43.75,41.00,41.00,17377600,10.25 -1998-08-18,42.44,43.38,42.25,42.56,21642000,10.64 -1998-08-17,41.00,42.81,39.88,41.94,33248800,10.48 -1998-08-14,40.69,40.75,39.50,40.50,16110000,10.12 -1998-08-13,39.94,40.75,39.38,39.44,13976800,9.86 -1998-08-12,39.75,40.94,39.48,40.06,24654400,10.02 -1998-08-11,37.75,41.00,37.38,39.00,62860000,9.75 -1998-08-10,36.31,38.06,36.25,37.94,17455600,9.48 -1998-08-07,37.19,37.38,36.00,36.50,10645600,9.12 -1998-08-06,35.06,36.88,34.88,36.88,15678800,9.22 -1998-08-05,33.75,36.00,33.50,36.00,16226800,9.00 -1998-08-04,35.50,36.00,34.00,34.19,10506800,8.55 -1998-08-03,34.25,35.56,33.25,35.13,10786800,8.78 -1998-07-31,36.63,36.75,34.50,34.63,6550800,8.66 -1998-07-30,35.81,36.75,35.50,36.50,12950000,9.12 -1998-07-29,33.75,35.88,33.69,35.13,16006800,8.78 -1998-07-28,34.06,34.63,33.00,33.63,8054400,8.41 -1998-07-27,34.25,34.88,33.25,34.44,7657600,8.61 -1998-07-24,35.38,35.50,33.81,34.69,9693600,8.67 -1998-07-23,34.81,35.63,34.75,34.94,9040800,8.73 -1998-07-22,34.94,35.63,34.25,35.00,10040800,8.75 -1998-07-21,36.13,37.00,35.56,35.63,11772400,8.91 -1998-07-20,36.56,36.63,35.50,36.25,13727600,9.06 -1998-07-17,37.25,37.25,36.19,36.88,22486400,9.22 -1998-07-16,37.88,38.13,35.75,37.50,91497600,9.38 -1998-07-15,33.69,34.69,33.50,34.44,21253600,8.61 -1998-07-14,33.94,34.00,33.13,33.44,19607600,8.36 -1998-07-13,31.94,34.13,31.87,33.94,25566400,8.48 -1998-07-10,32.19,32.63,31.75,32.06,10806800,8.02 -1998-07-09,32.94,33.63,31.44,31.69,20256400,7.92 -1998-07-08,30.75,32.94,30.69,32.56,33334400,8.14 -1998-07-07,30.37,30.87,30.00,30.50,8637600,7.62 -1998-07-06,29.50,30.37,29.12,30.37,9697600,7.59 -1998-07-02,29.69,30.06,29.00,29.00,10650800,7.25 -1998-07-01,28.87,30.00,28.50,29.94,11228800,7.49 -1998-06-30,28.62,28.81,28.12,28.69,4681200,7.17 -1998-06-29,28.25,28.81,28.06,28.69,5943600,7.17 -1998-06-26,28.50,28.62,27.75,28.19,3973200,7.05 -1998-06-25,28.56,28.81,28.31,28.56,6856400,7.14 -1998-06-24,27.75,28.62,27.31,28.25,9788800,7.06 -1998-06-23,27.44,28.12,27.25,27.81,8258800,6.95 -1998-06-22,27.00,27.56,26.75,27.37,4809200,6.84 -1998-06-19,27.37,27.44,26.75,27.06,4931200,6.76 -1998-06-18,27.75,28.06,27.19,27.31,4288800,6.83 -1998-06-17,28.00,28.56,27.94,28.12,6687600,7.03 -1998-06-16,27.69,28.12,27.31,28.00,4649200,7.00 -1998-06-15,27.25,28.25,27.25,27.50,4881200,6.88 -1998-06-12,27.62,28.25,27.37,28.12,8014400,7.03 -1998-06-11,28.19,28.62,27.81,27.81,6451200,6.95 -1998-06-10,28.00,29.00,27.62,28.06,8202000,7.01 -1998-06-09,27.37,28.50,27.37,28.25,9852400,7.06 -1998-06-08,27.00,27.69,26.81,27.25,4523600,6.81 -1998-06-05,26.87,27.25,26.37,26.87,4406800,6.72 -1998-06-04,26.62,26.87,25.81,26.81,5585600,6.70 -1998-06-03,27.12,27.25,26.19,26.31,5196800,6.58 -1998-06-02,26.44,27.31,26.00,26.87,6405600,6.72 -1998-06-01,26.50,27.62,25.62,26.25,11427600,6.56 -1998-05-29,27.50,27.56,26.44,26.62,7751200,6.66 -1998-05-28,26.75,27.87,26.75,27.44,10672000,6.86 -1998-05-27,25.69,26.81,25.62,26.75,13233200,6.69 -1998-05-26,28.06,28.25,26.62,26.69,11143200,6.67 -1998-05-22,28.75,28.75,27.31,27.87,9522000,6.97 -1998-05-21,29.56,29.69,28.62,28.87,4700000,7.22 -1998-05-20,29.62,29.87,28.75,29.56,6810000,7.39 -1998-05-19,28.94,29.44,28.81,29.37,7815200,7.34 -1998-05-18,29.37,29.56,28.37,28.50,8310800,7.12 -1998-05-15,30.06,30.37,29.25,29.56,9743600,7.39 -1998-05-14,30.37,30.44,29.75,30.06,5815600,7.51 -1998-05-13,30.06,30.81,29.62,30.44,11245600,7.61 -1998-05-12,30.56,30.75,29.94,30.12,9212000,7.53 -1998-05-11,30.87,31.62,30.75,30.94,23768000,7.74 -1998-05-08,30.06,30.50,29.94,30.44,9690000,7.61 -1998-05-07,30.56,30.62,29.87,30.19,19761200,7.55 -1998-05-06,29.87,30.44,29.25,30.31,32056400,7.58 -1998-05-05,29.25,29.87,29.12,29.69,14982400,7.42 -1998-05-04,28.87,29.50,28.87,29.06,20419200,7.26 -1998-05-01,27.50,28.25,26.87,28.00,6582000,7.00 -1998-04-30,27.37,27.62,27.06,27.37,6442000,6.84 -1998-04-29,26.94,27.44,26.75,27.00,6774400,6.75 -1998-04-28,27.87,28.00,26.25,26.94,8487600,6.74 -1998-04-27,26.75,27.75,26.75,27.75,14655600,6.94 -1998-04-24,27.75,28.25,27.50,27.94,7708000,6.99 -1998-04-23,27.44,29.00,27.19,27.69,16983200,6.92 -1998-04-22,28.75,29.00,27.50,27.50,10186400,6.88 -1998-04-21,29.06,29.12,28.50,29.00,12446400,7.25 -1998-04-20,27.62,29.50,27.56,29.00,18498800,7.25 -1998-04-17,28.56,28.62,27.69,27.94,21165200,6.99 -1998-04-16,29.25,29.62,28.19,28.62,65642000,7.16 -1998-04-15,27.19,27.50,26.62,27.44,19928800,6.86 -1998-04-14,26.37,27.25,26.37,26.94,11725200,6.74 -1998-04-13,25.62,26.69,25.00,26.44,10305600,6.61 -1998-04-09,25.06,25.87,25.00,25.62,6083600,6.41 -1998-04-08,25.25,25.37,24.69,25.00,8044400,6.25 -1998-04-07,25.81,26.00,24.87,25.50,10461200,6.38 -1998-04-06,27.00,27.00,26.19,26.25,12422000,6.56 -1998-04-03,27.12,27.25,26.81,27.06,7259200,6.76 -1998-04-02,27.31,27.44,26.94,27.31,6950800,6.83 -1998-04-01,27.44,27.81,27.06,27.50,6693600,6.88 -1998-03-31,27.44,27.81,27.25,27.50,9538800,6.88 -1998-03-30,26.75,27.50,26.75,27.44,8972400,6.86 -1998-03-27,26.62,27.31,26.37,26.94,9133200,6.74 -1998-03-26,26.75,27.00,26.44,26.56,7253600,6.64 -1998-03-25,27.62,27.75,26.37,27.16,13854400,6.79 -1998-03-24,26.37,28.00,26.25,28.00,24152000,7.00 -1998-03-23,25.94,26.25,24.62,26.12,14818800,6.53 -1998-03-20,26.69,26.87,26.00,26.37,7704400,6.59 -1998-03-19,26.87,26.94,26.56,26.75,5736800,6.69 -1998-03-18,26.00,26.94,26.00,26.94,9900000,6.74 -1998-03-17,26.50,26.69,25.87,26.34,14658800,6.59 -1998-03-16,27.12,27.25,26.19,26.69,14375600,6.67 -1998-03-13,27.25,27.25,26.25,27.12,20231200,6.78 -1998-03-12,26.12,27.00,25.56,27.00,26598000,6.75 -1998-03-11,25.12,26.19,24.56,26.12,43374400,6.53 -1998-03-10,23.00,24.50,22.94,24.06,25472400,6.01 -1998-03-09,23.75,24.31,22.50,22.75,20540800,5.69 -1998-03-06,23.87,24.50,23.37,24.44,23803600,6.11 -1998-03-05,23.25,24.25,23.12,24.06,24129200,6.01 -1998-03-04,22.87,24.75,22.87,24.44,29212400,6.11 -1998-03-03,21.87,23.19,21.62,23.12,11937600,5.78 -1998-03-02,23.56,23.56,22.25,22.75,14313600,5.69 -1998-02-27,23.31,23.87,22.56,23.62,18578000,5.91 -1998-02-26,22.31,23.56,21.87,23.50,21263200,5.88 -1998-02-25,21.31,22.75,20.94,22.31,25459200,5.58 -1998-02-24,21.31,21.37,20.75,21.31,16322000,5.33 -1998-02-23,20.12,21.62,20.00,21.25,17060800,5.31 -1998-02-20,20.50,20.56,19.81,20.00,11634400,5.00 -1998-02-19,20.87,20.94,20.00,20.44,14292400,5.11 -1998-02-18,19.56,20.75,19.56,20.56,17677600,5.14 -1998-02-17,19.50,19.75,19.50,19.62,6530800,4.91 -1998-02-13,19.19,19.87,19.00,19.50,7444400,4.88 -1998-02-12,19.12,19.44,19.06,19.37,7297600,4.84 -1998-02-11,19.50,19.50,18.87,19.00,7582000,4.75 -1998-02-10,19.12,19.56,19.06,19.44,15090000,4.86 -1998-02-09,18.37,19.50,18.37,19.19,17682000,4.80 -1998-02-06,18.37,18.69,18.25,18.50,7241200,4.62 -1998-02-05,18.25,18.50,18.00,18.31,8526400,4.58 -1998-02-04,18.06,18.50,18.00,18.25,6100000,4.56 -1998-02-03,17.69,18.62,17.69,18.31,14390000,4.58 -1998-02-02,18.50,18.50,17.37,17.69,22752400,4.42 -1998-01-30,18.31,18.87,18.25,18.31,5802400,4.58 -1998-01-29,18.94,19.12,18.50,18.50,7571200,4.62 -1998-01-28,19.19,19.37,18.62,19.19,5418000,4.80 -1998-01-27,19.19,19.69,19.00,19.12,4013200,4.78 -1998-01-26,19.44,19.56,18.81,19.44,5246800,4.86 -1998-01-23,19.37,19.69,19.25,19.50,8331200,4.88 -1998-01-22,18.69,19.75,18.62,19.25,11785200,4.81 -1998-01-21,18.75,19.06,18.56,18.91,6812000,4.73 -1998-01-20,19.06,19.31,18.62,19.06,8642400,4.76 -1998-01-16,19.44,19.44,18.69,18.81,8820000,4.70 -1998-01-15,19.19,19.75,18.62,19.19,19982000,4.80 -1998-01-14,19.87,19.94,19.25,19.75,21048000,4.94 -1998-01-13,18.62,19.62,18.50,19.50,22758800,4.88 -1998-01-12,17.44,18.62,17.12,18.25,18444400,4.56 -1998-01-09,18.12,19.37,17.50,18.19,31675200,4.55 -1998-01-08,17.44,18.62,16.94,18.19,27645600,4.55 -1998-01-07,18.81,19.00,17.31,17.50,37201200,4.38 -1998-01-06,15.94,20.00,14.75,18.94,64737600,4.74 -1998-01-05,16.50,16.56,15.19,15.88,23282000,3.97 -1998-01-02,13.63,16.25,13.50,16.25,25650800,4.06 -1997-12-31,13.13,13.63,12.94,13.13,14531200,3.28 -1997-12-30,13.00,13.44,12.75,13.19,12250800,3.30 -1997-12-29,13.31,13.44,12.88,13.13,9944400,3.28 -1997-12-26,13.06,13.38,13.00,13.31,3860000,3.33 -1997-12-24,13.00,13.25,13.00,13.13,3502000,3.28 -1997-12-23,13.13,13.31,12.94,12.94,16402000,3.23 -1997-12-22,13.88,14.00,13.19,13.31,5704400,3.33 -1997-12-19,13.56,13.88,13.25,13.69,6812000,3.42 -1997-12-18,14.00,14.00,13.75,13.81,7225200,3.45 -1997-12-17,14.31,14.56,13.94,13.94,9494400,3.48 -1997-12-16,14.00,14.38,14.00,14.31,6646400,3.58 -1997-12-15,14.13,14.25,13.75,13.94,5927600,3.48 -1997-12-12,14.75,14.88,14.00,14.13,5742400,3.53 -1997-12-11,14.44,14.56,13.88,14.56,9185600,3.64 -1997-12-10,15.06,15.06,14.50,14.75,6960000,3.69 -1997-12-09,15.50,15.69,15.00,15.25,8680800,3.81 -1997-12-08,15.56,15.75,15.38,15.56,4776800,3.89 -1997-12-05,15.56,16.00,15.56,15.81,7926400,3.95 -1997-12-04,16.00,16.00,15.63,15.63,7135600,3.91 -1997-12-03,16.06,16.12,15.69,15.75,12258800,3.94 -1997-12-02,17.37,17.50,15.88,15.88,14178800,3.97 -1997-12-01,17.69,17.94,17.25,17.75,3135600,4.44 -1997-11-28,17.62,17.87,17.44,17.75,1495600,4.44 -1997-11-26,17.37,17.69,17.25,17.50,2178800,4.38 -1997-11-25,17.69,17.87,16.87,17.37,7346400,4.34 -1997-11-24,17.56,18.00,17.50,17.62,5630800,4.41 -1997-11-21,18.62,18.69,18.00,18.19,3498800,4.55 -1997-11-20,18.19,18.62,18.12,18.50,4587600,4.62 -1997-11-19,17.87,18.31,17.87,18.25,2843600,4.56 -1997-11-18,18.50,18.50,18.06,18.06,5258000,4.51 -1997-11-17,18.87,18.94,18.33,18.50,7323600,4.62 -1997-11-14,18.25,18.50,18.00,18.44,4835600,4.61 -1997-11-13,18.00,18.06,17.50,18.00,9218000,4.50 -1997-11-12,18.06,18.50,17.56,17.62,7448000,4.41 -1997-11-11,19.00,19.00,18.12,18.37,11893600,4.59 -1997-11-10,21.00,21.50,18.50,18.69,49946800,4.67 -1997-11-07,18.87,20.00,18.75,19.75,28423200,4.94 -1997-11-06,18.87,19.50,18.87,19.00,22060800,4.75 -1997-11-05,18.25,18.62,18.06,18.37,13840000,4.59 -1997-11-04,17.75,18.12,17.50,17.94,6033200,4.49 -1997-11-03,17.56,17.75,17.06,17.37,4512000,4.34 -1997-10-31,17.37,17.37,16.62,17.03,9549200,4.26 -1997-10-30,17.06,17.56,16.50,16.50,6764400,4.12 -1997-10-29,18.44,18.50,17.25,17.50,6355200,4.38 -1997-10-28,16.00,18.50,15.88,18.12,12273200,4.53 -1997-10-27,16.75,18.12,16.75,16.75,11764400,4.19 -1997-10-24,18.12,18.37,16.50,16.56,13880000,4.14 -1997-10-23,18.00,18.19,17.75,17.75,6688000,4.44 -1997-10-22,19.06,19.25,18.50,18.56,5421200,4.64 -1997-10-21,18.87,19.31,18.69,19.06,16982000,4.76 -1997-10-20,20.12,20.19,18.62,18.69,14724400,4.67 -1997-10-17,21.12,21.12,19.87,20.12,15682000,5.03 -1997-10-16,21.12,22.06,20.87,21.50,26422000,5.38 -1997-10-15,22.12,24.75,22.12,23.81,28982000,5.95 -1997-10-14,22.69,22.75,22.19,22.69,5923200,5.67 -1997-10-13,22.75,22.87,22.19,22.69,5679200,5.67 -1997-10-10,21.50,22.75,21.50,22.69,9666800,5.67 -1997-10-09,21.25,22.50,21.19,21.75,6696400,5.44 -1997-10-08,21.75,21.81,21.31,21.50,3891200,5.38 -1997-10-07,21.87,22.00,21.81,21.81,3916400,5.45 -1997-10-06,22.19,22.25,21.69,21.94,3338800,5.49 -1997-10-03,22.00,22.25,21.69,22.12,5813200,5.53 -1997-10-02,21.44,22.00,21.37,21.94,4856400,5.49 -1997-10-01,21.69,21.75,21.37,21.53,4670800,5.38 -1997-09-30,22.00,22.31,21.69,21.69,5032000,5.42 -1997-09-29,21.69,22.25,21.56,22.06,5980000,5.51 -1997-09-26,21.50,21.94,21.12,21.31,7440000,5.33 -1997-09-25,21.31,21.75,21.00,21.12,7988000,5.28 -1997-09-24,21.69,21.75,21.37,21.50,7957600,5.38 -1997-09-23,22.25,22.25,21.69,21.75,7163200,5.44 -1997-09-22,22.12,23.06,22.00,22.81,7176400,5.70 -1997-09-19,22.19,22.19,21.75,21.94,3407600,5.49 -1997-09-18,21.50,22.50,21.50,22.31,6042400,5.58 -1997-09-17,22.00,22.00,21.69,21.81,3109200,5.45 -1997-09-16,22.06,22.14,21.75,21.94,4812400,5.49 -1997-09-15,21.87,22.12,21.50,21.50,3473200,5.38 -1997-09-12,22.19,22.25,21.44,22.06,4071200,5.51 -1997-09-11,22.87,23.00,22.06,22.37,7504400,5.59 -1997-09-10,21.75,23.12,21.69,22.94,9803600,5.74 -1997-09-09,21.31,21.87,21.25,21.81,5702000,5.45 -1997-09-08,22.25,22.25,21.44,21.50,6264400,5.38 -1997-09-05,22.62,22.87,22.00,22.19,4883600,5.55 -1997-09-04,22.56,22.87,22.25,22.50,4385600,5.62 -1997-09-03,22.37,23.25,22.31,22.50,10163200,5.62 -1997-09-02,22.00,22.56,21.94,22.37,6646800,5.59 -1997-08-29,21.81,22.00,21.50,21.75,3937600,5.44 -1997-08-28,22.12,22.50,22.00,22.00,3426400,5.50 -1997-08-27,22.37,22.75,21.87,22.69,6813200,5.67 -1997-08-26,22.62,23.00,22.12,22.25,8100800,5.56 -1997-08-25,23.62,23.69,22.94,23.06,4968800,5.76 -1997-08-22,23.44,24.00,23.37,23.62,8135200,5.91 -1997-08-21,24.50,24.69,23.87,24.00,9271200,6.00 -1997-08-20,24.44,25.12,24.19,24.62,11595200,6.16 -1997-08-19,23.69,24.50,23.31,24.44,10331200,6.11 -1997-08-18,23.31,23.75,22.75,23.62,7791200,5.91 -1997-08-15,23.12,23.44,22.81,23.25,9320000,5.81 -1997-08-14,23.62,24.25,22.69,23.00,15536400,5.75 -1997-08-13,22.25,23.87,20.44,23.62,42923600,5.91 -1997-08-12,24.06,24.25,21.87,22.06,37444400,5.51 -1997-08-11,26.31,26.44,23.50,24.56,55411200,6.14 -1997-08-08,27.81,28.37,26.12,26.81,64809200,6.70 -1997-08-07,28.75,29.56,28.37,29.19,134124400,7.30 -1997-08-06,25.25,27.75,25.00,26.31,149671200,6.58 -1997-08-05,19.94,20.00,19.48,19.75,8840800,4.94 -1997-08-04,19.19,19.81,19.19,19.75,21851200,4.94 -1997-08-01,17.62,19.19,17.56,19.19,17217600,4.80 -1997-07-31,17.37,17.75,17.25,17.50,9434400,4.38 -1997-07-30,16.94,17.69,16.75,17.37,13372400,4.34 -1997-07-29,16.44,16.62,16.37,16.50,2558000,4.12 -1997-07-28,16.44,16.50,16.25,16.44,3962000,4.11 -1997-07-25,15.88,16.56,15.75,16.25,7798000,4.06 -1997-07-24,16.12,16.12,15.63,15.81,4772000,3.95 -1997-07-23,16.75,16.87,16.00,16.12,5049200,4.03 -1997-07-22,16.37,16.69,16.31,16.56,8274400,4.14 -1997-07-21,17.56,17.69,16.00,16.16,12695600,4.04 -1997-07-18,17.87,17.94,17.06,17.34,11353600,4.34 -1997-07-17,17.00,18.12,16.44,17.50,26659200,4.38 -1997-07-16,15.81,16.50,15.63,16.44,15947600,4.11 -1997-07-15,15.75,16.00,15.63,15.94,14953200,3.98 -1997-07-14,15.25,15.63,14.88,15.63,14700800,3.91 -1997-07-11,13.38,15.50,13.31,15.19,26252400,3.80 -1997-07-10,12.88,13.38,12.75,13.25,17606400,3.31 -1997-07-09,13.81,13.88,13.63,13.69,5090000,3.42 -1997-07-08,13.88,14.00,13.69,13.75,3427600,3.44 -1997-07-07,13.94,14.25,13.75,13.81,6860000,3.45 -1997-07-03,13.13,13.88,13.00,13.69,6688000,3.42 -1997-07-02,13.25,13.38,13.00,13.06,8931200,3.27 -1997-07-01,13.94,14.00,13.13,13.19,16104400,3.30 -1997-06-30,14.75,14.75,14.00,14.25,6132400,3.56 -1997-06-27,14.69,14.81,14.63,14.69,5642000,3.67 -1997-06-26,15.13,15.13,14.63,14.69,13643600,3.67 -1997-06-25,15.31,15.38,15.00,15.13,7102000,3.78 -1997-06-24,15.44,15.56,15.25,15.31,3974800,3.83 -1997-06-23,15.50,15.63,15.38,15.38,3574800,3.85 -1997-06-20,15.69,15.75,15.50,15.56,3943600,3.89 -1997-06-19,16.00,16.00,15.69,15.75,4323600,3.94 -1997-06-18,16.12,16.25,15.75,15.94,3936400,3.98 -1997-06-17,15.56,16.50,15.50,16.34,5080800,4.09 -1997-06-16,15.88,15.88,15.38,15.50,4800800,3.88 -1997-06-13,16.06,16.12,15.75,15.81,4737600,3.95 -1997-06-12,16.37,16.37,16.00,16.06,2816400,4.01 -1997-06-11,16.31,16.44,16.25,16.31,3766800,4.08 -1997-06-10,16.75,16.75,16.06,16.25,4969200,4.06 -1997-06-09,16.69,16.94,16.62,16.62,2689200,4.16 -1997-06-06,16.62,16.75,16.50,16.75,1893200,4.19 -1997-06-05,16.62,17.12,16.56,16.69,2323200,4.17 -1997-06-04,16.62,16.75,16.50,16.62,2889200,4.16 -1997-06-03,16.75,16.94,16.62,16.69,2335600,4.17 -1997-06-02,17.00,17.00,16.75,16.94,1488000,4.24 -1997-05-30,16.50,17.00,16.37,16.62,6340800,4.16 -1997-05-29,17.12,17.12,16.62,16.62,3976800,4.16 -1997-05-28,17.37,17.50,17.00,17.00,3130000,4.25 -1997-05-27,16.75,17.37,16.75,17.25,2938000,4.31 -1997-05-23,16.62,17.00,16.62,16.87,2413200,4.22 -1997-05-22,16.75,16.87,16.50,16.62,2753600,4.16 -1997-05-21,17.12,17.12,16.50,16.87,4369200,4.22 -1997-05-20,17.00,17.44,16.75,17.25,3046400,4.31 -1997-05-19,17.50,17.62,17.00,17.00,1881200,4.25 -1997-05-16,17.50,17.62,17.25,17.25,3338800,4.31 -1997-05-15,17.75,18.00,17.50,17.75,3544800,4.44 -1997-05-14,17.87,18.00,17.50,17.69,4846800,4.42 -1997-05-13,17.50,17.87,17.00,17.56,7056800,4.39 -1997-05-12,17.25,17.62,17.00,17.56,5898800,4.39 -1997-05-09,17.00,17.50,17.00,17.06,6732000,4.26 -1997-05-08,16.62,17.12,16.50,17.00,2963200,4.25 -1997-05-07,16.87,17.00,16.37,16.50,4101200,4.12 -1997-05-06,17.00,17.12,16.75,16.87,2974800,4.22 -1997-05-05,17.00,17.12,16.75,17.00,3538800,4.25 -1997-05-02,17.00,17.12,16.75,17.00,3643600,4.25 -1997-05-01,16.87,17.12,16.75,17.00,2596800,4.25 -1997-04-30,17.00,17.25,16.75,17.00,9202000,4.25 -1997-04-29,18.00,18.00,17.50,17.69,1853200,4.42 -1997-04-28,17.75,17.87,17.50,17.62,1687600,4.41 -1997-04-25,17.62,17.87,17.37,17.50,3121200,4.38 -1997-04-24,18.50,18.50,17.75,17.87,2696800,4.47 -1997-04-23,18.37,18.50,18.12,18.12,1960800,4.53 -1997-04-22,18.12,18.50,17.87,18.50,3392000,4.62 -1997-04-21,18.62,18.62,18.00,18.00,3197600,4.50 -1997-04-18,19.12,19.12,18.37,18.37,5058000,4.59 -1997-04-17,18.25,19.12,18.12,19.00,7859200,4.75 -1997-04-16,18.62,19.00,18.37,18.56,3101200,4.64 -1997-04-15,19.12,19.25,18.12,18.44,4869200,4.61 -1997-04-14,18.37,18.87,18.00,18.75,4020000,4.69 -1997-04-11,18.87,18.87,18.12,18.25,2842400,4.56 -1997-04-10,19.00,19.12,18.50,18.87,4188000,4.72 -1997-04-09,19.25,19.25,18.87,19.00,8766400,4.75 -1997-04-08,19.62,19.62,18.62,19.12,6923600,4.78 -1997-04-07,19.75,19.87,19.25,19.50,9136800,4.88 -1997-04-04,19.12,19.62,19.00,19.25,16980800,4.81 -1997-04-03,18.50,19.12,18.25,18.87,19603200,4.72 -1997-04-02,17.87,18.06,17.62,18.00,7957600,4.50 -1997-04-01,17.62,17.81,17.37,17.50,7881200,4.38 -1997-03-31,18.62,19.37,17.25,18.25,34658000,4.56 -1997-03-27,17.50,19.25,17.25,18.62,40695200,4.66 -1997-03-26,16.37,16.87,16.25,16.75,3824400,4.19 -1997-03-25,16.62,16.62,16.08,16.50,4031200,4.12 -1997-03-24,16.50,16.62,16.25,16.50,2556800,4.12 -1997-03-21,17.50,17.50,16.37,16.62,4892400,4.16 -1997-03-20,16.00,17.50,15.88,17.25,11324400,4.31 -1997-03-19,16.37,16.37,15.88,16.12,7457600,4.03 -1997-03-18,16.37,16.50,16.12,16.25,4548800,4.06 -1997-03-17,16.25,16.50,16.00,16.50,6886400,4.12 -1997-03-14,16.37,16.75,16.25,16.56,8245600,4.14 -1997-03-13,16.37,16.37,16.12,16.37,3772000,4.09 -1997-03-12,16.25,16.75,16.12,16.25,2544400,4.06 -1997-03-11,16.62,16.62,16.00,16.37,3539200,4.09 -1997-03-10,16.62,16.75,16.44,16.62,3554800,4.16 -1997-03-07,16.75,16.75,16.37,16.50,2523200,4.12 -1997-03-06,17.00,17.00,16.50,16.62,4172000,4.16 -1997-03-05,16.62,17.00,16.50,17.00,3453600,4.25 -1997-03-04,16.25,16.50,16.00,16.50,3688800,4.12 -1997-03-03,16.50,16.50,16.00,16.12,4670000,4.03 -1997-02-28,16.87,16.87,16.25,16.25,4371200,4.06 -1997-02-27,17.00,17.12,16.75,17.00,3700000,4.25 -1997-02-26,17.00,17.12,16.75,17.12,3687600,4.28 -1997-02-25,17.00,17.37,16.87,16.87,4938000,4.22 -1997-02-24,16.25,16.87,16.25,16.62,4222000,4.16 -1997-02-21,16.87,17.00,16.00,16.37,7549200,4.09 -1997-02-20,17.62,17.62,17.00,17.00,4474800,4.25 -1997-02-19,17.87,17.87,17.12,17.62,8627600,4.41 -1997-02-18,16.62,17.87,16.25,17.87,13171200,4.47 -1997-02-14,16.25,16.37,16.00,16.31,8492000,4.08 -1997-02-13,15.75,16.12,15.50,16.12,7013200,4.03 -1997-02-12,15.75,15.88,15.50,15.75,6303600,3.94 -1997-02-11,15.88,16.00,15.50,15.69,5004400,3.92 -1997-02-10,16.12,16.12,15.63,15.63,6633600,3.91 -1997-02-07,16.50,16.50,15.75,15.81,8403600,3.95 -1997-02-06,15.25,16.12,15.25,16.00,14283600,4.00 -1997-02-05,15.25,15.63,15.25,15.25,14093600,3.81 -1997-02-04,16.25,16.37,15.13,15.38,25458000,3.85 -1997-02-03,16.87,17.00,16.25,16.31,13162000,4.08 -1997-01-31,16.62,16.62,16.50,16.62,7135200,4.16 -1997-01-30,16.75,16.75,16.50,16.75,5018800,4.19 -1997-01-29,16.62,16.75,16.50,16.62,5428000,4.16 -1997-01-28,17.00,17.00,16.50,16.62,7520000,4.16 -1997-01-27,17.12,17.25,16.62,16.62,7646800,4.16 -1997-01-24,17.25,17.25,16.87,16.87,6726800,4.22 -1997-01-23,17.25,17.37,17.12,17.25,6175200,4.31 -1997-01-22,17.37,17.50,17.00,17.19,7356800,4.30 -1997-01-21,17.00,17.25,16.87,17.25,10179200,4.31 -1997-01-20,16.87,17.12,16.75,16.94,10423600,4.24 -1997-01-17,16.75,17.12,16.62,16.75,11619200,4.19 -1997-01-16,17.12,17.12,16.62,16.75,23983600,4.19 -1997-01-15,18.00,18.00,17.12,17.25,15483200,4.31 -1997-01-14,18.37,18.37,17.75,17.87,9143200,4.47 -1997-01-13,18.50,18.50,18.12,18.12,10942000,4.53 -1997-01-10,17.62,18.25,17.62,18.25,12651200,4.56 -1997-01-09,17.75,17.87,17.50,17.75,15970000,4.44 -1997-01-08,18.25,18.37,17.37,17.62,39296400,4.41 -1997-01-07,18.12,18.25,17.50,17.50,34896400,4.38 -1997-01-06,17.62,18.34,17.25,17.87,67246400,4.47 -1997-01-03,21.12,22.25,21.00,21.75,4295600,5.44 -1997-01-02,21.12,21.25,20.75,21.00,5128800,5.25 -1996-12-31,21.37,21.50,20.75,20.87,13719200,5.22 -1996-12-30,23.12,23.25,21.75,21.75,9366800,5.44 -1996-12-27,22.87,23.75,22.87,23.12,4900000,5.78 -1996-12-26,23.25,23.25,22.87,23.00,3049200,5.75 -1996-12-24,23.25,23.37,22.87,23.12,2067600,5.78 -1996-12-23,24.00,24.25,23.25,23.25,11883600,5.81 -1996-12-20,22.50,23.62,21.37,23.50,19535600,5.88 -1996-12-19,23.00,23.25,22.25,22.25,4893600,5.56 -1996-12-18,22.75,23.12,22.62,23.12,7326400,5.78 -1996-12-17,22.37,22.50,22.25,22.50,5625200,5.62 -1996-12-16,23.50,23.50,22.50,22.62,5335600,5.66 -1996-12-13,23.75,23.87,23.25,23.25,3194400,5.81 -1996-12-12,24.12,24.25,23.87,23.87,3122400,5.97 -1996-12-11,23.75,24.25,23.75,24.00,5853600,6.00 -1996-12-10,24.87,25.00,24.25,24.50,6593600,6.12 -1996-12-09,25.25,25.37,24.81,25.00,5680800,6.25 -1996-12-06,24.37,25.37,24.00,25.12,8210800,6.28 -1996-12-05,25.00,25.25,25.00,25.00,5096800,6.25 -1996-12-04,25.12,25.37,24.87,25.00,6823600,6.25 -1996-12-03,25.25,25.50,25.00,25.12,9840800,6.28 -1996-12-02,24.12,25.12,23.87,25.12,6254400,6.28 -1996-11-29,24.50,24.62,24.00,24.12,1527600,6.03 -1996-11-27,24.12,24.62,24.12,24.50,3191200,6.12 -1996-11-26,24.87,25.00,24.00,24.25,4054800,6.06 -1996-11-25,25.37,25.50,25.00,25.00,2830800,6.25 -1996-11-22,24.50,25.25,24.50,25.25,3732400,6.31 -1996-11-21,24.87,25.00,24.37,24.50,2522400,6.12 -1996-11-20,24.87,25.37,24.87,25.00,3683200,6.25 -1996-11-19,24.87,25.12,24.62,24.87,4446400,6.22 -1996-11-18,25.00,25.12,24.50,24.75,5468800,6.19 -1996-11-15,25.87,26.00,25.00,25.00,4684400,6.25 -1996-11-14,25.50,25.75,25.37,25.62,1740800,6.41 -1996-11-13,25.37,25.87,25.00,25.56,3000800,6.39 -1996-11-12,26.12,26.25,25.12,25.25,5120000,6.31 -1996-11-11,26.37,26.37,25.87,26.00,3318800,6.50 -1996-11-08,25.87,26.25,25.75,26.25,6750800,6.56 -1996-11-07,25.37,26.00,25.25,25.87,5548800,6.47 -1996-11-06,25.62,25.75,24.87,25.50,6462000,6.38 -1996-11-05,24.50,25.87,24.50,25.50,13517600,6.38 -1996-11-04,24.37,24.50,23.75,24.37,3270800,6.09 -1996-11-01,23.37,24.25,23.12,24.25,7563200,6.06 -1996-10-31,23.25,23.37,22.25,23.00,6945600,5.75 -1996-10-30,23.50,24.00,22.87,22.87,9192000,5.72 -1996-10-29,24.62,24.75,23.12,23.25,7135200,5.81 -1996-10-28,25.12,25.12,24.50,24.50,4288800,6.12 -1996-10-25,24.87,25.00,24.50,24.50,2775600,6.12 -1996-10-24,25.00,25.00,24.50,24.75,3020800,6.19 -1996-10-23,24.75,25.25,24.37,24.75,5736800,6.19 -1996-10-22,25.62,25.62,24.25,24.87,7651200,6.22 -1996-10-21,26.50,26.62,25.50,25.62,6712000,6.41 -1996-10-18,26.50,26.62,26.00,26.56,13681200,6.64 -1996-10-17,27.50,27.75,26.37,26.37,36679200,6.59 -1996-10-16,25.25,26.12,24.62,25.75,11975200,6.44 -1996-10-15,25.75,25.87,25.00,25.25,12970000,6.31 -1996-10-14,24.50,25.37,24.25,25.25,9649200,6.31 -1996-10-11,24.37,24.62,24.00,24.25,4327600,6.06 -1996-10-10,23.87,24.50,23.75,24.19,9883200,6.05 -1996-10-09,23.37,23.62,22.87,23.00,3044800,5.75 -1996-10-08,23.50,24.25,23.25,23.25,6802000,5.81 -1996-10-07,23.00,23.37,22.87,23.12,3428800,5.78 -1996-10-04,22.87,23.12,22.12,22.81,4770000,5.70 -1996-10-03,23.62,23.75,22.37,22.37,8140000,5.59 -1996-10-02,23.62,24.62,23.12,23.62,9890000,5.91 -1996-10-01,22.00,24.75,22.00,24.62,19269200,6.16 -1996-09-30,22.12,22.37,22.12,22.19,3058000,5.55 -1996-09-27,22.25,22.37,22.12,22.31,2932000,5.58 -1996-09-26,22.37,22.50,22.25,22.37,3693600,5.59 -1996-09-25,22.50,22.62,22.00,22.37,3902400,5.59 -1996-09-24,22.37,22.87,22.37,22.50,5143600,5.62 -1996-09-23,22.87,22.87,22.37,22.37,1653600,5.59 -1996-09-20,23.37,23.50,22.75,22.87,5330800,5.72 -1996-09-19,23.62,23.62,23.37,23.37,4282000,5.84 -1996-09-18,23.00,24.12,22.87,23.50,12631200,5.88 -1996-09-17,22.87,23.12,22.50,23.00,7487600,5.75 -1996-09-16,21.50,23.00,21.37,22.37,8747600,5.59 -1996-09-13,20.37,21.25,20.37,21.00,5967600,5.25 -1996-09-12,21.00,21.12,20.25,20.37,9340000,5.09 -1996-09-11,21.50,21.75,21.00,21.12,5266800,5.28 -1996-09-10,22.12,22.12,21.50,21.50,5562000,5.38 -1996-09-09,22.62,22.75,21.87,22.00,5302400,5.50 -1996-09-06,23.12,23.25,22.62,23.00,8602000,5.75 -1996-09-05,23.50,23.75,22.87,22.87,9999200,5.72 -1996-09-04,23.87,24.62,23.87,24.12,3636400,6.03 -1996-09-03,24.12,24.37,23.87,24.12,2461200,6.03 -1996-08-30,24.75,24.75,24.25,24.25,3784800,6.06 -1996-08-29,24.87,24.87,24.37,24.50,3829200,6.12 -1996-08-28,24.87,25.00,24.50,24.87,5844400,6.22 -1996-08-27,24.12,25.00,24.00,24.86,10339200,6.22 -1996-08-26,23.87,24.12,23.50,24.12,3204400,6.03 -1996-08-23,23.00,24.00,23.00,23.87,7281200,5.97 -1996-08-22,23.00,23.25,22.87,23.25,3138000,5.81 -1996-08-21,23.50,23.62,22.87,23.00,4052400,5.75 -1996-08-20,23.87,23.87,23.37,23.50,7564400,5.88 -1996-08-19,22.37,23.62,22.37,23.62,8084400,5.91 -1996-08-16,22.62,22.62,22.12,22.50,5075600,5.62 -1996-08-15,22.62,22.75,22.25,22.25,3845600,5.56 -1996-08-14,22.62,23.00,22.62,22.75,2570000,5.69 -1996-08-13,22.87,23.12,22.37,22.50,3706400,5.62 -1996-08-12,23.37,23.62,22.37,23.00,5408000,5.75 -1996-08-09,22.25,23.37,22.12,23.12,8243600,5.78 -1996-08-08,22.37,22.37,21.87,22.12,3640000,5.53 -1996-08-07,21.75,22.62,21.62,22.37,8892400,5.59 -1996-08-06,21.00,21.50,20.75,21.50,3354800,5.38 -1996-08-05,21.62,21.87,20.87,21.00,3612000,5.25 -1996-08-02,21.62,22.00,21.25,21.62,4574800,5.41 -1996-08-01,22.00,22.00,21.12,21.25,3942400,5.31 -1996-07-31,21.25,22.00,21.25,22.00,3332400,5.50 -1996-07-30,22.62,22.75,21.25,21.37,6766800,5.34 -1996-07-29,22.00,22.50,21.75,22.25,7005600,5.56 -1996-07-26,21.50,22.00,21.12,22.00,4426800,5.50 -1996-07-25,21.12,21.37,20.75,21.00,4090800,5.25 -1996-07-24,20.00,21.00,19.87,20.81,9448800,5.20 -1996-07-23,20.50,20.62,20.25,20.50,4651200,5.12 -1996-07-22,20.87,20.87,20.00,20.25,5456400,5.06 -1996-07-19,20.87,21.00,20.75,20.75,9510000,5.19 -1996-07-18,21.50,21.75,20.36,20.87,32058800,5.22 -1996-07-17,17.37,17.50,16.62,16.87,8355600,4.22 -1996-07-16,17.37,17.37,16.00,16.87,10334400,4.22 -1996-07-15,18.12,18.12,17.12,17.19,4779200,4.30 -1996-07-12,18.37,18.37,17.25,18.06,9610800,4.51 -1996-07-11,18.75,18.87,17.37,17.87,10420000,4.47 -1996-07-10,19.12,19.50,18.75,18.75,6055200,4.69 -1996-07-09,19.50,19.62,19.00,19.00,6723600,4.75 -1996-07-08,19.62,19.87,19.00,19.12,6762000,4.78 -1996-07-05,19.37,19.75,19.25,19.50,3808800,4.88 -1996-07-03,20.37,20.37,19.37,19.37,10323200,4.84 -1996-07-02,21.37,21.50,21.00,21.00,3189200,5.25 -1996-07-01,21.12,21.50,21.00,21.50,4732400,5.38 -1996-06-28,20.87,21.00,20.62,21.00,4138000,5.25 -1996-06-27,20.00,21.00,19.75,20.62,8202400,5.16 -1996-06-26,20.62,20.75,19.62,19.87,14440800,4.97 -1996-06-25,22.12,22.25,20.37,20.62,8831200,5.16 -1996-06-24,22.62,22.62,22.12,22.25,4398000,5.56 -1996-06-21,22.87,22.87,22.37,22.62,5792000,5.66 -1996-06-20,23.37,23.37,22.50,22.75,5260800,5.69 -1996-06-19,23.12,23.37,22.62,23.12,4803600,5.78 -1996-06-18,23.62,23.75,22.62,22.75,7979200,5.69 -1996-06-17,24.12,24.12,23.62,23.62,4052000,5.91 -1996-06-14,24.75,24.75,23.87,23.94,5186800,5.99 -1996-06-13,24.37,24.92,24.00,24.62,6856800,6.16 -1996-06-12,24.50,24.50,24.00,24.25,5440000,6.06 -1996-06-11,24.25,24.25,24.00,24.00,5481200,6.00 -1996-06-10,24.37,24.50,24.00,24.12,3820800,6.03 -1996-06-07,24.00,24.37,23.50,24.37,9565200,6.09 -1996-06-06,25.00,25.25,24.12,24.25,12938800,6.06 -1996-06-05,25.37,25.50,24.25,25.12,18228000,6.28 -1996-06-04,24.00,24.37,23.87,24.19,27235600,6.05 -1996-06-03,25.87,26.00,24.75,24.75,4481200,6.19 -1996-05-31,25.62,26.62,25.50,26.12,5813600,6.53 -1996-05-30,24.87,25.75,24.75,25.50,3703600,6.38 -1996-05-29,26.25,26.25,24.75,24.87,7840000,6.22 -1996-05-28,26.75,27.25,26.37,26.37,3658800,6.59 -1996-05-24,26.25,26.87,26.12,26.75,4046800,6.69 -1996-05-23,26.12,26.62,25.75,26.25,4447600,6.56 -1996-05-22,27.37,27.37,25.75,26.06,7215600,6.51 -1996-05-21,28.00,28.12,27.12,27.12,4088000,6.78 -1996-05-20,27.87,28.12,27.62,27.94,3028800,6.99 -1996-05-17,28.37,28.37,27.50,27.62,4405600,6.91 -1996-05-16,28.25,28.62,27.87,28.37,4648800,7.09 -1996-05-15,27.87,28.87,27.75,28.50,10442400,7.12 -1996-05-14,27.75,28.00,27.50,27.50,7068000,6.88 -1996-05-13,27.12,27.62,26.62,27.06,6701200,6.76 -1996-05-10,26.25,27.37,26.00,27.25,3966400,6.81 -1996-05-09,26.37,26.50,25.75,26.12,3515600,6.53 -1996-05-08,27.25,27.25,25.62,26.75,6688800,6.69 -1996-05-07,26.37,27.37,26.25,26.87,12641200,6.72 -1996-05-06,24.87,25.87,24.75,25.62,10349200,6.41 -1996-05-03,24.12,24.12,23.50,23.87,3892400,5.97 -1996-05-02,24.50,24.50,23.50,23.75,6728000,5.94 -1996-05-01,24.37,24.75,24.12,24.37,4039200,6.09 -1996-04-30,24.87,24.87,24.12,24.37,4881200,6.09 -1996-04-29,25.00,25.00,24.50,24.75,4324800,6.19 -1996-04-26,25.00,25.12,24.62,24.75,6759200,6.19 -1996-04-25,24.37,24.87,24.12,24.87,6245200,6.22 -1996-04-24,24.62,24.75,24.19,24.25,4596800,6.06 -1996-04-23,25.12,25.25,24.62,24.75,6086400,6.19 -1996-04-22,25.25,25.50,24.87,25.12,3973200,6.28 -1996-04-19,24.62,25.12,24.62,25.06,3655600,6.26 -1996-04-18,25.37,25.39,24.25,24.75,7780800,6.19 -1996-04-17,25.87,26.00,25.12,25.25,3056400,6.31 -1996-04-16,25.87,26.00,25.62,25.87,3634400,6.47 -1996-04-15,25.50,25.75,25.00,25.75,5515600,6.44 -1996-04-12,25.87,25.87,25.37,25.50,2924400,6.38 -1996-04-11,26.12,26.25,25.50,25.75,3526400,6.44 -1996-04-10,26.12,26.50,25.87,26.00,6242400,6.50 -1996-04-09,24.87,26.50,24.37,26.00,8415600,6.50 -1996-04-08,23.87,24.50,23.75,24.37,6046400,6.09 -1996-04-04,24.62,24.62,24.00,24.12,3092000,6.03 -1996-04-03,25.12,25.12,24.33,24.56,2591200,6.14 -1996-04-02,25.62,25.62,24.87,25.00,3635600,6.25 -1996-04-01,25.12,25.87,24.52,25.50,5680000,6.38 -1996-03-29,24.25,24.75,23.75,24.56,5962400,6.14 -1996-03-28,24.75,25.62,24.12,24.19,10572000,6.05 -1996-03-27,23.25,25.25,23.00,25.25,15338800,6.31 -1996-03-26,24.00,24.50,23.62,23.87,5755600,5.97 -1996-03-25,25.50,25.75,24.00,24.00,5887600,6.00 -1996-03-22,25.25,25.37,24.87,25.37,3842400,6.34 -1996-03-21,25.50,25.50,25.00,25.12,3932400,6.28 -1996-03-20,25.75,25.75,25.12,25.25,4154800,6.31 -1996-03-19,26.37,26.50,25.62,25.75,4442400,6.44 -1996-03-18,25.94,26.12,25.75,26.12,3907600,6.53 -1996-03-15,26.00,26.00,25.50,25.87,3632400,6.47 -1996-03-14,25.87,25.87,25.50,25.62,3342400,6.41 -1996-03-13,25.87,26.12,25.62,25.75,3560000,6.44 -1996-03-12,26.00,26.37,25.62,25.81,3453200,6.45 -1996-03-11,26.25,26.37,25.75,25.87,4544800,6.47 -1996-03-08,25.75,26.25,25.00,26.00,5322400,6.50 -1996-03-07,26.25,26.37,25.37,25.81,9292400,6.45 -1996-03-06,26.75,26.87,26.12,26.19,3547600,6.55 -1996-03-05,26.50,26.75,26.25,26.62,4246800,6.66 -1996-03-04,27.25,27.37,26.25,26.25,6708800,6.56 -1996-03-01,27.62,27.62,26.62,26.87,8263200,6.72 -1996-02-29,27.50,27.75,27.25,27.50,4049200,6.88 -1996-02-28,28.87,28.87,27.62,27.75,6728800,6.94 -1996-02-27,29.87,29.87,28.50,28.62,5331200,7.16 -1996-02-26,30.00,30.12,29.50,29.50,4238000,7.38 -1996-02-23,29.87,30.25,29.62,29.87,6205200,7.47 -1996-02-22,30.00,30.12,29.62,29.87,6588000,7.47 -1996-02-21,29.37,29.75,29.12,29.62,7924400,7.41 -1996-02-20,28.00,29.50,28.00,29.00,13473200,7.25 -1996-02-16,28.12,28.37,27.50,27.50,5602400,6.88 -1996-02-15,27.62,28.12,27.37,28.00,4360000,7.00 -1996-02-14,28.25,28.25,27.44,27.62,5843600,6.91 -1996-02-13,28.00,28.87,27.87,28.12,8161200,7.03 -1996-02-12,28.12,28.50,28.00,28.37,6948800,7.09 -1996-02-09,27.87,28.50,27.62,27.75,7360800,6.94 -1996-02-08,27.50,28.12,27.50,27.87,9420800,6.97 -1996-02-07,29.75,29.75,27.75,28.25,12885200,7.06 -1996-02-06,29.25,30.00,29.25,29.62,8101200,7.41 -1996-02-05,29.69,29.75,29.00,29.25,11396400,7.31 -1996-02-02,28.87,29.62,28.75,29.25,19865600,7.31 -1996-02-01,27.50,28.37,27.50,28.37,11902400,7.09 -1996-01-31,27.75,28.00,27.37,27.62,11736800,6.91 -1996-01-30,27.00,28.12,26.86,27.31,22246800,6.83 -1996-01-29,29.00,29.75,28.75,29.12,11900000,7.28 -1996-01-26,30.37,31.25,28.62,30.62,26297600,7.66 -1996-01-25,31.75,32.00,30.12,30.25,15911200,7.56 -1996-01-24,32.13,32.25,31.75,32.25,23438800,8.06 -1996-01-23,33.75,34.00,31.00,31.62,35305200,7.91 -1996-01-22,29.75,31.00,29.25,30.50,17852400,7.62 -1996-01-19,31.00,31.75,29.37,29.87,29623600,7.47 -1996-01-18,32.88,33.38,30.37,31.94,24955200,7.99 -1996-01-17,34.38,34.38,33.75,34.00,8445200,8.50 -1996-01-16,34.38,34.75,33.63,34.56,12606400,8.64 -1996-01-15,33.75,34.50,33.38,34.13,12971200,8.53 -1996-01-12,34.75,34.75,33.25,33.88,14370000,8.47 -1996-01-11,32.63,35.00,32.38,35.00,27041200,8.75 -1996-01-10,32.50,34.75,32.25,34.25,13057600,8.56 -1996-01-09,34.63,34.63,32.75,32.75,8978800,8.19 -1996-01-08,34.50,35.50,34.00,34.63,4341200,8.66 -1996-01-05,31.62,34.25,31.37,34.25,15929200,8.56 -1996-01-04,32.38,32.38,31.37,31.56,10721200,7.89 -1996-01-03,32.00,32.88,31.87,32.13,15368800,8.03 -1996-01-02,32.25,32.25,31.75,32.13,4983200,8.03 -1995-12-29,32.00,32.38,31.62,31.87,10874400,7.97 -1995-12-28,32.13,32.75,31.87,32.00,8933200,8.00 -1995-12-27,32.13,33.38,31.87,32.38,9609200,8.10 -1995-12-26,32.50,32.50,31.75,32.06,4994800,8.02 -1995-12-22,32.63,32.88,32.13,32.25,8392400,8.06 -1995-12-21,32.75,32.75,31.62,32.50,11893200,8.12 -1995-12-20,33.50,33.63,32.50,32.63,13074400,8.16 -1995-12-19,32.75,33.25,32.25,32.75,15403600,8.19 -1995-12-18,35.13,35.25,31.87,32.25,23807600,8.06 -1995-12-15,35.50,36.63,34.38,35.25,25960000,8.81 -1995-12-14,38.88,39.38,38.00,38.25,11928000,9.56 -1995-12-13,38.25,39.00,36.75,38.38,24472400,9.60 -1995-12-12,38.63,38.63,38.00,38.00,6353200,9.50 -1995-12-11,39.50,39.63,38.38,38.63,4003200,9.66 -1995-12-08,38.75,39.38,37.88,39.38,5053200,9.85 -1995-12-07,38.75,38.75,37.88,38.56,5084800,9.64 -1995-12-06,39.75,39.88,38.38,38.75,7195200,9.69 -1995-12-05,38.50,39.88,38.25,39.50,13000000,9.88 -1995-12-04,40.13,40.13,39.00,39.50,17171200,9.88 -1995-12-01,38.00,38.25,37.13,37.63,7300800,9.41 -1995-11-30,38.88,39.00,38.00,38.13,6247600,9.53 -1995-11-29,40.13,40.13,39.00,39.25,3782000,9.81 -1995-11-28,39.38,40.13,39.25,40.00,6305200,10.00 -1995-11-27,40.63,40.63,39.38,39.38,4148800,9.85 -1995-11-24,38.88,40.38,38.75,40.19,3930800,10.05 -1995-11-22,38.63,39.25,38.50,38.63,3533600,9.66 -1995-11-21,38.75,38.75,37.88,38.63,6845200,9.66 -1995-11-20,40.25,40.25,38.50,38.63,5314400,9.63 -1995-11-17,40.00,40.38,39.75,40.13,4607600,10.00 -1995-11-16,40.88,41.50,39.50,39.94,8102000,9.95 -1995-11-15,42.00,42.00,40.13,41.00,8874400,10.22 -1995-11-14,41.00,42.50,41.00,41.50,14560000,10.34 -1995-11-13,40.25,41.25,40.00,40.88,11343200,10.19 -1995-11-10,39.38,40.25,38.88,39.75,7973200,9.91 -1995-11-09,39.75,40.00,38.88,39.38,9295200,9.81 -1995-11-08,39.75,41.00,38.75,38.88,12823600,9.69 -1995-11-07,37.75,40.50,37.50,39.63,26310800,9.88 -1995-11-06,36.50,38.75,36.38,38.13,11143200,9.50 -1995-11-03,36.75,36.88,35.88,36.50,6413200,9.10 -1995-11-02,36.88,36.88,36.25,36.63,5464400,9.13 -1995-11-01,36.63,37.13,35.50,36.63,6913200,9.13 -1995-10-31,35.25,36.63,35.13,36.31,10334400,9.05 -1995-10-30,34.88,35.25,34.63,35.25,6291200,8.79 -1995-10-27,34.88,34.88,34.13,34.75,5523200,8.66 -1995-10-26,34.88,35.00,34.50,34.88,4503600,8.69 -1995-10-25,35.25,35.38,34.75,34.75,4761200,8.66 -1995-10-24,35.50,35.50,34.88,35.13,7638800,8.76 -1995-10-23,35.13,35.13,34.75,35.13,7078000,8.76 -1995-10-20,35.25,35.25,34.63,35.13,13818800,8.76 -1995-10-19,35.88,36.13,34.75,34.75,33761200,8.66 -1995-10-18,37.00,39.56,36.75,37.38,18311200,9.32 -1995-10-17,36.50,36.88,35.88,36.63,6390000,9.13 -1995-10-16,36.25,37.00,35.88,36.13,6515200,9.00 -1995-10-13,35.75,36.88,35.50,36.00,8422000,8.97 -1995-10-12,35.00,35.38,34.75,35.31,5803200,8.80 -1995-10-11,35.25,35.63,34.13,34.88,11893200,8.69 -1995-10-10,34.38,35.00,33.63,34.69,14303600,8.65 -1995-10-09,35.38,35.75,34.38,34.81,13320800,8.68 -1995-10-06,36.75,37.00,35.63,35.69,11058000,8.89 -1995-10-05,36.25,36.63,35.88,36.50,8737600,9.10 -1995-10-04,36.63,37.00,36.00,36.38,9532000,9.07 -1995-10-03,38.13,38.50,37.13,37.63,10368000,9.38 -1995-10-02,37.75,38.50,37.50,37.63,14000000,9.38 -1995-09-29,38.00,38.25,36.88,37.25,10123200,9.28 -1995-09-28,36.50,37.88,36.50,37.75,11843600,9.41 -1995-09-27,37.50,37.50,34.75,36.25,16135600,9.03 -1995-09-26,37.75,37.88,37.13,37.38,8961200,9.32 -1995-09-25,38.25,38.27,37.38,37.52,11267600,9.35 -1995-09-22,36.88,37.25,36.38,37.06,14258000,9.24 -1995-09-21,36.50,37.50,36.38,37.00,12407600,9.22 -1995-09-20,37.25,37.38,36.50,36.63,11500800,9.13 -1995-09-19,36.75,37.13,36.13,36.75,17512400,9.16 -1995-09-18,36.38,36.81,35.88,36.69,22216400,9.14 -1995-09-15,37.38,39.88,35.50,35.88,43286800,8.94 -1995-09-14,41.38,41.63,39.75,40.00,19675600,9.97 -1995-09-13,42.88,43.38,42.00,42.38,11530800,10.56 -1995-09-12,44.50,44.88,42.63,42.94,11658800,10.70 -1995-09-11,44.88,45.50,44.25,44.25,6160800,11.03 -1995-09-08,44.75,44.88,44.50,44.75,6243200,11.15 -1995-09-07,44.00,45.31,43.75,44.75,9373600,11.15 -1995-09-06,43.88,44.17,43.50,43.75,7175600,10.90 -1995-09-05,43.50,43.50,42.75,43.50,6443200,10.84 -1995-09-01,43.00,43.50,42.88,42.94,3532400,10.70 -1995-08-31,43.38,43.50,43.00,43.00,3148000,10.72 -1995-08-30,43.25,43.75,43.13,43.38,5482000,10.81 -1995-08-29,43.00,43.25,42.50,43.13,11325600,10.75 -1995-08-28,44.88,45.00,43.00,43.00,8680000,10.72 -1995-08-25,45.88,45.88,44.63,44.75,4819200,11.15 -1995-08-24,45.63,46.25,45.50,45.75,10285200,11.40 -1995-08-23,44.88,45.88,44.63,45.50,9078000,11.34 -1995-08-22,44.38,45.13,44.13,44.75,7769200,11.15 -1995-08-21,44.88,45.38,44.13,44.13,9721200,11.00 -1995-08-18,44.88,45.13,43.75,44.88,8620000,11.19 -1995-08-17,44.63,45.50,44.13,44.63,8827600,11.12 -1995-08-16,44.00,44.50,43.63,44.50,10457600,11.09 -1995-08-15,43.88,44.13,43.13,44.06,11370800,10.95 -1995-08-14,43.00,43.75,42.88,43.38,5989200,10.78 -1995-08-11,42.88,43.13,41.88,43.06,7407600,10.70 -1995-08-10,43.13,43.25,42.63,42.75,5868000,10.63 -1995-08-09,42.63,43.75,42.50,43.13,13190000,10.72 -1995-08-08,43.63,43.75,42.38,42.50,8388800,10.56 -1995-08-07,44.13,44.63,43.13,43.38,6920000,10.78 -1995-08-04,45.00,45.13,43.75,44.25,6884400,11.00 -1995-08-03,44.13,45.63,43.88,45.00,7640800,11.18 -1995-08-02,43.88,45.00,43.75,44.38,9840800,11.03 -1995-08-01,44.88,44.88,43.50,43.50,7540000,10.81 -1995-07-31,45.50,45.63,44.75,45.00,5673600,11.18 -1995-07-28,46.75,47.25,45.00,45.50,9341200,11.31 -1995-07-27,45.50,47.50,45.50,46.81,11621200,11.63 -1995-07-26,46.25,46.25,45.38,45.38,6125200,11.28 -1995-07-25,46.00,46.38,45.63,45.75,9418000,11.37 -1995-07-24,44.00,45.50,43.75,45.38,7679200,11.28 -1995-07-21,43.00,44.88,43.00,43.75,27082400,10.87 -1995-07-20,46.00,47.38,45.00,47.06,11848800,11.70 -1995-07-19,47.00,48.00,45.00,45.50,18613200,11.31 -1995-07-18,49.00,49.56,47.75,48.13,9102000,11.96 -1995-07-17,48.88,49.75,48.63,49.00,8098000,12.18 -1995-07-14,47.38,49.00,47.00,48.75,9929200,12.12 -1995-07-13,47.38,48.75,47.13,47.63,12596400,11.84 -1995-07-12,47.25,48.00,46.13,47.00,10145200,11.68 -1995-07-11,47.75,48.63,47.06,47.13,7683200,11.71 -1995-07-10,48.63,49.88,48.13,48.63,10640800,12.09 -1995-07-07,46.88,49.25,46.75,48.63,13840000,12.09 -1995-07-06,46.50,47.00,45.75,47.00,6583200,11.68 -1995-07-05,46.88,47.88,46.50,46.50,6325600,11.56 -1995-07-03,46.50,47.13,46.25,46.94,1410800,11.67 -1995-06-30,47.25,47.88,46.13,46.44,5927600,11.54 -1995-06-29,46.38,48.13,46.00,47.25,8320000,11.74 -1995-06-28,46.00,47.50,45.38,46.63,9531200,11.59 -1995-06-27,47.38,48.25,46.38,46.38,7772400,11.53 -1995-06-26,48.25,48.50,47.63,48.13,5465600,11.96 -1995-06-23,48.75,49.00,47.75,48.75,8286800,12.12 -1995-06-22,49.00,49.63,48.63,49.13,16928800,12.21 -1995-06-21,47.63,50.13,46.75,49.38,22378800,12.27 -1995-06-20,46.00,47.75,46.00,47.38,26385200,11.78 -1995-06-19,43.88,45.25,43.50,44.38,16774400,11.03 -1995-06-16,43.88,44.00,43.50,43.88,3200800,10.91 -1995-06-15,43.63,43.75,43.38,43.63,3331200,10.84 -1995-06-14,43.88,43.88,43.38,43.63,4224800,10.84 -1995-06-13,44.50,44.63,43.88,44.00,4508000,10.94 -1995-06-12,44.00,44.50,43.88,44.17,7584400,10.98 -1995-06-09,43.63,43.75,43.13,43.50,6679200,10.81 -1995-06-08,43.38,43.38,42.13,42.94,4874400,10.67 -1995-06-07,44.13,44.13,43.13,43.13,4451200,10.72 -1995-06-06,43.63,44.38,43.50,44.00,11270800,10.94 -1995-06-05,42.38,43.50,42.13,43.50,9103200,10.81 -1995-06-02,41.88,42.38,41.50,42.13,3783200,10.47 -1995-06-01,41.88,42.50,41.75,42.19,6685200,10.49 -1995-05-31,42.13,42.13,41.00,41.56,5707600,10.33 -1995-05-30,42.63,42.88,41.50,42.00,7021200,10.44 -1995-05-26,43.00,43.13,42.25,42.69,4097600,10.61 -1995-05-25,43.25,44.00,43.00,43.38,6536800,10.75 -1995-05-24,43.75,44.25,42.88,43.50,9459200,10.78 -1995-05-23,44.13,44.38,43.50,43.88,9881200,10.88 -1995-05-22,42.50,44.13,42.25,44.13,13282400,10.94 -1995-05-19,42.88,43.75,42.63,42.75,11522000,10.60 -1995-05-18,44.13,44.13,43.25,43.38,13287600,10.75 -1995-05-17,43.75,44.38,43.50,44.00,9419200,10.91 -1995-05-16,43.13,44.38,42.50,43.75,11895600,10.84 -1995-05-15,43.13,43.75,42.50,43.63,14053200,10.81 -1995-05-12,40.88,43.69,40.50,43.63,23153200,10.81 -1995-05-11,41.63,41.63,40.38,41.00,18712400,10.16 -1995-05-10,41.50,41.88,40.75,41.44,9837600,10.27 -1995-05-09,40.63,41.38,40.00,41.25,11540800,10.22 -1995-05-08,39.88,41.00,39.75,40.50,13832000,10.04 -1995-05-05,38.75,39.13,38.13,38.88,7445200,9.64 -1995-05-04,38.25,39.88,38.00,38.50,10846800,9.54 -1995-05-03,38.25,38.63,38.00,38.13,6043600,9.45 -1995-05-02,38.25,38.38,37.50,38.13,4289200,9.45 -1995-05-01,38.25,38.75,38.00,38.25,6375600,9.48 -1995-04-28,38.00,38.38,37.50,38.25,6984400,9.48 -1995-04-27,38.50,38.50,37.75,37.88,5014800,9.39 -1995-04-26,37.63,38.75,37.38,38.25,8246800,9.48 -1995-04-25,39.13,39.38,37.25,37.75,9780000,9.36 -1995-04-24,39.00,39.63,38.50,39.00,9724400,9.67 -1995-04-21,37.25,39.50,37.13,39.13,23812400,9.70 -1995-04-20,37.13,38.50,36.63,37.63,11772400,9.33 -1995-04-19,37.50,37.50,35.63,36.38,9990800,9.02 -1995-04-18,38.50,38.63,37.50,37.50,8263200,9.29 -1995-04-17,38.13,39.38,37.88,38.38,7467600,9.51 -1995-04-13,39.25,39.25,37.88,38.25,6242400,9.48 -1995-04-12,38.25,39.63,37.38,39.00,16973200,9.67 -1995-04-11,36.75,37.88,36.63,37.75,7673200,9.36 -1995-04-10,36.88,37.00,36.13,36.63,4211200,9.08 -1995-04-07,37.00,37.13,36.25,36.75,10562400,9.11 -1995-04-06,37.25,38.00,35.53,36.75,25823600,9.11 -1995-04-05,34.13,34.75,33.75,34.75,9470000,8.61 -1995-04-04,35.75,35.88,33.63,33.88,15300000,8.40 -1995-04-03,35.50,35.75,35.13,35.50,5528000,8.80 -1995-03-31,35.13,35.63,34.75,35.25,6558000,8.74 -1995-03-30,34.63,35.50,34.50,35.38,9767600,8.77 -1995-03-29,34.00,34.88,33.88,34.38,17760000,8.52 -1995-03-28,36.25,36.34,34.13,34.38,24655600,8.52 -1995-03-27,37.63,37.63,36.63,37.19,5111200,9.22 -1995-03-24,37.38,37.88,37.25,37.75,4584400,9.36 -1995-03-23,37.88,38.00,36.98,37.13,6094400,9.20 -1995-03-22,36.25,39.50,36.25,38.06,17130800,9.43 -1995-03-21,35.50,36.75,35.25,36.25,10920800,8.98 -1995-03-20,35.13,35.63,35.00,35.25,6793600,8.74 -1995-03-17,35.50,35.50,34.88,35.13,7713600,8.71 -1995-03-16,35.25,36.00,35.00,35.25,11330000,8.74 -1995-03-15,35.50,36.25,34.88,35.00,26120800,8.67 -1995-03-14,38.25,38.25,34.50,35.00,26015200,8.67 -1995-03-13,39.63,39.63,38.00,38.13,11653200,9.45 -1995-03-10,39.63,40.38,39.38,39.50,4923200,9.79 -1995-03-09,39.88,40.38,39.38,39.75,7038000,9.85 -1995-03-08,38.75,40.13,37.75,39.56,13048800,9.81 -1995-03-07,39.88,39.88,38.25,38.31,5399200,9.50 -1995-03-06,39.75,40.00,39.50,39.75,4751200,9.85 -1995-03-03,39.75,40.69,39.50,40.25,5209200,9.98 -1995-03-02,40.13,40.75,39.75,40.00,9619200,9.91 -1995-03-01,39.75,40.13,39.42,40.00,8025200,9.91 -1995-02-28,38.50,39.88,38.00,39.50,7965200,9.79 -1995-02-27,38.25,39.00,38.11,38.25,9600800,9.48 -1995-02-24,40.13,40.38,38.50,39.00,20334400,9.67 -1995-02-23,41.13,41.88,40.00,40.19,11262000,9.96 -1995-02-22,40.63,41.00,40.13,40.81,10501200,10.12 -1995-02-21,42.63,42.75,40.88,41.00,10776800,10.16 -1995-02-17,42.88,43.00,42.50,42.50,4366400,10.53 -1995-02-16,43.13,43.25,42.63,43.19,7821200,10.70 -1995-02-15,43.25,43.50,42.50,42.56,6604400,10.55 -1995-02-14,43.75,44.13,42.63,42.94,5934400,10.64 -1995-02-13,43.50,44.50,43.25,43.75,10120800,10.84 -1995-02-10,43.63,44.19,43.38,43.75,12542400,10.81 -1995-02-09,42.13,43.88,42.13,43.63,16988800,10.78 -1995-02-08,41.00,42.38,40.88,42.31,14403600,10.46 -1995-02-07,40.38,41.00,40.00,40.81,7200000,10.09 -1995-02-06,40.75,40.75,39.50,40.50,8702000,10.01 -1995-02-03,42.00,42.13,40.38,40.50,11400800,10.01 -1995-02-02,40.13,41.88,40.13,41.63,7288000,10.29 -1995-02-01,40.75,40.75,39.88,40.13,5665200,9.92 -1995-01-31,40.50,40.88,40.00,40.38,7621200,9.98 -1995-01-30,40.13,40.50,39.88,40.13,8255200,9.92 -1995-01-27,39.88,40.38,39.00,39.88,10676400,9.86 -1995-01-26,40.88,41.50,39.25,39.50,8822000,9.76 -1995-01-25,39.50,42.00,39.50,40.98,18482000,10.13 -1995-01-24,42.25,42.38,41.38,41.63,7805600,10.29 -1995-01-23,41.88,42.63,41.00,42.25,14252400,10.44 -1995-01-20,47.00,47.00,42.50,42.63,35731200,10.54 -1995-01-19,45.50,46.00,45.00,45.88,11238800,11.34 -1995-01-18,45.00,45.63,44.75,45.63,4581200,11.28 -1995-01-17,44.50,45.50,44.13,45.00,11806400,11.12 -1995-01-16,44.88,45.25,44.25,44.50,6765600,11.00 -1995-01-13,46.13,46.13,44.38,44.88,12565600,11.09 -1995-01-12,46.13,46.38,44.75,45.38,19721200,11.22 -1995-01-11,43.75,48.06,42.69,46.75,31212400,11.56 -1995-01-10,41.25,44.00,41.25,43.69,21977600,10.80 -1995-01-09,41.63,41.88,41.00,41.20,9805200,10.18 -1995-01-06,41.63,43.13,41.13,42.00,38456800,10.38 -1995-01-05,39.25,39.38,38.75,38.88,2646800,9.61 -1995-01-04,38.63,39.63,38.63,39.38,5682400,9.73 -1995-01-03,38.88,38.88,37.88,38.38,3726400,9.49 -1994-12-30,39.38,39.88,38.75,39.00,2616400,9.64 -1994-12-29,39.25,39.88,39.13,39.50,4341200,9.76 -1994-12-28,39.13,39.25,38.25,39.13,3198000,9.67 -1994-12-27,39.25,39.75,38.88,39.13,2928800,9.67 -1994-12-23,38.50,39.38,38.50,38.88,3372000,9.61 -1994-12-22,38.50,38.88,38.25,38.63,4771200,9.55 -1994-12-21,37.88,38.50,37.50,38.38,5635600,9.49 -1994-12-20,39.13,39.25,38.38,38.50,6263600,9.52 -1994-12-19,37.25,39.38,37.25,39.13,11890000,9.67 -1994-12-16,37.25,37.75,36.75,37.25,6432400,9.21 -1994-12-15,38.00,38.38,36.88,37.13,8133200,9.18 -1994-12-14,36.50,38.13,36.50,37.88,11123600,9.36 -1994-12-13,36.63,36.94,36.25,36.38,4266800,8.99 -1994-12-12,36.38,36.75,35.50,36.50,8004400,9.02 -1994-12-09,35.88,36.38,34.75,36.25,9329200,8.96 -1994-12-08,36.88,37.00,35.75,35.88,6081200,8.87 -1994-12-07,37.50,37.81,36.06,36.63,4916800,9.05 -1994-12-06,37.00,38.38,36.88,37.56,8516400,9.28 -1994-12-05,36.50,37.38,36.13,37.19,6460000,9.19 -1994-12-02,36.50,36.75,35.63,36.56,6170000,9.04 -1994-12-01,37.00,37.63,36.00,36.19,11051200,8.95 -1994-11-30,38.38,39.38,37.00,37.25,11157600,9.21 -1994-11-29,38.00,38.50,37.75,38.25,5163200,9.45 -1994-11-28,37.63,38.25,37.31,37.81,4971200,9.35 -1994-11-25,36.88,37.75,36.75,37.75,3012400,9.33 -1994-11-23,37.00,37.88,36.38,36.88,11723200,9.12 -1994-11-22,37.75,39.13,37.25,37.38,8018800,9.24 -1994-11-21,40.00,40.25,38.00,38.13,7255600,9.42 -1994-11-18,40.00,40.50,39.63,40.00,5257600,9.89 -1994-11-17,40.88,41.00,39.88,40.00,5380000,9.86 -1994-11-16,40.75,41.56,40.63,40.94,6700000,10.09 -1994-11-15,42.50,43.00,41.25,41.38,6001200,10.20 -1994-11-14,41.25,42.75,41.25,42.50,5002000,10.47 -1994-11-11,41.25,41.50,41.00,41.13,2237600,10.14 -1994-11-10,41.75,41.88,41.00,41.31,5476800,10.18 -1994-11-09,42.75,43.00,41.00,41.63,14530000,10.26 -1994-11-08,40.63,42.63,40.25,42.25,12476400,10.41 -1994-11-07,40.38,41.25,40.13,40.75,4058000,10.04 -1994-11-04,41.50,41.63,40.00,40.38,6869200,9.95 -1994-11-03,41.75,42.00,41.00,41.50,3962400,10.23 -1994-11-02,43.13,43.25,41.38,41.38,7819200,10.20 -1994-11-01,42.88,43.48,42.38,43.13,7805600,10.63 -1994-10-31,42.00,43.38,41.50,43.19,12728000,10.64 -1994-10-28,42.38,42.88,41.75,42.13,9762400,10.38 -1994-10-27,43.25,43.75,42.50,42.75,5700800,10.54 -1994-10-26,42.63,43.27,42.63,43.25,7043200,10.66 -1994-10-25,41.63,42.63,41.50,42.63,10771200,10.51 -1994-10-24,42.75,43.13,41.88,42.25,7316800,10.41 -1994-10-21,40.75,42.75,40.75,42.63,11528000,10.51 -1994-10-20,41.25,41.81,40.50,41.00,7808000,10.10 -1994-10-19,41.00,42.13,41.00,41.25,12549200,10.17 -1994-10-18,40.63,41.63,40.50,41.25,16749200,10.17 -1994-10-17,40.88,41.50,38.88,39.75,10866400,9.80 -1994-10-14,41.50,42.00,40.88,41.13,6292000,10.14 -1994-10-13,42.63,42.88,40.63,41.13,18761200,10.14 -1994-10-12,39.63,42.63,39.13,42.13,21340000,10.38 -1994-10-11,41.38,41.88,39.38,39.63,30083600,9.77 -1994-10-10,37.13,39.63,37.00,38.88,18700800,9.58 -1994-10-07,36.13,37.06,35.50,37.00,13022000,9.12 -1994-10-06,37.38,37.48,36.00,36.25,18828800,8.93 -1994-10-05,33.63,38.13,33.38,37.88,25366800,9.33 -1994-10-04,33.25,34.00,33.00,33.75,5822000,8.32 -1994-10-03,33.63,33.75,32.50,33.13,4644400,8.16 -1994-09-30,34.13,34.50,33.63,33.69,2561200,8.30 -1994-09-29,33.75,34.38,33.38,34.13,3921200,8.41 -1994-09-28,34.00,34.38,33.63,33.88,2914800,8.35 -1994-09-27,33.75,34.13,33.38,33.88,3904800,8.35 -1994-09-26,33.88,34.50,33.63,33.94,5072400,8.36 -1994-09-23,33.88,34.50,33.88,33.94,4760000,8.36 -1994-09-22,34.25,34.25,33.63,33.88,5235600,8.35 -1994-09-21,34.50,34.63,33.75,34.13,8402400,8.41 -1994-09-20,35.13,35.38,34.38,34.56,7047600,8.52 -1994-09-19,36.38,36.75,35.50,35.50,6242000,8.75 -1994-09-16,35.88,37.25,35.50,36.38,13008000,8.97 -1994-09-15,35.13,36.13,35.13,36.00,9253200,8.87 -1994-09-14,35.63,35.75,35.00,35.13,3549200,8.66 -1994-09-13,35.75,36.25,35.63,35.81,3723600,8.82 -1994-09-12,35.63,35.75,35.38,35.75,3252400,8.81 -1994-09-09,35.75,36.00,35.38,35.75,5624400,8.81 -1994-09-08,36.00,36.25,35.63,36.13,5691200,8.90 -1994-09-07,35.63,36.63,35.38,36.13,7283200,8.90 -1994-09-06,35.25,35.63,35.00,35.56,3279200,8.76 -1994-09-02,35.25,35.50,35.00,35.38,3628000,8.72 -1994-09-01,35.38,35.75,34.63,35.00,7305200,8.63 -1994-08-31,36.00,37.38,35.75,36.19,12568800,8.92 -1994-08-30,35.25,36.38,35.13,36.25,6515600,8.93 -1994-08-29,35.75,36.13,35.25,35.38,5450800,8.72 -1994-08-26,35.25,36.13,35.25,35.75,7300000,8.81 -1994-08-25,34.25,36.38,34.25,35.06,10688800,8.64 -1994-08-24,34.75,35.00,34.38,34.88,6132400,8.60 -1994-08-23,34.88,35.88,34.75,35.00,7669200,8.63 -1994-08-22,34.75,35.00,34.63,34.88,5445600,8.60 -1994-08-19,34.75,35.00,34.25,34.88,4674800,8.60 -1994-08-18,34.75,35.25,34.50,34.63,7370000,8.53 -1994-08-17,34.88,35.38,34.63,35.00,10232400,8.63 -1994-08-16,34.38,34.75,34.00,34.75,5563200,8.56 -1994-08-15,34.75,35.00,34.25,34.63,4293200,8.53 -1994-08-12,34.38,35.13,33.88,34.75,6425200,8.53 -1994-08-11,34.25,35.13,33.88,34.31,10649200,8.43 -1994-08-10,33.63,34.88,33.25,34.63,9065200,8.50 -1994-08-09,33.50,33.88,33.13,33.63,2811200,8.26 -1994-08-08,33.13,34.00,33.00,33.75,5048800,8.29 -1994-08-05,32.88,33.38,32.88,33.25,3123200,8.17 -1994-08-04,33.13,33.75,33.13,33.25,6620000,8.17 -1994-08-03,32.75,33.25,32.13,33.13,8113600,8.14 -1994-08-02,33.50,33.63,32.38,32.56,9642400,8.00 -1994-08-01,33.63,33.75,32.75,33.38,8204400,8.20 -1994-07-29,31.87,34.00,31.87,33.69,19853600,8.27 -1994-07-28,31.00,32.13,30.87,31.87,8762000,7.83 -1994-07-27,31.25,31.37,30.62,31.06,4788000,7.63 -1994-07-26,31.75,32.00,31.12,31.37,6756400,7.70 -1994-07-25,31.12,31.87,30.75,31.69,15103200,7.78 -1994-07-22,31.62,31.97,30.00,31.00,28098800,7.61 -1994-07-21,26.62,28.50,26.50,28.00,10348800,6.88 -1994-07-20,27.37,27.62,26.37,26.62,7765200,6.54 -1994-07-19,28.62,28.75,27.37,27.69,4176400,6.80 -1994-07-18,28.12,29.00,28.00,28.37,2734800,6.97 -1994-07-15,28.23,28.62,27.50,28.25,3409200,6.94 -1994-07-14,29.62,29.75,28.25,28.62,6459200,7.03 -1994-07-13,28.50,30.25,28.50,29.69,16081200,7.29 -1994-07-12,27.00,28.44,26.37,28.37,8662000,6.97 -1994-07-11,27.12,27.37,26.62,27.00,3801200,6.63 -1994-07-08,26.50,27.62,26.50,27.06,7457600,6.65 -1994-07-07,25.87,27.00,25.50,26.81,6097600,6.58 -1994-07-06,26.25,26.50,26.00,26.12,3499200,6.41 -1994-07-05,25.62,26.75,25.62,26.50,3080800,6.51 -1994-07-01,26.37,26.50,25.37,25.75,6404400,6.32 -1994-06-30,26.25,26.87,26.25,26.50,3652000,6.51 -1994-06-29,26.75,27.12,25.87,26.12,4842400,6.41 -1994-06-28,26.25,27.12,25.62,26.75,6235200,6.57 -1994-06-27,25.25,26.25,24.62,26.25,9153200,6.45 -1994-06-24,25.12,26.12,24.75,25.61,10470000,6.29 -1994-06-23,26.25,26.25,24.87,25.12,7283200,6.17 -1994-06-22,26.25,26.75,26.00,26.25,4081200,6.45 -1994-06-21,26.87,27.25,25.75,26.00,8693200,6.39 -1994-06-20,26.25,27.25,26.00,27.12,7150000,6.66 -1994-06-17,26.00,26.75,25.87,26.50,8027600,6.51 -1994-06-16,27.75,27.75,26.12,26.37,7812400,6.48 -1994-06-15,27.00,28.00,26.87,27.81,5704400,6.83 -1994-06-14,27.25,27.37,26.62,27.06,5531200,6.65 -1994-06-13,26.37,27.19,26.37,27.00,3339200,6.63 -1994-06-10,27.12,27.37,26.37,26.50,5107600,6.51 -1994-06-09,25.62,27.00,25.50,27.00,10485200,6.63 -1994-06-08,27.50,27.62,26.00,26.12,9809200,6.41 -1994-06-07,27.25,27.75,27.25,27.50,5013600,6.75 -1994-06-06,27.50,27.75,27.00,27.37,4513200,6.72 -1994-06-03,27.12,28.00,26.75,27.62,12649200,6.78 -1994-06-02,28.37,28.50,27.12,27.37,13762400,6.72 -1994-06-01,28.50,28.62,27.87,28.25,13786800,6.94 -1994-05-31,29.50,29.50,28.50,29.25,9211200,7.18 -1994-05-27,30.25,30.75,29.50,29.94,3882400,7.35 -1994-05-26,31.50,31.50,30.25,30.50,2613200,7.46 -1994-05-25,30.25,31.75,30.00,31.25,4873200,7.64 -1994-05-24,31.00,31.25,30.25,30.75,4536400,7.52 -1994-05-23,31.00,31.25,30.00,30.50,4286400,7.46 -1994-05-20,31.75,32.25,31.00,31.06,3519200,7.60 -1994-05-19,30.75,32.50,30.50,32.13,9776800,7.86 -1994-05-18,29.75,30.75,29.25,30.62,4436800,7.49 -1994-05-17,29.75,29.75,28.75,29.37,6450800,7.18 -1994-05-16,30.00,30.50,29.50,29.50,4854800,7.22 -1994-05-13,29.75,30.50,29.25,30.00,3323200,7.34 -1994-05-12,30.50,30.75,29.50,29.69,3839200,7.26 -1994-05-11,31.00,31.50,29.75,30.25,5218000,7.40 -1994-05-10,31.75,32.00,31.00,31.00,5246800,7.58 -1994-05-09,32.25,32.50,30.75,31.25,5026400,7.64 -1994-05-06,32.25,32.75,31.25,32.31,6721200,7.90 -1994-05-05,33.25,33.75,32.25,32.88,10307600,8.04 -1994-05-04,31.00,33.25,30.50,33.00,13008800,8.07 -1994-05-03,31.00,31.25,29.50,30.25,4761200,7.40 -1994-05-02,30.00,31.25,30.00,31.00,4401200,7.58 -1994-04-29,30.00,30.50,29.75,30.00,3399200,7.34 -1994-04-28,31.00,31.25,29.75,30.25,3604400,7.40 -1994-04-26,31.50,31.50,31.00,31.25,5879200,7.64 -1994-04-25,29.75,31.00,29.50,31.00,12846800,7.58 -1994-04-22,31.25,32.00,28.50,29.75,24923600,7.28 -1994-04-21,28.50,30.50,27.00,29.62,14674400,7.25 -1994-04-20,29.25,30.00,28.00,28.25,10080800,6.91 -1994-04-19,29.75,30.00,28.50,29.00,5947600,7.09 -1994-04-18,30.50,30.50,29.25,29.62,8238800,7.25 -1994-04-15,31.25,31.50,30.00,30.25,6730800,7.40 -1994-04-14,30.50,31.75,30.00,31.50,7933200,7.71 -1994-04-13,32.25,32.50,31.25,31.75,8330000,7.77 -1994-04-12,33.38,33.38,31.75,32.00,4890800,7.83 -1994-04-11,33.50,33.50,32.50,33.50,3823600,8.19 -1994-04-08,33.75,34.00,33.25,33.50,6336400,8.19 -1994-04-07,33.50,33.75,32.75,33.38,2764800,8.17 -1994-04-06,34.00,34.00,32.75,33.50,4616400,8.19 -1994-04-05,33.75,34.25,33.50,33.50,3505600,8.19 -1994-04-04,32.25,33.25,31.75,33.25,6016800,8.13 -1994-03-31,32.50,33.50,31.50,33.25,7481200,8.13 -1994-03-30,32.50,33.25,31.75,32.50,6079200,7.95 -1994-03-29,33.25,33.75,32.25,32.75,7640000,8.01 -1994-03-28,33.00,34.00,32.75,33.25,10098800,8.13 -1994-03-25,34.75,34.75,32.75,32.75,12291200,8.01 -1994-03-24,35.13,35.25,34.00,34.63,6738800,8.47 -1994-03-23,35.25,35.50,34.25,35.13,7749200,8.59 -1994-03-22,35.25,35.50,34.50,35.00,8690800,8.56 -1994-03-21,36.38,36.50,35.25,35.50,8806400,8.68 -1994-03-18,36.75,36.75,35.75,36.38,8004400,8.90 -1994-03-17,36.75,37.00,36.25,36.50,5590800,8.93 -1994-03-16,37.50,37.75,36.50,36.75,5265200,8.99 -1994-03-15,38.25,38.25,37.25,37.63,7319200,9.20 -1994-03-14,38.50,38.50,37.75,38.13,15783600,9.33 -1994-03-11,37.00,37.75,36.75,37.25,5791200,9.11 -1994-03-10,37.25,37.63,36.75,37.25,5142400,9.11 -1994-03-09,36.63,37.50,36.00,37.50,8896800,9.17 -1994-03-08,38.00,38.00,36.75,37.00,6647600,9.05 -1994-03-07,37.00,38.13,36.75,37.88,11088800,9.27 -1994-03-04,36.00,37.50,35.75,36.75,8113600,8.99 -1994-03-03,35.75,36.25,35.50,35.75,6737600,8.75 -1994-03-02,35.25,36.25,34.75,35.63,10519200,8.72 -1994-03-01,36.75,36.75,35.75,36.25,7570800,8.87 -1994-02-28,36.25,37.00,36.00,36.50,4434800,8.93 -1994-02-25,37.00,37.25,35.50,36.00,8468000,8.81 -1994-02-24,37.00,37.25,36.25,36.63,7081200,8.96 -1994-02-23,37.25,38.25,37.00,37.25,9318800,9.11 -1994-02-22,36.25,37.50,35.75,37.25,7676400,9.11 -1994-02-18,36.50,37.00,36.25,36.25,5326400,8.87 -1994-02-17,37.25,37.88,36.25,37.00,5197600,9.05 -1994-02-16,37.50,37.50,36.75,36.75,4379200,8.99 -1994-02-15,36.75,37.50,36.25,37.13,4654400,9.08 -1994-02-14,37.00,38.00,36.75,37.00,8775200,9.05 -1994-02-11,36.25,37.50,36.25,37.00,5880800,9.05 -1994-02-10,36.25,37.50,36.00,36.50,10802000,8.93 -1994-02-09,35.75,36.50,35.25,36.25,6699200,8.87 -1994-02-08,36.00,36.50,35.25,35.75,10210800,8.75 -1994-02-07,33.50,37.13,33.50,36.50,25925200,8.93 -1994-02-04,33.50,35.00,33.25,33.50,12645200,8.17 -1994-02-03,33.00,33.63,32.50,33.50,4933200,8.17 -1994-02-02,33.25,33.25,32.50,33.00,5247600,8.04 -1994-02-01,33.00,33.50,32.25,33.25,5618000,8.10 -1994-01-31,33.50,33.75,32.75,32.75,8532400,7.98 -1994-01-28,34.25,34.75,33.75,34.00,4891200,8.29 -1994-01-27,33.50,34.25,33.00,34.13,4724800,8.32 -1994-01-26,33.75,34.00,33.25,33.50,5922400,8.17 -1994-01-25,34.75,35.00,33.25,33.88,15818800,8.26 -1994-01-24,33.25,35.25,33.25,35.00,24742000,8.53 -1994-01-21,33.25,33.50,32.25,33.38,35007600,8.14 -1994-01-20,29.50,30.75,29.50,29.87,9582400,7.28 -1994-01-19,29.25,29.75,28.75,29.25,10066400,7.13 -1994-01-18,30.25,30.25,29.00,29.37,12978000,7.16 -1994-01-17,31.00,31.50,30.00,30.37,5206400,7.40 -1994-01-14,30.75,31.75,30.50,31.00,7673200,7.56 -1994-01-13,30.00,30.75,29.75,30.62,19000000,7.46 -1994-01-12,32.25,32.25,30.50,30.50,15684400,7.43 -1994-01-11,33.50,33.75,31.75,31.87,12700000,7.77 -1994-01-10,33.00,33.88,32.75,33.63,7222000,8.20 -1994-01-07,32.00,33.25,31.25,33.13,10688800,8.08 -1994-01-06,33.75,34.00,32.50,32.75,13095200,7.98 -1994-01-05,31.75,33.88,31.75,33.75,21874400,8.23 -1994-01-04,30.25,31.50,30.00,31.50,10198800,7.68 -1994-01-03,29.50,30.00,29.00,29.87,6485200,7.28 -1993-12-31,29.75,30.25,29.25,29.25,5765200,7.13 -1993-12-30,28.50,30.25,28.50,29.75,11253200,7.25 -1993-12-29,29.25,29.25,28.50,28.50,3853200,6.95 -1993-12-28,28.75,29.50,28.50,29.12,5705600,7.10 -1993-12-27,27.75,28.75,27.25,28.50,5730000,6.95 -1993-12-23,27.25,27.25,26.50,27.25,8120000,6.64 -1993-12-22,27.25,28.50,27.00,28.00,6498800,6.82 -1993-12-21,28.50,28.75,27.25,27.50,8973600,6.70 -1993-12-20,29.25,29.75,28.25,28.50,6768800,6.95 -1993-12-17,29.50,29.75,29.12,29.50,5197600,7.19 -1993-12-16,29.50,29.75,29.00,29.37,4532000,7.16 -1993-12-15,29.00,29.75,29.00,29.75,4438000,7.25 -1993-12-14,29.25,29.75,29.00,29.12,10492400,7.10 -1993-12-13,28.25,29.50,27.75,29.50,8729200,7.19 -1993-12-10,30.25,30.50,27.75,28.25,17781200,6.89 -1993-12-09,31.75,32.00,29.75,30.00,6531200,7.31 -1993-12-08,32.00,32.25,31.50,31.87,1422000,7.77 -1993-12-07,32.00,32.25,31.50,32.25,2280800,7.86 -1993-12-06,31.50,32.50,31.25,32.25,5610000,7.86 -1993-12-03,31.75,32.00,31.00,31.50,4314800,7.68 -1993-12-02,31.75,32.00,31.00,31.75,3614400,7.74 -1993-12-01,32.00,32.25,31.25,31.50,3978800,7.68 -1993-11-30,31.75,32.63,31.50,31.50,4036800,7.68 -1993-11-29,32.25,32.50,31.50,31.75,3462000,7.74 -1993-11-26,32.75,33.00,32.25,32.63,1569200,7.95 -1993-11-24,32.75,33.50,32.63,33.00,3246800,8.04 -1993-11-23,32.50,33.00,31.25,33.00,6653600,8.04 -1993-11-22,32.75,33.00,32.25,32.50,5389200,7.92 -1993-11-19,33.00,33.50,32.50,33.00,4409200,8.04 -1993-11-18,33.50,33.75,33.00,33.50,4089200,8.14 -1993-11-17,34.00,35.00,32.75,33.50,10812400,8.14 -1993-11-16,32.00,34.25,31.75,34.00,10838000,8.26 -1993-11-15,31.50,32.75,31.50,32.00,5616800,7.77 -1993-11-12,31.50,32.00,30.50,31.75,5136800,7.71 -1993-11-11,30.75,32.00,30.50,31.37,5090800,7.62 -1993-11-10,30.25,30.75,30.00,30.75,2765600,7.47 -1993-11-09,31.00,31.25,29.75,30.12,6136400,7.32 -1993-11-08,32.00,32.13,30.50,30.75,5966400,7.47 -1993-11-05,31.87,32.25,30.75,31.87,13513200,7.74 -1993-11-04,31.50,32.25,30.75,32.25,6632000,7.83 -1993-11-03,33.00,33.00,31.00,31.62,6320000,7.68 -1993-11-02,31.25,33.00,31.00,32.75,8013600,7.95 -1993-11-01,30.75,31.50,30.25,31.50,3798800,7.65 -1993-10-29,31.00,31.75,30.50,30.75,4892400,7.47 -1993-10-28,31.75,32.25,31.00,31.00,8736800,7.53 -1993-10-27,30.00,32.25,29.75,31.75,16415200,7.71 -1993-10-26,29.75,30.00,29.00,29.75,7960000,7.23 -1993-10-25,30.25,30.50,29.62,30.00,7840800,7.29 -1993-10-22,30.50,31.50,29.75,30.25,14160000,7.35 -1993-10-21,27.50,31.25,27.25,30.25,22417600,7.35 -1993-10-20,28.00,28.25,27.25,27.75,4956400,6.74 -1993-10-19,28.25,28.50,27.25,27.75,7643200,6.74 -1993-10-18,28.00,28.75,27.75,28.37,11900000,6.89 -1993-10-15,27.75,28.50,26.75,28.25,34136400,6.86 -1993-10-14,24.00,24.50,23.50,23.75,5749200,5.77 -1993-10-13,24.25,24.25,23.50,24.00,6322400,5.83 -1993-10-12,24.00,25.00,23.75,24.00,10952400,5.83 -1993-10-11,22.75,24.00,22.75,23.75,5775200,5.77 -1993-10-08,23.25,23.25,22.25,22.62,4989200,5.49 -1993-10-07,23.50,23.75,22.75,23.00,4828000,5.59 -1993-10-06,23.75,24.00,23.37,23.62,6271200,5.74 -1993-10-05,23.00,24.00,23.00,23.50,6306400,5.71 -1993-10-04,22.62,23.00,22.00,22.75,6891200,5.53 -1993-10-01,22.75,23.00,22.50,22.75,12022000,5.53 -1993-09-30,24.00,24.00,23.00,23.37,9828000,5.68 -1993-09-29,24.25,24.87,23.75,23.87,8463600,5.80 -1993-09-28,24.75,25.00,24.25,24.75,3386400,6.01 -1993-09-27,25.00,25.25,24.25,24.75,4043200,6.01 -1993-09-24,25.00,25.25,24.50,25.00,2743200,6.07 -1993-09-23,25.50,25.50,24.50,24.75,4697600,6.01 -1993-09-22,24.25,25.50,24.25,25.50,3960800,6.19 -1993-09-21,24.75,25.25,23.87,24.50,5250000,5.95 -1993-09-20,25.25,25.50,24.75,24.87,3968800,6.04 -1993-09-17,24.37,25.50,24.25,25.25,6157600,6.13 -1993-09-16,24.25,25.00,24.25,24.75,3086800,6.01 -1993-09-15,24.50,25.00,23.50,24.50,9206800,5.95 -1993-09-14,24.25,25.00,24.00,24.25,9880000,5.89 -1993-09-13,26.25,26.50,24.75,25.25,9143600,6.13 -1993-09-10,26.25,26.25,25.37,26.25,4804800,6.38 -1993-09-09,26.75,27.00,26.00,26.00,5352000,6.31 -1993-09-08,26.25,27.00,26.00,26.75,8102000,6.50 -1993-09-07,26.00,27.00,25.75,26.25,5130000,6.38 -1993-09-03,26.00,26.00,25.25,25.75,5830000,6.25 -1993-09-02,26.00,26.25,25.25,25.75,10081200,6.25 -1993-09-01,26.50,26.75,25.75,26.12,8065200,6.34 -1993-08-31,26.50,26.75,26.00,26.50,4570800,6.44 -1993-08-30,26.50,26.50,25.87,26.00,9785600,6.31 -1993-08-27,27.00,27.00,26.25,26.50,6676400,6.44 -1993-08-26,27.25,27.25,26.50,26.87,6296800,6.53 -1993-08-25,28.00,28.25,26.75,27.25,5209200,6.62 -1993-08-24,28.25,28.75,27.75,28.00,3625600,6.80 -1993-08-23,28.00,28.75,27.50,28.37,3265600,6.89 -1993-08-20,27.75,28.00,27.00,28.00,3574400,6.80 -1993-08-19,28.75,28.75,27.50,27.50,5452000,6.68 -1993-08-18,29.00,29.75,28.25,28.50,6751200,6.92 -1993-08-17,27.75,28.50,27.25,28.37,3876800,6.89 -1993-08-16,27.50,28.00,27.25,27.50,3669200,6.68 -1993-08-13,26.50,27.75,26.25,27.37,4978800,6.62 -1993-08-12,27.50,27.75,26.00,26.50,12098800,6.41 -1993-08-11,28.50,28.50,27.00,27.50,5965200,6.65 -1993-08-10,29.50,29.75,28.25,28.50,5465600,6.89 -1993-08-09,29.25,30.25,29.00,29.75,5767600,7.19 -1993-08-06,29.25,30.25,29.25,29.25,4506800,7.07 -1993-08-05,30.75,30.75,29.00,29.50,7498800,7.13 -1993-08-04,29.25,30.50,29.00,30.25,8700000,7.31 -1993-08-03,29.00,29.25,28.75,29.00,6315600,7.01 -1993-08-02,28.25,29.25,28.00,28.50,7728000,6.89 -1993-07-30,27.50,28.25,27.00,27.75,7669200,6.71 -1993-07-29,27.00,27.50,26.75,27.25,4343200,6.59 -1993-07-28,26.25,27.00,26.25,26.87,3300000,6.50 -1993-07-27,26.75,27.50,26.25,26.50,7100800,6.41 -1993-07-26,26.75,27.50,26.00,26.87,5468000,6.50 -1993-07-23,27.00,27.50,26.00,26.25,8365600,6.35 -1993-07-22,26.00,27.00,25.75,26.50,7554400,6.41 -1993-07-21,26.00,26.75,25.50,26.25,16283600,6.35 -1993-07-20,26.25,27.75,25.75,26.87,19017600,6.50 -1993-07-19,28.00,28.75,25.50,25.62,28813200,6.20 -1993-07-16,28.50,29.62,26.50,27.50,75744400,6.65 -1993-07-15,37.25,37.75,35.25,35.75,12091200,8.64 -1993-07-14,36.75,37.50,35.75,37.25,8816800,9.01 -1993-07-13,38.75,38.75,37.00,37.25,5650800,9.01 -1993-07-12,36.75,38.13,36.25,38.00,6215600,9.19 -1993-07-09,37.00,37.25,36.50,36.75,5604400,8.89 -1993-07-08,36.50,37.50,36.25,36.50,4964800,8.83 -1993-07-07,37.50,37.88,36.25,36.50,8124400,8.83 -1993-07-06,38.25,39.00,37.50,37.75,5558800,9.13 -1993-07-02,38.25,38.75,37.75,38.50,6846400,9.31 -1993-07-01,39.00,39.75,38.00,38.00,7809200,9.19 -1993-06-30,38.75,39.75,38.50,39.50,7170000,9.55 -1993-06-29,40.25,40.25,38.50,39.00,10526400,9.43 -1993-06-28,40.50,40.50,38.75,40.13,12645600,9.70 -1993-06-25,40.38,40.75,39.50,40.00,9198000,9.67 -1993-06-24,40.50,41.75,40.00,41.75,7980000,10.10 -1993-06-23,41.75,41.75,40.00,40.50,6462400,9.79 -1993-06-22,40.88,42.00,39.75,41.38,12021200,10.01 -1993-06-21,40.50,40.50,39.50,39.63,9776800,9.58 -1993-06-18,41.63,42.13,39.75,41.00,11138800,9.91 -1993-06-17,42.50,42.50,40.50,41.25,14635600,9.97 -1993-06-16,42.25,43.25,41.50,42.25,12615600,10.22 -1993-06-15,45.25,45.25,41.88,42.00,16018000,10.16 -1993-06-14,44.00,44.75,43.50,44.63,8927600,10.79 -1993-06-11,45.00,45.25,43.38,43.75,8662400,10.58 -1993-06-10,43.50,44.75,42.75,44.50,19783600,10.76 -1993-06-09,45.00,45.63,44.00,44.25,42090000,10.70 -1993-06-08,48.75,50.00,48.00,49.50,22194400,11.97 -1993-06-07,54.50,54.75,50.38,50.75,17239200,12.27 -1993-06-04,55.75,56.25,54.50,54.88,7649200,13.27 -1993-06-03,57.00,57.25,56.00,56.38,5603200,13.63 -1993-06-02,56.75,58.25,56.00,57.00,7160000,13.78 -1993-06-01,56.50,57.75,56.50,57.00,4837600,13.78 -1993-05-28,57.00,57.50,56.25,56.63,6575200,13.69 -1993-05-27,57.75,58.50,57.25,57.50,7049200,13.87 -1993-05-26,56.00,57.75,55.38,57.75,4353600,13.94 -1993-05-25,56.75,57.50,55.75,56.38,6462400,13.60 -1993-05-24,56.75,58.75,56.75,57.63,5373200,13.91 -1993-05-21,58.75,59.13,56.75,57.50,5300000,13.87 -1993-05-20,57.25,59.00,57.25,58.75,10385200,14.18 -1993-05-19,54.75,57.50,54.50,57.25,6176400,13.81 -1993-05-18,55.50,56.25,55.00,55.50,5860000,13.39 -1993-05-17,55.50,56.00,55.00,55.75,2491200,13.45 -1993-05-14,55.25,56.00,55.00,55.50,4212000,13.39 -1993-05-13,53.50,55.75,53.50,55.50,12940800,13.39 -1993-05-12,54.25,54.75,53.00,53.25,3779200,12.85 -1993-05-11,55.00,55.25,54.00,54.50,5665600,13.15 -1993-05-10,55.00,55.88,55.00,55.00,4929200,13.27 -1993-05-07,53.50,54.75,53.50,54.75,2927600,13.21 -1993-05-06,54.50,54.75,53.50,53.75,2536800,12.97 -1993-05-05,53.00,55.50,53.00,54.50,9059200,13.15 -1993-05-04,52.25,54.25,52.00,53.38,6112400,12.88 -1993-05-03,51.25,52.00,51.00,51.88,2332400,12.52 -1993-04-30,50.75,52.50,50.75,51.25,4730000,12.37 -1993-04-29,51.50,51.75,50.13,50.75,2958000,12.25 -1993-04-28,49.75,52.00,49.75,51.38,5846800,12.40 -1993-04-27,48.75,50.25,48.75,50.25,4648800,12.13 -1993-04-26,49.25,49.75,48.50,49.00,3689200,11.82 -1993-04-23,49.75,50.25,48.75,49.25,4808000,11.88 -1993-04-22,49.25,50.50,49.00,50.00,5648800,12.06 -1993-04-21,50.25,50.75,49.25,49.63,7337600,11.98 -1993-04-20,48.75,50.25,48.25,50.00,8580800,12.06 -1993-04-19,48.50,49.50,48.25,48.50,8148000,11.70 -1993-04-16,48.25,48.75,47.38,48.13,24533200,11.61 -1993-04-15,48.25,48.25,46.75,47.25,7816800,11.40 -1993-04-14,48.25,48.75,47.63,48.75,6092400,11.76 -1993-04-13,50.50,51.25,48.25,48.50,5893600,11.70 -1993-04-12,49.50,51.00,49.50,50.00,3324800,12.06 -1993-04-08,50.00,50.50,49.00,49.75,5857600,12.00 -1993-04-07,49.00,50.75,48.50,50.50,5825200,12.19 -1993-04-06,50.00,50.25,48.75,48.75,6020800,11.76 -1993-04-05,50.00,50.50,49.50,50.00,5332000,12.06 -1993-04-02,50.50,51.25,49.50,50.13,9077600,12.10 -1993-04-01,51.25,52.00,51.00,51.75,3878000,12.49 -1993-03-31,52.50,52.75,51.25,51.50,7968800,12.43 -1993-03-30,51.13,52.25,50.25,52.25,9447600,12.61 -1993-03-29,52.25,52.50,50.75,51.00,9362000,12.31 -1993-03-26,54.75,54.75,52.50,53.25,5431200,12.85 -1993-03-25,53.75,54.75,53.50,54.75,6125200,13.21 -1993-03-24,52.75,54.25,52.50,53.75,5126400,12.97 -1993-03-23,53.25,54.00,52.63,52.75,3674400,12.73 -1993-03-22,53.50,53.88,52.75,53.25,5911200,12.85 -1993-03-19,55.00,55.25,53.50,53.75,5516800,12.97 -1993-03-18,55.00,55.63,54.50,54.50,3810800,13.15 -1993-03-17,56.50,57.00,55.00,55.13,6301200,13.30 -1993-03-16,57.25,57.75,56.50,56.50,3626800,13.63 -1993-03-15,56.00,57.25,55.38,57.00,4868800,13.75 -1993-03-12,56.75,56.75,55.50,56.25,4527600,13.57 -1993-03-11,57.00,57.25,56.25,56.88,5167600,13.73 -1993-03-10,56.75,57.25,56.00,56.75,4738800,13.69 -1993-03-09,56.50,57.50,56.50,56.75,5535200,13.69 -1993-03-08,55.00,56.75,55.00,56.50,6322400,13.63 -1993-03-05,54.75,55.75,54.75,55.00,4001200,13.27 -1993-03-04,54.50,55.25,53.50,55.00,6730000,13.27 -1993-03-03,54.00,55.00,53.25,54.63,7261200,13.18 -1993-03-02,53.00,54.50,53.00,54.25,5294400,13.09 -1993-03-01,53.00,53.50,52.75,53.25,4272400,12.85 -1993-02-26,54.25,54.25,52.25,53.00,10538000,12.79 -1993-02-25,53.25,54.75,53.25,54.75,5979200,13.21 -1993-02-24,52.13,53.88,52.13,53.63,10253600,12.94 -1993-02-23,55.00,55.25,54.00,54.25,6937600,13.09 -1993-02-22,55.00,56.00,54.75,55.13,3531200,13.30 -1993-02-19,55.25,55.50,54.75,55.00,6366800,13.27 -1993-02-18,55.00,55.25,53.50,55.00,10006800,13.27 -1993-02-17,53.25,54.00,52.00,53.88,8932400,13.00 -1993-02-16,53.50,53.50,51.50,53.00,14563200,12.79 -1993-02-12,55.00,55.50,53.75,53.88,9855600,13.00 -1993-02-11,55.75,56.25,55.00,55.13,6015200,13.27 -1993-02-10,57.00,57.25,55.00,55.75,9593600,13.42 -1993-02-09,57.00,57.38,56.50,56.88,8525600,13.70 -1993-02-08,57.00,57.50,55.50,56.50,10060000,13.60 -1993-02-05,59.25,59.50,56.25,57.25,13134400,13.78 -1993-02-04,60.00,60.25,59.00,59.50,7453200,14.33 -1993-02-03,61.00,61.00,58.50,60.00,9455200,14.45 -1993-02-02,60.75,61.50,60.25,60.25,6530000,14.51 -1993-02-01,59.25,61.25,59.25,61.25,8608800,14.75 -1993-01-29,60.25,61.25,59.00,59.50,9516800,14.33 -1993-01-28,60.00,60.25,59.25,59.88,6580000,14.42 -1993-01-27,61.00,61.75,58.75,60.25,8101200,14.51 -1993-01-26,60.50,62.00,60.50,60.75,10201200,14.63 -1993-01-25,59.25,60.50,59.25,60.00,7237600,14.45 -1993-01-22,60.25,60.25,59.00,59.50,5252400,14.33 -1993-01-21,59.75,60.25,58.75,60.00,6601200,14.45 -1993-01-20,59.75,60.25,59.50,60.00,5685600,14.45 -1993-01-19,59.75,60.50,59.25,59.75,9802400,14.39 -1993-01-18,59.50,60.00,58.00,59.50,11935600,14.33 -1993-01-15,61.00,62.25,60.00,60.25,32257600,14.51 -1993-01-14,64.00,65.25,63.75,65.00,13145200,15.65 -1993-01-13,61.50,64.00,61.25,63.50,7135600,15.29 -1993-01-12,62.75,63.75,61.50,61.50,12364400,14.81 -1993-01-11,62.00,64.37,61.75,64.12,9785200,15.44 -1993-01-08,60.75,63.00,59.75,62.25,11474400,14.99 -1993-01-07,61.75,62.50,60.63,61.00,9741200,14.69 -1993-01-06,60.75,62.00,60.50,61.75,10055600,14.87 -1993-01-05,58.00,59.25,57.25,59.25,6658800,14.27 -1993-01-04,59.50,60.00,57.75,58.25,4618800,14.03 -1992-12-31,58.75,60.00,58.75,59.75,3302000,14.39 -1992-12-30,59.75,59.75,58.75,58.75,3610800,14.15 -1992-12-29,59.50,60.75,59.50,59.63,4171200,14.36 -1992-12-28,59.25,59.75,59.25,59.50,2536400,14.33 -1992-12-24,60.00,60.00,59.00,59.00,1642400,14.21 -1992-12-23,60.25,60.50,59.25,59.75,4018800,14.39 -1992-12-22,59.75,61.25,59.75,60.63,10009200,14.60 -1992-12-21,58.25,60.00,58.00,59.63,9159200,14.36 -1992-12-18,57.50,59.25,57.25,58.25,8414400,14.03 -1992-12-17,55.25,57.50,55.25,56.88,8370800,13.70 -1992-12-16,56.25,57.00,54.50,55.00,8085200,13.24 -1992-12-15,56.75,57.00,55.50,56.38,6541200,13.57 -1992-12-14,57.50,57.75,56.75,57.25,3962000,13.78 -1992-12-11,57.25,58.25,57.25,57.50,4299200,13.84 -1992-12-10,57.25,57.63,56.50,57.25,5010800,13.78 -1992-12-09,57.75,58.00,57.25,57.63,5700800,13.88 -1992-12-08,57.75,58.75,57.75,58.13,7035600,14.00 -1992-12-07,56.75,57.75,56.75,57.75,5168000,13.90 -1992-12-04,57.25,57.50,56.50,56.88,3432400,13.70 -1992-12-03,56.50,57.63,56.13,57.50,6710800,13.84 -1992-12-02,58.25,58.50,57.00,57.25,3498800,13.78 -1992-12-01,57.25,59.00,56.75,58.25,4652400,14.03 -1992-11-30,56.25,57.50,55.63,57.50,5739200,13.84 -1992-11-27,56.50,57.25,56.25,56.50,1688800,13.57 -1992-11-25,57.00,57.25,56.00,56.50,4208000,13.57 -1992-11-24,57.00,57.50,56.50,57.50,5601200,13.82 -1992-11-23,56.50,57.00,56.25,56.75,5462400,13.63 -1992-11-20,58.50,58.75,57.00,57.50,5572000,13.82 -1992-11-19,57.75,59.50,57.75,58.25,8608000,14.00 -1992-11-18,56.00,58.25,55.50,57.75,10889200,13.88 -1992-11-17,57.25,57.50,54.88,55.25,6045200,13.27 -1992-11-16,56.25,57.75,56.00,57.38,2419200,13.79 -1992-11-13,57.00,57.25,56.00,56.25,3042000,13.51 -1992-11-12,57.00,57.50,56.38,56.88,3844400,13.67 -1992-11-11,56.50,58.25,56.25,56.75,5023600,13.63 -1992-11-10,55.00,56.50,54.75,56.25,4368000,13.51 -1992-11-09,56.00,56.00,54.75,55.25,4052000,13.27 -1992-11-06,54.75,56.50,54.75,55.75,9443200,13.39 -1992-11-05,52.50,55.00,52.50,55.00,10647600,13.21 -1992-11-04,52.00,52.75,52.00,52.50,5086800,12.61 -1992-11-03,52.50,52.50,51.50,52.00,4042000,12.49 -1992-11-02,52.50,52.75,51.75,52.25,6094400,12.55 -1992-10-30,53.50,53.50,52.00,52.50,4657600,12.61 -1992-10-29,52.25,54.00,51.50,53.25,7661200,12.79 -1992-10-28,51.25,52.75,50.75,52.25,7033200,12.55 -1992-10-27,51.50,52.50,51.00,51.50,7575600,12.37 -1992-10-26,48.75,51.50,48.50,51.50,8972000,12.37 -1992-10-23,49.25,49.50,48.25,48.75,3279200,11.71 -1992-10-22,48.50,49.25,48.25,48.75,3026400,11.71 -1992-10-21,49.25,49.50,48.00,48.50,4080800,11.65 -1992-10-20,49.00,50.00,48.50,49.13,10269200,11.80 -1992-10-19,49.00,49.25,48.50,49.00,7002400,11.77 -1992-10-16,46.75,49.50,46.50,49.00,16142000,11.77 -1992-10-15,45.75,46.00,45.25,45.50,2701200,10.93 -1992-10-14,45.25,46.25,45.00,46.00,3429200,11.05 -1992-10-13,44.75,46.00,44.00,45.38,5265600,10.90 -1992-10-12,43.25,44.25,43.25,44.00,2580000,10.57 -1992-10-09,43.50,44.00,43.00,43.38,2108000,10.42 -1992-10-08,44.00,44.25,43.00,43.50,4543200,10.45 -1992-10-07,45.00,45.25,43.50,43.75,4050800,10.51 -1992-10-06,43.75,45.00,42.75,44.75,4058000,10.75 -1992-10-05,43.25,43.75,41.50,43.50,9475600,10.45 -1992-10-02,44.50,44.75,43.00,43.75,4063600,10.51 -1992-10-01,44.75,45.13,44.25,44.25,4396400,10.63 -1992-09-30,45.00,45.50,44.50,45.13,3580800,10.84 -1992-09-29,44.50,45.50,44.00,44.88,5626400,10.78 -1992-09-28,45.00,45.00,43.75,44.75,5351200,10.75 -1992-09-25,46.25,46.50,45.25,45.50,4926400,10.93 -1992-09-24,47.25,47.75,46.25,46.25,4492000,11.11 -1992-09-23,46.00,47.50,45.50,47.50,4443200,11.41 -1992-09-22,46.75,46.75,45.25,45.75,3996800,10.99 -1992-09-21,46.75,47.75,46.25,46.50,3204400,11.17 -1992-09-18,45.75,46.88,45.25,46.50,4133600,11.17 -1992-09-17,47.25,47.25,45.38,46.00,6180000,11.05 -1992-09-16,47.75,48.25,46.50,47.00,6395600,11.29 -1992-09-15,49.25,49.25,47.75,48.25,7806800,11.59 -1992-09-14,49.00,50.00,48.50,49.50,7682400,11.89 -1992-09-11,49.00,49.25,47.50,47.63,6438000,11.44 -1992-09-10,48.00,49.50,47.50,49.25,8165600,11.83 -1992-09-09,48.00,49.25,47.75,49.00,5622400,11.77 -1992-09-08,46.75,48.00,46.50,47.75,2511200,11.47 -1992-09-04,48.25,48.25,46.75,47.25,2268800,11.35 -1992-09-03,49.00,49.25,47.75,47.75,7570000,11.47 -1992-09-02,46.50,48.75,46.50,48.50,6794400,11.65 -1992-09-01,46.25,46.50,45.75,46.50,2172000,11.17 -1992-08-31,45.00,46.25,44.75,46.00,4328800,11.05 -1992-08-28,44.25,45.25,44.00,45.00,2202400,10.81 -1992-08-27,44.75,45.13,44.25,44.50,2974800,10.69 -1992-08-26,44.25,44.50,43.25,44.25,4325600,10.63 -1992-08-25,43.25,44.50,43.25,44.38,4731200,10.66 -1992-08-24,44.25,44.75,43.25,43.25,5454400,10.39 -1992-08-21,44.75,45.25,44.00,44.63,3926400,10.72 -1992-08-20,44.75,45.00,44.25,44.75,3894800,10.75 -1992-08-19,44.63,45.25,44.50,44.50,6096800,10.69 -1992-08-18,44.50,45.25,44.50,44.75,4017600,10.75 -1992-08-17,44.25,44.75,43.75,44.75,4617600,10.75 -1992-08-14,45.00,45.25,44.50,44.75,4872400,10.72 -1992-08-13,44.50,45.50,44.25,44.75,6122000,10.72 -1992-08-12,43.75,44.25,43.25,44.13,4343600,10.57 -1992-08-11,44.50,44.50,43.00,43.50,4339200,10.42 -1992-08-10,43.25,44.50,43.00,44.13,3280800,10.57 -1992-08-07,42.00,43.75,41.50,43.38,7842400,10.39 -1992-08-06,44.25,44.50,42.75,44.00,9220800,10.54 -1992-08-05,45.50,45.50,44.50,44.75,4981200,10.72 -1992-08-04,45.00,45.75,44.75,45.50,4295600,10.90 -1992-08-03,46.75,47.25,45.50,45.75,2452400,10.96 -1992-07-31,47.25,47.50,46.75,46.75,3262000,11.20 -1992-07-30,47.25,47.50,46.75,47.25,4927600,11.32 -1992-07-29,46.63,47.75,46.50,47.25,8976400,11.32 -1992-07-28,45.50,46.50,45.25,46.50,4813600,11.14 -1992-07-27,45.75,46.50,45.25,45.25,88800,10.84 -1992-07-24,44.50,46.25,44.00,45.88,4832000,10.99 -1992-07-23,44.50,44.75,43.75,44.75,6128800,10.72 -1992-07-22,45.25,45.50,44.00,44.25,5798800,10.60 -1992-07-21,45.50,46.25,45.00,45.75,4730800,10.96 -1992-07-20,44.75,45.25,44.00,44.75,6873600,10.72 -1992-07-17,45.00,46.00,44.63,45.00,15135600,10.78 -1992-07-16,47.75,49.00,47.25,48.75,5011200,11.68 -1992-07-15,47.50,49.00,47.25,48.00,6248000,11.50 -1992-07-14,47.00,48.00,47.00,47.50,4510800,11.38 -1992-07-13,45.75,47.13,45.25,47.00,4486800,11.26 -1992-07-10,46.00,46.25,44.88,45.75,5144400,10.96 -1992-07-09,46.00,46.50,45.75,45.88,5922000,10.99 -1992-07-08,44.00,45.75,44.00,45.75,7020000,10.96 -1992-07-07,46.25,46.25,43.50,44.25,7416400,10.60 -1992-07-06,46.50,46.75,45.50,46.25,4378000,11.08 -1992-07-02,49.00,49.00,45.75,46.25,9169200,11.08 -1992-07-01,48.00,49.50,47.75,49.00,5129200,11.74 -1992-06-30,46.75,48.25,46.50,48.00,6919200,11.50 -1992-06-29,45.75,47.13,45.25,46.75,6735200,11.20 -1992-06-26,45.75,46.00,44.50,45.25,3953600,10.84 -1992-06-25,46.50,46.50,45.25,45.63,5745200,10.93 -1992-06-24,45.50,46.00,45.25,46.00,7548000,11.02 -1992-06-23,45.00,45.50,44.50,45.25,11130800,10.84 -1992-06-22,44.00,44.75,42.75,44.25,13930000,10.60 -1992-06-19,46.00,46.00,43.75,44.75,15280000,10.72 -1992-06-18,47.50,49.00,44.75,45.25,15495600,10.84 -1992-06-17,49.00,49.25,47.00,47.50,10880800,11.38 -1992-06-16,51.75,52.00,48.75,49.25,13053200,11.80 -1992-06-15,54.00,54.00,52.50,52.63,6777600,12.61 -1992-06-12,54.50,55.00,54.25,54.63,3450800,13.09 -1992-06-11,53.75,54.25,53.50,53.88,5028800,12.91 -1992-06-10,54.00,54.75,53.50,53.75,4522400,12.88 -1992-06-09,54.25,54.25,53.50,54.00,3626800,12.94 -1992-06-08,55.00,55.00,54.00,54.25,3730000,13.00 -1992-06-05,54.75,55.25,54.25,54.88,4040800,13.15 -1992-06-04,54.25,54.75,53.50,54.50,6453200,13.06 -1992-06-03,56.50,56.50,54.00,54.13,10743200,12.97 -1992-06-02,57.50,57.50,56.25,56.50,5560000,13.54 -1992-06-01,57.25,59.50,56.00,57.50,8869200,13.78 -1992-05-29,59.75,60.63,59.50,59.75,6369200,14.29 -1992-05-28,60.00,60.25,59.00,59.50,4558000,14.23 -1992-05-27,59.25,60.25,59.00,60.25,5516400,14.41 -1992-05-26,59.50,59.75,58.75,59.25,3423200,14.17 -1992-05-22,59.00,59.75,59.00,59.50,1670800,14.23 -1992-05-21,60.25,60.25,58.75,59.13,4938800,14.14 -1992-05-20,59.75,60.25,59.25,60.00,6200800,14.35 -1992-05-19,60.75,60.75,59.00,59.38,4715600,14.20 -1992-05-18,61.50,61.50,60.00,60.38,4616400,14.44 -1992-05-15,61.00,61.25,60.50,60.63,4339200,14.50 -1992-05-14,62.75,63.00,60.25,61.38,5606800,14.68 -1992-05-13,62.50,63.25,62.25,62.75,3482000,15.01 -1992-05-12,62.25,63.00,61.75,62.25,2769200,14.89 -1992-05-11,62.00,62.75,61.50,62.25,3250000,14.89 -1992-05-08,61.50,62.88,61.00,62.00,7105600,14.83 -1992-05-07,61.50,62.25,60.50,60.75,6175600,14.53 -1992-05-06,60.75,62.13,60.50,61.75,6377600,14.77 -1992-05-05,60.50,60.63,59.50,60.50,6449200,14.47 -1992-05-04,59.50,61.25,59.25,60.50,4402000,14.47 -1992-05-01,60.00,60.75,58.25,59.25,4821200,14.17 -1992-04-30,57.25,60.25,56.50,60.13,9303600,14.38 -1992-04-29,54.25,57.00,54.25,57.00,7116800,13.63 -1992-04-28,55.25,55.75,53.00,54.25,6229200,12.97 -1992-04-27,56.00,56.25,55.00,55.75,5014800,13.33 -1992-04-24,57.00,58.25,56.00,56.50,3526800,13.51 -1992-04-23,57.50,58.25,56.00,57.00,6534400,13.63 -1992-04-22,56.25,58.00,56.25,57.63,6129200,13.78 -1992-04-21,57.00,57.25,56.00,56.25,6442400,13.45 -1992-04-20,59.00,59.00,56.00,56.75,7380800,13.57 -1992-04-16,60.25,60.75,58.50,59.00,9260800,14.11 -1992-04-15,58.00,60.88,57.50,60.50,7764400,14.47 -1992-04-14,57.75,59.25,57.25,58.75,5178000,14.05 -1992-04-13,55.50,56.75,55.25,56.50,4402000,13.51 -1992-04-10,57.25,57.50,55.00,55.50,9803600,13.27 -1992-04-09,56.00,58.25,55.25,57.25,6874400,13.69 -1992-04-08,57.00,57.00,54.75,55.88,13123600,13.36 -1992-04-07,61.00,61.25,57.25,57.25,8234400,13.69 -1992-04-06,59.00,61.00,59.00,60.75,3643600,14.53 -1992-04-03,58.75,59.25,58.50,59.00,4181200,14.11 -1992-04-02,59.00,59.50,58.38,58.75,4798800,14.05 -1992-04-01,57.25,59.25,57.25,59.00,5714400,14.11 -1992-03-31,58.25,59.75,58.00,58.25,7613200,13.93 -1992-03-30,61.25,61.25,57.75,58.13,12124400,13.90 -1992-03-27,63.88,64.00,60.50,61.00,9452000,14.59 -1992-03-26,64.75,65.25,63.75,64.00,4412400,15.30 -1992-03-25,65.00,65.00,64.25,64.50,4353200,15.42 -1992-03-24,63.50,65.00,63.25,65.00,7501200,15.54 -1992-03-23,63.00,63.75,63.00,63.00,1804400,15.07 -1992-03-20,63.00,63.25,63.00,63.25,1942400,15.13 -1992-03-19,63.75,63.75,62.75,63.00,4251200,15.07 -1992-03-18,63.25,64.00,63.00,63.75,2902000,15.25 -1992-03-17,63.50,63.75,62.75,62.88,3061200,15.04 -1992-03-16,62.75,63.50,61.75,63.38,2016400,15.16 -1992-03-13,63.25,63.75,62.00,63.13,2843600,15.10 -1992-03-12,63.25,63.75,61.50,62.75,5472400,15.01 -1992-03-11,63.75,64.25,63.00,63.25,4714400,15.13 -1992-03-10,64.00,64.75,63.75,63.75,4394400,15.25 -1992-03-09,63.75,64.25,63.50,63.75,3896800,15.25 -1992-03-06,63.50,64.00,63.00,64.00,4816400,15.30 -1992-03-05,64.50,65.50,63.00,63.50,8462400,15.19 -1992-03-04,66.25,66.75,64.75,65.00,4120800,15.54 -1992-03-03,67.75,68.00,66.25,66.37,3560000,15.87 -1992-03-02,67.75,68.50,67.25,67.25,3203200,16.08 -1992-02-28,68.50,69.00,67.00,67.50,3244400,16.14 -1992-02-27,70.00,70.00,68.00,68.50,4364800,16.38 -1992-02-26,68.25,70.00,68.25,69.87,8193600,16.71 -1992-02-25,66.25,68.50,65.25,68.50,8134400,16.38 -1992-02-24,66.25,66.50,65.75,66.12,6122400,15.81 -1992-02-21,64.75,65.50,64.50,65.00,5421200,15.54 -1992-02-20,62.50,64.75,62.25,64.62,4692400,15.45 -1992-02-19,62.75,63.00,61.75,62.00,3426400,14.83 -1992-02-18,64.25,64.50,62.75,62.75,2442000,15.01 -1992-02-14,63.75,64.25,63.25,64.12,2610800,15.33 -1992-02-13,65.25,65.25,63.75,64.25,2734400,15.34 -1992-02-12,63.75,65.50,63.00,65.25,4931200,15.57 -1992-02-11,63.00,63.75,62.25,62.88,4378800,15.01 -1992-02-10,64.00,64.25,63.00,63.13,3091200,15.07 -1992-02-07,64.25,64.75,62.75,64.00,5285600,15.28 -1992-02-06,65.75,66.00,64.00,64.12,3330000,15.30 -1992-02-05,66.25,66.75,65.12,66.12,5772400,15.78 -1992-02-04,65.75,66.25,65.00,65.75,6896400,15.69 -1992-02-03,64.75,66.25,64.50,65.75,5652000,15.69 -1992-01-31,64.00,65.25,63.50,64.75,5164400,15.46 -1992-01-30,63.50,63.75,62.75,63.75,3128800,15.22 -1992-01-29,64.75,65.75,63.25,63.25,5164400,15.10 -1992-01-28,64.75,65.37,63.00,65.25,6206800,15.57 -1992-01-27,64.75,65.25,64.25,64.50,2992000,15.40 -1992-01-24,64.50,65.75,64.00,64.62,6356400,15.42 -1992-01-23,64.25,64.75,63.00,64.50,4953200,15.40 -1992-01-22,61.50,63.75,61.25,63.50,6560000,15.16 -1992-01-21,64.25,64.25,61.00,61.13,6938000,14.59 -1992-01-20,64.50,65.25,64.00,64.00,7492400,15.28 -1992-01-17,67.75,69.00,64.75,64.75,30308800,15.46 -1992-01-16,63.75,64.25,62.50,62.75,10485200,14.98 -1992-01-15,64.50,65.00,63.00,63.50,11652400,15.16 -1992-01-14,62.25,64.75,62.25,64.50,9789200,15.40 -1992-01-13,62.25,62.75,61.50,62.00,3858800,14.80 -1992-01-10,61.50,62.50,61.00,62.25,7012400,14.86 -1992-01-09,60.50,62.25,60.25,62.25,7450800,14.86 -1992-01-08,58.50,61.25,58.50,60.50,8330800,14.44 -1992-01-07,57.50,59.50,57.50,59.13,5059200,14.11 -1992-01-06,58.75,59.00,57.75,58.00,4080000,13.84 -1992-01-03,60.00,60.25,58.25,59.00,6814400,14.08 -1992-01-02,55.75,59.75,55.50,59.50,8357600,14.20 -1991-12-31,57.38,58.00,56.00,56.38,4802000,13.46 -1991-12-30,55.00,57.25,55.00,56.75,6580800,13.55 -1991-12-27,54.75,55.75,54.50,55.00,6008000,13.13 -1991-12-26,52.75,55.00,52.25,54.88,4805600,13.10 -1991-12-24,52.00,53.75,51.75,52.25,6742400,12.47 -1991-12-23,50.50,51.75,50.00,51.50,3686800,12.29 -1991-12-20,51.25,51.50,50.25,50.25,4588000,11.99 -1991-12-19,51.25,51.75,50.75,50.75,4140800,12.11 -1991-12-18,50.25,52.00,50.00,51.75,6678000,12.35 -1991-12-17,50.50,51.00,50.25,50.50,3502400,12.05 -1991-12-16,50.38,50.75,50.00,50.50,2777600,12.05 -1991-12-13,49.75,50.75,49.75,50.38,3418000,12.03 -1991-12-12,49.38,49.75,49.00,49.38,3297600,11.79 -1991-12-11,49.25,49.75,48.50,49.00,3031200,11.70 -1991-12-10,49.00,49.50,48.50,49.13,4390000,11.73 -1991-12-09,49.00,50.00,48.75,49.13,3502000,11.73 -1991-12-06,49.50,49.75,48.50,48.75,7055200,11.64 -1991-12-05,50.50,51.00,49.25,50.00,3555600,11.93 -1991-12-04,50.75,50.75,50.00,50.50,2897600,12.05 -1991-12-03,52.00,52.00,50.25,50.50,3692400,12.05 -1991-12-02,50.75,52.00,50.00,51.75,4250000,12.35 -1991-11-29,50.50,51.50,50.50,50.75,1227600,12.11 -1991-11-27,51.25,51.50,50.50,51.00,2268800,12.17 -1991-11-26,51.50,52.00,50.00,51.50,4982000,12.29 -1991-11-25,51.00,52.25,51.00,51.25,2802000,12.23 -1991-11-22,51.00,51.75,50.25,51.25,3502400,12.23 -1991-11-21,50.50,51.75,50.50,51.00,3823200,12.17 -1991-11-20,51.25,52.00,50.25,50.50,6005600,12.05 -1991-11-19,51.75,51.75,49.75,51.25,10216400,12.23 -1991-11-18,50.00,52.50,50.00,52.13,8530000,12.44 -1991-11-15,54.50,54.75,49.75,50.00,9186400,11.91 -1991-11-14,54.25,55.25,54.00,54.75,6733600,13.04 -1991-11-13,54.00,54.50,53.50,54.13,6640000,12.89 -1991-11-12,54.25,54.75,53.75,54.50,5972000,12.98 -1991-11-11,53.50,54.50,53.25,53.75,5896800,12.80 -1991-11-08,51.25,53.75,51.00,53.25,13435200,12.68 -1991-11-07,48.50,50.50,48.25,49.75,10618800,11.85 -1991-11-06,49.00,49.25,47.50,48.00,8466400,11.43 -1991-11-05,49.75,50.50,48.75,48.75,7711200,11.61 -1991-11-04,50.75,50.75,48.50,49.75,6983200,11.85 -1991-11-01,51.25,52.00,50.50,51.00,7203600,12.14 -1991-10-31,50.75,51.75,50.00,51.50,8300800,12.26 -1991-10-30,52.00,52.75,49.50,49.75,5302400,11.85 -1991-10-29,51.50,52.00,50.75,51.75,3624400,12.32 -1991-10-28,51.50,51.75,50.75,51.50,2792400,12.26 -1991-10-25,51.75,52.25,50.75,51.25,3832000,12.20 -1991-10-24,53.00,53.25,51.50,52.13,6372400,12.41 -1991-10-23,55.00,55.25,52.75,53.13,6046400,12.65 -1991-10-22,55.50,56.25,54.50,54.50,7456400,12.98 -1991-10-21,55.25,55.88,54.25,54.75,4172000,13.04 -1991-10-18,55.13,55.50,54.50,55.00,15964400,13.10 -1991-10-17,53.00,53.25,51.50,52.38,5423200,12.47 -1991-10-16,52.50,54.00,52.25,53.50,7182000,12.74 -1991-10-15,50.50,52.50,50.00,52.50,10300800,12.50 -1991-10-14,49.00,50.25,48.75,49.88,4015600,11.88 -1991-10-11,48.13,48.88,46.50,48.50,4292000,11.55 -1991-10-10,48.75,49.00,46.75,47.75,5623200,11.37 -1991-10-09,48.25,48.75,47.75,48.00,4752400,11.43 -1991-10-08,48.13,48.50,46.50,48.25,6170000,11.49 -1991-10-07,48.00,48.75,47.50,48.13,2328000,11.46 -1991-10-04,48.00,48.75,47.50,48.25,2854400,11.49 -1991-10-03,50.00,50.00,47.50,47.75,6478000,11.37 -1991-10-02,51.75,51.75,49.50,49.75,643600,11.85 -1991-10-01,49.25,51.25,49.00,50.75,4698800,12.08 -1991-09-30,49.25,49.75,49.00,49.50,2266800,11.79 -1991-09-27,50.00,50.75,48.75,49.00,2245200,11.67 -1991-09-26,50.25,50.25,49.00,50.00,2556800,11.91 -1991-09-25,50.25,50.50,49.25,50.50,1959200,12.02 -1991-09-24,49.50,50.38,48.25,50.25,3805600,11.97 -1991-09-23,50.00,50.75,49.25,49.50,3136800,11.79 -1991-09-20,49.75,51.00,49.50,50.63,6742000,12.06 -1991-09-19,50.25,50.50,49.50,49.75,6374400,11.85 -1991-09-18,48.75,50.50,48.50,50.13,4342000,11.94 -1991-09-17,47.00,49.00,46.75,49.00,4856400,11.67 -1991-09-16,49.25,49.25,46.50,47.25,7365600,11.25 -1991-09-13,50.00,50.25,48.50,48.63,5974400,11.58 -1991-09-12,51.25,51.25,49.75,50.63,4267600,12.06 -1991-09-11,50.75,51.00,49.50,50.50,6378000,12.02 -1991-09-10,52.75,53.38,49.75,50.13,6535600,11.94 -1991-09-09,51.75,53.50,51.50,53.25,4538000,12.68 -1991-09-06,51.00,51.75,50.50,51.50,2848800,12.26 -1991-09-05,51.50,51.75,50.75,51.00,2793600,12.14 -1991-09-04,52.75,52.75,51.38,51.50,4299200,12.26 -1991-09-03,52.75,53.25,52.00,52.50,2443200,12.50 -1991-08-30,53.00,53.25,52.25,53.00,2363200,12.62 -1991-08-29,53.25,53.88,52.50,53.00,4053200,12.62 -1991-08-28,54.00,54.25,53.13,53.25,3843600,12.68 -1991-08-27,53.00,54.00,52.75,54.00,3597600,12.86 -1991-08-26,53.00,53.50,52.50,53.00,3644400,12.62 -1991-08-23,54.00,55.50,52.75,53.00,8601200,12.62 -1991-08-22,54.00,54.75,53.75,54.25,5936400,12.92 -1991-08-21,52.50,54.13,52.00,53.75,7987600,12.80 -1991-08-20,51.50,51.75,50.50,51.00,7123600,12.14 -1991-08-19,49.50,51.63,48.50,50.50,11538000,12.02 -1991-08-16,52.75,54.25,52.25,53.25,5689200,12.65 -1991-08-15,55.00,55.00,53.00,53.25,5219200,12.65 -1991-08-14,54.75,55.00,53.88,54.88,7173200,13.04 -1991-08-13,52.00,54.00,52.00,53.50,10255200,12.71 -1991-08-12,50.75,52.25,50.50,51.75,5096400,12.29 -1991-08-09,50.50,51.00,49.75,50.75,5533600,12.06 -1991-08-08,50.75,51.75,50.00,50.50,6769200,12.00 -1991-08-07,49.50,51.00,49.38,50.38,7578800,11.97 -1991-08-06,48.75,50.25,47.75,49.50,7890800,11.76 -1991-08-05,49.75,49.75,48.25,48.50,3620800,11.52 -1991-08-02,49.75,50.25,49.00,50.00,9767600,11.88 -1991-08-01,46.00,49.25,45.75,49.13,16023600,11.67 -1991-07-31,46.50,46.88,45.00,46.25,3689200,10.99 -1991-07-30,45.50,46.75,45.50,46.50,3281200,11.05 -1991-07-29,45.25,45.50,44.50,45.50,1916800,10.81 -1991-07-26,45.75,45.75,44.75,44.88,2657600,10.66 -1991-07-25,45.25,45.75,45.00,45.25,2366800,10.75 -1991-07-24,45.25,45.75,44.50,45.00,4703200,10.69 -1991-07-23,46.25,46.50,44.50,45.00,4770000,10.69 -1991-07-22,45.75,46.25,45.50,46.00,3882000,10.93 -1991-07-19,45.25,46.25,45.00,46.00,4601200,10.93 -1991-07-18,44.00,45.13,43.00,44.88,14240000,10.66 -1991-07-17,43.50,44.50,42.25,42.50,7474400,10.10 -1991-07-16,45.50,45.75,43.50,43.75,7966400,10.39 -1991-07-15,46.75,46.75,45.50,45.50,4932400,10.81 -1991-07-12,47.25,47.25,46.25,46.75,4753200,11.11 -1991-07-11,47.00,47.25,46.00,46.75,5217600,11.11 -1991-07-10,47.50,48.25,46.75,47.25,5610000,11.23 -1991-07-09,47.25,48.25,46.50,46.88,8091200,11.14 -1991-07-08,45.25,47.25,45.00,46.75,10971200,11.11 -1991-07-05,43.00,46.00,42.75,45.63,11842000,10.84 -1991-07-03,42.25,43.50,41.75,43.13,11087600,10.25 -1991-07-02,42.25,42.75,41.75,42.25,4296800,10.04 -1991-07-01,42.25,43.00,41.75,42.50,6979200,10.10 -1991-06-28,42.25,42.50,40.25,41.50,8102400,9.86 -1991-06-27,42.50,42.75,41.75,42.50,5400000,10.10 -1991-06-26,42.75,43.50,42.25,43.00,8958000,10.22 -1991-06-25,42.00,43.00,41.75,42.38,8151200,10.07 -1991-06-24,41.75,42.25,41.25,41.75,7443600,9.92 -1991-06-21,42.00,42.50,41.75,42.00,7378800,9.98 -1991-06-20,41.25,42.00,40.75,42.00,5158000,9.98 -1991-06-19,41.75,42.25,41.25,41.75,6408000,9.92 -1991-06-18,42.25,43.25,41.50,42.13,8749200,10.01 -1991-06-17,41.00,42.25,41.00,42.00,5966800,9.98 -1991-06-14,42.75,42.75,40.75,41.13,8049200,9.77 -1991-06-13,42.50,43.00,41.75,42.13,7565200,10.01 -1991-06-12,44.00,44.75,41.25,42.38,15580000,10.07 -1991-06-11,45.00,45.50,44.25,44.63,6742400,10.60 -1991-06-10,46.00,47.13,45.75,46.00,5991200,10.93 -1991-06-07,46.25,47.00,45.63,46.13,5463600,10.96 -1991-06-06,48.25,48.25,46.50,46.63,6028000,11.08 -1991-06-05,49.25,49.25,47.75,48.00,4760800,11.40 -1991-06-04,49.50,49.50,48.50,49.13,6593600,11.67 -1991-06-03,47.00,49.50,46.75,49.25,7870800,11.70 -1991-05-31,47.50,47.75,46.25,47.00,7792400,11.17 -1991-05-30,47.00,47.75,46.50,47.63,5663600,11.32 -1991-05-29,46.25,47.75,45.88,47.00,13733600,11.17 -1991-05-28,46.00,46.25,45.25,46.00,6124400,10.93 -1991-05-24,45.50,46.00,45.00,45.88,3484800,10.90 -1991-05-23,46.50,46.75,44.75,45.13,7458800,10.72 -1991-05-22,45.75,46.50,45.50,46.25,8137600,10.99 -1991-05-21,45.25,46.50,44.75,45.25,12500000,10.75 -1991-05-20,47.25,47.50,44.00,44.25,9365200,10.51 -1991-05-17,48.75,48.75,46.50,47.00,16836800,11.14 -1991-05-16,51.00,51.25,48.50,49.00,13652000,11.61 -1991-05-15,51.50,52.00,49.00,50.50,18530800,11.97 -1991-05-14,52.75,53.75,52.50,53.50,7763600,12.68 -1991-05-13,52.25,53.50,51.50,52.75,8763600,12.50 -1991-05-10,51.50,53.25,50.75,51.25,8652000,12.14 -1991-05-09,50.00,51.50,49.75,50.75,8523200,12.03 -1991-05-08,50.75,50.75,49.25,49.75,6332400,11.79 -1991-05-07,51.00,51.25,50.50,50.63,9671200,12.00 -1991-05-06,48.50,50.50,48.25,50.25,7596400,11.91 -1991-05-03,49.00,49.50,48.25,49.00,8717600,11.61 -1991-05-02,47.75,49.75,47.50,49.00,28973600,11.61 -1991-05-01,48.00,49.00,47.00,47.25,66732000,11.20 -1991-04-30,57.75,58.25,54.50,55.00,25413600,13.03 -1991-04-29,58.50,60.25,58.25,58.25,7395200,13.80 -1991-04-26,58.50,59.00,57.75,58.63,4481200,13.89 -1991-04-25,59.75,59.75,58.50,58.50,11276800,13.86 -1991-04-24,61.75,62.00,60.50,60.75,3769200,14.40 -1991-04-23,62.25,63.00,60.25,61.50,8494400,14.57 -1991-04-22,59.50,62.00,58.75,61.50,9190000,14.57 -1991-04-19,61.00,61.50,59.50,59.63,10272400,14.13 -1991-04-18,62.75,63.00,60.75,61.00,8853600,14.46 -1991-04-17,65.00,65.00,62.00,63.25,11533600,14.99 -1991-04-16,63.25,64.50,62.50,64.25,22176800,15.23 -1991-04-15,61.75,64.50,60.00,62.25,60732400,14.75 -1991-04-12,71.50,73.25,69.75,71.75,13140000,17.00 -1991-04-11,67.75,71.37,67.50,71.00,12710800,16.83 -1991-04-10,68.50,69.25,66.75,66.87,7733600,15.85 -1991-04-09,69.75,70.00,68.25,68.75,4280800,16.29 -1991-04-08,69.25,70.00,68.75,70.00,2604400,16.59 -1991-04-05,71.75,71.75,68.75,69.37,5567600,16.44 -1991-04-04,70.00,72.00,69.50,71.50,6024400,16.94 -1991-04-03,72.50,72.75,70.00,70.00,8585200,16.59 -1991-04-02,69.00,72.75,68.50,72.75,10473600,17.24 -1991-04-01,68.00,69.50,67.50,68.50,4218000,16.23 -1991-03-28,69.25,70.00,67.75,68.00,2816800,16.11 -1991-03-27,70.00,70.25,68.50,69.25,6812400,16.41 -1991-03-26,64.75,70.25,64.75,70.00,11935200,16.59 -1991-03-25,63.50,65.00,63.25,64.50,4858800,15.28 -1991-03-22,64.00,64.75,62.25,63.25,12096400,14.99 -1991-03-21,68.25,68.75,63.75,64.75,10600000,15.34 -1991-03-20,69.25,69.50,66.87,67.75,12939200,16.06 -1991-03-19,66.50,70.25,65.75,69.50,15100000,16.47 -1991-03-18,65.75,68.25,65.75,67.75,7645200,16.06 -1991-03-15,65.75,66.50,65.25,66.25,7335600,15.70 -1991-03-14,66.75,67.50,64.50,65.25,8126400,15.46 -1991-03-13,62.75,66.50,62.75,66.25,6253200,15.70 -1991-03-12,63.00,63.75,62.50,62.88,8360000,14.90 -1991-03-11,64.50,64.75,62.25,63.50,6276400,15.05 -1991-03-08,67.75,68.25,65.00,65.00,11522400,15.40 -1991-03-07,63.50,67.50,63.25,67.25,11497600,15.94 -1991-03-06,64.00,65.62,62.88,63.00,18731200,14.93 -1991-03-05,59.00,63.25,59.00,63.13,15769200,14.96 -1991-03-04,58.00,58.75,57.00,58.38,3175600,13.83 -1991-03-01,57.00,59.00,57.00,57.75,4518800,13.69 -1991-02-28,58.25,58.50,56.25,57.25,8120000,13.57 -1991-02-27,58.25,58.50,57.50,58.25,6243200,13.80 -1991-02-26,57.50,58.75,56.50,58.25,8934400,13.80 -1991-02-25,60.25,60.50,57.50,58.00,12848800,13.74 -1991-02-22,59.00,61.75,58.50,59.75,8320800,14.16 -1991-02-21,61.25,62.25,58.75,59.00,6826400,13.98 -1991-02-20,59.50,61.75,59.25,61.00,7646800,14.46 -1991-02-19,57.50,60.25,57.38,60.00,8080800,14.22 -1991-02-15,57.25,58.50,57.25,57.63,13067600,13.66 -1991-02-14,60.00,60.00,56.75,57.13,13493200,13.51 -1991-02-13,60.00,60.25,58.00,60.00,9130800,14.19 -1991-02-12,61.00,61.25,59.38,60.00,8042000,14.19 -1991-02-11,60.00,61.50,59.75,61.38,11546400,14.51 -1991-02-08,57.50,60.25,57.50,59.88,11220000,14.16 -1991-02-07,57.00,58.75,55.75,57.75,18587600,13.66 -1991-02-06,57.75,58.25,56.50,56.88,7965200,13.45 -1991-02-05,55.25,58.00,54.75,57.75,12740000,13.66 -1991-02-04,55.75,56.00,55.00,55.25,9569200,13.07 -1991-02-01,55.50,57.88,55.50,55.75,15897600,13.18 -1991-01-31,55.50,56.00,54.75,55.50,8677600,13.12 -1991-01-30,53.25,55.75,53.25,55.50,12043200,13.12 -1991-01-29,54.25,54.50,52.25,53.75,7708800,12.71 -1991-01-28,53.25,55.25,53.25,54.50,9771200,12.89 -1991-01-25,52.00,53.63,52.00,53.50,8012000,12.65 -1991-01-24,51.50,52.75,51.50,52.13,8374400,12.33 -1991-01-23,51.25,52.25,51.00,51.75,8725600,12.24 -1991-01-22,51.00,52.50,50.50,51.25,15296400,12.12 -1991-01-21,49.75,51.50,49.75,50.75,11595200,12.00 -1991-01-18,48.75,50.75,48.50,50.25,33691200,11.88 -1991-01-17,52.50,52.75,49.00,51.25,21137600,12.12 -1991-01-16,47.00,50.00,46.75,49.75,13968800,11.76 -1991-01-15,46.50,46.75,46.00,46.75,6870000,11.06 -1991-01-14,46.00,46.75,46.00,46.25,7535600,10.94 -1991-01-11,47.00,47.25,46.00,47.00,11003200,11.11 -1991-01-10,45.75,47.25,45.75,47.13,15562400,11.15 -1991-01-09,44.25,46.00,43.75,45.25,16692400,10.70 -1991-01-08,43.75,43.88,42.50,43.25,7816400,10.23 -1991-01-07,43.00,45.25,43.00,43.25,11111200,10.23 -1991-01-04,43.00,44.25,43.00,43.25,5062400,10.23 -1991-01-03,43.50,44.25,43.00,43.00,5365600,10.17 -1991-01-02,42.75,44.00,42.00,43.50,5543600,10.29 -1990-12-31,43.00,43.25,42.75,43.00,1593200,10.17 -1990-12-28,43.25,43.50,42.75,43.00,2285200,10.17 -1990-12-27,43.25,44.00,43.25,43.50,3492000,10.29 -1990-12-26,44.00,44.25,43.00,43.75,3682000,10.35 -1990-12-24,44.75,45.00,44.00,44.00,2106800,10.40 -1990-12-21,44.25,45.25,43.50,45.00,12363200,10.64 -1990-12-20,41.25,44.50,41.25,44.00,14326400,10.40 -1990-12-19,42.50,42.50,41.13,41.88,5036800,9.90 -1990-12-18,41.00,42.50,40.75,42.25,7899200,9.99 -1990-12-17,39.00,40.50,39.00,40.13,4683600,9.49 -1990-12-14,40.25,40.50,39.50,39.88,3126400,9.43 -1990-12-13,39.50,41.00,39.50,40.75,5752000,9.64 -1990-12-12,39.75,40.00,39.00,39.63,8664400,9.37 -1990-12-11,41.25,41.50,40.00,40.00,12438000,9.46 -1990-12-10,42.25,42.50,41.50,41.75,8966400,9.87 -1990-12-07,41.00,42.75,41.00,42.50,11781200,10.05 -1990-12-06,41.25,41.75,40.50,41.25,19013600,9.75 -1990-12-05,38.50,40.25,37.88,40.13,7822000,9.49 -1990-12-04,37.50,38.75,37.50,38.50,5453200,9.10 -1990-12-03,37.25,38.25,37.00,38.13,5922400,9.02 -1990-11-30,36.25,37.25,36.25,36.75,4350800,8.69 -1990-11-29,37.00,37.00,36.25,36.75,4528000,8.69 -1990-11-28,37.75,38.50,36.75,36.75,6250800,8.69 -1990-11-27,37.00,38.25,36.75,37.50,5899200,8.87 -1990-11-26,36.00,37.00,36.00,36.75,2925600,8.69 -1990-11-23,36.25,37.00,36.00,36.38,1911200,8.60 -1990-11-21,35.25,36.25,34.75,36.13,4400800,8.54 -1990-11-20,36.50,36.75,35.25,35.50,5490800,8.39 -1990-11-19,35.50,36.38,35.25,36.38,8017600,8.60 -1990-11-16,35.75,36.00,34.75,35.13,6545200,8.31 -1990-11-15,36.75,37.00,35.50,36.00,5787600,8.48 -1990-11-14,35.75,37.25,35.75,37.00,6819200,8.72 -1990-11-13,36.25,36.50,35.75,36.00,5086400,8.48 -1990-11-12,35.50,36.75,35.25,36.25,5192000,8.54 -1990-11-09,35.00,35.75,34.50,35.50,7102000,8.37 -1990-11-08,33.00,35.00,33.00,34.50,7136400,8.13 -1990-11-07,33.50,33.75,32.63,33.25,7254400,7.84 -1990-11-06,33.50,34.50,33.25,33.50,6620800,7.90 -1990-11-05,32.25,33.50,32.00,33.25,6604400,7.84 -1990-11-02,30.50,32.38,30.50,31.75,5323200,7.48 -1990-11-01,30.50,31.00,29.75,30.50,3258800,7.19 -1990-10-31,30.50,31.87,30.25,30.75,5331200,7.25 -1990-10-30,29.75,30.75,28.87,30.37,3513600,7.16 -1990-10-29,30.25,30.50,29.75,29.87,4415600,7.04 -1990-10-26,29.75,31.25,29.75,30.00,4811200,7.07 -1990-10-25,30.25,31.25,29.62,30.00,5481200,7.07 -1990-10-24,30.75,31.00,30.00,30.50,5079200,7.19 -1990-10-23,31.00,31.50,30.25,31.00,5969200,7.31 -1990-10-22,31.50,31.50,30.50,31.12,9041200,7.33 -1990-10-19,31.25,31.75,30.25,31.37,33363200,7.39 -1990-10-18,26.50,28.75,26.50,28.50,11255600,6.72 -1990-10-17,25.25,26.50,25.00,26.50,11059200,6.25 -1990-10-16,27.50,27.50,24.25,25.00,10913200,5.89 -1990-10-15,28.50,28.75,26.62,27.75,7190000,6.54 -1990-10-12,28.25,28.50,27.00,28.25,8169200,6.66 -1990-10-11,26.75,27.87,25.50,27.75,7376800,6.54 -1990-10-10,27.25,28.00,26.00,26.50,5283600,6.25 -1990-10-09,28.50,29.00,27.75,28.00,4321200,6.60 -1990-10-08,28.75,29.25,28.25,29.12,2218800,6.86 -1990-10-05,27.00,28.75,27.00,28.00,3572000,6.60 -1990-10-04,26.75,28.00,26.25,28.00,7638800,6.60 -1990-10-03,29.75,29.75,26.75,27.00,9591200,6.36 -1990-10-02,31.00,32.00,29.50,29.62,9699200,6.98 -1990-10-01,29.50,31.00,29.25,30.50,5581200,7.19 -1990-09-28,28.50,29.00,27.25,29.00,6291200,6.83 -1990-09-27,30.00,30.50,28.00,28.25,5085600,6.66 -1990-09-26,30.00,30.50,29.75,29.75,3363200,7.01 -1990-09-25,30.50,30.75,29.25,30.00,5642000,7.07 -1990-09-24,31.50,31.50,29.75,30.25,4961200,7.13 -1990-09-21,32.00,32.50,31.00,31.50,5503600,7.42 -1990-09-20,32.25,32.25,31.25,31.62,3607600,7.45 -1990-09-19,33.25,33.75,32.00,32.50,6536800,7.66 -1990-09-18,33.75,33.75,33.00,33.38,4456400,7.87 -1990-09-17,34.00,35.25,33.50,33.75,2782000,7.95 -1990-09-14,33.50,34.25,33.25,34.00,4084400,8.01 -1990-09-13,34.50,34.75,33.00,33.75,3492400,7.95 -1990-09-12,34.50,34.50,33.50,34.00,3600800,8.01 -1990-09-11,36.00,36.13,33.75,34.00,6370800,8.01 -1990-09-10,37.00,37.00,35.75,35.75,2732400,8.43 -1990-09-07,35.50,36.75,35.13,36.38,2098800,8.57 -1990-09-06,35.50,36.00,35.25,35.75,3134800,8.43 -1990-09-05,37.25,37.25,35.75,36.00,2292000,8.48 -1990-09-04,36.50,37.50,36.50,37.00,2974800,8.72 -1990-08-31,36.00,37.25,36.00,37.00,3570000,8.72 -1990-08-30,37.25,37.50,36.00,36.25,4388800,8.54 -1990-08-29,38.00,38.13,36.75,37.25,5407600,8.78 -1990-08-28,37.50,38.38,37.25,38.13,2877600,8.99 -1990-08-27,36.75,38.00,36.25,37.75,4214800,8.90 -1990-08-24,35.25,36.00,34.75,35.50,2634400,8.37 -1990-08-23,34.25,35.00,33.50,34.50,5138800,8.13 -1990-08-22,37.00,37.00,34.88,35.13,4395600,8.28 -1990-08-21,35.75,36.75,35.25,36.25,5769200,8.54 -1990-08-20,36.50,37.50,36.25,36.75,2681200,8.66 -1990-08-17,38.50,38.50,35.75,36.50,8806400,8.58 -1990-08-16,39.00,39.63,38.50,38.50,4438800,9.05 -1990-08-15,40.00,40.25,39.25,39.25,3292000,9.22 -1990-08-14,40.00,40.00,39.25,39.75,3520800,9.34 -1990-08-13,38.00,40.00,37.88,39.88,5584400,9.37 -1990-08-10,38.75,39.25,38.25,38.75,3683600,9.11 -1990-08-09,40.25,40.50,39.25,39.50,3443600,9.28 -1990-08-08,39.50,40.75,39.50,40.13,3674400,9.43 -1990-08-07,40.25,40.63,38.75,39.50,7096400,9.28 -1990-08-06,39.00,40.50,38.50,39.50,6425600,9.28 -1990-08-03,43.50,43.75,39.75,41.25,9609200,9.69 -1990-08-02,41.25,43.75,41.25,43.50,7973600,10.22 -1990-08-01,42.00,42.75,41.50,42.38,3350800,9.96 -1990-07-31,42.50,42.75,41.50,42.00,3444800,9.87 -1990-07-30,40.75,42.50,40.75,42.38,3058800,9.96 -1990-07-27,41.25,41.75,40.50,41.38,2240000,9.72 -1990-07-26,42.25,42.50,41.00,41.38,2885600,9.72 -1990-07-25,42.00,43.25,41.75,42.25,3762400,9.93 -1990-07-24,42.00,42.25,41.00,42.13,6928800,9.90 -1990-07-23,41.00,41.75,40.00,41.50,9655200,9.75 -1990-07-20,42.00,42.50,40.75,41.00,6858000,9.63 -1990-07-19,40.75,42.50,40.00,41.75,20932400,9.81 -1990-07-18,44.50,45.00,43.00,44.63,10309200,10.49 -1990-07-17,45.75,46.00,44.00,44.25,4892000,10.40 -1990-07-16,46.75,47.13,45.25,45.63,6428000,10.72 -1990-07-13,47.50,47.75,46.75,46.75,8254400,10.99 -1990-07-12,46.75,47.50,46.50,47.38,6537600,11.13 -1990-07-11,46.75,47.00,45.75,47.00,8808800,11.04 -1990-07-10,47.00,47.50,46.75,47.00,12923600,11.04 -1990-07-09,45.00,47.00,44.75,46.63,11281200,10.96 -1990-07-06,43.50,45.00,43.25,44.75,7481200,10.52 -1990-07-05,43.75,44.25,43.25,43.50,3859200,10.22 -1990-07-03,43.88,44.50,43.75,44.00,3572400,10.34 -1990-07-02,44.50,44.50,43.75,44.00,4856400,10.34 -1990-06-29,43.00,44.88,42.75,44.75,11622000,10.52 -1990-06-28,42.75,43.25,41.75,43.00,8930000,10.10 -1990-06-27,40.75,42.00,40.25,41.50,3490800,9.75 -1990-06-26,41.75,42.00,40.38,40.63,4558800,9.55 -1990-06-25,41.50,41.75,40.25,41.25,4378000,9.69 -1990-06-22,42.00,42.63,41.25,41.50,10154400,9.75 -1990-06-21,40.00,42.00,40.00,41.88,7455600,9.84 -1990-06-20,39.88,40.25,39.75,40.00,5530000,9.40 -1990-06-19,39.00,39.75,38.38,39.63,5623600,9.31 -1990-06-18,39.25,39.50,39.00,39.25,3988800,9.22 -1990-06-15,39.75,40.00,39.13,39.50,5163600,9.28 -1990-06-14,40.00,40.25,39.25,39.75,5018000,9.34 -1990-06-13,40.38,40.75,39.75,39.75,4963600,9.34 -1990-06-12,39.13,40.50,38.75,40.50,5902000,9.52 -1990-06-11,37.75,39.00,37.75,39.00,5661200,9.16 -1990-06-08,38.50,38.50,37.50,38.25,11926800,8.99 -1990-06-07,39.50,39.75,38.50,39.00,6668800,9.16 -1990-06-06,39.00,39.50,38.75,39.50,7563600,9.28 -1990-06-05,41.00,41.00,39.00,39.50,10702000,9.28 -1990-06-04,40.75,41.00,39.75,40.75,6412400,9.58 -1990-06-01,41.38,42.00,40.75,40.75,5624400,9.58 -1990-05-31,41.50,41.50,41.00,41.25,3682400,9.69 -1990-05-30,41.63,41.75,41.25,41.38,9890000,9.72 -1990-05-29,40.00,41.25,39.25,41.00,8689200,9.63 -1990-05-25,39.50,40.75,39.00,40.00,11562400,9.40 -1990-05-24,42.25,42.25,41.50,42.00,5296400,9.87 -1990-05-23,41.25,42.50,41.25,42.00,7417600,9.87 -1990-05-22,40.13,41.50,40.00,41.38,10772000,9.72 -1990-05-21,39.50,40.00,38.75,39.50,9382400,9.28 -1990-05-18,41.25,41.50,39.50,39.75,9248000,9.31 -1990-05-17,41.75,42.25,41.00,41.50,5488000,9.72 -1990-05-16,41.75,41.75,41.00,41.63,3139200,9.76 -1990-05-15,41.38,42.00,41.00,41.75,5343600,9.78 -1990-05-14,42.75,42.75,41.25,41.75,8088000,9.78 -1990-05-11,41.38,42.75,40.75,42.63,7691200,9.99 -1990-05-10,41.75,41.75,40.50,41.38,6413600,9.70 -1990-05-09,41.63,42.00,41.25,41.88,3491200,9.81 -1990-05-08,41.00,42.00,41.00,41.75,4025600,9.78 -1990-05-07,39.75,41.75,39.75,41.50,4866400,9.72 -1990-05-04,40.00,40.75,39.25,40.00,6063200,9.37 -1990-05-03,39.75,40.25,39.75,40.00,5950800,9.37 -1990-05-02,39.75,40.00,39.25,39.75,4857600,9.31 -1990-05-01,39.75,40.00,39.38,39.63,5845200,9.29 -1990-04-30,39.25,39.75,39.00,39.38,4888800,9.23 -1990-04-27,39.00,39.50,38.75,39.13,4178800,9.17 -1990-04-26,39.00,39.50,38.13,38.88,5098000,9.11 -1990-04-25,38.75,39.00,38.25,38.75,4743200,9.08 -1990-04-24,40.00,40.50,38.50,38.75,10852000,9.08 -1990-04-23,40.25,40.50,39.50,39.75,4597600,9.31 -1990-04-20,40.88,41.50,39.75,40.25,11573600,9.43 -1990-04-19,41.75,43.13,40.00,40.25,17215600,9.43 -1990-04-18,43.25,43.75,42.50,43.25,6925200,10.13 -1990-04-17,43.25,43.50,42.75,43.25,4683600,10.13 -1990-04-16,43.50,44.25,43.25,43.75,8116400,10.25 -1990-04-12,43.00,44.00,42.50,43.25,7566800,10.13 -1990-04-11,41.50,43.00,41.50,42.50,7620000,9.96 -1990-04-10,41.25,42.00,41.00,41.25,4695600,9.67 -1990-04-09,39.75,41.50,39.50,41.13,3771200,9.64 -1990-04-06,40.25,41.25,39.75,39.88,4235600,9.35 -1990-04-05,41.00,41.25,40.00,40.25,3877600,9.43 -1990-04-04,41.50,42.00,40.75,41.25,5363200,9.67 -1990-04-03,40.50,41.75,40.50,41.75,5006400,9.78 -1990-04-02,40.00,40.63,39.50,40.25,5332000,9.43 -1990-03-30,40.00,41.00,40.00,40.25,7986400,9.43 -1990-03-29,41.00,41.50,40.75,41.13,3472000,9.64 -1990-03-28,42.00,42.13,41.00,41.25,3696800,9.67 -1990-03-27,42.00,42.25,41.25,42.00,3033600,9.84 -1990-03-26,42.50,43.38,42.00,42.25,4581200,9.90 -1990-03-23,41.25,43.00,41.00,42.25,8155200,9.90 -1990-03-22,41.75,42.25,40.75,40.75,8292400,9.55 -1990-03-21,41.25,42.25,41.25,41.63,5463200,9.76 -1990-03-20,42.25,43.00,40.75,41.38,13984400,9.70 -1990-03-19,40.50,42.50,40.00,42.38,15433200,9.93 -1990-03-16,40.00,40.75,39.13,40.25,23042400,9.43 -1990-03-15,36.50,38.00,36.50,36.75,4302000,8.61 -1990-03-14,36.75,37.25,36.50,37.00,3654800,8.67 -1990-03-13,36.50,37.25,36.25,36.88,5321200,8.64 -1990-03-12,37.25,37.50,36.25,36.63,5864400,8.58 -1990-03-09,36.75,37.50,36.25,36.88,8248800,8.64 -1990-03-08,35.75,37.00,35.00,36.75,8013600,8.61 -1990-03-07,35.00,36.00,35.00,35.38,7301200,8.29 -1990-03-06,35.00,35.25,34.50,35.25,5578800,8.26 -1990-03-05,33.50,34.75,33.50,34.50,6537600,8.08 -1990-03-02,33.50,34.75,33.25,33.75,3761200,7.91 -1990-03-01,33.50,34.75,33.25,34.25,7283200,8.03 -1990-02-28,33.50,34.00,33.25,34.00,3918800,7.97 -1990-02-27,34.00,34.25,33.50,33.50,2642000,7.85 -1990-02-26,33.00,34.25,33.00,34.00,2844800,7.97 -1990-02-23,32.75,33.50,32.75,33.25,5375600,7.79 -1990-02-22,34.00,34.50,33.00,33.00,6976800,7.73 -1990-02-21,32.75,34.25,32.50,34.00,6283600,7.97 -1990-02-20,33.50,33.75,33.00,33.50,4402400,7.85 -1990-02-16,34.25,34.50,33.75,33.75,4556400,7.91 -1990-02-15,33.75,34.25,33.50,34.25,3509200,8.00 -1990-02-14,34.50,34.75,33.75,34.25,3448000,8.00 -1990-02-13,34.00,35.00,33.75,34.50,3653600,8.06 -1990-02-12,34.25,34.50,33.75,34.00,2695600,7.94 -1990-02-09,33.50,34.50,33.25,34.25,6004400,8.00 -1990-02-08,33.25,33.50,32.25,33.00,6680000,7.71 -1990-02-07,33.00,34.00,32.50,33.25,11180800,7.77 -1990-02-06,34.75,35.00,34.00,34.75,2640000,8.12 -1990-02-05,34.25,35.25,34.00,35.00,3653200,8.18 -1990-02-02,33.25,34.75,33.25,34.25,4248800,8.00 -1990-02-01,34.50,34.63,33.50,33.63,4193200,7.86 -1990-01-31,34.50,34.75,33.00,34.00,5152400,7.94 -1990-01-30,33.25,34.50,33.00,34.00,4180800,7.94 -1990-01-29,33.00,33.50,32.13,33.25,4284800,7.77 -1990-01-26,34.00,34.00,32.25,32.75,6492000,7.65 -1990-01-25,34.25,34.75,34.00,34.13,3996800,7.97 -1990-01-24,32.50,34.25,32.25,34.00,6077600,7.94 -1990-01-23,33.75,34.25,33.00,33.75,5048800,7.88 -1990-01-22,34.00,34.50,33.25,33.25,5200800,7.77 -1990-01-19,33.75,34.50,33.50,34.25,9485600,8.00 -1990-01-18,33.00,33.50,32.25,32.38,9760800,7.56 -1990-01-17,34.75,34.75,33.00,33.25,7050000,7.77 -1990-01-16,33.50,35.00,32.75,34.88,7658000,8.15 -1990-01-15,34.50,35.75,34.25,34.25,5785600,8.00 -1990-01-12,34.25,34.75,33.75,34.50,6150000,8.06 -1990-01-11,36.25,36.25,34.50,34.50,7547600,8.06 -1990-01-10,37.63,37.63,35.75,36.00,7140000,8.41 -1990-01-09,38.00,38.00,37.00,37.63,3096800,8.79 -1990-01-08,37.50,38.00,37.00,38.00,3643200,8.88 -1990-01-05,37.75,38.25,37.00,37.75,4406400,8.82 -1990-01-04,38.25,38.75,37.25,37.63,7928800,8.79 -1990-01-03,38.00,38.00,37.50,37.50,7444400,8.76 -1990-01-02,35.25,37.50,35.00,37.25,6555600,8.70 -1989-12-29,34.75,35.75,34.38,35.25,5445200,8.23 -1989-12-28,35.00,35.25,34.25,34.63,5403200,8.09 -1989-12-27,35.50,35.75,35.00,35.13,9189200,8.21 -1989-12-26,36.75,36.75,35.25,35.50,4849200,8.29 -1989-12-22,36.25,37.25,36.00,36.50,6610800,8.53 -1989-12-21,35.75,36.25,35.50,36.25,10889200,8.47 -1989-12-20,35.75,36.25,35.25,35.75,6377600,8.35 -1989-12-19,34.50,35.50,34.50,35.00,8977600,8.18 -1989-12-18,33.75,35.00,33.75,34.75,10978000,8.12 -1989-12-15,34.75,35.00,32.50,33.75,18520800,7.88 -1989-12-14,35.75,36.13,34.50,34.88,10886400,8.15 -1989-12-13,36.00,36.50,35.50,36.00,13920000,8.41 -1989-12-12,39.25,39.50,35.00,36.00,36634400,8.41 -1989-12-11,41.00,41.50,38.38,39.25,23223200,9.17 -1989-12-08,42.50,43.00,41.25,41.75,9032400,9.75 -1989-12-07,42.25,43.25,42.00,42.75,6378800,9.99 -1989-12-06,45.00,45.25,41.00,42.75,11965600,9.99 -1989-12-05,45.25,45.75,44.50,45.00,4364800,10.51 -1989-12-04,43.75,45.50,43.75,45.25,3498000,10.57 -1989-12-01,44.50,45.00,43.63,44.00,5235200,10.28 -1989-11-30,43.75,44.50,43.50,44.25,2280800,10.34 -1989-11-29,43.50,44.25,42.50,44.00,5475200,10.28 -1989-11-28,43.75,44.25,42.75,44.13,4854400,10.31 -1989-11-27,44.75,45.25,43.75,44.00,3774800,10.28 -1989-11-24,44.75,45.00,44.75,44.75,1014400,10.45 -1989-11-22,45.50,45.75,44.50,44.75,3508000,10.45 -1989-11-21,45.25,46.50,45.25,45.25,5013600,10.57 -1989-11-20,45.00,45.50,44.50,45.25,3870800,10.57 -1989-11-17,44.50,45.25,44.50,44.75,3164400,10.45 -1989-11-16,44.50,44.75,43.75,44.75,3453600,10.43 -1989-11-15,45.00,45.25,44.00,44.25,3499200,10.31 -1989-11-14,46.50,46.75,44.50,44.75,3021200,10.43 -1989-11-13,46.50,47.25,46.50,46.50,2445600,10.83 -1989-11-10,45.75,47.00,45.75,46.75,2336800,10.89 -1989-11-09,45.00,46.00,44.50,46.00,3166400,10.72 -1989-11-08,44.25,45.25,44.25,45.00,5102000,10.49 -1989-11-07,43.25,44.50,43.25,44.00,5406800,10.25 -1989-11-06,43.50,44.00,43.00,43.25,4416400,10.08 -1989-11-03,44.00,44.50,43.25,43.25,6258800,10.08 -1989-11-02,45.00,45.00,43.00,44.00,16170800,10.25 -1989-11-01,46.25,46.75,45.75,46.13,2199200,10.75 -1989-10-31,45.75,46.50,45.50,46.50,3288800,10.83 -1989-10-30,45.50,46.00,45.00,45.75,3121200,10.66 -1989-10-27,45.25,45.75,44.50,45.25,4634400,10.54 -1989-10-26,45.50,46.50,45.00,45.25,6048000,10.54 -1989-10-25,47.75,47.75,46.25,46.50,4263600,10.83 -1989-10-24,46.25,48.50,45.25,47.63,7735600,11.10 -1989-10-23,48.00,48.25,46.25,46.75,4375600,10.89 -1989-10-20,47.75,49.25,47.50,48.00,9350800,11.18 -1989-10-19,48.25,49.50,48.25,48.75,4016800,11.36 -1989-10-18,46.50,48.25,46.00,48.25,5157600,11.24 -1989-10-17,46.00,48.75,45.00,47.25,8935600,11.01 -1989-10-16,44.75,46.75,42.50,46.75,15184400,10.89 -1989-10-13,48.75,49.50,45.00,45.75,7195600,10.66 -1989-10-12,49.00,49.25,48.50,48.75,2969200,11.36 -1989-10-11,48.75,49.25,48.00,48.88,5608800,11.39 -1989-10-10,49.75,50.38,48.50,49.50,10262400,11.53 -1989-10-09,48.00,49.75,47.50,49.50,6997600,11.53 -1989-10-06,46.25,48.25,46.00,48.13,12939200,11.21 -1989-10-05,44.50,46.50,44.25,45.50,8760000,10.60 -1989-10-04,43.75,44.63,43.50,44.25,5687600,10.31 -1989-10-03,44.25,44.50,43.13,43.63,6094400,10.17 -1989-10-02,44.50,44.75,43.75,44.38,4922400,10.34 -1989-09-29,45.25,45.50,44.50,44.50,2500800,10.37 -1989-09-28,45.00,45.75,45.00,45.50,2856800,10.60 -1989-09-27,44.25,45.13,44.00,44.75,3229200,10.43 -1989-09-26,45.00,45.50,44.75,45.25,2762400,10.54 -1989-09-25,44.75,45.75,44.75,45.25,4875600,10.54 -1989-09-22,44.75,45.25,44.25,44.88,2605600,10.46 -1989-09-21,45.00,46.00,44.25,44.75,7186800,10.43 -1989-09-20,44.00,45.00,43.75,44.63,4230800,10.40 -1989-09-19,44.25,44.50,43.00,43.25,2888800,10.08 -1989-09-18,44.50,45.00,44.00,44.00,2264400,10.25 -1989-09-15,45.00,45.25,44.25,45.00,4470800,10.49 -1989-09-14,45.00,45.25,44.50,44.75,4693600,10.43 -1989-09-13,46.25,46.63,45.00,45.00,4616400,10.49 -1989-09-12,45.50,46.75,45.00,46.00,3710800,10.72 -1989-09-11,44.75,46.00,44.50,45.75,3522000,10.66 -1989-09-08,44.75,45.25,44.50,45.00,2013200,10.49 -1989-09-07,44.75,45.50,44.75,44.75,4083200,10.43 -1989-09-06,44.75,44.88,44.00,44.75,3108800,10.43 -1989-09-05,44.50,45.38,44.50,44.75,4112400,10.43 -1989-09-01,44.50,44.75,44.25,44.63,2651200,10.40 -1989-08-31,44.50,45.00,44.25,44.50,2016400,10.37 -1989-08-30,44.00,44.75,44.00,44.50,4161200,10.37 -1989-08-29,44.75,45.00,43.75,44.13,6339200,10.28 -1989-08-28,44.50,45.00,44.00,44.75,2936800,10.43 -1989-08-25,44.00,45.00,44.00,44.75,5766400,10.43 -1989-08-24,43.75,44.50,43.50,44.13,5829200,10.28 -1989-08-23,43.00,44.25,42.50,43.75,6202400,10.19 -1989-08-22,42.00,43.00,42.00,42.88,4013200,9.99 -1989-08-21,42.25,43.25,42.00,42.25,4923600,9.84 -1989-08-18,41.75,42.50,41.50,42.25,3003600,9.82 -1989-08-17,40.25,41.25,40.00,41.00,5495600,9.53 -1989-08-16,41.50,41.75,40.00,40.38,4318800,9.39 -1989-08-15,40.75,41.50,40.75,41.38,5852000,9.62 -1989-08-14,41.50,42.00,40.50,40.75,3690800,9.47 -1989-08-11,44.00,44.00,41.25,41.88,8226800,9.74 -1989-08-10,44.00,44.00,42.75,43.25,5442400,10.05 -1989-08-09,44.00,45.75,43.88,44.00,6975600,10.23 -1989-08-08,43.50,44.75,43.50,44.13,7366400,10.26 -1989-08-07,43.00,44.00,42.63,43.75,6012000,10.17 -1989-08-04,41.25,42.75,41.13,42.75,6564400,9.94 -1989-08-03,40.50,41.50,40.50,41.25,6185600,9.59 -1989-08-02,39.75,40.50,39.50,40.50,3633600,9.41 -1989-08-01,39.75,40.25,39.25,39.88,4996800,9.27 -1989-07-31,39.25,40.00,39.00,39.75,4014800,9.24 -1989-07-28,39.25,39.75,39.00,39.38,4274400,9.15 -1989-07-27,38.25,39.50,38.00,39.25,6193200,9.12 -1989-07-26,38.25,38.50,37.75,38.25,8363600,8.89 -1989-07-25,39.25,39.75,38.00,38.75,7502400,9.01 -1989-07-24,39.75,39.75,39.25,39.25,4154800,9.12 -1989-07-21,39.75,40.00,39.00,40.00,4993600,9.30 -1989-07-20,40.75,41.25,39.75,40.00,8448800,9.30 -1989-07-19,39.50,40.75,39.00,40.50,8543200,9.41 -1989-07-18,40.75,40.75,38.75,39.25,17050800,9.12 -1989-07-17,40.75,41.25,39.75,40.75,4694400,9.47 -1989-07-14,40.75,41.00,39.75,40.75,9206800,9.47 -1989-07-13,40.00,41.00,39.50,40.63,8057600,9.44 -1989-07-12,39.75,40.25,39.50,40.00,4452000,9.30 -1989-07-11,40.75,41.00,39.75,39.75,8729200,9.24 -1989-07-10,41.00,41.25,40.00,40.50,7294400,9.41 -1989-07-07,41.25,42.00,40.50,41.25,3806400,9.59 -1989-07-06,40.75,41.75,40.25,41.25,6218000,9.59 -1989-07-05,40.50,40.75,40.00,40.50,4264400,9.41 -1989-07-03,41.75,41.75,40.75,40.75,1730800,9.47 -1989-06-30,40.50,41.75,39.50,41.25,5885600,9.59 -1989-06-29,41.00,41.25,40.00,40.63,8351200,9.44 -1989-06-28,42.25,42.25,41.00,41.75,9190800,9.70 -1989-06-27,43.75,44.25,42.50,42.63,3788000,9.91 -1989-06-26,44.00,44.00,43.25,43.50,6568800,10.11 -1989-06-23,43.25,44.25,43.25,43.88,4438800,10.20 -1989-06-22,42.50,43.75,42.00,43.25,4911200,10.05 -1989-06-21,43.00,43.50,42.25,42.50,4659200,9.88 -1989-06-20,44.00,44.00,42.25,43.00,4807600,10.00 -1989-06-19,44.50,44.75,43.50,44.00,6551200,10.23 -1989-06-16,44.75,45.50,43.50,44.50,19378000,10.34 -1989-06-15,49.50,49.75,47.50,47.50,5766800,11.04 -1989-06-14,49.00,50.25,48.25,49.63,8983600,11.54 -1989-06-13,47.50,48.75,47.00,48.50,8254400,11.27 -1989-06-12,46.75,47.75,46.25,47.50,2892400,11.04 -1989-06-09,47.25,47.75,46.50,47.00,3378800,10.93 -1989-06-08,48.50,49.00,47.25,47.63,6378800,11.07 -1989-06-07,46.75,48.50,46.75,48.25,6293200,11.22 -1989-06-06,46.75,47.00,46.25,46.75,5189200,10.87 -1989-06-05,48.75,49.00,46.50,47.00,4451200,10.93 -1989-06-02,48.50,49.50,48.50,49.00,4448800,11.39 -1989-06-01,47.75,49.25,47.50,48.75,6416800,11.33 -1989-05-31,47.50,48.13,47.00,47.75,4134400,11.10 -1989-05-30,48.25,49.00,47.38,47.50,4018000,11.04 -1989-05-26,48.25,49.00,48.00,48.50,4028800,11.27 -1989-05-25,47.25,49.00,47.25,48.25,8309200,11.22 -1989-05-24,45.25,47.75,45.25,47.75,10645200,11.10 -1989-05-23,46.00,46.00,45.25,45.50,4803600,10.58 -1989-05-22,45.75,46.25,45.25,46.00,6800000,10.69 -1989-05-19,44.75,46.25,44.75,45.75,11820800,10.61 -1989-05-18,45.25,45.50,44.75,44.75,7558800,10.38 -1989-05-17,45.25,45.50,45.00,45.25,8892400,10.50 -1989-05-16,46.00,46.25,45.00,45.38,8170800,10.53 -1989-05-15,44.75,46.25,44.75,46.00,11372400,10.67 -1989-05-12,44.50,45.00,44.00,45.00,16685600,10.44 -1989-05-11,43.25,44.25,43.00,43.88,10763600,10.18 -1989-05-10,43.00,43.50,42.50,43.25,8380000,10.03 -1989-05-09,42.00,43.00,42.00,42.50,12398800,9.86 -1989-05-08,41.50,42.25,41.50,42.25,7373600,9.80 -1989-05-05,42.50,42.75,41.50,41.50,16464400,9.63 -1989-05-04,40.25,41.25,40.00,41.00,6762000,9.51 -1989-05-03,39.75,40.75,39.75,40.25,7896800,9.34 -1989-05-02,39.00,40.25,39.00,39.88,7719200,9.25 -1989-05-01,38.50,39.25,38.50,39.00,2881200,9.05 -1989-04-28,39.25,39.50,38.50,39.00,3725600,9.05 -1989-04-27,39.50,40.00,39.00,39.38,4988000,9.13 -1989-04-26,40.00,40.25,39.13,39.75,6652000,9.22 -1989-04-25,40.00,40.50,39.75,40.00,4165600,9.28 -1989-04-24,40.00,40.25,39.50,40.13,3977600,9.31 -1989-04-21,40.50,40.88,39.75,40.13,4132000,9.31 -1989-04-20,40.75,41.50,40.25,40.75,6434400,9.45 -1989-04-19,40.00,41.63,39.75,40.88,15215600,9.48 -1989-04-18,39.50,40.50,39.25,40.13,20055200,9.31 -1989-04-17,38.50,39.25,38.00,39.25,5008000,9.10 -1989-04-14,39.00,39.25,38.25,38.75,4408800,8.99 -1989-04-13,38.75,39.50,38.25,38.50,6493200,8.93 -1989-04-12,38.25,39.25,37.88,38.50,13862000,8.93 -1989-04-11,37.50,38.00,37.00,37.75,5252400,8.76 -1989-04-10,37.25,38.00,36.75,37.00,4854400,8.58 -1989-04-07,36.00,37.50,36.00,37.38,12699200,8.67 -1989-04-06,34.75,36.13,34.50,36.00,5598800,8.35 -1989-04-05,34.50,35.25,34.25,35.00,4303200,8.12 -1989-04-04,34.50,34.88,33.88,34.50,4140800,8.00 -1989-04-03,35.50,36.25,34.75,35.00,5949200,8.12 -1989-03-31,35.00,35.75,34.75,35.63,6630800,8.26 -1989-03-30,34.25,35.00,34.00,34.75,3780800,8.06 -1989-03-29,34.00,34.50,34.00,34.25,2666800,7.94 -1989-03-28,34.00,34.50,34.00,34.00,5047600,7.89 -1989-03-27,34.25,34.50,33.50,33.75,5425600,7.83 -1989-03-23,34.00,34.50,33.75,34.38,4250800,7.97 -1989-03-22,34.25,34.75,33.75,33.88,5180800,7.86 -1989-03-21,35.50,35.50,34.75,34.88,4588800,8.09 -1989-03-20,35.00,35.25,34.50,34.88,6480800,8.09 -1989-03-17,34.50,35.75,34.00,34.88,8485200,8.09 -1989-03-16,35.00,35.50,34.50,35.25,6880000,8.18 -1989-03-15,35.25,35.50,34.75,35.00,3225600,8.12 -1989-03-14,35.00,35.50,34.88,35.25,5796800,8.18 -1989-03-13,35.00,35.50,34.75,35.00,4683600,8.12 -1989-03-10,34.50,35.00,34.25,35.00,3684400,8.12 -1989-03-09,35.25,35.75,34.50,34.50,4768800,8.00 -1989-03-08,35.63,36.25,35.25,35.25,7727600,8.18 -1989-03-07,35.50,36.00,35.00,35.75,9327600,8.29 -1989-03-06,35.00,35.88,34.50,35.50,6028800,8.23 -1989-03-03,35.25,35.25,34.00,34.75,13854400,8.06 -1989-03-02,35.75,36.25,34.75,35.00,13440800,8.12 -1989-03-01,36.25,36.50,35.50,36.00,6096400,8.35 -1989-02-28,36.50,36.75,36.00,36.25,6290000,8.41 -1989-02-27,36.00,36.50,35.75,36.50,4151200,8.47 -1989-02-24,37.00,37.00,36.00,36.00,5452000,8.35 -1989-02-23,36.50,37.00,36.25,36.75,3409200,8.52 -1989-02-22,37.25,37.50,36.50,36.75,8529200,8.52 -1989-02-21,36.88,37.75,36.75,37.50,6808800,8.70 -1989-02-17,36.25,37.00,36.25,36.75,4180800,8.52 -1989-02-16,36.25,37.25,36.00,36.38,9138800,8.41 -1989-02-15,35.75,36.25,35.50,36.25,11812400,8.38 -1989-02-14,36.88,37.00,35.25,35.75,31843200,8.27 -1989-02-13,36.75,37.25,36.75,37.00,8422000,8.56 -1989-02-10,38.25,38.25,37.00,37.25,12441200,8.62 -1989-02-09,38.25,39.00,38.00,38.25,5756400,8.85 -1989-02-08,39.00,39.50,38.00,38.25,5612000,8.85 -1989-02-07,38.25,39.25,38.25,39.00,5908800,9.02 -1989-02-06,39.50,39.50,38.25,38.50,4174400,8.91 -1989-02-03,40.00,40.25,39.00,39.25,6406400,9.08 -1989-02-02,39.50,40.25,39.25,39.75,16927600,9.19 -1989-02-01,37.75,39.63,37.38,39.25,17420000,9.08 -1989-01-31,37.25,37.75,36.75,37.75,16442000,8.73 -1989-01-30,37.63,38.00,37.25,37.38,20961200,8.65 -1989-01-27,38.25,39.25,36.25,37.63,75976400,8.70 -1989-01-26,40.75,42.13,40.63,41.75,10203600,9.66 -1989-01-25,41.75,42.00,41.00,41.50,3963200,9.60 -1989-01-24,41.00,41.75,40.75,41.63,7983200,9.63 -1989-01-23,40.75,41.25,40.75,41.00,6452000,9.48 -1989-01-20,40.50,41.50,40.25,41.00,6207600,9.48 -1989-01-19,40.50,41.00,40.00,40.50,9155200,9.37 -1989-01-18,40.75,41.13,39.50,39.75,17440800,9.19 -1989-01-17,43.25,43.50,40.00,40.38,27033600,9.34 -1989-01-16,43.25,44.00,43.00,43.75,6033200,10.12 -1989-01-13,42.75,43.50,42.38,43.25,6928000,10.00 -1989-01-12,42.25,43.00,42.00,42.75,5373200,9.89 -1989-01-11,42.25,42.50,41.25,42.13,5585200,9.74 -1989-01-10,42.50,42.88,41.50,42.63,3695600,9.86 -1989-01-09,43.00,43.13,42.25,43.00,2850800,9.95 -1989-01-06,42.25,43.50,42.25,42.63,7103600,9.86 -1989-01-05,42.00,43.25,41.25,42.25,10985200,9.77 -1989-01-04,40.75,42.13,40.50,42.00,8575200,9.71 -1989-01-03,40.25,40.50,40.00,40.38,3578800,9.34 -1988-12-30,40.50,41.25,40.25,40.25,2938800,9.31 -1988-12-29,40.25,40.75,40.25,40.50,4212000,9.37 -1988-12-28,40.50,40.75,39.75,40.25,1841200,9.31 -1988-12-27,41.00,41.50,40.50,40.50,2155200,9.37 -1988-12-23,41.00,41.38,41.00,41.13,1475600,9.51 -1988-12-22,41.75,42.00,40.75,41.00,3802000,9.48 -1988-12-21,41.00,42.00,41.00,41.75,8642400,9.66 -1988-12-20,41.00,41.50,40.63,41.00,9810800,9.48 -1988-12-19,40.25,41.00,40.00,40.75,8373600,9.43 -1988-12-16,39.50,40.50,39.25,40.13,6572000,9.28 -1988-12-15,40.00,40.50,39.25,39.50,4032000,9.14 -1988-12-14,38.50,40.00,38.50,39.75,6916800,9.19 -1988-12-13,38.50,38.75,38.25,38.75,4386400,8.96 -1988-12-12,39.25,39.50,38.50,38.50,4215600,8.91 -1988-12-09,39.25,39.50,38.75,39.13,1608800,9.05 -1988-12-08,39.25,39.25,38.75,39.13,2125600,9.05 -1988-12-07,39.00,39.50,38.75,39.38,3518800,9.11 -1988-12-06,39.25,39.75,39.00,39.50,3763200,9.14 -1988-12-05,39.50,40.00,38.75,39.50,5534400,9.14 -1988-12-02,38.25,39.88,38.00,39.25,11940000,9.08 -1988-12-01,37.75,39.00,37.50,38.75,7586800,8.96 -1988-11-30,36.75,38.00,36.75,37.63,6013600,8.70 -1988-11-29,36.50,36.75,36.00,36.75,3326400,8.50 -1988-11-28,36.50,36.75,36.00,36.50,4986800,8.44 -1988-11-25,36.25,36.75,36.00,36.50,1727600,8.44 -1988-11-23,35.75,37.00,35.50,36.88,6733200,8.53 -1988-11-22,36.50,36.88,36.00,36.13,5299200,8.36 -1988-11-21,37.50,37.75,36.25,36.63,7928000,8.47 -1988-11-18,38.50,38.50,38.00,38.00,2066400,8.77 -1988-11-17,38.00,38.50,38.00,38.25,2841200,8.82 -1988-11-16,39.00,39.25,37.75,38.00,5280000,8.77 -1988-11-15,39.00,39.25,38.75,39.00,2866800,9.00 -1988-11-14,38.75,39.00,38.25,38.88,3046400,8.97 -1988-11-11,39.00,39.63,38.50,38.50,3882400,8.88 -1988-11-10,39.50,39.75,39.00,39.50,3573200,9.11 -1988-11-09,38.25,39.38,38.00,39.25,7206800,9.05 -1988-11-08,37.50,38.75,37.38,38.50,5540800,8.88 -1988-11-07,37.25,37.75,37.00,37.50,6093600,8.65 -1988-11-04,36.75,38.00,36.75,37.75,5500000,8.71 -1988-11-03,37.25,37.50,36.75,37.13,8670000,8.57 -1988-11-02,38.25,38.25,36.75,37.25,7451200,8.59 -1988-11-01,38.50,38.75,37.75,38.00,5138800,8.77 -1988-10-31,38.75,38.75,37.50,38.63,8695200,8.91 -1988-10-28,39.00,39.50,38.50,38.50,3026800,8.88 -1988-10-27,38.75,39.25,38.25,39.00,5138000,9.00 -1988-10-26,40.00,40.00,38.50,39.25,6751200,9.05 -1988-10-25,40.25,40.25,39.75,39.88,3043600,9.20 -1988-10-24,41.25,41.25,39.63,40.00,4842400,9.23 -1988-10-21,41.25,41.75,40.75,41.00,4422400,9.46 -1988-10-20,40.00,41.63,40.00,41.50,6215200,9.57 -1988-10-19,39.75,40.75,39.50,40.00,9918000,9.23 -1988-10-18,39.00,39.50,38.25,39.38,5100000,9.08 -1988-10-17,38.50,39.00,38.25,38.50,3360800,8.88 -1988-10-14,39.50,39.50,38.13,38.75,5625200,8.94 -1988-10-13,38.50,39.75,38.50,39.00,5892400,9.00 -1988-10-12,38.50,39.00,38.00,38.75,4763600,8.94 -1988-10-11,38.25,39.50,38.25,39.00,6964400,9.00 -1988-10-10,39.50,39.75,37.50,38.50,11880000,8.88 -1988-10-07,39.00,39.75,38.38,39.75,16355200,9.17 -1988-10-06,40.50,40.88,39.25,39.75,6009200,9.17 -1988-10-05,41.25,41.75,40.50,40.88,4400000,9.43 -1988-10-04,42.25,42.75,41.13,41.50,1847600,9.57 -1988-10-03,43.00,43.25,42.00,42.50,3243200,9.80 -1988-09-30,44.00,44.00,43.25,43.25,3338800,9.98 -1988-09-29,43.75,44.25,43.50,44.00,3804400,10.15 -1988-09-28,43.50,44.13,43.25,43.50,3038800,10.04 -1988-09-27,42.50,43.50,42.50,43.38,5832400,10.01 -1988-09-26,43.75,44.00,42.50,42.75,3124400,9.86 -1988-09-23,43.50,44.25,43.50,43.75,3638000,10.09 -1988-09-22,43.00,44.00,42.75,44.00,5203600,10.15 -1988-09-21,41.75,43.00,41.50,42.75,3274800,9.86 -1988-09-20,41.75,42.25,41.38,41.50,3682400,9.57 -1988-09-19,42.00,42.25,41.25,41.75,3296400,9.63 -1988-09-16,41.50,42.75,41.38,42.25,4431200,9.75 -1988-09-15,42.00,42.75,41.50,41.63,5920000,9.60 -1988-09-14,41.75,42.38,41.50,42.00,8520800,9.69 -1988-09-13,40.25,41.25,40.00,41.00,4293600,9.46 -1988-09-12,41.00,41.75,40.13,41.00,5290800,9.46 -1988-09-09,38.75,41.00,37.75,40.50,8393200,9.34 -1988-09-08,38.25,39.50,37.75,38.75,7403200,8.94 -1988-09-07,39.00,39.50,37.75,38.25,6417600,8.82 -1988-09-06,40.00,40.00,38.75,38.88,5125200,8.97 -1988-09-02,39.50,40.00,39.00,39.75,6661200,9.17 -1988-09-01,39.75,39.75,38.50,38.88,8818800,8.97 -1988-08-31,41.00,41.13,39.50,39.88,8493600,9.20 -1988-08-30,40.75,41.00,40.00,40.88,1809200,9.43 -1988-08-29,40.75,41.00,40.50,40.88,2046400,9.43 -1988-08-26,40.00,40.75,40.00,40.25,1453200,9.29 -1988-08-25,40.25,40.50,39.25,40.13,4560000,9.26 -1988-08-24,39.75,40.75,39.50,40.75,4482000,9.40 -1988-08-23,39.75,40.25,39.25,39.50,5843200,9.11 -1988-08-22,40.25,40.75,39.50,39.75,6100000,9.17 -1988-08-19,42.50,42.75,40.50,40.75,8120000,9.40 -1988-08-18,42.00,43.00,41.75,42.50,2648000,9.80 -1988-08-17,42.50,42.75,41.75,42.00,4252400,9.69 -1988-08-16,41.00,43.25,40.75,42.50,4397600,9.80 -1988-08-15,42.25,42.25,40.50,41.25,5971200,9.52 -1988-08-12,43.00,43.00,42.25,42.50,2771200,9.79 -1988-08-11,42.25,43.25,42.00,43.25,3803200,9.96 -1988-08-10,43.75,43.75,41.75,41.88,5300800,9.64 -1988-08-09,44.00,44.25,43.00,43.50,6090800,10.02 -1988-08-08,44.50,44.75,44.00,44.00,1085600,10.13 -1988-08-05,44.50,45.00,44.25,44.25,1881200,10.19 -1988-08-04,44.75,45.25,44.50,44.63,2473200,10.28 -1988-08-03,44.75,44.75,44.00,44.75,3980800,10.30 -1988-08-02,45.00,45.50,44.50,44.63,4338000,10.28 -1988-08-01,44.50,45.75,44.25,45.00,3085600,10.36 -1988-07-29,43.25,44.50,43.00,44.38,5697600,10.22 -1988-07-28,42.50,43.00,42.25,42.63,3326800,9.82 -1988-07-27,42.75,43.25,42.50,42.75,4162400,9.84 -1988-07-26,42.75,43.25,42.25,42.75,3640800,9.84 -1988-07-25,42.75,43.25,42.25,42.75,3794400,9.84 -1988-07-22,43.00,43.25,42.50,42.50,3724800,9.79 -1988-07-21,43.75,44.00,42.75,43.00,5323600,9.90 -1988-07-20,44.75,45.00,44.00,44.25,4293600,10.19 -1988-07-19,45.00,45.50,43.88,44.75,4372400,10.30 -1988-07-18,45.38,46.00,45.25,45.50,4061200,10.48 -1988-07-15,45.00,45.50,44.75,45.00,2968000,10.36 -1988-07-14,44.75,45.25,44.50,45.00,2245200,10.36 -1988-07-13,44.75,45.00,44.25,44.75,4132000,10.30 -1988-07-12,45.00,45.25,44.50,44.75,3605600,10.30 -1988-07-11,45.50,45.50,44.88,45.13,2646400,10.39 -1988-07-08,45.50,46.00,45.00,45.25,3766400,10.42 -1988-07-07,46.50,46.50,45.25,45.88,3778000,10.56 -1988-07-06,47.13,47.50,46.13,46.50,5608800,10.71 -1988-07-05,46.50,47.25,46.13,47.25,3736400,10.88 -1988-07-01,46.50,46.88,46.25,46.50,3385600,10.71 -1988-06-30,46.25,46.75,46.00,46.25,4104800,10.65 -1988-06-29,46.00,46.75,45.75,46.38,5125200,10.68 -1988-06-28,44.75,46.25,44.50,46.25,5809200,10.65 -1988-06-27,44.50,45.38,44.50,44.50,3001200,10.25 -1988-06-24,45.00,45.50,44.50,45.00,2684400,10.36 -1988-06-23,45.75,45.75,45.00,45.00,2566400,10.36 -1988-06-22,45.50,45.88,45.00,45.63,6998000,10.51 -1988-06-21,44.00,45.00,43.88,44.88,4422000,10.33 -1988-06-20,44.38,44.75,44.00,44.13,2811200,10.16 -1988-06-17,44.75,44.75,44.25,44.75,3410800,10.30 -1988-06-16,45.00,45.25,44.25,44.50,3854400,10.25 -1988-06-15,45.25,45.75,45.00,45.75,4360000,10.53 -1988-06-14,45.25,46.00,45.00,45.25,10445600,10.42 -1988-06-13,45.00,45.25,44.25,45.00,5320000,10.36 -1988-06-10,43.50,44.75,43.00,44.50,6320000,10.25 -1988-06-09,45.00,45.25,43.25,43.50,9640000,10.02 -1988-06-08,44.25,45.50,44.00,45.00,9240000,10.36 -1988-06-07,43.75,45.25,43.50,44.00,11120000,10.13 -1988-06-06,42.75,44.00,42.75,44.00,5880000,10.13 -1988-06-03,41.75,43.25,41.75,43.00,6280000,9.90 -1988-06-02,42.00,42.50,41.50,41.75,4760000,9.61 -1988-06-01,41.50,42.50,41.25,42.50,8200000,9.79 -1988-05-31,40.00,41.50,39.75,41.50,4400000,9.56 -1988-05-27,39.25,40.00,39.00,39.75,3020000,9.15 -1988-05-26,38.50,39.50,38.50,39.38,3076800,9.07 -1988-05-25,39.00,39.75,38.50,38.50,4840000,8.87 -1988-05-24,38.00,39.00,37.75,38.88,5080000,8.95 -1988-05-23,38.50,38.88,37.38,38.00,6560000,8.75 -1988-05-20,39.25,39.50,38.75,38.75,2941200,8.92 -1988-05-19,39.50,39.75,38.50,39.00,8920000,8.98 -1988-05-18,40.50,40.75,39.50,39.75,6240000,9.15 -1988-05-17,41.50,42.00,40.25,40.50,6920000,9.33 -1988-05-16,40.50,41.38,40.00,41.25,2686800,9.50 -1988-05-13,40.25,40.50,40.00,40.50,2566800,9.31 -1988-05-12,39.50,40.25,39.50,39.75,2965600,9.13 -1988-05-11,40.25,40.75,39.50,39.50,6240000,9.08 -1988-05-10,40.50,41.00,40.25,40.88,3439200,9.39 -1988-05-09,41.25,41.25,40.50,40.75,2732000,9.36 -1988-05-06,41.63,41.75,41.25,41.25,3835600,9.48 -1988-05-05,42.00,42.25,41.50,41.75,2536800,9.59 -1988-05-04,41.88,43.13,41.75,42.00,8000000,9.65 -1988-05-03,41.00,42.25,40.75,41.75,4440000,9.59 -1988-05-02,40.75,41.25,40.50,41.00,2944400,9.42 -1988-04-29,41.25,41.50,40.50,41.00,3222000,9.42 -1988-04-28,41.75,42.00,41.25,41.38,3553600,9.51 -1988-04-27,41.75,42.00,41.50,41.75,4520000,9.59 -1988-04-26,41.00,41.75,40.75,41.50,6280000,9.54 -1988-04-25,40.25,41.00,40.00,40.88,5360000,9.39 -1988-04-22,39.75,40.25,39.50,40.13,3846800,9.22 -1988-04-21,40.38,40.50,39.00,39.50,6360000,9.08 -1988-04-20,40.25,40.50,39.25,39.75,7680000,9.13 -1988-04-19,40.13,41.50,40.13,40.25,7596400,9.25 -1988-04-18,39.75,40.75,39.25,40.00,6080000,9.19 -1988-04-15,39.75,40.00,38.50,39.50,8320000,9.08 -1988-04-14,40.50,41.50,39.00,39.50,6720000,9.08 -1988-04-13,41.75,42.00,41.00,41.25,5120000,9.48 -1988-04-12,41.75,42.25,41.25,41.75,6200000,9.59 -1988-04-11,41.75,42.00,41.00,41.50,5320000,9.54 -1988-04-08,40.75,41.75,39.75,41.00,7240000,9.42 -1988-04-07,41.75,42.38,40.75,40.75,5840000,9.36 -1988-04-06,39.50,41.75,39.00,41.75,6800000,9.59 -1988-04-05,39.25,39.50,38.50,39.25,5280000,9.02 -1988-04-04,39.75,40.50,38.50,38.75,6480000,8.91 -1988-03-31,39.75,40.50,39.25,40.00,7760000,9.19 -1988-03-30,40.75,41.25,38.75,39.50,13280000,9.08 -1988-03-29,41.50,42.00,40.63,41.00,7640000,9.42 -1988-03-28,40.00,41.75,39.50,41.50,6160000,9.54 -1988-03-25,40.75,41.25,40.00,40.13,4680000,9.22 -1988-03-24,41.75,42.50,40.00,40.88,11440000,9.39 -1988-03-23,44.00,44.00,41.88,42.50,7480000,9.77 -1988-03-22,44.00,44.50,43.25,44.00,4265600,10.11 -1988-03-21,44.38,44.63,43.00,43.88,8120000,10.08 -1988-03-18,45.00,45.50,44.25,44.75,9720000,10.28 -1988-03-17,46.25,46.50,44.75,45.00,9320000,10.34 -1988-03-16,44.88,46.38,44.50,46.13,4240000,10.60 -1988-03-15,46.00,46.25,44.75,45.00,6480000,10.34 -1988-03-14,45.75,46.50,45.50,46.25,3518000,10.63 -1988-03-11,45.50,45.75,44.50,45.75,5640000,10.51 -1988-03-10,47.00,47.25,45.25,45.25,6320000,10.40 -1988-03-09,46.25,47.25,46.25,46.75,4800000,10.74 -1988-03-08,46.75,47.00,46.00,46.25,5160000,10.63 -1988-03-07,46.75,47.75,46.50,46.88,7400000,10.77 -1988-03-04,46.00,47.00,45.50,46.88,7480000,10.77 -1988-03-03,44.50,47.00,44.50,46.50,16920000,10.69 -1988-03-02,43.75,45.00,43.50,44.75,10440000,10.28 -1988-03-01,43.25,43.50,42.50,43.25,6120000,9.94 -1988-02-29,41.75,43.25,41.50,43.00,4000000,9.88 -1988-02-26,42.00,42.25,41.25,41.75,2952400,9.59 -1988-02-25,42.00,43.00,41.75,41.75,6400000,9.59 -1988-02-24,42.75,43.00,42.00,42.25,5200000,9.71 -1988-02-23,43.25,43.75,42.25,42.75,7880000,9.82 -1988-02-22,41.50,43.63,41.50,43.25,7160000,9.94 -1988-02-19,41.75,42.00,41.50,41.75,3242400,9.59 -1988-02-18,41.63,42.75,41.50,41.75,5120000,9.59 -1988-02-17,41.25,42.50,41.25,41.88,9160000,9.62 -1988-02-16,41.00,41.25,40.00,41.25,5520000,9.48 -1988-02-12,40.63,41.50,40.50,41.00,4920000,9.42 -1988-02-11,41.00,41.25,40.25,40.63,5280000,9.32 -1988-02-10,39.75,41.50,39.75,41.00,8160000,9.40 -1988-02-09,39.00,39.88,38.75,39.75,4160000,9.12 -1988-02-08,38.50,39.25,37.75,38.75,7280000,8.89 -1988-02-05,40.00,40.38,38.50,38.63,4720000,8.86 -1988-02-04,39.50,40.13,39.00,39.75,7120000,9.12 -1988-02-03,41.00,41.25,39.25,39.50,8080000,9.06 -1988-02-02,41.50,41.88,40.50,41.25,6840000,9.46 -1988-02-01,41.75,42.50,41.38,41.75,7120000,9.58 -1988-01-29,41.50,41.75,40.25,41.50,9480000,9.52 -1988-01-28,40.00,41.50,39.75,41.25,8320000,9.46 -1988-01-27,40.25,40.50,38.75,39.75,9240000,9.12 -1988-01-26,40.75,41.00,39.25,39.75,5120000,9.12 -1988-01-25,39.50,41.50,39.50,40.88,7160000,9.38 -1988-01-22,40.50,40.75,38.25,39.25,15920000,9.00 -1988-01-21,40.50,40.75,39.38,40.13,17640000,9.20 -1988-01-20,43.00,43.00,38.25,39.75,24320000,9.12 -1988-01-19,42.25,43.25,41.38,42.75,9800000,9.80 -1988-01-18,43.00,43.00,42.00,42.75,4480000,9.80 -1988-01-15,43.50,45.00,42.50,42.88,12280000,9.83 -1988-01-14,42.75,42.88,42.00,42.25,4720000,9.69 -1988-01-13,42.00,43.25,41.13,42.25,7560000,9.69 -1988-01-12,43.00,43.50,39.75,42.00,14320000,9.63 -1988-01-11,40.00,42.75,39.75,42.50,14440000,9.75 -1988-01-08,44.50,45.25,39.50,40.00,17360000,9.17 -1988-01-07,43.50,44.75,42.50,44.50,7600000,10.21 -1988-01-06,45.00,45.00,43.75,43.75,9600000,10.03 -1988-01-05,46.00,46.25,44.25,44.63,11040000,10.24 -1988-01-04,42.75,44.75,42.25,44.75,11800000,10.26 -1987-12-31,42.50,43.00,41.88,42.00,4200000,9.63 -1987-12-30,42.50,43.75,42.50,43.38,5560000,9.95 -1987-12-29,40.50,42.25,40.25,42.13,4240000,9.66 -1987-12-28,42.25,42.50,39.50,40.25,8200000,9.23 -1987-12-24,42.00,43.00,41.75,42.63,2508000,9.78 -1987-12-23,41.75,42.75,41.25,42.25,6120000,9.69 -1987-12-22,41.75,41.75,40.50,41.50,4600000,9.52 -1987-12-21,40.50,41.75,40.25,41.75,6720000,9.58 -1987-12-18,39.50,41.25,39.25,40.50,10800000,9.29 -1987-12-17,40.50,40.75,39.25,39.25,11640000,9.00 -1987-12-16,37.75,39.75,37.25,39.25,11800000,9.00 -1987-12-15,37.75,38.25,37.00,37.50,10680000,8.60 -1987-12-14,34.50,37.50,34.25,37.25,12200000,8.54 -1987-12-11,34.75,34.75,33.50,34.00,4360000,7.80 -1987-12-10,33.75,36.00,33.25,34.75,9880000,7.97 -1987-12-09,34.50,36.25,33.88,35.00,6400000,8.03 -1987-12-08,33.50,34.88,33.25,34.50,9080000,7.91 -1987-12-07,31.00,33.25,31.00,33.00,7280000,7.57 -1987-12-04,30.25,31.25,29.75,30.75,8720000,7.05 -1987-12-03,33.00,33.38,29.75,30.50,11400000,7.00 -1987-12-02,33.25,33.50,32.50,32.50,5080000,7.45 -1987-12-01,33.50,34.00,32.75,33.25,6480000,7.63 -1987-11-30,33.75,34.50,30.50,33.00,14880000,7.57 -1987-11-27,36.25,36.50,34.75,35.00,2526800,8.03 -1987-11-25,37.00,37.00,36.00,36.50,3311200,8.37 -1987-11-24,36.75,37.75,36.13,37.00,7040000,8.49 -1987-11-23,35.50,36.25,34.75,36.25,3500000,8.31 -1987-11-20,34.00,36.00,33.25,35.50,8960000,8.14 -1987-11-19,36.50,36.50,34.00,34.50,6520000,7.91 -1987-11-18,35.75,36.50,34.50,36.25,9480000,8.31 -1987-11-17,36.75,37.00,35.00,35.00,9600000,8.03 -1987-11-16,37.75,38.50,36.50,36.75,6600000,8.41 -1987-11-13,39.25,39.50,37.00,37.25,5520000,8.52 -1987-11-12,38.50,40.00,38.38,38.75,8800000,8.87 -1987-11-11,37.25,38.25,36.75,37.25,6640000,8.52 -1987-11-10,36.50,37.50,36.00,36.25,8280000,8.30 -1987-11-09,37.00,37.50,36.25,37.25,7520000,8.52 -1987-11-06,38.25,39.50,37.00,37.75,6680000,8.64 -1987-11-05,36.25,38.75,36.25,38.00,9120000,8.70 -1987-11-04,35.50,37.25,34.75,36.00,8360000,8.24 -1987-11-03,38.00,38.50,34.25,36.25,11200000,8.30 -1987-11-02,38.75,39.50,37.50,38.75,6720000,8.87 -1987-10-30,40.00,43.00,38.50,38.63,15040000,8.84 -1987-10-29,34.25,40.00,32.25,39.50,11840000,9.04 -1987-10-28,30.75,33.75,29.25,33.50,14960000,7.67 -1987-10-27,29.50,32.25,29.00,30.25,16280000,6.92 -1987-10-26,34.50,35.00,27.62,28.00,11200000,6.41 -1987-10-23,35.75,36.50,34.25,35.50,7080000,8.12 -1987-10-22,39.25,40.50,36.00,36.75,13760000,8.41 -1987-10-21,38.50,42.00,38.00,40.50,19080000,9.27 -1987-10-20,38.50,42.00,32.63,34.50,20320000,7.90 -1987-10-19,48.25,48.25,35.50,36.50,17000000,8.35 -1987-10-16,52.25,53.00,47.50,48.25,15000000,11.04 -1987-10-15,53.25,54.50,51.75,52.00,12440000,11.90 -1987-10-14,53.75,54.00,52.00,53.25,9240000,12.19 -1987-10-13,54.50,54.75,53.25,54.50,5800000,12.47 -1987-10-12,54.25,54.38,51.75,53.25,7120000,12.19 -1987-10-09,54.25,55.50,54.00,54.13,5200000,12.39 -1987-10-08,55.50,56.00,53.25,54.25,5880000,12.42 -1987-10-07,55.50,55.75,54.25,55.50,8000000,12.70 -1987-10-06,59.50,59.50,55.50,55.75,7200000,12.76 -1987-10-05,58.50,59.75,57.75,59.25,4800000,13.56 -1987-10-02,58.25,58.75,57.50,58.50,3450000,13.39 -1987-10-01,56.75,58.75,56.50,58.25,4160000,13.33 -1987-09-30,54.25,57.00,54.25,56.50,4360000,12.93 -1987-09-29,56.00,56.00,54.25,54.50,6120000,12.47 -1987-09-28,57.50,58.75,55.50,55.75,7280000,12.76 -1987-09-25,56.75,58.00,56.50,57.50,3806800,13.16 -1987-09-24,55.25,57.88,55.25,56.50,6520000,12.93 -1987-09-23,54.13,56.00,53.75,55.25,9098800,12.64 -1987-09-22,50.50,54.25,50.25,54.13,5480000,12.39 -1987-09-21,51.75,52.75,50.25,50.25,4600000,11.50 -1987-09-18,52.00,52.25,51.38,51.75,2555600,11.84 -1987-09-17,52.00,52.25,51.00,52.00,2400000,11.90 -1987-09-16,51.75,52.63,51.25,51.75,6000000,11.84 -1987-09-15,53.00,53.00,51.50,51.75,3744800,11.84 -1987-09-14,54.75,55.25,52.75,53.00,2928000,12.13 -1987-09-11,54.00,55.50,52.75,54.50,4440000,12.47 -1987-09-10,53.25,54.50,53.13,53.75,5000000,12.30 -1987-09-09,50.25,53.00,49.50,52.75,5640000,12.07 -1987-09-08,50.25,50.50,48.50,49.88,6280000,11.42 -1987-09-04,51.25,51.75,50.00,50.50,3891200,11.56 -1987-09-03,52.50,52.75,50.25,51.25,6600000,11.73 -1987-09-02,52.00,53.25,50.75,52.00,8200000,11.90 -1987-09-01,54.75,55.25,52.50,52.50,4960000,12.01 -1987-08-31,52.25,54.25,51.75,54.00,5360000,12.36 -1987-08-28,52.00,52.50,51.50,52.00,3434400,11.90 -1987-08-27,52.25,52.75,51.50,52.00,4440000,11.90 -1987-08-26,53.00,53.50,52.00,52.00,7000000,11.90 -1987-08-25,52.75,53.25,52.00,52.00,4880000,11.90 -1987-08-24,53.00,53.50,52.25,52.25,4320000,11.96 -1987-08-21,51.75,53.75,51.50,53.00,5000000,12.13 -1987-08-20,50.25,52.50,49.75,51.75,6280000,11.84 -1987-08-19,49.50,50.00,49.00,50.00,2404400,11.44 -1987-08-18,49.25,49.50,48.25,48.75,8480000,11.16 -1987-08-17,49.50,50.00,48.75,49.50,5200000,11.33 -1987-08-14,48.50,50.00,48.00,49.00,3758800,11.21 -1987-08-13,48.75,50.25,48.50,49.00,7000000,11.21 -1987-08-12,49.50,49.75,48.25,48.75,5760000,11.16 -1987-08-11,49.50,50.25,48.75,49.50,9680000,11.33 -1987-08-10,48.25,48.25,45.75,48.25,2800000,11.04 -1987-08-07,46.25,47.25,46.00,46.50,5440000,10.63 -1987-08-06,43.25,46.75,42.75,46.25,9000000,10.57 -1987-08-05,42.25,43.50,42.00,43.25,4640000,9.89 -1987-08-04,40.50,42.25,40.00,42.25,4320000,9.66 -1987-08-03,41.00,41.50,40.25,40.25,2275600,9.20 -1987-07-31,41.25,42.00,41.25,41.25,2613600,9.43 -1987-07-30,41.00,41.50,40.75,41.50,3727600,9.49 -1987-07-29,42.00,42.00,40.50,41.00,3534800,9.37 -1987-07-28,42.50,42.75,41.75,41.88,2660800,9.57 -1987-07-27,42.50,43.00,42.00,42.25,2035600,9.66 -1987-07-24,41.50,42.75,41.50,42.50,4200000,9.71 -1987-07-23,43.00,43.50,40.50,41.75,2685600,9.54 -1987-07-22,41.50,42.75,41.25,42.50,2185200,9.71 -1987-07-21,42.00,42.50,41.25,41.38,3966400,9.46 -1987-07-20,43.00,43.25,41.50,41.75,4440000,9.54 -1987-07-17,44.25,44.75,42.75,43.25,3300000,9.89 -1987-07-16,44.00,44.00,43.25,44.00,3388000,10.06 -1987-07-15,43.00,44.75,42.25,44.00,9680000,10.06 -1987-07-14,41.00,43.00,41.00,43.00,9200000,9.83 -1987-07-13,39.00,40.75,38.75,40.50,9120000,9.26 -1987-07-10,38.00,39.25,37.75,38.00,5600000,8.69 -1987-07-09,37.25,38.75,37.25,37.75,8560000,8.63 -1987-07-08,39.25,39.25,36.50,37.25,12200000,8.51 -1987-07-07,40.50,41.00,38.75,39.25,7280000,8.97 -1987-07-06,40.75,41.75,40.50,40.75,3060800,9.31 -1987-07-02,40.00,41.00,39.75,40.63,2931200,9.29 -1987-07-01,40.75,40.75,39.75,40.00,3402000,9.14 -1987-06-30,40.50,41.00,39.75,40.50,5160000,9.26 -1987-06-29,40.50,40.75,40.00,40.75,3628000,9.31 -1987-06-26,40.75,41.50,40.00,40.50,4560000,9.26 -1987-06-25,42.00,42.50,40.50,40.50,4320000,9.26 -1987-06-24,41.50,43.25,40.50,42.00,4240000,9.60 -1987-06-23,42.00,42.13,40.75,41.25,2892000,9.43 -1987-06-22,41.25,42.25,40.88,42.00,6040000,9.60 -1987-06-19,41.50,41.75,40.38,41.00,4480000,9.37 -1987-06-18,40.25,41.75,39.50,41.50,8200000,9.49 -1987-06-17,41.50,42.50,40.00,40.50,10640000,9.26 -1987-06-16,41.50,41.75,38.00,41.50,12240000,9.49 -1987-06-15,79.00,79.50,77.50,78.50,9280000,8.97 -1987-06-12,79.00,79.75,78.75,79.00,3653600,9.03 -1987-06-11,78.50,80.00,78.00,79.00,4521600,9.03 -1987-06-10,78.75,80.25,78.00,78.50,5235200,8.97 -1987-06-09,77.50,79.50,77.50,78.50,4570400,8.97 -1987-06-08,77.75,78.00,76.75,77.75,7213600,8.89 -1987-06-05,78.75,78.75,77.75,77.75,4696000,8.89 -1987-06-04,78.00,78.75,77.00,78.50,5511200,8.97 -1987-06-03,77.25,79.50,77.25,77.75,6140000,8.89 -1987-06-02,77.50,78.00,77.00,77.25,4927200,8.83 -1987-06-01,79.50,79.50,77.50,77.75,2984000,8.89 -1987-05-29,80.25,80.50,79.00,79.00,3322400,9.03 -1987-05-28,79.50,80.25,78.50,80.00,5424000,9.14 -1987-05-27,78.00,80.25,77.50,79.50,6484000,9.09 -1987-05-26,74.50,78.00,74.00,78.00,5481600,8.91 -1987-05-22,75.00,75.50,73.75,74.12,3484000,8.47 -1987-05-21,74.75,75.75,74.50,74.50,6233600,8.51 -1987-05-20,73.00,75.00,72.50,74.50,10320000,8.51 -1987-05-19,75.75,75.75,72.62,73.25,8560000,8.37 -1987-05-18,78.25,78.50,75.50,75.75,8640000,8.66 -1987-05-15,79.25,79.25,78.00,78.25,5220000,8.94 -1987-05-14,78.25,79.50,78.25,79.25,5316000,9.06 -1987-05-13,75.75,78.62,75.50,78.50,11120000,8.97 -1987-05-12,76.00,76.50,75.00,75.50,9280000,8.63 -1987-05-11,77.00,79.50,76.75,77.00,7048800,8.80 -1987-05-08,80.50,81.00,79.00,79.00,6618400,9.01 -1987-05-07,79.75,81.00,79.75,80.25,6488800,9.16 -1987-05-06,80.50,82.25,79.25,80.00,10240000,9.13 -1987-05-05,80.00,80.75,78.00,80.25,8240000,9.16 -1987-05-04,79.50,80.25,79.00,79.75,5095200,9.10 -1987-05-01,79.50,80.00,78.75,80.00,4751200,9.13 -1987-04-30,78.00,80.00,77.75,79.25,9040000,9.04 -1987-04-29,77.25,79.75,77.00,77.75,10400000,8.87 -1987-04-28,75.75,77.87,75.50,77.00,11600000,8.79 -1987-04-27,74.25,75.25,73.25,75.00,13680000,8.56 -1987-04-24,75.75,76.50,74.50,74.75,9120000,8.53 -1987-04-23,74.25,77.25,74.25,76.00,10880000,8.67 -1987-04-22,76.62,77.00,74.00,74.25,14400000,8.47 -1987-04-21,70.25,75.00,69.50,74.75,15440000,8.53 -1987-04-20,71.50,72.75,70.75,71.12,5353600,8.12 -1987-04-16,71.25,73.25,71.00,71.50,12400000,8.16 -1987-04-15,69.50,71.00,68.75,71.00,12480000,8.10 -1987-04-14,66.75,69.75,66.50,68.00,14560000,7.76 -1987-04-13,70.00,70.25,67.50,67.50,5101600,7.70 -1987-04-10,71.25,71.50,69.75,70.25,7791200,8.02 -1987-04-09,68.75,71.50,67.75,71.00,8480000,8.10 -1987-04-08,67.75,70.25,67.50,69.00,8240000,7.87 -1987-04-07,69.75,70.25,67.75,67.75,9280000,7.73 -1987-04-06,71.50,72.75,69.25,70.00,10320000,7.99 -1987-04-03,71.50,71.87,70.25,71.75,19280000,8.19 -1987-04-02,68.25,71.75,67.00,71.75,27760000,8.19 -1987-04-01,63.00,67.00,62.38,66.75,7792800,7.62 -1987-03-31,62.25,64.75,62.25,64.50,9760000,7.36 -1987-03-30,63.50,64.25,62.25,62.50,9280000,7.13 -1987-03-27,67.25,67.50,64.75,65.00,4817600,7.42 -1987-03-26,66.75,67.75,66.50,67.25,5146400,7.67 -1987-03-25,66.50,67.00,65.25,66.75,9760000,7.62 -1987-03-24,67.75,68.50,66.25,66.25,9600000,7.56 -1987-03-23,68.00,68.25,66.25,67.50,8800000,7.70 -1987-03-20,68.25,69.75,68.25,68.25,12400000,7.79 -1987-03-19,65.75,68.50,65.50,68.37,7396000,7.80 -1987-03-18,67.25,67.50,64.75,66.00,10800000,7.53 -1987-03-17,65.50,68.00,65.00,67.00,8720000,7.65 -1987-03-16,63.50,65.25,62.50,65.25,8800000,7.45 -1987-03-13,65.25,66.00,63.50,63.50,7067200,7.25 -1987-03-12,66.00,66.25,63.63,65.25,10800000,7.45 -1987-03-11,67.25,68.00,66.25,66.25,7826400,7.56 -1987-03-10,64.50,66.87,64.50,66.75,8720000,7.62 -1987-03-09,66.50,66.75,64.50,64.62,9120000,7.37 -1987-03-06,67.25,68.37,66.75,67.25,6332800,7.67 -1987-03-05,67.50,69.00,67.25,68.50,12080000,7.82 -1987-03-04,65.75,68.25,65.37,67.62,16000000,7.72 -1987-03-03,67.50,68.12,64.75,65.00,15600000,7.42 -1987-03-02,70.25,70.50,67.00,67.50,14160000,7.70 -1987-02-27,69.12,71.00,67.75,70.00,14480000,7.99 -1987-02-26,69.50,71.37,68.00,69.12,17840000,7.89 -1987-02-25,65.50,69.50,64.62,69.12,16240000,7.89 -1987-02-24,63.25,66.00,63.13,65.50,12720000,7.47 -1987-02-23,60.88,64.25,59.63,63.13,12560000,7.20 -1987-02-20,62.38,62.50,60.63,61.25,6813600,6.99 -1987-02-19,63.50,63.50,61.75,62.38,11200000,7.12 -1987-02-18,66.62,67.37,63.38,63.50,16800000,7.25 -1987-02-17,62.13,66.50,61.88,66.37,14640000,7.57 -1987-02-13,58.63,62.50,58.00,62.13,18240000,7.09 -1987-02-12,57.00,59.88,57.00,58.63,25360000,6.69 -1987-02-11,53.00,56.75,52.75,56.50,12240000,6.45 -1987-02-10,52.50,52.75,51.63,52.75,5977600,6.02 -1987-02-09,52.88,53.38,52.25,52.63,5611200,6.01 -1987-02-06,54.00,54.00,52.88,54.00,10480000,6.16 -1987-02-05,55.00,55.13,53.13,53.88,12160000,6.15 -1987-02-04,55.50,55.50,54.38,55.00,7791200,6.28 -1987-02-03,56.00,56.13,54.75,55.50,6412800,6.33 -1987-02-02,55.50,56.00,54.25,55.88,8800000,6.38 -1987-01-30,54.00,55.88,52.63,55.50,14640000,6.33 -1987-01-29,55.88,57.25,53.38,54.13,19920000,6.18 -1987-01-28,53.00,55.75,52.13,55.38,14800000,6.32 -1987-01-27,50.00,53.13,49.88,52.75,13520000,6.02 -1987-01-26,50.00,50.50,49.50,49.75,12560000,5.68 -1987-01-23,52.50,53.00,50.25,50.25,16400000,5.73 -1987-01-22,48.88,52.63,48.50,52.50,16880000,5.99 -1987-01-21,50.88,51.13,49.00,49.00,19040000,5.59 -1987-01-20,55.00,55.75,51.50,51.63,27680000,5.89 -1987-01-19,48.75,53.13,47.88,53.13,12960000,6.06 -1987-01-16,50.00,50.00,47.75,48.75,14560000,5.56 -1987-01-15,48.25,51.38,48.00,49.88,19520000,5.69 -1987-01-14,44.63,48.25,44.50,48.13,18000000,5.49 -1987-01-13,45.13,45.38,44.63,44.63,7584800,5.09 -1987-01-12,45.50,45.75,44.75,45.50,8320000,5.19 -1987-01-09,44.75,45.75,44.38,45.38,8560000,5.18 -1987-01-08,44.75,45.13,44.50,44.75,10400000,5.11 -1987-01-07,43.88,44.88,43.63,44.75,15520000,5.11 -1987-01-06,43.13,44.00,42.63,43.75,11600000,4.99 -1987-01-05,41.25,43.25,41.00,43.00,8560000,4.91 -1987-01-02,40.38,41.13,40.13,40.88,4360000,4.66 -1986-12-31,41.00,41.38,40.38,40.50,4742400,4.62 -1986-12-30,40.50,41.50,40.38,41.00,5297600,4.68 -1986-12-29,41.00,41.13,40.25,40.50,4224800,4.62 -1986-12-26,41.88,41.88,41.00,41.00,3215200,4.68 -1986-12-24,42.00,42.13,41.63,41.88,3453600,4.78 -1986-12-23,42.25,42.38,41.88,42.13,8720000,4.81 -1986-12-22,42.00,42.50,41.75,42.13,5887200,4.81 -1986-12-19,41.38,42.50,41.38,42.13,7149600,4.81 -1986-12-18,41.13,41.88,40.75,41.38,6258400,4.72 -1986-12-17,42.38,42.50,40.88,41.25,5417600,4.71 -1986-12-16,41.63,42.50,41.63,42.50,5464000,4.85 -1986-12-15,41.00,41.75,40.38,41.75,7481600,4.76 -1986-12-12,42.88,43.00,41.25,41.25,6451200,4.71 -1986-12-11,43.63,43.88,42.63,42.88,8080000,4.89 -1986-12-10,42.38,43.75,42.00,43.50,8720000,4.96 -1986-12-09,42.38,42.63,41.13,42.38,10800000,4.84 -1986-12-08,43.63,43.88,42.38,42.50,12400000,4.85 -1986-12-05,42.63,43.75,42.50,43.75,9360000,4.99 -1986-12-04,42.63,42.75,42.00,42.50,9600000,4.85 -1986-12-03,41.63,43.00,41.50,42.75,12000000,4.88 -1986-12-02,40.50,41.75,40.00,41.50,13200000,4.74 -1986-12-01,40.00,40.13,39.13,40.13,12400000,4.58 -1986-11-28,40.50,40.63,39.63,40.00,7897600,4.56 -1986-11-26,40.13,41.25,40.00,40.50,18080000,4.62 -1986-11-25,38.00,40.38,38.00,40.25,30320000,4.59 -1986-11-24,36.25,38.13,36.00,38.00,13440000,4.34 -1986-11-21,35.25,36.25,35.13,36.00,10240000,4.11 -1986-11-20,34.88,35.38,34.88,35.25,10560000,4.02 -1986-11-19,35.13,35.25,34.50,35.00,10800000,3.99 -1986-11-18,36.38,36.75,35.13,35.38,6115200,4.04 -1986-11-17,35.25,37.00,35.00,36.38,5071200,4.15 -1986-11-14,35.50,35.50,34.88,35.25,4840000,4.02 -1986-11-13,36.50,36.50,35.50,35.50,4928800,4.05 -1986-11-12,35.75,36.63,35.63,36.63,4700000,4.18 -1986-11-11,35.50,35.75,35.25,35.50,1809600,4.05 -1986-11-10,35.88,35.88,35.13,35.38,3793600,4.04 -1986-11-07,36.00,36.13,34.88,35.75,5153600,4.08 -1986-11-06,36.63,36.88,35.75,36.13,11840000,4.12 -1986-11-05,35.75,37.13,35.50,37.00,22320000,4.22 -1986-11-04,34.88,35.88,33.88,35.75,8800000,4.08 -1986-11-03,34.75,35.13,34.63,35.00,5457600,3.99 -1986-10-31,34.25,34.88,34.25,34.63,4338400,3.95 -1986-10-30,33.50,34.75,33.38,34.25,10480000,3.91 -1986-10-29,33.50,33.50,33.13,33.38,3057600,3.81 -1986-10-28,34.00,34.13,33.00,33.38,5102400,3.81 -1986-10-27,33.50,34.00,33.25,34.00,5422400,3.88 -1986-10-24,33.13,33.25,32.75,33.00,2718400,3.77 -1986-10-23,32.50,33.13,32.50,33.13,4441600,3.78 -1986-10-22,32.75,32.88,32.25,32.50,3382400,3.71 -1986-10-21,33.00,33.00,32.63,32.75,4096000,3.74 -1986-10-20,33.50,33.63,32.88,32.88,5344000,3.75 -1986-10-17,33.75,34.00,33.38,33.63,5460000,3.84 -1986-10-16,33.38,33.88,33.25,33.63,4876000,3.84 -1986-10-15,33.50,33.50,32.75,33.38,7367200,3.81 -1986-10-14,34.63,35.25,33.75,34.00,7164000,3.88 -1986-10-13,33.13,34.63,33.00,34.63,3582400,3.95 -1986-10-10,32.88,33.38,32.38,33.25,2096000,3.79 -1986-10-09,32.75,33.25,32.63,33.00,2820000,3.77 -1986-10-08,32.88,33.00,32.25,32.75,4021600,3.74 -1986-10-07,34.00,34.13,32.88,33.00,4577600,3.77 -1986-10-06,33.75,34.25,33.63,34.13,3384000,3.89 -1986-10-03,34.38,34.75,33.38,33.75,4997600,3.85 -1986-10-02,33.75,34.38,33.50,34.13,3401600,3.89 -1986-10-01,33.38,34.50,33.38,34.13,4988800,3.89 -1986-09-30,32.88,33.88,32.63,33.50,6488800,3.82 -1986-09-29,33.63,33.88,31.62,32.50,7475200,3.71 -1986-09-26,34.13,34.38,33.88,34.25,2512800,3.91 -1986-09-25,35.13,35.25,33.63,34.50,6744800,3.94 -1986-09-24,36.13,36.38,34.00,35.13,6360000,4.01 -1986-09-23,35.25,36.25,35.13,36.13,12080000,4.12 -1986-09-22,33.50,35.38,33.50,35.25,8560000,4.02 -1986-09-19,33.75,33.88,33.25,33.63,4601600,3.84 -1986-09-18,34.25,34.50,33.75,34.00,3546400,3.88 -1986-09-17,34.88,35.00,34.25,34.25,4181600,3.91 -1986-09-16,33.13,35.13,32.50,34.88,8800000,3.98 -1986-09-15,32.25,33.13,32.00,33.13,7973600,3.78 -1986-09-12,32.50,32.75,31.75,31.75,8160000,3.62 -1986-09-11,34.63,34.75,32.50,32.63,4842400,3.72 -1986-09-10,35.63,35.88,34.75,35.00,2737600,3.99 -1986-09-09,34.63,36.00,34.63,35.75,5398400,4.08 -1986-09-08,35.00,35.00,33.63,34.75,4522400,3.97 -1986-09-05,35.63,35.88,35.00,35.13,3561600,4.01 -1986-09-04,35.00,35.50,34.75,35.50,7133600,4.05 -1986-09-03,34.75,34.88,34.13,34.75,4216000,3.97 -1986-09-02,37.13,37.13,34.75,34.75,8320000,3.97 -1986-08-29,37.63,38.00,36.88,37.00,4846400,4.22 -1986-08-28,37.00,38.00,36.88,37.75,7849600,4.31 -1986-08-27,36.63,37.00,36.25,37.00,5280000,4.22 -1986-08-26,36.38,36.88,36.38,36.63,4713600,4.18 -1986-08-25,36.50,36.88,36.38,36.38,4533600,4.15 -1986-08-22,35.88,36.63,35.88,36.25,4162400,4.14 -1986-08-21,36.13,36.38,35.75,35.75,6992800,4.08 -1986-08-20,35.25,36.50,35.25,36.25,6140000,4.14 -1986-08-19,35.13,35.50,34.63,35.38,4944000,4.04 -1986-08-18,35.75,35.88,35.00,35.38,5297600,4.04 -1986-08-15,36.13,36.50,35.63,35.75,4910400,4.08 -1986-08-14,36.00,37.00,36.00,36.00,8240000,4.11 -1986-08-13,34.25,36.25,34.25,36.00,16240000,4.11 -1986-08-12,33.38,34.38,33.38,34.25,8720000,3.91 -1986-08-11,31.87,33.50,31.75,33.50,6591200,3.82 -1986-08-08,31.87,32.38,31.62,31.62,3941600,3.61 -1986-08-07,31.12,32.63,31.12,31.75,6211200,3.62 -1986-08-06,32.13,32.13,31.00,31.12,6644800,3.55 -1986-08-05,31.62,32.38,31.50,32.13,4238400,3.67 -1986-08-04,31.37,31.50,30.62,31.50,4653600,3.59 -1986-08-01,31.12,31.75,31.12,31.37,5360000,3.58 -1986-07-31,30.50,31.50,30.50,31.25,10080000,3.57 -1986-07-30,31.25,31.50,30.00,30.50,9120000,3.48 -1986-07-29,32.25,32.25,30.75,31.25,21280000,3.57 -1986-07-28,33.88,34.00,32.25,32.38,8800000,3.69 -1986-07-25,33.13,34.00,33.00,34.00,7769600,3.88 -1986-07-24,34.25,34.38,33.00,33.13,5187200,3.78 -1986-07-23,34.63,34.63,34.13,34.13,6416000,3.89 -1986-07-22,33.50,34.63,33.25,34.63,8560000,3.95 -1986-07-21,33.00,33.75,32.75,33.50,8160000,3.82 -1986-07-18,32.25,32.50,31.25,31.75,11040000,3.62 -1986-07-17,33.50,33.75,32.13,32.25,8960000,3.68 -1986-07-16,35.50,35.63,32.75,33.50,19280000,3.82 -1986-07-15,35.00,35.00,34.25,34.88,10640000,3.98 -1986-07-14,37.13,37.38,36.25,36.25,8480000,4.14 -1986-07-11,35.38,37.75,35.25,37.13,8000000,4.24 -1986-07-10,34.75,35.38,34.63,35.38,7453600,4.04 -1986-07-09,34.25,34.75,34.00,34.63,13040000,3.95 -1986-07-08,35.25,35.25,34.13,34.25,9782400,3.91 -1986-07-07,37.63,37.75,35.38,35.63,6501600,4.07 -1986-07-03,36.13,37.75,35.63,37.63,6509600,4.29 -1986-07-02,35.38,36.25,35.38,36.13,5202400,4.12 -1986-07-01,35.88,36.13,34.75,35.38,3140000,4.04 -1986-06-30,35.88,36.25,35.75,35.88,2553600,4.09 -1986-06-27,36.25,36.75,35.50,35.88,1811200,4.09 -1986-06-26,35.88,36.38,35.50,36.25,4184800,4.14 -1986-06-25,35.00,36.00,35.00,35.88,4755200,4.09 -1986-06-24,34.75,35.13,34.38,34.88,5088800,3.98 -1986-06-23,36.00,36.25,34.63,34.75,4196000,3.97 -1986-06-20,35.00,36.13,35.00,36.00,5761600,4.11 -1986-06-19,34.25,35.75,33.88,35.00,12347200,3.99 -1986-06-18,34.25,34.75,32.50,34.25,15381600,3.91 -1986-06-17,35.88,36.00,34.00,34.25,7936000,3.91 -1986-06-16,36.38,36.88,35.63,35.88,6222400,4.09 -1986-06-13,36.00,36.38,35.25,36.38,5144800,4.15 -1986-06-12,36.13,36.38,36.00,36.00,4638400,4.11 -1986-06-11,36.00,36.25,35.50,36.13,6692800,4.12 -1986-06-10,36.00,36.00,35.13,36.00,8827200,4.11 -1986-06-09,37.75,37.88,35.88,36.00,8835200,4.11 -1986-06-06,38.88,38.88,37.50,37.75,6342400,4.31 -1986-06-05,38.75,39.13,38.50,38.88,5282400,4.44 -1986-06-04,37.88,38.88,37.75,38.75,10747200,4.42 -1986-06-03,37.13,38.13,37.13,37.88,11661600,4.32 -1986-06-02,37.00,37.38,36.75,37.13,7158400,4.24 -1986-05-30,37.00,37.25,36.50,37.00,4591200,4.22 -1986-05-29,37.25,37.25,36.50,37.00,3635200,4.22 -1986-05-28,36.88,37.50,36.75,37.25,7418400,4.25 -1986-05-27,37.00,37.00,36.38,36.88,3058400,4.21 -1986-05-23,36.75,37.13,36.38,37.00,5013600,4.22 -1986-05-22,37.00,37.50,35.75,36.75,7895200,4.19 -1986-05-21,35.38,37.25,35.00,37.00,12418400,4.22 -1986-05-20,35.63,35.63,34.25,35.38,8811200,4.04 -1986-05-19,36.00,36.50,35.50,35.63,7506400,4.07 -1986-05-16,36.00,36.25,35.13,36.00,11424800,4.11 -1986-05-15,36.88,37.00,35.63,36.00,7964000,4.11 -1986-05-14,36.00,37.38,36.00,36.88,17277600,4.21 -1986-05-13,36.38,36.50,35.25,36.00,16876000,4.11 -1986-05-12,33.38,36.63,33.25,36.38,14335200,4.15 -1986-05-09,33.00,33.63,32.75,33.38,7961600,3.81 -1986-05-08,31.50,33.13,31.50,33.00,8342400,3.77 -1986-05-07,32.63,32.88,31.25,31.50,7133600,3.59 -1986-05-06,32.25,33.25,32.25,32.63,7829600,3.72 -1986-05-05,30.50,32.50,30.50,32.13,5364000,3.67 -1986-05-02,30.25,31.00,30.12,30.50,3377600,3.48 -1986-05-01,30.25,30.25,29.75,30.25,9218400,3.45 -1986-04-30,31.25,31.62,30.25,30.25,4944000,3.45 -1986-04-29,32.00,32.25,26.87,31.25,4750400,3.57 -1986-04-28,32.25,32.75,31.75,32.00,5241600,3.65 -1986-04-25,31.37,32.63,31.37,32.25,9348800,3.68 -1986-04-24,29.62,31.50,29.50,31.37,16398400,3.58 -1986-04-23,29.87,30.37,29.37,29.62,9371200,3.38 -1986-04-22,30.37,31.25,29.62,29.87,11726400,3.41 -1986-04-21,29.87,30.75,29.87,30.37,9775200,3.47 -1986-04-18,29.00,29.87,28.75,29.75,8871200,3.39 -1986-04-17,28.25,29.12,28.00,29.00,9672800,3.31 -1986-04-16,27.37,28.50,27.37,28.25,7535200,3.22 -1986-04-15,26.87,27.50,26.87,27.37,4722400,3.12 -1986-04-14,27.00,27.25,26.75,26.87,3076000,3.07 -1986-04-11,27.25,27.50,27.00,27.00,2737600,3.08 -1986-04-10,27.12,27.37,26.87,27.25,3932800,3.11 -1986-04-09,27.62,27.75,26.87,27.12,4851200,3.09 -1986-04-08,27.25,27.75,27.25,27.62,6912800,3.15 -1986-04-07,26.75,27.50,26.25,27.25,4318400,3.11 -1986-04-04,27.00,27.00,26.62,26.75,4508800,3.05 -1986-04-03,27.25,27.62,26.87,27.00,7548800,3.08 -1986-04-02,27.25,27.37,26.25,27.25,11627200,3.11 -1986-04-01,28.25,28.25,27.00,27.25,7973600,3.11 -1986-03-31,28.25,28.50,28.00,28.25,6744800,3.22 -1986-03-27,28.25,29.00,28.25,28.25,7856000,3.22 -1986-03-26,27.87,28.75,27.87,28.25,7941600,3.22 -1986-03-25,26.75,27.87,26.75,27.87,10060000,3.18 -1986-03-24,27.62,27.62,26.37,26.75,10528800,3.05 -1986-03-21,28.25,28.75,27.50,27.62,9309600,3.15 -1986-03-20,28.00,29.62,28.00,28.25,32318400,3.22 -1986-03-19,26.87,27.25,26.37,26.50,6816000,3.02 -1986-03-18,26.00,27.25,25.87,26.87,8920000,3.07 -1986-03-17,26.00,26.00,25.37,26.00,4240000,2.97 -1986-03-14,24.75,26.25,24.75,26.12,13781600,2.98 -1986-03-13,24.75,25.00,24.37,24.75,4176000,2.82 -1986-03-12,24.87,25.12,24.75,24.75,3071200,2.82 -1986-03-11,24.62,24.87,24.50,24.87,3681600,2.84 -1986-03-10,24.75,24.87,24.62,24.62,2727200,2.81 -1986-03-07,25.37,25.37,24.75,24.75,3477600,2.82 -1986-03-06,25.25,25.75,25.12,25.37,3630400,2.89 -1986-03-05,24.62,25.50,24.25,25.25,6324000,2.88 -1986-03-04,24.62,25.00,24.50,24.62,3217600,2.81 -1986-03-03,25.00,25.12,24.50,24.62,3912800,2.81 -1986-02-28,25.62,25.87,24.87,25.00,4507200,2.85 -1986-02-27,26.00,26.12,25.50,25.62,3873600,2.92 -1986-02-26,26.37,26.75,26.00,26.00,5907200,2.97 -1986-02-25,25.75,26.37,25.12,26.37,8041600,3.01 -1986-02-24,25.25,25.75,25.00,25.75,8840000,2.94 -1986-02-21,25.12,25.75,25.12,25.25,6771200,2.88 -1986-02-20,25.00,25.37,24.87,25.12,4951200,2.87 -1986-02-19,23.87,25.50,23.87,25.00,12871200,2.85 -1986-02-18,23.75,24.00,23.25,23.87,5295200,2.72 -1986-02-14,23.87,24.12,23.75,23.75,4928800,2.71 -1986-02-13,24.00,24.00,23.75,23.87,3944000,2.72 -1986-02-12,23.87,24.00,23.75,24.00,4770400,2.74 -1986-02-11,23.87,24.00,23.50,23.87,5504000,2.72 -1986-02-10,24.00,24.50,23.75,23.87,4036000,2.72 -1986-02-07,24.12,24.12,23.50,24.00,4656000,2.74 -1986-02-06,23.75,24.25,23.62,24.12,4835200,2.75 -1986-02-05,23.75,23.87,23.50,23.75,7042400,2.71 -1986-02-04,23.87,24.37,23.75,23.75,9298400,2.71 -1986-02-03,23.12,24.00,22.87,23.87,12512800,2.72 -1986-01-31,23.00,23.25,22.87,23.12,5317600,2.64 -1986-01-30,23.50,23.50,22.87,23.00,8493600,2.62 -1986-01-29,22.25,24.37,22.00,23.62,21064800,2.70 -1986-01-28,22.12,22.37,22.00,22.25,7949600,2.54 -1986-01-27,22.62,22.75,22.00,22.12,13955200,2.52 -1986-01-24,23.00,23.37,22.62,22.62,4044000,2.58 -1986-01-23,23.37,23.50,22.75,23.00,5624000,2.62 -1986-01-22,24.00,24.12,22.37,23.37,5144800,2.67 -1986-01-21,23.87,24.12,23.75,24.00,5464800,2.74 -1986-01-20,24.00,24.00,23.37,23.87,4590400,2.72 -1986-01-17,24.50,24.75,23.87,24.00,12344000,2.74 -1986-01-16,23.87,24.75,23.87,24.50,19132800,2.80 -1986-01-15,23.25,24.00,23.12,23.87,15126400,2.72 -1986-01-14,23.00,23.75,22.50,23.25,9772800,2.65 -1986-01-13,22.75,23.12,22.50,23.00,7701600,2.62 -1986-01-10,22.62,23.12,22.62,22.75,5491200,2.60 -1986-01-09,22.87,23.00,21.87,22.62,16002400,2.58 -1986-01-08,23.00,23.50,22.75,22.87,21711200,2.61 -1986-01-07,22.25,23.00,22.12,23.00,16807200,2.62 -1986-01-06,22.37,22.37,21.87,22.25,6636000,2.54 -1986-01-03,22.25,22.37,22.12,22.37,8653600,2.55 -1986-01-02,22.00,22.25,21.75,22.25,4212800,2.54 -1985-12-31,22.25,22.37,22.00,22.00,3158400,2.51 -1985-12-30,22.37,22.62,22.12,22.25,3848800,2.54 -1985-12-27,21.75,22.62,21.75,22.37,4427200,2.55 -1985-12-26,21.75,22.00,21.62,21.75,1658400,2.48 -1985-12-24,21.87,22.00,21.62,21.75,2344800,2.48 -1985-12-23,22.37,22.50,21.62,21.87,5157600,2.50 -1985-12-20,22.50,22.75,22.25,22.37,7402400,2.55 -1985-12-19,22.25,22.75,22.12,22.50,9673600,2.57 -1985-12-18,21.37,22.87,21.37,22.25,20033600,2.54 -1985-12-17,20.87,21.00,20.37,20.62,3926400,2.35 -1985-12-16,20.00,21.25,20.00,20.87,10362400,2.38 -1985-12-13,20.00,20.25,19.75,20.00,8975200,2.28 -1985-12-12,19.87,20.25,19.87,20.00,4515200,2.28 -1985-12-11,19.50,20.12,19.50,19.75,8489600,2.25 -1985-12-10,19.37,19.62,19.25,19.50,7206400,2.23 -1985-12-09,19.75,20.00,19.25,19.37,5015200,2.21 -1985-12-06,20.12,20.12,19.62,19.75,2347200,2.25 -1985-12-05,20.50,20.75,20.00,20.12,4508800,2.30 -1985-12-04,20.12,20.62,20.12,20.50,5928800,2.34 -1985-12-03,20.25,20.37,20.00,20.12,5548800,2.30 -1985-12-02,20.12,20.25,20.00,20.25,3611200,2.31 -1985-11-29,20.00,20.12,19.87,20.12,3546400,2.30 -1985-11-27,19.37,20.12,19.25,20.00,6873600,2.28 -1985-11-26,19.12,19.50,19.00,19.37,5892800,2.21 -1985-11-25,19.00,19.25,19.00,19.12,3488800,2.18 -1985-11-22,19.00,19.25,18.87,19.00,4620000,2.17 -1985-11-21,19.00,19.25,19.00,19.00,3720000,2.17 -1985-11-20,19.25,19.37,19.00,19.00,3548800,2.17 -1985-11-19,19.87,20.00,19.25,19.25,3373600,2.20 -1985-11-18,19.87,20.00,19.87,19.87,2342400,2.27 -1985-11-15,20.00,20.25,19.87,19.87,2932800,2.27 -1985-11-14,20.00,20.12,20.00,20.00,4995200,2.28 -1985-11-13,19.87,19.87,19.37,19.37,3642400,2.21 -1985-11-12,20.00,20.25,19.87,19.87,6224800,2.27 -1985-11-11,20.50,20.75,20.00,20.00,6421600,2.28 -1985-11-08,20.50,20.75,20.50,20.50,10517600,2.34 -1985-11-07,19.62,19.87,19.62,19.62,11352800,2.24 -1985-11-06,19.25,19.37,19.25,19.25,7181600,2.20 -1985-11-05,18.75,19.12,18.62,18.62,3841600,2.12 -1985-11-04,18.75,19.12,18.75,18.75,5584800,2.14 -1985-11-01,18.62,19.00,18.62,18.62,3320000,2.12 -1985-10-31,19.00,19.25,18.62,18.62,5548800,2.12 -1985-10-30,19.00,19.00,19.00,19.00,8098400,2.17 -1985-10-29,18.00,18.00,17.87,17.87,4693600,2.04 -1985-10-28,18.00,18.12,18.00,18.00,2148800,2.05 -1985-10-25,18.37,18.37,18.00,18.00,2271200,2.05 -1985-10-24,18.37,18.87,18.37,18.37,9768800,2.10 -1985-10-23,18.00,18.50,18.00,18.00,5309600,2.05 -1985-10-22,18.00,18.25,18.00,18.00,15186400,2.05 -1985-10-21,17.75,17.75,17.25,17.25,4248800,1.97 -1985-10-18,18.25,18.37,17.75,17.75,8268800,2.03 -1985-10-17,18.25,19.12,18.25,18.25,12455200,2.08 -1985-10-16,18.00,18.12,18.00,18.00,10336000,2.05 -1985-10-15,17.00,17.12,17.00,17.00,10504800,1.94 -1985-10-14,16.62,16.62,16.62,16.62,5555200,1.90 -1985-10-11,16.00,16.25,16.00,16.00,4261600,1.83 -1985-10-10,15.88,16.00,15.88,15.88,9386400,1.81 -1985-10-09,15.13,15.25,15.00,15.00,3001600,1.71 -1985-10-08,15.13,15.13,15.13,15.13,3144000,1.73 -1985-10-07,15.00,15.25,15.00,15.00,3284800,1.71 -1985-10-04,15.50,15.50,15.00,15.00,2484800,1.71 -1985-10-03,15.63,15.63,15.50,15.50,1784800,1.77 -1985-10-02,15.75,15.88,15.63,15.63,795200,1.78 -1985-10-01,15.75,15.88,15.75,15.75,3175200,1.80 -1985-09-30,15.88,16.00,15.75,15.75,1324800,1.80 -1985-09-27,15.88,16.00,15.88,15.88,250400,1.81 -1985-09-26,15.88,16.00,15.88,15.88,1949600,1.81 -1985-09-25,16.50,16.50,15.88,15.88,3761600,1.81 -1985-09-24,16.87,17.25,16.50,16.50,3161600,1.88 -1985-09-23,16.87,17.12,16.87,16.87,4277600,1.92 -1985-09-20,17.00,17.12,16.75,16.75,4846400,1.91 -1985-09-19,17.00,17.00,17.00,17.00,6662400,1.94 -1985-09-18,16.25,16.25,16.25,16.25,4316000,1.85 -1985-09-17,15.25,15.25,15.25,15.25,6564000,1.74 -1985-09-16,15.75,15.75,15.25,15.25,1344000,1.74 -1985-09-13,16.12,16.12,15.75,15.75,2541600,1.80 -1985-09-12,16.12,16.12,16.12,16.12,3998400,1.84 -1985-09-11,15.50,15.63,15.50,15.50,3150400,1.77 -1985-09-10,15.38,15.63,15.38,15.38,4364800,1.75 -1985-09-09,15.25,15.38,15.25,15.25,4728800,1.74 -1985-09-06,15.00,15.00,15.00,15.00,3333600,1.71 -1985-09-05,14.88,15.00,14.88,14.88,1201600,1.70 -1985-09-04,14.88,15.13,14.88,14.88,1708800,1.70 -1985-09-03,15.00,15.00,14.75,14.75,1369600,1.68 -1985-08-30,15.00,15.00,15.00,15.00,1537600,1.71 -1985-08-29,15.25,15.25,14.88,14.88,2006400,1.70 -1985-08-28,15.25,15.38,15.25,15.25,1475200,1.74 -1985-08-27,15.25,15.25,15.25,15.25,1540000,1.74 -1985-08-26,15.13,15.13,15.13,15.13,1315200,1.73 -1985-08-23,14.88,15.00,14.75,14.75,1601600,1.68 -1985-08-22,15.25,15.25,14.88,14.88,4406400,1.70 -1985-08-21,15.25,15.25,15.25,15.25,2767200,1.74 -1985-08-20,15.25,15.25,15.25,15.25,2431200,1.74 -1985-08-19,15.00,15.25,15.00,15.00,1726400,1.71 -1985-08-16,14.63,14.88,14.63,14.63,3008800,1.67 -1985-08-15,14.63,14.75,14.50,14.50,3800000,1.65 -1985-08-14,15.25,15.25,14.63,14.63,10372800,1.67 -1985-08-13,15.25,15.50,15.25,15.25,1555200,1.74 -1985-08-12,15.25,15.25,15.00,15.00,1988800,1.71 -1985-08-09,15.25,15.25,15.25,15.25,2186400,1.74 -1985-08-08,15.13,15.25,15.13,15.13,5321600,1.73 -1985-08-07,15.25,16.00,14.88,14.88,5452800,1.70 -1985-08-06,15.38,15.75,15.25,15.25,2260000,1.74 -1985-08-05,15.75,15.88,15.38,15.38,3307200,1.75 -1985-08-02,15.88,15.88,15.75,15.75,3501600,1.80 -1985-08-01,15.88,16.12,15.88,15.88,1842400,1.81 -1985-07-31,16.25,16.37,15.88,15.88,2917600,1.81 -1985-07-30,16.25,16.37,16.25,16.25,3237600,1.85 -1985-07-29,16.62,16.62,16.00,16.00,2808800,1.83 -1985-07-26,16.62,16.75,16.62,16.62,4673600,1.90 -1985-07-25,16.62,16.75,16.62,16.62,11282400,1.90 -1985-07-24,16.50,16.75,16.25,16.25,6040000,1.85 -1985-07-23,16.87,17.12,16.50,16.50,6038400,1.88 -1985-07-22,17.37,17.37,16.87,16.87,6906400,1.92 -1985-07-19,17.37,17.37,17.37,17.37,4117600,1.98 -1985-07-18,17.62,17.62,17.25,17.25,6437600,1.97 -1985-07-17,17.62,17.87,17.62,17.62,4255200,2.01 -1985-07-16,17.75,17.87,17.50,17.50,5120000,2.00 -1985-07-15,17.87,18.25,17.75,17.75,2804800,2.03 -1985-07-12,18.00,18.00,17.87,17.87,1680000,2.04 -1985-07-11,18.00,18.12,18.00,18.00,2361600,2.05 -1985-07-10,18.00,18.00,18.00,18.00,3802400,2.05 -1985-07-09,17.62,17.75,17.62,17.62,5284000,2.01 -1985-07-08,17.62,17.75,17.62,17.62,3301600,2.01 -1985-07-05,17.62,17.75,17.62,17.62,1321600,2.01 -1985-07-03,17.50,17.50,17.50,17.50,2472800,2.00 -1985-07-02,18.12,18.25,17.25,17.25,2807200,1.97 -1985-07-01,18.12,18.25,18.12,18.12,3702400,2.07 -1985-06-28,18.37,18.50,18.00,18.00,4875200,2.05 -1985-06-27,18.37,18.50,18.37,18.37,6915200,2.10 -1985-06-26,18.12,18.12,18.12,18.12,4722400,2.07 -1985-06-25,17.50,17.87,17.50,17.50,10506400,2.00 -1985-06-24,17.25,17.50,17.25,17.25,7387200,1.97 -1985-06-21,16.12,16.50,16.12,16.12,5941600,1.84 -1985-06-20,15.75,15.75,15.75,15.75,6822400,1.80 -1985-06-19,15.63,15.88,15.63,15.63,6177600,1.78 -1985-06-18,15.25,15.50,15.25,15.25,9489600,1.74 -1985-06-17,14.88,15.00,14.88,14.88,8464000,1.70 -1985-06-14,14.88,15.75,14.75,14.75,20226400,1.68 -1985-06-13,15.75,15.88,14.88,14.88,13573600,1.70 -1985-06-12,16.12,16.25,15.75,15.75,8888800,1.80 -1985-06-11,16.12,16.50,16.12,16.12,10751200,1.84 -1985-06-10,16.37,16.50,16.12,16.12,11296000,1.84 -1985-06-07,17.00,17.00,16.37,16.37,16980000,1.87 -1985-06-06,17.00,17.00,17.00,17.00,9688800,1.94 -1985-06-05,17.25,17.75,16.87,16.87,10267200,1.92 -1985-06-04,17.25,17.37,17.25,17.25,14373600,1.97 -1985-06-03,17.00,17.00,16.00,16.00,20578400,1.83 -1985-05-31,17.62,18.00,17.37,17.37,13235200,1.98 -1985-05-30,17.62,17.87,17.62,17.62,11273600,2.01 -1985-05-29,17.12,17.25,17.12,17.12,8808800,1.95 -1985-05-28,17.87,17.87,16.87,16.87,18253600,1.92 -1985-05-24,19.75,19.75,18.12,18.12,21060000,2.07 -1985-05-23,20.50,20.50,19.75,19.75,8576000,2.25 -1985-05-22,20.75,20.87,20.62,20.62,4342400,2.35 -1985-05-21,21.25,21.25,20.75,20.75,5452800,2.37 -1985-05-20,21.75,22.25,21.37,21.37,7044000,2.44 -1985-05-17,21.37,22.12,21.25,21.75,7592800,2.48 -1985-05-16,21.37,22.00,21.37,21.37,8275200,2.44 -1985-05-15,20.00,20.37,20.00,20.00,4668800,2.28 -1985-05-14,20.00,20.12,19.75,19.75,4364000,2.25 -1985-05-13,20.25,20.37,20.00,20.00,3157600,2.28 -1985-05-10,20.00,20.50,20.00,20.25,4893600,2.31 -1985-05-09,20.00,20.12,20.00,20.00,4571200,2.28 -1985-05-08,19.87,19.87,19.87,19.87,5177600,2.27 -1985-05-07,20.00,20.00,20.00,20.00,3844800,2.28 -1985-05-06,20.00,20.25,19.75,19.75,2007200,2.25 -1985-05-03,19.25,20.12,19.25,20.00,5673600,2.28 -1985-05-02,20.62,20.62,19.25,19.25,11787200,2.20 -1985-05-01,21.25,21.37,20.87,20.87,2075200,2.38 -1985-04-30,21.25,21.37,21.25,21.25,3396000,2.42 -1985-04-29,21.87,22.00,21.12,21.12,2256000,2.41 -1985-04-26,22.00,22.62,21.87,21.87,4295200,2.50 -1985-04-25,22.00,22.12,22.00,22.00,3135200,2.51 -1985-04-24,22.12,22.50,22.00,22.00,2830400,2.51 -1985-04-23,22.12,22.25,22.12,22.12,4261600,2.52 -1985-04-22,22.50,22.50,21.62,21.62,3700000,2.47 -1985-04-19,22.87,22.87,22.37,22.50,3468800,2.57 -1985-04-18,22.87,23.00,22.87,22.87,7246400,2.61 -1985-04-17,22.62,22.87,22.62,22.62,4402400,2.58 -1985-04-16,21.62,21.75,21.62,21.62,2424800,2.47 -1985-04-15,21.37,21.62,21.37,21.37,2168800,2.44 -1985-04-12,21.37,21.37,20.75,20.87,2607200,2.38 -1985-04-11,21.37,22.00,21.37,21.37,5260000,2.44 -1985-04-10,21.00,21.25,21.00,21.00,8117600,2.40 -1985-04-09,19.62,19.75,19.62,19.62,9461600,2.24 -1985-04-08,20.87,21.00,19.62,19.62,7129600,2.24 -1985-04-04,21.00,21.12,20.62,20.87,5792800,2.38 -1985-04-03,21.00,21.12,21.00,21.00,8681600,2.40 -1985-04-02,21.62,21.75,21.00,21.00,8146400,2.40 -1985-04-01,22.12,22.62,21.62,21.62,4115200,2.47 -1985-03-29,21.87,22.25,21.87,22.12,3155200,2.52 -1985-03-28,21.87,22.25,21.87,21.87,4667200,2.50 -1985-03-27,22.50,22.75,21.87,21.87,4008800,2.50 -1985-03-26,22.50,22.50,22.50,22.50,4346400,2.57 -1985-03-25,22.25,22.25,21.62,21.62,3931200,2.47 -1985-03-22,22.62,23.00,22.25,22.25,2910400,2.54 -1985-03-21,22.62,23.00,22.62,22.62,5826400,2.58 -1985-03-20,22.25,22.62,22.25,22.25,14498400,2.54 -1985-03-19,22.87,23.12,22.00,22.00,6147200,2.51 -1985-03-18,22.87,23.12,22.87,22.87,4487200,2.61 -1985-03-15,21.75,23.12,21.62,22.62,6524000,2.58 -1985-03-14,21.75,21.87,21.75,21.75,8667200,2.48 -1985-03-13,23.00,23.00,21.75,21.75,8973600,2.48 -1985-03-12,23.00,23.25,23.00,23.00,7880000,2.62 -1985-03-11,22.25,22.37,22.25,22.25,10244800,2.54 -1985-03-08,22.12,22.12,20.75,21.50,16931200,2.45 -1985-03-07,24.62,24.75,22.12,22.12,26244000,2.52 -1985-03-06,25.87,25.87,24.62,24.62,6933600,2.81 -1985-03-05,25.87,25.87,25.87,25.87,4687200,2.95 -1985-03-04,25.25,26.00,25.25,25.25,5484000,2.88 -1985-03-01,24.75,24.87,24.00,24.87,8857600,2.84 -1985-02-28,25.12,25.12,24.75,24.75,11415200,2.82 -1985-02-27,26.75,26.75,25.12,25.12,14421600,2.87 -1985-02-26,27.25,27.37,26.75,26.75,6764800,3.05 -1985-02-25,27.62,27.75,27.25,27.25,3564000,3.11 -1985-02-22,26.87,27.87,26.87,27.62,8096000,3.15 -1985-02-21,26.87,27.00,26.87,26.87,11035200,3.07 -1985-02-20,27.62,27.75,26.37,26.37,7864800,3.01 -1985-02-19,27.87,27.87,27.62,27.62,5391200,3.15 -1985-02-15,27.62,28.12,27.37,28.00,6224000,3.19 -1985-02-14,28.37,28.62,27.62,27.62,15268800,3.15 -1985-02-13,29.75,29.75,28.37,28.37,18835200,3.24 -1985-02-12,30.50,30.62,29.75,29.75,8095200,3.39 -1985-02-11,30.50,30.75,30.50,30.50,12431200,3.48 -1985-02-08,29.87,30.00,29.50,29.87,4757600,3.41 -1985-02-07,30.00,30.37,29.87,29.87,8793600,3.41 -1985-02-06,30.00,30.00,30.00,30.00,6980000,3.42 -1985-02-05,29.50,30.00,29.50,29.50,6824800,3.37 -1985-02-04,29.25,29.37,29.25,29.25,7801600,3.34 -1985-02-01,29.00,29.12,28.37,28.62,4941600,3.27 -1985-01-31,29.87,30.00,29.00,29.00,9880000,3.31 -1985-01-30,29.87,30.50,29.87,29.87,17624800,3.41 -1985-01-29,30.25,30.50,29.87,29.87,8029600,3.41 -1985-01-28,30.25,30.62,30.25,30.25,14721600,3.45 -1985-01-25,29.00,29.62,28.37,29.62,11381600,3.38 -1985-01-24,29.62,29.62,29.00,29.00,14192800,3.31 -1985-01-23,30.12,30.25,29.62,29.62,15384000,3.38 -1985-01-22,30.12,30.25,30.12,30.12,15202400,3.44 -1985-01-21,29.25,29.50,29.25,29.25,11635200,3.34 -1985-01-18,28.12,29.25,28.00,28.62,12615200,3.27 -1985-01-17,30.25,30.75,28.12,28.12,19573600,3.21 -1985-01-16,30.25,30.75,30.25,30.25,6816000,3.45 -1985-01-15,30.62,31.12,30.00,30.00,9476000,3.42 -1985-01-14,30.62,30.87,30.62,30.62,9691200,3.49 -1985-01-11,30.00,30.25,29.50,29.75,7347200,3.39 -1985-01-10,30.00,30.12,30.00,30.00,9926400,3.42 -1985-01-09,28.75,29.12,28.75,28.75,5973600,3.28 -1985-01-08,28.25,28.50,28.00,28.00,5040000,3.19 -1985-01-07,28.37,28.50,28.25,28.25,6117600,3.22 -1985-01-04,28.37,28.50,28.00,28.37,4915200,3.24 -1985-01-03,28.37,29.12,28.37,28.37,5967200,3.24 -1985-01-02,29.12,29.12,27.87,27.87,6272800,3.18 -1984-12-31,29.12,29.25,29.12,29.12,7453600,3.32 -1984-12-28,27.75,28.87,27.62,28.75,5941600,3.28 -1984-12-27,27.75,27.87,27.75,27.75,3531200,3.17 -1984-12-26,27.62,27.87,27.62,27.62,2444000,3.15 -1984-12-24,27.50,27.62,27.50,27.50,2418400,3.14 -1984-12-21,27.37,27.50,26.75,27.00,4438400,3.08 -1984-12-20,27.50,28.00,27.37,27.37,5013600,3.12 -1984-12-19,28.62,28.75,27.50,27.50,11372800,3.14 -1984-12-18,28.62,28.75,28.62,28.62,12164800,3.27 -1984-12-17,27.00,27.25,27.00,27.00,4513600,3.08 -1984-12-14,25.75,26.62,25.75,26.37,3475200,3.01 -1984-12-13,25.75,26.25,25.75,25.75,2424800,2.94 -1984-12-12,26.37,26.37,25.50,25.50,3937600,2.91 -1984-12-11,26.75,27.12,26.37,26.37,4432800,3.01 -1984-12-10,27.25,27.25,26.75,26.75,4016000,3.05 -1984-12-07,27.37,28.37,27.12,27.25,17696000,3.11 -1984-12-06,27.37,27.50,27.37,27.37,11360000,3.12 -1984-12-05,26.12,26.12,26.12,26.12,9406400,2.98 -1984-12-04,24.87,25.37,24.87,24.87,4332800,2.84 -1984-12-03,24.75,24.87,24.37,24.37,3533600,2.78 -1984-11-30,25.37,25.62,24.62,24.75,3906400,2.82 -1984-11-29,25.87,25.87,25.37,25.37,6248800,2.89 -1984-11-28,25.87,26.50,25.87,25.87,14673600,2.95 -1984-11-27,24.62,24.87,24.62,24.62,4590400,2.81 -1984-11-26,24.00,24.00,24.00,24.00,3636000,2.74 -1984-11-23,23.37,24.12,23.37,23.75,4904800,2.71 -1984-11-21,23.12,23.25,23.12,23.12,6418400,2.64 -1984-11-20,22.62,22.75,22.62,22.62,9424800,2.58 -1984-11-19,23.25,23.37,21.87,21.87,8321600,2.50 -1984-11-16,23.75,24.12,23.12,23.25,5920000,2.65 -1984-11-15,23.75,24.00,23.75,23.75,3833600,2.71 -1984-11-14,23.75,24.00,23.75,23.75,3752800,2.71 -1984-11-13,24.12,24.62,23.50,23.50,4548800,2.68 -1984-11-12,24.12,24.25,24.12,24.12,4070400,2.75 -1984-11-09,24.75,24.87,23.00,23.25,10518400,2.65 -1984-11-08,25.75,25.75,24.75,24.75,3162400,2.82 -1984-11-07,26.25,26.37,25.75,25.75,8286400,2.94 -1984-11-06,26.25,26.37,26.25,26.25,8073600,3.00 -1984-11-05,24.87,25.37,24.75,24.75,3764800,2.82 -1984-11-02,25.00,25.12,24.75,24.87,1004800,2.84 -1984-11-01,25.00,25.25,25.00,25.00,1680000,2.85 -1984-10-31,25.00,25.25,24.87,24.87,2191200,2.84 -1984-10-30,25.00,25.25,25.00,25.00,2677600,2.85 -1984-10-29,24.75,24.87,24.75,24.75,1836000,2.82 -1984-10-26,25.25,25.25,24.50,24.62,4113600,2.81 -1984-10-25,26.25,26.25,25.25,25.25,5676000,2.88 -1984-10-24,26.25,26.50,26.25,26.25,5989600,3.00 -1984-10-23,26.00,26.25,26.00,26.00,6668800,2.97 -1984-10-22,25.62,26.00,25.37,25.37,4108800,2.89 -1984-10-19,25.62,27.37,25.50,25.62,11673600,2.92 -1984-10-18,25.62,25.75,25.62,25.62,8842400,2.92 -1984-10-17,24.87,25.00,24.87,24.87,5636000,2.84 -1984-10-16,24.00,24.12,23.87,23.87,4246400,2.72 -1984-10-15,24.00,24.25,24.00,24.00,8715200,2.74 -1984-10-12,23.75,23.87,22.50,22.75,9522400,2.60 -1984-10-11,23.87,24.50,23.75,23.75,6553600,2.71 -1984-10-10,24.62,24.62,23.87,23.87,13070400,2.72 -1984-10-09,24.87,25.00,24.62,24.62,4515200,2.81 -1984-10-08,24.87,25.00,24.87,24.87,1721600,2.84 -1984-10-05,25.37,25.37,24.75,24.87,3510400,2.84 -1984-10-04,25.37,25.62,25.37,25.37,4482400,2.89 -1984-10-03,25.12,25.50,25.12,25.12,4335200,2.87 -1984-10-02,24.75,25.62,24.75,24.75,4258400,2.82 -1984-10-01,25.00,25.00,24.50,24.50,3521600,2.80 -1984-09-28,25.75,25.75,24.62,25.12,8344800,2.87 -1984-09-27,25.75,25.87,25.75,25.75,3796000,2.94 -1984-09-26,26.12,27.25,25.75,25.75,3987200,2.94 -1984-09-25,26.50,26.50,26.12,26.12,5977600,2.98 -1984-09-24,26.87,27.00,26.62,26.62,2833600,3.04 -1984-09-21,27.12,27.87,26.50,26.87,3591200,3.07 -1984-09-20,27.12,27.37,27.12,27.12,2387200,3.09 -1984-09-19,27.62,27.87,27.00,27.00,3816000,3.08 -1984-09-18,28.62,28.87,27.62,27.62,3495200,3.15 -1984-09-17,28.62,29.00,28.62,28.62,6886400,3.27 -1984-09-14,27.62,28.50,27.62,27.87,8826400,3.18 -1984-09-13,27.50,27.62,27.50,27.50,7429600,3.14 -1984-09-12,26.87,27.00,26.12,26.12,4773600,2.98 -1984-09-11,26.62,27.37,26.62,26.87,5444000,3.07 -1984-09-10,26.50,26.62,25.87,26.37,2346400,3.01 -1984-09-07,26.50,26.87,26.25,26.50,2981600,3.02 Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/examples/data/AAPL.dat and /tmp/GJbvHcIw6l/matplotlib-1.0.1/examples/data/AAPL.dat differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/examples/data/ct.raw and /tmp/GJbvHcIw6l/matplotlib-1.0.1/examples/data/ct.raw differ diff -Nru matplotlib-0.99.3/examples/data/data_x_x2_x3.csv matplotlib-1.0.1/examples/data/data_x_x2_x3.csv --- matplotlib-0.99.3/examples/data/data_x_x2_x3.csv 2009-07-31 15:14:50.000000000 +0000 +++ matplotlib-1.0.1/examples/data/data_x_x2_x3.csv 1970-01-01 00:00:00.000000000 +0000 @@ -1,11 +0,0 @@ - 0 0 0 - 1 1 1 - 2 4 8 - 3 9 27 - 4 16 64 - 5 25 125 - 6 36 216 - 7 49 343 - 8 64 512 - 9 81 729 -10 100 1000 diff -Nru matplotlib-0.99.3/examples/data/demodata.csv matplotlib-1.0.1/examples/data/demodata.csv --- matplotlib-0.99.3/examples/data/demodata.csv 2009-07-31 15:14:50.000000000 +0000 +++ matplotlib-1.0.1/examples/data/demodata.csv 1970-01-01 00:00:00.000000000 +0000 @@ -1,11 +0,0 @@ -clientid,date,weekdays,gains,prices,up -0,2008-04-30,Wed,-0.52458192906686452,7791404.0091921333,False -1,2008-05-01,Thu,0.076191536201738269,3167180.7366340165,True -2,2008-05-02,Fri,-0.86850970062880861,9589766.9613829032,False -3,2008-05-03,Sat,-0.42701083852713395,8949415.1867596991,False -4,2008-05-04,Sun,0.2532553652693274,937163.44375252665,True -5,2008-05-05,Mon,-0.68151636911081892,949579.88022264629,False -6,2008-05-06,Tue,0.0071911579626532168,7268426.906552773,True -7,2008-05-07,Wed,0.67449747200412147,7517014.782897247,True -8,2008-05-08,Thu,-1.1841008656818983,1920959.5423492221,False -9,2008-05-09,Fri,-1.5803692595811152,8456240.6198725495,False Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/examples/data/eeg.dat and /tmp/GJbvHcIw6l/matplotlib-1.0.1/examples/data/eeg.dat differ diff -Nru matplotlib-0.99.3/examples/data/embedding_in_wx3.xrc matplotlib-1.0.1/examples/data/embedding_in_wx3.xrc --- matplotlib-0.99.3/examples/data/embedding_in_wx3.xrc 2009-07-31 15:14:50.000000000 +0000 +++ matplotlib-1.0.1/examples/data/embedding_in_wx3.xrc 1970-01-01 00:00:00.000000000 +0000 @@ -1,65 +0,0 @@ - - - - embedding_in_wx3 - - - wxVERTICAL - - - - - - - wxALL|wxEXPAND - 5 - - - - wxHORIZONTAL - - - - - - wxALL|wxEXPAND - 2 - - - - - - - wxALL|wxEXPAND - 2 - - - - - - - - wxALL|wxEXPAND - 2 - - - - 0 - - - wxEXPAND - - - - wxLEFT|wxRIGHT|wxEXPAND - 5 - - - - - wxEXPAND - - - - - \ No newline at end of file diff -Nru matplotlib-0.99.3/examples/data/goog.csv matplotlib-1.0.1/examples/data/goog.csv --- matplotlib-0.99.3/examples/data/goog.csv 2009-07-31 15:14:50.000000000 +0000 +++ matplotlib-1.0.1/examples/data/goog.csv 1970-01-01 00:00:00.000000000 +0000 @@ -1,1048 +0,0 @@ -Date,Open,High,Low,Close,Volume,Adj Close -2008-10-14,393.53,394.50,357.00,362.71,7784800,362.71 -2008-10-13,355.79,381.95,345.75,381.02,8905500,381.02 -2008-10-10,313.16,341.89,310.30,332.00,10597800,332.00 -2008-10-09,344.52,348.57,321.67,328.98,8075000,328.98 -2008-10-08,330.16,358.99,326.11,338.11,11826400,338.11 -2008-10-07,373.33,374.98,345.37,346.01,11054400,346.01 -2008-10-06,373.98,375.99,357.16,371.21,11220600,371.21 -2008-10-03,397.35,412.50,383.07,386.91,7992900,386.91 -2008-10-02,409.79,409.98,386.00,390.49,5984900,390.49 -2008-10-01,411.15,416.98,403.10,411.72,6234800,411.72 -2008-09-30,395.98,425.08,392.32,400.52,3086300,400.52 -2008-09-29,419.51,423.51,380.71,381.00,10762900,381.00 -2008-09-26,428.00,437.16,421.03,431.04,5292500,431.04 -2008-09-25,438.84,450.00,435.98,439.60,5020300,439.60 -2008-09-24,430.34,445.00,430.11,435.11,4242000,435.11 -2008-09-23,433.25,440.79,425.72,429.27,5204200,429.27 -2008-09-22,454.13,454.13,429.00,430.14,4407300,430.14 -2008-09-19,461.00,462.07,443.28,449.15,10006000,449.15 -2008-09-18,422.64,439.18,410.50,439.08,8589400,439.08 -2008-09-17,438.48,439.14,413.44,414.49,9126900,414.49 -2008-09-16,425.96,449.28,425.49,442.93,6990700,442.93 -2008-09-15,424.00,441.97,423.71,433.86,6567400,433.86 -2008-09-12,430.21,441.99,429.00,437.66,6028000,437.66 -2008-09-11,408.35,435.09,406.38,433.75,6471400,433.75 -2008-09-10,424.47,424.48,409.68,414.16,6226800,414.16 -2008-09-09,423.17,432.38,415.00,418.66,7229600,418.66 -2008-09-08,452.02,452.94,417.55,419.95,9017900,419.95 -2008-09-05,445.49,452.46,440.08,444.25,4534300,444.25 -2008-09-04,460.00,463.24,449.40,450.26,4848500,450.26 -2008-09-03,468.73,474.29,459.58,464.41,4314600,464.41 -2008-09-02,476.77,482.18,461.42,465.25,6111500,465.25 -2008-08-29,469.75,471.01,462.33,463.29,3848200,463.29 -2008-08-28,472.49,476.45,470.33,473.78,3029700,473.78 -2008-08-27,473.73,474.83,464.84,468.58,4387100,468.58 -2008-08-26,483.46,483.46,470.59,474.16,3308200,474.16 -2008-08-25,486.11,497.00,481.50,483.01,2014300,483.01 -2008-08-22,491.50,494.88,489.48,490.59,2297200,490.59 -2008-08-21,482.92,489.90,479.27,486.53,3514100,486.53 -2008-08-20,494.72,496.69,482.57,485.00,3982100,485.00 -2008-08-19,490.43,498.28,486.63,490.50,3046500,490.50 -2008-08-18,509.84,510.00,495.51,498.30,3333900,498.30 -2008-08-15,506.99,510.66,505.50,510.15,3545700,510.15 -2008-08-14,497.70,507.61,496.29,505.49,2918600,505.49 -2008-08-13,501.60,503.54,493.88,500.03,3625500,500.03 -2008-08-12,502.00,506.13,498.00,502.61,2755700,502.61 -2008-08-11,492.47,508.88,491.78,500.84,4239300,500.84 -2008-08-08,480.15,495.75,475.69,495.01,3739300,495.01 -2008-08-07,482.00,484.00,476.41,479.12,2773800,479.12 -2008-08-06,478.37,489.77,472.51,486.34,3375800,486.34 -2008-08-05,467.59,480.08,466.33,479.85,3584500,479.85 -2008-08-04,468.12,473.01,461.90,463.00,2487000,463.00 -2008-08-01,472.51,473.22,462.50,467.86,3007900,467.86 -2008-07-31,474.56,480.89,471.44,473.75,2865100,473.75 -2008-07-30,485.50,486.02,472.81,482.70,3490700,482.70 -2008-07-29,479.30,487.26,478.00,483.11,2802800,483.11 -2008-07-28,492.09,492.09,475.13,477.12,3160000,477.12 -2008-07-25,486.49,493.13,481.50,491.98,3183500,491.98 -2008-07-24,496.70,496.87,475.62,475.62,3540900,475.62 -2008-07-23,481.61,497.23,478.10,489.22,4894100,489.22 -2008-07-22,466.72,480.25,465.60,477.11,4691500,477.11 -2008-07-21,480.88,484.09,465.70,468.80,5901500,468.80 -2008-07-18,498.35,498.98,478.19,481.32,11292400,481.32 -2008-07-17,534.16,537.05,524.50,533.44,8787400,533.44 -2008-07-16,514.04,536.50,510.60,535.60,4742200,535.60 -2008-07-15,516.28,527.50,501.10,516.09,6071000,516.09 -2008-07-14,539.00,540.06,515.45,521.62,4424800,521.62 -2008-07-11,536.50,539.50,519.43,533.80,4981400,533.80 -2008-07-10,545.00,549.50,530.72,540.57,4331700,540.57 -2008-07-09,550.76,555.68,540.73,541.55,4154000,541.55 -2008-07-08,545.99,555.19,540.00,554.53,4932400,554.53 -2008-07-07,542.30,549.00,535.60,543.91,4255200,543.91 -2008-07-03,530.88,539.23,527.50,537.00,2400500,537.00 -2008-07-02,536.51,540.38,526.06,527.04,4223000,527.04 -2008-07-01,519.58,536.72,517.00,534.73,4959900,534.73 -2008-06-30,532.47,538.00,523.06,526.42,3765300,526.42 -2008-06-27,527.68,530.00,515.09,528.07,5436900,528.07 -2008-06-26,544.10,544.93,528.26,528.82,5659500,528.82 -2008-06-25,544.97,557.80,543.67,551.00,4122200,551.00 -2008-06-24,545.14,551.19,535.10,542.30,4672600,542.30 -2008-06-23,545.36,553.15,542.02,545.21,3635900,545.21 -2008-06-20,556.98,556.98,544.51,546.43,5983100,546.43 -2008-06-19,555.35,563.78,550.81,560.20,5683100,560.20 -2008-06-18,564.51,568.99,559.16,562.38,3381200,562.38 -2008-06-17,576.35,578.07,568.38,569.46,3462900,569.46 -2008-06-16,566.50,579.10,566.50,572.81,3542800,572.81 -2008-06-13,561.49,575.70,561.34,571.51,6184400,571.51 -2008-06-12,548.76,558.00,546.88,552.95,5491600,552.95 -2008-06-11,556.24,557.34,544.46,545.20,3812900,545.20 -2008-06-10,549.56,558.82,546.78,554.17,3657400,554.17 -2008-06-09,568.06,570.00,545.40,557.87,5288300,557.87 -2008-06-06,579.75,580.72,567.00,567.00,4734500,567.00 -2008-06-05,577.08,588.04,576.21,586.30,3916700,586.30 -2008-06-04,565.33,578.00,564.55,572.22,3363200,572.22 -2008-06-03,576.50,580.50,560.61,567.30,4305300,567.30 -2008-06-02,582.50,583.89,571.27,575.00,3674200,575.00 -2008-05-30,583.47,589.92,581.30,585.80,3225200,585.80 -2008-05-29,574.79,585.88,573.20,583.00,4845000,583.00 -2008-05-28,567.94,571.49,561.10,568.24,4050400,568.24 -2008-05-27,544.96,562.60,543.85,560.90,3865500,560.90 -2008-05-23,546.96,553.00,537.81,544.62,4431500,544.62 -2008-05-22,551.95,554.21,540.25,549.46,5076300,549.46 -2008-05-21,578.52,581.41,547.89,549.99,6468100,549.99 -2008-05-20,574.63,582.48,572.91,578.60,3313600,578.60 -2008-05-19,578.55,588.88,573.52,577.52,5604500,577.52 -2008-05-16,581.43,584.68,578.32,580.07,4274100,580.07 -2008-05-15,579.00,582.95,575.61,581.00,4342700,581.00 -2008-05-14,586.49,591.19,575.25,576.30,4375800,576.30 -2008-05-13,586.23,587.95,578.55,583.00,5163500,583.00 -2008-05-12,574.75,586.75,568.91,584.94,4863900,584.94 -2008-05-09,579.00,585.00,571.30,573.20,4484900,573.20 -2008-05-08,586.20,589.30,578.91,583.01,5122900,583.01 -2008-05-07,590.27,599.49,576.43,579.00,6613000,579.00 -2008-05-06,591.00,592.00,583.00,586.36,4629300,586.36 -2008-05-05,598.86,599.00,587.13,594.90,6281000,594.90 -2008-05-02,598.49,602.45,579.30,581.29,6998800,581.29 -2008-05-01,578.31,594.93,576.97,593.08,6602800,593.08 -2008-04-30,562.21,584.86,558.47,574.29,7903000,574.29 -2008-04-29,550.83,563.40,550.01,558.47,4346000,558.47 -2008-04-28,545.88,556.81,539.00,552.12,4008600,552.12 -2008-04-25,549.02,553.00,542.73,544.06,4164400,544.06 -2008-04-24,551.29,554.49,540.02,543.04,4135100,543.04 -2008-04-23,557.94,559.31,540.95,546.49,4921500,546.49 -2008-04-22,537.57,560.83,537.56,555.00,7938500,555.00 -2008-04-21,539.39,542.59,530.29,537.79,7439700,537.79 -2008-04-18,535.21,547.70,524.77,539.41,18235600,539.41 -2008-04-17,455.63,459.37,446.52,449.54,13353000,449.54 -2008-04-16,444.40,458.28,441.00,455.03,7620200,455.03 -2008-04-15,458.13,459.72,443.72,446.84,4577600,446.84 -2008-04-14,457.16,457.45,450.15,451.66,3842600,451.66 -2008-04-11,464.07,467.26,455.01,457.45,4151500,457.45 -2008-04-10,464.96,473.86,461.85,469.08,5072400,469.08 -2008-04-09,469.13,472.00,457.54,464.19,6048100,464.19 -2008-04-08,473.04,474.14,462.01,467.81,4547000,467.81 -2008-04-07,477.03,485.44,473.53,476.82,5943500,476.82 -2008-04-04,457.01,477.83,456.20,471.09,5897200,471.09 -2008-04-03,461.73,463.29,448.13,455.12,6778400,455.12 -2008-04-02,469.90,475.74,460.39,465.70,5999000,465.70 -2008-04-01,447.74,466.50,446.87,465.71,6093100,465.71 -2008-03-31,435.64,442.69,432.01,440.47,4446400,440.47 -2008-03-28,447.46,453.57,434.31,438.08,4376200,438.08 -2008-03-27,446.00,448.61,440.49,444.08,5832200,444.08 -2008-03-26,452.59,462.87,449.29,458.19,5214200,458.19 -2008-03-25,457.46,457.47,446.00,450.78,5831600,450.78 -2008-03-24,438.43,465.78,437.72,460.56,6763500,460.56 -2008-03-20,427.32,435.70,417.50,433.55,9900400,433.55 -2008-03-19,441.11,447.50,431.67,432.00,6179000,432.00 -2008-03-18,428.98,440.84,425.53,439.16,7237200,439.16 -2008-03-17,427.99,433.71,412.11,419.87,7888200,419.87 -2008-03-14,442.98,449.34,430.62,437.92,6574400,437.92 -2008-03-13,432.67,446.98,428.78,443.01,7726600,443.01 -2008-03-12,440.01,447.88,438.07,440.18,6651900,440.18 -2008-03-11,425.26,440.15,424.65,439.84,8826900,439.84 -2008-03-10,428.83,431.00,413.04,413.62,7987600,413.62 -2008-03-07,428.88,440.00,426.24,433.35,8071800,433.35 -2008-03-06,447.69,453.30,431.18,432.70,7470100,432.70 -2008-03-05,445.25,454.17,444.00,447.70,7436600,447.70 -2008-03-04,450.95,453.36,435.78,444.60,13621700,444.60 -2008-03-03,471.51,472.72,450.11,457.02,7554500,457.02 -2008-02-29,471.87,479.74,464.65,471.18,9425400,471.18 -2008-02-28,470.50,479.09,467.36,475.39,6586900,475.39 -2008-02-27,460.13,475.49,459.64,472.86,10121900,472.86 -2008-02-26,461.20,466.47,446.85,464.19,23287300,464.19 -2008-02-25,505.95,506.50,485.74,486.44,8350800,486.44 -2008-02-22,502.06,509.00,497.55,507.80,5515900,507.80 -2008-02-21,512.85,513.21,499.50,502.86,5677800,502.86 -2008-02-20,503.51,511.01,498.82,509.00,6662200,509.00 -2008-02-19,534.94,535.06,506.50,508.95,6350400,508.95 -2008-02-15,528.31,532.66,524.33,529.64,5240100,529.64 -2008-02-14,538.35,541.04,531.00,532.25,6476700,532.25 -2008-02-13,522.50,534.99,518.69,534.62,6624700,534.62 -2008-02-12,523.39,530.60,513.03,518.09,6662300,518.09 -2008-02-11,520.52,523.71,513.40,521.16,5826000,521.16 -2008-02-08,509.41,517.73,508.70,516.69,6828900,516.69 -2008-02-07,496.86,514.19,494.76,504.95,7928900,504.95 -2008-02-06,511.14,511.17,497.93,501.71,7636400,501.71 -2008-02-05,489.43,509.00,488.52,506.80,11203300,506.80 -2008-02-04,509.07,512.78,492.55,495.43,13157100,495.43 -2008-02-01,528.67,536.67,510.00,515.90,17600500,515.90 -2008-01-31,539.01,573.00,534.29,564.30,14871300,564.30 -2008-01-30,549.19,560.43,543.51,548.27,7939600,548.27 -2008-01-29,560.47,561.33,540.67,550.52,6283000,550.52 -2008-01-28,570.97,572.24,548.60,555.98,5816700,555.98 -2008-01-25,591.81,595.00,566.18,566.40,6966000,566.40 -2008-01-24,558.80,579.69,554.14,574.49,9400900,574.49 -2008-01-23,560.71,568.00,519.00,548.62,16965700,548.62 -2008-01-22,562.03,597.50,561.20,584.35,9501500,584.35 -2008-01-18,608.36,609.99,598.45,600.25,8539600,600.25 -2008-01-17,620.76,625.74,598.01,600.79,8216800,600.79 -2008-01-16,628.97,639.99,601.93,615.95,10560000,615.95 -2008-01-15,645.90,649.05,635.38,637.65,5568200,637.65 -2008-01-14,651.14,657.40,645.25,653.82,4447500,653.82 -2008-01-11,642.70,649.47,630.11,638.25,4977000,638.25 -2008-01-10,645.01,657.20,640.11,646.73,6334200,646.73 -2008-01-09,630.04,653.34,622.51,653.20,6739700,653.20 -2008-01-08,653.00,659.96,631.00,631.68,5339100,631.68 -2008-01-07,653.94,662.28,637.35,649.25,6403400,649.25 -2008-01-04,679.69,680.96,655.00,657.00,5359800,657.00 -2008-01-03,685.26,686.85,676.52,685.33,3252500,685.33 -2008-01-02,692.87,697.37,677.73,685.19,4306900,685.19 -2007-12-31,698.57,702.49,690.58,691.48,2376200,691.48 -2007-12-28,704.93,707.95,696.54,702.53,2562700,702.53 -2007-12-27,707.07,716.00,700.74,700.74,2942500,700.74 -2007-12-26,698.99,713.22,698.21,710.84,2530000,710.84 -2007-12-24,694.99,700.73,693.06,700.73,1628400,700.73 -2007-12-21,697.88,699.26,693.24,696.69,5382000,696.69 -2007-12-20,685.83,691.00,680.61,689.69,4422200,689.69 -2007-12-19,674.21,679.50,669.00,677.37,4421100,677.37 -2007-12-18,674.16,676.71,652.50,673.35,7166700,673.35 -2007-12-17,688.00,695.42,663.67,669.23,5486000,669.23 -2007-12-14,687.51,699.70,687.26,689.96,3673500,689.96 -2007-12-13,696.31,697.62,681.21,694.05,5040800,694.05 -2007-12-12,714.00,714.32,688.50,699.35,6159100,699.35 -2007-12-11,719.94,720.99,698.78,699.20,6139100,699.20 -2007-12-10,715.99,724.80,714.00,718.42,3856200,718.42 -2007-12-07,714.99,718.00,710.50,714.87,3852100,714.87 -2007-12-06,697.80,716.56,697.01,715.26,4909000,715.26 -2007-12-05,692.73,698.93,687.50,698.51,4209600,698.51 -2007-12-04,678.31,692.00,677.12,684.16,4231800,684.16 -2007-12-03,691.01,695.00,681.14,681.53,4325100,681.53 -2007-11-30,711.00,711.06,682.11,693.00,7895500,693.00 -2007-11-29,690.75,702.79,687.77,697.00,6208000,697.00 -2007-11-28,682.11,694.30,672.14,692.26,7916500,692.26 -2007-11-27,674.80,676.43,650.26,673.57,8904500,673.57 -2007-11-26,680.20,693.40,665.00,666.00,6790100,666.00 -2007-11-23,670.00,678.28,668.11,676.70,2738700,676.70 -2007-11-21,643.77,669.97,642.08,660.52,7013500,660.52 -2007-11-20,636.48,659.10,632.87,648.54,9840600,648.54 -2007-11-19,629.59,636.77,618.50,625.85,5527400,625.85 -2007-11-16,633.94,635.49,616.02,633.63,9042800,633.63 -2007-11-15,638.57,647.50,624.00,629.65,6967700,629.65 -2007-11-14,673.28,675.49,636.27,641.68,8094700,641.68 -2007-11-13,644.99,660.92,632.07,660.55,8426100,660.55 -2007-11-12,657.74,669.93,626.21,632.07,10227300,632.07 -2007-11-09,675.78,681.88,661.21,663.97,11388100,663.97 -2007-11-08,734.60,734.89,677.18,693.84,16512200,693.84 -2007-11-07,741.13,747.24,723.14,732.94,8252900,732.94 -2007-11-06,737.56,741.79,725.00,741.79,8436300,741.79 -2007-11-05,706.99,730.23,706.07,725.65,8883700,725.65 -2007-11-02,710.51,713.58,697.34,711.25,5841500,711.25 -2007-11-01,702.79,713.72,701.78,703.21,6527200,703.21 -2007-10-31,700.69,707.00,696.04,707.00,6876800,707.00 -2007-10-30,677.51,699.91,677.51,694.77,6900600,694.77 -2007-10-29,677.77,680.00,672.09,679.23,3066300,679.23 -2007-10-26,674.03,676.54,668.06,674.60,3353900,674.60 -2007-10-25,678.68,678.97,663.55,668.51,5795500,668.51 -2007-10-24,672.71,677.47,659.56,675.82,7404200,675.82 -2007-10-23,661.25,677.60,660.00,675.77,6793700,675.77 -2007-10-22,638.67,655.00,636.28,650.75,6664400,650.75 -2007-10-19,654.56,658.49,643.23,644.71,15789000,644.71 -2007-10-18,635.41,641.37,628.50,639.62,12289200,639.62 -2007-10-17,630.45,634.00,621.59,633.48,6030500,633.48 -2007-10-16,618.49,625.92,611.99,616.00,6025300,616.00 -2007-10-15,638.47,639.86,615.55,620.11,6943800,620.11 -2007-10-12,623.98,638.40,618.24,637.39,6823700,637.39 -2007-10-11,633.64,641.41,609.00,622.00,11799000,622.00 -2007-10-10,621.36,625.68,616.80,625.39,5385600,625.39 -2007-10-09,615.11,623.78,608.39,615.18,8767800,615.18 -2007-10-08,595.00,610.26,593.95,609.62,5028000,609.62 -2007-10-05,587.11,596.00,587.01,594.05,5068700,594.05 -2007-10-04,585.09,585.09,577.06,579.03,2986700,579.03 -2007-10-03,586.25,588.99,580.36,584.02,3879500,584.02 -2007-10-02,583.38,596.81,580.01,584.39,7067500,584.39 -2007-10-01,569.97,584.35,569.61,582.55,4711300,582.55 -2007-09-28,567.00,569.55,564.12,567.27,2639500,567.27 -2007-09-27,571.73,571.74,565.78,567.50,2056300,567.50 -2007-09-26,570.40,571.79,563.81,568.16,3346100,568.16 -2007-09-25,564.00,569.56,562.86,569.00,2730600,569.00 -2007-09-24,561.00,571.46,560.00,568.02,5297000,568.02 -2007-09-21,556.34,560.79,552.83,560.10,8011700,560.10 -2007-09-20,547.00,556.80,546.03,552.83,5525000,552.83 -2007-09-19,539.27,549.45,538.86,546.85,5526900,546.85 -2007-09-18,526.52,537.25,524.27,535.27,4215700,535.27 -2007-09-17,526.53,529.28,524.07,525.30,2197500,525.30 -2007-09-14,523.20,530.27,522.22,528.75,2764900,528.75 -2007-09-13,524.06,527.21,523.22,524.78,1891100,524.78 -2007-09-12,520.53,527.98,519.00,522.65,2986000,522.65 -2007-09-11,516.99,521.65,515.73,521.33,2703600,521.33 -2007-09-10,521.28,522.07,510.88,514.48,3225800,514.48 -2007-09-07,517.86,521.24,516.80,519.35,3663600,519.35 -2007-09-06,529.36,529.83,518.24,523.52,3625900,523.52 -2007-09-05,523.40,529.48,522.25,527.80,3312900,527.80 -2007-09-04,515.02,528.00,514.62,525.15,3693700,525.15 -2007-08-31,513.10,516.50,511.47,515.25,2977600,515.25 -2007-08-30,512.36,515.40,510.58,511.40,2651700,511.40 -2007-08-29,507.84,513.30,507.23,512.88,2549300,512.88 -2007-08-28,511.53,514.98,505.79,506.40,3273900,506.40 -2007-08-27,514.43,517.45,511.40,513.26,2325100,513.26 -2007-08-24,512.61,515.55,508.50,515.00,2472700,515.00 -2007-08-23,516.00,516.13,507.00,512.19,3076700,512.19 -2007-08-22,509.96,516.25,509.25,512.75,3252700,512.75 -2007-08-21,498.94,508.16,497.77,506.61,3610600,506.61 -2007-08-20,502.46,502.56,496.00,497.92,2697300,497.92 -2007-08-17,497.44,501.00,491.65,500.04,5479400,500.04 -2007-08-16,492.02,496.43,480.46,491.52,8645600,491.52 -2007-08-15,509.00,511.69,496.71,497.55,5409500,497.55 -2007-08-14,515.72,517.40,508.00,508.60,3633700,508.60 -2007-08-13,519.54,519.75,513.03,515.50,3179300,515.50 -2007-08-10,510.18,518.72,505.63,515.75,5875200,515.75 -2007-08-09,520.80,526.82,514.63,514.73,4846500,514.73 -2007-08-08,519.34,525.78,517.09,525.78,4068800,525.78 -2007-08-07,509.75,519.88,509.04,516.02,4264300,516.02 -2007-08-06,503.00,510.15,502.50,510.00,3651500,510.00 -2007-08-03,510.05,513.20,503.00,503.00,3176200,503.00 -2007-08-02,513.72,514.99,509.00,511.01,3154900,511.01 -2007-08-01,510.50,516.51,508.14,512.94,4421500,512.94 -2007-07-31,520.23,520.44,510.00,510.00,4270500,510.00 -2007-07-30,512.92,519.34,510.50,516.11,3963300,516.11 -2007-07-27,508.53,516.62,505.50,511.89,5509100,511.89 -2007-07-26,508.74,512.59,498.88,508.00,6883400,508.00 -2007-07-25,516.98,517.02,505.56,509.76,5545000,509.76 -2007-07-24,509.30,518.69,507.11,514.00,5572100,514.00 -2007-07-23,519.01,520.00,512.15,512.51,6356700,512.51 -2007-07-20,511.90,523.18,509.50,520.12,17772300,520.12 -2007-07-19,553.46,553.52,542.24,548.59,11127200,548.59 -2007-07-18,553.89,554.50,543.81,549.50,6080000,549.50 -2007-07-17,555.04,557.73,552.38,555.00,4328600,555.00 -2007-07-16,550.30,558.58,549.31,552.99,6599500,552.99 -2007-07-13,547.91,552.67,547.25,552.16,5237100,552.16 -2007-07-12,545.86,547.32,540.22,545.33,3441600,545.33 -2007-07-11,543.61,546.50,540.01,544.47,3309300,544.47 -2007-07-10,543.79,547.00,541.65,543.34,3856000,543.34 -2007-07-09,543.00,548.74,540.26,542.56,3729800,542.56 -2007-07-06,541.25,543.87,538.73,539.40,2747000,539.40 -2007-07-05,535.56,544.40,532.15,541.63,4942900,541.63 -2007-07-03,531.06,534.40,527.50,534.34,1871800,534.34 -2007-07-02,525.49,531.85,524.20,530.38,3487600,530.38 -2007-06-29,526.02,527.40,519.46,522.70,3880600,522.70 -2007-06-28,524.88,529.50,523.80,525.01,4168400,525.01 -2007-06-27,525.00,527.99,519.56,526.29,6123100,526.29 -2007-06-26,532.73,533.20,526.24,530.26,5689500,530.26 -2007-06-25,528.98,534.99,523.38,527.42,7925000,527.42 -2007-06-22,516.42,524.99,516.10,524.98,7203700,524.98 -2007-06-21,510.98,515.29,506.28,514.11,4409700,514.11 -2007-06-20,516.96,518.75,509.06,509.97,4338200,509.97 -2007-06-19,514.01,517.25,511.54,514.31,4355300,514.31 -2007-06-18,506.18,516.00,504.24,515.20,4835900,515.20 -2007-06-15,508.19,509.00,501.23,505.89,6174100,505.89 -2007-06-14,505.38,505.88,501.70,502.84,4621200,502.84 -2007-06-13,507.09,508.54,498.69,505.24,7034000,505.24 -2007-06-12,508.71,511.67,503.17,504.77,6419500,504.77 -2007-06-11,514.02,518.25,510.00,511.34,4647700,511.34 -2007-06-08,516.20,519.64,509.46,515.49,6358200,515.49 -2007-06-07,519.75,526.50,512.51,515.06,10630500,515.06 -2007-06-06,516.75,520.78,515.26,518.25,7886700,518.25 -2007-06-05,509.75,519.00,506.61,518.84,10447100,518.84 -2007-06-04,497.91,510.51,497.59,507.07,7101000,507.07 -2007-06-01,501.00,505.02,497.93,500.40,4799000,500.40 -2007-05-31,500.56,508.78,497.06,497.91,8924300,497.91 -2007-05-30,484.50,498.84,483.00,498.60,7245800,498.60 -2007-05-29,485.00,491.80,484.00,487.11,5218000,487.11 -2007-05-25,479.70,484.95,477.27,483.52,5348500,483.52 -2007-05-24,475.15,479.20,471.50,474.33,4173600,474.33 -2007-05-23,480.82,483.41,473.75,473.97,5060200,473.97 -2007-05-22,473.00,479.01,473.00,475.86,3839000,475.86 -2007-05-21,469.53,479.20,466.72,470.60,6159300,470.60 -2007-05-18,472.03,472.70,469.75,470.32,3695900,470.32 -2007-05-17,472.46,475.22,470.81,470.96,4660600,470.96 -2007-05-16,462.00,473.14,459.02,472.61,6554200,472.61 -2007-05-15,461.96,462.54,457.41,458.00,4119000,458.00 -2007-05-14,465.48,467.51,460.00,461.78,3872700,461.78 -2007-05-11,461.83,467.00,461.00,466.74,2944100,466.74 -2007-05-10,467.04,469.49,461.02,461.47,3686300,461.47 -2007-05-09,466.15,471.73,463.88,469.25,3889900,469.25 -2007-05-08,466.13,468.17,464.73,466.81,2905100,466.81 -2007-05-07,472.14,472.82,466.47,467.27,3020100,467.27 -2007-05-04,470.12,474.84,465.88,471.12,3950000,471.12 -2007-05-03,466.22,474.07,465.29,473.23,3594200,473.23 -2007-05-02,468.65,471.08,465.73,465.78,3062700,465.78 -2007-05-01,472.19,472.81,464.17,469.00,3658200,469.00 -2007-04-30,479.15,481.35,471.38,471.38,3641200,471.38 -2007-04-27,480.07,482.40,478.33,479.01,2925700,479.01 -2007-04-26,478.10,484.45,477.11,481.18,4124900,481.18 -2007-04-25,480.00,481.37,476.11,477.99,3966800,477.99 -2007-04-24,478.61,479.98,475.55,477.53,3694700,477.53 -2007-04-23,480.10,485.00,478.26,479.08,5674600,479.08 -2007-04-20,490.52,492.50,482.02,482.48,12161500,482.48 -2007-04-19,474.50,481.95,469.59,471.65,11009600,471.65 -2007-04-18,471.26,479.90,469.53,476.01,5670500,476.01 -2007-04-17,473.80,476.39,471.60,472.80,3210100,472.80 -2007-04-16,468.46,476.99,468.15,474.27,5077900,474.27 -2007-04-13,468.45,468.77,463.36,466.29,2794800,466.29 -2007-04-12,464.00,468.00,462.24,467.39,2707900,467.39 -2007-04-11,466.06,469.40,462.61,464.53,3812000,464.53 -2007-04-10,467.09,470.79,465.16,466.50,2979300,466.50 -2007-04-09,472.98,473.00,465.59,468.21,3062100,468.21 -2007-04-05,471.30,472.09,469.62,471.51,2715800,471.51 -2007-04-04,472.14,473.00,469.58,471.02,3778800,471.02 -2007-04-03,464.05,474.25,464.00,472.60,6501800,472.60 -2007-04-02,457.76,458.53,452.12,458.53,3448500,458.53 -2007-03-30,462.10,463.40,456.14,458.16,3380200,458.16 -2007-03-29,464.55,466.00,455.00,460.92,3988500,460.92 -2007-03-28,461.87,465.44,460.15,461.88,4591600,461.88 -2007-03-27,463.55,465.23,460.34,463.62,3741200,463.62 -2007-03-26,460.55,465.00,455.62,465.00,4710300,465.00 -2007-03-23,461.45,463.39,457.08,461.83,4111300,461.83 -2007-03-22,455.61,462.17,452.53,462.04,5680700,462.04 -2007-03-21,445.30,456.57,445.21,456.55,5798300,456.55 -2007-03-20,445.79,447.60,443.60,445.28,3421500,445.28 -2007-03-19,443.25,448.50,440.63,447.23,5197700,447.23 -2007-03-16,445.65,446.70,439.89,440.85,5659100,440.85 -2007-03-15,447.86,449.82,443.94,446.19,3944200,446.19 -2007-03-14,443.23,448.66,439.00,448.00,8016900,448.00 -2007-03-13,450.11,451.93,442.83,443.03,6377300,443.03 -2007-03-12,452.57,455.25,451.11,454.75,3465400,454.75 -2007-03-09,458.00,458.40,450.10,452.96,4977700,452.96 -2007-03-08,459.22,465.50,454.10,454.72,5362800,454.72 -2007-03-07,462.69,463.14,454.29,455.64,6534100,455.64 -2007-03-06,447.47,459.00,447.38,457.55,7533700,457.55 -2007-03-05,437.02,445.50,437.00,440.95,6355100,440.95 -2007-03-02,445.11,448.70,438.68,438.68,6583600,438.68 -2007-03-01,442.67,452.42,440.00,448.23,8685200,448.23 -2007-02-28,450.41,453.67,443.04,449.45,8032300,449.45 -2007-02-27,455.00,459.80,447.17,448.77,9312800,448.77 -2007-02-26,472.83,475.25,463.75,464.93,3969900,464.93 -2007-02-23,475.75,476.95,467.80,470.62,3882600,470.62 -2007-02-22,478.69,484.24,474.39,475.85,5743900,475.85 -2007-02-21,469.84,478.68,467.74,475.86,5640600,475.86 -2007-02-20,468.47,472.75,464.71,472.10,4067600,472.10 -2007-02-16,462.80,470.15,462.06,469.94,6177000,469.94 -2007-02-15,466.00,466.13,460.72,461.47,4042400,461.47 -2007-02-14,460.00,469.13,459.22,465.93,5698800,465.93 -2007-02-13,459.15,462.78,457.26,459.10,4062600,459.10 -2007-02-12,460.68,462.39,455.02,458.29,5754500,458.29 -2007-02-09,471.65,472.68,461.50,461.89,4858600,461.89 -2007-02-08,468.05,473.75,465.15,471.03,4076700,471.03 -2007-02-07,473.82,474.35,468.78,470.01,4119800,470.01 -2007-02-06,468.10,473.30,467.26,471.48,5321900,471.48 -2007-02-05,477.50,478.00,466.19,467.16,7206900,467.16 -2007-02-02,482.61,485.00,477.81,481.50,6286500,481.50 -2007-02-01,506.00,506.01,481.53,481.75,15658700,481.75 -2007-01-31,496.49,505.00,495.51,501.50,12206100,501.50 -2007-01-30,494.00,498.00,491.22,494.32,4180500,494.32 -2007-01-29,498.00,498.75,490.50,492.47,4775700,492.47 -2007-01-26,490.93,497.90,487.03,495.84,5496500,495.84 -2007-01-25,501.00,504.50,485.66,488.09,6368500,488.09 -2007-01-24,484.45,499.54,483.29,499.07,6059300,499.07 -2007-01-23,480.79,484.75,477.29,479.05,4665500,479.05 -2007-01-22,492.50,492.65,478.50,480.84,5404300,480.84 -2007-01-19,487.98,490.76,486.74,489.75,4978300,489.75 -2007-01-18,494.52,496.48,487.43,487.83,5932000,487.83 -2007-01-17,503.39,507.77,494.38,497.28,6699100,497.28 -2007-01-16,507.55,513.00,503.30,504.28,7568900,504.28 -2007-01-12,501.99,505.00,500.00,505.00,4473700,505.00 -2007-01-11,497.20,501.75,496.18,499.72,7208200,499.72 -2007-01-10,484.43,493.55,482.04,489.46,5968500,489.46 -2007-01-09,485.45,488.25,481.20,485.50,5381400,485.50 -2007-01-08,487.69,489.87,482.20,483.58,4754400,483.58 -2007-01-05,482.50,487.50,478.11,487.19,6872100,487.19 -2007-01-04,469.00,483.95,468.35,483.26,7887600,483.26 -2007-01-03,466.00,476.66,461.11,467.59,7706500,467.59 -2006-12-29,462.10,464.47,459.86,460.48,2559200,460.48 -2006-12-28,467.12,468.58,462.25,462.56,3116200,462.56 -2006-12-27,460.00,468.08,459.10,468.03,4231500,468.03 -2006-12-26,456.52,459.47,454.59,457.53,2074300,457.53 -2006-12-22,457.50,458.64,452.73,455.58,3988300,455.58 -2006-12-21,464.18,465.25,452.34,456.20,6953300,456.20 -2006-12-20,470.00,471.50,462.33,462.90,4367800,462.90 -2006-12-19,461.72,469.31,458.50,468.63,6587000,468.63 -2006-12-18,482.51,482.74,460.72,462.80,8016600,462.80 -2006-12-15,482.64,484.11,479.84,480.30,5190800,480.30 -2006-12-14,480.25,483.75,477.26,482.12,4748900,482.12 -2006-12-13,484.69,485.50,477.02,478.99,4662100,478.99 -2006-12-12,483.85,486.36,480.28,481.78,4181000,481.78 -2006-12-11,484.92,488.90,483.80,483.93,3263400,483.93 -2006-12-08,481.94,488.60,480.00,484.11,3974900,484.11 -2006-12-07,490.23,491.80,482.42,482.64,4664300,482.64 -2006-12-06,486.96,492.40,484.52,488.71,4450300,488.71 -2006-12-05,487.40,489.44,484.89,487.00,4103000,487.00 -2006-12-04,483.00,487.43,479.35,484.85,4899900,484.85 -2006-12-01,485.98,488.39,478.50,480.80,5631400,480.80 -2006-11-30,484.19,490.40,481.55,484.81,5577500,484.81 -2006-11-29,494.24,494.74,482.25,484.65,6315300,484.65 -2006-11-28,481.13,489.86,477.03,489.50,7797600,489.50 -2006-11-27,501.37,501.78,484.75,484.75,7324700,484.75 -2006-11-24,504.50,507.50,504.00,505.00,1732700,505.00 -2006-11-22,510.97,513.00,505.78,508.01,4500700,508.01 -2006-11-21,496.54,510.00,495.83,509.65,8427500,509.65 -2006-11-20,498.40,498.40,492.65,495.05,5124500,495.05 -2006-11-17,493.25,499.66,493.00,498.79,5511000,498.79 -2006-11-16,495.00,497.68,492.56,495.90,5092600,495.90 -2006-11-15,493.43,499.85,491.93,491.93,8370700,491.93 -2006-11-14,480.70,489.95,480.50,489.30,7223400,489.30 -2006-11-13,474.90,481.17,474.14,481.03,4341900,481.03 -2006-11-10,473.78,474.72,470.29,473.55,2796700,473.55 -2006-11-09,476.50,479.49,471.86,472.63,4879200,472.63 -2006-11-08,470.35,481.74,468.60,475.00,7965000,475.00 -2006-11-07,476.95,479.02,471.77,472.57,4897100,472.57 -2006-11-06,473.77,479.66,472.33,476.95,4991500,476.95 -2006-11-03,472.23,473.75,465.06,471.80,4907700,471.80 -2006-11-02,467.50,473.73,466.38,469.91,5236700,469.91 -2006-11-01,478.76,479.13,465.26,467.50,5426300,467.50 -2006-10-31,478.06,482.16,473.84,476.39,6285400,476.39 -2006-10-30,474.82,480.46,470.01,476.57,6563100,476.57 -2006-10-27,483.90,485.24,472.49,475.20,6604000,475.20 -2006-10-26,487.68,491.96,484.20,485.10,7031700,485.10 -2006-10-25,477.49,488.50,475.11,486.60,9187500,486.60 -2006-10-24,476.28,477.86,471.41,473.31,8660200,473.31 -2006-10-23,462.28,484.64,460.37,480.78,15104500,480.78 -2006-10-20,458.99,460.10,453.59,459.67,11647900,459.67 -2006-10-19,420.23,429.50,419.57,426.06,11503500,426.06 -2006-10-18,422.99,424.75,417.50,419.31,6017300,419.31 -2006-10-17,420.30,423.75,416.70,420.64,5211000,420.64 -2006-10-16,427.70,429.20,421.34,421.75,4319400,421.75 -2006-10-13,427.76,429.50,425.56,427.30,3622500,427.30 -2006-10-12,428.56,429.68,424.00,427.44,4844000,427.44 -2006-10-11,425.02,429.91,423.76,426.50,5635400,426.50 -2006-10-10,431.56,437.85,422.39,426.65,9788600,426.65 -2006-10-09,424.80,431.95,423.42,429.00,7583300,429.00 -2006-10-06,410.22,421.91,409.75,420.50,7336500,420.50 -2006-10-05,414.70,418.24,410.86,411.81,5789800,411.81 -2006-10-04,404.97,415.77,403.05,415.70,6661800,415.70 -2006-10-03,401.29,406.46,398.19,404.04,5464700,404.04 -2006-10-02,401.90,406.00,400.80,401.44,3651900,401.44 -2006-09-29,405.13,405.62,401.41,401.90,3310900,401.90 -2006-09-28,404.08,406.98,400.54,403.58,5107400,403.58 -2006-09-27,406.30,411.22,402.37,402.92,5876700,402.92 -2006-09-26,405.50,407.68,401.77,406.87,5289400,406.87 -2006-09-25,405.58,409.45,402.50,403.98,5737300,403.98 -2006-09-22,404.98,407.45,401.36,403.78,4649600,403.78 -2006-09-21,400.30,408.45,399.86,406.85,10692100,406.85 -2006-09-20,407.10,407.39,394.62,397.00,9147800,397.00 -2006-09-19,415.46,415.49,392.74,403.81,14292900,403.81 -2006-09-18,410.00,418.69,409.47,414.69,7106700,414.69 -2006-09-15,407.48,410.05,406.74,409.88,7838200,409.88 -2006-09-14,404.30,406.28,401.93,403.98,5366100,403.98 -2006-09-13,395.15,406.76,395.10,406.57,9768200,406.57 -2006-09-12,385.00,392.73,384.88,391.90,5442200,391.90 -2006-09-11,378.26,384.69,377.77,384.09,4529200,384.09 -2006-09-08,376.72,380.79,376.72,377.85,3083400,377.85 -2006-09-07,379.39,381.75,377.40,378.49,3842000,378.49 -2006-09-06,382.10,383.19,379.66,380.14,3724100,380.14 -2006-09-05,379.87,385.40,377.44,384.36,4074300,384.36 -2006-09-01,380.99,381.28,377.19,378.60,2672900,378.60 -2006-08-31,381.49,382.15,378.20,378.53,2959900,378.53 -2006-08-30,379.21,384.65,378.51,380.75,4044400,380.75 -2006-08-29,380.78,382.32,377.20,378.95,4460000,378.95 -2006-08-28,375.61,380.95,375.00,380.95,4164000,380.95 -2006-08-25,373.08,375.32,372.50,373.26,2466700,373.26 -2006-08-24,374.44,376.40,372.26,373.73,3482500,373.73 -2006-08-23,377.64,378.27,372.66,373.43,3642300,373.43 -2006-08-22,377.73,379.26,374.84,378.29,4164100,378.29 -2006-08-21,378.10,379.00,375.22,377.30,4023300,377.30 -2006-08-18,386.31,387.09,380.75,383.36,4952200,383.36 -2006-08-17,386.39,390.00,383.92,385.80,5080200,385.80 -2006-08-16,383.48,388.45,382.12,387.72,5853200,387.72 -2006-08-15,374.11,381.67,372.60,380.97,6698200,380.97 -2006-08-14,371.50,375.13,368.67,369.43,4968300,369.43 -2006-08-11,374.40,375.28,368.00,368.50,3766500,368.50 -2006-08-10,373.88,377.67,372.46,374.20,4261900,374.20 -2006-08-09,382.80,384.68,376.36,376.94,4311000,376.94 -2006-08-08,382.82,384.50,379.09,381.00,5743200,381.00 -2006-08-07,371.50,379.73,371.15,377.95,3946900,377.95 -2006-08-04,379.56,380.68,371.75,373.85,5095200,373.85 -2006-08-03,364.98,377.91,363.36,375.39,6327000,375.39 -2006-08-02,375.60,377.17,365.20,367.23,7097800,367.23 -2006-08-01,385.11,385.77,375.51,375.51,5463200,375.51 -2006-07-31,388.00,389.17,383.31,386.60,4595300,386.60 -2006-07-28,382.00,389.56,381.73,388.12,4083600,388.12 -2006-07-27,387.37,387.49,377.95,382.40,5641100,382.40 -2006-07-26,388.20,391.91,383.00,385.50,5531900,385.50 -2006-07-25,385.02,391.31,383.80,389.36,5761100,389.36 -2006-07-24,392.82,393.89,381.21,390.90,8086100,390.90 -2006-07-21,386.14,391.75,377.69,390.11,11754600,390.11 -2006-07-20,404.28,404.44,385.66,387.12,12538700,387.12 -2006-07-19,395.01,401.14,394.66,399.00,8518500,399.00 -2006-07-18,409.75,410.57,397.74,403.05,8536800,403.05 -2006-07-17,404.63,411.00,403.72,407.89,5811900,407.89 -2006-07-14,410.33,411.49,398.61,403.50,7552100,403.50 -2006-07-13,414.00,418.34,406.83,408.83,6924500,408.83 -2006-07-12,422.09,422.74,416.73,417.25,4906700,417.25 -2006-07-11,418.51,425.05,413.03,424.56,5971300,424.56 -2006-07-10,423.44,425.23,416.38,418.20,4436400,418.20 -2006-07-07,426.05,427.89,415.88,420.45,6041900,420.45 -2006-07-06,423.38,425.38,421.98,423.19,3687100,423.19 -2006-07-05,421.52,422.80,415.64,421.46,4985600,421.46 -2006-07-03,420.04,423.77,419.45,423.20,2156700,423.20 -2006-06-30,415.60,419.33,412.33,419.33,6258000,419.33 -2006-06-29,407.99,418.20,405.82,417.81,6658200,417.81 -2006-06-28,404.01,406.48,401.13,406.11,3710500,406.11 -2006-06-27,405.71,408.00,401.01,402.32,4107100,402.32 -2006-06-26,406.75,408.30,403.25,404.22,3551200,404.22 -2006-06-23,402.76,409.75,400.74,404.86,5314800,404.86 -2006-06-22,401.58,406.00,388.00,399.95,5911900,399.95 -2006-06-21,391.06,404.00,389.75,402.13,8744400,402.13 -2006-06-20,388.03,391.87,386.51,387.17,4039900,387.17 -2006-06-19,390.85,394.80,386.98,388.14,7633100,388.14 -2006-06-16,389.10,390.93,388.00,390.70,5304600,390.70 -2006-06-15,386.62,392.25,383.00,391.00,6785700,391.00 -2006-06-14,389.83,391.10,378.52,384.39,7772000,384.39 -2006-06-13,380.90,387.00,378.12,386.52,7659100,386.52 -2006-06-12,388.34,390.49,381.00,381.54,5019100,381.54 -2006-06-09,392.19,395.43,385.35,386.57,6157500,386.57 -2006-06-08,387.75,394.27,378.59,393.30,10359500,393.30 -2006-06-07,393.24,394.86,386.50,386.51,8911300,386.51 -2006-06-06,376.58,390.00,376.30,389.99,10259800,389.99 -2006-06-05,376.18,381.45,374.15,374.44,5558500,374.44 -2006-06-02,386.84,387.08,377.45,379.44,6386400,379.44 -2006-06-01,373.54,382.99,371.60,382.62,6278000,382.62 -2006-05-31,373.80,378.25,366.78,371.82,7981300,371.82 -2006-05-30,378.28,381.00,371.45,371.94,4316000,371.94 -2006-05-26,384.55,385.88,380.03,381.35,3667000,381.35 -2006-05-25,379.08,383.00,372.31,382.99,8194600,382.99 -2006-05-24,377.35,383.44,371.61,381.25,9553800,381.25 -2006-05-23,374.21,383.88,373.56,375.58,8983000,375.58 -2006-05-22,367.85,373.03,365.25,370.95,8604400,370.95 -2006-05-19,373.28,374.50,360.57,370.02,11398200,370.02 -2006-05-18,378.78,381.81,370.71,370.99,5835000,370.99 -2006-05-17,370.61,379.84,370.22,374.50,10643800,374.50 -2006-05-16,375.99,376.86,369.89,371.30,6491100,371.30 -2006-05-15,375.93,380.15,368.25,376.20,8590100,376.20 -2006-05-12,383.54,384.87,373.55,374.13,10087600,374.13 -2006-05-11,403.42,404.71,384.98,387.00,8892800,387.00 -2006-05-10,408.31,411.71,401.86,402.98,6187200,402.98 -2006-05-09,395.70,409.00,393.75,408.80,9140600,408.80 -2006-05-08,395.11,397.12,390.05,394.78,5118600,394.78 -2006-05-05,397.60,400.68,391.78,394.30,6065000,394.30 -2006-05-04,395.03,398.87,392.21,394.75,4652000,394.75 -2006-05-03,396.35,401.50,390.88,394.17,8072200,394.17 -2006-05-02,401.08,402.49,388.40,394.80,13104300,394.80 -2006-05-01,418.47,419.44,398.55,398.90,10361200,398.90 -2006-04-28,418.63,425.73,416.30,417.94,7421300,417.94 -2006-04-27,422.91,426.91,419.39,420.03,8337900,420.03 -2006-04-26,427.74,430.04,423.53,425.97,7277800,425.97 -2006-04-25,439.63,441.04,426.00,427.16,9569000,427.16 -2006-04-24,439.40,444.70,436.52,440.50,8836400,440.50 -2006-04-21,448.90,450.72,436.17,437.10,22551300,437.10 -2006-04-20,411.01,416.00,408.20,415.00,12271500,415.00 -2006-04-19,412.57,413.64,406.73,410.50,6781700,410.50 -2006-04-18,407.93,409.83,401.50,404.24,8137600,404.24 -2006-04-17,403.45,412.50,400.84,406.82,8259500,406.82 -2006-04-13,408.63,409.76,400.50,402.16,6552900,402.16 -2006-04-12,409.00,411.33,405.19,408.95,6017000,408.95 -2006-04-11,416.42,419.10,406.22,409.66,11107200,409.66 -2006-04-10,407.08,417.17,405.25,416.38,9320100,416.38 -2006-04-07,412.41,412.85,404.02,406.16,7025900,406.16 -2006-04-06,406.49,413.89,405.43,411.18,8598500,411.18 -2006-04-05,408.20,414.57,402.82,407.99,13410500,407.99 -2006-04-04,389.90,404.90,388.14,404.34,15715700,404.34 -2006-04-03,389.53,392.47,387.93,389.70,8122700,389.70 -2006-03-31,388.74,391.87,384.03,390.00,36521400,390.00 -2006-03-30,389.19,393.50,383.61,388.44,14711700,388.44 -2006-03-29,379.94,399.00,379.51,394.98,19027500,394.98 -2006-03-28,371.71,377.86,371.17,377.20,8945800,377.20 -2006-03-27,367.09,371.71,365.00,369.69,7023700,369.69 -2006-03-24,368.62,370.09,362.51,365.80,15180600,365.80 -2006-03-23,342.35,345.75,340.20,341.89,7434700,341.89 -2006-03-22,339.75,344.10,337.50,340.22,7596000,340.22 -2006-03-21,350.01,351.66,339.08,339.92,9831100,339.92 -2006-03-20,342.34,350.09,341.54,348.19,10407600,348.19 -2006-03-17,338.80,341.78,334.93,339.79,8551700,339.79 -2006-03-16,348.61,348.75,337.90,338.77,10016700,338.77 -2006-03-15,350.77,352.30,340.53,344.50,12768800,344.50 -2006-03-14,337.14,352.37,332.62,351.16,18450700,351.16 -2006-03-13,340.93,346.10,335.45,337.06,13642400,337.06 -2006-03-10,343.50,344.50,331.55,337.50,19325600,337.50 -2006-03-09,355.39,358.53,341.50,343.00,13910400,343.00 -2006-03-08,353.93,360.03,350.54,353.88,11745600,353.88 -2006-03-07,365.02,368.45,358.15,364.45,10378800,364.45 -2006-03-06,380.91,383.40,367.14,368.10,8939700,368.10 -2006-03-03,384.30,387.24,375.76,378.18,11962000,378.18 -2006-03-02,364.28,381.10,362.20,376.45,18330300,376.45 -2006-03-01,368.56,369.45,361.30,364.80,12061200,364.80 -2006-02-28,393.20,397.54,338.51,362.62,39437600,362.62 -2006-02-27,381.27,391.70,380.28,390.38,10212200,390.38 -2006-02-24,377.30,380.07,373.49,377.40,6484300,377.40 -2006-02-23,365.61,381.24,365.39,378.07,12551600,378.07 -2006-02-22,367.15,368.95,363.86,365.49,6476200,365.49 -2006-02-21,366.44,373.54,365.11,366.59,8686000,366.59 -2006-02-17,369.86,372.14,363.62,368.75,14320200,368.75 -2006-02-16,345.67,367.00,344.49,366.46,21315500,366.46 -2006-02-15,341.27,346.00,337.83,342.38,12947000,342.38 -2006-02-14,345.33,351.69,342.40,343.32,14654000,343.32 -2006-02-13,346.64,350.60,341.89,345.70,19717800,345.70 -2006-02-10,361.95,364.50,353.14,362.61,15223500,362.61 -2006-02-09,371.20,374.40,356.11,358.77,11912400,358.77 -2006-02-08,368.48,370.69,354.67,369.08,20804100,369.08 -2006-02-07,382.99,383.70,363.35,367.92,16630200,367.92 -2006-02-06,385.31,389.90,379.56,385.10,8940400,385.10 -2006-02-03,393.62,393.90,372.57,381.55,18281800,381.55 -2006-02-02,403.82,406.50,395.98,396.04,11807700,396.04 -2006-02-01,389.03,402.00,387.52,401.78,27122500,401.78 -2006-01-31,430.57,439.60,423.97,432.66,22066000,432.66 -2006-01-30,429.23,433.28,425.00,426.82,8588900,426.82 -2006-01-27,435.00,438.22,428.98,433.49,8452200,433.49 -2006-01-26,439.54,439.99,423.56,434.27,12926100,434.27 -2006-01-25,451.26,454.23,429.22,433.00,18739800,433.00 -2006-01-24,436.03,444.95,434.48,443.03,15464600,443.03 -2006-01-23,407.38,428.39,405.73,427.50,22741400,427.50 -2006-01-20,438.70,440.03,394.74,399.46,41116700,399.46 -2006-01-19,451.17,453.49,433.00,436.45,14537300,436.45 -2006-01-18,447.30,457.36,443.25,444.91,20485700,444.91 -2006-01-17,463.06,469.90,462.53,467.11,8270300,467.11 -2006-01-13,464.31,466.89,461.61,466.25,7656600,466.25 -2006-01-12,473.72,474.99,461.50,463.63,10125300,463.63 -2006-01-11,471.27,475.11,469.18,471.63,9007400,471.63 -2006-01-10,464.42,470.25,462.04,469.76,9097100,469.76 -2006-01-09,466.41,473.40,460.94,466.90,12791900,466.90 -2006-01-06,456.87,470.50,453.24,465.66,17756900,465.66 -2006-01-05,446.00,451.55,441.50,451.24,10808300,451.24 -2006-01-04,443.90,448.96,439.75,445.24,15286400,445.24 -2006-01-03,422.52,435.67,418.22,435.23,13121200,435.23 -2005-12-30,417.27,418.21,413.74,414.86,7587100,414.86 -2005-12-29,427.98,428.73,419.17,420.15,6945800,420.15 -2005-12-28,424.34,427.78,421.26,426.69,7117900,426.69 -2005-12-27,431.86,431.86,422.76,424.64,6702800,424.64 -2005-12-23,432.15,432.50,428.78,430.93,4595100,430.93 -2005-12-22,431.77,432.86,425.93,432.04,7546600,432.04 -2005-12-21,433.55,436.86,420.71,426.33,11221900,426.33 -2005-12-20,427.86,432.20,424.67,429.74,10084700,429.74 -2005-12-19,432.20,446.21,420.11,424.60,21936800,424.60 -2005-12-16,425.34,432.50,422.75,430.15,16330500,430.15 -2005-12-15,419.11,423.14,416.50,422.55,6045800,422.55 -2005-12-14,417.04,419.73,415.49,418.96,6630400,418.96 -2005-12-13,412.50,418.00,411.64,417.49,8157000,417.49 -2005-12-12,414.63,415.21,409.95,412.61,6950100,412.61 -2005-12-09,415.00,415.78,408.56,409.20,7643400,409.20 -2005-12-08,405.30,410.65,402.64,410.65,8910100,410.65 -2005-12-07,406.16,406.70,399.01,404.22,11665900,404.22 -2005-12-06,408.70,416.41,401.70,404.54,15114700,404.54 -2005-12-05,417.00,417.50,404.28,405.85,10289400,405.85 -2005-12-02,416.94,419.53,413.86,417.70,7543500,417.70 -2005-12-01,409.20,415.44,408.29,414.09,9744900,414.09 -2005-11-30,404.26,408.45,395.56,404.91,15596600,404.91 -2005-11-29,424.46,426.40,402.14,403.54,21495800,403.54 -2005-11-28,429.82,431.24,422.44,423.48,11008400,423.48 -2005-11-25,425.78,428.75,425.30,428.62,4840100,428.62 -2005-11-23,417.04,424.72,415.78,422.86,10085000,422.86 -2005-11-22,408.65,417.31,406.23,416.47,9596000,416.47 -2005-11-21,399.17,409.98,393.49,409.36,10335100,409.36 -2005-11-18,403.49,404.50,399.85,400.21,7025700,400.21 -2005-11-17,401.80,403.81,399.53,403.45,9212200,403.45 -2005-11-16,396.20,398.85,394.11,398.15,8695200,398.15 -2005-11-15,394.38,397.00,390.95,392.80,8624900,392.80 -2005-11-14,392.12,398.22,391.53,396.97,7807900,396.97 -2005-11-11,395.12,396.90,388.85,390.40,7063900,390.40 -2005-11-10,378.36,391.35,377.43,391.10,9128700,391.10 -2005-11-09,386.67,388.29,378.03,379.15,10466900,379.15 -2005-11-08,394.25,395.59,388.58,389.90,7897500,389.90 -2005-11-07,395.10,397.47,392.15,395.03,9591500,395.03 -2005-11-04,389.98,391.79,385.45,390.43,8824900,390.43 -2005-11-03,382.41,386.58,381.38,385.95,7448400,385.95 -2005-11-02,381.70,385.00,377.17,379.68,10565400,379.68 -2005-11-01,371.86,383.90,369.01,379.38,16356100,379.38 -2005-10-31,360.24,374.75,359.51,372.14,14342900,372.14 -2005-10-28,355.27,358.95,355.02,358.17,5903500,358.17 -2005-10-27,356.60,357.09,351.68,353.06,5134400,353.06 -2005-10-26,346.28,356.00,346.19,355.44,8907500,355.44 -2005-10-25,345.78,347.40,342.86,346.91,6878300,346.91 -2005-10-24,343.37,349.30,342.19,348.65,9431700,348.65 -2005-10-21,345.80,346.43,333.00,339.90,22892400,339.90 -2005-10-20,309.99,311.13,301.21,303.20,13911700,303.20 -2005-10-19,304.00,309.87,303.96,308.70,7010700,308.70 -2005-10-18,304.96,307.96,302.74,303.28,7077800,303.28 -2005-10-17,297.50,305.20,294.56,305.00,7566700,305.00 -2005-10-14,299.90,300.23,292.54,296.14,8519100,296.14 -2005-10-13,302.00,302.00,290.68,297.44,10567700,297.44 -2005-10-12,305.20,307.19,299.00,300.97,9306200,300.97 -2005-10-11,310.61,312.65,304.86,306.10,8542600,306.10 -2005-10-10,313.31,314.82,309.15,310.65,5572200,310.65 -2005-10-07,314.79,316.67,310.54,312.99,6770300,312.99 -2005-10-06,314.14,314.48,310.09,312.75,7993800,312.75 -2005-10-05,312.69,314.90,308.00,310.71,8328400,310.71 -2005-10-04,319.95,321.28,310.74,311.00,9144300,311.00 -2005-10-03,313.63,320.11,312.79,318.68,9160300,318.68 -2005-09-30,314.22,317.50,312.29,316.46,9151300,316.46 -2005-09-29,306.68,310.72,306.08,309.62,5613800,309.62 -2005-09-28,314.22,315.10,305.60,306.00,7997400,306.00 -2005-09-27,314.95,318.41,313.38,313.94,6873100,313.94 -2005-09-26,319.50,320.95,312.56,314.28,9894400,314.28 -2005-09-23,313.00,317.21,312.59,315.36,8483800,315.36 -2005-09-22,311.50,319.22,310.17,311.37,13006400,311.37 -2005-09-21,308.41,313.76,305.96,311.90,10119700,311.90 -2005-09-20,306.15,311.30,305.23,307.91,9351000,307.91 -2005-09-19,301.00,306.00,300.71,303.79,5761900,303.79 -2005-09-16,304.02,304.50,299.87,300.20,7579800,300.20 -2005-09-15,299.52,306.75,297.91,302.62,15466200,302.62 -2005-09-14,308.73,313.28,300.30,303.00,11275800,303.00 -2005-09-13,309.00,315.53,306.17,311.68,10299900,311.68 -2005-09-12,301.75,311.42,301.00,309.74,10386500,309.74 -2005-09-09,297.28,299.10,296.56,299.09,4390500,299.09 -2005-09-08,294.83,299.28,293.36,295.39,6613300,295.39 -2005-09-07,285.89,295.50,285.28,294.87,7499500,294.87 -2005-09-06,289.00,289.39,286.80,287.11,4212300,287.11 -2005-09-02,286.51,289.99,286.44,288.45,3434500,288.45 -2005-09-01,285.91,287.50,285.00,286.25,2742100,286.25 -2005-08-31,288.23,288.50,284.36,286.00,5034000,286.00 -2005-08-30,287.39,289.51,285.88,287.27,4792000,287.27 -2005-08-29,282.24,289.12,282.24,288.45,5903000,288.45 -2005-08-26,283.48,285.02,282.66,283.58,3755300,283.58 -2005-08-25,282.55,284.00,279.97,282.59,4376600,282.59 -2005-08-24,277.57,284.75,276.45,282.57,8593100,282.57 -2005-08-23,276.16,279.74,274.12,279.58,5821700,279.58 -2005-08-22,281.24,281.47,273.35,274.01,6813000,274.01 -2005-08-19,280.99,281.45,279.62,280.00,5542900,280.00 -2005-08-18,275.91,280.50,275.00,279.99,11872800,279.99 -2005-08-17,285.51,286.57,284.00,285.10,3883300,285.10 -2005-08-16,284.88,287.79,283.34,285.65,7109200,285.65 -2005-08-15,289.80,292.77,283.77,284.00,8174700,284.00 -2005-08-12,283.36,290.20,281.64,289.72,6585900,289.72 -2005-08-11,285.89,286.58,280.62,284.05,7514900,284.05 -2005-08-10,291.30,292.33,284.88,285.68,6879000,285.68 -2005-08-09,291.96,292.68,288.51,291.57,5779300,291.57 -2005-08-08,293.60,295.65,290.49,291.25,4481800,291.25 -2005-08-05,297.50,298.51,291.31,292.35,5939700,292.35 -2005-08-04,295.55,299.00,295.25,297.73,5236500,297.73 -2005-08-03,298.00,299.72,295.60,297.30,5930600,297.30 -2005-08-02,291.60,299.52,291.12,299.19,7290200,299.19 -2005-08-01,288.12,292.50,288.10,291.61,5662400,291.61 -2005-07-29,292.14,292.84,286.99,287.76,8363300,287.76 -2005-07-28,297.41,297.41,293.28,293.50,5925600,293.50 -2005-07-27,297.74,298.23,292.40,296.93,7217900,296.93 -2005-07-26,295.01,298.00,292.09,296.09,9816900,296.09 -2005-07-25,302.39,303.29,294.96,295.85,9658800,295.85 -2005-07-22,306.37,309.25,296.33,302.40,23386800,302.40 -2005-07-21,314.05,317.80,311.21,313.94,19789400,313.94 -2005-07-20,305.57,312.61,301.80,312.00,14310400,312.00 -2005-07-19,302.10,310.35,301.80,309.90,12621400,309.90 -2005-07-18,300.00,301.90,297.75,299.54,6207800,299.54 -2005-07-15,301.24,303.40,299.78,301.19,8438400,301.19 -2005-07-14,305.34,306.75,300.07,300.89,10667700,300.89 -2005-07-13,292.51,299.24,292.10,298.86,11437900,298.86 -2005-07-12,293.39,294.40,290.93,291.78,5864900,291.78 -2005-07-11,296.40,296.60,291.02,293.35,8390300,293.35 -2005-07-08,296.25,297.50,294.05,296.23,7457600,296.23 -2005-07-07,289.39,295.80,288.51,295.54,10672100,295.54 -2005-07-06,297.30,297.60,291.38,291.52,8000300,291.52 -2005-07-05,292.10,295.98,290.23,295.71,7494000,295.71 -2005-07-01,295.04,296.24,289.22,291.25,9227600,291.25 -2005-06-30,294.34,298.93,291.04,294.15,15094400,294.15 -2005-06-29,302.50,304.38,292.15,292.72,18298700,292.72 -2005-06-28,306.28,309.25,302.00,302.00,19036500,302.00 -2005-06-27,298.90,304.47,293.86,304.10,17802900,304.10 -2005-06-24,290.90,298.00,289.58,297.25,17771200,297.25 -2005-06-23,288.00,294.81,286.50,289.71,14056400,289.71 -2005-06-22,289.67,292.32,288.67,289.30,10474000,289.30 -2005-06-21,288.07,290.30,284.97,287.84,15132300,287.84 -2005-06-20,276.09,287.67,271.73,286.70,21024700,286.70 -2005-06-17,279.00,280.30,275.90,280.30,10434400,280.30 -2005-06-16,274.26,278.30,273.07,277.44,12462400,277.44 -2005-06-15,275.00,277.30,267.43,274.80,20883100,274.80 -2005-06-14,278.59,281.24,277.75,278.35,10091900,278.35 -2005-06-13,279.82,284.19,276.52,282.75,12803200,282.75 -2005-06-10,286.99,287.28,280.02,282.50,12696600,282.50 -2005-06-09,284.72,288.50,280.56,286.31,16441100,286.31 -2005-06-08,292.85,293.19,278.00,279.56,25700900,279.56 -2005-06-07,297.10,299.59,290.30,293.12,24323000,293.12 -2005-06-06,282.39,293.75,281.83,290.94,22525900,290.94 -2005-06-03,286.79,289.30,277.41,280.26,18782300,280.26 -2005-06-02,288.73,289.78,284.60,287.90,17974100,287.90 -2005-06-01,283.20,292.89,282.02,288.00,35191700,288.00 -2005-05-31,269.43,278.40,269.37,277.27,22236800,277.27 -2005-05-27,260.46,266.05,259.25,266.00,12184100,266.00 -2005-05-26,260.96,263.76,258.30,259.20,13546600,259.20 -2005-05-25,252.73,260.98,250.63,260.81,18057900,260.81 -2005-05-24,256.96,265.44,253.50,256.00,29043100,256.00 -2005-05-23,243.16,258.10,242.71,255.45,21388300,255.45 -2005-05-20,241.21,241.67,239.65,241.61,8163500,241.61 -2005-05-19,240.34,241.17,238.27,239.18,9716500,239.18 -2005-05-18,233.61,239.97,233.52,239.16,12312000,239.16 -2005-05-17,230.56,233.45,230.20,233.13,7808900,233.13 -2005-05-16,229.68,231.62,228.57,231.05,5681400,231.05 -2005-05-13,229.18,231.09,227.32,229.24,7415500,229.24 -2005-05-12,230.81,232.23,228.20,228.72,8948200,228.72 -2005-05-11,228.97,231.98,227.93,231.29,11478800,231.29 -2005-05-10,225.47,227.80,224.72,227.80,6345800,227.80 -2005-05-09,228.00,228.50,225.43,226.02,5536800,226.02 -2005-05-06,228.40,229.25,226.47,228.02,6763900,228.02 -2005-05-05,228.62,228.62,225.88,226.98,7509600,226.98 -2005-05-04,227.23,229.88,227.00,228.50,12083500,228.50 -2005-05-03,221.85,228.15,221.32,226.19,17780200,226.19 -2005-05-02,222.05,223.70,220.21,222.29,9767400,222.29 -2005-04-29,221.91,222.25,217.82,220.00,9170200,220.00 -2005-04-28,219.50,222.08,217.71,219.45,8682800,219.45 -2005-04-27,217.99,220.85,216.74,219.78,10264800,219.78 -2005-04-26,220.22,222.00,218.29,218.75,17272000,218.75 -2005-04-25,217.82,224.74,217.52,223.53,19840000,223.53 -2005-04-22,222.90,224.00,214.26,215.81,33205100,215.81 -2005-04-21,200.42,205.00,199.32,204.22,17751900,204.22 -2005-04-20,198.58,200.50,195.91,198.10,15451500,198.10 -2005-04-19,189.33,192.00,188.03,191.40,8430000,191.40 -2005-04-18,184.58,187.88,183.49,186.97,6550300,186.97 -2005-04-15,190.10,190.34,184.66,185.00,11577400,185.00 -2005-04-14,193.27,194.36,190.10,191.45,6152700,191.45 -2005-04-13,193.47,194.32,189.73,192.93,6555800,192.93 -2005-04-12,193.00,194.42,189.41,193.96,7319600,193.96 -2005-04-11,193.09,194.80,192.32,193.23,5410500,193.23 -2005-04-08,193.69,195.10,191.45,192.05,5116600,192.05 -2005-04-07,188.78,194.62,188.64,193.76,9692200,193.76 -2005-04-06,189.24,189.65,187.58,189.22,5252600,189.22 -2005-04-05,187.73,190.26,187.57,188.57,8736700,188.57 -2005-04-04,179.95,185.32,179.84,185.29,8076400,185.29 -2005-04-01,181.76,182.95,179.99,180.04,6182000,180.04 -2005-03-31,177.95,181.39,177.64,180.51,6768600,180.51 -2005-03-30,180.64,181.45,179.60,180.45,6236100,180.45 -2005-03-29,181.05,183.28,178.07,179.57,6473000,179.57 -2005-03-28,181.68,184.80,180.95,181.42,8738000,181.42 -2005-03-24,180.70,180.86,179.20,179.25,3705200,179.25 -2005-03-23,177.97,180.24,177.97,178.98,4845000,178.98 -2005-03-22,181.18,181.94,177.85,178.60,5631700,178.60 -2005-03-21,179.27,182.17,177.25,180.88,7483700,180.88 -2005-03-18,178.81,180.40,178.31,180.04,7090000,180.04 -2005-03-17,177.13,179.64,175.80,179.29,8260600,179.29 -2005-03-16,176.70,178.61,175.01,175.60,7106300,175.60 -2005-03-15,175.30,180.00,174.21,178.61,10422100,178.61 -2005-03-14,178.33,178.40,172.57,174.99,11146600,174.99 -2005-03-11,180.44,180.95,177.15,177.80,8028300,177.80 -2005-03-10,181.01,181.20,177.40,179.98,10960500,179.98 -2005-03-09,184.21,184.65,180.16,181.35,11360400,181.35 -2005-03-08,189.10,189.85,184.97,185.20,8046100,185.20 -2005-03-07,187.78,189.60,187.03,188.81,8667400,188.81 -2005-03-04,186.70,187.25,185.07,185.90,6774100,185.90 -2005-03-03,186.13,187.75,184.31,187.01,7608600,187.01 -2005-03-02,185.95,187.67,184.36,185.18,7285500,185.18 -2005-03-01,189.29,189.75,182.00,186.06,9311200,186.06 -2005-02-28,186.00,189.87,185.85,187.99,7818400,187.99 -2005-02-25,189.15,189.92,185.51,185.87,9973500,185.87 -2005-02-24,183.37,189.85,182.23,188.89,25814300,188.89 -2005-02-23,193.30,194.48,188.66,193.95,15586000,193.95 -2005-02-22,196.50,198.90,190.39,191.37,13483700,191.37 -2005-02-18,198.51,198.84,196.66,197.95,8485900,197.95 -2005-02-17,197.83,199.75,196.81,197.90,10414400,197.90 -2005-02-16,194.70,199.33,194.30,198.41,16532300,198.41 -2005-02-15,193.60,199.84,193.08,195.23,25782800,195.23 -2005-02-14,182.85,193.08,181.00,192.99,38562200,192.99 -2005-02-11,186.66,192.32,186.07,187.40,13116000,187.40 -2005-02-10,191.97,192.21,185.25,187.98,18982700,187.98 -2005-02-09,200.76,201.60,189.46,191.58,17171500,191.58 -2005-02-08,196.96,200.02,194.53,198.64,11480000,198.64 -2005-02-07,205.26,206.40,195.51,196.03,12960400,196.03 -2005-02-04,206.47,207.75,202.60,204.36,14819300,204.36 -2005-02-03,205.99,213.37,205.81,210.86,12988100,210.86 -2005-02-02,215.55,216.80,203.66,205.96,32799300,205.96 -2005-02-01,194.38,196.66,190.63,191.90,18839000,191.90 -2005-01-31,193.69,196.36,191.72,195.62,9596700,195.62 -2005-01-28,190.02,194.70,186.34,190.34,12208200,190.34 -2005-01-27,188.76,188.86,185.20,188.08,6627400,188.08 -2005-01-26,179.27,189.41,179.15,189.24,12307900,189.24 -2005-01-25,181.94,182.24,176.29,177.12,10659200,177.12 -2005-01-24,188.69,189.33,180.32,180.72,14022700,180.72 -2005-01-21,194.54,195.36,188.12,188.28,9258400,188.28 -2005-01-20,192.50,196.25,192.00,193.92,9001600,193.92 -2005-01-19,204.65,205.30,196.71,197.30,11257700,197.30 -2005-01-18,200.97,205.02,198.66,203.90,13172600,203.90 -2005-01-14,196.00,200.01,194.13,199.97,9640300,199.97 -2005-01-13,195.38,197.39,194.05,195.33,6849400,195.33 -2005-01-12,194.33,195.93,190.50,195.38,8177800,195.38 -2005-01-11,195.62,197.71,193.18,193.54,6958700,193.54 -2005-01-10,194.50,198.10,191.83,195.06,7539600,195.06 -2005-01-07,190.64,194.25,188.78,193.85,9662900,193.85 -2005-01-06,195.08,195.90,187.72,188.55,10387100,188.55 -2005-01-05,193.45,196.90,192.23,193.51,8236600,193.51 -2005-01-04,201.40,202.93,193.48,194.50,13755900,194.50 -2005-01-03,197.40,203.64,195.46,202.71,15844200,202.71 -2004-12-31,199.23,199.88,192.56,192.79,7668500,192.79 -2004-12-30,192.97,198.23,191.85,197.60,5904300,197.60 -2004-12-29,191.78,193.52,191.78,192.90,2678100,192.90 -2004-12-28,192.11,193.55,191.01,192.76,4145800,192.76 -2004-12-27,189.15,193.30,189.10,191.91,6104100,191.91 -2004-12-23,187.45,188.60,186.00,187.90,3614600,187.90 -2004-12-22,183.90,186.85,183.01,186.30,3907000,186.30 -2004-12-21,186.31,187.88,183.40,183.75,5516300,183.75 -2004-12-20,182.00,188.46,181.87,185.02,9834500,185.02 -2004-12-17,176.76,180.50,176.55,180.08,7386200,180.08 -2004-12-16,176.95,180.49,175.95,176.47,8572800,176.47 -2004-12-15,177.99,180.69,176.66,179.78,11471000,179.78 -2004-12-14,171.00,178.82,169.60,178.69,11088400,178.69 -2004-12-13,172.17,173.18,169.45,170.45,4818600,170.45 -2004-12-10,173.43,174.88,171.29,171.65,4317200,171.65 -2004-12-09,170.25,173.50,168.47,173.43,7654000,173.43 -2004-12-08,170.35,173.68,168.73,169.98,7541800,169.98 -2004-12-07,176.00,176.20,170.55,171.43,6870900,171.43 -2004-12-06,179.13,180.70,176.02,176.29,6254000,176.29 -2004-12-03,179.95,181.06,177.60,180.40,5869200,180.40 -2004-12-02,179.90,181.51,178.55,179.40,6260900,179.40 -2004-12-01,181.95,182.50,179.55,179.96,7864100,179.96 -2004-11-30,180.71,183.00,180.25,181.98,7700000,181.98 -2004-11-29,180.36,182.95,177.51,181.05,10666600,181.05 -2004-11-26,175.80,180.03,175.32,179.39,6480100,179.39 -2004-11-24,174.82,177.21,172.51,174.76,15281000,174.76 -2004-11-23,167.97,170.83,166.50,167.52,12413300,167.52 -2004-11-22,164.47,169.50,161.31,165.10,12368200,165.10 -2004-11-19,169.10,169.98,166.52,169.40,8769300,169.40 -2004-11-18,170.29,174.42,165.73,167.54,16629600,167.54 -2004-11-17,169.02,177.50,169.00,172.50,18132900,172.50 -2004-11-16,177.50,179.47,170.83,172.54,20917400,172.54 -2004-11-15,180.45,188.32,178.75,184.87,11901500,184.87 -2004-11-12,185.23,189.80,177.40,182.00,16746100,182.00 -2004-11-11,169.13,183.75,167.57,183.02,14985500,183.02 -2004-11-10,170.67,172.52,166.33,167.86,10644000,167.86 -2004-11-09,174.10,175.20,165.27,168.70,11064200,168.70 -2004-11-08,170.93,175.44,169.40,172.55,11191800,172.55 -2004-11-05,181.98,182.30,168.55,169.35,19833100,169.35 -2004-11-04,188.44,190.40,183.35,184.70,14409600,184.70 -2004-11-03,198.18,201.60,190.75,191.67,13888700,191.67 -2004-11-02,198.78,199.25,193.34,194.87,11346300,194.87 -2004-11-01,193.55,197.67,191.27,196.03,12224900,196.03 -2004-10-29,198.89,199.95,190.60,190.64,21162500,190.64 -2004-10-28,186.68,194.39,185.60,193.30,14846800,193.30 -2004-10-27,182.72,189.52,181.77,185.97,13356500,185.97 -2004-10-26,186.34,192.64,180.00,181.80,22307100,181.80 -2004-10-25,176.40,194.43,172.55,187.40,32764200,187.40 -2004-10-22,170.54,180.17,164.08,172.43,36891900,172.43 -2004-10-21,144.40,150.13,141.62,149.38,14589500,149.38 -2004-10-20,148.03,148.99,139.60,140.49,11372700,140.49 -2004-10-19,150.50,152.40,147.35,147.94,9064000,147.94 -2004-10-18,143.20,149.20,141.21,149.16,7025200,149.16 -2004-10-15,144.93,145.50,141.95,144.11,6604000,144.11 -2004-10-14,141.01,142.38,138.56,142.00,5226300,142.00 -2004-10-13,143.32,143.55,140.08,140.90,9893000,140.90 -2004-10-12,134.44,137.61,133.40,137.40,5838600,137.40 -2004-10-11,137.00,138.86,133.85,135.26,5241300,135.26 -2004-10-08,138.72,139.68,137.02,137.73,5540300,137.73 -2004-10-07,136.92,139.88,136.55,138.85,7064600,138.85 -2004-10-06,137.55,138.45,136.00,137.08,6697400,137.08 -2004-10-05,134.66,138.53,132.24,138.37,7494100,138.37 -2004-10-04,135.25,136.87,134.03,135.06,6517900,135.06 -2004-10-01,130.80,134.24,128.90,132.58,7570000,132.58 -2004-09-30,129.90,132.30,129.00,129.60,6885900,129.60 -2004-09-29,126.70,135.02,126.23,131.08,15273500,131.08 -2004-09-28,121.30,127.40,120.21,126.86,8473000,126.86 -2004-09-27,119.56,120.88,117.80,118.26,3536600,118.26 -2004-09-24,120.94,124.10,119.76,119.83,4566300,119.83 -2004-09-23,118.84,122.63,117.02,120.82,4272100,120.82 -2004-09-22,117.40,119.67,116.81,118.38,3794400,118.38 -2004-09-21,119.81,120.42,117.51,117.84,3618000,117.84 -2004-09-20,116.95,121.60,116.77,119.36,5319700,119.36 -2004-09-17,114.42,117.49,113.55,117.49,4741000,117.49 -2004-09-16,112.34,115.80,111.65,113.97,4637800,113.97 -2004-09-15,110.56,114.23,110.20,112.00,5361900,112.00 -2004-09-14,107.45,112.00,106.79,111.49,5419900,111.49 -2004-09-13,106.63,108.41,106.46,107.50,3926000,107.50 -2004-09-10,101.60,106.56,101.30,105.33,4353800,105.33 -2004-09-09,102.53,102.71,101.00,102.31,2032900,102.31 -2004-09-08,100.74,103.03,100.50,102.30,2495300,102.30 -2004-09-07,101.01,102.00,99.61,101.58,2926700,101.58 -2004-09-03,100.95,101.74,99.32,100.01,2578800,100.01 -2004-09-02,99.19,102.37,98.94,101.51,7566900,101.51 -2004-09-01,102.70,102.97,99.67,100.25,4573700,100.25 -2004-08-31,102.30,103.71,102.16,102.37,2461400,102.37 -2004-08-30,105.28,105.49,102.01,102.01,2601000,102.01 -2004-08-27,108.10,108.62,105.69,106.15,3109000,106.15 -2004-08-26,104.95,107.95,104.66,107.91,3551000,107.91 -2004-08-25,104.96,108.00,103.88,106.00,4598900,106.00 -2004-08-24,111.24,111.60,103.57,104.87,7631300,104.87 -2004-08-23,110.75,113.48,109.05,109.40,9137200,109.40 -2004-08-20,101.01,109.08,100.50,108.31,11428600,108.31 -2004-08-19,100.00,104.06,95.96,100.34,22351900,100.34 diff -Nru matplotlib-0.99.3/examples/data/intc.csv matplotlib-1.0.1/examples/data/intc.csv --- matplotlib-0.99.3/examples/data/intc.csv 2009-07-31 15:14:50.000000000 +0000 +++ matplotlib-1.0.1/examples/data/intc.csv 1970-01-01 00:00:00.000000000 +0000 @@ -1,66 +0,0 @@ -Date,Open,High,Low,Close,Volume,Adj. Close* -19-Sep-03,29.30,29.36,28.83,29.17,53550300,29.15 -18-Sep-03,28.69,29.28,28.46,29.16,46619000,29.14 -17-Sep-03,28.94,29.38,28.77,28.88,52827300,28.86 -16-Sep-03,28.08,28.99,28.02,28.91,48748000,28.89 -15-Sep-03,28.33,28.45,27.91,27.99,36350400,27.97 -12-Sep-03,27.81,28.39,27.55,28.34,51931600,28.32 -11-Sep-03,27.62,28.35,27.29,28.03,56654900,28.01 -10-Sep-03,28.44,28.49,27.63,27.66,57999300,27.64 -9-Sep-03,29.00,29.13,28.66,28.79,49792900,28.77 -8-Sep-03,28.88,29.20,28.80,29.18,52154000,29.16 -5-Sep-03,28.83,29.10,28.37,28.71,68429904,28.69 -4-Sep-03,28.32,28.74,28.04,28.60,63744700,28.58 -3-Sep-03,28.94,28.97,28.04,28.22,60714800,28.20 -2-Sep-03,28.77,28.84,28.17,28.74,58841200,28.72 -29-Aug-03,28.18,28.65,28.04,28.59,41986600,28.57 -28-Aug-03,28.10,28.35,27.85,28.30,48631600,28.28 -27-Aug-03,27.61,28.08,27.42,28.02,58217200,28.00 -26-Aug-03,26.96,27.74,26.68,27.71,65213400,27.69 -25-Aug-03,27.56,27.76,27.07,27.24,52037500,27.22 -22-Aug-03,28.16,29.04,27.32,27.39,120604096,27.37 -21-Aug-03,26.69,26.78,26.01,26.39,66434900,26.37 -20-Aug-03,26.14,26.74,26.13,26.36,47210300,26.34 -19-Aug-03,26.37,26.54,25.92,26.47,55966300,26.45 -18-Aug-03,25.10,26.23,25.05,26.19,59081000,26.17 -15-Aug-03,25.09,25.25,24.81,25.05,21622800,25.04 -14-Aug-03,24.80,25.17,24.55,25.14,51830000,25.13 -13-Aug-03,24.50,25.00,24.30,24.71,51882500,24.70 -12-Aug-03,24.09,24.40,23.82,24.37,48475100,24.36 -11-Aug-03,23.62,24.13,23.58,23.90,41624600,23.89 -8-Aug-03,24.15,24.22,23.33,23.58,57453600,23.57 -7-Aug-03,23.94,24.30,23.86,23.99,48517800,23.98 -6-Aug-03,24.10,24.55,23.81,24.14,57799000,24.13 -5-Aug-03,25.12,25.12,24.23,24.27,51979800,24.26 -4-Aug-03,24.91,25.23,24.39,25.13,53570000,25.10 -1-Aug-03,24.78,25.07,24.73,25.02,48494900,24.99 -31-Jul-03,24.80,25.35,24.68,24.89,68692096,24.86 -30-Jul-03,24.86,24.87,24.28,24.49,40786200,24.46 -29-Jul-03,24.81,25.23,24.70,24.90,68217600,24.87 -28-Jul-03,24.92,25.13,24.61,24.76,45462200,24.73 -25-Jul-03,24.17,24.94,23.73,24.91,52627700,24.88 -24-Jul-03,25.15,25.17,23.95,23.97,58119100,23.94 -23-Jul-03,24.37,24.90,24.26,24.81,49058200,24.78 -22-Jul-03,24.39,24.53,24.05,24.42,61074300,24.39 -21-Jul-03,24.60,24.63,23.95,24.06,52851200,24.03 -18-Jul-03,25.10,25.15,24.15,24.66,65296900,24.63 -17-Jul-03,24.69,25.10,24.60,24.93,71736800,24.90 -16-Jul-03,25.24,25.50,24.82,25.31,128925696,25.27 -15-Jul-03,24.44,24.77,23.67,24.10,102323696,24.07 -14-Jul-03,24.27,24.58,23.85,24.02,76909400,23.99 -11-Jul-03,23.29,23.50,23.07,23.34,46535400,23.31 -10-Jul-03,23.07,23.30,22.61,22.91,63261600,22.88 -9-Jul-03,23.30,23.99,23.25,23.48,78521904,23.45 -8-Jul-03,22.83,23.40,22.67,23.15,64980800,23.12 -7-Jul-03,22.24,22.98,22.17,22.91,56553100,22.88 -3-Jul-03,21.97,22.31,21.71,21.72,40502400,21.69 -2-Jul-03,21.66,22.32,21.47,22.21,74291504,22.18 -1-Jul-03,20.87,21.50,20.51,21.41,64496600,21.38 -30-Jun-03,21.14,21.30,20.59,20.81,51457500,20.78 -27-Jun-03,20.70,21.13,20.53,20.57,63348200,20.54 -26-Jun-03,20.30,20.76,20.15,20.63,52904900,20.60 -25-Jun-03,20.53,20.83,19.99,20.04,61250600,20.01 -24-Jun-03,20.11,20.74,20.04,20.45,63799700,20.42 -23-Jun-03,20.70,20.97,20.05,20.36,59628100,20.33 -20-Jun-03,21.34,21.42,20.64,20.67,78909400,20.64 -19-Jun-03,21.66,21.92,21.12,21.12,69563696,21.09 Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/examples/data/INTC.dat and /tmp/GJbvHcIw6l/matplotlib-1.0.1/examples/data/INTC.dat differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/examples/data/lena.jpg and /tmp/GJbvHcIw6l/matplotlib-1.0.1/examples/data/lena.jpg differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/examples/data/lena.png and /tmp/GJbvHcIw6l/matplotlib-1.0.1/examples/data/lena.png differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/examples/data/logo2.png and /tmp/GJbvHcIw6l/matplotlib-1.0.1/examples/data/logo2.png differ diff -Nru matplotlib-0.99.3/examples/data/membrane.dat matplotlib-1.0.1/examples/data/membrane.dat --- matplotlib-0.99.3/examples/data/membrane.dat 2009-07-31 15:14:50.000000000 +0000 +++ matplotlib-1.0.1/examples/data/membrane.dat 1970-01-01 00:00:00.000000000 +0000 @@ -1,64 +0,0 @@ -°ú*¿°ú*¿ºš+¿°ú*¿°ú*¿Ä:,¿Ä:,¿Ä:,¿°ú*¿ºš+¿ºš+¿°ú*¿ºš+¿°ú*¿¦Z*¿°ú*¿°ú*¿¦Z*¿¦Z*¿°ú*¿Ä:,¿Ä:,¿œº)¿¦Z*¿¦Z*¿°ú*¿°ú*¿°ú*¿ºš+¿Ä:,¿Ä:,¿°ú*¿ºš+¿°ú*¿ºš+¿ºš+¿ºš+¿ºš+¿ºš+¿ºš+¿°ú*¿°ú*¿ºš+¿ºš+¿ºš+¿°ú*¿°ú*¿ºš+¿¦Z*¿°ú*¿°ú*¿ºš+¿ºš+¿°ú*¿ºš+¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿¦Z*¿¦Z*¿°ú*¿ºš+¿¦Z*¿ºš+¿ºš+¿¦Z*¿°ú*¿°ú*¿ºš+¿ºš+¿ºš+¿ºš+¿Ä:,¿Ä:,¿ºš+¿ºš+¿ºš+¿¦Z*¿œº)¿ºš+¿°ú*¿°ú*¿Ä:,¿ºš+¿ºš+¿¦Z*¿Ä:,¿Ä:,¿¦Z*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿Ä:,¿ºš+¿°ú*¿°ú*¿°ú*¿ºš+¿ºš+¿ºš+¿°ú*¿°ú*¿ºš+¿Ä:,¿Ä:,¿°ú*¿ºš+¿ºš+¿ºš+¿°ú*¿°ú*¿ºš+¿°ú*¿°ú*¿ºš+¿ºš+¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿¦Z*¿¦Z*¿ºš+¿ºš+¿ºš+¿ºš+¿ºš+¿¦Z*¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿Ä:,¿°ú*¿°ú*¿Ä:,¿ÎÚ,¿ÎÚ,¿ºš+¿Ä:,¿Ä:,¿ºš+¿°ú*¿Ä:,¿ºš+¿ºš+¿ºš+¿¦Z*¿¦Z*¿°ú*¿ºš+¿ºš+¿¦Z*¿°ú*¿°ú*¿¦Z*¿¦Z*¿¦Z*¿°ú*¿ºš+¿¦Z*¿¦Z*¿¦Z*¿ºš+¿ºš+¿ºš+¿Ä:,¿°ú*¿°ú*¿ºš+¿°ú*¿ºš+¿ºš+¿ºš+¿œº)¿°ú*¿°ú*¿Ä:,¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿¦Z*¿¦Z*¿¦Z*¿¦Z*¿°ú*¿°ú*¿¦Z*¿¦Z*¿ºš+¿ºš+¿ºš+¿ºš+¿ºš+¿ºš+¿¦Z*¿°ú*¿°ú*¿Ä:,¿°ú*¿Ä:,¿Ä:,¿ÎÚ,¿°ú*¿¦Z*¿¦Z*¿¦Z*¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿œº)¿œº)¿ºš+¿ºš+¿°ú*¿°ú*¿ºš+¿°ú*¿°ú*¿¦Z*¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿°ú*¿ºš+¿ºš+¿ºš+¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿ºš+¿ºš+¿œº)¿¦Z*¿¦Z*¿Ä:,¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿¦Z*¿¦Z*¿°ú*¿¦Z*¿¦Z*¿ºš+¿ºš+¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿ÎÚ,¿ÎÚ,¿ºš+¿°ú*¿°ú*¿Ä:,¿°ú*¿ºš+¿ºš+¿ºš+¿¦Z*¿¦Z*¿¦Z*¿°ú*¿°ú*¿°ú*¿ºš+¿°ú*¿°ú*¿°ú*¿¦Z*¿¦Z*¿¦Z*¿ºš+¿°ú*¿¦Z*¿¦Z*¿ºš+¿ºš+¿ºš+¿ºš+¿Ä:,¿Ä:,¿ºš+¿ºš+¿ºš+¿ºš+¿Ä:,¿Ä:,¿ºš+¿¦Z*¿ºš+¿ºš+¿ºš+¿œº)¿°ú*¿°ú*¿°ú*¿œº)¿œº)¿ÎÚ,¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿¦Z*¿¦Z*¿°ú*¿Ä:,¿Ä:,¿ºš+¿ºš+¿ºš+¿Ä:,¿ºš+¿°ú*¿°ú*¿°ú*¿ÎÚ,¿ºš+¿ºš+¿ºš+¿ºš+¿ºš+¿¦Z*¿°ú*¿°ú*¿ºš+¿¦Z*¿¦Z*¿°ú*¿°ú*¿°ú*¿¦Z*¿°ú*¿œº)¿¦Z*¿¦Z*¿¦Z*¿¦Z*¿¦Z*¿Ä:,¿°ú*¿°ú*¿ºš+¿ºš+¿ºš+¿°ú*¿ºš+¿ºš+¿°ú*¿°ú*¿Ä:,¿°ú*¿°ú*¿ÎÚ,¿°ú*¿°ú*¿ºš+¿°ú*¿°ú*¿¦Z*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿ºš+¿°ú*¿ºš+¿¦Z*¿ºš+¿Ä:,¿ºš+¿ºš+¿°ú*¿ºš+¿ºš+¿Ä:,¿°ú*¿°ú*¿ºš+¿ºš+¿ºš+¿ºš+¿°ú*¿°ú*¿Ä:,¿œº)¿¦Z*¿°ú*¿ºš+¿¦Z*¿¦Z*¿¦Z*¿¦Z*¿°ú*¿°ú*¿¦Z*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿Ä:,¿Ä:,¿°ú*¿ºš+¿Ä:,¿°ú*¿°ú*¿°ú*¿¦Z*¿¦Z*¿°ú*¿°ú*¿°ú*¿ºš+¿ºš+¿ºš+¿ºš+¿¦Z*¿°ú*¿°ú*¿°ú*¿¦Z*¿°ú*¿°ú*¿¦Z*¿¦Z*¿¦Z*¿ºš+¿Ä:,¿Ä:,¿¦Z*¿¦Z*¿¦Z*¿¦Z*¿¦Z*¿ºš+¿°ú*¿°ú*¿ºš+¿ºš+¿ºš+¿Ä:,¿ºš+¿ºš+¿ºš+¿ºš+¿Ä:,¿ºš+¿°ú*¿ºš+¿Ä:,¿Ä:,¿¦Z*¿¦Z*¿¦Z*¿°ú*¿°ú*¿°ú*¿ºš+¿°ú*¿°ú*¿¦Z*¿¦Z*¿¦Z*¿ºš+¿ºš+¿ºš+¿°ú*¿ºš+¿ºš+¿¦Z*¿¦Z*¿ºš+¿ºš+¿ºš+¿ºš+¿Ä:,¿Ä:,¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿Ä:,¿°ú*¿°ú*¿°ú*¿¦Z*¿°ú*¿¦Z*¿¦Z*¿°ú*¿œº)¿œº)¿°ú*¿ºš+¿ºš+¿ºš+¿ºš+¿ºš+¿°ú*¿ºš+¿°ú*¿°ú*¿°ú*¿°ú*¿ºš+¿ºš+¿ºš+¿ºš+¿ºš+¿¦Z*¿ºš+¿ºš+¿°ú*¿°ú*¿¦Z*¿ºš+¿ºš+¿¦Z*¿°ú*¿°ú*¿°ú*¿œº)¿œº)¿°ú*¿¦Z*¿¦Z*¿°ú*¿¦Z*¿¦Z*¿ºš+¿ºš+¿¦Z*¿°ú*¿°ú*¿Ä:,¿°ú*¿°ú*¿°ú*¿Ä:,¿Ä:,¿°ú*¿°ú*¿°ú*¿¦Z*¿Ä:,¿ºš+¿°ú*¿Ä:,¿°ú*¿¦Z*¿¦Z*¿ºš+¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿°ú*¿œº)¿œº)¿ºš+¿¦Z*¿¦Z*¿°ú*¿ºš+¿ºš+¿¦Z*¿°ú*¿°ú*¿ºš+¿ºš+¿ºš+¿ºš+¿ºš+¿°ú*¿ºš+¿ºš+¿¦Z*¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿ºš+¿¦Z*¿œº)¿°ú*¿ºš+¿¦Z*¿¦Z*¿¦Z*¿ºš+¿°ú*¿°ú*¿ºš+¿°ú*¿°ú*¿°ú*¿ºš+¿ºš+¿°ú*¿Ä:,¿Ä:,¿°ú*¿¦Z*¿°ú*¿ºš+¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿¦Z*¿°ú*¿°ú*¿ºš+¿°ú*¿°ú*¿Ä:,¿°ú*¿¦Z*¿¦Z*¿¦Z*¿¦Z*¿œº)¿œº)¿°ú*¿ºš+¿ºš+¿°ú*¿ºš+¿ºš+¿œº)¿°ú*¿°ú*¿ºš+¿ºš+¿ºš+¿°ú*¿¦Z*¿¦Z*¿ºš+¿ºš+¿¦Z*¿ºš+¿ºš+¿°ú*¿œº)¿œº)¿ºš+¿°ú*¿°ú*¿¦Z*¿¦Z*¿¦Z*¿¦Z*¿°ú*¿°ú*¿¦Z*¿¦Z*¿¦Z*¿ºš+¿°ú*¿Ä:,¿¦Z*¿°ú*¿°ú*¿Ä:,¿Ä:,¿¦Z*¿°ú*¿°ú*¿ºš+¿¦Z*¿¦Z*¿ºš+¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿¦Z*¿°ú*¿°ú*¿¦Z*¿°ú*¿ºš+¿¦Z*¿¦Z*¿œº)¿ºš+¿ºš+¿¦Z*¿¦Z*¿¦Z*¿ºš+¿°ú*¿°ú*¿ºš+¿ºš+¿ºš+¿ºš+¿ºš+¿ºš+¿Ä:,¿ºš+¿ºš+¿¦Z*¿¦Z*¿°ú*¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿œº)¿°ú*¿°ú*¿°ú*¿¦Z*¿¦Z*¿°ú*¿°ú*¿°ú*¿ºš+¿°ú*¿°ú*¿°ú*¿¦Z*¿ºš+¿°ú*¿°ú*¿°ú*¿¦Z*¿¦Z*¿Ä:,¿Ä:,¿¦Z*¿°ú*¿Ä:,¿ºš+¿ºš+¿ºš+¿Ä:,¿Ä:,¿Ä:,¿¦Z*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿¦Z*¿¦Z*¿¦Z*¿°ú*¿¦Z*¿¦Z*¿Ä:,¿Ä:,¿œº)¿¦Z*¿¦Z*¿Ä:,¿¦Z*¿¦Z*¿ºš+¿ºš+¿ºš+¿°ú*¿ºš+¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿ºš+¿ºš+¿°ú*¿°ú*¿¦Z*¿ºš+¿ºš+¿¦Z*¿¦Z*¿¦Z*¿ºš+¿¦Z*¿¦Z*¿°ú*¿Ä:,¿Ä:,¿°ú*¿°ú*¿°ú*¿ºš+¿ºš+¿ºš+¿¦Z*¿¦Z*¿ºš+¿ºš+¿ºš+¿°ú*¿ºš+¿ºš+¿°ú*¿¦Z*¿¦Z*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿¦Z*¿°ú*¿¦Z*¿¦Z*¿°ú*¿¦Z*¿¦Z*¿¦Z*¿¦Z*¿°ú*¿°ú*¿ºš+¿°ú*¿°ú*¿°ú*¿ºš+¿ºš+¿œº)¿°ú*¿°ú*¿Ä:,¿°ú*¿°ú*¿ºš+¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿ºš+¿ºš+¿°ú*¿¦Z*¿¦Z*¿°ú*¿¦Z*¿’)¿¦Z*¿Ä:,¿¦Z*¿œº)¿œº)¿°ú*¿ºš+¿ºš+¿°ú*¿ºš+¿ºš+¿ºš+¿°ú*¿°ú*¿¦Z*¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿œº)¿œº)¿œº)¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿¦Z*¿¦Z*¿°ú*¿¦Z*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿¦Z*¿ºš+¿ºš+¿œº)¿°ú*¿°ú*¿ºš+¿¦Z*¿°ú*¿°ú*¿°ú*¿Ä:,¿°ú*¿°ú*¿°ú*¿ºš+¿ºš+¿°ú*¿œº)¿œº)¿ºš+¿ºš+¿ºš+¿¦Z*¿Ä:,¿°ú*¿œº)¿œº)¿°ú*¿ºš+¿ºš+¿¦Z*¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿¦Z*¿Ä:,¿Ä:,¿°ú*¿¦Z*¿°ú*¿Ä:,¿Ä:,¿ºš+¿°ú*¿°ú*¿¦Z*¿’)¿’)¿ºš+¿°ú*¿¦Z*¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿¦Z*¿¦Z*¿¦Z*¿°ú*¿œº)¿œº)¿Ä:,¿°ú*¿°ú*¿ºš+¿ºš+¿ºš+¿`ú%¿VZ%¿8z#¿$:"¿ü¹¿ÞÙ¿Àù¿Àù¿z™¿\¹¿\¹¿*™¿¿¿Ðø ¿² ¿² ¿”8 ¿vX¿vX¿:˜¿&X¿¿Ó/ý¾¿ïû¾«¯ú¾[¯õ¾[¯õ¾ ¯ð¾÷nï¾÷nモ.é¾C.ä¾C.ä¾ßíݾ˭ܾ˭ܾgmÖ¾+­Ò¾mѾmѾïìξwlǾwlǾwlǾ'l¾,Á¾,Á¾ë«¾¾ÿ뿾ÿ뿾×k½¾×k½¾×k½¾ë«¾¾ë«¾¾ë«¾¾ë«¾¾,Á¾,Á¾,Á¾'l¾c,ƾwlǾwlǾwlǾŸìɾŸìɾ³,˾Çl̾Çl̾mѾ-о-о+­Ò¾?íÓ¾?íÓ¾S-Õ¾gmÖ¾gmÖ¾{­×¾{­×¾{­×¾íؾ£-ھ˭ܾ·mÛ¾·mÛ¾ßíݾßíݾßíݾ˭ܾó-ß¾ó-ß¾nà¾ó-ß¾ßíݾnྮá¾/î⾮ᾮᾮá¾Wnå¾Wnå¾/îâ¾/îâ¾/îâ¾C.ä¾/îâ¾/îâ¾®á¾/îâ¾/îâ¾®á¾C.ä¾C.ä¾®á¾ó-ß¾nà¾nà¾nà¾/îâ¾nà¾nà¾ó-ß¾®á¾®á¾nà¾nà¾nà¾nà¾Ë­Ü¾Ë­Ü¾ßíݾnà¾Ë­Ü¾Ë­Ü¾ßíݾßíݾ£-Ú¾£-Ú¾£-Ú¾{­×¾{­×¾íؾS-Õ¾S-Õ¾gmÖ¾íؾíؾ+­Ò¾+­Ò¾+­Ò¾+­Ò¾mѾmѾïìξ-о۬;۬;۬;-оÇl̾Çl̾Çl̾³,˾³,˾Ÿìɾ³,˾³,˾ŸìɾŸìɾŸìɾ‹¬È¾‹¬È¾‹¬È¾c,ƾc,ƾwlǾwlǾwlǾOìľOìľOìľc,ƾOìľOìľOìľOìľOìľOìľwlǾOìľwlǾŸìɾwlǾwlǾwlǾ³,˾ŸìɾŸìɾ³,˾³,˾³,˾ŸìɾÇl̾Çl̾ŸìɾŸìɾÇl̾³,˾³,˾۬;۬;۬;۬;-о-оmѾ-о-о+­Ò¾-о-о+­Ò¾S-Õ¾S-Õ¾S-Õ¾gmÖ¾gmÖ¾gmÖ¾S-Õ¾{­×¾íؾíؾ{­×¾{­×¾{­×¾{­×¾Ë­Ü¾Ë­Ü¾·mÛ¾·mÛ¾·mÛ¾£-Ú¾íؾíؾ·mÛ¾·mÛ¾íؾ·mÛ¾·mÛ¾·mÛ¾£-Ú¾·m۾˭ܾ·mÛ¾·mÛ¾·mÛ¾·mÛ¾·m۾˭ܾ˭ܾ˭ܾ£-Ú¾·mÛ¾·mÛ¾£-Ú¾íؾ£-ھ˭ܾíؾíؾíؾíؾgmÖ¾gmÖ¾gmÖ¾gmÖ¾gmÖ¾gmÖ¾gmÖ¾?íÓ¾?íÓ¾?íÓ¾mѾmѾïìξmѾmѾ۬;۬;۬;-оÇl̾Çl̾³,˾³,˾wlǾŸìɾŸìɾc,ƾwlǾwlǾc,ƾ'l¾'l¾;¬Ã¾,Á¾ÿ뿾,Á¾,Á¾×k½¾×k½¾×k½¾×k½¾×k½¾×k½¾¯ëº¾¯ëº¾¯ëº¾‡k¸¾‡k¸¾s+·¾_ëµ¾_ëµ¾_ëµ¾›«¹¾›«¹¾s+·¾_ëµ¾_ëµ¾#+²¾_ëµ¾_ëµ¾7k³¾7k³¾7k³¾‡k¸¾K«´¾K«´¾s+·¾_ëµ¾s+·¾7k³¾7k³¾_ëµ¾‡k¸¾‡k¸¾‡k¸¾¯ëº¾¯ëº¾×k½¾¯ëº¾¯ëº¾×k½¾ë«¾¾ë«¾¾ë«¾¾,Á¾;¬Ã¾wlǾwlǾc,ƾwlǾwlǾ‹¬È¾‹¬È¾‹¬È¾³,˾Çl̾Çl̾Çl̾³,˾³,˾-о-оïìξ-о-о+­Ò¾-о-о?íÓ¾?íÓ¾?íÓ¾S-Õ¾S-Õ¾S-Õ¾S-Õ¾gmÖ¾gmÖ¾gmÖ¾íؾíؾ{­×¾{­×¾£-Ú¾íؾíؾíؾ£-Ú¾£-Ú¾£-Ú¾{­×¾{­×¾£-Ú¾£-Ú¾£-Ú¾£-Ú¾{­×¾{­×¾gmÖ¾íؾ{­×¾gmÖ¾gmÖ¾gmÖ¾gmÖ¾gmÖ¾?íÓ¾?íÓ¾?íÓ¾+­Ò¾+­Ò¾mѾïìξïìξ-о+­Ò¾+­Ò¾Û¬Í¾ïìξïìξÇl̾ŸìɾŸìɾ‹¬È¾³,˾³,˾wlǾOìľOìľc,ƾ'l¾'l¾ÿ뿾ÿ뿾ÿ뿾Ã+¼¾Ã+¼¾×k½¾×k½¾×k½¾›«¹¾s+·¾s+·¾7k³¾#+²¾#+²¾7k³¾7k³¾7k³¾çj®¾çj®¾çj®¾Ó*­¾¿ê«¾¿ê«¾—j©¾«ªª¾[ª¥¾[ª¥¾Gj¤¾[ª¥¾꡾꡾÷iŸ¾Ï霾Ï霾é—¾Wi•¾Wi•¾gh†¾ÕM]¾ÕM]¾9Žã½i‹¶½i‹¶½É¾]ÍU¾]ÍU¾Ó*­¾c,ƾ£-Ú¾k®æ¾3/ó¾Ó/ý¾¸¿¸¿b¿vX¿vX¿Š˜¿”8 ¿”8 ¿² ¿¨x -¿¨x -¿¨x -¿Š˜¿¨x -¿žØ ¿”8 ¿Š˜¿¨x -¿¨x -¿€ø¿Š˜¿Š˜¿€ø¿l¸¿l¸¿vX¿l¸¿l¸¿NØ¿b¿b¿Xx¿Xx¿NØ¿:˜¿:˜¿:˜¿&X¿&X¿¸¿&X¿&X¿û¯ÿ¾x¿x¿çoþ¾Ó/ý¾Ó/ý¾¿ïû¾«¯ú¾«¯ú¾—où¾ƒ/ø¾ƒ/ø¾oïö¾[¯õ¾3/ó¾ ¯ð¾ ¯ð¾ ¯ð¾÷nï¾÷nï¾ ¯ð¾ ¯ð¾ ¯ð¾»®ë¾Ïîì¾Ïîì¾î羓.龓.龓.é¾C.ä¾C.ä¾k®æ¾nà¾nà¾ßíݾßíݾ·mÛ¾£-Ú¾£-Ú¾íؾgmÖ¾gmÖ¾S-Õ¾+­Ò¾+­Ò¾-оmѾïìξ³,˾ŸìɾŸìɾŸìɾc,ƾc,ƾc,ƾc,ƾ'l¾,Á¾,Á¾ÿ뿾×k½¾×k½¾¯ëº¾›«¹¾›«¹¾›«¹¾K«´¾7k³¾7k³¾7k³¾ûª¯¾Ó*­¾Ó*­¾¿ê«¾«ªª¾«ªª¾ƒ*¨¾[ª¥¾[ª¥¾3*£¾꡾꡾Ï霾»©›¾§iš¾k©–¾Wi•¾/é’¾ó(¾ó(¾ýÍ_¾É¾É¾‰‰˜½ÉŠ¬½ÉŠ¬½mÌF¾gh†¾ƒ*¨¾;¬Ã¾;¬Ã¾Wnå¾ã.î¾ã.î¾Ó/ý¾¿¿NØ¿NØ¿NØ¿vX¿vX¿vX¿b¿€ø¿€ø¿b¿l¸¿l¸¿l¸¿l¸¿b¿l¸¿l¸¿NØ¿NØ¿NØ¿D8¿D8¿D8¿:˜¿¿¿:˜¿¸¿¸¿x¿&X¿û¯ÿ¾Ó/ý¾û¯ÿ¾çoþ¾û¯ÿ¾û¯ÿ¾¿ïû¾¿ïû¾¿ïû¾«¯ú¾oïö¾oïö¾Goô¾oïö¾oïö¾[¯õ¾Goô¾Goô¾Goô¾ïñ¾ã.î¾ã.î¾ã.nê¾»®ë¾»®ë¾»®ë¾îç¾îç¾k®æ¾k®æ¾k®æ¾®á¾®á¾®á¾ó-ß¾nà¾Ë­Ü¾·mÛ¾·mÛ¾£-Ú¾£-Ú¾£-Ú¾?íÓ¾S-Õ¾S-Õ¾mѾmѾmѾïìξïìξïìξÇl̾³,˾ŸìɾwlǾwlǾ;¬Ã¾c,ƾc,ƾ,Á¾ë«¾¾ë«¾¾ë«¾¾Ã+¼¾Ã+¼¾‡k¸¾‡k¸¾‡k¸¾7k³¾7k³¾#+²¾#+²¾#+²¾çj®¾Ó*­¾Ó*­¾—j©¾ƒ*¨¾ƒ*¨¾3*£¾[ª¥¾ ª ¾÷iŸ¾÷iŸ¾»©›¾»©›¾»©›¾C)”¾©‘¾©‘¾{¨‡¾ÝÏ}¾ÝÏ}¾ -Ⱦ)Š¢½)Š¢½)Š¢½…H¾…H¾ßè¾Ó*­¾;¬Ã¾S-Õ¾S-Õ¾÷nï¾[¯õ¾[¯õ¾û¯ÿ¾¸¿¸¿:˜¿D8¿D8¿0ø¿NØ¿NØ¿NØ¿:˜¿:˜¿D8¿:˜¿:˜¿0ø¿0ø¿&X¿&X¿¿¸¿x¿x¿¸¿û¯ÿ¾û¯ÿ¾çoþ¾û¯ÿ¾û¯ÿ¾Ó/ý¾¿ïû¾¿ïû¾«¯ú¾ƒ/ø¾ƒ/ø¾—où¾[¯õ¾[¯õ¾oïö¾Goô¾Goô¾Goô¾Goô¾ïñ¾3/ó¾3/ó¾ ¯ð¾ ¯ð¾ ¯ð¾ã.î¾Ïîì¾Ïî쾧n꾧n꾧nê¾îç¾k®æ¾k®æ¾C.ä¾C.ä¾C.ä¾®á¾nà¾ó-߾˭ܾ˭ܾ·mÛ¾£-Ú¾£-Ú¾£-Ú¾gmÖ¾gmÖ¾{­×¾gmÖ¾gmÖ¾+­Ò¾?íÓ¾mѾïìξïìξ۬;³,˾³,˾‹¬È¾ŸìɾŸìɾwlǾc,ƾc,ƾ,Á¾ÿ뿾ÿ뿾Ã+¼¾›«¹¾›«¹¾¯ëº¾s+·¾_ëµ¾_ëµ¾_ëµ¾#+²¾ë°¾ë°¾çj®¾—j©¾—j©¾«ªª¾«ªª¾«ªª¾[ª¥¾ ª ¾ ª ¾Ï霾Ï霾Ï霾闾闾©‘¾/é’¾/é’¾+¨‚¾ÅNl¾ÅNl¾ ŒÀ½q -W½q -W½‰‰˜½­È -¾­È -¾Wi•¾7k³¾7k³¾Ë­Ü¾k®æ¾÷nï¾Goô¾¿ïû¾çoþ¾û¯ÿ¾û¯ÿ¾¸¿&X¿&X¿¸¿&X¿&X¿¸¿¸¿¸¿¿¸¿¸¿x¿x¿x¿çoþ¾Ó/ý¾¿ïû¾¿ïû¾¿ïû¾«¯ú¾—où¾—où¾«¯ú¾«¯ú¾«¯ú¾[¯õ¾oïö¾oïö¾ïñ¾Goô¾Goô¾3/ó¾3/ó¾3/ó¾ïñ¾÷nï¾ ¯ð¾÷nï¾Ïîì¾Ïîì¾ã.î¾ã.n꾓.龓.龧nê¾k®æ¾k®æ¾k®æ¾Wnå¾Wnå¾nà¾C.ä¾/îâ¾nà¾nà¾ó-ß¾ó-ß¾ó-߾˭ܾ·mÛ¾·mÛ¾íؾíؾíؾS-Õ¾gmÖ¾gmÖ¾S-Õ¾-о-о-оmѾmѾ³,˾۬;³,˾³,˾ŸìɾŸìɾc,ƾc,ƾOìľ'l¾'l¾×k½¾,Á¾,Á¾›«¹¾¯ëº¾¯ëº¾‡k¸¾K«´¾K«´¾7k³¾ë°¾ûª¯¾çj®¾çj®¾«ªª¾«ªª¾«ªª¾oꦾ[ª¥¾[ª¥¾꡾ã)ž¾ã)ž¾Ï霾»©›¾»©›¾©‘¾ó(¾Ë¨Œ¾?胾=Ïs¾…MX¾ýȾýȾ ½ ½ ½É¾Oq¾Oq¾‡k¸¾Çl̾Çl̾k®æ¾÷nï¾÷nᆱ¯ú¾û¯ÿ¾Ó/ý¾û¯ÿ¾û¯ÿ¾x¿çoþ¾çoþ¾û¯ÿ¾û¯ÿ¾û¯ÿ¾çoþ¾çoþ¾çoþ¾çoþ¾Ó/ý¾¿ïû¾ƒ/ø¾ƒ/ø¾«¯ú¾oïö¾oïö¾[¯õ¾oïö¾oïö¾3/ó¾3/ó¾3/ó¾3/ó¾ ¯ð¾ ¯ð¾÷nï¾ ¯ð¾ã.î¾÷nï¾÷nï¾»®ë¾Ïîì¾Ïî쾧n꾓.龓.龓.é¾îç¾î羓.龓.龓.é¾C.ä¾C.ä¾Wn微ᾮᾮá¾ó-ß¾ó-ß¾ßíݾó-ß¾ó-ß¾ßíݾ˭ܾ˭ܾ˭ܾ£-Ú¾£-Ú¾£-Ú¾{­×¾{­×¾{­×¾gmÖ¾+­Ò¾+­Ò¾+­Ò¾?íÓ¾mѾmѾmѾïìξïìξ³,˾Çl̾Çl̾ŸìɾwlǾwlǾOìľ;¬Ã¾'l¾;¬Ã¾,Á¾ë«¾¾ë«¾¾ë«¾¾¯ëº¾¯ëº¾¯ëº¾‡k¸¾7k³¾7k³¾_ëµ¾#+²¾#+²¾ë°¾ûª¯¾¿ê«¾¿ê«¾¿ê«¾ƒ*¨¾Gj¤¾Gj¤¾[ª¥¾÷iŸ¾÷iŸ¾Ï霾»©›¾»©›¾C)”¾i¾i¾S(…¾h¾íÎn¾ELD¾)ò½a½¡ -ª¼¡ -ª¼¹‹»½-Ë2¾-Ë2¾oꦾÿ뿾+­Ò¾nྒྷ.é¾ïñ¾Goô¾Goô¾ƒ/ø¾¿ïû¾¿ïû¾çoþ¾Ó/ý¾Ó/ý¾çoþ¾çoþ¾çoþ¾¿ïû¾Ó/ý¾¿ïû¾—où¾—où¾oïö¾oïö¾oïö¾Goô¾3/ó¾3/ó¾ ¯ð¾[¯õ¾ïñ¾ã.î¾ã.î¾÷nï¾ ¯ð¾ ¯ð¾»®ë¾Ïîì¾Ïî쾓.龧n꾧n꾧nê¾îç¾îç¾k®æ¾k®æ¾Wnå¾k®æ¾k®æ¾®á¾®á¾®á¾/îâ¾ßíݾßíݾnà¾ßíݾßíݾßíݾßíݾ˭ܾ·mÛ¾·mÛ¾·mÛ¾£-Ú¾£-Ú¾{­×¾íؾíؾ{­×¾gmÖ¾gmÖ¾?íÓ¾?íÓ¾?íÓ¾mѾ-о-оmѾ-о۬;ïìξïìξ۬;³,˾³,˾wlǾ‹¬È¾‹¬È¾c,ƾc,ƾc,ƾ;¬Ã¾;¬Ã¾;¬Ã¾ÿ뿾ÿ뿾×k½¾Ã+¼¾Ã+¼¾›«¹¾¯ëº¾¯ëº¾_ëµ¾s+·¾s+·¾#+²¾ë°¾ë°¾ë°¾ûª¯¾Ó*­¾«ªª¾«ªª¾oꦾƒ*¨¾ƒ*¨¾÷iŸ¾÷iŸ¾÷iŸ¾“)™¾é—¾é—¾C)”¾ó(¾ó(¾gh†¾ÝÏ}¾ÝÏ}¾ÍË<¾éÞ½‘ 9½a –¼q½‹±½K0¾K0¾oꦾÿ뿾ÿ뿾ßíݾk®æ¾k®æ¾ ¯ð¾[¯õ¾[¯õ¾«¯ú¾—où¾—où¾¿ïû¾—où¾«¯ú¾—où¾—où¾[¯õ¾[¯õ¾[¯õ¾oïö¾Goô¾Goô¾Goô¾ïñ¾ïñ¾÷nï¾ ¯ð¾ ¯ð¾ã.î¾Ïîì¾Ïîì¾»®ë¾»®ë¾»®ë¾§nê¾îç¾îç¾k®æ¾k®æ¾Wnå¾Wnå¾Wnå¾Wnå¾/îâ¾/îâ¾C.侮ᾮá¾nà¾nà¾nྷm۾˭ܾ˭ܾ˭ܾ˭ܾ˭ܾ£-Ú¾·mÛ¾£-Ú¾gmÖ¾íؾ{­×¾{­×¾{­×¾{­×¾gmÖ¾gmÖ¾S-Õ¾+­Ò¾+­Ò¾+­Ò¾?íÓ¾?íÓ¾ïìξïìξïìξïìξïìξ۬;۬;۬;³,˾³,˾³,˾wlǾwlǾwlǾwlǾOìľOìľ'l¾Oìľÿ뿾,Á¾,Á¾×k½¾ÿ뿾ÿ뿾×k½¾›«¹¾›«¹¾‡k¸¾›«¹¾›«¹¾K«´¾7k³¾7k³¾7k³¾ë°¾ë°¾çj®¾¿ê«¾¿ê«¾—j©¾3*£¾Gj¤¾[ª¥¾[ª¥¾÷iŸ¾ã)ž¾ã)ž¾§iš¾C)”¾C)”¾©‘¾ßè¾ßè¾ÝÏ}¾eOv¾eOv¾%I¾Ù‰½Ù‰½!‚¼±k½5H¾­ÍZ¾/é’¾7k³¾ŸìɾŸìɾ®á¾“.龓.é¾Goô¾[¯õ¾[¯õ¾—où¾—où¾—où¾—où¾ƒ/ø¾ƒ/ø¾ƒ/ø¾Goô¾Goô¾Goô¾Goô¾3/ó¾ïñ¾ïñ¾ïñ¾ïñ¾ïñ¾÷nï¾÷nï¾÷nï¾»®ë¾“.龓.龓.龓.龓.é¾îç¾Wnå¾Wnå¾C.ä¾Wnå¾/îâ¾/îâ¾/îâ¾nà¾ó-ß¾ó-ß¾ó-ß¾ßíݾßíݾ˭ܾ˭ܾ˭ܾ£-Ú¾£-Ú¾£-Ú¾£-Ú¾£-Ú¾íؾ{­×¾{­×¾íؾ{­×¾{­×¾?íÓ¾gmÖ¾S-Õ¾?íÓ¾?íÓ¾mѾS-Õ¾S-Õ¾mѾmѾmѾïìξ۬;۬;Çl̾Çl̾Çl̾Çl̾ŸìɾŸìɾŸìɾŸìɾwlǾc,ƾc,ƾc,ƾOìľOìľ'l¾c,ƾc,ƾÿ뿾뫾¾ë«¾¾¯ëº¾¯ëº¾¯ëº¾Ã+¼¾¯ëº¾‡k¸¾›«¹¾›«¹¾‡k¸¾_ëµ¾_ëµ¾#+²¾ë°¾ë°¾Ó*­¾¿ê«¾¿ê«¾¿ê«¾—j©¾Gj¤¾Gj¤¾꡾3*£¾÷iŸ¾÷iŸ¾»©›¾§iš¾§iš¾C)”¾/é’¾/é’¾£(Š¾S(…¾S(…¾uNg¾õK?¾‰Žè½Ñ M½Ñ M½¡ -ª¼ÉŠ¬½ÉŠ¬½eOv¾÷iŸ¾÷iŸ¾Çl̾íؾíؾ§nê¾ã.î¾ã.î¾Goô¾oïö¾[¯õ¾ƒ/ø¾ƒ/ø¾[¯õ¾Goô¾Goô¾oïö¾3/ó¾3/ó¾Goô¾3/ó¾ïñ¾ ¯ð¾ ¯ð¾ïñ¾»®ë¾»®ë¾§nê¾»®ë¾»®ë¾“.龓.龓.é¾îç¾Wnå¾Wnå¾C.ä¾nà¾C.ä¾®á¾ó-ß¾ó-ß¾®á¾®á¾·mÛ¾ßíݾßíݾ˭ܾíؾíؾ·mÛ¾·mÛ¾·mÛ¾£-Ú¾íؾíؾíؾgmÖ¾íؾS-Õ¾S-Õ¾gmÖ¾S-Õ¾S-Õ¾S-Õ¾gmÖ¾gmÖ¾-оmѾmѾ-о-о-оïìξ۬;۬;Çl̾Çl̾³,˾ŸìɾŸìɾŸìɾc,ƾc,ƾ‹¬È¾wlǾwlǾwlǾ‹¬È¾‹¬È¾;¬Ã¾;¬Ã¾Oìľ뫾¾'l¾'l¾,Á¾,Á¾ë«¾¾ë«¾¾ë«¾¾¯ëº¾¯ëº¾¯ëº¾‡k¸¾_ëµ¾_ëµ¾_ëµ¾#+²¾#+²¾#+²¾ë°¾¿ê«¾¿ê«¾¿ê«¾¿ê«¾—j©¾—j©¾oꦾ[ª¥¾[ª¥¾꡾ ª ¾ ª ¾»©›¾“)™¾é—¾/é’¾©‘¾ßè¾èˆ¾èˆ¾eOv¾ýÍ_¾ýÍ_¾)Š¢½á ¾¼á ¾¼q½ùŒÏ½ÌA¾·h‹¾·h‹¾,Á¾mѾmѾC.侧n꾧nê¾ïñ¾3/ó¾3/ó¾ƒ/ø¾[¯õ¾[¯õ¾ƒ/ø¾oïö¾3/ó¾3/ó¾3/ó¾[¯õ¾ïñ¾ïñ¾÷nï¾ ¯ð¾ ¯ð¾Ïîì¾»®ë¾»®ë¾§n꾧n꾧nê¾îç¾k®æ¾“.é¾/îâ¾/îâ¾/îâ¾Wnå¾Wnå¾ó-ß¾®á¾®á¾®á¾ßíݾßíݾßíݾßíݾ·mÛ¾ßíݾ£-Ú¾íؾ£-Ú¾£-Ú¾íؾíؾíؾ{­×¾{­×¾{­×¾{­×¾{­×¾{­×¾mѾmѾmѾ+­Ò¾-о-оmѾmѾïìξ۬;۬;Çl̾Çl̾Çl̾Çl̾ŸìɾŸìɾÇl̾‹¬È¾‹¬È¾‹¬È¾³,˾³,˾c,ƾwlǾ‹¬È¾Oìľ;¬Ã¾;¬Ã¾OìľOìľÿ뿾'l¾'l¾뫾¾ë«¾¾ë«¾¾×k½¾›«¹¾×k½¾¯ëº¾›«¹¾‡k¸¾‡k¸¾‡k¸¾#+²¾#+²¾#+²¾K«´¾ë°¾ë°¾ûª¯¾çj®¾çj®¾¿ê«¾—j©¾—j©¾ƒ*¨¾[ª¥¾꡾3*£¾ ª ¾÷iŸ¾»©›¾»©›¾/é’¾Wi•¾Wi•¾{¨‡¾gh†¾gh†¾eOv¾…MX¾MɾɊ¬½ ½Á ¼¡ú¼¡ú¼¥K:¾èˆ¾èˆ¾,Á¾-о-оk®æ¾§n꾧nê¾ïñ¾Goô¾3/ó¾3/ó¾3/ó¾oïö¾oïö¾oïö¾[¯õ¾[¯õ¾[¯õ¾ïñ¾ ¯ð¾ ¯ð¾ã.î¾ã.î¾ã.î¾»®ë¾§n꾧n꾧nê¾Wnå¾k®æ¾k®æ¾k®æ¾C.ä¾C.ä¾C.ä¾Wnå¾C.ä¾C.ä¾/î⾮ᾮá¾ßíݾó-ß¾·mÛ¾ßíݾ˭ܾ·mÛ¾£-Ú¾£-Ú¾·mÛ¾·mÛ¾·mÛ¾S-Õ¾{­×¾{­×¾?íÓ¾gmÖ¾gmÖ¾S-Õ¾+­Ò¾+­Ò¾+­Ò¾+­Ò¾+­Ò¾-о-о-оïìξïìξ-о۬;۬;۬;۬;۬;Çl̾۬;Çl̾ŸìɾŸìɾŸìɾŸìɾŸìɾwlǾwlǾwlǾ;¬Ã¾;¬Ã¾;¬Ã¾;¬Ã¾;¬Ã¾;¬Ã¾,Á¾ÿ뿾ÿ뿾ÿ뿾×k½¾×k½¾Ã+¼¾Ã+¼¾›«¹¾›«¹¾›«¹¾¯ëº¾s+·¾s+·¾‡k¸¾_ëµ¾_ëµ¾7k³¾ë°¾ë°¾ë°¾ûª¯¾ûª¯¾¿ê«¾—j©¾—j©¾oꦾoꦾGj¤¾3*£¾3*£¾Ï霾»©›¾»©›¾»©›¾C)”¾C)”¾ó(¾Ë¨Œ¾Ë¨Œ¾+¨‚¾µO{¾µO{¾UK5¾™Ù½ñ -/½A 4¼A 4¼)Š¢½ÅI¾ÅI¾ã)ž¾›«¹¾›«¹¾{­×¾/îâ¾/îâ¾Ïîì¾÷nï¾÷nï¾ïñ¾3/ó¾Goô¾Goô¾Goô¾3/ó¾3/ó¾3/ó¾ïñ¾÷nï¾÷nï¾÷nï¾Ïîì¾Ïîì¾»®ë¾Ïîì¾Ïî쾧n꾧n꾧nê¾k®æ¾îç¾îç¾k®æ¾k®æ¾C.ä¾C.ä¾C.侮ᾮᾮá¾ó-ß¾ßíݾßíݾ˭ܾ·mÛ¾·mÛ¾·mÛ¾·mÛ¾·mÛ¾íؾíؾ£-Ú¾gmÖ¾gmÖ¾{­×¾{­×¾{­×¾S-Õ¾gmÖ¾gmÖ¾S-Õ¾?íÓ¾?íÓ¾+­Ò¾?íÓ¾?íÓ¾mѾ۬;۬;mѾ-оïìξ۬;ïìξÇl̾³,˾³,˾Ÿìɾ³,˾³,˾ŸìɾŸìɾŸìɾ‹¬È¾wlǾwlǾ;¬Ã¾OìľOìľ;¬Ã¾'l¾'l¾;¬Ã¾;¬Ã¾ÿ뿾,Á¾,Á¾×k½¾×k½¾×k½¾×k½¾Ã+¼¾Ã+¼¾›«¹¾s+·¾s+·¾s+·¾K«´¾7k³¾ë°¾#+²¾ûª¯¾¿ê«¾¿ê«¾Ó*­¾Ó*­¾Ó*­¾ƒ*¨¾oꦾoꦾGj¤¾÷iŸ¾÷iŸ¾ã)ž¾Ï霾Ï霾é—¾/é’¾/é’¾©‘¾£(Š¾S(…¾h¾Ïx¾ÕM]¾íɾíɾ± ½Á ¼Á ¼i‹¶½K0¾K0¾ ª ¾Ã+¼¾Û¬Í¾£-Ú¾nà¾îç¾Ïîì¾ã.î¾Goô¾3/ó¾3/ó¾ïñ¾Goô¾Goô¾3/ó¾ ¯ð¾ ¯ð¾Goô¾ïñ¾ïñ¾ ¯ð¾ïñ¾ïñ¾»®ë¾Ïîì¾Ïîì¾»®ë¾§nê¾»®ë¾îç¾îç¾Wnå¾Wnå¾Wnå¾/îâ¾C.ä¾C.ä¾ó-ß¾nà¾nà¾ó-߾˭ܾ˭ܾßíݾßíݾßíݾ£-Ú¾£-Ú¾£-Ú¾íؾ£-Ú¾£-Ú¾gmÖ¾gmÖ¾{­×¾{­×¾{­×¾S-Õ¾S-Õ¾S-Õ¾+­Ò¾+­Ò¾+­Ò¾?íÓ¾-о-оmѾmѾmѾïìξ۬;۬;۬;Çl̾Çl̾³,˾Ÿìɾ³,˾‹¬È¾‹¬È¾³,˾‹¬È¾‹¬È¾wlǾwlǾwlǾ;¬Ã¾OìľOìľOìľOìľOìľ;¬Ã¾;¬Ã¾'l¾,Á¾,Á¾ë«¾¾×k½¾×k½¾¯ëº¾¯ëº¾¯ëº¾›«¹¾s+·¾s+·¾K«´¾K«´¾K«´¾#+²¾#+²¾ûª¯¾ûª¯¾ûª¯¾¿ê«¾çj®¾çj®¾—j©¾oꦾoꦾGj¤¾3*£¾3*£¾÷iŸ¾Ï霾Ï霾§iš¾é—¾/é’¾i¾ó(¾·h‹¾S(…¾S(…¾Îi¾•LI¾•LI¾Qu½a –¼a –¼‘ 9½)ò½)ò½ó(¾Ó*­¾Ó*­¾mѾ·mÛ¾C.ä¾»®ë¾Ïîì¾÷nï¾ïñ¾ïñ¾3/ó¾Goô¾Goô¾[¯õ¾3/ó¾3/ó¾3/ó¾ ¯ð¾ ¯ð¾ïñ¾ã.î¾ã.î¾»®ë¾»®ë¾»®ë¾»®ë¾“.龓.龓.龓.é¾Wnå¾Wnå¾Wnå¾/îâ¾nà¾nà¾/îâ¾nà¾nྮá¾ó-ß¾ó-ß¾ó-ß¾ßíݾ˭ܾ˭ܾ˭ܾ£-Ú¾£-Ú¾£-Ú¾£-Ú¾íؾíؾ{­×¾gmÖ¾gmÖ¾-оS-Õ¾S-Õ¾S-Õ¾mѾ+­Ò¾+­Ò¾-оmѾ-о-оïìξïìξïìξïìξÇl̾Çl̾ïìξÇl̾Çl̾Çl̾Çl̾³,˾ŸìɾŸìɾŸìɾ‹¬È¾‹¬È¾wlǾ‹¬È¾‹¬È¾;¬Ã¾OìľOìľ,Á¾'l¾'l¾ÿ뿾뫾¾ë«¾¾ÿ뿾¯ëº¾×k½¾Ã+¼¾Ã+¼¾‡k¸¾›«¹¾›«¹¾›«¹¾_ëµ¾_ëµ¾_ëµ¾K«´¾K«´¾ûª¯¾ë°¾ë°¾Ó*­¾Ó*­¾Ó*­¾oꦾ[ª¥¾oꦾGj¤¾3*£¾ ª ¾ ª ¾ ª ¾“)™¾é—¾é—¾k©–¾i¾i¾Ë¨Œ¾S(…¾S(…¾eOv¾MÎd¾MÎd¾©ŒÊ½ñ -/½Á ¼!‚¼Iˆ„½É¾ÅNl¾ÅNl¾K«´¾ŸìɾŸìɾó-ß¾k®æ¾k®æ¾ã.î¾÷nï¾÷nï¾Goô¾3/ó¾3/ó¾3/ó¾ïñ¾ ¯ð¾ïñ¾ïñ¾ïñ¾Ïîì¾Ïîì¾Ïîì¾»®ë¾»®ë¾»®ë¾Ïîì¾Ïî쾓.é¾îç¾îç¾k®æ¾k®æ¾k®æ¾Wnå¾C.ä¾/îâ¾C.ä¾®á¾nà¾nà¾nà¾nà¾ßíݾßíݾ˭ܾíؾ£-ھ˭ܾ˭ܾíؾ£-Ú¾£-Ú¾£-Ú¾{­×¾{­×¾{­×¾?íÓ¾?íÓ¾?íÓ¾gmÖ¾?íÓ¾+­Ò¾+­Ò¾S-Õ¾mѾmѾ+­Ò¾-о-о-оmѾmѾ۬;۬;۬;ïìξ³,˾³,˾³,˾³,˾ŸìɾŸìɾŸìɾwlǾŸìɾŸìɾc,ƾOìľOìľc,ƾ;¬Ã¾;¬Ã¾;¬Ã¾;¬Ã¾,Á¾ÿ뿾ÿ뿾,Á¾ë«¾¾ë«¾¾×k½¾Ã+¼¾Ã+¼¾›«¹¾¯ëº¾s+·¾_ëµ¾_ëµ¾K«´¾7k³¾7k³¾ë°¾ûª¯¾ûª¯¾Ó*­¾Ó*­¾Ó*­¾oꦾƒ*¨¾ƒ*¨¾oꦾ꡾÷iŸ¾÷iŸ¾÷iŸ¾“)™¾é—¾é—¾Wi•¾/é’¾/é’¾£(Š¾gh†¾gh†¾eOv¾ÕM]¾=Ê#¾ ŒÀ½Q -%½Á ¼!‚¼!‚¼íɾ=Ïs¾=Ïs¾s+·¾‹¬È¾‹¬È¾Ë­Ü¾k®æ¾k®æ¾Ïîì¾Ïîì¾ ¯ð¾3/ó¾3/ó¾ïñ¾3/ó¾3/ó¾ïñ¾ïñ¾ïñ¾ ¯ð¾ ¯ð¾ ¯ð¾ïñ¾Ïîì¾Ïîì¾»®ë¾»®ë¾»®ë¾§n꾧nê¾k®æ¾k®æ¾k®æ¾Wnå¾C.ä¾C.ä¾Wnå¾/îâ¾nà¾ó-ß¾ó-ß¾nà¾ßíݾßíݾ˭ܾßíݾßíݾ·mÛ¾£-Ú¾£-Ú¾£-Ú¾íؾ£-Ú¾{­×¾{­×¾{­×¾gmÖ¾gmÖ¾gmÖ¾{­×¾{­×¾S-Õ¾?íÓ¾?íÓ¾?íÓ¾+­Ò¾mѾ+­Ò¾mѾ۬;ïìξïìξ-оïìξïìξÇl̾Çl̾Çl̾³,˾Ÿìɾ‹¬È¾wlǾ‹¬È¾wlǾc,ƾc,ƾ‹¬È¾c,ƾc,ƾc,ƾwlǾwlǾ'l¾;¬Ã¾;¬Ã¾,Á¾,Á¾,Á¾ÿ뿾뫾¾ë«¾¾Ã+¼¾›«¹¾›«¹¾‡k¸¾‡k¸¾K«´¾_ëµ¾_ëµ¾7k³¾ë°¾ë°¾ûª¯¾#+²¾#+²¾¿ê«¾«ªª¾«ªª¾ƒ*¨¾ƒ*¨¾[ª¥¾Gj¤¾Gj¤¾꡾÷iŸ¾÷iŸ¾§iš¾§iš¾§iš¾©‘¾ó(¾ó(¾£(Š¾?胾ÝÏ}¾Îi¾Îi¾5H¾Iˆ„½Iˆ„½p»± ½± ½mÌF¾£(Š¾£(Š¾ÿ뿾۬;۬;®á¾“.龧nê¾Ïîì¾Ïîì¾3/ó¾3/ó¾3/ó¾Goô¾Goô¾Goô¾ ¯ð¾ïñ¾ïñ¾ ¯ð¾÷nï¾÷nï¾ã.î¾ã.î¾ã.n꾧nê¾î羧n꾧nê¾Wnå¾k®æ¾k®æ¾k®æ¾®á¾®á¾C.ä¾/îâ¾®á¾ó-ß¾nà¾ó-ß¾ó-ß¾ó-ß¾ó-ß¾·mÛ¾·mÛ¾ßíݾ˭ܾ˭ܾ£-Ú¾£-Ú¾£-Ú¾{­×¾{­×¾{­×¾íؾ?íÓ¾gmÖ¾?íÓ¾?íÓ¾?íÓ¾+­Ò¾+­Ò¾+­Ò¾mѾmѾmѾïìξïìξ-о۬;۬;ïìξïìξïìξ۬;Çl̾۬;³,˾³,˾³,˾Çl̾Çl̾wlǾwlǾwlǾwlǾc,ƾOìľc,ƾ;¬Ã¾'l¾'l¾'l¾ÿ뿾'l¾'l¾×k½¾¯ëº¾¯ëº¾ë«¾¾¯ëº¾¯ëº¾s+·¾‡k¸¾‡k¸¾K«´¾K«´¾K«´¾7k³¾ë°¾ë°¾ûª¯¾ûª¯¾Ó*­¾«ªª¾«ªª¾ƒ*¨¾oꦾoꦾ ª ¾꡾꡾Ï霾“)™¾é—¾k©–¾C)”¾i¾ßè¾ßè¾{¨‡¾ÝÏ}¾ÝÏ}¾­ÍZ¾íɾíɾaæ¼ - º - º‰‰˜½=Ê#¾=Ê#¾ã)ž¾s+·¾³,˾gm־˭ܾk®æ¾»®ë¾»®ë¾ ¯ð¾ ¯ð¾ ¯ð¾ïñ¾3/ó¾3/ó¾ïñ¾ ¯ð¾ ¯ð¾ïñ¾ ¯ð¾ ¯ð¾÷nï¾÷nᄃnê¾Ïîì¾Ïîì¾»®ë¾“.龓.é¾î羓.龓.é¾Wnå¾îç¾îç¾Wnå¾C.ä¾C.ä¾/îâ¾/îâ¾nྮᾮá¾ó-ß¾®á¾®á¾ßíݾ˭ܾ˭ܾ·mÛ¾íؾ£-Ú¾íؾíؾ{­×¾gmÖ¾gmÖ¾gmÖ¾S-Õ¾S-Õ¾?íÓ¾+­Ò¾+­Ò¾S-Õ¾?íÓ¾?íÓ¾+­Ò¾+­Ò¾+­Ò¾mѾmѾ+­Ò¾mѾmѾ-о-о-оÇl̾Çl̾Çl̾³,˾‹¬È¾ŸìɾŸìɾŸìɾŸìɾc,ƾc,ƾOìľOìľOìľ;¬Ã¾;¬Ã¾;¬Ã¾;¬Ã¾ÿ뿾ÿ뿾뫾¾ë«¾¾ë«¾¾Ã+¼¾Ã+¼¾¯ëº¾›«¹¾›«¹¾›«¹¾_ëµ¾_ëµ¾K«´¾7k³¾7k³¾ë°¾7k³¾7k³¾¿ê«¾«ªª¾«ªª¾¿ê«¾[ª¥¾[ª¥¾Gj¤¾Gj¤¾ã)ž¾÷iŸ¾÷iŸ¾»©›¾§iš¾§iš¾k©–¾i¾i¾Ë¨Œ¾èˆ¾+¨‚¾Ïx¾MÎd¾õK?¾ÙŽí½ÙŽí½Á -\¼p»p»ÙŽí½ -ÍP¾ -ÍP¾Ó*­¾,Á¾,Á¾Ë­Ü¾®á¾“.é¾»®ë¾»®ë¾ ¯ð¾3/ó¾3/ó¾÷nï¾Goô¾Goô¾ïñ¾ïñ¾ ¯ð¾ ¯ð¾ã.î¾÷nï¾÷nï¾÷nï¾ã.î¾»®ë¾»®ë¾Ïî쾓.龓.龧nê¾îç¾îç¾îç¾îç¾Wnå¾Wnå¾Wnå¾/îâ¾ó-ß¾ó-ß¾/î⾮ᾮá¾ßíݾßíݾßíݾ˭ܾ£-Ú¾£-Ú¾£-Ú¾íؾíؾ£-Ú¾£-Ú¾·mÛ¾£-Ú¾£-Ú¾gmÖ¾gmÖ¾gmÖ¾gmÖ¾?íÓ¾?íÓ¾gmÖ¾+­Ò¾+­Ò¾+­Ò¾mѾ+­Ò¾mѾmѾ-оÇl̾Çl̾ïìξ۬;۬;Çl̾Çl̾Çl̾³,˾‹¬È¾‹¬È¾‹¬È¾wlǾ‹¬È¾‹¬È¾c,ƾ;¬Ã¾wlǾwlǾ;¬Ã¾,Á¾,Á¾'l¾'l¾'l¾ÿ뿾뫾¾ë«¾¾×k½¾Ã+¼¾Ã+¼¾‡k¸¾›«¹¾›«¹¾_ëµ¾K«´¾K«´¾7k³¾7k³¾¿ê«¾ûª¯¾ûª¯¾Ó*­¾ƒ*¨¾ƒ*¨¾ƒ*¨¾oꦾoꦾGj¤¾꡾꡾꡾ã)ž¾ã)ž¾“)™¾“)™¾Wi•¾ßè¾ßè¾Ë¨Œ¾{¨‡¾{¨‡¾=Ïs¾­ÍZ¾­ÍZ¾‹±½¡ú¼¡ú¼!‚¼™ˆ‰½MɾÅNl¾“)™¾K«´¾ŸìɾŸìɾßíݾWnå¾Wnå¾Ïîì¾ã.î¾ã.î¾Goô¾3/ó¾3/ó¾Goô¾Goô¾Goô¾÷nï¾ ¯ð¾ïñ¾ïñ¾÷nï¾÷nï¾÷nï¾÷nï¾÷nᄃn꾧nê¾îç¾îç¾îç¾îç¾Wnå¾Wnå¾îç¾C.ä¾/îâ¾/îâ¾/îâ¾/îâ¾nà¾nà¾ó-ß¾ó-ß¾ó-ß¾ó-ß¾ßíݾßíݾ˭ܾ˭ܾ˭ܾ·mÛ¾ßíݾßíݾ{­×¾{­×¾{­×¾{­×¾gmÖ¾íؾgmÖ¾{­×¾?íÓ¾S-Õ¾S-Õ¾S-Õ¾mѾmѾ+­Ò¾-о-о+­Ò¾ïìξïìξÇl̾ïìξ۬;Çl̾Çl̾ïìξÇl̾Çl̾³,˾³,˾³,˾‹¬È¾‹¬È¾‹¬È¾wlǾOìľc,ƾc,ƾc,ƾ;¬Ã¾'l¾'l¾뫾¾ÿ뿾ÿ뿾×k½¾×k½¾¯ëº¾×k½¾×k½¾s+·¾‡k¸¾‡k¸¾K«´¾_ëµ¾_ëµ¾#+²¾ë°¾ë°¾ë°¾Ó*­¾¿ê«¾¿ê«¾ƒ*¨¾ƒ*¨¾[ª¥¾oꦾ3*£¾ ª ¾ ª ¾÷iŸ¾»©›¾»©›¾é—¾C)”¾C)”¾Ë¨Œ¾{¨‡¾{¨‡¾(€¾íÎn¾íÎn¾µJ+¾ ŒÀ½± ½ - ºÁ ¼a½…H¾…H¾k©–¾#+²¾#+²¾?íӾ˭ܾ˭ܾ»®ë¾÷nï¾÷nï¾ã.î¾3/ó¾3/ó¾3/ó¾3/ó¾3/ó¾ïñ¾ïñ¾ïñ¾ ¯ð¾÷nï¾ã.î¾÷nï¾÷nï¾»®ë¾§n꾧nê¾Ïîì¾îç¾î羧n꾓.龓.é¾Wnå¾Wnå¾Wnå¾Wnå¾C.ä¾/î⾮ᾮá¾C.侮ᾮá¾nà¾nà¾nà¾Ë­Ü¾Ë­Ü¾Ë­Ü¾ßíݾ£-Ú¾£-Ú¾£-Ú¾íؾ{­×¾{­×¾{­×¾{­×¾íؾíؾgmÖ¾?íÓ¾?íÓ¾?íÓ¾?íÓ¾?íÓ¾?íÓ¾?íÓ¾+­Ò¾+­Ò¾+­Ò¾mѾmѾmѾïìξïìξïìξÇl̾Çl̾Çl̾Çl̾Çl̾Çl̾Ÿìɾ‹¬È¾‹¬È¾ŸìɾŸìɾc,ƾwlǾwlǾ,Á¾'l¾'l¾;¬Ã¾ÿ뿾ÿ뿾ÿ뿾뫾¾ë«¾¾Ã+¼¾×k½¾×k½¾Ã+¼¾‡k¸¾‡k¸¾_ëµ¾K«´¾_ëµ¾#+²¾#+²¾ë°¾ë°¾ë°¾¿ê«¾«ªª¾«ªª¾ƒ*¨¾Gj¤¾Gj¤¾3*£¾3*£¾3*£¾Ï霾»©›¾§iš¾é—¾é—¾/é’¾ó(¾ó(¾{¨‡¾S(…¾S(…¾ÅNl¾…MX¾…MX¾)Š¢½á ¾¼á ¾¼¡ -ª¼Ù‰½eJ&¾ÝÏ}¾ ª ¾s+·¾ŸìɾŸìɾnà¾Wnå¾Wnå¾ã.î¾ã.î¾ã.î¾ ¯ð¾ïñ¾ïñ¾3/ó¾[¯õ¾[¯õ¾ ¯ð¾ ¯ð¾ïñ¾÷nï¾Ïîì¾÷nï¾÷nï¾÷nï¾»®ë¾ã.î¾ã..龧n꾧nê¾îç¾î羓.é¾k®æ¾k®æ¾Wnå¾Wnå¾Wnå¾nà¾nà¾nà¾nà¾ó-ß¾ó-ß¾nà¾ßíݾßíݾ·mÛ¾·mÛ¾·mÛ¾·mÛ¾·mÛ¾íؾíؾíؾíؾ{­×¾{­×¾{­×¾£-Ú¾£-Ú¾?íÓ¾gmÖ¾gmÖ¾gmÖ¾+­Ò¾?íÓ¾?íÓ¾?íÓ¾mѾ+­Ò¾+­Ò¾mѾïìξïìξ۬;Çl̾Çl̾۬;³,˾³,˾Çl̾ŸìɾŸìɾ‹¬È¾wlǾ‹¬È¾c,ƾOìľwlǾwlǾOìľ;¬Ã¾;¬Ã¾;¬Ã¾,Á¾,Á¾,Á¾ë«¾¾×k½¾×k½¾×k½¾›«¹¾›«¹¾›«¹¾‡k¸¾‡k¸¾K«´¾K«´¾#+²¾ë°¾çj®¾ûª¯¾çj®¾çj®¾«ªª¾—j©¾—j©¾oꦾGj¤¾Gj¤¾ã)ž¾ ª ¾ ª ¾»©›¾“)™¾“)™¾k©–¾i¾Ë¨Œ¾£(Š¾{¨‡¾+¨‚¾Ïx¾Ïx¾ÍË<¾ÙŽí½ÙŽí½ È»p»± ½ÙŽí½½ÌK¾ß辫ªª¾«ªª¾-о£-Ú¾£-Ú¾îç¾Ïîì¾Ïîì¾ã.î¾ ¯ð¾ ¯ð¾ ¯ð¾ ¯ð¾ ¯ð¾Goô¾3/ó¾3/ó¾ïñ¾ ¯ð¾÷nï¾÷nï¾÷nï¾ã.n꾧nê¾»®ë¾»®ë¾»®ë¾§nê¾îç¾îç¾Wnå¾k®æ¾k®æ¾/îâ¾C.ä¾C.ä¾C.ä¾®á¾ó-ß¾/îâ¾/îâ¾ó-ß¾ßíݾßíݾßíݾó-ß¾ó-ß¾ßíݾ·mÛ¾·m۾˭ܾ£-Ú¾£-Ú¾{­×¾{­×¾íؾS-Õ¾S-Õ¾gmÖ¾íؾíؾgmÖ¾S-Õ¾S-Õ¾S-Õ¾mѾmѾ-о+­Ò¾+­Ò¾-о۬;۬;-оÇl̾Çl̾ïìξïìξÇl̾ŸìɾŸìɾ³,˾ŸìɾŸìɾwlǾwlǾwlǾc,ƾ;¬Ã¾;¬Ã¾;¬Ã¾Oìľ'l¾ÿ뿾ÿ뿾ÿ뿾×k½¾×k½¾›«¹¾¯ëº¾¯ëº¾s+·¾_ëµ¾K«´¾K«´¾K«´¾#+²¾ë°¾ë°¾ûª¯¾Ó*­¾Ó*­¾¿ê«¾—j©¾—j©¾oꦾ[ª¥¾[ª¥¾Gj¤¾꡾꡾»©›¾Ï霾»©›¾k©–¾k©–¾/é’¾i¾i¾gh†¾+¨‚¾+¨‚¾MÎd¾}Ë7¾}Ë7¾1 C½Á ¼Á ¼á ¾¼IÔ½ELD¾£(Š¾ƒ*¨¾Ã+¼¾Çl̾Çl̾®á¾Wnå¾Wnå¾ã.î¾ ¯ð¾ ¯ð¾ïñ¾3/ó¾3/ó¾ ¯ð¾3/ó¾3/ó¾ïñ¾ïñ¾ïñ¾÷nï¾Ïîì¾Ïîì¾ã.î¾»®ë¾»®ë¾Ïîì¾Ïîì¾îç¾îç¾îç¾îç¾îç¾îç¾Wnå¾/îâ¾/îâ¾/îâ¾/îâ¾/îâ¾/îâ¾/îâ¾®á¾nà¾nà¾C.ä¾nà¾nà¾ßíݾnà¾nà¾íؾ·mÛ¾·mÛ¾£-Ú¾{­×¾{­×¾íؾS-Õ¾S-Õ¾gmÖ¾gmÖ¾+­Ò¾?íÓ¾S-Õ¾+­Ò¾+­Ò¾+­Ò¾+­Ò¾+­Ò¾+­Ò¾mѾ?íÓ¾?íӾ۬;-о-оïìξïìξÇl̾Çl̾Çl̾Çl̾³,˾³,˾ŸìɾŸìɾŸìɾc,ƾOìľc,ƾc,ƾc,ƾ,Á¾c,ƾc,ƾÿ뿾뫾¾ë«¾¾×k½¾Ã+¼¾Ã+¼¾¯ëº¾‡k¸¾‡k¸¾s+·¾s+·¾s+·¾K«´¾K«´¾ûª¯¾ûª¯¾çj®¾#+²¾Ó*­¾Ó*­¾—j©¾«ªª¾«ªª¾Gj¤¾3*£¾3*£¾꡾Ï霾Ï霾Ï霾k©–¾k©–¾/é’¾©‘¾©‘¾·h‹¾gh†¾gh†¾=Ïs¾ýÍ_¾¥K:¾™Ù½™Ù½A 4¼p»p»™Ù½•LI¾•LI¾«ªª¾×k½¾×k½¾£-Ú¾®á¾®á¾»®ë¾÷nï¾÷nï¾ ¯ð¾ïñ¾ïñ¾ïñ¾3/ó¾Goô¾ã.î¾ã.î¾ ¯ð¾ïñ¾ïñ¾ã.î¾Ïîì¾Ïîì¾»®ë¾Ïîì¾Ïîì¾»®ë¾§n꾧n꾓.é¾îç¾îç¾îç¾îç¾Wnå¾Wnå¾Wnå¾C.ä¾/îâ¾/îâ¾/îâ¾/îâ¾ó-ß¾ó-ß¾®á¾nà¾ßíݾßíݾ˭ܾ·mÛ¾·m۾˭ܾ˭ܾ˭ܾ£-Ú¾£-Ú¾£-Ú¾íؾ{­×¾£-Ú¾£-Ú¾gmÖ¾S-Õ¾íؾíؾ+­Ò¾S-Õ¾S-Õ¾S-Õ¾+­Ò¾+­Ò¾mѾ-о-оmѾïìξ۬;-оïìξÇl̾³,˾³,˾Ÿìɾ‹¬È¾‹¬È¾Ÿìɾ‹¬È¾‹¬È¾;¬Ã¾c,ƾc,ƾOìľ;¬Ã¾;¬Ã¾,Á¾,Á¾×k½¾,Á¾,Á¾¯ëº¾×k½¾×k½¾›«¹¾‡k¸¾‡k¸¾‡k¸¾7k³¾7k³¾K«´¾ë°¾ë°¾çj®¾çj®¾Ó*­¾«ªª¾«ªª¾ƒ*¨¾[ª¥¾[ª¥¾Gj¤¾3*£¾3*£¾ã)ž¾§iš¾§iš¾é—¾k©–¾k©–¾i¾·h‹¾·h‹¾S(…¾(€¾(€¾ÕM]¾µJ+¾YŒÅ½ ½p»p»Ñ M½Ñ M½…MX¾©‘¾©‘¾'l¾+­Ò¾+­Ò¾nà¾îç¾Ïîì¾Ïîì¾ã.î¾ ¯ð¾ïñ¾3/ó¾ïñ¾ïñ¾ïñ¾ïñ¾ïñ¾ïñ¾ ¯ð¾ ¯ð¾ ¯ð¾÷nï¾ã.î¾ã.î¾÷nï¾Ïîì¾Ïîì¾k®æ¾»®ë¾»®ë¾îç¾îç¾îç¾îç¾C.ä¾/îâ¾Wnå¾Wnå¾/îâ¾/îâ¾/îâ¾®á¾nà¾nà¾ó-ß¾nà¾nà¾ßíݾßíݾßíݾßíݾnà¾nྣ-Ú¾£-Ú¾£-Ú¾£-Ú¾{­×¾íؾ{­×¾íؾ{­×¾{­×¾{­×¾S-Õ¾S-Õ¾S-Õ¾+­Ò¾mѾmѾ+­Ò¾mѾmѾïìξïìξïìξÇl̾Çl̾Çl̾Çl̾³,˾ŸìɾÇl̾³,˾ŸìɾŸìɾŸìɾc,ƾc,ƾc,ƾOìľ'l¾'l¾'l¾'l¾'l¾ÿ뿾×k½¾×k½¾Ã+¼¾Ã+¼¾Ã+¼¾‡k¸¾‡k¸¾K«´¾_ëµ¾7k³¾#+²¾7k³¾7k³¾çj®¾çj®¾çj®¾«ªª¾«ªª¾«ªª¾ƒ*¨¾3*£¾3*£¾3*£¾÷iŸ¾Ï霾§iš¾§iš¾§iš¾Wi•¾Wi•¾ó(¾Ë¨Œ¾Ë¨Œ¾?胾(€¾(€¾­ÍZ¾íɾíɾq½ - º - ºq -W½5H¾…MX¾C)”¾C)”¾,Á¾mѾmѾC.ä¾Wnå¾Wnå¾Ïîì¾ïñ¾ïñ¾ïñ¾3/ó¾3/ó¾ïñ¾Goô¾Goô¾ïñ¾ïñ¾ïñ¾÷nï¾÷nï¾ ¯ð¾ã.î¾ã.î¾»®ë¾Ïîì¾Ïîì¾îç¾îç¾î羓.é¾k®æ¾k®æ¾îç¾Wnå¾Wnå¾C.ä¾C.ä¾/îâ¾/îâ¾®á¾nà¾nà¾nྮá¾nà¾nà¾ßíݾnà¾nྣ-ھ˭ܾ˭ܾ˭ܾ£-Ú¾£-Ú¾£-Ú¾íؾíؾS-Õ¾íؾíؾgmÖ¾{­×¾S-Õ¾+­Ò¾+­Ò¾S-Õ¾mѾmѾmѾ?íÓ¾?íÓ¾-о-о-оïìξïìξïìξ۬;۬;³,˾ŸìɾŸìɾ‹¬È¾‹¬È¾‹¬È¾OìľOìľOìľc,ƾ,Á¾,Á¾,Á¾'l¾'l¾×k½¾ë«¾¾×k½¾¯ëº¾‡k¸¾›«¹¾‡k¸¾‡k¸¾K«´¾_ëµ¾_ëµ¾7k³¾ë°¾ë°¾çj®¾çj®¾çj®¾Ó*­¾—j©¾—j©¾—j©¾oꦾoꦾ3*£¾꡾÷iŸ¾»©›¾“)™¾k©–¾Wi•¾Wi•¾ó(¾ßè¾ßè¾S(…¾(€¾(€¾%Nb¾õK?¾õK?¾±k½Á ¼Á ¼aæ¼i‹¶½µJ+¾+¨‚¾3*£¾›«¹¾³,˾³,˾nà¾Wnå¾Wnå¾Ïîì¾ ¯ð¾ ¯ð¾ïñ¾ïñ¾ïñ¾ ¯ð¾ïñ¾ïñ¾ïñ¾ ¯ð¾ ¯ð¾ïñ¾ã.î¾Ïîì¾ã.î¾ã.n꾧n꾧n꾓.龧n꾧nê¾îç¾k®æ¾k®æ¾îç¾k®æ¾k®æ¾Wnå¾k®æ¾k®æ¾C.ä¾nྮá¾C.ä¾C.ä¾ó-ß¾nà¾nà¾ßíݾßíݾßíݾ˭ܾ˭ܾ£-Ú¾·mÛ¾·mÛ¾·mÛ¾£-Ú¾£-Ú¾gmÖ¾{­×¾{­×¾{­×¾S-Õ¾S-Õ¾íؾS-Õ¾S-Õ¾?íÓ¾?íÓ¾S-Õ¾-о-о+­Ò¾mѾmѾ-о-о-о۬;Çl̾Çl̾³,˾³,˾³,˾‹¬È¾‹¬È¾c,ƾwlǾOìľ;¬Ã¾;¬Ã¾;¬Ã¾'l¾ÿ뿾ÿ뿾,Á¾ÿ뿾ÿ뿾Ã+¼¾×k½¾×k½¾Ã+¼¾›«¹¾s+·¾_ëµ¾‡k¸¾_ëµ¾#+²¾#+²¾#+²¾ûª¯¾ûª¯¾¿ê«¾«ªª¾«ªª¾ƒ*¨¾oꦾoꦾ3*£¾ ª ¾ ª ¾ã)ž¾§iš¾§iš¾“)™¾“)™¾/é’¾ó(¾ó(¾£(Š¾{¨‡¾{¨‡¾µO{¾%Nb¾%Nb¾ -ȾIˆ„½Iˆ„½p;!‚¼‰‰˜½Ê(¾µO{¾÷iŸ¾s+·¾s+·¾S-Õ¾ßíݾßíݾîç¾»®ë¾»®ë¾÷nï¾÷nï¾÷nï¾ïñ¾ ¯ð¾ ¯ð¾ïñ¾ïñ¾ïñ¾ ¯ð¾ ¯ð¾÷nï¾÷nï¾÷nï¾ã.î¾Ïîì¾Ïîì¾Ïîì¾Ïîì¾Ïî쾓.龧n꾓.é¾îç¾k®æ¾îç¾îç¾îç¾C.ä¾C.ä¾C.ä¾C.侮ᾮᾮᾮᾮá¾nà¾ßíݾßíݾó-ß¾ó-߾˭ܾßíݾßíݾ˭ܾíؾíؾ·mÛ¾·mÛ¾·mÛ¾·mÛ¾íؾíؾ{­×¾S-Õ¾gmÖ¾S-Õ¾S-Õ¾?íÓ¾+­Ò¾+­Ò¾+­Ò¾+­Ò¾+­Ò¾-оmѾmѾïìξ۬;۬;ïìξ³,˾³,˾³,˾Çl̾³,˾‹¬È¾‹¬È¾wlǾwlǾwlǾc,ƾOìľOìľ;¬Ã¾;¬Ã¾;¬Ã¾×k½¾ë«¾¾ë«¾¾¯ëº¾¯ëº¾›«¹¾›«¹¾›«¹¾_ëµ¾_ëµ¾_뵾밾밾밾ûª¯¾ûª¯¾ûª¯¾¿ê«¾—j©¾—j©¾ƒ*¨¾oꦾoꦾGj¤¾Gj¤¾÷iŸ¾Ï霾Ï霾“)™¾é—¾é—¾©‘¾i¾i¾{¨‡¾?胾?胾Îi¾åLN¾É¾yŠ§½yŠ§½ - º È» È»…H¾%Nb¾%Nb¾çj®¾,Á¾,Á¾Ë­Ü¾®á¾k®æ¾»®ë¾»®ë¾÷nï¾ ¯ð¾ ¯ð¾ïñ¾ ¯ð¾ ¯ð¾ ¯ð¾Goô¾Goô¾3/ó¾ïñ¾ïñ¾÷nï¾÷nï¾÷nï¾Ïîì¾Ïî쾧nê¾ã.î¾ã.î¾î羧n꾧n꾓.é¾Wnå¾Wnå¾Wnå¾C.ä¾C.ä¾Wnå¾C.ä¾/îâ¾Wnå¾Wnå¾ó-ß¾®á¾®á¾®á¾ó-ß¾ó-ß¾nà¾nà¾nà¾ßíݾßíݾßíݾ·mÛ¾·mÛ¾·mÛ¾íؾíؾíؾ{­×¾{­×¾gmÖ¾{­×¾{­×¾gmÖ¾?íÓ¾?íÓ¾?íÓ¾mѾmѾ+­Ò¾+­Ò¾ïìξ-о-о-о-о-оÇl̾³,˾Çl̾Çl̾Çl̾‹¬È¾‹¬È¾‹¬È¾‹¬È¾c,ƾc,ƾ;¬Ã¾;¬Ã¾,Á¾,Á¾,Á¾×k½¾×k½¾×k½¾ë«¾¾¯ëº¾¯ëº¾›«¹¾s+·¾s+·¾_ëµ¾s+·¾K«´¾#+²¾#+²¾#+²¾çj®¾çj®¾ûª¯¾¿ê«¾¿ê«¾ƒ*¨¾oꦾoꦾ꡾꡾ ª ¾÷iŸ¾Ï霾k©–¾“)™¾“)™¾/é’¾ó(¾ó(¾{¨‡¾{¨‡¾{¨‡¾=Ïs¾ýÍ_¾ýÍ_¾ -Ⱦ±k½±k½p;¡ -ª¼ÉŠ¬½µJ+¾µO{¾ ª ¾s+·¾s+·¾+­Ò¾ßíݾßíݾîç¾»®ë¾»®ë¾÷nï¾3/ó¾3/ó¾ïñ¾ïñ¾3/ó¾3/ó¾3/ó¾ ¯ð¾ïñ¾ïñ¾÷nï¾ã.î¾ã.î¾÷nï¾Ïîì¾Ïîì¾Ïî쾓.龓.龓.龧n꾧n꾧n꾧n꾓.é¾Wnå¾Wnå¾îç¾k®æ¾k®æ¾/îâ¾C.ä¾C.ä¾®á¾nྮᾮᾮá¾ßíݾ˭ܾ˭ܾó-߾˭ܾ˭ܾ£-Ú¾£-Ú¾·mÛ¾·mÛ¾·mÛ¾£-Ú¾£-Ú¾£-Ú¾gmÖ¾S-Õ¾S-Õ¾{­×¾S-Õ¾S-Õ¾?íÓ¾S-Õ¾S-Õ¾?íÓ¾?íÓ¾mѾmѾmѾmѾ۬;۬;Çl̾³,˾³,˾‹¬È¾³,˾³,˾c,ƾ‹¬È¾wlǾOìľOìľ;¬Ã¾;¬Ã¾;¬Ã¾,Á¾,Á¾,Á¾ë«¾¾ë«¾¾ë«¾¾×k½¾¯ëº¾Ã+¼¾›«¹¾s+·¾_ëµ¾_ëµ¾_ëµ¾#+²¾ë°¾ë°¾#+²¾¿ê«¾¿ê«¾«ªª¾ƒ*¨¾ƒ*¨¾Gj¤¾3*£¾3*£¾ ª ¾÷iŸ¾ã)ž¾»©›¾»©›¾é—¾Wi•¾Wi•¾ó(¾ó(¾ó(¾S(…¾?胾?胾Îi¾•LI¾•LI¾)Š¢½á ¾¼p; È» È»…H¾%Nb¾%Nb¾çj®¾,Á¾,Á¾·mÛ¾nà¾nྦྷnê¾÷nï¾÷nï¾Ïîì¾ ¯ð¾3/ó¾ïñ¾ïñ¾ïñ¾ïñ¾ïñ¾ ¯ð¾ ¯ð¾ã.î¾ã.î¾ã.î¾Ïîì¾ã.î¾ã.î¾÷nï¾Ïîì¾Ïî쾧nê¾»®ë¾»®ë¾îç¾îç¾îç¾îç¾Wnå¾Wnå¾Wnå¾Wnå¾/îâ¾C.ä¾C.ä¾nྮᾮᾮá¾ó-ß¾ó-ß¾ó-ß¾ßíݾßíݾ·mÛ¾ßíݾ˭ܾ£-Ú¾£-ھ˭ܾ·mÛ¾·mÛ¾£-Ú¾íؾíؾgmÖ¾{­×¾{­×¾S-Õ¾gmÖ¾gmÖ¾?íÓ¾+­Ò¾?íÓ¾+­Ò¾+­Ò¾ïìξ-о-оïìξÇl̾Çl̾۬;³,˾ŸìɾŸìɾ³,˾‹¬È¾wlǾwlǾwlǾwlǾwlǾOìľ'l¾'l¾'l¾,Á¾,Á¾×k½¾ë«¾¾ë«¾¾Ã+¼¾Ã+¼¾‡k¸¾›«¹¾›«¹¾ë°¾K«´¾K«´¾ûª¯¾çj®¾çj®¾¿ê«¾¿ê«¾¿ê«¾—j©¾oꦾGj¤¾Gj¤¾Gj¤¾÷iŸ¾÷iŸ¾÷iŸ¾Ï霾k©–¾k©–¾é—¾Wi•¾Wi•¾·h‹¾·h‹¾gh†¾h¾h¾uNg¾ELD¾ELD¾™ˆ‰½Á -\¼Á -\¼Á ¼Qu½%I¾MÎd¾MÎd¾#+²¾;¬Ã¾;¬Ã¾£-Ú¾C.ä¾C.侓.é¾ã.î¾ã.î¾ ¯ð¾ïñ¾ïñ¾3/ó¾ ¯ð¾ïñ¾ïñ¾ïñ¾ã.î¾ïñ¾ïñ¾ ¯ð¾ã.î¾ã.î¾ïñ¾»®ë¾»®ë¾Ïîì¾»®ë¾»®ë¾“.龓.龓.é¾îç¾Wnå¾îç¾k®æ¾k®æ¾Wnå¾C.ä¾C.ä¾®á¾/îâ¾/îâ¾ó-ß¾nà¾C.ä¾nà¾ó-ß¾nà¾ó-ß¾ó-ß¾ßíݾ£-Ú¾£-Ú¾ßíݾ˭ܾ˭ܾ·mÛ¾íؾíؾ{­×¾gmÖ¾gmÖ¾{­×¾íؾgmÖ¾+­Ò¾?íÓ¾gmÖ¾?íÓ¾?íÓ¾mѾmѾmѾïìξ۬;۬;ïìξ۬;³,˾Çl̾³,˾³,˾ŸìɾŸìɾc,ƾ‹¬È¾‹¬È¾Oìľ;¬Ã¾;¬Ã¾;¬Ã¾'l¾'l¾뫾¾ë«¾¾×k½¾¯ëº¾¯ëº¾¯ëº¾›«¹¾›«¹¾‡k¸¾K«´¾K«´¾7k³¾7k³¾7k³¾Ó*­¾ë°¾çj®¾¿ê«¾—j©¾«ªª¾«ªª¾Gj¤¾[ª¥¾3*£¾3*£¾ã)ž¾Ï霾Ï霾Ï霾闾闾/é’¾i¾i¾£(Š¾S(…¾S(…¾ÝÏ}¾íÎn¾]ÍU¾J!¾J!¾± ½ - : - : ½9Žã½9Žã½gh†¾oꦾoꦾÇl̾S-Õ¾S-Õ¾C.ä¾îç¾Ïîì¾ã.î¾ã.î¾ã.î¾3/ó¾3/ó¾ïñ¾ ¯ð¾ ¯ð¾ïñ¾÷nï¾÷nï¾ã.î¾ ¯ð¾ ¯ð¾»®ë¾ã.î¾ã.î¾»®ë¾§nê¾»®ë¾“.龓.é¾î羓.龓.é¾k®æ¾“.龓.é¾Wnå¾/îâ¾/îâ¾C.ä¾/îâ¾/îâ¾/î⾮ᾮá¾nà¾nà¾nà¾ó-ß¾ó-ß¾nà¾Ë­Ü¾Ë­Ü¾Ë­Ü¾íؾíؾ·mÛ¾·mÛ¾·mÛ¾gmÖ¾£-Ú¾gmÖ¾gmÖ¾gmÖ¾?íÓ¾íؾíؾ+­Ò¾?íÓ¾?íÓ¾?íÓ¾+­Ò¾+­Ò¾+­Ò¾-оmѾïìξïìξ³,˾Çl̾Çl̾ŸìɾŸìɾŸìɾŸìɾOìľOìľwlǾc,ƾc,ƾ'l¾'l¾,Á¾,Á¾ÿ뿾×k½¾ë«¾¾ë«¾¾¯ëº¾›«¹¾›«¹¾‡k¸¾›«¹¾›«¹¾7k³¾#+²¾#+²¾#+²¾ûª¯¾ûª¯¾çj®¾ûª¯¾ûª¯¾ƒ*¨¾—j©¾—j©¾[ª¥¾3*£¾꡾÷iŸ¾÷iŸ¾»©›¾§iš¾§iš¾k©–¾Wi•¾Wi•¾Ë¨Œ¾£(Š¾èˆ¾+¨‚¾+¨‚¾Îi¾%Nb¾%Nb¾)ò½a½a½Á <Á -\¼Á -\¼µJ+¾eOv¾Ï霾_ëµ¾_ëµ¾-о·mÛ¾·mÛ¾î羓.龓.é¾÷nï¾Ïîì¾Ïîì¾ ¯ð¾ïñ¾ïñ¾÷nï¾ ¯ð¾ ¯ð¾÷nï¾÷nï¾÷nï¾ã.î¾ã.î¾÷nï¾»®ë¾»®ë¾»®ë¾ã.î¾ã..龓.龓.龓.é¾k®æ¾îç¾îç¾îç¾C.ä¾C.ä¾C.ä¾C.ä¾/îâ¾/îâ¾®á¾nà¾nà¾nà¾ßíݾßíݾó-ß¾ßíݾßíݾ˭ܾßíݾ˭ܾ·mÛ¾·mÛ¾£-Ú¾·mÛ¾·mÛ¾{­×¾{­×¾{­×¾{­×¾íؾíؾ{­×¾S-Õ¾S-Õ¾?íÓ¾+­Ò¾+­Ò¾?íÓ¾?íÓ¾ïìξ۬;۬;mѾ۬;۬;³,˾۬;۬;‹¬È¾‹¬È¾‹¬È¾‹¬È¾wlǾwlǾc,ƾ;¬Ã¾;¬Ã¾;¬Ã¾'l¾뫾¾ÿ뿾ÿ뿾×k½¾×k½¾×k½¾Ã+¼¾‡k¸¾‡k¸¾‡k¸¾s+·¾s+·¾#+²¾7k³¾7k³¾çj®¾çj®¾çj®¾«ªª¾«ªª¾ƒ*¨¾[ª¥¾[ª¥¾3*£¾3*£¾3*£¾Ï霾Ï霾Ï霾§iš¾é—¾é—¾/é’¾/é’¾/é’¾·h‹¾{¨‡¾+¨‚¾Ïx¾Ïx¾]ÍU¾=Ê#¾=Ê#¾Q -%½p;p; ½IÔ½ÍË<¾S(…¾[ª¥¾›«¹¾‹¬È¾‹¬È¾Ë­Ü¾Wnå¾Wn徧nê¾Ïîì¾Ïîì¾÷nï¾ ¯ð¾ ¯ð¾3/ó¾ ¯ð¾ ¯ð¾ïñ¾÷nï¾Ïîì¾ïñ¾ïñ¾»®ë¾ã.î¾ã.î¾ã.î¾Ïîì¾Ïîì¾»®ë¾Ïîì¾Ïîì¾î羓.龓.é¾k®æ¾k®æ¾k®æ¾Wnå¾k®æ¾Wnå¾C.ä¾C.ä¾/îâ¾C.ä¾C.ä¾ó-ß¾nà¾nà¾nà¾ó-ß¾ó-ß¾nà¾nà¾nà¾Ë­Ü¾ßíݾßíݾ·mÛ¾·m۾˭ܾíؾíؾíؾíؾíؾgmÖ¾íؾíؾmѾ?íÓ¾?íÓ¾+­Ò¾-оmѾmѾmѾ-оïìξ۬;۬;³,˾³,˾۬;³,˾³,˾Ÿìɾ‹¬È¾‹¬È¾‹¬È¾‹¬È¾‹¬È¾'l¾OìľOìľ,Á¾,Á¾ë«¾¾ÿ뿾ÿ뿾›«¹¾Ã+¼¾Ã+¼¾s+·¾s+·¾s+·¾7k³¾7k³¾#+²¾ë°¾ë°¾¿ê«¾Ó*­¾Ó*­¾—j©¾ƒ*¨¾ƒ*¨¾oꦾGj¤¾Gj¤¾꡾꡾꡾Ï霾»©›¾“)™¾k©–¾k©–¾ó(¾ßè¾ßè¾gh†¾+¨‚¾+¨‚¾ÅNl¾­ÍZ¾­ÍZ¾ ŒÀ½± ½± ½ È;a –¼¹‹»½UK5¾UK5¾÷iŸ¾‡k¸¾‡k¸¾?íӾ˭ܾ˭ܾî羧n꾧nê¾ã.î¾ã.î¾ã.î¾ïñ¾3/ó¾3/ó¾÷nï¾3/ó¾3/ó¾÷nï¾÷nï¾÷nï¾÷nï¾÷nï¾Ïîì¾Ïîì¾Ïîì¾»®ë¾“.龓.龓.龧n꾧n꾓.é¾k®æ¾k®æ¾k®æ¾k®æ¾C.ä¾Wnå¾Wnå¾Wn微ᾮá¾C.ä¾C.ä¾C.ä¾ó-ß¾/îâ¾/îâ¾nà¾nà¾nà¾ßíݾßíݾßíݾ·mÛ¾£-Ú¾£-ھ˭ܾ˭ܾ{­×¾{­×¾{­×¾{­×¾?íÓ¾?íÓ¾{­×¾gmÖ¾gmÖ¾S-Õ¾S-Õ¾S-Õ¾+­Ò¾+­Ò¾-оïìξïìξïìξïìξïìξ۬;۬;۬;‹¬È¾‹¬È¾‹¬È¾wlǾc,ƾ'l¾OìľOìľ'l¾'l¾'l¾ÿ뿾뫾¾ë«¾¾Ã+¼¾¯ëº¾¯ëº¾›«¹¾_ëµ¾7k³¾‡k¸¾s+·¾7k³¾#+²¾#+²¾7k³¾ûª¯¾ûª¯¾Ó*­¾¿ê«¾¿ê«¾ƒ*¨¾[ª¥¾[ª¥¾Gj¤¾꡾꡾ã)ž¾Ï霾Ï霾é—¾C)”¾©‘¾/é’¾/钾舾gh†¾gh†¾h¾Oq¾Oq¾ÌA¾ -Ⱦ -Ⱦ!‚¼Á <Á <a½ÕH -¾%Nb¾/é’¾ûª¯¾,Á¾Û¬Í¾Û¬Í¾nà¾k®æ¾k®æ¾§nê¾÷nï¾÷nï¾ ¯ð¾ã.î¾ã.î¾ïñ¾ ¯ð¾ ¯ð¾3/ó¾÷nï¾÷nï¾÷nï¾÷nï¾Ïîì¾Ïîì¾Ïîì¾Ïîì¾Ïîì¾Ïîì¾Ïî쾧n꾧n꾧n꾓.龓.é¾Wnå¾k®æ¾k®æ¾îç¾îç¾Wnå¾îç¾îç¾C.ä¾/îâ¾/îâ¾nྮᾮᾮá¾ó-ß¾ó-ß¾®á¾ßíݾ˭ܾ·m۾˭ܾßíݾíؾíؾ·mÛ¾·mÛ¾·mÛ¾£-Ú¾íؾíؾ{­×¾S-Õ¾{­×¾S-Õ¾S-Õ¾?íÓ¾+­Ò¾+­Ò¾?íÓ¾?íÓ¾?íÓ¾Çl̾ïìξïìξ۬;Çl̾Çl̾۬;‹¬È¾wlǾ‹¬È¾‹¬È¾wlǾc,ƾc,ƾ'l¾'l¾'l¾,Á¾ÿ뿾ÿ뿾ÿ뿾×k½¾×k½¾¯ëº¾Ã+¼¾Ã+¼¾s+·¾s+·¾_ëµ¾_ëµ¾_ëµ¾#+²¾çj®¾çj®¾çj®¾«ªª¾«ªª¾—j©¾—j©¾—j©¾[ª¥¾꡾꡾꡾꡾§iš¾»©›¾»©›¾k©–¾©‘¾©‘¾©‘¾ßè¾ßè¾gh†¾h¾h¾íÎn¾]ÍU¾ÝÊ-¾ùŒÏ½1 C½p»A 4Ù¿>Ù¿>Ù¿49¿R¿R¿>Ù¿>Ù¿Hy¿\¹¿\¹¿\¹¿\¹¿\¹¿fY¿fY¿fY¿\¹¿pù¿pù¿pù¿pù¿„9¿ŽÙ¿ŽÙ¿„9¿„9¿„9¿˜y¿ŽÙ¿ŽÙ¿¢¿¢¿ŽÙ¿¬¹¿¬¹¿¢¿¢¿¢¿Ê™¿¬¹¿¬¹¿Àù¿¬¹¿¬¹¿Ô9¿Ô9¿Ô9¿¶Y¿Ô9¿Ô9¿¶Y¿Àù¿Ô9¿Ô9¿Ô9¿Ê™¿èy¿èy¿èy¿èy¿èy¿ÞÙ¿ò¿ò¿èy¿èy¿èy¿ü¹¿ò¿ò¿ò¿ú ¿Z ¿èy¿èy¿Z ¿ü¹¿ü¹¿ò¿Z ¿Z ¿ü¹¿ü¹¿ü¹¿ü¹¿ú ¿ú ¿ú ¿ü¹¿ú ¿ú ¿ú ¿ü¹¿š!¿š!¿ú ¿ú ¿ú ¿$:"¿š!¿š!¿š!¿$:"¿$:"¿$:"¿$:"¿$:"¿š!¿$:"¿$:"¿8z#¿$:"¿.Ú"¿.Ú"¿.Ú"¿š!¿$:"¿$:"¿š!¿.Ú"¿.Ú"¿8z#¿.Ú"¿.Ú"¿8z#¿8z#¿Lº$¿8z#¿8z#¿B$¿.Ú"¿.Ú"¿B$¿8z#¿8z#¿Lº$¿B$¿8z#¿B$¿B$¿VZ%¿8z#¿8z#¿B$¿Lº$¿Lº$¿B$¿Lº$¿Lº$¿B$¿B$¿Lº$¿8z#¿B$¿VZ%¿B$¿B$¿Lº$¿`ú%¿`ú%¿8z#¿VZ%¿VZ%¿VZ%¿VZ%¿VZ%¿`ú%¿VZ%¿VZ%¿Lº$¿Lº$¿`ú%¿VZ%¿VZ%¿`ú%¿Lº$¿Lº$¿VZ%¿VZ%¿VZ%¿VZ%¿`ú%¿`ú%¿Lº$¿VZ%¿VZ%¿VZ%¿`ú%¿`ú%¿`ú%¿VZ%¿VZ%¿t:'¿t:'¿`ú%¿`ú%¿`ú%¿`ú%¿jš&¿jš&¿t:'¿`ú%¿`ú%¿~Ú'¿t:'¿t:'¿jš&¿t:'¿t:'¿jš&¿jš&¿jš&¿~Ú'¿~Ú'¿`ú%¿jš&¿jš&¿jš&¿`ú%¿`ú%¿VZ%¿t:'¿t:'¿`ú%¿jš&¿jš&¿~Ú'¿jš&¿`ú%¿`ú%¿ˆz(¿~Ú'¿jš&¿jš&¿~Ú'¿~Ú'¿~Ú'¿t:'¿t:'¿t:'¿`ú%¿t:'¿t:'¿`ú%¿t:'¿t:'¿jš&¿jš&¿~Ú'¿t:'¿t:'¿jš&¿t:'¿t:'¿jš&¿jš&¿jš&¿t:'¿~Ú'¿~Ú'¿~Ú'¿t:'¿jš&¿t:'¿t:'¿~Ú'¿t:'¿t:'¿~Ú'¿~Ú'¿~Ú'¿ˆz(¿~Ú'¿~Ú'¿~Ú'¿t:'¿t:'¿jš&¿~Ú'¿~Ú'¿~Ú'¿t:'¿t:'¿~Ú'¿~Ú'¿~Ú'¿t:'¿t:'¿jš&¿t:'¿t:'¿~Ú'¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿t:'¿ˆz(¿’)¿t:'¿t:'¿ˆz(¿~Ú'¿~Ú'¿~Ú'¿ˆz(¿ˆz(¿~Ú'¿~Ú'¿~Ú'¿t:'¿t:'¿t:'¿t:'¿t:'¿~Ú'¿ˆz(¿t:'¿~Ú'¿t:'¿t:'¿~Ú'¿t:'¿t:'¿ˆz(¿’)¿’)¿~Ú'¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿t:'¿~Ú'¿’)¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿~Ú'¿~Ú'¿~Ú'¿t:'¿t:'¿t:'¿’)¿~Ú'¿t:'¿~Ú'¿~Ú'¿ˆz(¿t:'¿t:'¿’)¿ˆz(¿ˆz(¿’)¿~Ú'¿~Ú'¿ˆz(¿~Ú'¿~Ú'¿~Ú'¿ˆz(¿’)¿ˆz(¿ˆz(¿’)¿œº)¿œº)¿ˆz(¿’)¿’)¿~Ú'¿ˆz(¿ˆz(¿t:'¿ˆz(¿ˆz(¿t:'¿t:'¿t:'¿ˆz(¿ˆz(¿t:'¿~Ú'¿~Ú'¿~Ú'¿t:'¿t:'¿’)¿ˆz(¿ˆz(¿ˆz(¿’)¿’)¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿~Ú'¿’)¿’)¿t:'¿ˆz(¿ˆz(¿œº)¿~Ú'¿ˆz(¿ˆz(¿t:'¿ˆz(¿~Ú'¿~Ú'¿~Ú'¿’)¿’)¿’)¿ˆz(¿ˆz(¿’)¿’)¿’)¿’)¿œº)¿ˆz(¿~Ú'¿~Ú'¿~Ú'¿ˆz(¿ˆz(¿~Ú'¿’)¿’)¿ˆz(¿ˆz(¿ˆz(¿t:'¿ˆz(¿ˆz(¿~Ú'¿~Ú'¿~Ú'¿’)¿~Ú'¿~Ú'¿~Ú'¿~Ú'¿ˆz(¿~Ú'¿~Ú'¿œº)¿~Ú'¿~Ú'¿ˆz(¿œº)¿’)¿’)¿~Ú'¿~Ú'¿’)¿’)¿’)¿~Ú'¿~Ú'¿~Ú'¿ˆz(¿ˆz(¿t:'¿ˆz(¿ˆz(¿~Ú'¿t:'¿t:'¿’)¿ˆz(¿ˆz(¿ˆz(¿~Ú'¿~Ú'¿~Ú'¿~Ú'¿ˆz(¿~Ú'¿~Ú'¿’)¿~Ú'¿~Ú'¿œº)¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿t:'¿’)¿ˆz(¿’)¿’)¿~Ú'¿ˆz(¿ˆz(¿’)¿~Ú'¿~Ú'¿~Ú'¿~Ú'¿~Ú'¿~Ú'¿ˆz(¿~Ú'¿ˆz(¿ˆz(¿t:'¿’)¿’)¿’)¿~Ú'¿~Ú'¿ˆz(¿~Ú'¿~Ú'¿~Ú'¿ˆz(¿~Ú'¿ˆz(¿~Ú'¿ˆz(¿~Ú'¿~Ú'¿ˆz(¿~Ú'¿~Ú'¿’)¿~Ú'¿~Ú'¿~Ú'¿ˆz(¿ˆz(¿~Ú'¿ˆz(¿ˆz(¿’)¿’)¿~Ú'¿t:'¿t:'¿ˆz(¿’)¿’)¿~Ú'¿~Ú'¿~Ú'¿~Ú'¿t:'¿t:'¿ˆz(¿’)¿’)¿~Ú'¿~Ú'¿œº)¿~Ú'¿~Ú'¿ˆz(¿’)¿’)¿t:'¿ˆz(¿ˆz(¿t:'¿ˆz(¿ˆz(¿t:'¿~Ú'¿~Ú'¿~Ú'¿~Ú'¿~Ú'¿’)¿’)¿t:'¿~Ú'¿~Ú'¿ˆz(¿t:'¿t:'¿’)¿’)¿’)¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿~Ú'¿’)¿t:'¿t:'¿’)¿t:'¿t:'¿~Ú'¿ˆz(¿ˆz(¿t:'¿t:'¿t:'¿~Ú'¿jš&¿jš&¿t:'¿ˆz(¿t:'¿ˆz(¿~Ú'¿~Ú'¿’)¿’)¿ˆz(¿~Ú'¿~Ú'¿ˆz(¿~Ú'¿~Ú'¿ˆz(¿œº)¿œº)¿~Ú'¿ˆz(¿ˆz(¿t:'¿~Ú'¿~Ú'¿ˆz(¿ˆz(¿’)¿~Ú'¿~Ú'¿ˆz(¿~Ú'¿~Ú'¿t:'¿~Ú'¿~Ú'¿ˆz(¿jš&¿t:'¿’)¿~Ú'¿t:'¿ˆz(¿ˆz(¿’)¿~Ú'¿~Ú'¿ˆz(¿’)¿’)¿t:'¿ˆz(¿ˆz(¿’)¿~Ú'¿~Ú'¿ˆz(¿ˆz(¿ˆz(¿~Ú'¿~Ú'¿t:'¿’)¿’)¿t:'¿ˆz(¿ˆz(¿~Ú'¿~Ú'¿ˆz(¿ˆz(¿ˆz(¿~Ú'¿~Ú'¿~Ú'¿ˆz(¿’)¿’)¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿~Ú'¿ˆz(¿ˆz(¿’)¿~Ú'¿~Ú'¿ˆz(¿t:'¿t:'¿~Ú'¿~Ú'¿~Ú'¿~Ú'¿~Ú'¿ˆz(¿ˆz(¿ˆz(¿’)¿~Ú'¿~Ú'¿ˆz(¿’)¿’)¿t:'¿ˆz(¿ˆz(¿œº)¿jš&¿jš&¿’)¿ˆz(¿~Ú'¿~Ú'¿’)¿~Ú'¿œº)¿œº)¿’)¿ˆz(¿ˆz(¿’)¿ˆz(¿ˆz(¿ˆz(¿’)¿’)¿jš&¿ˆz(¿ˆz(¿~Ú'¿t:'¿~Ú'¿ˆz(¿ˆz(¿~Ú'¿’)¿’)¿~Ú'¿ˆz(¿ˆz(¿’)¿~Ú'¿~Ú'¿’)¿~Ú'¿~Ú'¿’)¿œº)¿œº)¿t:'¿’)¿’)¿jš&¿jš&¿~Ú'¿~Ú'¿~Ú'¿t:'¿~Ú'¿~Ú'¿’)¿~Ú'¿~Ú'¿~Ú'¿t:'¿ˆz(¿’)¿’)¿’)¿’)¿’)¿~Ú'¿~Ú'¿~Ú'¿’)¿~Ú'¿~Ú'¿’)¿ˆz(¿ˆz(¿’)¿’)¿~Ú'¿ˆz(¿ˆz(¿t:'¿t:'¿t:'¿’)¿~Ú'¿~Ú'¿t:'¿ˆz(¿ˆz(¿jš&¿ˆz(¿ˆz(¿ˆz(¿t:'¿~Ú'¿ˆz(¿ˆz(¿’)¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿’)¿ˆz(¿ˆz(¿’)¿~Ú'¿~Ú'¿’)¿ˆz(¿~Ú'¿t:'¿t:'¿’)¿t:'¿t:'¿~Ú'¿ˆz(¿ˆz(¿t:'¿~Ú'¿~Ú'¿jš&¿~Ú'¿~Ú'¿~Ú'¿t:'¿t:'¿’)¿~Ú'¿ˆz(¿’)¿’)¿jš&¿’)¿’)¿œº)¿ˆz(¿ˆz(¿ˆz(¿’)¿’)¿t:'¿’)¿’)¿~Ú'¿~Ú'¿~Ú'¿t:'¿t:'¿’)¿ˆz(¿ˆz(¿jš&¿ˆz(¿ˆz(¿t:'¿~Ú'¿~Ú'¿ˆz(¿t:'¿t:'¿ˆz(¿~Ú'¿~Ú'¿ˆz(¿ˆz(¿t:'¿ˆz(¿ˆz(¿~Ú'¿~Ú'¿’)¿ˆz(¿’)¿ˆz(¿ˆz(¿ˆz(¿t:'¿~Ú'¿~Ú'¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿~Ú'¿~Ú'¿t:'¿~Ú'¿t:'¿~Ú'¿~Ú'¿~Ú'¿’)¿’)¿ˆz(¿~Ú'¿~Ú'¿~Ú'¿~Ú'¿~Ú'¿jš&¿jš&¿ \ No newline at end of file diff -Nru matplotlib-0.99.3/examples/data/msft.csv matplotlib-1.0.1/examples/data/msft.csv --- matplotlib-0.99.3/examples/data/msft.csv 2009-07-31 15:14:50.000000000 +0000 +++ matplotlib-1.0.1/examples/data/msft.csv 1970-01-01 00:00:00.000000000 +0000 @@ -1,66 +0,0 @@ -Date,Open,High,Low,Close,Volume,Adj. Close* -19-Sep-03,29.76,29.97,29.52,29.96,92433800,29.79 -18-Sep-03,28.49,29.51,28.42,29.50,67268096,29.34 -17-Sep-03,28.76,28.95,28.47,28.50,47221600,28.34 -16-Sep-03,28.41,28.95,28.32,28.90,52060600,28.74 -15-Sep-03,28.37,28.61,28.33,28.36,41432300,28.20 -12-Sep-03,27.48,28.40,27.45,28.34,55777200,28.18 -11-Sep-03,27.66,28.11,27.59,27.84,37813300,27.68 -10-Sep-03,28.03,28.18,27.48,27.55,54763500,27.40 -9-Sep-03,28.65,28.71,28.31,28.37,44315200,28.21 -8-Sep-03,28.39,28.92,28.34,28.84,46105300,28.68 -5-Sep-03,28.23,28.75,28.17,28.38,64024500,28.22 -4-Sep-03,28.10,28.47,27.99,28.43,59840800,28.27 -3-Sep-03,27.42,28.40,27.38,28.30,109437800,28.14 -2-Sep-03,26.70,27.30,26.47,27.26,74168896,27.11 -29-Aug-03,26.46,26.55,26.35,26.52,34503000,26.37 -28-Aug-03,26.50,26.58,26.24,26.51,46211200,26.36 -27-Aug-03,26.51,26.58,26.30,26.42,30633900,26.27 -26-Aug-03,26.31,26.67,25.96,26.57,47546000,26.42 -25-Aug-03,26.31,26.54,26.23,26.50,36132900,26.35 -22-Aug-03,26.78,26.95,26.21,26.22,65846300,26.07 -21-Aug-03,26.65,26.73,26.13,26.24,63802700,26.09 -20-Aug-03,26.30,26.53,26.00,26.45,56739300,26.30 -19-Aug-03,25.85,26.65,25.77,26.62,72952896,26.47 -18-Aug-03,25.56,25.83,25.46,25.70,45817400,25.56 -15-Aug-03,25.61,25.66,25.43,25.54,27607900,25.40 -14-Aug-03,25.66,25.71,25.52,25.63,37338300,25.49 -13-Aug-03,25.79,25.89,25.50,25.60,39636900,25.46 -12-Aug-03,25.71,25.77,25.45,25.73,38208400,25.59 -11-Aug-03,25.61,25.99,25.54,25.61,36433900,25.47 -8-Aug-03,25.88,25.98,25.50,25.58,33241400,25.44 -7-Aug-03,25.72,25.81,25.45,25.71,44258500,25.57 -6-Aug-03,25.54,26.19,25.43,25.65,56294900,25.51 -5-Aug-03,26.31,26.54,25.60,25.66,58825800,25.52 -4-Aug-03,26.15,26.41,25.75,26.18,51825600,26.03 -1-Aug-03,26.33,26.51,26.12,26.17,42649700,26.02 -31-Jul-03,26.60,26.99,26.31,26.41,64504800,26.26 -30-Jul-03,26.46,26.57,26.17,26.23,41240300,26.08 -29-Jul-03,26.88,26.90,26.24,26.47,62391100,26.32 -28-Jul-03,26.94,27.00,26.49,26.61,52658300,26.46 -25-Jul-03,26.28,26.95,26.07,26.89,54173000,26.74 -24-Jul-03,26.78,26.92,25.98,26.00,53556600,25.85 -23-Jul-03,26.42,26.65,26.14,26.45,49828200,26.30 -22-Jul-03,26.28,26.56,26.13,26.38,51791000,26.23 -21-Jul-03,26.87,26.91,26.00,26.04,48480800,25.89 -18-Jul-03,27.11,27.23,26.75,26.89,63388400,26.74 -17-Jul-03,27.14,27.27,26.54,26.69,72805000,26.54 -16-Jul-03,27.56,27.62,27.20,27.52,49838900,27.37 -15-Jul-03,27.47,27.53,27.10,27.27,53567600,27.12 -14-Jul-03,27.63,27.81,27.05,27.40,60464400,27.25 -11-Jul-03,26.95,27.45,26.89,27.31,50377300,27.16 -10-Jul-03,27.25,27.42,26.59,26.91,55350800,26.76 -9-Jul-03,27.56,27.70,27.25,27.47,62300700,27.32 -8-Jul-03,27.26,27.80,27.25,27.70,61896800,27.55 -7-Jul-03,27.02,27.55,26.95,27.42,88960800,27.27 -3-Jul-03,26.69,26.95,26.41,26.50,39440900,26.35 -2-Jul-03,26.50,26.93,26.45,26.88,94069296,26.73 -1-Jul-03,25.59,26.20,25.39,26.15,60926000,26.00 -30-Jun-03,25.94,26.12,25.50,25.64,48073100,25.50 -27-Jun-03,25.95,26.34,25.53,25.63,76040304,25.49 -26-Jun-03,25.39,26.51,25.21,25.75,51758100,25.61 -25-Jun-03,25.64,25.99,25.14,25.26,60483500,25.12 -24-Jun-03,25.65,26.04,25.52,25.70,51820300,25.56 -23-Jun-03,26.14,26.24,25.49,25.78,52584500,25.64 -20-Jun-03,26.34,26.38,26.01,26.33,86048896,26.18 -19-Jun-03,26.09,26.39,26.01,26.07,63626900,25.92 \ No newline at end of file diff -Nru matplotlib-0.99.3/examples/data/msft_nasdaq_d.csv matplotlib-1.0.1/examples/data/msft_nasdaq_d.csv --- matplotlib-0.99.3/examples/data/msft_nasdaq_d.csv 2009-07-31 15:14:50.000000000 +0000 +++ matplotlib-1.0.1/examples/data/msft_nasdaq_d.csv 1970-01-01 00:00:00.000000000 +0000 @@ -1,2000 +0,0 @@ -"20040406093000",-1,-1,-1,25.951,0 -"20040405093000",25.8,25.98,25.73,25.951,53803929 -"20040402093000",25.47,25.9,25.44,25.85,98051438 -"20040401093000",24.95,25.11,24.85,25.08,69070246 -"20040331093000",25.19,25.2,24.8699,24.93,70546891 -"20040330093000",25.19,25.33,25.03,25.2,59015157 -"20040329093000",25.24,25.4,25,25.31,51888701 -"20040326093000",25.11,25.51,25,25.03,61593457 -"20040325093000",24.6,25.24,24.58,25.19,85689639 -"20040324093000",24.36,24.58,24.18,24.41,97589357 -"20040323093000",24.63,24.66,24.11,24.15,91728989 -"20040322093000",24.53,24.84,24.01,24.5,127820324 -"20040319093000",24.84,24.94,24.56,24.63,86679709 -"20040318093000",25.03,25.03,24.58,24.89,123243243 -"20040317093000",25.25,25.46,25.11,25.13,56265756 -"20040316093000",25.27,25.37,25.0999,25.18,65454169 -"20040315093000",25.33,25.43,25.06,25.16,68841599 -"20040312093000",25.38,25.51,25.23,25.38,64143859 -"20040311093000",25.2,25.78,25.07,25.09,90594370 -"20040310093000",25.66,25.8,25.35,25.37,75170933 -"20040309093000",25.8,25.97,25.54,25.73,81131386 -"20040308093000",26.31,26.35,25.81,25.83,69399003 -"20040305093000",26.23,26.6,26.2,26.35,59852306 -"20040304093000",26.37,26.42,26.21,26.37,44030373 -"20040303093000",26.35,26.55,26.22,26.37,55002830 -"20040302093000",26.63,26.69,26.35,26.37,66346629 -"20040301093000",26.65,26.72,26.5,26.7,52154834 -"20040227093000",26.48,26.62,26.35,26.53,58282185 -"20040226093000",26.63,26.65,26.41,26.5,66605896 -"20040225093000",26.89,26.99,26.61,26.7,64495129 -"20040224093000",26.6,26.95,26.55,26.88,55437308 -"20040223093000",26.75,26.76,26.4799,26.61,50274762 -"20040220093000",26.65,26.795,26.5,26.57,57835228 -"20040219093000",26.9,26.98,26.43,26.46,62151119 -"20040218093000",26.92,27.11,26.74,26.77,50342324 -"20040217093000",26.7,27.1,26.59,26.99,43486350 -"20040213093000",26.98,27.06,26.5,26.59,67550717 -"20040212093000",27.09,27.15,26.93,26.95,44792237 -"20040211093000",26.95,27.23,26.85,27.15,51515284 -"20040210093000",26.86,27.15,26.82,27.02,37843404 -"20040209093000",27.18,27.229,26.85,26.9,48110933 -"20040206093000",27,27.19,26.93,27.08,47216232 -"20040205093000",27.06,27.17,26.83,26.96,55565357 -"20040204093000",27.15,27.43,27.01,27.01,60938651 -"20040203093000",27.42,27.55,27.18,27.29,48206749 -"20040202093000",27.63,27.8,27.24,27.4,63305411 -"20040130093000",27.85,27.9,27.55,27.65,40531805 -"20040129093000",27.78,27.95,27.57,27.91,63750367 -"20040128093000",28.28,28.44,27.47,27.71,71251148 -"20040127093000",28.6,28.72,28.22,28.25,63227109 -"20040126093000",28.49,28.83,28.32,28.8,58316839 -"20040123093000",28.27,28.76,28.22,28.48,127268328 -"20040122093000",28.37,28.44,27.94,28.01,79830106 -"20040121093000",28.13,28.3,27.85,28.3,53641475 -"20040120093000",27.99,28.2,27.93,28.1,63096877 -"20040116093000",27.74,27.88,27.53,27.81,64008119 -"20040115093000",27.55,27.72,27.42,27.54,58526359 -"20040114093000",27.51,27.73,27.47,27.7,43940830 -"20040113093000",27.54,27.64,27.26,27.43,51558311 -"20040112093000",27.67,27.73,27.35,27.57,55860375 -"20040109093000",28.03,28.061,27.59,27.66,67144616 -"20040108093000",28.39,28.48,28,28.16,58818964 -"20040107093000",28.17,28.31,28.01,28.21,54330541 -"20040106093000",28.19,28.28,28.07,28.24,46958281 -"20040105093000",27.73,28.18,27.72,28.14,67341841 -"20040102093000",27.58,27.77,27.33,27.45,44487643 -"20031231093000",27.42,27.55,27.23,27.37,42251891 -"20031230093000",27.41,27.55,27.4,27.52,34407446 -"20031229093000",27.21,27.53,27.16,27.46,40436735 -"20031226093000",27.05,27.25,27,27.21,12076814 -"20031224093000",27.14,27.16,27,27.04,19924190 -"20031223093000",27.17,27.34,27.01,27.15,39615407 -"20031222093000",27.16,27.43,26.97,27.18,43931366 -"20031219093000",27.49,27.55,27.19,27.36,76923606 -"20031218093000",27.1,27.45,27.05,27.4,61190617 -"20031217093000",27.04,27.08,26.85,27.04,53753584 -"20031216093000",26.83,27.16,26.77,27.06,73984242 -"20031215093000",27.05,27.1,26.68,26.74,88870946 -"20031212093000",26.69,26.81,26.5,26.65,69212563 -"20031211093000",26.59,26.77,26.28,26.61,79332407 -"20031210093000",26.45,26.63,26.38,26.59,82868113 -"20031209093000",26.44,26.61,26.25,26.38,103563951 -"20031208093000",26.12,26.34,25.81,26.24,90611833 -"20031205093000",25.96,26.48,25.919,25.98,96622995 -"20031204093000",25.72,26.23,25.66,26.2,87238064 -"20031203093000",25.82,26.07,25.62,25.67,93121525 -"20031202093000",25.95,26.09,25.61,25.66,85121710 -"20031201093000",25.9,26.21,25.5,25.84,102442206 -"20031128093000",25.5,25.75,25.4,25.71,33404276 -"20031126093000",25.61,25.63,25.32,25.45,69767066 -"20031125093000",25.87,25.95,25.38,25.4,85997502 -"20031124093000",25.33,25.81,25.28,25.73,100276357 -"20031121093000",25.33,25.38,25.08,25.11,70823445 -"20031120093000",25.17,25.631,25.08,25.1,107168833 -"20031119093000",25.29,25.54,25.17,25.35,78862796 -"20031118093000",25.33,25.84,25.12,25.15,110110627 -"20031117093000",25.39,25.44,24.95,25.15,103808559 -"20031114093000",25.7,26.02,25.44,25.5,83171113 -"20031113093000",25.86,25.93,25.45,25.69,79154370 -"20031112093000",25.85,26.14,25.6,25.98,76231280 -"20031111093000",26.01,26.076,25.67,25.8,64999504 -"20031110093000",26.12,26.23,26,26.001,54596151 -"20031107093000",26.38,26.49,26.03,26.1,57862061 -"20031106093000",26.26,26.3,26,26.23,68225794 -"20031105093000",26.15,26.32,26,26.1,61569647 -"20031104093000",26.59,26.62,26.01,26.07,84035771 -"20031103093000",26.35,26.75,26.29,26.68,57790227 -"20031031093000",26.37,26.44,26.11,26.14,69659088 -"20031030093000",27.01,27.04,25.91,26.12,99139273 -"20031029093000",27.16,27.25,26.66,26.74,73595062 -"20031028093000",27.09,27.22,26.88,27.2,72144561 -"20031027093000",26.91,27.1,26.82,26.91,65641718 -"20031024093000",27.27,27.4,26.42,26.61,210918193 -"20031023093000",28.72,29.08,28.7,28.91,69346691 -"20031022093000",29.03,29.21,28.8,28.89,48852064 -"20031021093000",29.35,29.43,29.17,29.353,44176165 -"20031020093000",28.95,29.37,28.8,29.35,38831483 -"20031017093000",29.28,29.29,28.8,28.93,51135991 -"20031016093000",28.91,29.31,28.8,29.23,42270253 -"20031015093000",29.2,29.26,28.7,29.07,58358102 -"20031014093000",28.66,28.77,28.48,28.68,35191311 -"20031013093000",28.98,29.1,28.5,28.78,39342697 -"20031010093000",28.91,29.2,28.67,28.91,37611609 -"20031009093000",29.22,29.3496,28.8,28.94,62736808 -"20031008093000",29.36,29.36,28.68,28.82,47001129 -"20031007093000",29.01,29.372,28.92,29.14,52374444 -"20031006093000",29.15,29.3,28.91,29.19,34057031 -"20031003093000",29.16,29.46,28.93,29.08,57309125 -"20031002093000",28.45,28.75,28.19,28.5,38393640 -"20031001093000",28.03,28.63,27.81,28.52,59194078 -"20030930093000",28.59,28.61,27.75,27.8,63403292 -"20030929093000",28.41,28.91,28.1,28.83,47384602 -"20030926093000",28.27,28.78,28.14,28.19,49867950 -"20030925093000",28.47,28.9597,28.22,28.24,56263206 -"20030924093000",29.61,29.7,28.419,28.46,66476631 -"20030923093000",29.12,29.71,28.88,29.6,58359896 -"20030922093000",29.39,30,28.81,29.07,65714021 -"20030919093000",29.76,29.97,29.52,29.96,92380218 -"20030918093000",28.49,29.51,28.42,29.5,67278172 -"20030917093000",28.76,28.95,28.47,28.5,47232034 -"20030916093000",28.41,28.95,28.32,28.9,52369785 -"20030915093000",28.37,28.61,28.33,28.36,41446549 -"20030912093000",27.48,28.4,26.7,28.34,55787533 -"20030911093000",27.66,28.11,27.59,27.84,37958093 -"20030910093000",28.03,28.18,27.48,27.55,54770213 -"20030909093000",28.645,28.71,28.314,28.37,44455559 -"20030908093000",28.39,28.92,28.34,28.84,46161767 -"20030905093000",28.23,28.75,28.17,28.38,64049179 -"20030904093000",28.1,28.47,27.99,28.43,60199009 -"20030903093000",27.42,28.4,27.38,28.3,109502844 -"20030902093000",26.7,27.3,26.47,27.26,74314623 -"20030829093000",26.46,26.551,26.35,26.52,34776119 -"20030828093000",26.5,26.58,26.24,26.51,46220735 -"20030827093000",26.51,26.58,26.3,26.42,30638514 -"20030826093000",26.31,26.67,25.96,26.57,47557325 -"20030825093000",26.31,26.54,26.23,26.5,36157255 -"20030822093000",26.78,26.95,26.21,26.22,65864451 -"20030821093000",26.65,26.73,26.13,26.24,63920667 -"20030820093000",26.3,26.53,26,26.45,56805847 -"20030819093000",25.85,26.65,25.77,26.62,73001390 -"20030818093000",25.56,25.83,25.46,25.7,45970005 -"20030815093000",25.61,25.66,25.43,25.54,27613331 -"20030814093000",25.66,25.71,25.52,25.63,37416724 -"20030813093000",25.79,25.89,25.5,25.6,39689032 -"20030812093000",25.71,25.77,25.45,25.73,38219342 -"20030811093000",25.61,25.99,25.54,25.61,36438082 -"20030808093000",25.88,25.98,25.5,25.58,33329526 -"20030807093000",25.72,25.81,25.45,25.71,44295184 -"20030806093000",25.54,26.19,25.43,25.65,56301022 -"20030805093000",26.31,26.54,25.6,25.66,58918339 -"20030804093000",26.15,26.41,25.75,26.18,51837768 -"20030801093000",26.33,26.51,26.12,26.17,43200258 -"20030731093000",26.6,26.99,26.31,26.41,64532271 -"20030730093000",26.46,26.57,26.17,26.23,41252147 -"20030729093000",26.88,26.9,26.24,26.47,62427090 -"20030728093000",26.94,27,26.49,26.61,52711820 -"20030725093000",26.28,26.95,26.07,26.89,54185086 -"20030724093000",26.78,26.92,25.98,26,53573421 -"20030723093000",26.42,26.65,26.14,26.45,49831938 -"20030722093000",26.28,26.56,26.1311,26.38,51802602 -"20030721093000",26.87,26.91,26,26.04,49061777 -"20030718093000",27.11,27.23,26.75,26.89,63403704 -"20030717093000",27.14,27.27,26.54,26.69,73663317 -"20030716093000",27.56,27.62,27.2,27.52,50506829 -"20030715093000",27.47,27.53,27.1,27.27,53649884 -"20030714093000",27.63,27.81,27.05,27.4,60470938 -"20030711093000",26.95,27.45,26.89,27.309,50386814 -"20030710093000",27.25,27.45,26.59,26.91,55496602 -"20030709093000",27.56,27.7,27.248,27.47,62413894 -"20030708093000",27.26,27.8,27.249,27.7,61963586 -"20030707093000",27.02,27.551,26.95,27.42,89248289 -"20030703093000",26.7,26.95,26.41,26.45,39441210 -"20030702093000",26.5,26.93,26.45,26.88,95165555 -"20030701093000",25.59,26.201,25.39,26.15,61030761 -"20030630093000",25.94,26.12,25.5,25.64,53109054 -"20030627093000",25.95,26.34,25.53,25.63,76061812 -"20030626093000",25.39,26.51,25.21,25.75,51735860 -"20030625093000",25.64,25.987,25.139,25.26,60580527 -"20030624093000",25.65,26.04,25.52,25.7,51939104 -"20030623093000",26.14,26.24,25.49,25.78,53001295 -"20030620093000",26.344,26.38,26.01,26.33,86918549 -"20030619093000",26.09,26.39,26.01,26.07,63712208 -"20030618093000",25.98,26.43,25.71,26.07,89966720 -"20030617093000",25.64,26.14,25.53,25.959,122234258 -"20030616093000",24.8,25.42,24.669,25.39,70139491 -"20030613093000",25.2,25.25,24.49,24.65,55157665 -"20030612093000",24.97,25.14,24.74,24.99,66204796 -"20030611093000",24.669,24.96,24.422,24.88,75791784 -"20030610093000",23.94,24.75,23.85,24.68,80734302 -"20030609093000",23.72,23.982,23.5999,23.75,73629370 -"20030606093000",24.44,24.56,23.65,23.67,121172563 -"20030605093000",24.47,24.52,24.009,24.09,116136863 -"20030604093000",24.99,25.22,24.74,24.87,83566075 -"20030603093000",24.75,24.92,24.57,24.88,61069552 -"20030602093000",24.98,25.03,24.57,24.639,66328680 -"20030530093000",24.73,24.91,24.51,24.61,85397900 -"20030529093000",24.47,24.67,24.23,24.4,75491901 -"20030528093000",24.78,24.871,24.3,24.41,91524308 -"20030527093000",24.25,24.89,24.219,24.79,68514305 -"20030523093000",24.2,24.54,24.03,24.22,77053076 -"20030522093000",24.2,24.27,24.04,24.16,93413313 -"20030521093000",24.63,24.71,23.89,24.03,109343442 -"20030520093000",24.86,25,24.5,24.63,52775368 -"20030519093000",25.4,25.54,24.74,24.8,55447137 -"20030516093000",25.88,26.05,25.41,25.57,60488391 -"20030515093000",25.85,26.01,25.57,25.79,45696020 -"20030514093000",26.08,26.18,25.546,25.63,45131526 -"20030513093000",26.04,26.2,25.89,25.99,44620696 -"20030512093000",26.15,26.47,26.06,26.21,54013255 -"20030509093000",25.9,26.5,25.89,26.35,59018279 -"20030508093000",25.75,26.148,25.71,25.75,46541276 -"20030507093000",26.11,26.35,25.84,25.99,49234538 -"20030506093000",25.86,26.501,25.82,26.38,54468151 -"20030505093000",26.25,26.39,25.84,25.86,50537557 -"20030502093000",25.65,26.29,25.57,26.13,52815510 -"20030501093000",25.54,25.95,25.34,25.71,42214792 -"20030430093000",25.73,25.88,25.25,25.56,55690962 -"20030429093000",25.95,26.25,25.68,25.809,66022742 -"20030428093000",25.39,25.94,25.32,25.74,56393943 -"20030425093000",25.33,25.644,25.17,25.21,53778322 -"20030424093000",25.48,25.72,25.32,25.49,51884817 -"20030423093000",25.75,25.99,25.47,25.72,55821379 -"20030422093000",25.06,25.8,25.03,25.74,58986853 -"20030421093000",25.61,25.61,25.08,25.21,41678747 -"20030417093000",24.77,25.54,24.74,25.5,58519227 -"20030416093000",25.6,25.74,24.6,24.91,86373961 -"20030415093000",24.68,24.79,24.1,24.61,64340820 -"20030414093000",24.27,24.88,24,24.75,51950191 -"20030411093000",24.89,25.18,23.95,24.2,71742754 -"20030410093000",24.719,24.79,24.28,24.59,51638640 -"20030409093000",25.61,25.67,24.54,24.57,76927109 -"20030408093000",25.31,25.835,25.2,25.58,54145573 -"20030407093000",26.23,26.43,25.17,25.171,65658301 -"20030404093000",25.76,25.8,24.93,25.09,55755448 -"20030403093000",25.99,26.09,25.6,25.73,57710342 -"20030402093000",25.1,26,25.1,25.72,68328205 -"20030401093000",24.46,24.7,24.25,24.35,49803234 -"20030331093000",24.25,24.71,24.01,24.21,71461181 -"20030328093000",24.67,25.1,24.6,24.67,39582173 -"20030327093000",24.94,25.26,24.599,25.04,60045257 -"20030326093000",25.46,25.62,25.24,25.25,51687898 -"20030325093000",25.6,25.751,25.03,25.49,63608930 -"20030324093000",25.55,25.935,25.1899,25.29,61250394 -"20030321093000",26.79,26.9,26.03,26.57,85826301 -"20030320093000",26.02,26.52,25.67,26.25,72006425 -"20030319093000",25.98,26.43,25.74,26.32,73828591 -"20030318093000",25.89,26.04,25.5,26.04,78377645 -"20030317093000",24.52,25.95,24.33,25.93,101197122 -"20030314093000",24.68,24.961,24.26,24.86,75701349 -"20030313093000",23.72,24.74,23.44,24.67,81041416 -"20030312093000",22.818,23.44,22.55,23.39,72568874 -"20030311093000",23.06,23.2679,22.76,22.79,54268389 -"20030310093000",23.31,23.46,22.89,22.95,48721361 -"20030307093000",22.95,23.79,22.9,23.56,66167680 -"20030306093000",23.17,23.5,23.13,23.27,51553414 -"20030305093000",23.07,23.55,23.05,23.44,55631397 -"20030304093000",23.58,23.66,23.06,23.07,56803900 -"20030303093000",24.02,24.12,23.4068,23.54,50841129 -"20030228093000",23.74,24.07,23.559,23.7,56737928 -"20030227093000",23.9,24.21,23.3,23.58,75639266 -"20030226093000",24.079,24.47,23.58,23.6,57314562 -"20030225093000",23.54,24.27,23.38,24.19,68473109 -"20030224093000",24.44,24.5,23.84,24.07,62548553 -"20030221093000",24.29,24.8,23.7,24.61,57081029 -"20030220093000",24.77,24.87,24.1,24.15,51027895 -"20030219093000",24.82,24.88,24.17,24.53,47130583 -"20030218093000",24.62,24.99,24.4,24.96,57543713 -"20030214093000",23.625,24.25,23.385,24.15,90770856 -"20030213093000",23.205,23.56,23.0655,23.495,73839528 -"20030212093000",23.275,23.55,23.134,23.22,71576300 -"20030211093000",23.65,23.835,23,23.22,84596680 -"20030210093000",23.4,23.76,23.27,23.69,74333418 -"20030207093000",23.94,23.975,23.205,23.29,75852114 -"20030206093000",23.43,23.81,23.28,23.71,83617960 -"20030205093000",23.915,24.265,23.33,23.48,101376734 -"20030204093000",23.9,23.97,23.44,23.66,82124484 -"20030203093000",23.965,24.55,23.73,24.28,80820526 -"20030131093000",23.725,24.177,23.515,23.73,107182966 -"20030130093000",25.08,25.085,24.095,24.12,88387876 -"20030129093000",24.365,25.0245,23.965,24.955,107226456 -"20030128093000",24.845,24.85,24.2805,24.41,86413978 -"20030127093000",24.66,25.3,24.205,24.585,115186478 -"20030124093000",26.015,26.025,24.8505,24.925,103436814 -"20030123093000",25.975,26.27,25.73,26.14,71629620 -"20030122093000",25.795,26.2,25.455,25.5,87486264 -"20030121093000",25.935,26.075,25.645,25.665,86413486 -"20030117093000",26.47,26.5,25.655,25.73,156119200 -"20030116093000",28.16,28.325,27.555,27.675,83405140 -"20030115093000",28.5,28.66,28.095,28.135,59999384 -"20030114093000",28.16,28.5,28.095,28.485,54441838 -"20030113093000",28.2625,28.375,27.889,28.195,61040604 -"20030110093000",27.55,28.15,27.45,27.96,67985474 -"20030109093000",27.36,27.96,27.265,27.905,62048642 -"20030108093000",27.685,27.775,27.055,27.12,64749146 -"20030107093000",27.46,28.005,27.34,27.9,81113928 -"20030106093000",27.01,27.615,26.9,27.385,59691684 -"20030103093000",26.795,26.9,26.44,26.895,55744224 -"20030102093000",26.15,26.875,25.855,26.86,67208216 -"20021231093000",26.37,26.495,25.63,25.85,58385956 -"20021230093000",26.505,26.62,26.135,26.375,48298450 -"20021227093000",26.64,27,26.45,26.485,41013688 -"20021226093000",27.015,27.345,26.585,26.695,37341460 -"20021224093000",26.7705,27.115,26.76,26.9105,18427844 -"20021223093000",26.525,27.14,26.45,27,48904018 -"20021220093000",26.745,26.86,26.475,26.52,98535408 -"20021219093000",26.625,27.375,26.44,26.555,82925616 -"20021218093000",26.92,27.2,26.395,26.765,62897932 -"20021217093000",27.21,27.495,26.89,27.18,49820892 -"20021216093000",26.5,27.275,26.335,27.24,60273208 -"20021213093000",26.84,26.875,26.245,26.25,65405618 -"20021212093000",27.5,27.53,26.845,27.085,55394146 -"20021211093000",26.925,27.5095,26.7915,27.33,69323784 -"20021210093000",26.78,27.24,26.74,27.005,63924442 -"20021209093000",27.5,27.61,26.755,26.765,64040988 -"20021206093000",27.435,27.87,27.11,27.735,71820280 -"20021205093000",28.475,28.545,27.65,27.67,69034046 -"20021204093000",28.065,28.72,27.91,28.27,84090988 -"20021203093000",28.6405,28.675,28.205,28.355,58650318 -"20021202093000",29.325,29.48,28.505,28.845,63904216 -"20021129093000",29.215,29.315,28.8,28.84,28466796 -"20021127093000",28.8,29.307,28.7,29.04,55334804 -"20021126093000",28.82,29.125,28.39,28.45,69180644 -"20021125093000",29.03,29.32,28.7855,29.115,61738074 -"20021122093000",28.725,29.15,28.525,29.11,70139728 -"20021121093000",28.49,29,28.39,28.92,83128144 -"20021120093000",27.505,28.45,27.465,28.31,76738650 -"20021119093000",27.775,27.9,27.155,27.415,76558560 -"20021118093000",28.475,28.5185,27.87,27.925,58236538 -"20021115093000",28.335,28.46,27.835,28.35,78480722 -"20021114093000",27.995,28.5,27.935,28.495,78519768 -"20021113093000",27.12,27.965,27.055,27.685,107992828 -"20021112093000",27.05,27.715,26.95,27.255,81898940 -"20021111093000",27.535,27.55,26.91,26.93,58479334 -"20021108093000",28,28.275,27.505,27.55,66088754 -"20021107093000",28.1,28.31,27.75,28.045,73840362 -"20021106093000",28.495,28.552,27.765,28.5,115817030 -"20021105093000",27.89,28.4,27.79,28.34,76831422 -"20021104093000",28.375,28.625,27.76,28.045,140207228 -"20021101093000",26.215,26.62,25.95,26.5,105682436 -"20021031093000",26.595,27.035,26.425,26.735,106194640 -"20021030093000",26.1,26.695,25.815,26.555,94625004 -"20021029093000",26.075,26.245,25.425,26.035,90809122 -"20021028093000",26.7,26.75,25.755,26,80081818 -"20021025093000",25.625,26.4,25.58,26.34,75604510 -"20021024093000",26.66,26.685,25.45,25.615,96088000 -"20021023093000",25.715,26.63,25.5,26.595,111183962 -"20021022093000",25.715,25.965,25.515,25.835,87367430 -"20021021093000",25.985,26.495,25.68,26.255,112638800 -"20021018093000",26.3,26.6,25.57,26.575,153310760 -"20021017093000",26.14,26.25,25.025,25.375,183771030 -"20021016093000",25.195,25.63,25.14,25.205,95686356 -"20021015093000",25.6325,26.185,25.325,26.145,133729336 -"20021014093000",24.125,24.665,23.92,24.65,76551010 -"20021011093000",23.68,24.45,23.505,24.435,109088928 -"20021010093000",22,23.31,21.625,23.19,118830614 -"20021009093000",22.1135,22.725,21.905,21.995,123626070 -"20021008093000",22.375,22.99,22.065,22.48,116046636 -"20021007093000",21.905,22.53,21.845,22.06,90274004 -"20021004093000",22.695,22.785,21.845,21.885,107475586 -"20021003093000",22.65,23.297,22.3,22.4,105567092 -"20021002093000",23.05,23.408,22.58,22.805,103758332 -"20021001093000",22.125,23.125,21.595,23.115,110976456 -"20020930093000",22.435,22.52,21.5585,21.845,115849066 -"20020927093000",23.02,23.55,22.595,22.625,81222772 -"20020926093000",23.555,23.75,22.975,23.105,101115546 -"20020925093000",23.2,23.483,22.525,23.255,107405112 -"20020924093000",22.415,23.24,22.315,22.82,103789188 -"20020923093000",23.3,23.355,22.405,22.62,90025730 -"20020920093000",23.855,24,23.65,23.74,130785394 -"20020919093000",23.34,23.91,23.295,23.5865,77905338 -"20020918093000",23.36,24.12,23.33,23.875,84261030 -"20020917093000",24.335,24.4535,23.605,23.645,73707242 -"20020916093000",23.8,24.065,23.525,23.89,50320084 -"20020913093000",23.45,24.13,23.425,23.955,59695926 -"20020912093000",24.075,24.15,23.51,23.595,63976426 -"20020911110000",25.14,25.55,24.265,24.28,78213394 -"20020910093000",24.27,24.91,24.175,24.895,84133970 -"20020909093000",23.625,24.475,23.315,24.345,81844806 -"20020906093000",23.875,24.1395,23.735,23.91,70303318 -"20020905093000",23.75,23.76,22.94,22.955,90939744 -"20020904093000",23.725,24.3,23.575,24.05,80445182 -"20020903093000",24.26,24.26,23.5,23.51,74629474 -"20020830093000",25.07,25.24,24.5,24.56,58547076 -"20020829093000",24.445,25.5,24.26,25.29,94530678 -"20020828093000",25.24,25.33,24.65,24.69,69290570 -"20020827093000",26.17,26.225,25.325,25.42,65639262 -"20020826093000",26.25,26.325,25.59,26.05,55826724 -"20020823093000",26.33,26.425,25.92,26.11,58197160 -"20020822093000",26.43,26.725,26.3,26.615,72736384 -"20020821093000",25.78,26.19,25.575,26.14,81397866 -"20020820093000",25.69,25.85,25.375,25.52,70827940 -"20020819093000",25.02,26.025,24.925,25.995,79959898 -"20020816093000",24.715,25.115,24.46,24.995,69480666 -"20020815093000",24.98,25.37,24.375,24.885,99017036 -"20020814093000",23.625,24.95,23.605,24.855,97624276 -"20020813093000",23.995,24.85,23.46,23.525,100507942 -"20020812093000",23.805,24.375,23.8,24.235,57071304 -"20020809093000",24.075,24.575,23.83,24.06,69319848 -"20020808093000",23.555,24.5025,23.205,24.455,89001030 -"20020807093000",23.5,23.65,22.58,23.545,86685090 -"20020806093000",22.45,23.625,22.375,22.83,88996052 -"20020805093000",22.145,22.585,21.905,21.995,79442490 -"20020802093000",22.755,22.925,21.9,22.205,86261194 -"20020801093000",23.79,24.045,22.75,22.875,92222218 -"20020731093000",23.805,24,23.18,23.975,94116780 -"20020730093000",23.775,24.415,23.665,24.05,122988458 -"20020729093000",23.425,24.15,23.275,24.125,112379358 -"20020726093000",21.87,22.705,21.84,22.675,124122814 -"20020725093000",22.725,22.8575,21.22,21.41,163940526 -"20020724093000",20.875,23.18,20.705,23.115,203412788 -"20020723093000",23.155,23.4025,21.48495,21.50495,168061600 -"20020722093000",24.475,24.995,22.95,23.145,180678824 -"20020719093000",24.935,25.445,24.406,24.78,112572000 -"20020718093000",26.03,26.37,25.33,25.555,91493800 -"20020717093000",26.26,26.65,25.585,26,98062200 -"20020716093000",25.655,26.4,25.32,25.625,97267000 -"20020715093000",25.695,25.93,24,25.89,136966600 -"20020712093000",26.685,26.865,25.74,25.93,95786200 -"20020711093000",26.02,26.5375,25.625,26.45,129628600 -"20020710093000",26.845,27.1,26.065,26.12,90686600 -"20020709093000",26.655,27.365,26.485,26.605,85286800 -"20020708093000",27.205,27.465,26.2945,26.46,63216000 -"20020705093000",26.545,27.45,26.525,27.45,35673600 -"20020703093000",25.62,26.26,25.225,26.225,80959600 -"20020702093000",26.19,26.46,25.665,25.72,82822800 -"20020701093000",27.06,27.195,26.29,26.34,66654000 -"20020628093000",27.275,27.895,27,27.06,90210000 -"20020627093000",27.3015,27.47,26.43,27.46,95816400 -"20020626093000",25.52995,27.195,25.525,27.065,112187000 -"20020625093000",27.35,27.5,26.4,26.475,84059000 -"20020624093000",26.045,27.32,25.925,27.08,104562000 -"20020621093000",26.7,27.275,26.14,26.14,116844800 -"20020620093000",27.185,27.55,26.95,27.05,86432600 -"20020619093000",27.735,27.971,27.16,27.18,81679000 -"20020618093000",27.765,28.145,27.675,27.995,77931800 -"20020617093000",27.83,28.22,27.685,27.84,94580400 -"20020614093000",26.575,27.775,26.5,27.625,109433600 -"20020613093000",27.42,27.74,27.1,27.11,79931000 -"20020612093000",26.29,27.89,26.25,27.77,136476800 -"20020611093000",26.62,27.09,26.21,26.285,74375000 -"20020610093000",25.825,26.65,25.73,26.41,71838800 -"20020607093000",24.945,26.3,24.93,25.99,97839800 -"20020606093000",25.75,26.07,25,25.925,78987400 -"20020605093000",25.215,25.875,25.165,25.83,66978600 -"20020604093000",24.75,25.615,24.62,24.99,88057200 -"20020603093000",25.495,25.82,24.585,24.685,88448600 -"20020531093000",26.45,26.71,25.44,25.505,66475000 -"20020530093000",25.82,26.68,25.715,26.32,63522600 -"20020529093000",25.825,26.36,25.775,26.025,45399800 -"20020528093000",26.795,26.845,25.875,26.16,49602400 -"20020524093000",27.07,27.26,26.52,26.63,36015600 -"20020523093000",26.85,27.42,26.505,27.41,51433800 -"20020522093000",25.935,26.86,25.925,26.835,54170800 -"20020521093000",26.975,27.3,26.065,26.095,63128200 -"20020520093000",27.75,27.775,26.75,27.005,52121800 -"20020517093000",28.105,28.2,27.635,28.015,54647000 -"20020516093000",27.355,28.02,27.325,27.87,53417600 -"20020515093000",27.245,28.22,26.93,27.375,70460400 -"20020514093000",27.2,27.55,26.9935,27.495,64877000 -"20020513093000",25.225,26.455,24.875,26.345,64821800 -"20020510093000",26.265,26.338,24.998,25.025,64522400 -"20020509093000",27.2,27.5,25.95,26.06,83300000 -"20020508093000",25.635,27.485,25.61,27.485,101262000 -"20020507093000",24.59,25.145,24.1765,24.735,88535000 -"20020506093000",24.72,25.27,24.185,24.31,66315400 -"20020503093000",25.63,25.84,24.755,24.78,71649600 -"20020502093000",26.32,27.035,25.575,25.605,79011600 -"20020501093000",26.08,26.595,25.33,26.375,76423200 -"20020430093000",26.05,26.65,25.96,26.13,77394000 -"20020429093000",25.735,26.455,25.72,26.12,70330400 -"20020426093000",27.035,27.225,25.73,25.75,62785400 -"20020425093000",26.45,27.225,26.4445,26.865,57293200 -"20020424093000",26.925,27.215,26.5,26.51,61235200 -"20020423093000",27.85,27.91,26.65,26.995,68472600 -"20020422093000",28.26,28.35,27.5,27.795,51480000 -"20020419093000",28.72,28.99,28.43,28.6,104631800 -"20020418093000",28.395,28.655,27.92,28.185,77057200 -"20020417093000",28.975,29.14,28.21,28.315,55162800 -"20020416093000",28.2,29.05,28.18,28.905,52041000 -"20020415093000",28,28.385,27.7,27.845,47393800 -"20020412093000",27.575,28.13,27.43,27.965,52297600 -"20020411093000",27.945,28.225,27.25,27.395,58171000 -"20020410093000",27.56,28.555,27.53,28.15,75637800 -"20020409093000",28.665,28.7155,27.4,27.435,63424200 -"20020408093000",27.15,28.656,27.13,28.61,73392000 -"20020405093000",28.445,28.65,27.92,27.935,50176200 -"20020404093000",27.99,28.485,27.714,28.225,61769400 -"20020403093000",28.7225,28.805,27.75,28.165,76969000 -"20020402093000",29.45,29.5495,28.555,28.725,77037800 -"20020401093000",29.915,30.2,29.6,30.19,47010200 -"20020328093000",29.975,30.325,29.83,30.155,44393000 -"20020327093000",29.4,29.94,29.295,29.72,47322200 -"20020326093000",29.55,30.46,29.155,29.54,69403400 -"20020325093000",30.24,30.39,29.575,29.615,47942400 -"20020322093000",30.525,30.57,30.11,30.215,41341400 -"20020321093000",30.105,30.7995,29.915,30.68,46169600 -"20020320093000",30.7,31.01,30.05,30.05,55508600 -"20020319093000",31.09,31.5,30.75,31.115,36376400 -"20020318093000",31.37,31.495,30.6,31.07,44854600 -"20020315093000",30.5,31.255,30.485,31.245,69094000 -"20020314093000",31.07,31.12,30.525,30.61,51828400 -"20020313093000",31.04,31.51,30.975,31.05,44388000 -"20020312093000",31.26,31.4,30.835,31.27,66417800 -"20020311093000",31.755,32.5,31.5,32.17,43718200 -"20020308093000",31.815,32.35,31.585,31.975,57703800 -"20020307093000",31.835,31.9445,30.93,31.36,58081000 -"20020306093000",31.455,31.85,31.095,31.815,50160800 -"20020305093000",31.5,31.94,31.17,31.54,55926800 -"20020304093000",30.62,31.75,30.4395,31.595,74464400 -"20020301093000",29.525,30.71,29.425,30.685,62457600 -"20020228093000",29.39,29.85,29.07,29.17,68067000 -"20020227093000",29.5375,30.075,28.9995,29.195,65755400 -"20020226093000",29.551,30,28.95,29.275,63279000 -"20020225093000",28.97,29.945,28.945,29.54,51832400 -"20020222093000",29.025,29.3755,28.575,28.995,71348200 -"20020221093000",29.86,30.135,29.005,29.025,59449400 -"20020220093000",29.7,30.18,29.4,29.95,50498200 -"20020219093000",29.955,30.07,29.3045,29.415,52265200 -"20020215093000",30.85,31.03,30.1,30.115,50184400 -"20020214093000",31,31.495,30.66,30.8,57267600 -"20020213093000",30.13,30.94,29.975,30.875,54175200 -"20020212093000",30.245,30.425,30.01,30.07,44975200 -"20020211093000",30.005,30.62,29.795,30.565,50900400 -"20020208093000",30.06,30.33,29.415,30.325,61285200 -"20020207093000",30.15,30.805,29.875,29.9,63327800 -"20020206093000",30.805,30.945,30.125,30.225,66126200 -"20020205093000",30.4,31.115,30.25,30.575,66772800 -"20020204093000",31.2,31.345,30.375,30.56,70310400 -"20020201093000",32.075,32.2505,31.235,31.33,63462800 -"20020131093000",31.53,31.905,31.06,31.855,69572800 -"20020130093000",31.225,31.45,30.665,31.425,66104200 -"20020129093000",31.95,32.25,30.995,31.16,58669400 -"20020128093000",32.115,32.2,31.455,31.91,41623400 -"20020125093000",32.095,32.425,31.755,31.9,48981600 -"20020124093000",32.05,32.59,31.9,32.33,83959400 -"20020123093000",32.025,32.355,31.62,31.87,80408600 -"20020122093000",33.305,33.315,32.125,32.275,76840800 -"20020118093000",33.55,33.925,32.71,33.05,107271600 -"20020117093000",34.265,35.0005,34.2,34.93,80371200 -"20020116093000",34.425,34.92,33.925,33.935,61959000 -"20020115093000",34.33,34.81,34.25,34.775,60720200 -"20020114093000",34.15,34.52,33.87,34.235,50999800 -"20020111093000",34.76,35.16,34.05,34.305,72994600 -"20020110093000",34.24,34.9,34.065,34.64,50329000 -"20020109093000",34.86,35.31,34.235,34.345,76309000 -"20020108093000",34.345,34.93,34,34.685,47736600 -"20020107093000",34.875,35.01,34.175,34.28,58508800 -"20020104093000",34.625,34.955,34.335,34.45,52733600 -"20020103093000",33.555,34.625,33.545,34.615,67692400 -"20020102093000",33.325,33.555,32.755,33.52,48124800 -"20011231093000",33.92,34.24,33.125,33.135,43058200 -"20011228093000",34.115,34.425,33.85,33.925,28789000 -"20011227093000",33.99,34.355,33.63,33.925,32429000 -"20011226093000",33.71,34.535,33.695,33.84,29331800 -"20011224093000",33.86,34.015,33.6,33.625,11701600 -"20011221093000",34.005,34.365,33.5,33.77,84324600 -"20011220093000",34.575,34.7,33.313,33.38,78593000 -"20011219093000",34.31,34.9455,34.225,34.745,56996200 -"20011218093000",34.46,34.7,34.3045,34.635,47261200 -"20011217093000",33.585,34.555,33.58,34.49,57080600 -"20011214093000",33.01,33.975,32.965,33.72,43003800 -"20011213093000",33.565,34.19,33.0395,33.135,53234000 -"20011212093000",33.58,33.99,33.125,33.975,47884200 -"20011211093000",33.83,34.0695,33.535,33.66,54334000 -"20011210093000",33.76,34.225,33.43,33.53,38367400 -"20011207093000",34.1,34.42,33.275,33.915,42332400 -"20011206093000",33.99,34.5,33.775,34.27,56033600 -"20011205093000",33.245,34.085,33.19,34.05,74251200 -"20011204093000",32.5,33.04,32.05,33,51012600 -"20011203093000",31.915,32.615,31.9,32.385,47213600 -"20011130093000",32.33,32.54,31.965,32.105,48238400 -"20011129093000",31.56,32.45,31.4795,32.42,54042600 -"20011128093000",31.585,32.06,31.365,31.4,54593600 -"20011127093000",32.395,32.5385,31.375,31.87,90811200 -"20011126093000",32.495,32.855,32.2,32.57,41992400 -"20011123093000",32.19,32.405,31.81,32.355,15767200 -"20011121093000",32.18,32.3,31.7445,32.015,50788200 -"20011120093000",33.225,33.9,32.515,32.7,65934800 -"20011119093000",33.125,33.485,32.8525,33.27,56007600 -"20011116093000",33.15,33.3095,32.475,32.875,59262600 -"20011115093000",33.05,33.525,32.725,33.06,77944400 -"20011114093000",34.115,34.17,32.895,32.975,88634600 -"20011113093000",33.4,33.975,33.3,33.91,60175400 -"20011112093000",32.35,33.22,31.825,32.895,57754800 -"20011109093000",32.17,32.825,31.955,32.605,48017200 -"20011108093000",32.23,33.03,31.83,32.21,74239800 -"20011107093000",32.11,32.525,32.015,32.125,58910200 -"20011106093000",31.35,32.47,31.08,32.39,68621000 -"20011105093000",30.93,32.015,30.875,31.635,66367400 -"20011102093000",30.965,31.5105,30.255,30.7,83368800 -"20011101093000",30.04,31.1295,29.8,30.92,109690400 -"20011031093000",29.65,30.365,29.05,29.075,64736400 -"20011030093000",29.46,29.7745,29.095,29.44,57395600 -"20011029093000",31.05,31.1,29.77,29.82,55139000 -"20011026093000",31.16,31.815,31.04,31.1,64514200 -"20011025093000",30.305,31.3,29.785,31.28,75324600 -"20011024093000",30.25,30.81,29.81,30.66,79166800 -"20011023093000",30.235,30.72,29.7,30.215,80328000 -"20011022093000",28.95,30.09,28.735,30.08,72327400 -"20011019093000",28.7,29.005,27.815,28.95,91231800 -"20011018093000",28.17,28.79,27.75,28.4,78524600 -"20011017093000",29.56,29.65,27.99,28.015,73730400 -"20011016093000",28.935,29.455,28.605,29.225,66221800 -"20011015093000",27.95,29.25,27.75,29.03,68458400 -"20011012093000",27.85,28.32,27.275,28.19,63370000 -"20011011093000",27.8835,28.42,27.2995,28.16,83783600 -"20011010093000",26.8,27.875,26.5,27.755,86370000 -"20011009093000",28.75,28.7855,27.095,27.28,99485000 -"20011008093000",28.4,29.325,28.37,29.025,60611600 -"20011005093000",28.08,29,27.47,28.87,80875200 -"20011004093000",28.46,29.2005,28.105,28.22,101782400 -"20011003093000",26.24,28.465,26.2,28.125,97478200 -"20011002093000",25.8195,26.775,25.78,26.5,80863200 -"20011001093000",25.47,26.25,25.205,25.875,70035800 -"20010928093000",24.81,25.795,24.49,25.585,116647800 -"20010927093000",25.05,25.34,24,24.97,81194200 -"20010926093000",25.755,25.9,24.775,25.135,58531200 -"20010925093000",26.135,26.5,25.08,25.65,84952800 -"20010924093000",25.325,26.225,24.935,26.005,85568800 -"20010921093000",23.96,25.3,23.75,24.855,184985200 -"20010920093000",26.175,26.305,25.335,25.38,118076400 -"20010919093000",27.23,27.56,25.3,26.935,126951600 -"20010918093000",26.705,27.5,26.585,27.16,83249800 -"20010917093000",27.01,27.55,26.4,26.455,128096200 -"20010910093000",27.46,28.975,27.35,28.79,84474800 -"20010907093000",28.055,28.68,27.6595,27.7,89888400 -"20010906093000",28.28,29.195,27.95,28.01,112447000 -"20010905093000",28.09,29.195,27.645,28.87,89476800 -"20010904093000",28.595,29.54,28.035,28.05,67189600 -"20010831093000",28.425,29.03,28.15,28.525,57977200 -"20010830093000",29.52,29.83,28.26,28.47,97685600 -"20010829093000",30.525,30.65,29.77,30.125,48173600 -"20010828093000",31.17,31.475,30.29,30.37,47425000 -"20010827093000",30.95,31.68,30.785,31.155,44563000 -"20010824093000",29.8,31.14,29.615,31.025,63407000 -"20010823093000",30.335,30.765,29.5,29.5,52023400 -"20010822093000",30.565,30.575,29.54,30.33,78144800 -"20010821093000",31.35,31.6,30.356,30.39,47120600 -"20010820093000",30.83,31.375,30.55,31.35,48372200 -"20010817093000",31.89,32.065,30.75,30.94,52236600 -"20010816093000",31.42,32.355,31.35,32.31,43917600 -"20010815093000",32.355,32.525,31.6,31.6,39505200 -"20010814093000",32.875,33.045,32.225,32.345,36481600 -"20010813093000",32.62,32.995,32.375,32.855,32675600 -"20010810093000",32.385,32.93,31.45,32.76,51757000 -"20010809093000",32.49,32.775,32.15,32.505,45537800 -"20010808093000",33.255,33.62,32.245,32.415,55004000 -"20010807093000",33.02,33.525,32.995,33.175,31349800 -"20010806093000",33.265,33.56,32.84,33.065,27833400 -"20010803093000",33.65,33.68,33,33.445,43260600 -"20010802093000",33.605,33.77,33.13,33.725,54199600 -"20010801093000",33.4,33.405,32.88,33.235,55679400 -"20010731093000",33.005,33.695,32.925,33.095,59033200 -"20010730093000",32.825,33.44,32.77,32.9,42196800 -"20010727093000",33.025,33.125,32.525,32.735,65405200 -"20010726093000",33.56,33.66,32.75,33.305,78047200 -"20010725093000",33.13,33.76,32.68,33.67,74105000 -"20010724093000",33.5,33.995,32.85,33.16,67543600 -"20010723093000",34.62,34.63,33.35,33.545,80002400 -"20010720093000",34.015,34.7,33.9,34.59,124210200 -"20010719093000",35.61,36.5,35.57,36.255,76871800 -"20010718093000",35.3,35.75,34.935,35.285,57598400 -"20010717093000",35.33,36.005,35.07,35.91,63252400 -"20010716093000",35.725,36.08,35.075,35.59,55990800 -"20010713093000",35.7,36,35.47,35.67,58938400 -"20010712093000",35.35,36.025,35.165,35.8,128125800 -"20010711093000",32.105,33.375,32.1,33.25,74713800 -"20010710093000",32.95,33.125,32.175,32.24,66567200 -"20010709093000",33.1,33.455,32.52,32.845,66479600 -"20010706093000",34.15,34.2,32.835,33.03,67565200 -"20010705093000",35.11,35.36,34.22,34.255,49268400 -"20010703093000",35.15,35.4,34.965,35.225,28038000 -"20010702093000",36.025,36.575,35.075,35.3,72820800 -"20010629093000",36.3,36.705,35.68,36.3,94465400 -"20010628093000",35.775,38.075,35.125,36.355,129054000 -"20010627093000",34.93,35.765,34.68,35.58,69205800 -"20010626093000",33.91,35.105,33.85,35.04,63077800 -"20010625093000",34.55,34.905,33.885,34.425,49218800 -"20010622093000",35,35.305,34.29,34.415,51092200 -"20010621093000",34.575,35.275,34.46,34.92,69612200 -"20010620093000",33.57,34.795,33.55,34.705,64111600 -"20010619093000",34.105,34.425,33.425,33.66,63469000 -"20010618093000",33.975,33.98,33.005,33.44,56889600 -"20010615093000",33.755,34.15,33.2,33.995,108492400 -"20010614093000",35.11,35.275,34.2,34.65,72040400 -"20010613093000",36.025,36.15,35.32,35.345,55335600 -"20010612093000",35.51,36.205,35.405,36.035,66716000 -"20010611093000",36.425,36.425,35.755,36.06,47347600 -"20010608093000",36.85,36.875,36.025,36.595,51867400 -"20010607093000",36.06,36.865,36.04,36.825,66981000 -"20010606093000",36.445,36.74,35.775,36.18,80052000 -"20010605093000",35.38,36.54,35.25,36.3,89456200 -"20010604093000",35.275,35.51,34.9,35.4,43758200 -"20010601093000",34.8,35.35,34.35,35.17,57588200 -"20010531093000",34.745,35.19,34.2,34.59,70687800 -"20010530093000",34.78,35.29,34.325,34.595,86463400 -"20010529093000",35.4,35.875,35.025,35.17,71212400 -"20010525093000",35.83,35.95,35.18,35.455,52757200 -"20010524093000",34.97,35.89,34.635,35.86,80789800 -"20010523093000",35.195,35.8,34.75,34.85,93664800 -"20010522093000",34.725,35.175,34.57,35.14,83461000 -"20010521093000",34.025,34.995,33.875,34.395,103508200 -"20010518093000",33.845,34.6,33.625,34.045,90867200 -"20010517093000",34.55,35.07,33.775,34.08,107002000 -"20010516093000",33.85,34.94,33.665,34.58,91899800 -"20010515093000",34.37,34.65,34,34.135,61389600 -"20010514093000",34.565,34.6,34.15,34.36,45010600 -"20010511093000",34.98,35,34.325,34.7,51129800 -"20010510093000",35.565,35.62,34.98,35,64341800 -"20010509093000",35.62,35.65,34.93,35.2,76677000 -"20010508093000",35.875,36.05,35.375,36.03,75086200 -"20010507093000",35.415,36.075,35.35,35.675,109360200 -"20010504093000",34,35.525,33.98,35.375,119556800 -"20010503093000",34.625,35.09,34.07,34.265,66273600 -"20010502093000",35.5,35.575,34.675,34.88,92864400 -"20010501093000",33.83,35.15,33.8,35.09,83723400 -"20010430093000",34.265,34.53,33.84,33.875,74368200 -"20010427093000",34.765,34.84,33.105,33.565,127400000 -"20010426093000",35.035,35.5,34.125,34.565,118741000 -"20010425093000",33.785,34.895,33.625,34.845,76747200 -"20010424093000",34.1,34.965,33.57,33.775,89180600 -"20010423093000",34.055,34.235,33.45,34.125,92172200 -"20010420093000",35.15,35.55,34.25,34.5,192956000 -"20010419093000",32.905,34.5,32.875,34.01,160024000 -"20010418093000",31.695,33.155,31.5,32.715,156746400 -"20010417093000",30.26,31.055,30.02,30.74,85308000 -"20010416093000",30.7,30.79,30.06,30.395,65858000 -"20010412093000",29.78,31.155,29.675,31.09,87523800 -"20010411093000",30.325,30.75,29.85,30.5,109879800 -"20010410093000",28.975,30.045,28.89,29.84,109211000 -"20010409093000",28.285,28.71,27.83,28.575,56295600 -"20010406093000",28.19,28.595,27.53,28.09,92624200 -"20010405093000",26.875,28.6875,26.75,28.375,113459600 -"20010404093000",26.6875,27.5,25.53125,25.96875,104069800 -"20010403093000",27.65625,27.78125,26.375,26.6875,94192800 -"20010402093000",27.40625,28.46875,27.3125,27.90625,75924400 -"20010330093000",27.875,28.09375,26.9375,27.34375,91344200 -"20010329093000",27.6875,28.59375,27.28125,27.6875,86987400 -"20010328093000",28.6875,28.96875,27.6875,27.75,78704200 -"20010327093000",28.03125,29.28125,27.9375,29.125,95144400 -"20010326093000",28.5625,28.75,27.78125,28.03125,63118800 -"20010323093000",27.46875,28.5,27.1875,28.28125,99520200 -"20010322093000",25.28125,27.03125,25.25,27,126372200 -"20010321093000",26.125,26.625,24.875,24.96875,125052600 -"20010320093000",27.28125,28.0625,26.3125,26.34375,91825600 -"20010319093000",27.25,27.75,26.5625,27.15625,61036400 -"20010316093000",26.25,27.5625,26.23435,27.21875,112851600 -"20010315093000",27.65625,28.03125,26.75,26.84375,71638400 -"20010314093000",26.25,27.625,26.09375,27,90686600 -"20010313093000",26.09375,27.375,26,27.09375,91042400 -"20010312093000",27.34375,27.5,25.8125,25.96875,114377400 -"20010309093000",28.96875,29.09375,27.4375,28.34375,103794400 -"20010308093000",30.15625,30.29685,29.21875,29.625,54626000 -"20010307093000",29.9375,30.5625,29.65625,30.34375,59744600 -"20010306093000",29.3125,30,29.1875,29.71875,66781800 -"20010305093000",28.625,29.3125,28.28125,28.71875,49384000 -"20010302093000",28.75,29.0625,28.21875,28.34375,79800800 -"20010301093000",29.28125,29.75,28.125,29.67185,81781600 -"20010228093000",29.78125,30.03125,29.09375,29.5,84608800 -"20010227093000",29.6875,30.59375,29.3281,29.6875,99155400 -"20010226093000",28.8125,29.96875,28.6875,29.75,87936800 -"20010223093000",27.21875,28.75,27.15625,28.375,92620800 -"20010222093000",28.15625,28.40625,26.9375,27.59375,100828400 -"20010221093000",27.625,29.03125,27.59375,28.125,63947200 -"20010220093000",28.6875,29.125,27.6875,27.9375,60731400 -"20010216093000",28.5,29.125,28.0625,28.59375,66958400 -"20010215093000",29.5,30.09375,28.9375,29.40625,65627800 -"20010214093000",28.8125,29.5,28.1875,29.1875,61728400 -"20010213093000",29.8125,30.53125,29.0625,29.09375,73957000 -"20010212093000",29.40625,29.71875,28.59375,29.375,70263600 -"20010209093000",30.65625,30.78125,29.25,29.5625,100579600 -"20010208093000",31.875,32.25,31,31.125,88041200 -"20010207093000",31,32.53125,30.90625,32.34375,126061800 -"20010206093000",31.03125,31.90625,30.84375,31.28125,96442000 -"20010205093000",30.375,31.03125,30.125,30.96875,56092600 -"20010202093000",31.25,31.6875,30.375,30.40625,71117000 -"20010201093000",30.40625,31.3125,30.1875,31.15625,71796800 -"20010131093000",31.5,31.875,30.5,30.53125,81898800 -"20010130093000",32.25,32.375,31.4375,31.6875,57276800 -"20010129093000",31.78125,32.3125,31.5625,32.25,84983800 -"20010126093000",30.5,32.15625,30.46875,32,93080000 -"20010125093000",31.375,32,30.78125,30.90625,85687400 -"20010124093000",30.5,31.71875,30.375,31.46875,110455000 -"20010123093000",29.875,30.46875,29.46875,30.28125,70297000 -"20010122093000",30.375,30.5,29.5,30.0625,76673200 -"20010119093000",30,30.71875,29.4375,30.5,209348800 -"20010118093000",26.84375,28.09375,26.3125,27.8125,109801400 -"20010117093000",26.8125,27.4375,26.28125,26.46875,72850200 -"20010116093000",26.6875,26.75,25.5625,26.28125,68462400 -"20010112093000",27.4375,27.5,26.25,26.75,73712800 -"20010111093000",26.5,27.875,26.15625,27.5,101862200 -"20010110093000",25.5,26.90625,25.375,26.4375,90243400 -"20010109093000",25,26.3125,24.875,25.90625,114965400 -"20010108093000",24.46875,24.875,23.34375,24.46875,79784600 -"20010105093000",24.25,24.9375,23.78125,24.5,93416400 -"20010104093000",23.90625,25.25,23.4375,24.1875,112398400 -"20010103093000",21.59375,24.4375,21.5625,23.96875,135964000 -"20010102093000",22.0625,22.5,21.4375,21.6406,82413600 -"20001229093000",21.96875,22.90625,21.3125,21.6875,100072000 -"20001228093000",22.5625,23.125,21.9375,22.28125,77620600 -"20001227093000",23.0625,23.40625,22.5,23.21875,69003800 -"20001226093000",23.4375,24.28125,22.9375,23.4375,66942200 -"20001222093000",22.375,23.5625,22.375,23.21875,110185800 -"20001221093000",20.375,22.5625,20.125,21.71875,163177600 -"20001220093000",21.40625,22,20.6875,20.75,149037600 -"20001219093000",23.71875,24,22.25,22.375,120377000 -"20001218093000",24.5,25,23.5,23.90625,107187400 -"20001215093000",25.5156,26,23.875,24.59375,326615000 -"20001214093000",28.96875,29.35935,27.6875,27.75,71202800 -"20001213093000",30.25,30.25,28.40625,28.625,98360400 -"20001212093000",28.90625,30,28.375,29.1875,63106000 -"20001211093000",27.75,29.375,27.5,29.03125,95576200 -"20001208093000",27.3125,27.9375,26.71875,27.21875,120939800 -"20001207093000",26.71875,27,26.125,26.5625,145308200 -"20001206093000",30,30.03125,28.03125,28.34375,90560800 -"20001205093000",29.59375,30.25,29.125,29.9375,101734400 -"20001204093000",28.625,29.5,27.59375,28.1875,80407200 -"20001201093000",29.03125,30.3125,28.03125,28.3125,109810200 -"20001130093000",31,31.03125,28.5,28.6875,197206400 -"20001129093000",33.40625,33.5625,31.625,32.53125,98283400 -"20001128093000",34.6875,34.875,33.40625,33.5,127446200 -"20001127093000",35.71875,36.125,35.3125,35.34375,85307600 -"20001124093000",34.5,35.21875,34.25,34.96875,34439200 -"20001122093000",33.03125,34.75,33,34.125,76344200 -"20001121093000",33.6875,34.625,33.6875,33.875,59487600 -"20001120093000",34.0625,34.25,32.78125,33.59375,80157200 -"20001117093000",34.71875,35,33.8906,34.53125,106525600 -"20001116093000",34.71875,35.75,34.46875,34.46875,92128600 -"20001115093000",34.53125,35.4375,34.34375,35.03125,60422200 -"20001114093000",34,34.90625,33.65625,34.40625,84218600 -"20001113093000",33.34375,34.0625,32.2031,33.21875,83370400 -"20001110093000",34.96875,35.15625,33.40625,33.6875,93744400 -"20001109093000",34.25,35.65625,34.21875,35.4375,91058600 -"20001108093000",35.5625,36.1875,34,34.71875,206149400 -"20001107093000",34.875,35.9375,34.75,35.25,104345400 -"20001106093000",34.34375,35.0625,34.125,34.75,74851400 -"20001103093000",34.625,34.8125,34.03125,34.125,68711000 -"20001102093000",35.1875,35.42185,34.8125,35.15625,77985200 -"20001101093000",34.25,35.03125,34.21875,34.8125,81313400 -"20001031093000",34.5,34.75,34,34.4375,104474000 -"20001030093000",33.75,35.0625,33.6875,34.53125,110057600 -"20001027093000",32.34375,34.59375,32.3125,33.84375,124292600 -"20001026093000",30.5,32.53125,30.40625,32.21875,114832400 -"20001025093000",30.96875,31.71875,30.21875,30.625,167603800 -"20001024093000",31.3125,31.46875,30.09375,30.75,94427400 -"20001023093000",32.3125,33.125,30.34375,31.0625,185170400 -"20001020093000",30.65625,33.0625,30.5625,32.59375,160378600 -"20001019093000",29.21875,31.09375,29,30.9375,257015200 -"20001018093000",24.8125,26.625,24.21875,25.875,110537400 -"20001017093000",25.9375,26.21875,25.125,25.21875,81276600 -"20001016093000",26.75,26.90625,24.78125,25.1875,119759000 -"20001013093000",26.9375,27.4375,26.0625,26.84375,104522400 -"20001012093000",28.15625,28.4375,26.90625,27.21875,90224600 -"20001011093000",27,28.46875,27,27.875,101208400 -"20001010093000",26.96875,27.78125,26.90625,27.28125,62066200 -"20001009093000",27.8125,27.875,26.5,27.09375,58323600 -"20001006093000",27.90625,28.375,27.375,27.78125,61795200 -"20001005093000",27.75,28.625,27.625,27.625,81099400 -"20001004093000",28.1875,28.28125,27.25,27.71875,136540000 -"20001003093000",29.78125,29.90625,28.25,28.28125,85374000 -"20001002093000",30.25,30.40625,29.125,29.5625,58562400 -"20000929093000",30.5,30.65625,29.3125,30.125,74053600 -"20000928093000",30.40625,30.9375,30.3125,30.65625,52360400 -"20000927093000",31.71875,31.78125,29.90625,30.3125,106155600 -"20000926093000",30.46875,32.9375,30.21875,31.34375,155704800 -"20000925093000",31.625,31.75,30.21875,30.625,53479200 -"20000922093000",30.5625,31.75,30.46875,31.625,84476600 -"20000921093000",32,32.5625,31.78125,32.09375,48877200 -"20000920093000",32.4375,32.5,31.59375,32.125,67791400 -"20000919093000",31.8125,32.875,31.6875,32.5,79311400 -"20000918093000",32.125,32.3125,31.09375,31.5,69037800 -"20000915093000",32.71875,32.8125,31.65625,32.09375,99915200 -"20000914093000",34.34375,34.375,32.84375,32.9375,78503000 -"20000913093000",33.75,34.375,33.59375,34.15625,40744800 -"20000912093000",34.375,34.65625,33.8125,34.0625,46781200 -"20000911093000",34.5625,34.84375,34.03125,34.40625,48495200 -"20000908093000",35.1875,35.4375,34.59375,34.65625,56709600 -"20000907093000",35,36.03125,34.71875,34.96875,111720000 -"20000906093000",35.03125,35.34375,34.65625,34.71875,62960800 -"20000905093000",35,35.34375,34.90625,35.09375,50755200 -"20000901093000",35,35.3125,34.84375,35.09375,37629800 -"20000831093000",35.4375,35.65625,34.84375,34.90625,72575400 -"20000830093000",35.34375,35.46875,34.84375,35,53498800 -"20000829093000",35.59375,36.375,35.4375,35.46875,59400200 -"20000828093000",35.09375,36.0625,35.0625,35.65625,56421600 -"20000825093000",35.34375,35.84375,35.28125,35.3125,52729400 -"20000824093000",35.3125,35.59375,34.96875,35.5625,42405400 -"20000823093000",35.40625,35.5625,35.1875,35.375,36726800 -"20000822093000",35.40625,36.21875,35.3125,35.625,54428200 -"20000821093000",35.34375,35.40625,35,35.3125,34119800 -"20000818093000",35.5625,35.71875,35.1875,35.5,54438800 -"20000817093000",35.5625,36,35.28125,35.78125,36112800 -"20000816093000",35.9375,36.125,35.28125,35.5,44976200 -"20000815093000",36,36.5,35.75,35.8125,40714200 -"20000814093000",36.15625,36.6875,35.6875,36.125,53427000 -"20000811093000",36.21875,36.34375,35.8125,36.21875,35629600 -"20000810093000",36.90625,37.03125,35.875,36.3125,48986000 -"20000809093000",36.875,37.4375,36.5625,37.15625,63945600 -"20000808093000",35.03125,37.34375,35,37.0625,138038800 -"20000807093000",35.09375,35.5625,34.875,35,52741800 -"20000804093000",34.71875,34.9375,34.09375,34.5625,38107400 -"20000803093000",34.09375,35.1875,34.0625,35.125,54543400 -"20000802093000",34.28125,35.21875,34.25,34.6875,48269200 -"20000801093000",34.96875,35.03125,34.09375,34.375,47163600 -"20000731093000",35.09375,35.5625,34.625,34.90625,70283800 -"20000728093000",35.46875,35.90625,34.8125,34.84375,75650000 -"20000727093000",33.9375,35.0625,33.75,34.78125,74337600 -"20000726093000",34.53125,34.75,33.625,33.90625,85404600 -"20000725093000",35.40625,35.5,34.1875,34.5,64188600 -"20000724093000",36.03125,36.0625,35,35.25,56165600 -"20000721093000",37.375,37.5,35.9375,36.15625,56100600 -"20000720093000",36.71875,37.625,36.5625,37.40625,54690600 -"20000719093000",38.03125,38.75,36.40625,36.5625,139924600 -"20000718093000",38.8125,39.75,38.71875,39.21875,70617200 -"20000717093000",39.125,39.78125,38.75,39.09375,53992800 -"20000714093000",39.75,39.875,39.21875,39.46875,51180600 -"20000713093000",39.40625,40,38.6875,39.96875,80843200 -"20000712093000",39.125,40.5,38.59375,40.15625,58370200 -"20000711093000",39.40625,40.25,39.25,39.5625,37164800 -"20000710093000",40.34375,40.65625,39.6875,39.75,52689800 -"20000707093000",40.625,41.4375,40.28125,41,54153200 -"20000706093000",39.4375,40.84375,39.25,40.46875,47873200 -"20000705093000",39.9375,39.9375,39.125,39.25,34824400 -"20000703093000",39.84375,40.03125,39.6875,39.96875,15734800 -"20000630093000",38.53125,40,38.34375,40,52356400 -"20000629093000",39.125,39.46875,38.53125,38.59375,38449000 -"20000628093000",39.5,40.03125,39.3125,39.46875,37459200 -"20000627093000",39.625,40.0625,39.1875,39.40625,31071200 -"20000626093000",38.75,40.0625,38.75,39.75,48287000 -"20000623093000",39.96875,40.03125,38.5,38.875,49811600 -"20000622093000",40.6875,41,39.65625,39.9375,87315200 -"20000621093000",38.5,41.09375,38.46875,40.34375,160399600 -"20000620093000",36.9375,37.625,36.875,37.46875,62275000 -"20000619093000",36.28125,36.90625,36,36.84375,46604800 -"20000616093000",36.3125,36.5625,35.75,36.28125,68710600 -"20000615093000",35.40625,36.34375,35.3125,36.1875,65592600 -"20000614093000",34.90625,35.5,34.75,35.25,79992400 -"20000613093000",33.375,34,33.0625,33.9375,44289200 -"20000612093000",34.5,34.5,33.1875,33.46875,49260600 -"20000609093000",34.8125,34.84375,34.15625,34.40625,35560200 -"20000608093000",35.78125,36.0625,34.125,34.40625,94765600 -"20000607093000",34.625,35.375,33.5625,35.25,76311600 -"20000606093000",34.09375,34.9375,33.90625,34.8125,99019000 -"20000605093000",33.0156,34.1875,33,33.4375,64400000 -"20000602093000",33,33.375,32.5,33.15625,80463200 -"20000601093000",32.1875,33,31.90625,32.28125,94507200 -"20000531093000",31.8125,31.84375,31.03125,31.28125,54968200 -"20000530093000",31.21875,32.0625,31,31.6875,68536400 -"20000526093000",31.03125,31.46875,30.1875,30.71875,55822000 -"20000525093000",32.28125,32.375,30.5625,30.75,94348800 -"20000524093000",31.5625,33.28125,31.5,32.78125,85482400 -"20000523093000",31.9375,32.78125,31.53125,31.625,57962600 -"20000522093000",32.5625,32.625,31.21875,32.09375,69962800 -"20000519093000",32.6875,32.96875,32.25,32.53125,66578000 -"20000518093000",34.03125,34.03125,32.9375,33.09375,53640400 -"20000517093000",34.4375,34.5625,33.625,33.84375,53242000 -"20000516093000",34.78125,35.3125,34.53125,34.75,48410600 -"20000515093000",34.5,34.71875,34,34.6875,33899600 -"20000512093000",34.21875,34.875,34.125,34.40625,37886000 -"20000511093000",33.3125,34.0625,32.875,33.9375,58390800 -"20000510093000",33.875,33.9375,32.875,33.09375,67740000 -"20000509093000",35.09375,35.21875,33.75,33.90625,60778400 -"20000508093000",35.46875,35.6875,34.84375,34.90625,36187600 -"20000505093000",35.125,35.90625,34.9375,35.5625,36402200 -"20000504093000",35.15625,35.625,34.65625,35.28125,43317200 -"20000503093000",35.1875,35.40625,34.40625,35.28125,55354800 -"20000502093000",36.40625,36.75,34.75,34.9375,97716200 -"20000501093000",36.4375,37,35.84375,36.71875,107811000 -"20000428093000",35.375,35.5,34.125,34.875,78082600 -"20000427093000",33.71875,34.96875,33.6875,34.90625,77669800 -"20000426093000",35,35.5625,33.6875,34,107091400 -"20000425093000",34.375,34.75,33.8125,34.6875,159517400 -"20000424093000",33.625,34,32.5,33.3125,313681800 -"20000420093000",39.3125,39.9375,38.75,39.46875,52261800 -"20000419093000",40.71875,40.75,39.0625,39.34375,53715400 -"20000418093000",38.25,40.96875,37.9375,40.28125,91802000 -"20000417093000",37.125,38,36.5,37.8125,119773000 -"20000414093000",39.5625,39.75,36.625,37.0625,151221400 -"20000413093000",40.4375,41.125,39.5,39.625,94316200 -"20000412093000",41.0625,41.125,39.375,39.6875,153017800 -"20000411093000",42.5625,43.03125,41.75,41.9375,71961800 -"20000410093000",44.3125,44.3125,43,43.03125,60685400 -"20000407093000",43.5,44.6875,42.5,44.5625,82628200 -"20000406093000",43.9375,44,42.625,43,66421400 -"20000405093000",44.125,44.25,42.9375,43.1875,82888200 -"20000404093000",45.78125,46,42.46875,44.28125,181246600 -"20000403093000",47.21875,48.34375,45,45.4375,232158600 -"20000331093000",53,54.125,52.0625,53.125,64281400 -"20000330093000",53.09375,54.3125,51.25,51.71875,64178400 -"20000329093000",52.59375,54.46875,52.5625,53.59375,64365200 -"20000328093000",51.8125,53.71875,51.1875,52.15625,81114400 -"20000327093000",53.875,54.125,51.96875,52.03125,111434000 -"20000324093000",56.3125,57.5,54.78125,55.84375,112196800 -"20000323093000",53.40625,56.4375,53.3125,55.9375,148223800 -"20000322093000",51.40625,52.8125,50.5625,51.625,93976000 -"20000321093000",48.375,51.5625,48.25,51.375,81648800 -"20000320093000",49.375,49.875,48.25,48.6875,47773000 -"20000317093000",47.625,49.75,47.25,49.6875,81161600 -"20000316093000",47.96875,48.34375,46.625,47.6875,77300800 -"20000315093000",47.28125,48.3125,46.84375,47.6875,53208000 -"20000314093000",49.3125,49.625,47.5625,47.5625,73489200 -"20000313093000",48.8125,50.125,48.75,49,61831800 -"20000310093000",49.78125,51.25,49.75,50.5,85589000 -"20000309093000",47.65625,50,47.5,50,88198800 -"20000308093000",46.90625,48.09375,45.5,47.78125,94290000 -"20000307093000",48.0625,48.75,45.96875,46.4375,135061000 -"20000306093000",48,48.6875,45.04685,45.5,93609600 -"20000303093000",47.375,49.4375,46.9375,48.0625,101437400 -"20000302093000",45.90625,47.6875,45.5625,46.6875,106932600 -"20000301093000",44.8125,47.1875,44.46875,45.21875,106889800 -"20000229093000",45.875,45.875,44.4375,44.6875,58438200 -"20000228093000",45.125,46.0625,44.0625,45.78125,76131800 -"20000225093000",47.34375,47.34375,45.25,45.65625,65301400 -"20000224093000",47.125,47.9375,46,47.34375,69734000 -"20000223093000",46.75,47.875,46.03125,47.125,75847200 -"20000222093000",47.5625,48.5625,46.40625,46.90625,66296200 -"20000218093000",50,50.03125,47.4375,47.6875,79063000 -"20000217093000",49.25,49.84375,48.5625,49.8125,80344200 -"20000216093000",49.625,50.09375,48.5625,48.8125,65202600 -"20000215093000",49.875,50,48.1875,49.28125,71027600 -"20000214093000",50.60935,50.875,49.53125,49.8125,81028600 -"20000211093000",52.4375,52.4375,49.5625,49.96875,115559000 -"20000210093000",51.9375,53.28125,51.25,53,54528600 -"20000209093000",54.71875,54.71875,51.9375,52,55092800 -"20000208093000",53.21875,55,53.21875,54.96875,56231600 -"20000207093000",53.40625,53.4375,52.125,53.3125,40007800 -"20000204093000",52.1875,54,52.0625,53.28125,55365400 -"20000203093000",51.03125,52.09375,50.0625,51.8125,49186000 -"20000202093000",51.21875,51.96875,50.25,50.40625,49915600 -"20000201093000",49.25,51.625,48.84375,51.46875,70196600 -"20000131093000",48.8125,49.09375,47.4375,48.9375,73194200 -"20000128093000",49.0625,50.125,48.625,49.125,58227600 -"20000127093000",49.9375,50.59375,48.625,49.375,63654800 -"20000126093000",51.21875,51.75,49.5625,49.6875,49365000 -"20000125093000",50.5,51.9375,49.78125,51.40625,59827800 -"20000124093000",51.8906,52.84375,50.40625,50.625,63601400 -"20000121093000",53.5,53.625,51.625,51.875,68416200 -"20000120093000",53.53125,54.84375,52.9375,53,56349800 -"20000119093000",55.25,55.75,53,53.5,97566200 -"20000118093000",55.90625,58.25,55.875,57.65625,81484400 -"20000114093000",53.59375,56.96875,52.875,56.125,73417400 -"20000113093000",52.1875,54.3125,50.75,53.8125,83144000 -"20000112093000",54.25,54.4375,52.21875,52.90625,66538200 -"20000111093000",55.75,57.125,54.34375,54.6875,46747800 -"20000110093000",56.71875,56.84375,55.6875,56.125,44963600 -"20000107093000",54.3125,56.125,53.65625,55.71875,62013600 -"20000106093000",56.09375,56.9375,54.1875,55,54976600 -"20000105093000",55.5625,58.1875,54.6875,56.90625,64059600 -"20000104093000",56.78125,58.5625,56.125,56.3125,54094400 -"20000103093000",58.6875,59.3125,56,58.28125,53236000 -"19991231093000",58.75,58.875,58.125,58.375,12517600 -"19991230093000",58.9375,59.96875,58.5625,58.8125,22360000 -"19991229093000",58.46875,59.1875,58.40625,58.84375,17449000 -"19991228093000",59.375,59.40625,58.53125,58.75,24591000 -"19991227093000",59.21875,59.625,58.0625,59.54685,32202200 -"19991223093000",58.625,59.625,58.375,58.71875,31028400 -"19991222093000",58.1406,59,57.5625,58.78125,38565200 -"19991221093000",56.1875,58.3125,55.3125,57.9375,57446000 -"19991220093000",57.40625,57.5,55.59375,56.375,39433800 -"19991217093000",58.3125,58.5625,56.8125,57.625,105898800 -"19991216093000",54.625,57.5,54.46875,56.8125,128659600 -"19991215093000",49.28125,54.375,49.25,54.125,155571600 -"19991214093000",48.09375,50.5625,47.65625,49.34375,144121200 -"19991213093000",46.79685,48.46875,46.375,48.3125,52691600 -"19991210093000",46.6875,47.0625,46.125,46.9375,36836000 -"19991209093000",46,46.65625,45.71875,46.375,46258200 -"19991208093000",46.5625,47.15625,45.84375,45.875,40955800 -"19991207093000",47.375,47.4375,46.4375,46.5,56859200 -"19991206093000",47.625,48.59375,47.375,47.71875,49098200 -"19991203093000",47.90625,48.5625,47.85935,48.0625,64100600 -"19991202093000",46.53125,47.625,46.4375,47.34375,55473800 -"19991201093000",45.53125,46.96875,45.4375,46.59375,48864200 -"19991130093000",44.875,46.4375,44.78125,45.5156,64145600 -"19991129093000",45.0625,46.03125,44.75,45.09375,51512200 -"19991126093000",45.8125,46.6875,45.5,45.5625,28514200 -"19991124093000",44.78125,46.125,44.75,45.84375,53771000 -"19991123093000",44.625,45.6875,44.1875,44.84375,70787400 -"19991122093000",44.8125,45.1875,44.21875,44.90625,91029400 -"19991119093000",42.21875,43.28125,42.1875,43,58231200 -"19991118093000",42.46875,42.90625,42.25,42.40625,64493200 -"19991117093000",43.21875,43.53125,42.5,42.5,66819000 -"19991116093000",43.46875,43.875,42.9375,43.65625,59165400 -"19991115093000",44.125,44.25,43.46875,43.5,47073400 -"19991112093000",44.875,45,43.53125,44.59375,49414200 -"19991111093000",44.125,45.21875,44.125,44.8125,69269400 -"19991110093000",44.0625,44.5625,43.21875,43.5625,69385400 -"19991109093000",44.875,44.9375,43.21875,44.4375,109769800 -"19991108093000",42.40625,45.375,42.1875,44.96875,243832200 -"19991105093000",45.90625,46.4375,45.25,45.78125,70165400 -"19991104093000",46.15625,46.375,45.15625,45.78125,54239400 -"19991103093000",46.46875,46.75,45.75,46,44517000 -"19991102093000",46.375,47.25,45.96875,46.28125,46349000 -"19991101093000",46.625,47.09375,46.0625,46.1875,53261200 -"19991029093000",45.71875,47,45.625,46.28125,79452600 -"19991028093000",45,45.4375,44.65625,44.96875,70568400 -"19991027093000",45.75,45.8125,44.84375,45.4375,54416600 -"19991026093000",47.1875,47.625,46.125,46.1875,52467600 -"19991025093000",46,46.78125,45.5625,46.21875,30492200 -"19991022093000",46.78125,46.9375,45.875,46.34375,43650600 -"19991021093000",45.28125,46.5625,45.25,46.53125,60801200 -"19991020093000",45.78125,46.1875,45.125,46.125,88090600 -"19991019093000",44.125,44.625,42.625,43.15625,69945600 -"19991018093000",43.59375,44,42.53125,43.8906,75312800 -"19991015093000",44.75,44.90625,43.65625,44.03125,73788000 -"19991014093000",45.4375,46.10935,44.84375,45.34375,42737800 -"19991013093000",46,46.5625,45.15625,45.53125,38088400 -"19991012093000",47,47.0625,46.1875,46.28125,27663400 -"19991011093000",47.3125,47.5,47.0625,47.15625,19943800 -"19991008093000",46.75,47.59375,46.0625,47.46875,35697000 -"19991007093000",46.84375,47.53125,46.34375,46.875,46036400 -"19991006093000",46.15625,47,46.03125,46.84375,35501200 -"19991005093000",46.375,46.9375,44.75,45.96875,43397000 -"19991004093000",45.25,46.3125,45.125,46.28125,29998000 -"19991001093000",45.09375,45.3125,44.15625,44.98435,44239000 -"19990930093000",45,45.84375,44.40625,45.28125,47455400 -"19990929093000",45.78125,46.0625,44.5625,44.75,37484400 -"19990928093000",45.625,46.34375,44.53125,46.0625,46000600 -"19990927093000",46,46.46875,45.4375,45.71875,34132200 -"19990924093000",45.09375,45.6875,44.4375,45.46875,70277000 -"19990923093000",48.4375,48.4375,45.0156,45.59375,71073600 -"19990922093000",47.375,48.3125,46.84375,48.03125,48531600 -"19990921093000",48.28125,48.28125,47.0625,47.3125,47082800 -"19990920093000",48,48.9375,47.5,48.78125,48601800 -"19990917093000",47.1875,48.25,46.90625,48.21875,79773400 -"19990916093000",46.4375,47.03125,45.3125,46.875,45796000 -"19990915093000",47.75,47.875,46.1875,46.3125,48413800 -"19990914093000",46.84375,47.78125,46.8125,47.5,40207800 -"19990913093000",47.25,47.40625,46.6875,46.9375,27870800 -"19990910093000",47.53125,47.65625,47,47.5,34455000 -"19990909093000",46.21875,47.0625,45.8906,47.03125,38475200 -"19990908093000",46.84375,47.34375,46.03125,46.125,42568200 -"19990907093000",47.4375,48.34375,46.875,47.125,47028000 -"19990903093000",46.875,48.21875,46.75,47.875,52098000 -"19990902093000",45.75,46.28125,45.34375,45.90625,33340800 -"19990901093000",46.15625,46.71875,45.8125,46.1875,36607200 -"19990831093000",45.90625,46.5625,45.0625,46.28125,46882800 -"19990830093000",46.4375,46.71875,45.78125,46.125,33300800 -"19990827093000",47.53125,47.5625,46.1875,46.625,41948400 -"19990826093000",47.6875,48.1875,46.84375,47.3125,61246000 -"19990825093000",46.8125,48,46.59375,47.65625,81877600 -"19990824093000",43.53125,46.75,43.53125,46.09375,120450000 -"19990823093000",42.15625,43.3125,41.9375,43.21875,60447000 -"19990820093000",42,42.3906,41.53125,41.6875,46072800 -"19990819093000",42.28125,42.5625,41.5625,41.90625,71478200 -"19990818093000",42.21875,43.09375,42.03125,42.5,58361200 -"19990817093000",42.71875,42.75,41.46875,42.28125,51749000 -"19990816093000",42.53125,42.9375,41.15625,42.15625,57321800 -"19990813093000",41.46875,42.8125,41.375,42.34375,65099800 -"19990812093000",41.96875,42.09375,40.8125,40.875,61062000 -"19990811093000",42,42.34375,41.15625,42.09375,66105200 -"19990810093000",41.78125,42.03125,40.8125,41.46875,62743000 -"19990809093000",42.8125,42.90625,41.84375,41.90625,39333600 -"19990806093000",43.03125,43.21875,42.46875,42.5625,67205800 -"19990805093000",42.6875,43.1875,42.375,42.875,76634000 -"19990804093000",42.5625,43.59375,42.375,42.46875,75573400 -"19990803093000",42.9375,43.03125,42.1875,42.375,55051200 -"19990802093000",42.84375,43.46875,42.1875,42.40625,48050600 -"19990730093000",44.34375,44.3125,42.75,42.90625,51127400 -"19990729093000",44.34375,44.40625,43.15625,43.46875,57968200 -"19990728093000",44.59375,45.25,44.1875,45,62215200 -"19990727093000",44.40625,44.875,44,44.40625,65513000 -"19990726093000",44.4375,44.90625,43.8125,43.875,51107800 -"19990723093000",45.78125,45.875,44.84375,45.125,68810000 -"19990722093000",47.1875,47.25,45,45.53125,60892400 -"19990721093000",46.8125,47.65625,46.5,47.34375,54045600 -"19990720093000",48.21875,48.375,46.15625,46.65625,92269200 -"19990719093000",50,50.375,48.90625,49.1875,81169200 -"19990716093000",47.75,49.9375,47.5,49.71875,115419800 -"19990715093000",47.5,47.625,46.875,47.1875,40915000 -"19990714093000",46.875,47.5,46.25,47.46875,37985200 -"19990713093000",46.5625,47.03125,46.40625,46.8125,30844400 -"19990712093000",46.60935,47.375,46.1875,47.09375,43847800 -"19990709093000",46.1875,46.65625,46.125,46.625,33884200 -"19990708093000",46.1406,46.5,45.34375,46.28125,37790400 -"19990707093000",44.79685,46.15625,44.9375,46.15625,33834600 -"19990706093000",46.125,46.46875,44.625,44.78125,45413000 -"19990702093000",45.4375,46.0625,45.15625,46,32088400 -"19990701093000",44.9375,45.75,44.1875,45.59375,47752400 -"19990630093000",43.875,45.125,43.375,45.09375,57543400 -"19990629093000",43.34375,44.03125,43,44,38972400 -"19990628093000",42.75,43.40625,42.46875,43.375,31700800 -"19990625093000",42.6875,43.21875,42.1875,42.46875,24938200 -"19990624093000",42.875,43.125,42,42.3125,33557800 -"19990623093000",42.96875,43.6875,42.53125,43,33941200 -"19990622093000",44.21875,44.21875,43.125,43.25,38746200 -"19990621093000",42.4375,44.5,42.4375,44.46875,56083200 -"19990618093000",41.15625,42.5,41.0625,42.5,69341000 -"19990617093000",40.34375,41.5,40.25,41.4375,44460800 -"19990616093000",39.53125,40.8125,39.46875,40.5,48317800 -"19990615093000",39.03125,39.4375,38.34375,38.84375,36976400 -"19990614093000",39.375,39.84375,38.71875,38.78125,28364400 -"19990611093000",40,40.25,38.78125,39.0625,34543000 -"19990610093000",40.9375,41.15625,39.53125,39.9375,35269400 -"19990609093000",40.0625,41.3125,40,41.15625,53308800 -"19990608093000",39.9375,41.0625,39.5,39.6875,41502800 -"19990607093000",39.96875,40.53125,39.59375,40.125,32389800 -"19990604093000",38.46875,39.84375,38.375,39.78125,35666200 -"19990603093000",39.1875,39.46875,38.0625,38.21875,32940400 -"19990602093000",39.03125,39.3125,38.125,39.21875,42812600 -"19990601093000",40.3125,40.375,39.21875,39.25,36045800 -"19990528093000",39.375,40.4375,39.0625,40.34375,41548200 -"19990527093000",39.125,39.71875,38.75,39.1875,56700000 -"19990526093000",38.59375,39.25,37.75,39.25,52022800 -"19990525093000",38.375,39.625,38.0625,38.10935,50779200 -"19990524093000",38.9375,38.9375,38.03125,38.625,38987200 -"19990521093000",39.25,39.5,38.5,38.78125,56569800 -"19990520093000",39.78125,40,39.1875,39.21875,42371000 -"19990519093000",39.9375,39.9375,38.625,39.65625,46516000 -"19990518093000",39.90625,40.125,38.96875,39.34375,63857400 -"19990517093000",38.6875,39.78125,38.5,39.5625,66850000 -"19990514093000",39.4375,39.96875,38.3125,38.4375,84401200 -"19990513093000",40.5625,40.875,39.5625,39.5625,51735200 -"19990512093000",40.375,40.5,39.625,40.1875,60133400 -"19990511093000",40.375,40.5156,39.53125,39.9375,42784400 -"19990510093000",39.9375,40.25,39.125,39.84375,46218000 -"19990507093000",39.8125,40.1875,39,39.53125,48010200 -"19990506093000",40.34375,40.5625,38.75,39.0625,74011800 -"19990505093000",39.5625,39.9375,38.21875,39.5,67026400 -"19990504093000",40.25,40.90625,38.875,39.03125,66500200 -"19990503093000",40.71875,40.75,39.28125,39.875,67183000 -"19990430093000",41.375,41.875,39.9375,40.65625,58555200 -"19990429093000",41.1875,41.84375,40.2031,41.03125,60878600 -"19990428093000",42.65625,43.25,40.85935,41.0625,55961400 -"19990427093000",44.375,44.375,41.96875,42,58664400 -"19990426093000",43.59375,44.46875,43.375,44,48347400 -"19990423093000",42.5,43.5,41.5,43,56597800 -"19990422093000",42.5,42.625,41.6875,42.40625,55095200 -"19990421093000",41.0625,41.25,40,41,92759800 -"19990420093000",41.125,42,40,41.5625,108460000 -"19990419093000",43.4375,44.0625,40.1875,40.5,75380400 -"19990416093000",44.3125,44.5625,42.9375,43.3125,44772200 -"19990415093000",43.65625,44.9375,41.9375,44.4375,72594600 -"19990414093000",45.40625,45.5625,42.9375,42.9375,52944000 -"19990413093000",46.5625,46.5625,44.59375,45.0625,46744400 -"19990412093000",45.78125,46.8125,45.6875,46.5,37855200 -"19990409093000",47.125,47.5,46.5,47.125,31816400 -"19990408093000",46.625,47.3125,45.5,47.28125,38629600 -"19990407093000",47.4375,47.5,45.625,46.65625,46909600 -"19990406093000",47.59375,47.8125,46.625,47.03125,39673800 -"19990405093000",47.15625,47.5156,46.75,47.46875,39848600 -"19990401093000",45.625,46.4375,45.125,46.34375,41106000 -"19990331093000",47.25,47.3125,44.5625,44.8125,58764600 -"19990330093000",46.6875,46.75,46.125,46.5,67502200 -"19990329093000",45.0625,46.3125,43.9375,46.09375,79816800 -"19990326093000",44.734375,45.09375,43.9375,44.53125,94687600 -"19990325093000",43.265625,45.015625,43.125,44.953125,109448400 -"19990324093000",41.75,42.953125,40.78125,42.8125,82637600 -"19990323093000",43.171875,43.53125,41.5625,41.640625,69579600 -"19990322093000",43.234375,43.734375,43,43.203125,55748800 -"19990319093000",43.46875,43.53125,42.46875,42.796875,92175200 -"19990318093000",41.609375,43.140625,41.546875,43.109375,56231600 -"19990317093000",42.265625,42.359375,41.6875,41.78125,44919600 -"19990316093000",41.375,42.5,41.0625,42.265625,68555200 -"19990315093000",40.140625,41.5,39.46875,41.46875,60609600 -"19990312093000",40.65625,40.6875,39.203125,40.046875,73396800 -"19990311093000",40.25,41.140625,39.828125,40.359375,62948400 -"19990310093000",40.578125,40.625,39.796875,40.34375,53112800 -"19990309093000",39.96875,41.1875,39.9375,40.453125,90124800 -"19990308093000",38.875,39.804675,38.75,39.75,46754000 -"19990305093000",38.6875,38.84375,38.28125,38.734375,47296800 -"19990304093000",37.78125,38.375,37.03125,38.0625,61696400 -"19990303093000",37.25,37.671875,36.765625,37.40625,76798400 -"19990302093000",37.96875,38.53125,36.90625,37.140625,58587600 -"19990301093000",37.390625,38.140625,37.375,37.9375,58332000 -"19990226093000",38.09375,38.125,37.375,37.53125,59281200 -"19990225093000",38.09375,38.4375,37.40625,38.375,70276800 -"19990224093000",39.109375,39.84375,38.1875,38.21875,67695600 -"19990223093000",38.234375,38.90625,37.625,38.859375,95098800 -"19990222093000",37.0625,37.25,36.1875,37.25,92514800 -"19990219093000",36.859375,37.3125,36.4375,36.9375,73120000 -"19990218093000",37.734375,37.84375,35.992175,36.4375,117035200 -"19990217093000",38.234375,38.53125,37.125,37.5,101442800 -"19990216093000",39.9375,39.96875,38.640625,39.0625,73667600 -"19990212093000",40.421875,40.921875,39.28125,39.4375,62930400 -"19990211093000",40.6875,40.96875,40.09375,40.6875,60366000 -"19990210093000",39.96875,41.09375,39.65625,40.15625,73701600 -"19990209093000",41.234375,41.6875,39.9375,40.015625,77293600 -"19990208093000",40.640625,41.390625,40.40625,41.3125,109866800 -"19990205093000",40.0625,40.40625,38.71875,40,127945200 -"19990204093000",42.03125,42.09375,39.71875,39.765625,89151600 -"19990203093000",41.59375,42.46875,41.5,41.703125,73749600 -"19990202093000",43.125,43.140625,41.5625,41.90625,91965600 -"19990201093000",43.859375,43.984375,42.703125,43.234375,81727200 -"19990129093000",43.6875,43.78125,42.71875,43.75,79571600 -"19990128093000",42.9375,43.515625,42.453125,43.5,78838400 -"19990127093000",43.125,43.609375,42.125,42.1875,98048400 -"19990126093000",41.375,42.9375,41.125,42.890625,120203200 -"19990125093000",40.46875,40.828125,39.78125,40.46875,103076400 -"19990122093000",38.90625,40.054675,38.8125,39.0625,82160000 -"19990121093000",40.4375,40.828125,39.4375,39.578125,80077200 -"19990120093000",41.78125,41.9375,40.617175,40.625,125526800 -"19990119093000",37.84375,39.59375,37.71875,38.90625,102773600 -"19990115093000",35.734375,37.5,35.34375,37.4375,59344000 -"19990114093000",36.3125,36.390625,35.375,35.4375,59214000 -"19990113093000",34,36.9375,34,35.953125,75346000 -"19990112093000",37.03125,37.03125,35.25,35.546875,57907200 -"19990111093000",37.71875,37.734375,36.0625,36.875,46460000 -"19990108093000",38.046875,38.125,36.75,37.46875,50236000 -"19990107093000",37.4375,37.65625,37.0625,37.625,51150400 -"19990106093000",37.375,37.875,36.6875,37.8125,69077200 -"19990105093000",35.46875,37,35.359375,36.625,64278800 -"19990104093000",34.898425,36.3125,34.84375,35.25,69300400 -"19981231093000",34.796875,35,34.5,34.671875,23834400 -"19981230093000",35.21875,35.835925,34.71875,34.75,34942800 -"19981229093000",35.640625,35.640625,34.90625,35.0625,29652000 -"19981228093000",35.75,35.90625,35.375,35.59375,23636400 -"19981224093000",35.40625,35.5,35.375,35.4375,1250800 -"19981223093000",35.09375,35.953125,34.84375,35.890625,34940000 -"19981222093000",35.125,35.125,34.34375,34.609375,41350000 -"19981221093000",34.65625,35.546875,34.4375,35.109375,48112000 -"19981218093000",33.75,34.5625,33.53125,34.453125,59648000 -"19981217093000",33.546875,33.71875,33.0625,33.59375,46963600 -"19981216093000",33.125,33.78125,32.28125,33.4375,60024000 -"19981215093000",32.328125,33,32.3125,32.96875,51719600 -"19981214093000",33.1875,33.4375,31.921875,31.984375,64076400 -"19981211093000",32.75,33.671875,32.6875,33.5,51760800 -"19981210093000",33.28125,33.65625,32.84375,32.890625,57135600 -"19981209093000",33.03125,33.453125,32.5,33.40625,44781600 -"19981208093000",33.21875,33.5625,32.4375,32.796875,77583600 -"19981207093000",31.921875,33.4375,31.6875,33.390625,89809200 -"19981204093000",31.234375,31.84375,31,31.84375,44352000 -"19981203093000",31.71875,32.234375,30.5,30.53125,51426800 -"19981202093000",32.296875,32.4375,31.375,31.6875,65596000 -"19981201093000",30.0625,32.4375,30.03125,32.390625,86330400 -"19981130093000",32.34375,32.5625,30.484375,30.5,70900000 -"19981127093000",31.28125,32.03125,31.078125,32.015625,26335600 -"19981125093000",30.671875,31.09375,30.1875,31.0625,41356800 -"19981124093000",29.671875,31.265625,29.65625,30.421875,101114800 -"19981123093000",28.125,30.046875,28.125,29.796875,110885200 -"19981120093000",28.1875,28.4375,27.8125,28.40625,48405600 -"19981119093000",27.265625,28.125,27.265625,27.9375,45220800 -"19981118093000",27.390625,27.765625,27.28125,27.4375,41691600 -"19981117093000",27.25,28.09375,27.234375,27.96875,58744000 -"19981116093000",27.828125,27.9375,26.875,27.203125,42620800 -"19981113093000",27.109375,27.625,27.09375,27.5,28368800 -"19981112093000",27.5625,27.78125,27.125,27.1875,38526800 -"19981111093000",28.359375,28.6875,27.71875,27.765625,63899200 -"19981110093000",27.53125,28.359375,27.515625,28.015625,72087600 -"19981109093000",27.296875,27.84375,27.203125,27.671875,68956800 -"19981106093000",26.515625,27.4375,26.484375,27.328125,74461200 -"19981105093000",26.328125,26.90625,26.3125,26.59375,76727200 -"19981104093000",26.453125,26.828125,26.21875,26.375,67459600 -"19981103093000",26.375,26.640625,26.1875,26.296875,36546800 -"19981102093000",26.59375,26.71875,26.25,26.453125,48388400 -"19981030093000",26.8125,27.046875,26.28125,26.46875,59322800 -"19981029093000",26.359375,26.875,26.359375,26.640625,52403200 -"19981028093000",26.21875,26.65625,26.21875,26.421875,56808400 -"19981027093000",26.9375,26.96875,26.25,26.359375,65436800 -"19981026093000",26.703125,27,26.421875,26.765625,59678400 -"19981023093000",27.25,27.5,26.546875,26.59375,59891200 -"19981022093000",26.5,27.53125,26.3125,27.5,81912800 -"19981021093000",26.21875,26.71875,25.765625,26.578125,125381600 -"19981020093000",25.8125,25.84375,24.90625,25.0625,94369200 -"19981019093000",26.03125,26.046875,25.28125,25.734375,60177200 -"19981016093000",26.5,26.625,26,26.265625,68636000 -"19981015093000",25.03125,26.40625,24.90625,26.359375,66253600 -"19981014093000",23.96875,25.34375,23.96875,25.046875,62403200 -"19981013093000",24.875,24.9375,23.9375,24.109375,47987600 -"19981012093000",24.8125,25.25,24.625,24.9375,51502800 -"19981009093000",23.296875,24.25,23.0625,24.21875,72661600 -"19981008093000",22.640625,22.96875,21.9375,22.796875,144657600 -"19981007093000",24.34375,24.9375,23.34375,23.53125,90761600 -"19981006093000",25.625,25.90625,24.34375,24.40625,76550000 -"19981005093000",25.625,25.71875,24.125,25.1875,114938000 -"19981002093000",25.84375,26.296875,25.25,26.03125,65885600 -"19981001093000",27.015625,27.375,26,26.015625,65445200 -"19980930093000",28.078125,28.390625,27.5078,27.515625,38875600 -"19980929093000",27.953125,28.5,27.84375,28.21875,48743200 -"19980928093000",28.25,28.59375,27.4375,27.828125,41406400 -"19980925093000",27.28125,28.28125,27.15625,28.265625,47878400 -"19980924093000",28.28125,28.65625,27.25,27.53125,63521600 -"19980923093000",27.40625,28.46875,27.125,28.40625,65263600 -"19980922093000",27.109375,27.46875,26.6875,27.296875,43082000 -"19980921093000",25.625,27.015625,25.59375,26.96875,45872000 -"19980918093000",26.5625,26.5625,26.078125,26.34375,47361600 -"19980917093000",26.328125,26.625,26.203125,26.234375,45178400 -"19980916093000",26.96875,27.125,26.53125,27.046875,42886800 -"19980915093000",26.46875,27.109375,26.28125,27.078125,49413600 -"19980914093000",26.234375,26.765625,26.21875,26.5,45086800 -"19980911093000",25.28125,26.15625,25.03125,26.0625,58989200 -"19980910093000",25,25.28125,24.671875,25.1875,60758000 -"19980909093000",25.5625,26.109375,25.40625,25.5625,65494400 -"19980908093000",24.734375,25.515625,24.765625,25.492175,60625600 -"19980904093000",24.921875,25.0625,24.03125,24.15625,50890400 -"19980903093000",24.6875,25.1875,24.5625,24.8125,67468000 -"19980902093000",25.453125,26.0625,25.0625,25.140625,63438400 -"19980901093000",23.8125,25.4375,23.625,25.3125,140112400 -"19980831093000",26.21875,26.625,23.9375,23.984375,132688400 -"19980828093000",27.0625,27.40625,26.1875,26.3125,72730000 -"19980827093000",27.640625,28.1875,27.125,27.3125,74874000 -"19980826093000",27.8125,28.4375,27.71875,28.140625,44804400 -"19980825093000",27.84375,28.421875,27.78125,28.203125,58027200 -"19980824093000",27.578125,28,27.5,27.59375,26319200 -"19980821093000",27.78125,27.96875,27.1875,27.65625,59523600 -"19980820093000",27.53125,28.1875,27.421875,28.140625,49964000 -"19980819093000",28.0625,28.1875,27.5625,27.640625,55709600 -"19980818093000",26.96875,27.953125,26.84375,27.8125,70591200 -"19980817093000",25.875,26.84375,25.75,26.828125,54073200 -"19980814093000",26.171875,26.265625,25.875,26.0625,29566400 -"19980813093000",26.03125,26.5,25.9375,25.984375,51193200 -"19980812093000",26.078125,26.296875,25.75,26.265625,53760000 -"19980811093000",25.71875,26.09375,25.5,25.859375,60976400 -"19980810093000",26.453125,26.578125,26.109375,26.109375,46763200 -"19980807093000",26.859375,26.875,26.265625,26.46875,54972400 -"19980806093000",25.9375,26.734375,25.90625,26.71875,68308000 -"19980805093000",26.03125,26.5625,25.375,26.078125,120191200 -"19980804093000",27.15625,27.40625,26.046875,26.125,91412000 -"19980803093000",27.28125,27.71875,26.84375,27.109375,73566400 -"19980731093000",28.234375,28.375,27.484375,27.484375,53706000 -"19980730093000",27.984375,28.40625,27.6875,28.359375,72746400 -"19980729093000",28.3125,28.5625,27.515625,27.671875,59904800 -"19980728093000",29,29.21875,28,28.0625,78378800 -"19980727093000",28.28125,29.1875,27.671875,29.1875,58998000 -"19980724093000",28.4375,28.90625,28.109375,28.453125,60366800 -"19980723093000",29.078125,29.375,28.25,28.25,51029600 -"19980722093000",28,29.3125,27.96875,29.1875,71630400 -"19980721093000",29.21875,29.75,28.125,28.203125,74605200 -"19980720093000",29.546875,29.875,29.203125,29.25,45794800 -"19980717093000",29.4375,29.90625,28.984375,29.484375,83137600 -"19980716093000",29.515625,29.71875,29.15625,29.34375,65130800 -"19980715093000",29,29.5,28.90625,29.34375,48690000 -"19980714093000",29.5625,29.6875,28.875,29.125,56972400 -"19980713093000",28.53125,29.5625,28.40625,29.390625,69223200 -"19980710093000",27.78125,28.3125,27.46875,28.296875,45396800 -"19980709093000",27.5,28,27.4375,27.75,43690000 -"19980708093000",27.03125,27.53125,26.6875,27.46875,41553600 -"19980707093000",26.96875,27.140625,26.625,26.984375,32423600 -"19980706093000",26.71875,27.015625,26.34375,26.953125,35260400 -"19980702093000",27.203125,27.28125,26.78125,26.8125,27321200 -"19980701093000",27.28125,27.53125,26.796875,27.34375,53474000 -"19980630093000",26.3125,27.140625,26.15625,27.09375,77010000 -"19980629093000",26.375,26.921875,26.3125,26.859375,65906000 -"19980626093000",25.5625,26.15625,25.5,26.109375,55680400 -"19980625093000",26.46875,26.71875,25.34375,25.390625,88969600 -"19980624093000",25.421875,26.28125,24.984375,26.234375,105728800 -"19980623093000",23.953125,25.21875,23.8125,25.1875,124675200 -"19980622093000",23.6875,23.984375,23.421875,23.953125,48969600 -"19980619093000",23.375,23.6875,23.125,23.671875,91345600 -"19980618093000",22.703125,22.9375,22.59375,22.796875,39228400 -"19980617093000",22.484375,23.09375,22.4375,22.765625,76145200 -"19980616093000",21.578125,22.484375,21.375,22.46875,61138400 -"19980615093000",21.171875,21.828125,21.140625,21.484375,42846000 -"19980612093000",21.21875,21.53125,21,21.4375,41999600 -"19980611093000",21.609375,21.78125,21.28125,21.328125,41511200 -"19980610093000",21.65625,22.09375,21.46875,21.5,33305600 -"19980609093000",21.328125,21.890625,21.3125,21.765625,36171600 -"19980608093000",21.40625,21.578125,21.25,21.421875,18900400 -"19980605093000",21.46875,21.625,21.1875,21.5625,34654000 -"19980604093000",21.171875,21.53125,20.90625,21.515625,33815200 -"19980603093000",21.46875,21.609375,21,21.078125,35992800 -"19980602093000",21.015625,21.484375,20.96875,21.375,39188000 -"19980601093000",20.96875,21.148425,20.78125,20.9375,42441600 -"19980529093000",21.59375,21.625,21.1875,21.203125,34094400 -"19980528093000",21.4375,21.59375,21.265625,21.578125,30868400 -"19980527093000",20.71875,21.53125,20.71875,21.5,58689600 -"19980526093000",21.328125,21.546875,20.875,20.90625,44532000 -"19980522093000",21.65625,21.6875,21.359375,21.390625,32211600 -"19980521093000",21.453125,21.84375,21.375,21.59375,36680400 -"19980520093000",21.53125,21.71875,21.34375,21.4375,35532400 -"19980519093000",21.453125,21.734375,21.390625,21.625,51278800 -"19980518093000",21.125,21.90625,21.125,21.515625,80977600 -"19980515093000",22.53125,22.546875,22.1875,22.359375,48150800 -"19980514093000",21.46875,22.75,21.453125,22.234375,94771200 -"19980513093000",22.1875,22.1875,21.625,21.734375,80681200 -"19980512093000",20.8125,21.4375,20.8125,21.421875,64122400 -"19980511093000",21.53125,21.546875,21.015625,21.046875,51474400 -"19980508093000",20.46875,21.53125,20.46875,21.4375,96249200 -"19980507093000",21.546875,21.5625,20.796875,20.84375,78022800 -"19980506093000",21.875,21.875,21.5,21.59375,48110800 -"19980505093000",21.90625,22.390625,21.75,21.9375,50839600 -"19980504093000",22.296875,22.46875,21.984375,22.015625,37898800 -"19980501093000",22.546875,22.625,22.03125,22.40625,36135200 -"19980430093000",22.875,22.90625,22.421875,22.53125,54481600 -"19980429093000",22.515625,22.875,22.40625,22.625,50171600 -"19980428093000",23.03125,23.0625,22.25,22.46875,56769600 -"19980427093000",22.375,22.6328,22.125,22.578125,58748000 -"19980424093000",23.375,23.6875,22.96875,23,51436000 -"19980423093000",24.3125,24.3125,23.53125,23.625,64215600 -"19980422093000",24,24.78125,23.90625,24.6875,80153600 -"19980421093000",23.671875,23.75,23.28125,23.75,51932400 -"19980420093000",23.09375,23.75,23.046875,23.65625,45534400 -"19980417093000",22.875,23.0625,22.578125,23.046875,37402800 -"19980416093000",22.59375,23.015625,22.5625,22.921875,39695600 -"19980415093000",22.3125,22.84375,22.21875,22.84375,40498400 -"19980414093000",22.171875,22.390625,21.875,22.109375,28476800 -"19980413093000",22.203125,22.25,21.6875,22.15625,33156400 -"19980409093000",21.984375,22.40625,21.898425,22.25,33619200 -"19980408093000",21.6875,22.265625,21.65625,22.234375,36798800 -"19980407093000",22.328125,22.65625,21.6875,21.8125,63295200 -"19980406093000",23.15625,23.15625,22.265625,22.484375,74242800 -"19980403093000",23,23.265625,22.875,23.25,40987600 -"19980402093000",22.671875,22.984375,22.46875,22.828125,41412800 -"19980401093000",22.453125,22.65625,22.125,22.59375,36840000 -"19980331093000",22.15625,22.4375,22.125,22.375,38126400 -"19980330093000",22.015625,22.15625,21.78125,22,27463200 -"19980327093000",22.34375,22.34375,21.890625,21.953125,38940000 -"19980326093000",22.125,22.390625,21.875,22.0625,45442400 -"19980325093000",22.59375,22.734375,21.8125,22.203125,124248000 -"19980324093000",21.046875,21.265625,20.859375,21.234375,32281600 -"19980323093000",20.296875,21.15625,20.265625,20.96875,55090400 -"19980320093000",20.53125,20.75,20.125,20.46875,56310000 -"19980319093000",20.375,20.578125,20.3125,20.5,30297200 -"19980318093000",20.015625,20.453125,19.96875,20.4375,33887600 -"19980317093000",20.421875,20.421875,19.921875,20.09375,53842400 -"19980316093000",20.609375,20.6875,20.34375,20.5,27979600 -"19980313093000",20.609375,20.75,20.390625,20.59375,32542400 -"19980312093000",20.625,20.59375,20.203125,20.46875,47921200 -"19980311093000",20.5,20.5,19.9375,20.171875,39839600 -"19980310093000",20.296875,20.375,19.984375,20.390625,47406400 -"19980309093000",20.625,20.625,19.875,19.898425,52255600 -"19980306093000",20.078125,20.6875,20.0625,20.640625,51405200 -"19980305093000",19.8125,20.359375,19.875,20.015625,92256400 -"19980304093000",20.609375,20.953125,20.390625,20.578125,71513600 -"19980303093000",20.65625,21.140625,20.640625,21.125,50754400 -"19980302093000",21.46875,21.46875,20.765625,20.84375,50094000 -"19980227093000",21.390625,21.5,21.140625,21.1875,47528400 -"19980226093000",21.375,21.421875,21.109375,21.375,61388000 -"19980225093000",20.859375,21.25,20.765625,21.234375,94944800 -"19980224093000",20.84375,21.234375,20.46875,20.53125,118314400 -"19980223093000",20.21875,20.421875,19.84375,20.40625,120803600 -"19980220093000",19.4375,19.46875,19.109375,19.390625,86108000 -"19980219093000",19.4375,19.5078125,19.28125,19.359375,73773600 -"19980218093000",19.328125,19.5,19.21875,19.328125,76608800 -"19980217093000",19.8125,19.8125,19.234375,19.296875,85673600 -"19980213093000",19.828125,19.84375,19.671875,19.6875,42206400 -"19980212093000",19.7578125,19.8671875,19.5078125,19.84375,76698400 -"19980211093000",19.9921875,20.0078125,19.6328125,19.8671875,76460000 -"19980210093000",19.65625,19.9375,19.59375,19.90625,48099200 -"19980209093000",19.84375,19.859375,19.453125,19.6484375,54682400 -"19980206093000",19.421875,19.78125,19.390625,19.765625,50070400 -"19980205093000",19.765625,19.84375,19.34375,19.4296875,67014400 -"19980204093000",19.484375,19.75,19.3828125,19.6015625,61940800 -"19980203093000",19.390625,19.515625,19.2265625,19.484375,61374400 -"19980202093000",18.96875,19.390625,18.8125,19.34375,98392000 -"19980130093000",18.578125,18.75,18.453125,18.6484375,50071200 -"19980129093000",18.6171875,18.765625,18.4375,18.53125,73571200 -"19980128093000",18.28125,18.6875,18.1875,18.625,79388800 -"19980127093000",17.796875,18.234375,17.6953125,18.1484375,97540000 -"19980126093000",17.484375,17.734375,17.3046875,17.71875,74276000 -"19980123093000",17.34375,17.4296875,17.0859375,17.28125,63312000 -"19980122093000",16.9453125,17.484375,16.9140625,17.328125,159360800 -"19980121093000",17.15625,17.3046875,16.953125,17.125,85562400 -"19980120093000",16.765625,17.25,16.75,17.2265625,64956000 -"19980116093000",16.546875,16.921875,16.5390625,16.90625,72943200 -"19980115093000",16.296875,16.625,16.234375,16.5390625,50624000 -"19980114093000",16.515625,16.5625,16.15625,16.390625,54774400 -"19980113093000",16.1875,16.5234375,16.015625,16.515625,66945600 -"19980112093000",16.078125,16.25,15.546875,16.1953125,78400800 -"19980109093000",16.2578125,16.4375,15.734375,15.875,87534400 -"19980108093000",16.078125,16.515625,15.9375,16.3125,77657600 -"19980107093000",16.234375,16.328125,15.9375,16.1953125,61492800 -"19980106093000",16.21875,16.625,16.15625,16.390625,67836800 -"19980105093000",16.40625,16.703125,15.984375,16.296875,80377600 -"19980102093000",16.203125,16.4375,16.1875,16.390625,39748000 -"19971231093000",16.375,16.4375,16.125,16.15625,46146400 -"19971230093000",15.8046875,16.375,15.78125,16.28125,77881600 -"19971229093000",15.296875,15.84375,15.265625,15.7890625,67799200 -"19971226093000",14.859375,15.09375,14.84375,15.09375,32388800 -"19971224093000",15.46875,15.484375,14.75,14.8671875,88411200 -"19971223093000",15.8828125,16.03125,15.375,15.4140625,67195200 -"19971222093000",16.140625,16.25,15.734375,15.8828125,59063200 -"19971219093000",16.09375,16.2734375,15.78125,16.0703125,137783200 -"19971218093000",16.8125,16.84375,16.296875,16.359375,98774400 -"19971217093000",17.484375,17.546875,16.9453125,16.953125,51472000 -"19971216093000",16.984375,17.546875,16.875,17.3828125,65401600 -"19971215093000",17.0546875,17.125,16.515625,17.015625,84314400 -"19971212093000",17.21875,17.3125,17,17.09375,54375200 -"19971211093000",17.546875,17.625,17.359375,17.3828125,70189600 -"19971210093000",17.78125,17.90625,17.625,17.78125,66434400 -"19971209093000",18.125,18.171875,17.9375,18.0390625,51864000 -"19971208093000",17.9375,18.328125,17.890625,18.265625,49952800 -"19971205093000",17.765625,18.09375,17.765625,17.890625,48136000 -"19971204093000",18.09375,18.234375,17.78125,17.8203125,62627200 -"19971203093000",17.7109375,18.1328125,17.625,18.09375,57712000 -"19971202093000",17.9453125,18.109375,17.75,17.78125,50167200 -"19971201093000",17.7421875,18,17.703125,17.9765625,49006400 -"19971128093000",17.65625,17.78125,17.640625,17.6875,17392800 -"19971127093000",-1,-1,-1,-1,-1 -"19971126093000",17.375,17.734375,17.28125,17.6953125,63053600 -"19971125093000",16.984375,17.40625,16.96875,17.375,56464800 -"19971124093000",17.140625,17.265625,16.9375,16.9375,39084000 -"19971121093000",17.2265625,17.25,17.046875,17.234375,68220800 -"19971120093000",16.90625,17.140625,16.859375,17.109375,53680800 -"19971119093000",16.703125,16.890625,16.671875,16.8828125,31720800 -"19971118093000",16.8671875,16.9375,16.71875,16.75,36683200 -"19971117093000",16.8125,16.9765625,16.6796875,16.859375,60094400 -"19971114093000",16.453125,16.734375,16.421875,16.6640625,46663200 -"19971113093000",16.2578125,16.453125,16.1484375,16.4453125,60094400 -"19971112093000",16.265625,16.375,16.125,16.1484375,45784000 -"19971111093000",16.3046875,16.4296875,16.171875,16.328125,37013600 -"19971110093000",16.453125,16.5625,16.21875,16.2734375,36764800 -"19971107093000",16.2578125,16.5,16.234375,16.4453125,63631200 -"19971106093000",16.65625,16.6875,16.46875,16.5078125,40266400 -"19971105093000",16.8125,16.828125,16.5625,16.6953125,42512800 -"19971104093000",16.75,16.8671875,16.6484375,16.78125,49126400 -"19971103093000",16.453125,16.78125,16.4140625,16.765625,67714400 -"19971031093000",16.375,16.4375,16.203125,16.25,46808800 -"19971030093000",16.1875,16.453125,16.0625,16.078125,72097600 -"19971029093000",16.71875,16.8828125,16.265625,16.390625,85533600 -"19971028093000",15.5,16.78125,15.4375,16.671875,159689600 -"19971027093000",16.859375,17.03125,16.078125,16.109375,96792800 -"19971024093000",17.109375,17.15625,16.65625,16.921875,70030400 -"19971023093000",16.5,17.15625,16.5,16.953125,66413600 -"19971022093000",17.296875,17.3125,16.921875,16.9609375,55775200 -"19971021093000",17.015625,17.4023375,16.9140625,17.3125,115682400 -"19971020093000",16.625,16.90625,15.9375,16.5625,154052800 -"19971017093000",16.640625,16.828125,16.296875,16.53125,87720000 -"19971016093000",17.015625,17.078125,16.53125,16.738275,47327200 -"19971015093000",16.96875,17,16.921875,16.96875,44997600 -"19971014093000",17.140625,17.171875,16.921875,17.0859375,33361600 -"19971013093000",17.125,17.234375,17.0703125,17.09375,19051200 -"19971010093000",17.2890625,17.34375,17.03125,17.0625,24893600 -"19971009093000",17.3125,17.453125,17.265625,17.3671875,34482400 -"19971008093000",17.078125,17.3828125,17.03125,17.375,71196800 -"19971007093000",16.875,17.2109375,16.828125,17.0625,54548800 -"19971006093000",16.984375,17.03125,16.78125,16.890625,41776800 -"19971003093000",16.8671875,17.03125,16.671875,16.8671875,60287200 -"19971002093000",16.71875,16.828125,16.59375,16.6484375,28756000 -"19971001093000",16.5625,16.8125,16.421875,16.734375,61466400 -"19970930093000",16.8046875,16.96875,16.53125,16.5390625,43892800 -"19970929093000",16.6875,16.84375,16.609375,16.8125,27505600 -"19970926093000",16.703125,16.71875,16.453125,16.671875,36644000 -"19970925093000",16.609375,16.765625,16.5078125,16.59375,39272000 -"19970924093000",16.953125,17.0078125,16.515625,16.5546875,60043200 -"19970923093000",16.6953125,16.9375,16.640625,16.9375,39946400 -"19970922093000",16.875,16.984375,16.6484375,16.6640625,43251200 -"19970919093000",16.53125,16.90625,16.5,16.8984375,77428800 -"19970918093000",16.78125,16.890625,16.4296875,16.53125,61077600 -"19970917093000",17.078125,17.09375,16.578125,16.6484375,61609600 -"19970916093000",16.46875,17.125,16.375,17.046875,102540800 -"19970915093000",16.953125,17.15625,16.328125,16.3359375,129004000 -"19970912093000",17.109375,17.296875,16.953125,17.2421875,48576000 -"19970911093000",16.875,17.171875,16.609375,17.1015625,61779200 -"19970910093000",17.359375,17.390625,16.8828125,16.890625,53294400 -"19970909093000",17.40625,17.53125,17.296875,17.4375,39465600 -"19970908093000",17.21875,17.4765625,17.21875,17.4140625,42416000 -"19970905093000",17.3828125,17.4609375,17.03125,17.1640625,48398400 -"19970904093000",17,17.3125,17.015625,17.2734375,44481600 -"19970903093000",17.203125,17.359375,17.0234375,17.0703125,42872800 -"19970902093000",16.640625,17.1875,16.625,17.1484375,50106400 -"19970901093000",-1,-1,-1,-1,-1 -"19970829093000",16.5078125,16.734375,16.46875,16.5234375,37857600 -"19970828093000",16.6875,16.71875,16.5,16.5078125,43641600 -"19970827093000",16.90625,16.9140625,16.625,16.8203125,49372000 -"19970826093000",17,17.109375,16.84375,16.875,34124000 -"19970825093000",17.234375,17.375,16.953125,17.0625,38856800 -"19970822093000",16.90625,17.1875,16.765625,17.15625,72029600 -"19970821093000",17.703125,17.796875,17.1875,17.234375,64443200 -"19970820093000",17.375,17.5859375,17.125,17.5703125,50312800 -"19970819093000",16.84375,17.375,16.828125,17.3515625,91013600 -"19970818093000",16.625,16.734375,16.375,16.734375,69921600 -"19970815093000",16.9375,17,16.59375,16.609375,51078400 -"19970814093000",17,17.09375,16.765625,17.03125,45912800 -"19970813093000",17.265625,17.28125,16.84375,17.0078125,66731200 -"19970812093000",17.421875,17.46875,16.9765625,17,60887200 -"19970811093000",17.5,17.53125,17.046875,17.28125,72695200 -"19970808093000",17.8515625,17.890625,17.5,17.5,66811200 -"19970807093000",18.0390625,18.046875,17.75,18.0429625,43964800 -"19970806093000",17.9140625,18.078125,17.78125,17.9296875,43412000 -"19970805093000",17.78125,18.046875,17.75,17.9140625,59336000 -"19970804093000",17.53125,17.75,17.4296875,17.6953125,46312800 -"19970801093000",17.671875,17.7265625,17.3984375,17.578125,58912800 -"19970731093000",17.75,17.765625,17.609375,17.6875,42232800 -"19970730093000",17.59375,17.75,17.453125,17.640625,78323200 -"19970729093000",17.09375,17.5078125,17.015625,17.4921875,78816000 -"19970728093000",17.40625,17.421875,16.96875,17.125,56404000 -"19970725093000",17.3125,17.78125,17.15625,17.3125,90308800 -"19970724093000",17.296875,17.546875,16.953125,17.25,141855200 -"19970723093000",18.15625,18.359375,17.625,17.6796875,95857600 -"19970722093000",17.109375,18.1015625,17.09375,18.03125,101383200 -"19970721093000",17.609375,17.625,16.71875,16.9921875,127221600 -"19970718093000",18.1875,18.421875,17.5,17.5625,158937600 -"19970717093000",18.8125,18.84375,18.3125,18.6796875,131656800 -"19970716093000",17.765625,18.6875,17.5,18.5546875,110971200 -"19970715093000",17.2578125,17.40625,17.078125,17.3085875,75501600 -"19970714093000",16.3515625,17,16.3125,16.9921875,57424000 -"19970711093000",16.28125,16.3828125,16.0546875,16.21875,38096000 -"19970710093000",16.3125,16.40625,16.109375,16.234375,43780800 -"19970709093000",16.5625,16.578125,16.1875,16.34375,48239200 -"19970708093000",16.171875,16.4140625,16.1171875,16.40625,36007200 -"19970707093000",16.328125,16.46875,16.171875,16.1875,39320000 -"19970704093000",-1,-1,-1,-1,-1 -"19970703093000",16.2578125,16.2578125,16.0625,16.1953125,28764000 -"19970702093000",15.703125,16.0625,15.5078125,16.046875,53237600 -"19970701093000",15.8046875,15.859375,15.40625,15.6171875,59377600 -"19970630093000",15.984375,16.09375,15.7734375,15.796875,38286400 -"19970627093000",16.140625,16.25,15.90625,15.9375,38198400 -"19970626093000",16.265625,16.3515625,15.984375,16.03125,37212800 -"19970625093000",16.609375,16.65625,16.15625,16.3046875,49576800 -"19970624093000",16.1875,16.515625,16.046875,16.5078125,39319200 -"19970623093000",16.234375,16.4375,16,16.0078125,35724800 -"19970620093000",16.171875,16.421875,16.0625,16.234375,64236000 -"19970619093000",16.046875,16.34375,16,16.1640625,65515200 -"19970618093000",16.65625,16.6875,16.2578125,16.2734375,55648000 -"19970617093000",16.4375,16.8671875,16.359375,16.7734375,53191200 -"19970616093000",16.203125,16.421875,16.109375,16.421875,40612800 -"19970613093000",15.84375,16.2578125,15.8203125,16.203125,50116000 -"19970612093000",15.84375,16.015625,15.6875,15.84375,44620000 -"19970611093000",15.6015625,15.921875,15.4453125,15.875,49056800 -"19970610093000",15.640625,15.8828125,15.46875,15.6015625,53135200 -"19970609093000",15.609375,15.765625,15.3125,15.65625,48200000 -"19970606093000",15.171875,15.5390625,15.125,15.5,35964000 -"19970605093000",15.03125,15.1875,14.9375,15.046875,35892000 -"19970604093000",15.078125,15.28125,14.78125,14.8984375,54639200 -"19970603093000",15.421875,15.4375,15.078125,15.2578125,41987200 -"19970602093000",15.625,15.6875,15.390625,15.546875,38939200 -"19970530093000",14.6875,15.703125,14.6875,15.5,83340000 -"19970529093000",15.90625,16.1328125,15.625,15.734375,51103200 -"19970528093000",15.90625,15.90625,15.609375,15.734375,52241600 -"19970527093000",15.34375,15.921875,15.296875,15.828125,69036000 -"19970526093000",-1,-1,-1,-1,-1 -"19970523093000",15.171875,15.375,15.109375,15.359375,28904800 -"19970522093000",15.125,15.203125,14.96875,15.078125,33478400 -"19970521093000",15.078125,15.3671875,14.96875,15.046875,76620000 -"19970520093000",14.484375,14.90625,14.40625,14.890625,64876800 -"19970519093000",14.515625,14.640625,14.390625,14.390625,45632000 -"19970516093000",14.546875,14.625,14.359375,14.4296875,59913600 -"19970515093000",14.5,14.734375,14.484375,14.640625,41864800 -"19970514093000",14.796875,14.828125,14.453125,14.484375,60741600 -"19970513093000",14.796875,14.90625,14.609375,14.71875,49813600 -"19970512093000",14.6875,14.8125,14.625,14.765625,42974400 -"19970509093000",14.75,14.8125,14.46875,14.59375,58392000 -"19970508093000",14.40625,14.765625,14.390625,14.5625,53834400 -"19970507093000",14.546875,14.875,14.390625,14.4375,70532800 -"19970506093000",-1,-1,-1,-1,-1 -"19970505093000",14.953125,15.09375,14.4375,15,110850400 -"19970502093000",15.25,15.4375,14.8671875,15.09375,96188800 -"19970501093000",15.25,15.40625,14.90625,15.125,72317600 -"19970430093000",14.828125,15.328125,14.796875,15.1875,90204000 -"19970429093000",14.671875,14.890625,14.5625,14.875,73952000 -"19970428093000",14.21875,14.3828125,13.953125,14.359375,67224000 -"19970425093000",14.1875,14.421875,14.15625,14.203125,58565600 -"19970424093000",14.578125,14.734375,14.09375,14.265625,118175200 -"19970423093000",13.828125,14.46875,13.796875,14.390625,102813600 -"19970422093000",13.453125,13.8515625,13.4375,13.828125,82420800 -"19970421093000",13.375,13.984375,13.265625,13.453125,155708800 -"19970418093000",13,13.453125,12.953125,13.453125,231800800 -"19970417093000",12.3125,12.5,12.1875,12.265625,71829600 -"19970416093000",12.078125,12.3125,12.03125,12.28125,42710400 -"19970415093000",12.234375,12.375,11.984375,12.140625,84438400 -"19970414093000",11.84375,12.171875,11.671875,12.171875,59267200 -"19970411093000",11.9375,12.15625,11.8671875,11.875,60033600 -"19970410093000",12.21875,12.21875,11.9375,12.09375,67913600 -"19970409093000",12.390625,12.40625,12.21875,12.25,73760800 -"19970408093000",12.078125,12.28125,11.9375,12.28125,53331200 -"19970407093000",11.953125,12.203125,11.90625,12,76507200 -"19970404093000",11.71875,12.09375,11.71875,11.7734375,94963200 -"19970403093000",11.375,11.921875,11.328125,11.859375,92252800 -"19970402093000",11.609375,11.703125,11.375,11.5,63330400 -"19970401093000",11.265625,11.71875,11.21875,11.65625,86684000 -"19970331093000",11.640625,11.8125,11.40625,11.4609375,93826400 -"19970328093000",-1,-1,-1,-1,-1 -"19970327093000",11.5625,12.015625,11.5625,11.5625,93927200 -"19970326093000",11.34375,11.828125,11.328125,11.78125,81270400 -"19970325093000",11.328125,11.421875,11.109375,11.2890625,89712800 -"19970324093000",11.640625,11.6875,10.9375,11.296875,186269600 -"19970321093000",12.0625,12.140625,11.609375,11.75,85829600 -"19970320093000",12.078125,12.21875,11.921875,12,81410400 -"19970319093000",12.21875,12.28125,11.8671875,12.09375,111556800 -"19970318093000",12.578125,12.6015625,12.359375,12.453125,59007200 -"19970317093000",12.3125,12.59375,12.25,12.578125,83958400 -"19970314093000",12.46875,12.53125,12.359375,12.375,61327200 -"19970313093000",12.28125,12.515625,12.25,12.4375,45505600 -"19970312093000",12.21875,12.4375,12.21875,12.34375,43234400 -"19970311093000",12.453125,12.5703125,12.296875,12.296875,47577600 -"19970310093000",12.140625,12.515625,11.9921875,12.5,45997600 -"19970307093000",12.296875,12.4375,12.0625,12.09375,46032000 -"19970306093000",12.59375,12.609375,12.2148375,12.21875,57018400 -"19970305093000",12.4375,12.625,12.40625,12.609375,46393600 -"19970304093000",12.40625,12.515625,12.328125,12.390625,63920800 -"19970303093000",12.125,12.515625,12.078125,12.4375,53874400 -"19970228093000",12.015625,12.296875,11.9296875,12.1875,78412000 -"19970227093000",12.53125,12.53125,12,12.015625,56628800 -"19970226093000",12.4375,12.546875,12.296875,12.53125,48939200 -"19970225093000",12.5,12.625,12.359375,12.4375,63941600 -"19970224093000",11.78125,12.53125,11.75,12.515625,68599200 -"19970221093000",11.859375,11.921875,11.75,11.875,61131200 -"19970220093000",12.109375,12.15625,11.890625,11.90625,75395200 -"19970219093000",12.171875,12.265625,12.0625,12.1875,56383200 -"19970218093000",12.203125,12.234375,12.015625,12.171875,52546400 -"19970217093000",-1,-1,-1,-1,-1 -"19970214093000",12.421875,12.5625,12.203125,12.234375,57395200 -"19970213093000",12.5625,12.640625,12.421875,12.5,58277600 -"19970212093000",12.296875,12.5,12.1875,12.484375,72009600 -"19970211093000",12.28125,12.328125,11.890625,12.3125,88841600 -"19970210093000",12.59375,12.6875,12.203125,12.21875,66812800 -"19970207093000",12.296875,12.5625,12.1875,12.546875,62448000 -"19970206093000",12.28125,12.296875,12,12.140625,102122400 -"19970205093000",12.890625,12.9375,12.109375,12.296875,110099200 -"19970204093000",12.796875,12.90625,12.5625,12.890625,56464000 -"19970203093000",12.828125,12.921875,12.640625,12.796875,60804800 -"19970131093000",12.734375,12.90625,12.609375,12.75,86529600 -"19970130093000",12.28125,12.65625,12.25,12.640625,79946400 -"19970129093000",12.09375,12.171875,11.96875,12.15625,48933600 -"19970128093000",12.296875,12.34375,11.84375,11.953125,64657600 -"19970127093000",12.0625,12.171875,11.9375,12.015625,53263200 -"19970124093000",11.890625,12.21875,11.796875,11.9921875,89821600 -"19970123093000",12.265625,12.46875,11.8125,11.84375,105320000 -"19970122093000",11.890625,12.3125,11.828125,12.171875,129260800 -"19970121093000",11.328125,11.8828125,11.203125,11.875,114592000 -"19970120093000",10.875,11.609375,10.828125,11.34375,146220800 -"19970117093000",10.703125,10.96875,10.6875,10.890625,65368800 -"19970116093000",10.625,10.890625,10.625,10.75,58688000 -"19970115093000",10.703125,10.78125,10.546875,10.578125,53058400 -"19970114093000",10.53125,10.828125,10.53125,10.671875,63728000 -"19970113093000",10.640625,10.6875,10.4375,10.46875,50361600 -"19970110093000",10.25,10.546875,10.203125,10.53125,66578400 -"19970109093000",10.46875,10.46875,10.28125,10.296875,47764800 -"19970108093000",10.625,10.6523375,10.390625,10.421875,50593600 -"19970107093000",10.5625,10.640625,10.421875,10.625,36880800 -"19970106093000",10.578125,10.65625,10.390625,10.546875,55948800 -"19970103093000",10.28125,10.59375,10.25,10.578125,44124000 -"19970102093000",10.390625,10.390625,10.09375,10.203125,54419200 -"19970101093000",-1,-1,-1,-1,-1 -"19961231093000",10.5,10.53125,10.3125,10.328125,34367200 -"19961230093000",10.671875,10.703125,10.4375,10.4375,27279200 -"19961227093000",10.6875,10.71875,10.5,10.53125,19079200 -"19961226093000",10.65625,10.765625,10.640625,10.6875,27905600 -"19961225093000",-1,-1,-1,-1,-1 -"19961224093000",10.515625,10.640625,10.390625,10.609375,16246400 -"19961223093000",10.515625,10.59375,10.359375,10.46875,36892800 -"19961220093000",10.6875,10.703125,10.421875,10.453125,90414400 -"19961219093000",10.5,10.640625,10.375,10.609375,94609600 -"19961218093000",10.25,10.34375,10,10.328125,61796800 -"19961217093000",9.578125,10.015625,9.546875,9.984375,68952800 -"19961216093000",10.03125,10.09375,9.5625,9.59375,64883200 -"19961213093000",10.140625,10.25,9.9023375,10,74544000 -"19961212093000",10.625,10.65625,10.125,10.140625,78272800 -"19961211093000",10.125,10.453125,10.015625,10.421875,113576000 -"19961210093000",10.546875,10.5703125,10.21875,10.234375,125725600 -"19961209093000",9.796875,10.234375,9.75,10.21875,94718400 -"19961206093000",9.3125,9.65625,9.265625,9.5546875,110238400 -"19961205093000",9.5859375,9.7109375,9.4921875,9.5625,74950400 -"19961204093000",9.6953125,9.703125,9.5078125,9.578125,102542400 -"19961203093000",9.8984375,9.96875,9.6640625,9.6679625,77563200 -"19961202093000",9.84375,9.859375,9.703125,9.859375,64502400 -"19961129093000",9.71875,9.8203125,9.71875,9.8046875,17152000 -"19961128093000",-1,-1,-1,-1,-1 -"19961127093000",9.6328125,9.734375,9.609375,9.71875,44446400 -"19961126093000",9.625,9.7109375,9.5234375,9.609375,108238400 -"19961125093000",9.4453125,9.6015625,9.40625,9.59375,75131200 -"19961122093000",9.421875,9.53125,9.3359375,9.40625,94424000 -"19961121093000",9.65625,9.6640625,9.375,9.3984375,130718400 -"19961120093000",9.75,9.875,9.578125,9.578125,123857600 -"19961119093000",9.40625,9.7421875,9.390625,9.7421875,104739200 -"19961118093000",9.3359375,9.46875,9.2890625,9.3984375,98585600 -"19961115093000",9.421875,9.4296875,9.2109375,9.3125,104041600 -"19961114093000",9.078125,9.3515625,9.078125,9.3515625,114969600 -"19961113093000",8.9765625,9.109375,8.9453125,9.0625,90409600 -"19961112093000",9,9.1171875,8.84375,8.859375,81156800 -"19961111093000",8.9609375,9.046875,8.9375,8.9765625,38593600 -"19961108093000",8.9609375,8.96875,8.84375,8.96875,67369600 -"19961107093000",9.03125,9.1328125,8.9453125,8.96875,76742400 -"19961106093000",8.828125,9.03125,8.8125,9.03125,71438400 -"19961105093000",8.65625,8.84375,8.644525,8.84375,86417600 -"19961104093000",8.578125,8.6484375,8.546875,8.625,36006400 -"19961101093000",8.578125,8.671875,8.53125,8.5859375,56531200 -"19961031093000",8.5234375,8.5859375,8.5078125,8.578125,37028800 -"19961030093000",8.4609375,8.5625,8.4296875,8.515625,60526400 -"19961029093000",8.5546875,8.5859375,8.4296875,8.4609375,66756800 -"19961028093000",8.5429625,8.6015625,8.515625,8.5390625,51241600 -"19961025093000",8.5390625,8.6171875,8.5078125,8.5273375,53084800 -"19961024093000",8.4296875,8.5859375,8.3671875,8.5390625,81417600 -"19961023093000",8.2890625,8.421875,8.234375,8.40625,67408000 -"19961022093000",8.3203125,8.3359375,8.203125,8.28125,113806400 -"19961021093000",8.421875,8.5,8.34375,8.375,71401600 -"19961018093000",8.375,8.4375,8.34765,8.4375,69646400 -"19961017093000",8.640625,8.6875,8.46875,8.46875,49097600 -"19961016093000",8.671875,8.6835875,8.5625,8.625,36427200 -"19961015093000",8.671875,8.6953125,8.5859375,8.6796875,61206400 -"19961014093000",8.5859375,8.6328125,8.5234375,8.5390625,36091200 -"19961011093000",8.4140625,8.578125,8.390625,8.5703125,36523200 -"19961010093000",8.359375,8.5078125,8.3359375,8.359375,51739200 -"19961009093000",8.5,8.5078125,8.328125,8.40625,64960000 -"19961008093000",8.609375,8.609375,8.4375,8.4609375,48465600 -"19961007093000",8.5234375,8.6328125,8.4921875,8.59375,42432000 -"19961004093000",8.4140625,8.5390625,8.390625,8.5234375,45166400 -"19961003093000",8.421875,8.4453125,8.3515625,8.375,58294400 -"19961002093000",8.3046875,8.484375,8.2734375,8.421875,68760000 -"19961001093000",8.234375,8.3671875,8.1796875,8.2578125,69124800 -"19960930093000",8.34375,8.4296875,8.234375,8.2421875,89574400 -"19960927093000",8.28125,8.453125,8.203125,8.3984375,98372800 -"19960926093000",8.484375,8.5078125,8.234375,8.25,92604800 -"19960925093000",8.59375,8.6171875,8.4609375,8.4765625,44067200 -"19960924093000",8.59375,8.6484375,8.5078125,8.5546875,72520000 -"19960923093000",8.6015625,8.6328125,8.515625,8.609375,46385600 -"19960920093000",8.5625,8.6640625,8.4921875,8.6328125,104849600 -"19960919093000",8.53125,8.640625,8.484375,8.609375,75912000 -"19960918093000",8.375,8.6171875,8.328125,8.53125,86049600 -"19960917093000",8.3046875,8.4140625,8.265625,8.3671875,75624000 -"19960916093000",8.1953125,8.3203125,8.1875,8.21875,62409600 -"19960913093000",8.1015625,8.2109375,8.0546875,8.1875,80136000 -"19960912093000",7.84375,8.09375,7.8242125,8.019525,95944000 -"19960911093000",7.7460875,7.84375,7.7265625,7.8203125,36387200 -"19960910093000",7.796875,7.8203125,7.7265625,7.7734375,38904000 -"19960909093000",7.65625,7.8125,7.640625,7.8046875,41747200 -"19960906093000",7.625,7.671875,7.6015625,7.65625,41921600 -"19960905093000",7.671875,7.6875,7.59375,7.59375,40372800 -"19960904093000",7.7109375,7.7265625,7.6835875,7.7109375,27126400 -"19960903093000",7.625,7.7109375,7.5390625,7.7109375,48524800 -"19960902093000",-1,-1,-1,-1,-1 -"19960830093000",7.765625,7.765625,7.65625,7.65625,28088000 -"19960829093000",7.828125,7.828125,7.7265625,7.7578125,34182400 -"19960828093000",7.8125,7.859375,7.8046875,7.8515625,32070400 -"19960827093000",7.6875,7.796875,7.6875,7.796875,28038400 -"19960826093000",7.6875,7.734375,7.671875,7.6796875,31952000 -"19960823093000",7.8046875,7.8125,7.703125,7.703125,44006400 -"19960822093000",7.7578125,7.8203125,7.71875,7.8125,50236800 -"19960821093000",7.6484375,7.71875,7.609375,7.71875,49345600 -"19960820093000",7.734375,7.7578125,7.703125,7.7109375,25678400 -"19960819093000",7.7421875,7.7578125,7.640625,7.71875,43131200 -"19960816093000",7.8203125,7.828125,7.7265625,7.7265625,47598400 -"19960815093000",7.796875,7.859375,7.7734375,7.8203125,35556800 -"19960814093000",7.7421875,7.8203125,7.734375,7.8046875,52032000 -"19960813093000",7.8125,7.8671875,7.7109375,7.71875,72508800 -"19960812093000",7.765625,7.8828125,7.75,7.828125,66187200 -"19960809093000",7.796875,7.84375,7.7421875,7.78125,44313600 -"19960808093000",7.7578125,7.8671875,7.734375,7.828125,54379200 -"19960807093000",7.7734375,7.8203125,7.6796875,7.796875,76790400 -"19960806093000",7.6015625,7.7578125,7.5546875,7.75,67388800 -"19960805093000",7.71875,7.734375,7.578125,7.609375,55072000 -"19960802093000",7.6328125,7.7421875,7.5390625,7.7109375,109289600 -"19960801093000",7.3671875,7.5546875,7.3359375,7.5390625,96025600 -"19960731093000",7.4375,7.4765625,7.3515625,7.3671875,56320000 -"19960730093000",7.3671875,7.421875,7.2578125,7.4140625,66976000 -"19960729093000",7.453125,7.4921875,7.296875,7.3046875,56748800 -"19960726093000",7.46875,7.46875,7.390625,7.4453125,59304000 -"19960725093000",7.25,7.421875,7.1953125,7.40625,100920000 -"19960724093000",6.84375,7.234375,6.84375,7.171875,192176000 -"19960723093000",7.5,7.5078125,6.890625,7.0078125,257678400 -"19960722093000",7.5625,7.59375,7.3671875,7.484375,144475200 -"19960719093000",7.359375,7.6015625,7.359375,7.5605375,99208000 -"19960718093000",7.328125,7.5,7.2421875,7.4921875,98537600 -"19960717093000",7.359375,7.3828125,7.2265625,7.3203125,126272000 -"19960716093000",6.890625,7.2265625,6.71875,7.2109375,182116800 -"19960715093000",7.0234375,7.109375,6.8671875,6.9140625,111832000 -"19960712093000",7.1992125,7.1992125,6.9042875,7.0234375,139478400 -"19960711093000",7.390625,7.3984375,7.109375,7.15625,140915200 -"19960710093000",7.5,7.5,7.3828125,7.46875,77980800 -"19960709093000",7.5546875,7.5859375,7.5,7.5,32316800 -"19960708093000",7.40625,7.546875,7.3828125,7.519525,64440000 -"19960705093000",7.421875,7.5234375,7.3984375,7.3984375,35331200 -"19960704093000",-1,-1,-1,-1,-1 -"19960703093000",7.6015625,7.6796875,7.5390625,7.5703125,44243200 -"19960702093000",7.6484375,7.6640625,7.578125,7.6015625,38548800 -"19960701093000",7.515625,7.65625,7.5078125,7.644525,47859200 -"19960628093000",7.53125,7.5625,7.4453125,7.5078125,51960000 -"19960627093000",7.53125,7.5625,7.4375,7.4960875,77582400 -"19960626093000",7.6171875,7.625,7.4375,7.53125,71457600 -"19960625093000",7.765625,7.765625,7.5859375,7.625,41145600 -"19960624093000",7.75,7.8203125,7.6875,7.7578125,48102400 -"19960621093000",7.6484375,7.7578125,7.59375,7.7304625,56806400 -"19960620093000",7.625,7.6542875,7.4375,7.609375,102228800 -"19960619093000",7.65625,7.6953125,7.5859375,7.609375,73409600 -"19960618093000",7.78125,7.78125,7.625,7.6484375,74585600 -"19960617093000",7.6953125,7.8125,7.6484375,7.7890625,57499200 -"19960614093000",7.796875,7.8125,7.6796875,7.6875,55944000 -"19960613093000",7.8203125,7.8671875,7.734375,7.7890625,62577600 -"19960612093000",7.6796875,7.8359375,7.671875,7.8125,88844800 -"19960611093000",7.546875,7.703125,7.5390625,7.6328125,65259200 -"19960610093000",7.5625,7.578125,7.4980375,7.5390625,45819200 -"19960607093000",7.3515625,7.578125,7.3515625,7.578125,70198400 -"19960606093000",7.609375,7.6875,7.484375,7.488275,88136000 -"19960605093000",7.375,7.578125,7.3671875,7.5546875,50968000 -"19960604093000",7.4140625,7.4296875,7.265625,7.3671875,65854400 -"19960603093000",7.421875,7.46875,7.3828125,7.3984375,31684800 -"19960531093000",7.41015,7.4609375,7.375,7.421875,40259200 -"19960530093000",7.328125,7.390625,7.2890625,7.3828125,33824000 -"19960529093000",7.3359375,7.390625,7.2890625,7.3203125,33569600 -"19960528093000",7.421875,7.4453125,7.3203125,7.328125,43376000 -"19960527093000",-1,-1,-1,-1,-1 -"19960524093000",7.40625,7.4375,7.390625,7.40625,26443200 -"19960523093000",7.3046875,7.4453125,7.3046875,7.40625,51976000 -"19960522093000",7.1875,7.328125,7.1640625,7.3046875,45646400 -"19960521093000",7.296875,7.3046875,7.1953125,7.1953125,42113600 -"19960520093000",7.3359375,7.3671875,7.2890625,7.296875,38457600 -"19960517093000",7.3671875,7.375,7.2734375,7.3125,35392000 -"19960516093000",7.25,7.3359375,7.2265625,7.3203125,67092800 -"19960515093000",7.4375,7.484375,7.3359375,7.3515625,56323200 -"19960514093000",7.453125,7.5,7.3886625,7.4375,76832000 Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/examples/data/s1045.ima and /tmp/GJbvHcIw6l/matplotlib-1.0.1/examples/data/s1045.ima differ diff -Nru matplotlib-0.99.3/examples/event_handling/close_event.py matplotlib-1.0.1/examples/event_handling/close_event.py --- matplotlib-0.99.3/examples/event_handling/close_event.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/examples/event_handling/close_event.py 2010-07-07 01:41:54.000000000 +0000 @@ -0,0 +1,10 @@ +import matplotlib.pyplot as plt + +def handle_close(evt): + print 'Closed Figure!' + +fig = plt.figure() +fig.canvas.mpl_connect('close_event', handle_close) + +plt.text(0.35, 0.5, 'Close Me!', dict(size=30)) +plt.show() diff -Nru matplotlib-0.99.3/examples/event_handling/legend_picking.py matplotlib-1.0.1/examples/event_handling/legend_picking.py --- matplotlib-0.99.3/examples/event_handling/legend_picking.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/examples/event_handling/legend_picking.py 2010-07-07 01:41:54.000000000 +0000 @@ -0,0 +1,46 @@ +""" +Enable picking on the legend to toggle the legended line on and off +""" +import numpy as np +import matplotlib.pyplot as plt + +t = np.arange(0.0, 0.2, 0.1) +y1 = 2*np.sin(2*np.pi*t) +y2 = 4*np.sin(2*np.pi*2*t) + +fig = plt.figure() +ax = fig.add_subplot(111) +ax.set_title('Click on legend line to toggle line on/off') +line1, = ax.plot(t, y1, lw=2, color='red', label='1 HZ') +line2, = ax.plot(t, y2, lw=2, color='blue', label='2 HZ') +leg = ax.legend(loc='upper left', fancybox=True, shadow=True) +leg.get_frame().set_alpha(0.4) + + +# we will set up a dict mapping legend line to orig line, and enable +# picking on the legend line +lines = [line1, line2] +lined = dict() +for legline, origline in zip(leg.get_lines(), lines): + legline.set_picker(5) # 5 pts tolerance + lined[legline] = origline + + +def onpick(event): + # on the pick event, find the orig line corresponding to the + # legend proxy line, and toggle the visibilit + legline = event.artist + origline = lined[legline] + vis = not origline.get_visible() + origline.set_visible(vis) + # Change the alpha on the line in the legend so we can see what lines + # have been toggled + if vis: + legline.set_alpha(1.0) + else: + legline.set_alpha(0.2) + fig.canvas.draw() + +fig.canvas.mpl_connect('pick_event', onpick) + +plt.show() diff -Nru matplotlib-0.99.3/examples/event_handling/pipong.py matplotlib-1.0.1/examples/event_handling/pipong.py --- matplotlib-0.99.3/examples/event_handling/pipong.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/examples/event_handling/pipong.py 2010-07-07 01:41:54.000000000 +0000 @@ -12,17 +12,17 @@ 'e' up 'i' 'd' down 'k' -press 't' -- close these instructions +press 't' -- close these instructions (animation will be much faster) -press 'a' -- add a puck -press 'A' -- remove a puck -press '1' -- slow down all pucks -press '2' -- speed up all pucks -press '3' -- slow down distractors -press '4' -- speed up distractors +press 'a' -- add a puck +press 'A' -- remove a puck +press '1' -- slow down all pucks +press '2' -- speed up all pucks +press '3' -- slow down distractors +press '4' -- speed up distractors press ' ' -- reset the first puck -press 'n' -- toggle distractors on/off -press 'g' -- toggle the game on/off +press 'n' -- toggle distractors on/off +press 'g' -- toggle the game on/off """ @@ -56,7 +56,7 @@ def _reset(self,pad): self.x = pad.x + pad.xoffset if pad.y < 0: - self.y = pad.y + pad.yoffset + self.y = pad.y + pad.yoffset else: self.y = pad.y - pad.yoffset self.vx = pad.x - self.x @@ -84,7 +84,7 @@ self._reset(pads[1]) return True if self.y < -1+fudge or self.y > 1-fudge: - self.vy *= -1.0 + self.vy *= -1.0 # add some randomness, just to make it interesting self.vy -= (randn()/300.0 + 1/300.0) * np.sign(self.vy) self._speedlimit() @@ -106,7 +106,7 @@ if self.vy < -self.vmax: self.vy = -self.vmax -class Game(object): +class Game(object): def __init__(self, ax): # create the initial line @@ -137,7 +137,7 @@ self.pads = [] self.pads.append( Pad(pA,0,padAy)) self.pads.append( Pad(pB,padBx,padBy,'r')) - self.pucks =[] + self.pucks =[] self.i = self.ax.annotate(instructions,(.5,0.5), name='monospace', verticalalignment='center', @@ -180,8 +180,8 @@ for puck in self.pucks: if puck.update(self.pads): # we only get here if someone scored - self.pads[0].disp.set_label(" "+ str(self.pads[0].score)) - self.pads[1].disp.set_label(" "+ str(self.pads[1].score)) + self.pads[0].disp.set_label(" "+ str(self.pads[0].score)) + self.pads[1].disp.set_label(" "+ str(self.pads[1].score)) self.ax.legend(loc='center') self.leg = self.ax.get_legend() #self.leg.draw_frame(False) #don't draw the legend border @@ -189,7 +189,7 @@ plt.setp(self.leg.get_texts(),fontweight='bold',fontsize='xx-large') self.leg.get_frame().set_facecolor('0.2') self.background = None - self.ax.draw() + self.ax.figure.canvas.draw() return True puck.disp.set_offsets([puck.x,puck.y]) self.ax.draw_artist(puck.disp) @@ -229,7 +229,7 @@ self.pads[1].y -= .1 if self.pads[1].y < -1: self.pads[1].y = -1 - + if event.key == 'a': self.pucks.append(Puck(self.puckdisp,self.pads[randint(2)],self.ax.bbox)) if event.key == 'A' and len(self.pucks): @@ -242,7 +242,7 @@ if event.key == '2': for p in self.pucks: p._faster() - + if event.key == 'n': self.distract = not self.distract @@ -254,4 +254,4 @@ self.inst = not self.inst self.i.set_visible(self.i.get_visible()) if event.key == 'q': - plt.close() + plt.close() diff -Nru matplotlib-0.99.3/examples/event_handling/pong_gtk.py matplotlib-1.0.1/examples/event_handling/pong_gtk.py --- matplotlib-0.99.3/examples/event_handling/pong_gtk.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/examples/event_handling/pong_gtk.py 2010-07-07 01:41:54.000000000 +0000 @@ -12,7 +12,7 @@ import numpy as np import matplotlib.pyplot as plt -import pipong +import pipong from numpy.random import randn, randint @@ -22,7 +22,8 @@ def start_anim(event): - gobject.idle_add(animation.draw,animation) +# gobject.idle_add(animation.draw,animation) + gobject.timeout_add(10,animation.draw,animation) canvas.mpl_disconnect(start_anim.cid) animation = pipong.Game(ax) diff -Nru matplotlib-0.99.3/examples/event_handling/pong_qt.py matplotlib-1.0.1/examples/event_handling/pong_qt.py --- matplotlib-0.99.3/examples/event_handling/pong_qt.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/examples/event_handling/pong_qt.py 2010-07-07 01:41:54.000000000 +0000 @@ -18,7 +18,7 @@ import matplotlib.pyplot as plt import numpy as np import time -import pipong +import pipong from numpy.random import randn, randint class BlitQT(QObject): @@ -36,7 +36,7 @@ app = BlitQT() # for profiling app.tstart = time.time() -app.startTimer(0) +app.startTimer(10) plt.show() print 'FPS:' , app.animation.cnt/(time.time()-app.tstart) diff -Nru matplotlib-0.99.3/examples/event_handling/resample.py matplotlib-1.0.1/examples/event_handling/resample.py --- matplotlib-0.99.3/examples/event_handling/resample.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/examples/event_handling/resample.py 2010-07-07 01:41:54.000000000 +0000 @@ -0,0 +1,53 @@ +import numpy as np +import matplotlib.pyplot as plt +from scikits.audiolab import wavread + +# A class that will downsample the data and recompute when zoomed. +class DataDisplayDownsampler(object): + def __init__(self, xdata, ydata): + self.origYData = ydata + self.origXData = xdata + self.numpts = 3000 + self.delta = xdata[-1] - xdata[0] + + def resample(self, xstart, xend): + # Very simple downsampling that takes the points within the range + # and picks every Nth point + mask = (self.origXData > xstart) & (self.origXData < xend) + xdata = self.origXData[mask] + ratio = int(xdata.size / self.numpts) + 1 + xdata = xdata[::ratio] + + ydata = self.origYData[mask] + ydata = ydata[::ratio] + + return xdata, ydata + + def update(self, ax): + # Update the line + lims = ax.viewLim + if np.abs(lims.width - self.delta) > 1e-8: + self.delta = lims.width + xstart, xend = lims.intervalx + self.line.set_data(*self.downsample(xstart, xend)) + ax.figure.canvas.draw_idle() + +# Read data +data = wavread('/usr/share/sounds/purple/receive.wav')[0] +ydata = np.tile(data[:, 0], 100) +xdata = np.arange(ydata.size) + +d = DataDisplayDownsampler(xdata, ydata) + +fig = plt.figure() +ax = fig.add_subplot(1, 1, 1) + +#Hook up the line +xdata, ydata = d.downsample(xdata[0], xdata[-1]) +d.line, = ax.plot(xdata, ydata) +ax.set_autoscale_on(False) # Otherwise, infinite loop + +# Connect for changing the view limits +ax.callbacks.connect('xlim_changed', d.update) + +plt.show() diff -Nru matplotlib-0.99.3/examples/event_handling/timers.py matplotlib-1.0.1/examples/event_handling/timers.py --- matplotlib-0.99.3/examples/event_handling/timers.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/examples/event_handling/timers.py 2010-07-07 01:41:54.000000000 +0000 @@ -0,0 +1,29 @@ +# Simple example of using general timer objects. This is used to update +# the time placed in the title of the figure. +import matplotlib.pyplot as plt +import numpy as np +from datetime import datetime + +def update_title(axes): + axes.set_title(datetime.now()) + axes.figure.canvas.draw() + +fig = plt.figure() +ax = fig.add_subplot(1, 1, 1) + +x = np.linspace(-3, 3) +ax.plot(x, x*x) + +# Create a new timer object. Set the interval 500 milliseconds (1000 is default) +# and tell the timer what function should be called. +timer = fig.canvas.new_timer(interval=100) +timer.add_callback(update_title, ax) +timer.start() + +#Or could start the timer on first figure draw +#def start_timer(evt): +# timer.start() +# fig.canvas.mpl_disconnect(drawid) +#drawid = fig.canvas.mpl_connect('draw_event', start_timer) + +plt.show() diff -Nru matplotlib-0.99.3/examples/event_handling/viewlims.py matplotlib-1.0.1/examples/event_handling/viewlims.py --- matplotlib-0.99.3/examples/event_handling/viewlims.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/examples/event_handling/viewlims.py 2010-07-07 01:41:54.000000000 +0000 @@ -40,7 +40,7 @@ ax.set_autoscale_on(False) # Otherwise, infinite loop #Get the number of points from the number of pixels in the window - dims = ax.axesFrame.get_window_extent().bounds + dims = ax.axesPatch.get_window_extent().bounds self.width = int(dims[2] + 0.5) self.height = int(dims[2] + 0.5) diff -Nru matplotlib-0.99.3/examples/misc/contour_manual.py matplotlib-1.0.1/examples/misc/contour_manual.py --- matplotlib-0.99.3/examples/misc/contour_manual.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/examples/misc/contour_manual.py 2010-07-07 01:41:55.000000000 +0000 @@ -0,0 +1,50 @@ +""" +Example of displaying your own contour lines and polygons using ContourSet. +""" +import matplotlib.pyplot as plt +from matplotlib.contour import ContourSet +import matplotlib.cm as cm + +# Contour lines for each level are a list/tuple of polygons. +lines0 = [ [[0,0],[0,4]] ] +lines1 = [ [[2,0],[1,2],[1,3]] ] +lines2 = [ [[3,0],[3,2]], [[3,3],[3,4]] ] # Note two lines. + +# Filled contours between two levels are also a list/tuple of polygons. +# Points can be ordered clockwise or anticlockwise. +filled01 = [ [[0,0],[0,4],[1,3],[1,2],[2,0]] ] +filled12 = [ [[2,0],[3,0],[3,2],[1,3],[1,2]], # Note two polygons. + [[1,4],[3,4],[3,3]] ] + + +plt.figure() + +# Filled contours using filled=True. +cs = ContourSet(plt.gca(), [0,1,2], [filled01, filled12], filled=True, cmap=cm.bone) +cbar = plt.colorbar(cs) + +# Contour lines (non-filled). +lines = ContourSet(plt.gca(), [0,1,2], [lines0, lines1, lines2], cmap=cm.cool, + linewidths=3) +cbar.add_lines(lines) + +plt.axis([-0.5, 3.5, -0.5, 4.5]) +plt.title('User-specified contours') + + + +# Multiple filled contour lines can be specified in a single list of polygon +# vertices along with a list of vertex kinds (code types) as described in the +# Path class. This is particularly useful for polygons with holes. +# Here a code type of 1 is a MOVETO, and 2 is a LINETO. + +plt.figure() +filled01 = [ [[0,0],[3,0],[3,3],[0,3],[1,1],[1,2],[2,2],[2,1]] ] +kinds01 = [ [1,2,2,2,1,2,2,2] ] +cs = ContourSet(plt.gca(), [0,1], [filled01], [kinds01], filled=True) +cbar = plt.colorbar(cs) + +plt.axis([-0.5, 3.5, -0.5, 3.5]) +plt.title('User specified filled contours with holes') + +plt.show() \ No newline at end of file diff -Nru matplotlib-0.99.3/examples/misc/rec_groupby_demo.py matplotlib-1.0.1/examples/misc/rec_groupby_demo.py --- matplotlib-0.99.3/examples/misc/rec_groupby_demo.py 2009-07-31 15:14:51.000000000 +0000 +++ matplotlib-1.0.1/examples/misc/rec_groupby_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,8 +1,10 @@ import numpy as np import matplotlib.mlab as mlab +import matplotlib.cbook as cbook - -r = mlab.csv2rec('../data/aapl.csv') +datafile = cbook.get_sample_data('aapl.csv', asfileobj=False) +print 'loading', datafile +r = mlab.csv2rec(datafile) r.sort() def daily_return(prices): diff -Nru matplotlib-0.99.3/examples/misc/rec_join_demo.py matplotlib-1.0.1/examples/misc/rec_join_demo.py --- matplotlib-0.99.3/examples/misc/rec_join_demo.py 2009-07-31 15:14:51.000000000 +0000 +++ matplotlib-1.0.1/examples/misc/rec_join_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,8 +1,11 @@ import numpy as np import matplotlib.mlab as mlab +import matplotlib.cbook as cbook +datafile = cbook.get_sample_data('aapl.csv', asfileobj=False) +print 'loading', datafile +r = mlab.csv2rec(datafile) -r = mlab.csv2rec('../data/aapl.csv') r.sort() r1 = r[-10:] diff -Nru matplotlib-0.99.3/examples/misc/sample_data_demo.py matplotlib-1.0.1/examples/misc/sample_data_demo.py --- matplotlib-0.99.3/examples/misc/sample_data_demo.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/examples/misc/sample_data_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -0,0 +1,12 @@ +""" +Grab mpl data from the ~/.matplotlib/sample_data cache if it exists, else +fetch it from svn and cache it +""" +import matplotlib.cbook as cbook +import matplotlib.pyplot as plt +fname = cbook.get_sample_data('lena.png', asfileobj=False) + +print 'fname', fname +im = plt.imread(fname) +plt.imshow(im) +plt.show() diff -Nru matplotlib-0.99.3/examples/misc/sample_data_test.py matplotlib-1.0.1/examples/misc/sample_data_test.py --- matplotlib-0.99.3/examples/misc/sample_data_test.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/examples/misc/sample_data_test.py 2010-07-07 01:41:55.000000000 +0000 @@ -0,0 +1,26 @@ +""" +Demonstrate how get_sample_data works with svn revisions in the data. + + svn co https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/trunk/sample_data + +and edit testdata.csv to add a new row. After committing the changes, +when you rerun this script you will get the updated data (and the new +svn version will be cached in ~/.matplotlib/sample_data) +""" + +import matplotlib.mlab as mlab +import matplotlib.cbook as cbook + +# get the file handle to the cached data and print the contents +datafile = 'testdir/subdir/testsub.csv' +fh = cbook.get_sample_data(datafile) +print fh.read() + +# make sure we can read it using csv2rec +fh.seek(0) +r = mlab.csv2rec(fh) + +print mlab.rec2txt(r) + +fh.close() + diff -Nru matplotlib-0.99.3/examples/mplot3d/2dcollections3d_demo.py matplotlib-1.0.1/examples/mplot3d/2dcollections3d_demo.py --- matplotlib-0.99.3/examples/mplot3d/2dcollections3d_demo.py 2009-08-22 21:06:13.000000000 +0000 +++ matplotlib-1.0.1/examples/mplot3d/2dcollections3d_demo.py 2010-08-03 14:22:42.000000000 +0000 @@ -3,7 +3,7 @@ import matplotlib.pyplot as plt fig = plt.figure() -ax = Axes3D(fig) +ax = fig.gca(projection='3d') x = np.linspace(0, 1, 100) y = np.sin(x * 2 * np.pi) / 2 + 0.5 diff -Nru matplotlib-0.99.3/examples/mplot3d/bars3d_demo.py matplotlib-1.0.1/examples/mplot3d/bars3d_demo.py --- matplotlib-0.99.3/examples/mplot3d/bars3d_demo.py 2009-08-22 21:06:13.000000000 +0000 +++ matplotlib-1.0.1/examples/mplot3d/bars3d_demo.py 2010-08-03 14:22:42.000000000 +0000 @@ -3,11 +3,16 @@ import numpy as np fig = plt.figure() -ax = Axes3D(fig) +ax = fig.add_subplot(111, projection='3d') for c, z in zip(['r', 'g', 'b', 'y'], [30, 20, 10, 0]): xs = np.arange(20) ys = np.random.rand(20) - ax.bar(xs, ys, zs=z, zdir='y', color=c, alpha=0.8) + + # You can provide either a single color or an array. To demonstrate this, + # the first bar of each set will be colored cyan. + cs = [c] * len(xs) + cs[0] = 'c' + ax.bar(xs, ys, zs=z, zdir='y', color=cs, alpha=0.8) ax.set_xlabel('X') ax.set_ylabel('Y') diff -Nru matplotlib-0.99.3/examples/mplot3d/contour3d_demo2.py matplotlib-1.0.1/examples/mplot3d/contour3d_demo2.py --- matplotlib-0.99.3/examples/mplot3d/contour3d_demo2.py 2009-08-22 21:06:13.000000000 +0000 +++ matplotlib-1.0.1/examples/mplot3d/contour3d_demo2.py 2010-08-03 14:22:42.000000000 +0000 @@ -2,7 +2,7 @@ import matplotlib.pyplot as plt fig = plt.figure() -ax = axes3d.Axes3D(fig) +ax = fig.gca(projection='3d') X, Y, Z = axes3d.get_test_data(0.05) cset = ax.contour(X, Y, Z, 16, extend3d=True) ax.clabel(cset, fontsize=9, inline=1) diff -Nru matplotlib-0.99.3/examples/mplot3d/contour3d_demo3.py matplotlib-1.0.1/examples/mplot3d/contour3d_demo3.py --- matplotlib-0.99.3/examples/mplot3d/contour3d_demo3.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/examples/mplot3d/contour3d_demo3.py 2010-08-03 14:22:42.000000000 +0000 @@ -0,0 +1,20 @@ +from mpl_toolkits.mplot3d import axes3d +import matplotlib.pyplot as plt + +fig = plt.figure() +ax = fig.gca(projection='3d') +X, Y, Z = axes3d.get_test_data(0.05) +ax.plot_surface(X, Y, Z, rstride=8, cstride=8, alpha=0.3) +cset = ax.contour(X, Y, Z, zdir='z', offset=-100) +cset = ax.contour(X, Y, Z, zdir='x', offset=-40) +cset = ax.contour(X, Y, Z, zdir='y', offset=40) + +ax.set_xlabel('X') +ax.set_xlim3d(-40, 40) +ax.set_ylabel('Y') +ax.set_ylim3d(-40, 40) +ax.set_zlabel('Z') +ax.set_zlim3d(-100, 100) + +plt.show() + diff -Nru matplotlib-0.99.3/examples/mplot3d/contour3d_demo.py matplotlib-1.0.1/examples/mplot3d/contour3d_demo.py --- matplotlib-0.99.3/examples/mplot3d/contour3d_demo.py 2009-08-22 21:06:13.000000000 +0000 +++ matplotlib-1.0.1/examples/mplot3d/contour3d_demo.py 2010-08-03 14:22:42.000000000 +0000 @@ -2,7 +2,7 @@ import matplotlib.pyplot as plt fig = plt.figure() -ax = axes3d.Axes3D(fig) +ax = fig.add_subplot(111, projection='3d') X, Y, Z = axes3d.get_test_data(0.05) cset = ax.contour(X, Y, Z) ax.clabel(cset, fontsize=9, inline=1) diff -Nru matplotlib-0.99.3/examples/mplot3d/contourf3d_demo.py matplotlib-1.0.1/examples/mplot3d/contourf3d_demo.py --- matplotlib-0.99.3/examples/mplot3d/contourf3d_demo.py 2009-08-22 21:06:13.000000000 +0000 +++ matplotlib-1.0.1/examples/mplot3d/contourf3d_demo.py 2010-08-03 14:22:42.000000000 +0000 @@ -2,7 +2,7 @@ import matplotlib.pyplot as plt fig = plt.figure() -ax = axes3d.Axes3D(fig) +ax = fig.gca(projection='3d') X, Y, Z = axes3d.get_test_data(0.05) cset = ax.contourf(X, Y, Z) ax.clabel(cset, fontsize=9, inline=1) diff -Nru matplotlib-0.99.3/examples/mplot3d/hist3d_demo.py matplotlib-1.0.1/examples/mplot3d/hist3d_demo.py --- matplotlib-0.99.3/examples/mplot3d/hist3d_demo.py 2009-08-22 21:06:13.000000000 +0000 +++ matplotlib-1.0.1/examples/mplot3d/hist3d_demo.py 2010-08-03 14:22:42.000000000 +0000 @@ -3,7 +3,7 @@ import numpy as np fig = plt.figure() -ax = Axes3D(fig) +ax = fig.add_subplot(111, projection='3d') x, y = np.random.rand(2, 100) * 4 hist, xedges, yedges = np.histogram2d(x, y, bins=4) @@ -16,7 +16,8 @@ dx = 0.5 * np.ones_like(zpos) dy = dx.copy() dz = hist.flatten() -ax.bar3d(xpos, ypos, zpos, dx, dy, dz, color='b') + +ax.bar3d(xpos, ypos, zpos, dx, dy, dz, color='b', zsort='average') plt.show() diff -Nru matplotlib-0.99.3/examples/mplot3d/lines3d_demo.py matplotlib-1.0.1/examples/mplot3d/lines3d_demo.py --- matplotlib-0.99.3/examples/mplot3d/lines3d_demo.py 2009-08-22 21:06:13.000000000 +0000 +++ matplotlib-1.0.1/examples/mplot3d/lines3d_demo.py 2010-08-03 14:22:42.000000000 +0000 @@ -6,7 +6,7 @@ mpl.rcParams['legend.fontsize'] = 10 fig = plt.figure() -ax = Axes3D(fig) +ax = fig.gca(projection='3d') theta = np.linspace(-4 * np.pi, 4 * np.pi, 100) z = np.linspace(-2, 2, 100) r = z**2 + 1 diff -Nru matplotlib-0.99.3/examples/mplot3d/mixed_subplots_demo.py matplotlib-1.0.1/examples/mplot3d/mixed_subplots_demo.py --- matplotlib-0.99.3/examples/mplot3d/mixed_subplots_demo.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/examples/mplot3d/mixed_subplots_demo.py 2010-08-03 14:22:42.000000000 +0000 @@ -0,0 +1,48 @@ +""" +Demonstrate the mixing of 2d and 3d subplots +""" +from mpl_toolkits.mplot3d import Axes3D +import matplotlib.pyplot as plt +import numpy as np + +def f(t): + s1 = np.cos(2*np.pi*t) + e1 = np.exp(-t) + return np.multiply(s1,e1) + + +################ +# First subplot +################ +t1 = np.arange(0.0, 5.0, 0.1) +t2 = np.arange(0.0, 5.0, 0.02) +t3 = np.arange(0.0, 2.0, 0.01) + +fig = plt.figure() +fig.suptitle('A tale of 2 subplots') +ax = fig.add_subplot(2, 1, 1) +l = ax.plot(t1, f(t1), 'bo', + t2, f(t2), 'k--', markerfacecolor='green') +ax.grid(True) +ax.set_ylabel('Damped oscillation') + + +################# +# Second subplot +################# +ax = fig.add_subplot(2, 1, 2, projection='3d') +X = np.arange(-5, 5, 0.25) +xlen = len(X) +Y = np.arange(-5, 5, 0.25) +ylen = len(Y) +X, Y = np.meshgrid(X, Y) +R = np.sqrt(X**2 + Y**2) +Z = np.sin(R) + +surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, + linewidth=0, antialiased=False) + +ax.set_zlim3d(-1, 1) + +plt.show() + diff -Nru matplotlib-0.99.3/examples/mplot3d/pathpatch3d_demo.py matplotlib-1.0.1/examples/mplot3d/pathpatch3d_demo.py --- matplotlib-0.99.3/examples/mplot3d/pathpatch3d_demo.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/examples/mplot3d/pathpatch3d_demo.py 2010-08-03 14:22:42.000000000 +0000 @@ -0,0 +1,52 @@ +import matplotlib.pyplot as plt +from matplotlib.patches import Circle, PathPatch +from mpl_toolkits.mplot3d import Axes3D +import mpl_toolkits.mplot3d.art3d as art3d +from matplotlib.text import TextPath +from matplotlib.transforms import Affine2D + + +def text3d(ax, (x, y, z), s, zdir="z", size=None, angle=0, usetex=False, + **kwargs): + + if zdir == "y": + xy1, z1 = (x, z), y + elif zdir == "y": + xy1, z1 = (y, z), x + else: + xy1, z1 = (x, y), z + + text_path = TextPath((0, 0), s, size=size, usetex=usetex) + trans = Affine2D().rotate(angle).translate(xy1[0], xy1[1]) + + p1 = PathPatch(trans.transform_path(text_path), **kwargs) + ax.add_patch(p1) + art3d.pathpatch_2d_to_3d(p1, z=z1, zdir=zdir) + + +fig = plt.figure() +ax = fig.add_subplot(111, projection='3d') + +p = Circle((5, 5), 3) +ax.add_patch(p) +art3d.pathpatch_2d_to_3d(p, z=0, zdir="x") + + +text3d(ax, (4, -2, 0), "X-axis", zdir="z", size=.5, usetex=False, + ec="none", fc="k") +text3d(ax, (12, 4, 0), "Y-axis", zdir="z", size=.5, usetex=False, angle=.5*3.14159, + ec="none", fc="k") +text3d(ax, (12, 10, 4), "Z-axis", zdir="y", size=.5, usetex=False, angle=.5*3.14159, + ec="none", fc="k") + +text3d(ax, (1, 5, 0), + r"$\displaystyle G_{\mu\nu} + \Lambda g_{\mu\nu} = \frac{8\pi G}{c^4} T_{\mu\nu} $", + zdir="z", size=1, usetex=True, + ec="none", fc="k") + +ax.set_xlim3d(0, 10) +ax.set_ylim3d(0, 10) +ax.set_zlim3d(0, 10) + +plt.show() + diff -Nru matplotlib-0.99.3/examples/mplot3d/polys3d_demo.py matplotlib-1.0.1/examples/mplot3d/polys3d_demo.py --- matplotlib-0.99.3/examples/mplot3d/polys3d_demo.py 2009-08-22 21:06:13.000000000 +0000 +++ matplotlib-1.0.1/examples/mplot3d/polys3d_demo.py 2010-08-03 14:22:42.000000000 +0000 @@ -5,7 +5,7 @@ import numpy as np fig = plt.figure() -ax = Axes3D(fig) +ax = fig.gca(projection='3d') cc = lambda arg: colorConverter.to_rgba(arg, alpha=0.6) @@ -22,8 +22,11 @@ poly.set_alpha(0.7) ax.add_collection3d(poly, zs=zs, zdir='y') +ax.set_xlabel('X') ax.set_xlim3d(0, 10) +ax.set_ylabel('Y') ax.set_ylim3d(-1, 4) +ax.set_zlabel('Z') ax.set_zlim3d(0, 1) plt.show() diff -Nru matplotlib-0.99.3/examples/mplot3d/rotate_axes3d_demo.py matplotlib-1.0.1/examples/mplot3d/rotate_axes3d_demo.py --- matplotlib-0.99.3/examples/mplot3d/rotate_axes3d_demo.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/examples/mplot3d/rotate_axes3d_demo.py 2010-08-03 14:22:42.000000000 +0000 @@ -0,0 +1,15 @@ +from mpl_toolkits.mplot3d import axes3d +import matplotlib.pyplot as plt +import numpy as np + +plt.ion() + +fig = plt.figure() +ax = fig.add_subplot(111, projection='3d') +X, Y, Z = axes3d.get_test_data(0.1) +ax.plot_wireframe(X, Y, Z, rstride=5, cstride=5) + +for angle in range(0, 360): + ax.view_init(30, angle) + plt.draw() + diff -Nru matplotlib-0.99.3/examples/mplot3d/scatter3d_demo.py matplotlib-1.0.1/examples/mplot3d/scatter3d_demo.py --- matplotlib-0.99.3/examples/mplot3d/scatter3d_demo.py 2009-08-22 21:06:13.000000000 +0000 +++ matplotlib-1.0.1/examples/mplot3d/scatter3d_demo.py 2010-08-03 14:22:42.000000000 +0000 @@ -2,18 +2,17 @@ from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt - def randrange(n, vmin, vmax): return (vmax-vmin)*np.random.rand(n) + vmin fig = plt.figure() -ax = Axes3D(fig) +ax = fig.add_subplot(111, projection='3d') n = 100 -for c, zl, zh in [('r', -50, -25), ('b', -30, -5)]: +for c, m, zl, zh in [('r', 'o', -50, -25), ('b', '^', -30, -5)]: xs = randrange(n, 23, 32) ys = randrange(n, 0, 100) zs = randrange(n, zl, zh) - ax.scatter(xs, ys, zs, c=c) + ax.scatter(xs, ys, zs, c=c, marker=m) ax.set_xlabel('X Label') ax.set_ylabel('Y Label') diff -Nru matplotlib-0.99.3/examples/mplot3d/subplot3d_demo.py matplotlib-1.0.1/examples/mplot3d/subplot3d_demo.py --- matplotlib-0.99.3/examples/mplot3d/subplot3d_demo.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/examples/mplot3d/subplot3d_demo.py 2010-08-03 14:22:42.000000000 +0000 @@ -0,0 +1,32 @@ +from mpl_toolkits.mplot3d.axes3d import Axes3D +import matplotlib.pyplot as plt + + +# imports specific to the plots in this example +import numpy as np +from matplotlib import cm +from mpl_toolkits.mplot3d.axes3d import get_test_data + + +fig = plt.figure(figsize=(9.5,5.0)) + +#---- First subplot +ax = fig.add_subplot(1, 2, 1, projection='3d') +X = np.arange(-5, 5, 0.25) +Y = np.arange(-5, 5, 0.25) +X, Y = np.meshgrid(X, Y) +R = np.sqrt(X**2 + Y**2) +Z = np.sin(R) +surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.jet, + linewidth=0, antialiased=False) +ax.set_zlim3d(-1.01, 1.01) + +fig.colorbar(surf, shrink=0.5, aspect=10) + +#---- Second subplot +ax = fig.add_subplot(1, 2, 2, projection='3d') +X, Y, Z = get_test_data(0.05) +ax.plot_wireframe(X, Y, Z, rstride=10, cstride=10) + +plt.show() + diff -Nru matplotlib-0.99.3/examples/mplot3d/surface3d_demo2.py matplotlib-1.0.1/examples/mplot3d/surface3d_demo2.py --- matplotlib-0.99.3/examples/mplot3d/surface3d_demo2.py 2009-08-22 21:06:13.000000000 +0000 +++ matplotlib-1.0.1/examples/mplot3d/surface3d_demo2.py 2010-08-03 14:22:42.000000000 +0000 @@ -3,7 +3,7 @@ import numpy as np fig = plt.figure() -ax = Axes3D(fig) +ax = fig.add_subplot(111, projection='3d') u = np.linspace(0, 2 * np.pi, 100) v = np.linspace(0, np.pi, 100) diff -Nru matplotlib-0.99.3/examples/mplot3d/surface3d_demo3.py matplotlib-1.0.1/examples/mplot3d/surface3d_demo3.py --- matplotlib-0.99.3/examples/mplot3d/surface3d_demo3.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/examples/mplot3d/surface3d_demo3.py 2010-08-03 14:22:42.000000000 +0000 @@ -0,0 +1,31 @@ +from mpl_toolkits.mplot3d import Axes3D +from matplotlib import cm +from matplotlib.ticker import LinearLocator, FixedLocator, FormatStrFormatter +import matplotlib.pyplot as plt +import numpy as np + +fig = plt.figure() +ax = fig.gca(projection='3d') +X = np.arange(-5, 5, 0.25) +xlen = len(X) +Y = np.arange(-5, 5, 0.25) +ylen = len(Y) +X, Y = np.meshgrid(X, Y) +R = np.sqrt(X**2 + Y**2) +Z = np.sin(R) + +colortuple = ('y', 'b') +colors = np.empty(X.shape, dtype=str) +for y in range(ylen): + for x in range(xlen): + colors[x, y] = colortuple[(x + y) % len(colortuple)] + +surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, facecolors=colors, + linewidth=0, antialiased=False) + +ax.set_zlim3d(-1, 1) +ax.w_zaxis.set_major_locator(LinearLocator(6)) +ax.w_zaxis.set_major_formatter(FormatStrFormatter('%.03f')) + +plt.show() + diff -Nru matplotlib-0.99.3/examples/mplot3d/surface3d_demo.py matplotlib-1.0.1/examples/mplot3d/surface3d_demo.py --- matplotlib-0.99.3/examples/mplot3d/surface3d_demo.py 2009-08-22 21:06:13.000000000 +0000 +++ matplotlib-1.0.1/examples/mplot3d/surface3d_demo.py 2010-08-03 14:22:42.000000000 +0000 @@ -1,16 +1,24 @@ from mpl_toolkits.mplot3d import Axes3D from matplotlib import cm +from matplotlib.ticker import LinearLocator, FixedLocator, FormatStrFormatter import matplotlib.pyplot as plt import numpy as np fig = plt.figure() -ax = Axes3D(fig) +ax = fig.gca(projection='3d') X = np.arange(-5, 5, 0.25) Y = np.arange(-5, 5, 0.25) X, Y = np.meshgrid(X, Y) R = np.sqrt(X**2 + Y**2) Z = np.sin(R) -ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.jet) +surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.jet, + linewidth=0, antialiased=False) +ax.set_zlim3d(-1.01, 1.01) + +ax.w_zaxis.set_major_locator(LinearLocator(10)) +ax.w_zaxis.set_major_formatter(FormatStrFormatter('%.03f')) + +fig.colorbar(surf, shrink=0.5, aspect=5) plt.show() diff -Nru matplotlib-0.99.3/examples/mplot3d/surface3d_radial_demo.py matplotlib-1.0.1/examples/mplot3d/surface3d_radial_demo.py --- matplotlib-0.99.3/examples/mplot3d/surface3d_radial_demo.py 2010-05-30 20:31:09.000000000 +0000 +++ matplotlib-1.0.1/examples/mplot3d/surface3d_radial_demo.py 2010-08-03 14:22:42.000000000 +0000 @@ -8,7 +8,7 @@ step = 0.04 maxval = 1.0 fig = plt.figure() -ax = Axes3D(fig) +ax = fig.add_subplot(111, projection='3d') # create supporting points in polar coordinates r = np.linspace(0,1.25,50) diff -Nru matplotlib-0.99.3/examples/mplot3d/text3d_demo.py matplotlib-1.0.1/examples/mplot3d/text3d_demo.py --- matplotlib-0.99.3/examples/mplot3d/text3d_demo.py 2009-08-22 21:06:13.000000000 +0000 +++ matplotlib-1.0.1/examples/mplot3d/text3d_demo.py 2010-08-03 14:22:42.000000000 +0000 @@ -2,7 +2,7 @@ import matplotlib.pyplot as plt fig = plt.figure() -ax = Axes3D(fig) +ax = fig.gca(projection='3d') zdirs = (None, 'x', 'y', 'z', (1, 1, 0), (1, 1, 1)) xs = (2, 6, 4, 9, 7, 2) @@ -13,6 +13,9 @@ label = '(%d, %d, %d), dir=%s' % (x, y, z, zdir) ax.text(x, y, z, label, zdir) +ax.text(1, 1, 1, "red", color='red') +ax.text2D(0.05, 0.95, "2D Text", transform=ax.transAxes) + ax.set_xlim3d(0, 10) ax.set_ylim3d(0, 10) ax.set_zlim3d(0, 10) diff -Nru matplotlib-0.99.3/examples/mplot3d/wire3d_animation_demo.py matplotlib-1.0.1/examples/mplot3d/wire3d_animation_demo.py --- matplotlib-0.99.3/examples/mplot3d/wire3d_animation_demo.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/examples/mplot3d/wire3d_animation_demo.py 2010-08-03 14:22:42.000000000 +0000 @@ -0,0 +1,37 @@ +""" +A very simple 'animation' of a 3D plot +""" +from mpl_toolkits.mplot3d import axes3d +import matplotlib.pyplot as plt +import numpy as np +import time + +def generate(X, Y, phi): + R = 1 - np.sqrt(X**2 + Y**2) + return np.cos(2 * np.pi * X + phi) * R + +plt.ion() +fig = plt.figure() +ax = fig.add_subplot(111, projection='3d') + +xs = np.linspace(-1, 1, 50) +ys = np.linspace(-1, 1, 50) +X, Y = np.meshgrid(xs, ys) +Z = generate(X, Y, 0.0) + +wframe = None +tstart = time.time() +for phi in np.linspace(0, 360 / 2 / np.pi, 100): + + oldcol = wframe + + Z = generate(X, Y, phi) + wframe = ax.plot_wireframe(X, Y, Z, rstride=2, cstride=2) + + # Remove old line collection before drawing + if oldcol is not None: + ax.collections.remove(oldcol) + + plt.draw() + +print 'FPS: %f' % (100 / (time.time() - tstart)) diff -Nru matplotlib-0.99.3/examples/mplot3d/wire3d_demo.py matplotlib-1.0.1/examples/mplot3d/wire3d_demo.py --- matplotlib-0.99.3/examples/mplot3d/wire3d_demo.py 2009-08-22 21:06:13.000000000 +0000 +++ matplotlib-1.0.1/examples/mplot3d/wire3d_demo.py 2010-08-03 14:22:42.000000000 +0000 @@ -3,7 +3,7 @@ import numpy as np fig = plt.figure() -ax = axes3d.Axes3D(fig) +ax = fig.add_subplot(111, projection='3d') X, Y, Z = axes3d.get_test_data(0.05) ax.plot_wireframe(X, Y, Z, rstride=10, cstride=10) diff -Nru matplotlib-0.99.3/examples/pylab_examples/accented_text.py matplotlib-1.0.1/examples/pylab_examples/accented_text.py --- matplotlib-0.99.3/examples/pylab_examples/accented_text.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/examples/pylab_examples/accented_text.py 2010-09-23 19:54:49.000000000 +0000 @@ -11,6 +11,7 @@ """ from pylab import * +axes([0.1, 0.15, 0.8, 0.75]) plot(range(10)) title(r'$\ddot{o}\acute{e}\grave{e}\hat{O}\breve{i}\bar{A}\tilde{n}\vec{q}$', fontsize=20) diff -Nru matplotlib-0.99.3/examples/pylab_examples/annotation_demo3.py matplotlib-1.0.1/examples/pylab_examples/annotation_demo3.py --- matplotlib-0.99.3/examples/pylab_examples/annotation_demo3.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/examples/pylab_examples/annotation_demo3.py 2010-07-07 01:41:55.000000000 +0000 @@ -0,0 +1,101 @@ +import matplotlib.pyplot as plt + +fig = plt.figure(1) +fig.clf() + +ax1 = plt.subplot(121) +ax2 = plt.subplot(122) + +bbox_args = dict(boxstyle="round", fc="0.8") +arrow_args = dict(arrowstyle="->") + +ax1.annotate('figure fraction : 0, 0', xy=(0, 0), xycoords='figure fraction', + xytext=(20, 20), textcoords='offset points', + ha="left", va="bottom", + bbox=bbox_args, + arrowprops=arrow_args + ) + +ax1.annotate('figure fraction : 1, 1', xy=(1, 1), xycoords='figure fraction', + xytext=(-20, -20), textcoords='offset points', + ha="right", va="top", + bbox=bbox_args, + arrowprops=arrow_args + ) + +ax1.annotate('axes fraction : 0, 0', xy=(0, 0), xycoords='axes fraction', + xytext=(20, 20), textcoords='offset points', + ha="left", va="bottom", + bbox=bbox_args, + arrowprops=arrow_args + ) + +ax1.annotate('axes fraction : 1, 1', xy=(1, 1), xycoords='axes fraction', + xytext=(-20, -20), textcoords='offset points', + ha="right", va="top", + bbox=bbox_args, + arrowprops=arrow_args + ) + + +an1 = ax1.annotate('Drag me 1', xy=(.5, .7), xycoords='data', + #xytext=(.5, .7), textcoords='data', + ha="center", va="center", + bbox=bbox_args, + #arrowprops=arrow_args + ) + +an2 = ax1.annotate('Drag me 2', xy=(.5, .5), xycoords=an1, + xytext=(.5, .3), textcoords='axes fraction', + ha="center", va="center", + bbox=bbox_args, + arrowprops=dict(patchB=an1.get_bbox_patch(), + connectionstyle="arc3,rad=0.2", + **arrow_args) + ) + +an3 = ax1.annotate('', xy=(.5, .5), xycoords=an2, + xytext=(.5, .5), textcoords=an1, + ha="center", va="center", + bbox=bbox_args, + arrowprops=dict(patchA=an1.get_bbox_patch(), + patchB=an2.get_bbox_patch(), + connectionstyle="arc3,rad=0.2", + **arrow_args) + ) + + + +t = ax2.annotate('xy=(0, 1)\nxycoords=("data", "axes fraction")', + xy=(0, 1), xycoords=("data", 'axes fraction'), + xytext=(0, -20), textcoords='offset points', + ha="center", va="top", + bbox=bbox_args, + arrowprops=arrow_args + ) + +from matplotlib.text import OffsetFrom + +ax2.annotate('xy=(0.5, 0)\nxycoords=artist', + xy=(0.5, 0.), xycoords=t, + xytext=(0, -20), textcoords='offset points', + ha="center", va="top", + bbox=bbox_args, + arrowprops=arrow_args + ) + +ax2.annotate('xy=(0.8, 0.5)\nxycoords=ax1.transData', + xy=(0.8, 0.5), xycoords=ax1.transData, + xytext=(10, 10), textcoords=OffsetFrom(ax2.bbox, (0, 0), "points"), + ha="left", va="bottom", + bbox=bbox_args, + arrowprops=arrow_args + ) + +ax2.set_xlim(-2, 2) +ax2.set_ylim(-2, 2) + +an1.draggable() +an2.draggable() + +plt.show() diff -Nru matplotlib-0.99.3/examples/pylab_examples/axes_props.py matplotlib-1.0.1/examples/pylab_examples/axes_props.py --- matplotlib-0.99.3/examples/pylab_examples/axes_props.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/examples/pylab_examples/axes_props.py 2010-07-07 01:41:55.000000000 +0000 @@ -10,7 +10,7 @@ plot(t, s) grid(True) -# matlab style +# MATLAB style xticklines = getp(gca(), 'xticklines') yticklines = getp(gca(), 'yticklines') xgridlines = getp(gca(), 'xgridlines') diff -Nru matplotlib-0.99.3/examples/pylab_examples/axes_zoom_effect.py matplotlib-1.0.1/examples/pylab_examples/axes_zoom_effect.py --- matplotlib-0.99.3/examples/pylab_examples/axes_zoom_effect.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/examples/pylab_examples/axes_zoom_effect.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,7 +1,7 @@ from matplotlib.transforms import Bbox, TransformedBbox, \ blended_transform_factory -from mpl_toolkits.axes_grid.inset_locator import BboxPatch, BboxConnector,\ +from mpl_toolkits.axes_grid1.inset_locator import BboxPatch, BboxConnector,\ BboxConnectorPatch diff -Nru matplotlib-0.99.3/examples/pylab_examples/barchart_demo.py matplotlib-1.0.1/examples/pylab_examples/barchart_demo.py --- matplotlib-0.99.3/examples/pylab_examples/barchart_demo.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/examples/pylab_examples/barchart_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -12,11 +12,17 @@ plt.subplot(111) -rects1 = plt.bar(ind, menMeans, width, color='r', yerr=menStd) +rects1 = plt.bar(ind, menMeans, width, + color='r', + yerr=menStd, + error_kw=dict(elinewidth=6, ecolor='pink')) womenMeans = (25, 32, 34, 20, 25) womenStd = (3, 5, 2, 3, 3) -rects2 = plt.bar(ind+width, womenMeans, width, color='y', yerr=womenStd) +rects2 = plt.bar(ind+width, womenMeans, width, + color='y', + yerr=womenStd, + error_kw=dict(elinewidth=6, ecolor='yellow')) # add some plt.ylabel('Scores') diff -Nru matplotlib-0.99.3/examples/pylab_examples/boxplot_demo3.py matplotlib-1.0.1/examples/pylab_examples/boxplot_demo3.py --- matplotlib-0.99.3/examples/pylab_examples/boxplot_demo3.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/examples/pylab_examples/boxplot_demo3.py 2010-07-07 01:41:55.000000000 +0000 @@ -0,0 +1,27 @@ +import matplotlib.pyplot as plt +import matplotlib.transforms as mtransforms +import numpy as np + +np.random.seed(2) +inc = 0.1 +e1 = np.random.uniform(0,1, size=(500,)) +e2 = np.random.uniform(0,1, size=(500,)) +e3 = np.random.uniform(0,1 + inc, size=(500,)) +e4 = np.random.uniform(0,1 + 2*inc, size=(500,)) + +treatments = [e1,e2,e3,e4] + +fig = plt.figure() +ax = fig.add_subplot(111) +pos = np.array(range(len(treatments)))+1 +bp = ax.boxplot( treatments, sym='k+', patch_artist=True, + positions=pos, notch=1, bootstrap=5000 ) +text_transform= mtransforms.blended_transform_factory(ax.transData, + ax.transAxes) +ax.set_xlabel('treatment') +ax.set_ylabel('response') +ax.set_ylim(-0.2, 1.4) +plt.setp(bp['whiskers'], color='k', linestyle='-' ) +plt.setp(bp['fliers'], markersize=3.0) +fig.subplots_adjust(right=0.99,top=0.99) +plt.show() diff -Nru matplotlib-0.99.3/examples/pylab_examples/centered_ticklabels.py matplotlib-1.0.1/examples/pylab_examples/centered_ticklabels.py --- matplotlib-0.99.3/examples/pylab_examples/centered_ticklabels.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/examples/pylab_examples/centered_ticklabels.py 2010-07-07 01:41:55.000000000 +0000 @@ -15,12 +15,13 @@ import datetime import numpy as np import matplotlib +import matplotlib.cbook as cbook import matplotlib.dates as dates import matplotlib.ticker as ticker import matplotlib.pyplot as plt # load some financial data; apple's stock price -fh = matplotlib.get_example_data('aapl.npy') +fh = cbook.get_sample_data('aapl.npy') r = np.load(fh); fh.close() r = r[-250:] # get the last 250 days diff -Nru matplotlib-0.99.3/examples/pylab_examples/clippedline.py matplotlib-1.0.1/examples/pylab_examples/clippedline.py --- matplotlib-0.99.3/examples/pylab_examples/clippedline.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/examples/pylab_examples/clippedline.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,6 +1,11 @@ """ Clip a line according to the current xlimits, and change the marker -style when zoomed in +style when zoomed in. + +It is not clear this example is still needed or valid; clipping +is now automatic for Line2D objects when x is sorted in +ascending order. + """ from matplotlib.lines import Line2D @@ -19,8 +24,7 @@ def set_data(self, *args, **kwargs): Line2D.set_data(self, *args, **kwargs) - if self._invalid: - self.recache() + self.recache() self.xorig = np.array(self._x) self.yorig = np.array(self._y) diff -Nru matplotlib-0.99.3/examples/pylab_examples/color_demo.py matplotlib-1.0.1/examples/pylab_examples/color_demo.py --- matplotlib-0.99.3/examples/pylab_examples/color_demo.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/examples/pylab_examples/color_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -2,7 +2,7 @@ """ matplotlib gives you 4 ways to specify colors, - 1) as a single letter string, ala matlab + 1) as a single letter string, ala MATLAB 2) as an html style hex string or html color name diff -Nru matplotlib-0.99.3/examples/pylab_examples/contourf_demo.py matplotlib-1.0.1/examples/pylab_examples/contourf_demo.py --- matplotlib-0.99.3/examples/pylab_examples/contourf_demo.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/examples/pylab_examples/contourf_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -3,15 +3,7 @@ origin = 'lower' #origin = 'upper' -# The following controls only interior masking. -test_masking = False # There is a bug in filled contour masking with - # interior masks. - -if test_masking: - # Use a coarse grid so only a few masked points are needed. - delta = 0.5 -else: - delta = 0.025 +delta = 0.025 x = y = arange(-3.0, 3.01, delta) X, Y = meshgrid(x, y) @@ -19,19 +11,6 @@ Z2 = bivariate_normal(X, Y, 1.5, 0.5, 1, 1) Z = 10 * (Z1 - Z2) -# interior badmask doesn't work yet for filled contours -if test_masking: - badmask = zeros(shape(Z)) - - badmask[5,5] = 1 - badmask[5,6] = 1 - Z[5,5] = 0 - Z[5,6] = 0 - - badmask[0,0] = 1 - Z[0,0] = 0 - Z = ma.array(Z, mask=badmask) - nr, nc = Z.shape # put NaNs in one corner: @@ -43,6 +22,10 @@ # mask another corner: Z[:nr//6, :nc//6] = ma.masked +# mask a circle in the middle: +interior = sqrt((X**2) + (Y**2)) < 0.5 +Z[interior] = ma.masked + # We are using automatic selection of contour levels; # this is usually not such a good idea, because they don't @@ -55,14 +38,15 @@ # Note that in the following, we explicitly pass in a subset of # the contour levels used for the filled contours. Alternatively, -# We could pass in additional levels to provide extra resolution. +# We could pass in additional levels to provide extra resolution, +# or leave out the levels kwarg to use all of the original levels. -CS2 = contour(X, Y, Z, CS.levels[::2], +CS2 = contour(CS, levels=CS.levels[::2], colors = 'r', origin=origin, hold='on') -title('Nonsense (with 2 masked corners)') +title('Nonsense (3 masked regions)') xlabel('word length anomaly') ylabel('sentence length anomaly') @@ -77,17 +61,26 @@ # Now make a contour plot with the levels specified, # and with the colormap generated automatically from a list # of colors. -levels = [-2, -1.5, -1, -0.5, 0, 0.5, 1, 1.5] +levels = [-1.5, -1, -0.5, 0, 0.5, 1] CS3 = contourf(X, Y, Z, levels, colors = ('r', 'g', 'b'), - origin=origin) + origin=origin, + extend='both') +# Our data range extends outside the range of levels; make +# data below the lowest contour level yellow, and above the +# highest level cyan: +CS3.cmap.set_under('yellow') +CS3.cmap.set_over('cyan') CS4 = contour(X, Y, Z, levels, colors = ('k',), linewidths = (3,), origin = origin) -title('Listed colors (with 2 masked corners)') +title('Listed colors (3 masked regions)') clabel(CS4, fmt = '%2.1f', colors = 'w', fontsize=14) + +# Notice that the colorbar command gets all the information it +# needs from the ContourSet object, CS3. colorbar(CS3) show() diff -Nru matplotlib-0.99.3/examples/pylab_examples/contour_image.py matplotlib-1.0.1/examples/pylab_examples/contour_image.py --- matplotlib-0.99.3/examples/pylab_examples/contour_image.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/examples/pylab_examples/contour_image.py 2010-07-07 01:41:55.000000000 +0000 @@ -67,7 +67,7 @@ imshow(Z, extent=extent) v = axis() -contour(Z, cset3.levels, hold='on', colors = 'k', +contour(Z, levels, hold='on', colors = 'k', origin='upper', extent=extent) axis(v) title("Image, origin 'upper'") @@ -76,7 +76,7 @@ imshow(Z, origin='lower', extent=extent) v = axis() -contour(Z, cset3.levels, hold='on', colors = 'k', +contour(Z, levels, hold='on', colors = 'k', origin='lower', extent=extent) axis(v) title("Image, origin 'lower'") @@ -91,7 +91,7 @@ # domain that is contoured does not extend beyond these pixel centers. im = imshow(Z, interpolation='nearest', extent=extent) v = axis() -contour(Z, cset3.levels, hold='on', colors = 'k', +contour(Z, levels, hold='on', colors = 'k', origin='image', extent=extent) axis(v) ylim = get(gca(), 'ylim') diff -Nru matplotlib-0.99.3/examples/pylab_examples/cursor_demo.py matplotlib-1.0.1/examples/pylab_examples/cursor_demo.py --- matplotlib-0.99.3/examples/pylab_examples/cursor_demo.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/examples/pylab_examples/cursor_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -15,22 +15,19 @@ class Cursor: def __init__(self, ax): self.ax = ax - self.lx, = ax.plot( (0,0), (0,0), 'k-' ) # the horiz line - self.ly, = ax.plot( (0,0), (0,0), 'k-' ) # the vert line + self.lx = ax.axhline(color='k') # the horiz line + self.ly = ax.axvline(color='k') # the vert line # text location in axes coords self.txt = ax.text( 0.7, 0.9, '', transform=ax.transAxes) def mouse_move(self, event): if not event.inaxes: return - ax = event.inaxes - minx, maxx = ax.get_xlim() - miny, maxy = ax.get_ylim() x, y = event.xdata, event.ydata # update the line positions - self.lx.set_data( (minx, maxx), (y, y) ) - self.ly.set_data( (x, x), (miny, maxy) ) + self.lx.set_ydata(y ) + self.ly.set_xdata(x ) self.txt.set_text( 'x=%1.2f, y=%1.2f'%(x,y) ) draw() @@ -43,8 +40,8 @@ """ def __init__(self, ax, x, y): self.ax = ax - self.lx, = ax.plot( (0,0), (0,0), 'k-' ) # the horiz line - self.ly, = ax.plot( (0,0), (0,0), 'k-' ) # the vert line + self.lx = ax.axhline(color='k') # the horiz line + self.ly = ax.axvline(color='k') # the vert line self.x = x self.y = y # text location in axes coords @@ -53,9 +50,6 @@ def mouse_move(self, event): if not event.inaxes: return - ax = event.inaxes - minx, maxx = ax.get_xlim() - miny, maxy = ax.get_ylim() x, y = event.xdata, event.ydata @@ -63,8 +57,8 @@ x = self.x[indx] y = self.y[indx] # update the line positions - self.lx.set_data( (minx, maxx), (y, y) ) - self.ly.set_data( (x, x), (miny, maxy) ) + self.lx.set_ydata(y ) + self.ly.set_xdata(x ) self.txt.set_text( 'x=%1.2f, y=%1.2f'%(x,y) ) print 'x=%1.2f, y=%1.2f'%(x,y) @@ -81,3 +75,4 @@ ax.plot(t, s, 'o') axis([0,1,-1,1]) show() + diff -Nru matplotlib-0.99.3/examples/pylab_examples/data_helper.py matplotlib-1.0.1/examples/pylab_examples/data_helper.py --- matplotlib-0.99.3/examples/pylab_examples/data_helper.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/examples/pylab_examples/data_helper.py 2010-07-07 01:41:55.000000000 +0000 @@ -2,7 +2,7 @@ # Some functions to load a return data for the plot demos from numpy import fromstring, argsort, take, array, resize - +import matplotlib.cbook as cbook def get_two_stock_data(): """ load stock time and price data for two stocks The return values @@ -10,11 +10,14 @@ and 2 (intc and aapl) """ ticker1, ticker2 = 'INTC', 'AAPL' - M1 = fromstring( file('../data/%s.dat' % ticker1, 'rb').read(), '")) + ax.add_artist(ab) + + offsetbox = TextArea("Test", minimumdescent=False) + + ab = AnnotationBbox(offsetbox, xy, + xybox=(1.02, xy[1]), + xycoords='data', + boxcoords=("axes fraction", "data"), + box_alignment=(0.,0.5), + arrowprops=dict(arrowstyle="->")) + ax.add_artist(ab) + + + from matplotlib.patches import Circle + da = DrawingArea(20, 20, 0, 0) + p = Circle((10, 10), 10) + da.add_artist(p) + + xy = [0.3, 0.55] + ab = AnnotationBbox(da, xy, + xybox=(1.02, xy[1]), + xycoords='data', + boxcoords=("axes fraction", "data"), + box_alignment=(0.,0.5), + arrowprops=dict(arrowstyle="->")) + #arrowprops=None) + + ax.add_artist(ab) + + + arr = np.arange(100).reshape((10,10)) + im = OffsetImage(arr, zoom=2) + + ab = AnnotationBbox(im, xy, + xybox=(-50., 50.), + xycoords='data', + boxcoords="offset points", + pad=0.3, + arrowprops=dict(arrowstyle="->")) + #arrowprops=None) + + ax.add_artist(ab) + + + # another image + + + from matplotlib._png import read_png + fn = get_sample_data("lena.png", asfileobj=False) + arr_lena = read_png(fn) + + imagebox = OffsetImage(arr_lena, zoom=0.2) + + ab = AnnotationBbox(imagebox, xy, + xybox=(120., -80.), + xycoords='data', + boxcoords="offset points", + pad=0.5, + arrowprops=dict(arrowstyle="->", + connectionstyle="angle,angleA=0,angleB=90,rad=3") + ) + + + ax.add_artist(ab) + + ax.set_xlim(0, 1) + ax.set_ylim(0, 1) + + + plt.draw() + plt.show() diff -Nru matplotlib-0.99.3/examples/pylab_examples/demo_bboximage.py matplotlib-1.0.1/examples/pylab_examples/demo_bboximage.py --- matplotlib-0.99.3/examples/pylab_examples/demo_bboximage.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/examples/pylab_examples/demo_bboximage.py 2010-07-07 01:41:55.000000000 +0000 @@ -0,0 +1,62 @@ +import matplotlib.pyplot as plt +import numpy as np +from matplotlib.image import BboxImage +from matplotlib.transforms import Bbox, TransformedBbox + +if __name__ == "__main__": + + fig = plt.figure(1) + ax = plt.subplot(121) + + txt = ax.text(0.5, 0.5, "test", size=30, ha="center", color="w") + kwargs = dict() + + bbox_image = BboxImage(txt.get_window_extent, + norm = None, + origin=None, + clip_on=False, + **kwargs + ) + a = np.arange(256).reshape(1,256)/256. + bbox_image.set_data(a) + ax.add_artist(bbox_image) + + + ax = plt.subplot(122) + a = np.linspace(0, 1, 256).reshape(1,-1) + a = np.vstack((a,a)) + + maps = sorted(m for m in plt.cm.datad if not m.endswith("_r")) + #nmaps = len(maps) + 1 + + #fig.subplots_adjust(top=0.99, bottom=0.01, left=0.2, right=0.99) + + ncol = 2 + nrow = len(maps)//ncol + 1 + + xpad_fraction = 0.3 + dx = 1./(ncol + xpad_fraction*(ncol-1)) + + ypad_fraction = 0.3 + dy = 1./(nrow + ypad_fraction*(nrow-1)) + + for i,m in enumerate(maps): + ix, iy = divmod(i, nrow) + #plt.figimage(a, 10, i*10, cmap=plt.get_cmap(m), origin='lower') + bbox0 = Bbox.from_bounds(ix*dx*(1+xpad_fraction), + 1.-iy*dy*(1+ypad_fraction)-dy, + dx, dy) + bbox = TransformedBbox(bbox0, ax.transAxes) + + bbox_image = BboxImage(bbox, + cmap = plt.get_cmap(m), + norm = None, + origin=None, + **kwargs + ) + + bbox_image.set_data(a) + ax.add_artist(bbox_image) + + plt.draw() + plt.show() diff -Nru matplotlib-0.99.3/examples/pylab_examples/demo_ribbon_box.py matplotlib-1.0.1/examples/pylab_examples/demo_ribbon_box.py --- matplotlib-0.99.3/examples/pylab_examples/demo_ribbon_box.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/examples/pylab_examples/demo_ribbon_box.py 2010-07-07 01:41:55.000000000 +0000 @@ -0,0 +1,141 @@ +import matplotlib.pyplot as plt +import numpy as np +from matplotlib.image import BboxImage + +from matplotlib._png import read_png +import matplotlib.colors +from matplotlib.cbook import get_sample_data + +class RibbonBox(object): + + original_image = read_png(get_sample_data("Minduka_Present_Blue_Pack.png", + asfileobj=False)) + cut_location = 70 + b_and_h = original_image[:,:,2] + color = original_image[:,:,2] - original_image[:,:,0] + alpha = original_image[:,:,3] + nx = original_image.shape[1] + + def __init__(self, color): + rgb = matplotlib.colors.colorConverter.to_rgb(color) + + im = np.empty(self.original_image.shape, + self.original_image.dtype) + + + im[:,:,:3] = self.b_and_h[:,:,np.newaxis] + im[:,:,:3] -= self.color[:,:,np.newaxis]*(1.-np.array(rgb)) + im[:,:,3] = self.alpha + + self.im = im + + + def get_stretched_image(self, stretch_factor): + stretch_factor = max(stretch_factor, 1) + ny, nx, nch = self.im.shape + ny2 = int(ny*stretch_factor) + + stretched_image = np.empty((ny2, nx, nch), + self.im.dtype) + cut = self.im[self.cut_location,:,:] + stretched_image[:,:,:] = cut + stretched_image[:self.cut_location,:,:] = \ + self.im[:self.cut_location,:,:] + stretched_image[-(ny-self.cut_location):,:,:] = \ + self.im[-(ny-self.cut_location):,:,:] + + self._cached_im = stretched_image + return stretched_image + + + +class RibbonBoxImage(BboxImage): + zorder = 1 + + def __init__(self, bbox, color, + cmap = None, + norm = None, + interpolation=None, + origin=None, + filternorm=1, + filterrad=4.0, + resample = False, + **kwargs + ): + + BboxImage.__init__(self, bbox, + cmap = cmap, + norm = norm, + interpolation=interpolation, + origin=origin, + filternorm=filternorm, + filterrad=filterrad, + resample = resample, + **kwargs + ) + + self._ribbonbox = RibbonBox(color) + self._cached_ny = None + + + def draw(self, renderer, *args, **kwargs): + + bbox = self.get_window_extent(renderer) + stretch_factor = bbox.height / bbox.width + + ny = int(stretch_factor*self._ribbonbox.nx) + if self._cached_ny != ny: + arr = self._ribbonbox.get_stretched_image(stretch_factor) + self.set_array(arr) + self._cached_ny = ny + + BboxImage.draw(self, renderer, *args, **kwargs) + + +if 1: + from matplotlib.transforms import Bbox, TransformedBbox + from matplotlib.ticker import ScalarFormatter + + fig = plt.gcf() + fig.clf() + ax = plt.subplot(111) + + years = np.arange(2004, 2009) + box_colors = [(0.8, 0.2, 0.2), + (0.2, 0.8, 0.2), + (0.2, 0.2, 0.8), + (0.7, 0.5, 0.8), + (0.3, 0.8, 0.7), + ] + heights = np.random.random(years.shape) * 7000 + 3000 + + fmt = ScalarFormatter(useOffset=False) + ax.xaxis.set_major_formatter(fmt) + + for year, h, bc in zip(years, heights, box_colors): + bbox0 = Bbox.from_extents(year-0.4, 0., year+0.4, h) + bbox = TransformedBbox(bbox0, ax.transData) + rb_patch = RibbonBoxImage(bbox, bc, interpolation="bicubic") + + ax.add_artist(rb_patch) + + ax.annotate(r"%d" % (int(h/100.)*100), + (year, h), va="bottom", ha="center") + + patch_gradient = BboxImage(ax.bbox, + interpolation="bicubic", + zorder=0.1, + ) + gradient = np.zeros((2, 2, 4), dtype=np.float) + gradient[:,:,:3] = [1, 1, 0.] + gradient[:,:,3] = [[0.1, 0.3],[0.3, 0.5]] # alpha channel + patch_gradient.set_array(gradient) + ax.add_artist(patch_gradient) + + + ax.set_xlim(years[0]-0.5, years[-1]+0.5) + ax.set_ylim(0, 10000) + + fig.savefig('ribbon_box.png') + plt.show() + diff -Nru matplotlib-0.99.3/examples/pylab_examples/demo_text_path.py matplotlib-1.0.1/examples/pylab_examples/demo_text_path.py --- matplotlib-0.99.3/examples/pylab_examples/demo_text_path.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/examples/pylab_examples/demo_text_path.py 2010-11-09 13:28:22.000000000 +0000 @@ -0,0 +1,155 @@ + +# -*- coding: utf-8 -*- + +import matplotlib.pyplot as plt +from matplotlib.image import BboxImage +import numpy as np +from matplotlib.transforms import IdentityTransform + +import matplotlib.patches as mpatches + +from matplotlib.offsetbox import AnnotationBbox,\ + AnchoredOffsetbox, AuxTransformBox + +from matplotlib.cbook import get_sample_data + +from matplotlib.text import TextPath + + +class PathClippedImagePatch(mpatches.PathPatch): + """ + The given image is used to draw the face of the patch. Internally, + it uses BboxImage whose clippath set to the path of the patch. + + FIXME : The result is currently dpi dependent. + """ + def __init__(self, path, bbox_image, **kwargs): + mpatches.PathPatch.__init__(self, path, **kwargs) + self._init_bbox_image(bbox_image) + + def set_facecolor(self, color): + """simply ignore facecolor""" + mpatches.PathPatch.set_facecolor(self, "none") + + def _init_bbox_image(self, im): + + bbox_image = BboxImage(self.get_window_extent, + norm = None, + origin=None, + ) + bbox_image.set_transform(IdentityTransform()) + + bbox_image.set_data(im) + self.bbox_image = bbox_image + + def draw(self, renderer=None): + + + # the clip path must be updated every draw. any solution? -JJ + self.bbox_image.set_clip_path(self._path, self.get_transform()) + self.bbox_image.draw(renderer) + + mpatches.PathPatch.draw(self, renderer) + + +if 1: + + usetex = plt.rcParams["text.usetex"] + + fig = plt.figure(1) + + # EXAMPLE 1 + + ax = plt.subplot(211) + + from matplotlib._png import read_png + fn = get_sample_data("lena.png", asfileobj=False) + arr = read_png(fn) + + text_path = TextPath((0, 0), "!?", size=150) + p = PathClippedImagePatch(text_path, arr, ec="k", + transform=IdentityTransform()) + + #p.set_clip_on(False) + + # make offset box + offsetbox = AuxTransformBox(IdentityTransform()) + offsetbox.add_artist(p) + + # make anchored offset box + ao = AnchoredOffsetbox(loc=2, child=offsetbox, frameon=True, borderpad=0.2) + ax.add_artist(ao) + + # another text + from matplotlib.patches import PathPatch + if usetex: + r = r"\mbox{textpath supports mathtext \& \TeX}" + else: + r = r"textpath supports mathtext & TeX" + + text_path = TextPath((0, 0), r, + size=20, usetex=usetex) + + p1 = PathPatch(text_path, ec="w", lw=3, fc="w", alpha=0.9, + transform=IdentityTransform()) + p2 = PathPatch(text_path, ec="none", fc="k", + transform=IdentityTransform()) + + offsetbox2 = AuxTransformBox(IdentityTransform()) + offsetbox2.add_artist(p1) + offsetbox2.add_artist(p2) + + ab = AnnotationBbox(offsetbox2, (0.95, 0.05), + xycoords='axes fraction', + boxcoords="offset points", + box_alignment=(1.,0.), + frameon=False + ) + ax.add_artist(ab) + + ax.imshow([[0,1,2],[1,2,3]], cmap=plt.cm.gist_gray_r, + interpolation="bilinear", + aspect="auto") + + + + # EXAMPLE 2 + + ax = plt.subplot(212) + + arr = np.arange(256).reshape(1,256)/256. + + if usetex: + s = r"$\displaystyle\left[\sum_{n=1}^\infty\frac{-e^{i\pi}}{2^n}\right]$!" + else: + s = r"$\left[\sum_{n=1}^\infty\frac{-e^{i\pi}}{2^n}\right]$!" + text_path = TextPath((0, 0), s, size=40, usetex=usetex) + text_patch = PathClippedImagePatch(text_path, arr, ec="none", + transform=IdentityTransform()) + + shadow1 = mpatches.Shadow(text_patch, 1, -1, props=dict(fc="none", ec="0.6", lw=3)) + shadow2 = mpatches.Shadow(text_patch, 1, -1, props=dict(fc="0.3", ec="none")) + + + # make offset box + offsetbox = AuxTransformBox(IdentityTransform()) + offsetbox.add_artist(shadow1) + offsetbox.add_artist(shadow2) + offsetbox.add_artist(text_patch) + + # place the anchored offset box using AnnotationBbox + ab = AnnotationBbox(offsetbox, (0.5, 0.5), + xycoords='data', + boxcoords="offset points", + box_alignment=(0.5,0.5), + ) + #text_path.set_size(10) + + ax.add_artist(ab) + + ax.set_xlim(0, 1) + ax.set_ylim(0, 1) + + + plt.draw() + plt.show() diff -Nru matplotlib-0.99.3/examples/pylab_examples/demo_text_rotation_mode.py matplotlib-1.0.1/examples/pylab_examples/demo_text_rotation_mode.py --- matplotlib-0.99.3/examples/pylab_examples/demo_text_rotation_mode.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/examples/pylab_examples/demo_text_rotation_mode.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,11 +1,11 @@ #clf() -from mpl_toolkits.axes_grid.axes_grid import AxesGrid +from mpl_toolkits.axes_grid1.axes_grid import ImageGrid def test_rotation_mode(fig, mode, subplot_location): ha_list = "left center right".split() va_list = "top center baseline bottom".split() - grid = AxesGrid(fig, subplot_location, + grid = ImageGrid(fig, subplot_location, nrows_ncols=(len(va_list), len(ha_list)), share_all=True, aspect=True, #label_mode='1', cbar_mode=None) diff -Nru matplotlib-0.99.3/examples/pylab_examples/dolphin.py matplotlib-1.0.1/examples/pylab_examples/dolphin.py --- matplotlib-0.99.3/examples/pylab_examples/dolphin.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/examples/pylab_examples/dolphin.py 2010-07-07 01:41:55.000000000 +0000 @@ -20,7 +20,7 @@ im = plt.imshow(np.random.random((100, 100)), origin='lower', cmap=cm.winter, interpolation='spline36', - extent=([-1, 1, -1, 1]), zorder=1000) + extent=([-1, 1, -1, 1])) im.set_clip_path(circle) plt.plot(x, y, 'o', color=(0.9, 0.9, 1.0), alpha=0.8) diff -Nru matplotlib-0.99.3/examples/pylab_examples/errorbar_demo.py matplotlib-1.0.1/examples/pylab_examples/errorbar_demo.py --- matplotlib-0.99.3/examples/pylab_examples/errorbar_demo.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/examples/pylab_examples/errorbar_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,46 +1,48 @@ #!/usr/bin/env python -from pylab import * +import numpy as np +import matplotlib.pyplot as plt -t = arange(0.1, 4, 0.1) -s = exp(-t) -e = 0.1*abs(randn(len(s))) -f = 0.1*abs(randn(len(s))) -g = 2*e -h = 2*f +# example data +x = np.arange(0.1, 4, 0.5) +y = np.exp(-x) + +# example variable error bar values +yerr = 0.1 + 0.2*np.sqrt(x) +xerr = 0.1 + yerr + +# First illustrate basic pyplot interface, using defaults where possible. +plt.figure() +plt.errorbar(x, y, xerr=0.2, yerr=0.4) +plt.title("Simplest errorbars, 0.2 in x, 0.4 in y") + +# Now switch to a more OO interface to exercise more features. +fig, axs = plt.subplots(nrows=2, ncols=2, sharex=True) +ax = axs[0,0] +ax.errorbar(x, y, yerr=yerr, fmt='o') +ax.set_title('Vert. symmetric') + +# With 4 subplots, reduce the number of axis ticks to avoid crowding. +ax.locator_params(nbins=4) + +ax = axs[0,1] +ax.errorbar(x, y, xerr=xerr, fmt='o') +ax.set_title('Hor. symmetric') + +ax = axs[1,0] +ax.errorbar(x, y, yerr=[yerr, 2*yerr], xerr=[xerr, 2*xerr], fmt='--o') +ax.set_title('H, V asymmetric') -figure() -errorbar(t, s, e, fmt='o') # vertical symmetric - -figure() -errorbar(t, s, None, f, fmt='o') # horizontal symmetric - -figure() -errorbar(t, s, e, f, fmt='o') # both symmetric - -figure() -errorbar(t, s, [e,g], [f,h], fmt='--o') # both asymmetric - -figure() -errorbar(t, s, [e,g], f, fmt='o', ecolor='g') # both mixed - -figure() -errorbar(t, s, e, [f,h], fmt='o') # both mixed - -figure() -errorbar(t, s, [e,g], fmt='o') # vertical asymmetric +ax = axs[1,1] +ax.set_yscale('log') +# Here we have to be careful to keep all y values positive: +ylower = np.maximum(1e-2, y - yerr) +yerr_lower = y - ylower -figure() -errorbar(t, s, yerr=e, fmt='o') # named +ax.errorbar(x, y, yerr=[yerr_lower, 2*yerr], xerr=xerr, + fmt='o', ecolor='g') +ax.set_title('Mixed sym., log y') -figure() -errorbar(t, s, xerr=f, fmt='o') # named -xlabel('Distance (m)') -ylabel('Height (m)') -title('Mean and standard error as a function of distance') +fig.suptitle('Variable errorbars') -figure() -ax = subplot(111) -ax.set_yscale('log') -errorbar(t, s+2, e, f, fmt='o') # both symmetric +plt.show() -show() diff -Nru matplotlib-0.99.3/examples/pylab_examples/fancyarrow_demo.py matplotlib-1.0.1/examples/pylab_examples/fancyarrow_demo.py --- matplotlib-0.99.3/examples/pylab_examples/fancyarrow_demo.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/examples/pylab_examples/fancyarrow_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -4,7 +4,7 @@ styles = mpatches.ArrowStyle.get_styles() ncol=2 -nrow = len(styles) // ncol + 1 +nrow = (len(styles)+1) // ncol figheight = (nrow+0.5) fig1 = plt.figure(1, (4.*ncol/1.5, figheight/1.5)) fontsize = 0.2 * 70 @@ -15,13 +15,19 @@ ax.set_xlim(0, 4*ncol) ax.set_ylim(0, figheight) +def to_texstring(s): + s = s.replace("<", r"$<$") + s = s.replace(">", r"$>$") + s = s.replace("|", r"$|$") + return s + for i, (stylename, styleclass) in enumerate(sorted(styles.items())): x = 3.2 + (i//nrow)*4 y = (figheight - 0.7 - i%nrow) # /figheight p = mpatches.Circle((x, y), 0.2, fc="w") ax.add_patch(p) - ax.annotate(stylename, (x, y), + ax.annotate(to_texstring(stylename), (x, y), (x-1.2, y), #xycoords="figure fraction", textcoords="figure fraction", ha="right", va="center", diff -Nru matplotlib-0.99.3/examples/pylab_examples/figimage_demo.py matplotlib-1.0.1/examples/pylab_examples/figimage_demo.py --- matplotlib-0.99.3/examples/pylab_examples/figimage_demo.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/examples/pylab_examples/figimage_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,5 +1,6 @@ """ -See pcolor_demo2 for a much faster way of generating pcolor plots +This illustrates placing images directly in the figure, with no axes. + """ import numpy as np import matplotlib @@ -15,13 +16,6 @@ im1 = plt.figimage(Z, xo=50, yo=0, cmap=cm.jet, origin='lower') im2 = plt.figimage(Z, xo=100, yo=100, alpha=.8, cmap=cm.jet, origin='lower') - -if 0: - dpi = 72 - plt.savefig('figimage_%d.png'%dpi, dpi=dpi, facecolor='gray') - plt.savefig('figimage_%d.pdf'%dpi, dpi=dpi, facecolor='gray') - plt.savefig('figimage_%d.svg'%dpi, dpi=dpi, facecolor='gray') - plt.savefig('figimage_%d.eps'%dpi, dpi=dpi, facecolor='gray') plt.show() diff -Nru matplotlib-0.99.3/examples/pylab_examples/fill_between_demo.py matplotlib-1.0.1/examples/pylab_examples/fill_between_demo.py --- matplotlib-0.99.3/examples/pylab_examples/fill_between_demo.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/examples/pylab_examples/fill_between_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -29,16 +29,16 @@ fig = figure() ax = fig.add_subplot(211) ax.plot(x, y1, x, y2, color='black') -ax.fill_between(x, y1, y2, where=y2>=y1, facecolor='green') -ax.fill_between(x, y1, y2, where=y2<=y1, facecolor='red') +ax.fill_between(x, y1, y2, where=y2>=y1, facecolor='green', interpolate=True) +ax.fill_between(x, y1, y2, where=y2<=y1, facecolor='red', interpolate=True) ax.set_title('fill between where') # Test support for masked arrays. y2 = np.ma.masked_greater(y2, 1.0) ax1 = fig.add_subplot(212, sharex=ax) ax1.plot(x, y1, x, y2, color='black') -ax1.fill_between(x, y1, y2, where=y2>=y1, facecolor='green') -ax1.fill_between(x, y1, y2, where=y2<=y1, facecolor='red') +ax1.fill_between(x, y1, y2, where=y2>=y1, facecolor='green', interpolate=True) +ax1.fill_between(x, y1, y2, where=y2<=y1, facecolor='red', interpolate=True) ax1.set_title('Now regions with y2>1 are masked') # This example illustrates a problem; because of the data diff -Nru matplotlib-0.99.3/examples/pylab_examples/filledmarker_demo.py matplotlib-1.0.1/examples/pylab_examples/filledmarker_demo.py --- matplotlib-0.99.3/examples/pylab_examples/filledmarker_demo.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/examples/pylab_examples/filledmarker_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -0,0 +1,38 @@ +import itertools + +import numpy as np +import matplotlib.lines as mlines +import matplotlib.pyplot as plt + +colors = itertools.cycle(['b', 'g', 'r', 'c', 'm', 'y', 'k']) +altcolor = 'lightgreen' + +plt.rcParams['text.usetex'] = False # otherwise, '^' will cause trouble + +y = np.arange(10) +for marker in mlines.Line2D.filled_markers: + f = plt.figure() + f.text(.5,.95, "marker = %r" % marker, ha='center') + for i,fs in enumerate(mlines.Line2D.fillStyles): + color = colors.next() + + ax = f.add_subplot(121) + ax.plot(2*(4-i)+y, c=color, + marker=marker, + markersize=20, + fillstyle=fs, + label=fs) + ax.legend(loc=2) + ax.set_title('fillstyle') + + ax = f.add_subplot(122) + ax.plot(2*(4-i)+y, c=color, + marker=marker, + markersize=20, + markerfacecoloralt=altcolor, + fillstyle=fs, + label=fs) + ax.legend(loc=2) + ax.set_title('fillstyle') + +plt.show() diff -Nru matplotlib-0.99.3/examples/pylab_examples/finance_demo.py matplotlib-1.0.1/examples/pylab_examples/finance_demo.py --- matplotlib-0.99.3/examples/pylab_examples/finance_demo.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/examples/pylab_examples/finance_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,14 +1,13 @@ #!/usr/bin/env python from pylab import * from matplotlib.dates import DateFormatter, WeekdayLocator, HourLocator, \ - DayLocator, MONDAY, timezone + DayLocator, MONDAY from matplotlib.finance import quotes_historical_yahoo, candlestick,\ plot_day_summary, candlestick2 -import datetime - -date1 = datetime.date( 2004, 2, 1) -date2 = datetime.date( 2004, 4, 12 ) +# (Year, month, day) tuples suffice as args for quotes_historical_yahoo +date1 = ( 2004, 2, 1) +date2 = ( 2004, 4, 12 ) mondays = WeekdayLocator(MONDAY) # major ticks on the mondays @@ -16,9 +15,8 @@ weekFormatter = DateFormatter('%b %d') # Eg, Jan 12 dayFormatter = DateFormatter('%d') # Eg, 12 -quotes = quotes_historical_yahoo( - 'INTC', date1, date2) -if not quotes: +quotes = quotes_historical_yahoo('INTC', date1, date2) +if len(quotes) == 0: raise SystemExit fig = figure() diff -Nru matplotlib-0.99.3/examples/pylab_examples/griddata_demo.py matplotlib-1.0.1/examples/pylab_examples/griddata_demo.py --- matplotlib-0.99.3/examples/pylab_examples/griddata_demo.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/examples/pylab_examples/griddata_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -11,15 +11,15 @@ z = x*np.exp(-x**2-y**2) # define grid. xi = np.linspace(-2.1,2.1,100) -yi = np.linspace(-2.1,2.1,100) +yi = np.linspace(-2.1,2.1,200) # grid the data. -zi = griddata(x,y,z,xi,yi) +zi = griddata(x,y,z,xi,yi,interp='linear') # contour the gridded data, plotting dots at the nonuniform data points. CS = plt.contour(xi,yi,zi,15,linewidths=0.5,colors='k') CS = plt.contourf(xi,yi,zi,15,cmap=plt.cm.jet) plt.colorbar() # draw colorbar # plot data points. -plt.scatter(x,y,marker='o',c='b',s=5) +plt.scatter(x,y,marker='o',c='b',s=5,zorder=10) plt.xlim(-2,2) plt.ylim(-2,2) plt.title('griddata test (%d points)' % npts) diff -Nru matplotlib-0.99.3/examples/pylab_examples/histogram_demo_extended.py matplotlib-1.0.1/examples/pylab_examples/histogram_demo_extended.py --- matplotlib-0.99.3/examples/pylab_examples/histogram_demo_extended.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/examples/pylab_examples/histogram_demo_extended.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,4 +1,5 @@ #!/usr/bin/env python +import numpy as np import pylab as P # @@ -63,13 +64,18 @@ # # histogram has the ability to plot multiple data in parallel ... +# Note the new color kwarg, used to override the default, which +# uses the line color cycle. # P.figure() # create a new data-set x = mu + sigma*P.randn(1000,3) -n, bins, patches = P.hist(x, 10, normed=1, histtype='bar') +n, bins, patches = P.hist(x, 10, normed=1, histtype='bar', + color=['crimson', 'burlywood', 'chartreuse'], + label=['Crimson', 'Burlywood', 'Chartreuse']) +P.legend() # # ... or we can stack the data @@ -85,8 +91,20 @@ x1 = mu + sigma*P.randn(7000) x2 = mu + sigma*P.randn(3000) +# and exercise the weights option by arbitrarily giving the first half +# of each series only half the weight of the others: + +w0 = np.ones_like(x0) +w0[:len(x0)/2] = 0.5 +w1 = np.ones_like(x1) +w1[:len(x1)/2] = 0.5 +w2 = np.ones_like(x2) +w0[:len(x2)/2] = 0.5 + + + P.figure() -n, bins, patches = P.hist( [x0,x1,x2], 10, histtype='bar') +n, bins, patches = P.hist( [x0,x1,x2], 10, weights=[w0, w1, w2], histtype='bar') P.show() diff -Nru matplotlib-0.99.3/examples/pylab_examples/image_demo2.py matplotlib-1.0.1/examples/pylab_examples/image_demo2.py --- matplotlib-0.99.3/examples/pylab_examples/image_demo2.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/examples/pylab_examples/image_demo2.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,8 +1,12 @@ #!/usr/bin/env python from pylab import * +import matplotlib.cbook as cbook w, h = 512, 512 -s = file('../data/ct.raw', 'rb').read() + +datafile = cbook.get_sample_data('ct.raw', asfileobj=False) +print 'loading', datafile +s = file(datafile, 'rb').read() A = fromstring(s, uint16).astype(float) A *= 1.0/max(A) A.shape = w, h diff -Nru matplotlib-0.99.3/examples/pylab_examples/image_demo3.py matplotlib-1.0.1/examples/pylab_examples/image_demo3.py --- matplotlib-0.99.3/examples/pylab_examples/image_demo3.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/examples/pylab_examples/image_demo3.py 2010-07-07 01:41:55.000000000 +0000 @@ -5,7 +5,10 @@ except ImportError, exc: raise SystemExit("PIL must be installed to run this example") -lena = Image.open('../data/lena.jpg') +import matplotlib.cbook as cbook + +datafile = cbook.get_sample_data('lena.jpg') +lena = Image.open(datafile) dpi = rcParams['figure.dpi'] figsize = lena.size[0]/dpi, lena.size[1]/dpi diff -Nru matplotlib-0.99.3/examples/pylab_examples/line_styles.py matplotlib-1.0.1/examples/pylab_examples/line_styles.py --- matplotlib-0.99.3/examples/pylab_examples/line_styles.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/examples/pylab_examples/line_styles.py 2010-07-07 01:41:55.000000000 +0000 @@ -17,19 +17,28 @@ except TypeError: pass -styles = linestyles + markers +styles = markers + [ + r'$\lambda$', + r'$\bowtie$', + r'$\circlearrowleft$', + r'$\clubsuit$', + r'$\checkmark$'] colors = ('b', 'g', 'r', 'c', 'm', 'y', 'k') +plt.figure(figsize=(8,8)) axisNum = 0 -for row in range(5): +for row in range(6): for col in range(5): axisNum += 1 - ax = plt.subplot(5, 5, axisNum) - style = styles[axisNum % len(styles) ] - color = colors[axisNum % len(colors) ] - plt.plot(t,s, style + color, markersize=10) + ax = plt.subplot(6, 5, axisNum) + color = colors[axisNum % len(colors)] + if axisNum < len(linestyles): + plt.plot(t, s, linestyles[axisNum], color=color, markersize=10) + else: + style = styles[(axisNum - len(linestyles)) % len(styles)] + plt.plot(t, s, linestyle='None', marker=style, color=color, markersize=10) ax.set_yticklabels([]) ax.set_xticklabels([]) diff -Nru matplotlib-0.99.3/examples/pylab_examples/load_converter.py matplotlib-1.0.1/examples/pylab_examples/load_converter.py --- matplotlib-0.99.3/examples/pylab_examples/load_converter.py 2009-08-03 22:34:34.000000000 +0000 +++ matplotlib-1.0.1/examples/pylab_examples/load_converter.py 2010-07-07 01:41:55.000000000 +0000 @@ -2,9 +2,13 @@ #from matplotlib.mlab import load import numpy as np from pylab import figure, show +import matplotlib.cbook as cbook + +datafile = cbook.get_sample_data('msft.csv', asfileobj=False) +print 'loading', datafile dates, closes = np.loadtxt( - '../data/msft.csv', delimiter=',', + datafile, delimiter=',', converters={0:strpdate2num('%d-%b-%y')}, skiprows=1, usecols=(0,2), unpack=True) diff -Nru matplotlib-0.99.3/examples/pylab_examples/loadrec.py matplotlib-1.0.1/examples/pylab_examples/loadrec.py --- matplotlib-0.99.3/examples/pylab_examples/loadrec.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/examples/pylab_examples/loadrec.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,7 +1,10 @@ from matplotlib import mlab from pylab import figure, show +import matplotlib.cbook as cbook -a = mlab.csv2rec('../data/msft.csv') +datafile = cbook.get_sample_data('msft.csv', asfileobj=False) +print 'loading', datafile +a = mlab.csv2rec(datafile) a.sort() print a.dtype diff -Nru matplotlib-0.99.3/examples/pylab_examples/logo.py matplotlib-1.0.1/examples/pylab_examples/logo.py --- matplotlib-0.99.3/examples/pylab_examples/logo.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/examples/pylab_examples/logo.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,11 +1,13 @@ #!/usr/bin/env python # This file generates the matplotlib web page logo from pylab import * - +import matplotlib.cbook as cbook # convert data to mV -x = 1000*0.1*fromstring( - file('../data/membrane.dat', 'rb').read(), float32) +datafile = cbook.get_sample_data('membrane.dat', asfileobj=False) +print 'loading', datafile + +x = 1000*0.1*fromstring(file(datafile, 'rb').read(), float32) # 0.0005 is the sample interval t = 0.0005*arange(len(x)) figure(1, figsize=(7,1), dpi=100) diff -Nru matplotlib-0.99.3/examples/pylab_examples/mri_demo.py matplotlib-1.0.1/examples/pylab_examples/mri_demo.py --- matplotlib-0.99.3/examples/pylab_examples/mri_demo.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/examples/pylab_examples/mri_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,9 +1,10 @@ #!/usr/bin/env python from pylab import * - +import matplotlib.cbook as cbook # data are 256x256 16 bit integers -dfile = '../data/s1045.ima' -im = fromstring(file(dfile, 'rb').read(), uint16).astype(float) +dfile = cbook.get_sample_data('s1045.ima', asfileobj=False) +print 'loading image', dfile +im = np.fromstring(file(dfile, 'rb').read(), np.uint16).astype(float) im.shape = 256, 256 #imshow(im, ColormapJet(256)) diff -Nru matplotlib-0.99.3/examples/pylab_examples/mri_with_eeg.py matplotlib-1.0.1/examples/pylab_examples/mri_with_eeg.py --- matplotlib-0.99.3/examples/pylab_examples/mri_with_eeg.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/examples/pylab_examples/mri_with_eeg.py 2010-07-07 01:41:55.000000000 +0000 @@ -9,12 +9,13 @@ from matplotlib.pyplot import * from matplotlib.collections import LineCollection - +import matplotlib.cbook as cbook # I use if 1 to break up the different regions of code visually if 1: # load the data # data are 256x256 16 bit integers - dfile = '../data/s1045.ima' + dfile = cbook.get_sample_data('s1045.ima', asfileobj=False) + print 'loading image', dfile im = np.fromstring(file(dfile, 'rb').read(), np.uint16).astype(float) im.shape = 256, 256 @@ -38,7 +39,9 @@ # load the data numSamples, numRows = 800,4 - data = np.fromstring(file('../data/eeg.dat', 'rb').read(), float) + eegfile = cbook.get_sample_data('eeg.dat', asfileobj=False) + print 'loading eeg', eegfile + data = np.fromstring(file(eegfile, 'rb').read(), float) data.shape = numSamples, numRows t = 10.0 * np.arange(numSamples, dtype=float)/numSamples ticklocs = [] diff -Nru matplotlib-0.99.3/examples/pylab_examples/multicolored_line.py matplotlib-1.0.1/examples/pylab_examples/multicolored_line.py --- matplotlib-0.99.3/examples/pylab_examples/multicolored_line.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/examples/pylab_examples/multicolored_line.py 2010-07-07 01:41:55.000000000 +0000 @@ -0,0 +1,53 @@ +#!/usr/bin/env python +''' +Color parts of a line based on its properties, e.g., slope. +''' +import numpy as np +import matplotlib.pyplot as plt +from matplotlib.collections import LineCollection +from matplotlib.colors import ListedColormap, BoundaryNorm + +x = np.linspace(0, 3 * np.pi, 500) +y = np.sin(x) +z = np.cos(0.5 * (x[:-1] + x[1:])) # first derivative + +# Create a colormap for red, green and blue and a norm to color +# f' < -0.5 red, f' > 0.5 blue, and the rest green +cmap = ListedColormap(['r', 'g', 'b']) +norm = BoundaryNorm([-1, -0.5, 0.5, 1], cmap.N) + +# Create a set of line segments so that we can color them individually +# This creates the points as a N x 1 x 2 array so that we can stack points +# together easily to get the segments. The segments array for line collection +# needs to be numlines x points per line x 2 (x and y) +points = np.array([x, y]).T.reshape(-1, 1, 2) +segments = np.concatenate([points[:-1], points[1:]], axis=1) + +# Create the line collection object, setting the colormapping parameters. +# Have to set the actual values used for colormapping separately. +lc = LineCollection(segments, cmap=cmap, norm=norm) +lc.set_array(z) +lc.set_linewidth(3) + +fig1 = plt.figure() +plt.gca().add_collection(lc) +plt.xlim(x.min(), x.max()) +plt.ylim(-1.1, 1.1) + +# Now do a second plot coloring the curve using a continuous colormap +t = np.linspace(0, 10, 200) +x = np.cos(np.pi * t) +y = np.sin(t) +points = np.array([x, y]).T.reshape(-1, 1, 2) +segments = np.concatenate([points[:-1], points[1:]], axis=1) + +lc = LineCollection(segments, cmap=plt.get_cmap('copper'), + norm=plt.Normalize(0, 10)) +lc.set_array(t) +lc.set_linewidth(3) + +fig2 = plt.figure() +plt.gca().add_collection(lc) +plt.xlim(-1, 1) +plt.ylim(-1, 1) +plt.show() diff -Nru matplotlib-0.99.3/examples/pylab_examples/multi_image.py matplotlib-1.0.1/examples/pylab_examples/multi_image.py --- matplotlib-0.99.3/examples/pylab_examples/multi_image.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/examples/pylab_examples/multi_image.py 2010-07-07 01:41:55.000000000 +0000 @@ -5,7 +5,7 @@ It also illustrates colorbar tick labelling with a multiplier. ''' -from matplotlib.pyplot import figure, show, sci +from matplotlib.pyplot import figure, show, axes, sci from matplotlib import cm, colors from matplotlib.font_manager import FontProperties from numpy import amin, amax, ravel @@ -68,9 +68,11 @@ # The colorbar is also based on this master image. fig.colorbar(images[0], cax, orientation='horizontal') -# We need the following only if we want to run this +# We need the following only if we want to run this interactively and +# modify the colormap: -sci(images[0]) +axes(ax[0]) # Return the current axes to the first one, +sci(images[0]) # because the current image must be in current axes. show() diff -Nru matplotlib-0.99.3/examples/pylab_examples/multipage_pdf.py matplotlib-1.0.1/examples/pylab_examples/multipage_pdf.py --- matplotlib-0.99.3/examples/pylab_examples/multipage_pdf.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/examples/pylab_examples/multipage_pdf.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,5 +1,6 @@ # This is a demo of creating a pdf file with several pages. +import datetime import numpy as np import matplotlib from matplotlib.backends.backend_pdf import PdfPages @@ -29,5 +30,14 @@ pdf.savefig(fig) # or you can pass a Figure object to pdf.savefig close() +# We can also set the file's metadata via the PdfPages object: +d = pdf.infodict() +d['Title'] = 'Multipage PDF Example' +d['Author'] = u'Jouni K. Sepp\xe4nen' +d['Subject'] = 'How to create a multipage pdf file and set its metadata' +d['Keywords'] = 'PdfPages multipage keywords author title subject' +d['CreationDate'] = datetime.datetime(2009,11,13) +d['ModDate'] = datetime.datetime.today() + # Remember to close the object - otherwise the file will not be usable pdf.close() diff -Nru matplotlib-0.99.3/examples/pylab_examples/multiple_yaxis_with_spines.py matplotlib-1.0.1/examples/pylab_examples/multiple_yaxis_with_spines.py --- matplotlib-0.99.3/examples/pylab_examples/multiple_yaxis_with_spines.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/examples/pylab_examples/multiple_yaxis_with_spines.py 2010-07-07 01:41:55.000000000 +0000 @@ -0,0 +1,66 @@ +import matplotlib.pyplot as plt + +def make_patch_spines_invisible(ax): + par2.set_frame_on(True) + par2.patch.set_visible(False) + for sp in par2.spines.itervalues(): + sp.set_visible(False) + +def make_spine_invisible(ax, direction): + if direction in ["right", "left"]: + ax.yaxis.set_ticks_position(direction) + ax.yaxis.set_label_position(direction) + elif direction in ["top", "bottom"]: + ax.xaxis.set_ticks_position(direction) + ax.xaxis.set_label_position(direction) + else: + raise ValueError("Unknown Direction : %s" % (direction,)) + + ax.spines[direction].set_visible(True) + + +if 1: + fig = plt.figure(1) + + host = fig.add_subplot(111) + + host.set_xlabel("Distance") + + par1 = host.twinx() + par2 = host.twinx() + + par2.spines["right"].set_position(("axes", 1.2)) + make_patch_spines_invisible(par2) + make_spine_invisible(par2, "right") + + plt.subplots_adjust(right=0.75) + + + p1, = host.plot([0, 1, 2], [0, 1, 2], "b-", label="Density") + p2, = par1.plot([0, 1, 2], [0, 3, 2], "r-", label="Temperature") + p3, = par2.plot([0, 1, 2], [50, 30, 15], "g-", label="Velocity") + + host.set_xlim(0, 2) + host.set_ylim(0, 2) + par1.set_ylim(0, 4) + par2.set_ylim(1, 65) + + host.set_xlabel("Distance") + host.set_ylabel("Density") + par1.set_ylabel("Temperature") + par2.set_ylabel("Velocity") + + host.yaxis.label.set_color(p1.get_color()) + par1.yaxis.label.set_color(p2.get_color()) + par2.yaxis.label.set_color(p3.get_color()) + + tkw = dict(size=4, width=1.5) + host.tick_params(axis='y', colors=p1.get_color(), **tkw) + par1.tick_params(axis='y', colors=p2.get_color(), **tkw) + par2.tick_params(axis='y', colors=p3.get_color(), **tkw) + host.tick_params(axis='x', **tkw) + + lines = [p1, p2, p3] + host.legend(lines, [l.get_label() for l in lines]) + plt.show() + diff -Nru matplotlib-0.99.3/examples/pylab_examples/patheffect_demo.py matplotlib-1.0.1/examples/pylab_examples/patheffect_demo.py --- matplotlib-0.99.3/examples/pylab_examples/patheffect_demo.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/examples/pylab_examples/patheffect_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -0,0 +1,37 @@ +import matplotlib.pyplot as plt +import matplotlib.patheffects as PathEffects +import numpy as np + +if 1: + plt.figure(1, figsize=(8,3)) + ax1 = plt.subplot(131) + ax1.imshow([[1,2],[2,3]]) + txt = ax1.annotate("test", (1., 1.), (0., 0), + arrowprops=dict(arrowstyle="->", + connectionstyle="angle3", lw=2), + size=20, ha="center") + + txt.set_path_effects([PathEffects.withStroke(linewidth=3, + foreground="w")]) + txt.arrow_patch.set_path_effects([PathEffects.Stroke(linewidth=5, + foreground="w"), + PathEffects.Normal()]) + + ax2 = plt.subplot(132) + arr = np.arange(25).reshape((5,5)) + ax2.imshow(arr) + cntr = ax2.contour(arr, colors="k") + clbls = ax2.clabel(cntr, fmt="%2.0f", use_clabeltext=True) + plt.setp(clbls, + path_effects=[PathEffects.withStroke(linewidth=3, + foreground="w")]) + + + # shadow as a path effect + ax3 = plt.subplot(133) + p1, = ax3.plot([0, 1], [0, 1]) + leg = ax3.legend([p1], ["Line 1"], fancybox=True, loc=2) + leg.legendPatch.set_path_effects([PathEffects.withSimplePatchShadow()]) + + plt.show() + diff -Nru matplotlib-0.99.3/examples/pylab_examples/plotfile_demo.py matplotlib-1.0.1/examples/pylab_examples/plotfile_demo.py --- matplotlib-0.99.3/examples/pylab_examples/plotfile_demo.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/examples/pylab_examples/plotfile_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,7 +1,8 @@ from pylab import plotfile, show, gca +import matplotlib.cbook as cbook -fname = '../data/msft.csv' -fname2 = '../data/data_x_x2_x3.csv' +fname = cbook.get_sample_data('msft.csv', asfileobj=False) +fname2 = cbook.get_sample_data('data_x_x2_x3.csv', asfileobj=False) # test 1; use ints plotfile(fname, (0,5,6)) diff -Nru matplotlib-0.99.3/examples/pylab_examples/polar_demo.py matplotlib-1.0.1/examples/pylab_examples/polar_demo.py --- matplotlib-0.99.3/examples/pylab_examples/polar_demo.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/examples/pylab_examples/polar_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -28,7 +28,7 @@ # # you could change the radial bounding box (zoom out) by setting the # ylim (radial coordinate is the second argument to the plot command, -# as in matlab(TM), though this is not advised currently because it is not +# as in MATLAB, though this is not advised currently because it is not # clear to me how the axes should behave in the change of view limits. # Please advise me if you have opinions. Likewise, the pan/zoom # controls probably do not do what you think they do and are better @@ -48,7 +48,7 @@ rc('ytick', labelsize=15) # force square figure and square axes looks better for polar, IMO -width, height = matplotlib.rcParams['figure.figsize'] +width, height = matplotlib.rcParams['figure.figsize'] size = min(width, height) # make a square figure fig = figure(figsize=(size, size)) diff -Nru matplotlib-0.99.3/examples/pylab_examples/psd_demo3.py matplotlib-1.0.1/examples/pylab_examples/psd_demo3.py --- matplotlib-0.99.3/examples/pylab_examples/psd_demo3.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/examples/pylab_examples/psd_demo3.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,6 +1,6 @@ -#This is a ported version of a Matlab example from the signal processing +#This is a ported version of a MATLAB example from the signal processing #toolbox that showed some difference at one time between Matplotlib's and -#MatLab's scaling of the PSD. +#MATLAB's scaling of the PSD. import numpy as np import matplotlib.pyplot as plt diff -Nru matplotlib-0.99.3/examples/pylab_examples/psd_demo_complex.py matplotlib-1.0.1/examples/pylab_examples/psd_demo_complex.py --- matplotlib-0.99.3/examples/pylab_examples/psd_demo_complex.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/examples/pylab_examples/psd_demo_complex.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,6 +1,6 @@ -#This is a ported version of a Matlab example from the signal processing +#This is a ported version of a MATLAB example from the signal processing #toolbox that showed some difference at one time between Matplotlib's and -#MatLab's scaling of the PSD. This differs from psd_demo3.py in that +#MATLAB's scaling of the PSD. This differs from psd_demo3.py in that #this uses a complex signal, so we can see that complex PSD's work properly import numpy as np import matplotlib.pyplot as plt diff -Nru matplotlib-0.99.3/examples/pylab_examples/psd_demo.py matplotlib-1.0.1/examples/pylab_examples/psd_demo.py --- matplotlib-0.99.3/examples/pylab_examples/psd_demo.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/examples/pylab_examples/psd_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -19,7 +19,7 @@ show() """ -% compare with matlab(TM) +% compare with MATLAB dt = 0.01; t = [0:dt:10]; nse = randn(size(t)); diff -Nru matplotlib-0.99.3/examples/pylab_examples/quadmesh_demo.py matplotlib-1.0.1/examples/pylab_examples/quadmesh_demo.py --- matplotlib-0.99.3/examples/pylab_examples/quadmesh_demo.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/examples/pylab_examples/quadmesh_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -11,7 +11,7 @@ from matplotlib import cm, colors from numpy import ma -n = 56 +n = 12 x = np.linspace(-1.5,1.5,n) y = np.linspace(-1.5,1.5,n*2) X,Y = np.meshgrid(x,y); @@ -28,7 +28,7 @@ fig = figure() ax = fig.add_subplot(121) ax.set_axis_bgcolor("#bdb76b") -ax.pcolormesh(Qx,Qz,Z) +ax.pcolormesh(Qx,Qz,Z, shading='gouraud') ax.set_title('Without masked values') ax = fig.add_subplot(122) @@ -38,7 +38,7 @@ #cmap.set_bad('r', 1.0) #ax.pcolormesh(Qx,Qz,Zm, cmap=cmap) # Or use the default, which is transparent: -col = ax.pcolormesh(Qx,Qz,Zm) +col = ax.pcolormesh(Qx,Qz,Zm,shading='gouraud') ax.set_title('With masked values') diff -Nru matplotlib-0.99.3/examples/pylab_examples/scatter_demo2.py matplotlib-1.0.1/examples/pylab_examples/scatter_demo2.py --- matplotlib-0.99.3/examples/pylab_examples/scatter_demo2.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/examples/pylab_examples/scatter_demo2.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,16 +1,17 @@ """ make a scatter plot with varying color and size arguments """ -import matplotlib +import matplotlib import numpy as np import matplotlib.pyplot as plt import matplotlib.mlab as mlab +import matplotlib.cbook as cbook # load a numpy record array from yahoo csv data with fields date, # open, close, volume, adj_close from the mpl-data/example directory. # The record array stores python datetime.date as an object array in # the date column -datafile = matplotlib.get_example_data('goog.npy') +datafile = cbook.get_sample_data('goog.npy') r = np.load(datafile).view(np.recarray) r = r[-250:] # get the most recent 250 trading days diff -Nru matplotlib-0.99.3/examples/pylab_examples/set_and_get.py matplotlib-1.0.1/examples/pylab_examples/set_and_get.py --- matplotlib-0.99.3/examples/pylab_examples/set_and_get.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/examples/pylab_examples/set_and_get.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,6 +1,6 @@ """ -matlab(TM) and pylab allow you to use setp and get to set and get +MATLAB and pylab allow you to use setp and get to set and get object properties, as well as to do introspection on the object set diff -Nru matplotlib-0.99.3/examples/pylab_examples/shading_example.py matplotlib-1.0.1/examples/pylab_examples/shading_example.py --- matplotlib-0.99.3/examples/pylab_examples/shading_example.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/examples/pylab_examples/shading_example.py 2010-07-07 01:41:55.000000000 +0000 @@ -4,14 +4,14 @@ # example showing how to make shaded relief plots # like mathematica -# (http://reference.wolfram.com/mathematica/ref/ReliefPlot.html ) +# (http://reference.wolfram.com/mathematica/ref/ReliefPlot.html) # or Generic Mapping Tools # (http://gmt.soest.hawaii.edu/gmt/doc/gmt/html/GMT_Docs/node145.html) # test data X,Y=np.mgrid[-5:5:0.05,-5:5:0.05] Z=np.sqrt(X**2+Y**2)+np.sin(X**2+Y**2) -# creat light source object. +# create light source object. ls = LightSource(azdeg=0,altdeg=65) # shade data, creating an rgb array. rgb = ls.shade(Z,plt.cm.copper) diff -Nru matplotlib-0.99.3/examples/pylab_examples/simplification_clipping_test.py matplotlib-1.0.1/examples/pylab_examples/simplification_clipping_test.py --- matplotlib-0.99.3/examples/pylab_examples/simplification_clipping_test.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/examples/pylab_examples/simplification_clipping_test.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,72 +0,0 @@ -from pylab import * -import numpy as np -from matplotlib import patches, path -nan = np.nan -Path = path.Path - -t = arange(0.0, 2.0, 0.01) -s = sin(2*pi*t) -plot(t, s, linewidth=1.0) - -ylim((-0.20, -0.28)) - -title('Should see four lines extending from bottom to top') - -figure() - -x = np.array([1.0,2.0,3.0,2.0e5]) -y = np.arange(len(x)) -plot(x,y) -xlim(xmin=2,xmax=6) -title("Should be monotonically increasing") - -figure() - -x = np.array([0.0, 1.0, 0.0, -1.0, 0.0]) -y = np.array([1.0, 0.0, -1.0, 0.0, 1.0]) -plot(x, y) -xlim(xmin=-0.6, xmax=0.6) -ylim(ymin=-0.6, ymax=0.6) -title("Diamond shape, with segments visible in all four corners") - -figure() - -np.random.seed(0) -x = np.random.uniform(size=(5000,)) * 50 - -rcParams['path.simplify'] = True -p1 = plot(x,solid_joinstyle='round',linewidth=2.0) - -path = p1[0].get_path() -transform = p1[0].get_transform() -path = transform.transform_path(path) -simplified = list(path.iter_segments(simplify=(800, 600))) - -title("Original length: %d, simplified length: %d" % (len(path.vertices), len(simplified))) - -figure() - -x = np.sin(np.linspace(0, np.pi * 2.0, 1000)) + np.random.uniform(size=(1000,)) * 0.01 - -rcParams['path.simplify'] = True -p1 = plot(x,solid_joinstyle='round',linewidth=2.0) - -path = p1[0].get_path() -transform = p1[0].get_transform() -path = transform.transform_path(path) -simplified = list(path.iter_segments(simplify=(800, 600))) - -title("Original length: %d, simplified length: %d" % (len(path.vertices), len(simplified))) - -figure() -pp1 = patches.PathPatch( - Path([(0, 0), (1, 0), (1, 1), (nan, 1), (0, 0), (2, 0), (2, 2), (0, 0)], - [Path.MOVETO, Path.CURVE3, Path.CURVE3, Path.CURVE3, Path.CURVE3, Path.CURVE3, Path.CURVE3, Path.CLOSEPOLY]), - fc="none") - -gca().add_patch(pp1) -gca().set_xlim((0, 2)) -gca().set_ylim((0, 2)) -title("Should be one line with two curves below it") - -show() diff -Nru matplotlib-0.99.3/examples/pylab_examples/spine_placement_demo.py matplotlib-1.0.1/examples/pylab_examples/spine_placement_demo.py --- matplotlib-0.99.3/examples/pylab_examples/spine_placement_demo.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/examples/pylab_examples/spine_placement_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -37,6 +37,8 @@ ax.spines['right'].set_color('none') ax.spines['bottom'].set_position('center') ax.spines['top'].set_color('none') +ax.spines['left'].set_smart_bounds(True) +ax.spines['bottom'].set_smart_bounds(True) ax.xaxis.set_ticks_position('bottom') ax.yaxis.set_ticks_position('left') @@ -47,6 +49,8 @@ ax.spines['right'].set_color('none') ax.spines['bottom'].set_position('zero') ax.spines['top'].set_color('none') +ax.spines['left'].set_smart_bounds(True) +ax.spines['bottom'].set_smart_bounds(True) ax.xaxis.set_ticks_position('bottom') ax.yaxis.set_ticks_position('left') @@ -57,6 +61,8 @@ ax.spines['right'].set_color('none') ax.spines['bottom'].set_position(('axes',0.1)) ax.spines['top'].set_color('none') +ax.spines['left'].set_smart_bounds(True) +ax.spines['bottom'].set_smart_bounds(True) ax.xaxis.set_ticks_position('bottom') ax.yaxis.set_ticks_position('left') @@ -67,15 +73,17 @@ ax.spines['right'].set_color('none') ax.spines['bottom'].set_position(('data',2)) ax.spines['top'].set_color('none') +ax.spines['left'].set_smart_bounds(True) +ax.spines['bottom'].set_smart_bounds(True) ax.xaxis.set_ticks_position('bottom') ax.yaxis.set_ticks_position('left') - # ---------------------------------------------------- def adjust_spines(ax,spines): for loc, spine in ax.spines.iteritems(): if loc in spines: spine.set_position(('outward',10)) # outward by 10 points + spine.set_smart_bounds(True) else: spine.set_color('none') # don't draw spine @@ -113,4 +121,37 @@ ax.plot(x,y) adjust_spines(ax,['bottom']) +# ---------------------------------------------------- + +fig = plt.figure() + +x = np.linspace(0,2*np.pi,50) +y = np.sin(x) +y2 = y + 0.1*np.random.normal( size=x.shape ) + +# plot data +ax = fig.add_subplot(1,1,1) +line1,=ax.plot(x,y,'--') +line2,=ax.plot(x,y2,'bo') + +# adjust the spines +adjust_spines(ax,['left','bottom']) + +# set ticks and tick labels +# x +ax.set_xlim((0,2*np.pi)) +ax.set_xticks([0,np.pi,2*np.pi]) +pichr = unichr(0x03C0) +ax.set_xticklabels(['0',pichr,'2 '+pichr]) + +# y +ax.set_yticks([-1,0,1]) + +# disable clipping of data points by axes range +for artist in (line1,line2): + artist.set_clip_on(False) + +# adjust spine to be within ticks +ax.spines['left'].set_bounds( -1, 1 ) + show() diff -Nru matplotlib-0.99.3/examples/pylab_examples/subplots_demo.py matplotlib-1.0.1/examples/pylab_examples/subplots_demo.py --- matplotlib-0.99.3/examples/pylab_examples/subplots_demo.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/examples/pylab_examples/subplots_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -0,0 +1,63 @@ +"""Examples illustrating the use of plt.subplots(). + +This function creates a figure and a grid of subplots with a single call, while +providing reasonable control over how the individual plots are created. For +very refined tuning of subplot creation, you can still use add_subplot() +directly on a new figure. +""" + +import matplotlib.pyplot as plt +import numpy as np + +# Simple data to display in various forms +x = np.linspace(0, 2*np.pi, 400) +y = np.sin(x**2) + +plt.close('all') + +# Just a figure and one subplot +f, ax = plt.subplots() +ax.plot(x, y) +ax.set_title('Simple plot') + +# Two subplots, the axes array is 1-d +f, axarr = plt.subplots(2, sharex=True) +axarr[0].plot(x, y) +axarr[0].set_title('Sharing X axis') +axarr[1].scatter(x, y) + +# Two subplots, unpack the axes array immediately +f, (ax1, ax2) = plt.subplots(1, 2, sharey=True) +ax1.plot(x, y) +ax1.set_title('Sharing Y axis') +ax2.scatter(x, y) + +# Three subplots sharing both x/y axes +f, (ax1, ax2, ax3) = plt.subplots(3, sharex=True, sharey=True) +ax1.plot(x, y) +ax1.set_title('Sharing both axes') +ax2.scatter(x, y) +ax3.scatter(x, 2*y**2-1,color='r') +# Fine-tune figure; make subplots close to each other and hide x ticks for +# all but bottom plot. +f.subplots_adjust(hspace=0) +plt.setp([a.get_xticklabels() for a in f.axes[:-1]], visible=False) + +# Four axes, returned as a 2-d array +f, axarr = plt.subplots(2, 2) +axarr[0,0].plot(x, y) +axarr[0,0].set_title('Axis [0,0]') +axarr[0,1].scatter(x, y) +axarr[0,1].set_title('Axis [0,1]') +axarr[1,0].plot(x, y**2) +axarr[1,0].set_title('Axis [1,0]') +axarr[1,1].scatter(x, y**2) +axarr[1,1].set_title('Axis [1,1]') +# Fine-tune figure; hide x ticks for top plots and y ticks for right plots +plt.setp([a.get_xticklabels() for a in axarr[0,:]], visible=False) +plt.setp([a.get_yticklabels() for a in axarr[:,1]], visible=False) + +# Four polar axes +plt.subplots(2, 2, subplot_kw=dict(polar=True)) + +plt.show() diff -Nru matplotlib-0.99.3/examples/pylab_examples/tex_demo.py matplotlib-1.0.1/examples/pylab_examples/tex_demo.py --- matplotlib-0.99.3/examples/pylab_examples/tex_demo.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/examples/pylab_examples/tex_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -29,5 +29,5 @@ title(r"\TeX\ is Number $\displaystyle\sum_{n=1}^\infty\frac{-e^{i\pi}}{2^n}$!", fontsize=16, color='r') grid(True) - +savefig('tex_demo') show() diff -Nru matplotlib-0.99.3/examples/pylab_examples/text_handles.py matplotlib-1.0.1/examples/pylab_examples/text_handles.py --- matplotlib-0.99.3/examples/pylab_examples/text_handles.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/examples/pylab_examples/text_handles.py 2010-07-07 01:41:55.000000000 +0000 @@ -2,7 +2,7 @@ #Controlling the properties of axis text using handles # See examples/text_themes.py for a more elegant, pythonic way to control -# fonts. After all, if we were slaves to matlab(TM) , we wouldn't be +# fonts. After all, if we were slaves to MATLAB , we wouldn't be # using python! from pylab import * diff -Nru matplotlib-0.99.3/examples/pylab_examples/to_numeric.py matplotlib-1.0.1/examples/pylab_examples/to_numeric.py --- matplotlib-0.99.3/examples/pylab_examples/to_numeric.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/examples/pylab_examples/to_numeric.py 2010-07-07 01:41:55.000000000 +0000 @@ -29,5 +29,5 @@ X.shape = h, w, 3 im = Image.fromstring( "RGB", (w,h), s) -im.show() +# im.show() diff -Nru matplotlib-0.99.3/examples/pylab_examples/tricontour_demo.py matplotlib-1.0.1/examples/pylab_examples/tricontour_demo.py --- matplotlib-0.99.3/examples/pylab_examples/tricontour_demo.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/examples/pylab_examples/tricontour_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -0,0 +1,98 @@ +""" +Contour plots of unstructured triangular grids. +""" +import matplotlib.pyplot as plt +import matplotlib.tri as tri +import numpy as np +import math + +# Creating a Triangulation without specifying the triangles results in the +# Delaunay triangulation of the points. + +# First create the x and y coordinates of the points. +n_angles = 48 +n_radii = 8 +min_radius = 0.25 +radii = np.linspace(min_radius, 0.95, n_radii) + +angles = np.linspace(0, 2*math.pi, n_angles, endpoint=False) +angles = np.repeat(angles[...,np.newaxis], n_radii, axis=1) +angles[:,1::2] += math.pi/n_angles + +x = (radii*np.cos(angles)).flatten() +y = (radii*np.sin(angles)).flatten() +z = (np.cos(radii)*np.cos(angles*3.0)).flatten() + +# Create the Triangulation; no triangles so Delaunay triangulation created. +triang = tri.Triangulation(x, y) + +# Mask off unwanted triangles. +xmid = x[triang.triangles].mean(axis=1) +ymid = y[triang.triangles].mean(axis=1) +mask = np.where(xmid*xmid + ymid*ymid < min_radius*min_radius, 1, 0) +triang.set_mask(mask) + +# pcolor plot. +plt.figure() +plt.gca().set_aspect('equal') +plt.tricontourf(triang, z) +plt.colorbar() +plt.tricontour(triang, z, colors='k') +plt.title('Contour plot of Delaunay triangulation') + +# You can specify your own triangulation rather than perform a Delaunay +# triangulation of the points, where each triangle is given by the indices of +# the three points that make up the triangle, ordered in either a clockwise or +# anticlockwise manner. + +xy = np.asarray([ + [-0.101,0.872],[-0.080,0.883],[-0.069,0.888],[-0.054,0.890],[-0.045,0.897], + [-0.057,0.895],[-0.073,0.900],[-0.087,0.898],[-0.090,0.904],[-0.069,0.907], + [-0.069,0.921],[-0.080,0.919],[-0.073,0.928],[-0.052,0.930],[-0.048,0.942], + [-0.062,0.949],[-0.054,0.958],[-0.069,0.954],[-0.087,0.952],[-0.087,0.959], + [-0.080,0.966],[-0.085,0.973],[-0.087,0.965],[-0.097,0.965],[-0.097,0.975], + [-0.092,0.984],[-0.101,0.980],[-0.108,0.980],[-0.104,0.987],[-0.102,0.993], + [-0.115,1.001],[-0.099,0.996],[-0.101,1.007],[-0.090,1.010],[-0.087,1.021], + [-0.069,1.021],[-0.052,1.022],[-0.052,1.017],[-0.069,1.010],[-0.064,1.005], + [-0.048,1.005],[-0.031,1.005],[-0.031,0.996],[-0.040,0.987],[-0.045,0.980], + [-0.052,0.975],[-0.040,0.973],[-0.026,0.968],[-0.020,0.954],[-0.006,0.947], + [ 0.003,0.935],[ 0.006,0.926],[ 0.005,0.921],[ 0.022,0.923],[ 0.033,0.912], + [ 0.029,0.905],[ 0.017,0.900],[ 0.012,0.895],[ 0.027,0.893],[ 0.019,0.886], + [ 0.001,0.883],[-0.012,0.884],[-0.029,0.883],[-0.038,0.879],[-0.057,0.881], + [-0.062,0.876],[-0.078,0.876],[-0.087,0.872],[-0.030,0.907],[-0.007,0.905], + [-0.057,0.916],[-0.025,0.933],[-0.077,0.990],[-0.059,0.993] ]) +x = xy[:,0]*180/3.14159 +y = xy[:,1]*180/3.14159 +x0 = -5 +y0 = 52 +z = np.exp(-0.01*( (x-x0)*(x-x0) + (y-y0)*(y-y0) )) + +triangles = np.asarray([ + [67,66, 1],[65, 2,66],[ 1,66, 2],[64, 2,65],[63, 3,64],[60,59,57], + [ 2,64, 3],[ 3,63, 4],[ 0,67, 1],[62, 4,63],[57,59,56],[59,58,56], + [61,60,69],[57,69,60],[ 4,62,68],[ 6, 5, 9],[61,68,62],[69,68,61], + [ 9, 5,70],[ 6, 8, 7],[ 4,70, 5],[ 8, 6, 9],[56,69,57],[69,56,52], + [70,10, 9],[54,53,55],[56,55,53],[68,70, 4],[52,56,53],[11,10,12], + [69,71,68],[68,13,70],[10,70,13],[51,50,52],[13,68,71],[52,71,69], + [12,10,13],[71,52,50],[71,14,13],[50,49,71],[49,48,71],[14,16,15], + [14,71,48],[17,19,18],[17,20,19],[48,16,14],[48,47,16],[47,46,16], + [16,46,45],[23,22,24],[21,24,22],[17,16,45],[20,17,45],[21,25,24], + [27,26,28],[20,72,21],[25,21,72],[45,72,20],[25,28,26],[44,73,45], + [72,45,73],[28,25,29],[29,25,31],[43,73,44],[73,43,40],[72,73,39], + [72,31,25],[42,40,43],[31,30,29],[39,73,40],[42,41,40],[72,33,31], + [32,31,33],[39,38,72],[33,72,38],[33,38,34],[37,35,38],[34,38,35], + [35,37,36] ]) + +# Rather than create a Triangulation object, can simply pass x, y and triangles +# arrays to tripcolor directly. It would be better to use a Triangulation object +# if the same triangulation was to be used more than once to save duplicated +# calculations. +plt.figure() +plt.gca().set_aspect('equal') +plt.tricontourf(x, y, triangles, z) +plt.colorbar() +plt.title('Contour plot of user-specified triangulation') +plt.xlabel('Longitude (degrees)') +plt.ylabel('Latitude (degrees)') + +plt.show() diff -Nru matplotlib-0.99.3/examples/pylab_examples/tricontour_vs_griddata.py matplotlib-1.0.1/examples/pylab_examples/tricontour_vs_griddata.py --- matplotlib-0.99.3/examples/pylab_examples/tricontour_vs_griddata.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/examples/pylab_examples/tricontour_vs_griddata.py 2010-07-07 01:41:55.000000000 +0000 @@ -0,0 +1,47 @@ +""" +Comparison of griddata and tricontour for an unstructured triangular grid. +""" +import matplotlib.pyplot as plt +import matplotlib.tri as tri +import numpy as np +from numpy.random import uniform, seed +from matplotlib.mlab import griddata +import time + +seed(0) +npts = 200 +ngridx = 100 +ngridy = 200 +x = uniform(-2,2,npts) +y = uniform(-2,2,npts) +z = x*np.exp(-x**2-y**2) + +# griddata and contour. +start = time.clock() +plt.subplot(211) +xi = np.linspace(-2.1,2.1,ngridx) +yi = np.linspace(-2.1,2.1,ngridy) +zi = griddata(x,y,z,xi,yi,interp='linear') +plt.contour(xi,yi,zi,15,linewidths=0.5,colors='k') +plt.contourf(xi,yi,zi,15,cmap=plt.cm.jet) +plt.colorbar() # draw colorbar +plt.plot(x, y, 'ko', ms=3) +plt.xlim(-2,2) +plt.ylim(-2,2) +plt.title('griddata and contour (%d points, %d grid points)' % (npts, ngridx*ngridy)) +print 'griddata and contour seconds:', time.clock() - start + +# tricontour. +start = time.clock() +plt.subplot(212) +triang = tri.Triangulation(x, y) +plt.tricontour(x, y, z, 15, linewidths=0.5, colors='k') +plt.tricontourf(x, y, z, 15, cmap=plt.cm.jet) +plt.colorbar() +plt.plot(x, y, 'ko', ms=3) +plt.xlim(-2,2) +plt.ylim(-2,2) +plt.title('tricontour (%d points)' % npts) +print 'tricontour seconds:', time.clock() - start + +plt.show() diff -Nru matplotlib-0.99.3/examples/pylab_examples/tripcolor_demo.py matplotlib-1.0.1/examples/pylab_examples/tripcolor_demo.py --- matplotlib-0.99.3/examples/pylab_examples/tripcolor_demo.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/examples/pylab_examples/tripcolor_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -0,0 +1,98 @@ +""" +Pseudocolor plots of unstructured triangular grids. +""" +import matplotlib.pyplot as plt +import matplotlib.tri as tri +import numpy as np +import math + +# Creating a Triangulation without specifying the triangles results in the +# Delaunay triangulation of the points. + +# First create the x and y coordinates of the points. +n_angles = 36 +n_radii = 8 +min_radius = 0.25 +radii = np.linspace(min_radius, 0.95, n_radii) + +angles = np.linspace(0, 2*math.pi, n_angles, endpoint=False) +angles = np.repeat(angles[...,np.newaxis], n_radii, axis=1) +angles[:,1::2] += math.pi/n_angles + +x = (radii*np.cos(angles)).flatten() +y = (radii*np.sin(angles)).flatten() +z = (np.cos(radii)*np.cos(angles*3.0)).flatten() + +# Create the Triangulation; no triangles so Delaunay triangulation created. +triang = tri.Triangulation(x, y) + +# Mask off unwanted triangles. +xmid = x[triang.triangles].mean(axis=1) +ymid = y[triang.triangles].mean(axis=1) +mask = np.where(xmid*xmid + ymid*ymid < min_radius*min_radius, 1, 0) +triang.set_mask(mask) + +# pcolor plot. +plt.figure() +plt.gca().set_aspect('equal') +plt.tripcolor(triang, z, shading='faceted') +plt.colorbar() +plt.title('tripcolor of Delaunay triangulation') + + +# You can specify your own triangulation rather than perform a Delaunay +# triangulation of the points, where each triangle is given by the indices of +# the three points that make up the triangle, ordered in either a clockwise or +# anticlockwise manner. + +xy = np.asarray([ + [-0.101,0.872],[-0.080,0.883],[-0.069,0.888],[-0.054,0.890],[-0.045,0.897], + [-0.057,0.895],[-0.073,0.900],[-0.087,0.898],[-0.090,0.904],[-0.069,0.907], + [-0.069,0.921],[-0.080,0.919],[-0.073,0.928],[-0.052,0.930],[-0.048,0.942], + [-0.062,0.949],[-0.054,0.958],[-0.069,0.954],[-0.087,0.952],[-0.087,0.959], + [-0.080,0.966],[-0.085,0.973],[-0.087,0.965],[-0.097,0.965],[-0.097,0.975], + [-0.092,0.984],[-0.101,0.980],[-0.108,0.980],[-0.104,0.987],[-0.102,0.993], + [-0.115,1.001],[-0.099,0.996],[-0.101,1.007],[-0.090,1.010],[-0.087,1.021], + [-0.069,1.021],[-0.052,1.022],[-0.052,1.017],[-0.069,1.010],[-0.064,1.005], + [-0.048,1.005],[-0.031,1.005],[-0.031,0.996],[-0.040,0.987],[-0.045,0.980], + [-0.052,0.975],[-0.040,0.973],[-0.026,0.968],[-0.020,0.954],[-0.006,0.947], + [ 0.003,0.935],[ 0.006,0.926],[ 0.005,0.921],[ 0.022,0.923],[ 0.033,0.912], + [ 0.029,0.905],[ 0.017,0.900],[ 0.012,0.895],[ 0.027,0.893],[ 0.019,0.886], + [ 0.001,0.883],[-0.012,0.884],[-0.029,0.883],[-0.038,0.879],[-0.057,0.881], + [-0.062,0.876],[-0.078,0.876],[-0.087,0.872],[-0.030,0.907],[-0.007,0.905], + [-0.057,0.916],[-0.025,0.933],[-0.077,0.990],[-0.059,0.993] ]) +x = xy[:,0]*180/3.14159 +y = xy[:,1]*180/3.14159 +x0 = -5 +y0 = 52 +z = np.exp(-0.01*( (x-x0)*(x-x0) + (y-y0)*(y-y0) )) + +triangles = np.asarray([ + [67,66, 1],[65, 2,66],[ 1,66, 2],[64, 2,65],[63, 3,64],[60,59,57], + [ 2,64, 3],[ 3,63, 4],[ 0,67, 1],[62, 4,63],[57,59,56],[59,58,56], + [61,60,69],[57,69,60],[ 4,62,68],[ 6, 5, 9],[61,68,62],[69,68,61], + [ 9, 5,70],[ 6, 8, 7],[ 4,70, 5],[ 8, 6, 9],[56,69,57],[69,56,52], + [70,10, 9],[54,53,55],[56,55,53],[68,70, 4],[52,56,53],[11,10,12], + [69,71,68],[68,13,70],[10,70,13],[51,50,52],[13,68,71],[52,71,69], + [12,10,13],[71,52,50],[71,14,13],[50,49,71],[49,48,71],[14,16,15], + [14,71,48],[17,19,18],[17,20,19],[48,16,14],[48,47,16],[47,46,16], + [16,46,45],[23,22,24],[21,24,22],[17,16,45],[20,17,45],[21,25,24], + [27,26,28],[20,72,21],[25,21,72],[45,72,20],[25,28,26],[44,73,45], + [72,45,73],[28,25,29],[29,25,31],[43,73,44],[73,43,40],[72,73,39], + [72,31,25],[42,40,43],[31,30,29],[39,73,40],[42,41,40],[72,33,31], + [32,31,33],[39,38,72],[33,72,38],[33,38,34],[37,35,38],[34,38,35], + [35,37,36] ]) + +# Rather than create a Triangulation object, can simply pass x, y and triangles +# arrays to tripcolor directly. It would be better to use a Triangulation object +# if the same triangulation was to be used more than once to save duplicated +# calculations. +plt.figure() +plt.gca().set_aspect('equal') +plt.tripcolor(x, y, triangles, z, shading='faceted') +plt.colorbar() +plt.title('tripcolor of user-specified triangulation') +plt.xlabel('Longitude (degrees)') +plt.ylabel('Latitude (degrees)') + +plt.show() diff -Nru matplotlib-0.99.3/examples/pylab_examples/triplot_demo.py matplotlib-1.0.1/examples/pylab_examples/triplot_demo.py --- matplotlib-0.99.3/examples/pylab_examples/triplot_demo.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/examples/pylab_examples/triplot_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -0,0 +1,92 @@ +""" +Creating and plotting unstructured triangular grids. +""" +import matplotlib.pyplot as plt +import matplotlib.tri as tri +import numpy as np +import math + +# Creating a Triangulation without specifying the triangles results in the +# Delaunay triangulation of the points. + +# First create the x and y coordinates of the points. +n_angles = 36 +n_radii = 8 +min_radius = 0.25 +radii = np.linspace(min_radius, 0.95, n_radii) + +angles = np.linspace(0, 2*math.pi, n_angles, endpoint=False) +angles = np.repeat(angles[...,np.newaxis], n_radii, axis=1) +angles[:,1::2] += math.pi/n_angles + +x = (radii*np.cos(angles)).flatten() +y = (radii*np.sin(angles)).flatten() + +# Create the Triangulation; no triangles so Delaunay triangulation created. +triang = tri.Triangulation(x, y) + +# Mask off unwanted triangles. +xmid = x[triang.triangles].mean(axis=1) +ymid = y[triang.triangles].mean(axis=1) +mask = np.where(xmid*xmid + ymid*ymid < min_radius*min_radius, 1, 0) +triang.set_mask(mask) + +# Plot the triangulation. +plt.figure() +plt.gca().set_aspect('equal') +plt.triplot(triang, 'bo-') +plt.title('triplot of Delaunay triangulation') + + +# You can specify your own triangulation rather than perform a Delaunay +# triangulation of the points, where each triangle is given by the indices of +# the three points that make up the triangle, ordered in either a clockwise or +# anticlockwise manner. + +xy = np.asarray([ + [-0.101,0.872],[-0.080,0.883],[-0.069,0.888],[-0.054,0.890],[-0.045,0.897], + [-0.057,0.895],[-0.073,0.900],[-0.087,0.898],[-0.090,0.904],[-0.069,0.907], + [-0.069,0.921],[-0.080,0.919],[-0.073,0.928],[-0.052,0.930],[-0.048,0.942], + [-0.062,0.949],[-0.054,0.958],[-0.069,0.954],[-0.087,0.952],[-0.087,0.959], + [-0.080,0.966],[-0.085,0.973],[-0.087,0.965],[-0.097,0.965],[-0.097,0.975], + [-0.092,0.984],[-0.101,0.980],[-0.108,0.980],[-0.104,0.987],[-0.102,0.993], + [-0.115,1.001],[-0.099,0.996],[-0.101,1.007],[-0.090,1.010],[-0.087,1.021], + [-0.069,1.021],[-0.052,1.022],[-0.052,1.017],[-0.069,1.010],[-0.064,1.005], + [-0.048,1.005],[-0.031,1.005],[-0.031,0.996],[-0.040,0.987],[-0.045,0.980], + [-0.052,0.975],[-0.040,0.973],[-0.026,0.968],[-0.020,0.954],[-0.006,0.947], + [ 0.003,0.935],[ 0.006,0.926],[ 0.005,0.921],[ 0.022,0.923],[ 0.033,0.912], + [ 0.029,0.905],[ 0.017,0.900],[ 0.012,0.895],[ 0.027,0.893],[ 0.019,0.886], + [ 0.001,0.883],[-0.012,0.884],[-0.029,0.883],[-0.038,0.879],[-0.057,0.881], + [-0.062,0.876],[-0.078,0.876],[-0.087,0.872],[-0.030,0.907],[-0.007,0.905], + [-0.057,0.916],[-0.025,0.933],[-0.077,0.990],[-0.059,0.993] ]) +x = xy[:,0]*180/3.14159 +y = xy[:,1]*180/3.14159 + +triangles = np.asarray([ + [67,66, 1],[65, 2,66],[ 1,66, 2],[64, 2,65],[63, 3,64],[60,59,57], + [ 2,64, 3],[ 3,63, 4],[ 0,67, 1],[62, 4,63],[57,59,56],[59,58,56], + [61,60,69],[57,69,60],[ 4,62,68],[ 6, 5, 9],[61,68,62],[69,68,61], + [ 9, 5,70],[ 6, 8, 7],[ 4,70, 5],[ 8, 6, 9],[56,69,57],[69,56,52], + [70,10, 9],[54,53,55],[56,55,53],[68,70, 4],[52,56,53],[11,10,12], + [69,71,68],[68,13,70],[10,70,13],[51,50,52],[13,68,71],[52,71,69], + [12,10,13],[71,52,50],[71,14,13],[50,49,71],[49,48,71],[14,16,15], + [14,71,48],[17,19,18],[17,20,19],[48,16,14],[48,47,16],[47,46,16], + [16,46,45],[23,22,24],[21,24,22],[17,16,45],[20,17,45],[21,25,24], + [27,26,28],[20,72,21],[25,21,72],[45,72,20],[25,28,26],[44,73,45], + [72,45,73],[28,25,29],[29,25,31],[43,73,44],[73,43,40],[72,73,39], + [72,31,25],[42,40,43],[31,30,29],[39,73,40],[42,41,40],[72,33,31], + [32,31,33],[39,38,72],[33,72,38],[33,38,34],[37,35,38],[34,38,35], + [35,37,36] ]) + +# Rather than create a Triangulation object, can simply pass x, y and triangles +# arrays to triplot directly. It would be better to use a Triangulation object +# if the same triangulation was to be used more than once to save duplicated +# calculations. +plt.figure() +plt.gca().set_aspect('equal') +plt.triplot(x, y, triangles, 'go-') +plt.title('triplot of user-specified triangulation') +plt.xlabel('Longitude (degrees)') +plt.ylabel('Latitude (degrees)') + +plt.show() diff -Nru matplotlib-0.99.3/examples/pylab_examples/usetex_demo.py matplotlib-1.0.1/examples/pylab_examples/usetex_demo.py --- matplotlib-0.99.3/examples/pylab_examples/usetex_demo.py 2009-07-31 15:51:41.000000000 +0000 +++ matplotlib-1.0.1/examples/pylab_examples/usetex_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -41,8 +41,8 @@ pylab.yticks((0, 0.5, 1), ('0', '.5', '1'), color = 'k', size = 20) ## Right Y-axis labels -pylab.text(1.05, 0.5, r"\bf{level set} $\phi$", {'color' : 'g', 'fontsize' : 20}, - horizontalalignment = 'left', +pylab.text(1.05, 0.5, r"\bf{level set} $\phi$", {'color' : 'g', 'fontsize' : 20}, + horizontalalignment = 'left', verticalalignment = 'center', rotation = 90, clip_on = False) diff -Nru matplotlib-0.99.3/examples/tests/backend_driver.py matplotlib-1.0.1/examples/tests/backend_driver.py --- matplotlib-0.99.3/examples/tests/backend_driver.py 2009-08-03 22:34:34.000000000 +0000 +++ matplotlib-1.0.1/examples/tests/backend_driver.py 2010-07-07 01:41:54.000000000 +0000 @@ -181,7 +181,6 @@ 'shared_axis_across_figures.py', 'shared_axis_demo.py', 'simple_plot.py', - 'simplification_clipping_test.py', 'specgram_demo.py', 'spine_placement_demo.py', 'spy_demos.py', @@ -336,7 +335,6 @@ for fullpath in testcases: print ('\tdriving %-40s' % (fullpath)), sys.stdout.flush() - fpath, fname = os.path.split(fullpath) if fname in exclude: @@ -362,6 +360,8 @@ 'import matplotlib\n', 'matplotlib.use("%s")\n' % backend, 'from pylab import savefig\n', + 'import numpy\n', + 'numpy.seterr(invalid="ignore")\n', )) for line in file(fullpath): line_lstrip = line.lstrip() @@ -389,7 +389,7 @@ return failures def parse_options(): - doc = __doc__.split('\n\n') + doc = (__doc__ and __doc__.split('\n\n')) or " " op = OptionParser(description=doc[0].strip(), usage='%prog [options] [--] [backends and switches]', #epilog='\n'.join(doc[1:]) # epilog not supported on my python2.4 machine: JDH diff -Nru matplotlib-0.99.3/examples/units/date_converter.py matplotlib-1.0.1/examples/units/date_converter.py --- matplotlib-0.99.3/examples/units/date_converter.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/examples/units/date_converter.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,20 +0,0 @@ -import date_support # set up the date converters -import datetime -from matplotlib.dates import drange -from pylab import figure, show -import numpy as np - - -xmin = datetime.date(2007,1,1) -xmax = datetime.date.today() -delta = datetime.timedelta(days=1) -xdates = drange(xmin, xmax, delta) - -fig = figure() -fig.subplots_adjust(bottom=0.2) -ax = fig.add_subplot(111) -ax.plot(xdates, np.random.rand(len(xdates)), 'o') -ax.set_xlim(datetime.date(2007,2,1), datetime.date(2007,3,1)) - -fig.autofmt_xdate() -show() diff -Nru matplotlib-0.99.3/examples/units/date_support.py matplotlib-1.0.1/examples/units/date_support.py --- matplotlib-0.99.3/examples/units/date_support.py 2009-07-31 15:14:44.000000000 +0000 +++ matplotlib-1.0.1/examples/units/date_support.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,36 +0,0 @@ -import matplotlib -matplotlib.rcParams['units'] = True -from matplotlib.cbook import iterable, is_numlike -import matplotlib.units as units -import matplotlib.dates as dates -import matplotlib.ticker as ticker -import datetime - -class DateConverter(units.ConversionInterface): - - @staticmethod - def axisinfo(unit, axis): - 'return the unit AxisInfo' - if unit=='date': - majloc = dates.AutoDateLocator() - majfmt = dates.AutoDateFormatter(majloc) - return units.AxisInfo( - majloc = majloc, - majfmt = majfmt, - label='date', - ) - else: return None - - @staticmethod - def convert(value, unit, axis): - if units.ConversionInterface.is_numlike(value): return value - return dates.date2num(value) - - @staticmethod - def default_units(x, axis): - 'return the default unit for x or None' - return 'date' - - -units.registry[datetime.date] = DateConverter() -units.registry[datetime.datetime] = DateConverter() diff -Nru matplotlib-0.99.3/examples/user_interfaces/embedding_in_wx3.py matplotlib-1.0.1/examples/user_interfaces/embedding_in_wx3.py --- matplotlib-0.99.3/examples/user_interfaces/embedding_in_wx3.py 2009-07-31 15:14:44.000000000 +0000 +++ matplotlib-1.0.1/examples/user_interfaces/embedding_in_wx3.py 2010-07-07 01:41:53.000000000 +0000 @@ -27,6 +27,7 @@ import matplotlib matplotlib.use('WXAgg') import matplotlib.cm as cm +import matplotlib.cbook as cbook from matplotlib.backends.backend_wxagg import Toolbar, FigureCanvasWxAgg from matplotlib.figure import Figure import numpy as npy @@ -101,8 +102,9 @@ class MyApp(wx.App): def OnInit(self): - xrcfile = os.path.join(os.path.dirname(__file__),"..","data", - "embedding_in_wx3.xrc") + xrcfile = cbook.get_sample_data('embedding_in_wx3.xrc', asfileobj=False) + print 'loading', xrcfile + self.res = xrc.XmlResource(xrcfile) # main frame and panel --------- diff -Nru matplotlib-0.99.3/examples/user_interfaces/interactive2.py matplotlib-1.0.1/examples/user_interfaces/interactive2.py --- matplotlib-0.99.3/examples/user_interfaces/interactive2.py 2009-07-31 15:14:44.000000000 +0000 +++ matplotlib-1.0.1/examples/user_interfaces/interactive2.py 2010-07-07 01:41:53.000000000 +0000 @@ -25,7 +25,7 @@ Welcome to matplotlib. - help(matplotlib) -- shows a list of all matlab(TM) compatible commands provided + help(matplotlib) -- some general information about matplotlib help(plotting) -- shows a list of plot specific commands """ diff -Nru matplotlib-0.99.3/examples/user_interfaces/interactive.py matplotlib-1.0.1/examples/user_interfaces/interactive.py --- matplotlib-0.99.3/examples/user_interfaces/interactive.py 2009-07-31 15:14:44.000000000 +0000 +++ matplotlib-1.0.1/examples/user_interfaces/interactive.py 2010-07-07 01:41:53.000000000 +0000 @@ -1,6 +1,11 @@ #!/usr/bin/env python """Multithreaded interactive interpreter with GTK and Matplotlib support. +WARNING: +As of 2010/06/25, this is not working, at least on Linux. +I have disabled it as a runnable script. - EF + + Usage: pyint-gtk.py -> starts shell with gtk thread running separately @@ -183,7 +188,7 @@ specific GTK hooks in it.""" def __init__(self,banner=None): - banner = """\nWelcome to matplotlib, a matlab-like python environment. + banner = """\nWelcome to matplotlib, a MATLAB-like python environment. help(matlab) -> help on matlab compatible commands from matplotlib. help(plotting) -> help on plotting commands. """ @@ -221,6 +226,9 @@ matplotlib.interactive(1) # turn on interaction if __name__ == '__main__': + print "This demo is not presently functional, so running" + print "it as a script has been disabled." + sys.exit() # Quick sys.argv hack to extract the option and leave filenames in sys.argv. # For real option handling, use optparse or getopt. if len(sys.argv) > 1 and sys.argv[1]=='-pylab': diff -Nru matplotlib-0.99.3/examples/user_interfaces/rec_edit_gtk_custom.py matplotlib-1.0.1/examples/user_interfaces/rec_edit_gtk_custom.py --- matplotlib-0.99.3/examples/user_interfaces/rec_edit_gtk_custom.py 2009-07-31 15:14:44.000000000 +0000 +++ matplotlib-1.0.1/examples/user_interfaces/rec_edit_gtk_custom.py 2010-07-07 01:41:53.000000000 +0000 @@ -6,9 +6,12 @@ import gtk import numpy as np import matplotlib.mlab as mlab +import matplotlib.cbook as cbook import mpl_toolkits.gtktools as gtktools -r = mlab.csv2rec('data/demodata.csv', converterd={'weekdays':str}) + +datafile = cbook.get_sample_data('demodata.csv', asfileobj=False) +r = mlab.csv2rec(datafile, converterd={'weekdays':str}) formatd = mlab.get_formatd(r) diff -Nru matplotlib-0.99.3/examples/user_interfaces/rec_edit_gtk_simple.py matplotlib-1.0.1/examples/user_interfaces/rec_edit_gtk_simple.py --- matplotlib-0.99.3/examples/user_interfaces/rec_edit_gtk_simple.py 2009-07-31 15:14:44.000000000 +0000 +++ matplotlib-1.0.1/examples/user_interfaces/rec_edit_gtk_simple.py 2010-07-07 01:41:53.000000000 +0000 @@ -5,9 +5,11 @@ import gtk import numpy as np import matplotlib.mlab as mlab +import matplotlib.cbook as cbook import mpl_toolkits.gtktools as gtktools -r = mlab.csv2rec('data/demodata.csv', converterd={'weekdays':str}) +datafile = cbook.get_sample_data('demodata.csv', asfileobj=False) +r = mlab.csv2rec(datafile, converterd={'weekdays':str}) liststore, treeview, win = gtktools.edit_recarray(r) win.set_title('click to edit') diff -Nru matplotlib-0.99.3/examples/widgets/buttons.py matplotlib-1.0.1/examples/widgets/buttons.py --- matplotlib-0.99.3/examples/widgets/buttons.py 2009-07-31 15:14:49.000000000 +0000 +++ matplotlib-1.0.1/examples/widgets/buttons.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,38 +1,40 @@ -from pylab import * + +import numpy as np +import matplotlib.pyplot as plt from matplotlib.widgets import Button -freqs = arange(2,20,3) +freqs = np.arange(2, 20, 3) -ax = subplot(111) -subplots_adjust(bottom=0.2) -t = arange(0.0, 1.0, 0.001) -s = sin(2*pi*freqs[0]*t) -l, = plot(t,s, lw=2) +ax = plt.subplot(111) +plt.subplots_adjust(bottom=0.2) +t = np.arange(0.0, 1.0, 0.001) +s = np.sin(2*np.pi*freqs[0]*t) +l, = plt.plot(t, s, lw=2) class Index: ind = 0 def next(self, event): self.ind += 1 - i = self.ind%len(freqs) - ydata = sin(2*pi*freqs[i]*t) + i = self.ind % len(freqs) + ydata = np.sin(2*np.pi*freqs[i]*t) l.set_ydata(ydata) - draw() + plt.draw() def prev(self, event): self.ind -= 1 - i = self.ind%len(freqs) - ydata = sin(2*pi*freqs[i]*t) + i = self.ind % len(freqs) + ydata = np.sin(2*np.pi*freqs[i]*t) l.set_ydata(ydata) - draw() + plt.draw() callback = Index() -axprev = axes([0.7, 0.05, 0.1, 0.075]) -axnext = axes([0.81, 0.05, 0.1, 0.075]) +axprev = plt.axes([0.7, 0.05, 0.1, 0.075]) +axnext = plt.axes([0.81, 0.05, 0.1, 0.075]) bnext = Button(axnext, 'Next') bnext.on_clicked(callback.next) bprev = Button(axprev, 'Previous') bprev.on_clicked(callback.prev) -show() +plt.show() diff -Nru matplotlib-0.99.3/examples/widgets/check_buttons.py matplotlib-1.0.1/examples/widgets/check_buttons.py --- matplotlib-0.99.3/examples/widgets/check_buttons.py 2009-07-31 15:14:49.000000000 +0000 +++ matplotlib-1.0.1/examples/widgets/check_buttons.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,25 +1,26 @@ -from pylab import * +import numpy as np +import matplotlib.pyplot as plt from matplotlib.widgets import CheckButtons -t = arange(0.0, 2.0, 0.01) -s0 = sin(2*pi*t) -s1 = sin(4*pi*t) -s2 = sin(6*pi*t) +t = np.arange(0.0, 2.0, 0.01) +s0 = np.sin(2*np.pi*t) +s1 = np.sin(4*np.pi*t) +s2 = np.sin(6*np.pi*t) -ax = subplot(111) +ax = plt.subplot(111) l0, = ax.plot(t, s0, visible=False, lw=2) l1, = ax.plot(t, s1, lw=2) l2, = ax.plot(t, s2, lw=2) -subplots_adjust(left=0.2) +plt.subplots_adjust(left=0.2) -rax = axes([0.05, 0.4, 0.1, 0.15]) +rax = plt.axes([0.05, 0.4, 0.1, 0.15]) check = CheckButtons(rax, ('2 Hz', '4 Hz', '6 Hz'), (False, True, True)) def func(label): - if label=='2 Hz': l0.set_visible(not l0.get_visible()) - elif label=='4 Hz': l1.set_visible(not l1.get_visible()) - elif label=='6 Hz': l2.set_visible(not l2.get_visible()) - draw() + if label == '2 Hz': l0.set_visible(not l0.get_visible()) + elif label == '4 Hz': l1.set_visible(not l1.get_visible()) + elif label == '6 Hz': l2.set_visible(not l2.get_visible()) + plt.draw() check.on_clicked(func) -show() +plt.show() diff -Nru matplotlib-0.99.3/examples/widgets/cursor.py matplotlib-1.0.1/examples/widgets/cursor.py --- matplotlib-0.99.3/examples/widgets/cursor.py 2009-07-31 15:14:49.000000000 +0000 +++ matplotlib-1.0.1/examples/widgets/cursor.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,20 +1,19 @@ #!/usr/bin/env python from matplotlib.widgets import Cursor -import pylab +import numpy as np +import matplotlib.pyplot as plt -fig = pylab.figure(figsize=(8,6)) -ax = fig.add_axes([0.075, 0.25, 0.9, 0.725], axisbg='#FFFFCC') -#ax = fig.add_subplot(111, axisbg='#FFFFCC') -canvas = ax.figure.canvas - -x,y = 4*(pylab.rand(2,100)-.5) -ax.plot(x,y,'o') -ax.set_xlim(-2,2) -ax.set_ylim(-2,2) +fig = plt.figure(figsize=(8, 6)) +ax = fig.add_subplot(111, axisbg='#FFFFCC') + +x, y = 4*(np.random.rand(2, 100)-.5) +ax.plot(x, y, 'o') +ax.set_xlim(-2, 2) +ax.set_ylim(-2, 2) # set useblit = True on gtkagg for enhanced performance cursor = Cursor(ax, useblit=True, color='red', linewidth=2 ) -pylab.show() +plt.show() diff -Nru matplotlib-0.99.3/examples/widgets/menu.py matplotlib-1.0.1/examples/widgets/menu.py --- matplotlib-0.99.3/examples/widgets/menu.py 2009-07-31 15:14:49.000000000 +0000 +++ matplotlib-1.0.1/examples/widgets/menu.py 2010-07-07 01:41:55.000000000 +0000 @@ -9,7 +9,8 @@ class ItemProperties: - def __init__(self, fontsize=14, labelcolor='black', bgcolor='yellow', alpha=1.0): + def __init__(self, fontsize=14, labelcolor='black', bgcolor='yellow', + alpha=1.0): self.fontsize = fontsize self.labelcolor = labelcolor self.bgcolor = bgcolor @@ -21,8 +22,9 @@ class MenuItem(artist.Artist): parser = mathtext.MathTextParser("Bitmap") padx = 5 - pady =5 - def __init__(self, fig, labelstr, props=None, hoverprops=None, on_select=None): + pady = 5 + def __init__(self, fig, labelstr, props=None, hoverprops=None, + on_select=None): artist.Artist.__init__(self) self.set_figure(fig) @@ -44,14 +46,15 @@ labelstr, fontsize=props.fontsize, dpi=fig.dpi) if props.fontsize!=hoverprops.fontsize: - raise NotImplementedError('support for different font sizes not implemented') + raise NotImplementedError( + 'support for different font sizes not implemented') self.labelwidth = x.shape[1] self.labelheight = x.shape[0] self.labelArray = np.zeros((x.shape[0], x.shape[1], 4)) - self.labelArray[:,:,-1] = x/255. + self.labelArray[:, :, -1] = x/255. self.label = image.FigureImage(fig, origin='upper') self.label.set_array(self.labelArray) @@ -95,9 +98,9 @@ props = self.props r, g, b = props.labelcolor_rgb - self.labelArray[:,:,0] = r - self.labelArray[:,:,1] = g - self.labelArray[:,:,2] = b + self.labelArray[:, :, 0] = r + self.labelArray[:, :, 1] = g + self.labelArray[:, :, 2] = b self.label.set_array(self.labelArray) self.rect.set(facecolor=props.bgcolor, alpha=props.alpha) @@ -169,12 +172,9 @@ for label in ('open', 'close', 'save', 'save as', 'quit'): def on_select(item): print 'you selected', item.labelstr - item = MenuItem(fig, label, props=props, hoverprops=hoverprops, on_select=on_select) + item = MenuItem(fig, label, props=props, hoverprops=hoverprops, + on_select=on_select) menuitems.append(item) menu = Menu(fig, menuitems) plt.show() - - - - diff -Nru matplotlib-0.99.3/examples/widgets/rectangle_selector.py matplotlib-1.0.1/examples/widgets/rectangle_selector.py --- matplotlib-0.99.3/examples/widgets/rectangle_selector.py 2009-07-31 15:14:49.000000000 +0000 +++ matplotlib-1.0.1/examples/widgets/rectangle_selector.py 2010-07-07 01:41:55.000000000 +0000 @@ -8,27 +8,41 @@ """ from matplotlib.widgets import RectangleSelector -from pylab import subplot, arange, plot, sin, cos, pi, show -def line_select_callback(event1, event2): - 'event1 and event2 are the press and release events' - x1, y1 = event1.xdata, event1.ydata - x2, y2 = event2.xdata, event2.ydata - print "(%3.2f, %3.2f) --> (%3.2f, %3.2f)"%(x1,y1,x2,y2) - print " The button you used were: ",event1.button, event2.button - - -current_ax=subplot(111) # make a new plotingrange -N=100000 # If N is large one can see improvement -x=10.0*arange(N)/(N-1) # by use blitting! - -plot(x,sin(.2*pi*x),lw=3,c='b',alpha=.7) # plot something -plot(x,cos(.2*pi*x),lw=3.5,c='r',alpha=.5) -plot(x,-sin(.2*pi*x),lw=3.5,c='g',alpha=.3) +import numpy as np +import matplotlib.pyplot as plt + +def line_select_callback(eclick, erelease): + 'eclick and erelease are the press and release events' + x1, y1 = eclick.xdata, eclick.ydata + x2, y2 = erelease.xdata, erelease.ydata + print "(%3.2f, %3.2f) --> (%3.2f, %3.2f)" % (x1, y1, x2, y2) + print " The button you used were: ", eclick.button, erelease.button + +def toggle_selector(event): + print ' Key pressed.' + if event.key in ['Q', 'q'] and toggle_selector.RS.active: + print ' RectangleSelector deactivated.' + toggle_selector.RS.set_active(False) + if event.key in ['A', 'a'] and not toggle_selector.RS.active: + print ' RectangleSelector activated.' + toggle_selector.RS.set_active(True) + + +current_ax = plt.subplot(111) # make a new plotingrange +N = 100000 # If N is large one can see +x = np.linspace(0.0, 10.0, N) # improvement by use blitting! + +plt.plot(x, +np.sin(.2*np.pi*x), lw=3.5, c='b', alpha=.7) # plot something +plt.plot(x, +np.cos(.2*np.pi*x), lw=3.5, c='r', alpha=.5) +plt.plot(x, -np.sin(.2*np.pi*x), lw=3.5, c='g', alpha=.3) print "\n click --> release" # drawtype is 'box' or 'line' or 'none' -LS = RectangleSelector(current_ax, line_select_callback, - drawtype='box',useblit=True, - minspanx=5,minspany=5,spancoords='pixels') -show() +toggle_selector.RS = RectangleSelector(current_ax, line_select_callback, + drawtype='box', useblit=True, + button=[1,3], # don't use middle button + minspanx=5, minspany=5, + spancoords='pixels') +plt.connect('key_press_event', toggle_selector) +plt.show() diff -Nru matplotlib-0.99.3/INSTALL matplotlib-1.0.1/INSTALL --- matplotlib-0.99.3/INSTALL 2009-07-31 15:14:51.000000000 +0000 +++ matplotlib-1.0.1/INSTALL 2010-07-07 01:41:55.000000000 +0000 @@ -1,7 +1,7 @@ INTRODUCTION - matplotlib requires at a minimum python 2.3, numpy, libpng and + matplotlib requires at a minimum python 2.4, numpy, libpng and freetype. To get the most out of matplotlib, you will want to build some of the optional GUI and image extensions, discussed below. Matplotlib is known to work on linux, unix, win32 and OS X diff -Nru matplotlib-0.99.3/lib/dateutil/easter.py matplotlib-1.0.1/lib/dateutil/easter.py --- matplotlib-0.99.3/lib/dateutil/easter.py 2009-07-31 15:14:41.000000000 +0000 +++ matplotlib-1.0.1/lib/dateutil/easter.py 2010-07-07 01:41:52.000000000 +0000 @@ -1,5 +1,5 @@ """ -Copyright (c) 2003-2005 Gustavo Niemeyer +Copyright (c) 2003-2007 Gustavo Niemeyer This module offers extensions to the standard python 2.3+ datetime module. @@ -70,23 +70,23 @@ if method < 3: # Old method i = (19*g+15)%30 - j = (y+y/4+i)%7 + j = (y+y//4+i)%7 if method == 2: # Extra dates to convert Julian to Gregorian date e = 10 if y > 1600: - e = e+y/100-16-(y/100-16)/4 + e = e+y//100-16-(y//100-16)//4 else: # New method - c = y/100 - h = (c-c/4-(8*c+13)/25+19*g+15)%30 - i = h-(h/28)*(1-(h/28)*(29/(h+1))*((21-g)/11)) - j = (y+y/4+i+2-c+c/4)%7 + c = y//100 + h = (c-c//4-(8*c+13)//25+19*g+15)%30 + i = h-(h//28)*(1-(h//28)*(29//(h+1))*((21-g)//11)) + j = (y+y//4+i+2-c+c//4)%7 # p can be from -6 to 56 corresponding to dates 22 March to 23 May # (later dates apply to method 2, although 23 May never actually occurs) p = i-j+e - d = 1+(p+27+(p+6)/40)%31 - m = 3+(p+26)/30 - return datetime.date(y,m,d) + d = 1+(p+27+(p+6)//40)%31 + m = 3+(p+26)//30 + return datetime.date(int(y),int(m),int(d)) diff -Nru matplotlib-0.99.3/lib/dateutil/__init__.py matplotlib-1.0.1/lib/dateutil/__init__.py --- matplotlib-0.99.3/lib/dateutil/__init__.py 2009-07-31 15:14:41.000000000 +0000 +++ matplotlib-1.0.1/lib/dateutil/__init__.py 2010-07-07 01:41:52.000000000 +0000 @@ -1,9 +1,9 @@ """ -Copyright (c) 2003-2005 Gustavo Niemeyer +Copyright (c) 2003-2010 Gustavo Niemeyer This module offers extensions to the standard python 2.3+ datetime module. """ __author__ = "Gustavo Niemeyer " __license__ = "PSF License" -__version__ = "1.2-mpl" +__version__ = "1.5" diff -Nru matplotlib-0.99.3/lib/dateutil/NEWS matplotlib-1.0.1/lib/dateutil/NEWS --- matplotlib-0.99.3/lib/dateutil/NEWS 2009-07-31 15:14:41.000000000 +0000 +++ matplotlib-1.0.1/lib/dateutil/NEWS 2010-07-07 01:41:52.000000000 +0000 @@ -1,3 +1,19 @@ + +Version 1.5 +----------- + +- As reported by Mathieu Bridon, rrules were matching the bysecond rules + incorrectly against byminute in some circumstances when the SECONDLY + frequency was in use, due to a copy & paste bug. The problem has been + unittested and corrected. + +- Adam Ryan reported a problem in the relativedelta implementation which + affected the yearday parameter in the month of January specifically. + This has been unittested and fixed. + +- Updated timezone information. + + Version 1.4.1 ------------- diff -Nru matplotlib-0.99.3/lib/dateutil/parser.py matplotlib-1.0.1/lib/dateutil/parser.py --- matplotlib-0.99.3/lib/dateutil/parser.py 2009-07-31 15:14:41.000000000 +0000 +++ matplotlib-1.0.1/lib/dateutil/parser.py 2010-07-07 01:41:52.000000000 +0000 @@ -1,6 +1,6 @@ # -*- coding:iso-8859-1 -*- """ -Copyright (c) 2003-2005 Gustavo Niemeyer +Copyright (c) 2003-2007 Gustavo Niemeyer This module offers extensions to the standard python 2.3+ datetime module. @@ -8,17 +8,24 @@ __author__ = "Gustavo Niemeyer " __license__ = "PSF License" -import os.path +import datetime import string -import sys import time +import sys +import os + +try: + from cStringIO import StringIO +except ImportError: + from StringIO import StringIO -import datetime import relativedelta import tz + __all__ = ["parse", "parserinfo"] + # Some pointers: # # http://www.cl.cam.ac.uk/~mgk25/iso-time.html @@ -28,12 +35,9 @@ # http://search.cpan.org/author/MUIR/Time-modules-2003.0211/lib/Time/ParseDate.pm # http://stein.cshl.org/jade/distrib/docs/java.text.SimpleDateFormat.html -try: - from cStringIO import StringIO -except ImportError: - from StringIO import StringIO -class _timelex: +class _timelex(object): + def __init__(self, instream): if isinstance(instream, basestring): instream = StringIO(instream) @@ -139,6 +143,7 @@ return list(cls(s)) split = classmethod(split) + class _resultbase(object): def __init__(self): @@ -156,7 +161,8 @@ def __repr__(self): return self._repr(self.__class__.__name__) -class parserinfo: + +class parserinfo(object): # m from a.m/p.m, t from ISO T separator JUMP = [" ", ".", ",", ";", "-", "/", "'", @@ -204,7 +210,7 @@ self.yearfirst = yearfirst self._year = time.localtime().tm_year - self._century = self._year/100*100 + self._century = self._year//100*100 def _convert(self, lst): dct = {} @@ -281,15 +287,10 @@ return True -class parser: +class parser(object): - def __init__(self, info=parserinfo): - if issubclass(info, parserinfo): - self.info = parserinfo() - elif isinstance(info, parserinfo): - self.info = info - else: - raise TypeError, "Unsupported parserinfo type" + def __init__(self, info=None): + self.info = info or parserinfo() def parse(self, timestr, default=None, ignoretz=False, tzinfos=None, @@ -360,9 +361,11 @@ # Check if it's a number try: - value = float(l[i]) + value_repr = l[i] + value = float(value_repr) except ValueError: value = None + if value is not None: # Token is a number len_li = len(l[i]) @@ -386,10 +389,7 @@ # 19990101T235959[.59] res.hour = int(s[:2]) res.minute = int(s[2:4]) - value = float(s[4:]) - res.second = int(value) - if value%1: - res.microsecond = int(1000000*(value%1)) + res.second, res.microsecond = _parsems(s[4:]) elif len_li == 8: # YYYYMMDD s = l[i-1] @@ -423,15 +423,15 @@ if value%1: res.second = int(60*(value%1)) elif idx == 2: - res.second = int(value) - if value%1: - res.microsecond = int(1000000*(value%1)) + res.second, res.microsecond = \ + _parsems(value_repr) i += 1 if i >= len_l or idx == 2: break # 12h00 try: - value = float(l[i]) + value_repr = l[i] + value = float(value_repr) except ValueError: break else: @@ -451,10 +451,7 @@ res.second = int(60*(value%1)) i += 1 if i < len_l and l[i] == ':': - value = float(l[i+1]) - res.second = int(value) - if value%1: - res.microsecond = int(1000000*(value%1)) + res.second, res.microsecond = _parsems(l[i+1]) i += 2 elif i < len_l and l[i] in ('-', '/', '.'): sep = l[i] @@ -699,7 +696,8 @@ else: return DEFAULTPARSER.parse(timestr, **kwargs) -class _tzparser: + +class _tzparser(object): class _result(_resultbase): @@ -743,6 +741,8 @@ if (i < len_l and (l[i] in ('+', '-') or l[i][0] in "0123456789")): if l[i] in ('+', '-'): + # Yes, that's right. See the TZ variable + # documentation. signal = (1,-1)[l[i] == '+'] i += 1 else: @@ -865,11 +865,22 @@ except (IndexError, ValueError, AssertionError): return None - + return res + DEFAULTTZPARSER = _tzparser() def _parsetz(tzstr): return DEFAULTTZPARSER.parse(tzstr) + +def _parsems(value): + """Parse a I[.F] seconds value into (seconds, microseconds).""" + if "." not in value: + return int(value), 0 + else: + i, f = value.split(".") + return int(i), int(f.ljust(6, "0")[:6]) + + # vim:ts=4:sw=4:et diff -Nru matplotlib-0.99.3/lib/dateutil/relativedelta.py matplotlib-1.0.1/lib/dateutil/relativedelta.py --- matplotlib-0.99.3/lib/dateutil/relativedelta.py 2009-07-31 15:14:41.000000000 +0000 +++ matplotlib-1.0.1/lib/dateutil/relativedelta.py 2010-07-07 01:41:52.000000000 +0000 @@ -1,5 +1,5 @@ """ -Copyright (c) 2003-2005 Gustavo Niemeyer +Copyright (c) 2003-2010 Gustavo Niemeyer This module offers extensions to the standard python 2.3+ datetime module. @@ -190,7 +190,7 @@ if yday <= ydays: self.month = idx+1 if idx == 0: - self.day = ydays + self.day = yday else: self.day = yday-ydayidx[idx-1] break @@ -201,27 +201,27 @@ def _fix(self): if abs(self.microseconds) > 999999: - s = self.microseconds/abs(self.microseconds) + s = self.microseconds//abs(self.microseconds) div, mod = divmod(self.microseconds*s, 1000000) self.microseconds = mod*s self.seconds += div*s if abs(self.seconds) > 59: - s = self.seconds/abs(self.seconds) + s = self.seconds//abs(self.seconds) div, mod = divmod(self.seconds*s, 60) self.seconds = mod*s self.minutes += div*s if abs(self.minutes) > 59: - s = self.minutes/abs(self.minutes) + s = self.minutes//abs(self.minutes) div, mod = divmod(self.minutes*s, 60) self.minutes = mod*s self.hours += div*s if abs(self.hours) > 23: - s = self.hours/abs(self.hours) + s = self.hours//abs(self.hours) div, mod = divmod(self.hours*s, 24) self.hours = mod*s self.days += div*s if abs(self.months) > 11: - s = self.months/abs(self.months) + s = self.months//abs(self.months) div, mod = divmod(self.months*s, 12) self.months = mod*s self.years += div*s @@ -235,7 +235,7 @@ def _set_months(self, months): self.months = months if abs(self.months) > 11: - s = self.months/abs(self.months) + s = self.months//abs(self.months) div, mod = divmod(self.months*s, 12) self.months = mod*s self.years = div*s diff -Nru matplotlib-0.99.3/lib/dateutil/rrule.py matplotlib-1.0.1/lib/dateutil/rrule.py --- matplotlib-0.99.3/lib/dateutil/rrule.py 2009-07-31 15:14:41.000000000 +0000 +++ matplotlib-1.0.1/lib/dateutil/rrule.py 2010-07-07 01:41:52.000000000 +0000 @@ -1,5 +1,5 @@ """ -Copyright (c) 2003-2005 Gustavo Niemeyer +Copyright (c) 2003-2010 Gustavo Niemeyer This module offers extensions to the standard python 2.3+ datetime module. @@ -439,7 +439,7 @@ (freq >= MINUTELY and self._byminute and minute not in self._byminute) or (freq >= SECONDLY and - self._bysecond and minute not in self._bysecond)): + self._bysecond and second not in self._bysecond)): timeset = () else: timeset = gettimeset(hour, minute, second) diff -Nru matplotlib-0.99.3/lib/dateutil/tz.py matplotlib-1.0.1/lib/dateutil/tz.py --- matplotlib-0.99.3/lib/dateutil/tz.py 2009-07-31 15:14:41.000000000 +0000 +++ matplotlib-1.0.1/lib/dateutil/tz.py 2010-07-07 01:41:52.000000000 +0000 @@ -1,5 +1,5 @@ """ -Copyright (c) 2003-2005 Gustavo Niemeyer +Copyright (c) 2003-2007 Gustavo Niemeyer This module offers extensions to the standard python 2.3+ datetime module. @@ -438,7 +438,7 @@ # The documentation says that utcoffset()-dst() must # be constant for every dt. - return self._find_ttinfo(dt, laststd=1).delta-tti.delta + return tti.delta-self._find_ttinfo(dt, laststd=1).delta # An alternative for that would be: # @@ -492,12 +492,12 @@ self._dst_offset = self._std_offset+datetime.timedelta(hours=+1) else: self._dst_offset = ZERO - if start is None: + if dstabbr and start is None: self._start_delta = relativedelta.relativedelta( hours=+2, month=4, day=1, weekday=relativedelta.SU(+1)) else: self._start_delta = start - if end is None: + if dstabbr and end is None: self._end_delta = relativedelta.relativedelta( hours=+1, month=10, day=31, weekday=relativedelta.SU(-1)) else: @@ -524,7 +524,7 @@ def _isdst(self, dt): if not self._start_delta: return False - year = datetime.date(dt.year,1,1) + year = datetime.datetime(dt.year,1,1) start = year+self._start_delta end = year+self._end_delta dt = dt.replace(tzinfo=None) @@ -563,6 +563,11 @@ if res is None: raise ValueError, "unknown string format" + # Here we break the compatibility with the TZ variable handling. + # GMT-3 actually *means* the timezone -3. + if res.stdabbr in ("GMT", "UTC"): + res.stdoffset *= -1 + # We must initialize it first, since _delta() needs # _std_offset and _dst_offset set. Use False in start/end # to avoid building it two times. @@ -570,9 +575,13 @@ res.dstabbr, res.dstoffset, start=False, end=False) - self._start_delta = self._delta(res.start) - if self._start_delta: - self._end_delta = self._delta(res.end, isend=1) + if not res.dstabbr: + self._start_delta = None + self._end_delta = None + else: + self._start_delta = self._delta(res.start) + if self._start_delta: + self._end_delta = self._delta(res.end, isend=1) def _delta(self, x, isend=0): kwargs = {} @@ -753,6 +762,8 @@ else: i += 1 + tzid = None + comps = [] invtz = False comptype = None for line in lines: Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/dateutil/zoneinfo/zoneinfo-2008e.tar.gz and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/dateutil/zoneinfo/zoneinfo-2008e.tar.gz differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/dateutil/zoneinfo/zoneinfo-2010g.tar.gz and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/dateutil/zoneinfo/zoneinfo-2010g.tar.gz differ diff -Nru matplotlib-0.99.3/lib/matplotlib/afm.py matplotlib-1.0.1/lib/matplotlib/afm.py --- matplotlib-0.99.3/lib/matplotlib/afm.py 2010-03-09 14:20:20.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/afm.py 2010-07-07 01:41:52.000000000 +0000 @@ -37,15 +37,16 @@ import sys, os, re from _mathtext_data import uni2type1 -# Convert string the a python type +#Convert string the a python type + # some afm files have floats where we are expecting ints -- there is # probably a better way to handle this (support floats, round rather # than truncate). But I don't know what the best approach is now and # this change to _to_int should at least prevent mpl from crashing on # these JDH (2009-11-06) -def _to_int(x): - return int(float(x)) +def _to_int(x): + return int(float(x)) _to_float = float _to_str = str diff -Nru matplotlib-0.99.3/lib/matplotlib/artist.py matplotlib-1.0.1/lib/matplotlib/artist.py --- matplotlib-0.99.3/lib/matplotlib/artist.py 2010-03-09 14:20:20.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/artist.py 2010-08-03 14:22:42.000000000 +0000 @@ -2,6 +2,7 @@ import re, warnings import matplotlib import matplotlib.cbook as cbook +from matplotlib import docstring, rcParams from transforms import Bbox, IdentityTransform, TransformedBbox, TransformedPath from path import Path @@ -36,7 +37,15 @@ if artist.get_rasterized(): renderer.start_rasterizing() + if artist.get_agg_filter() is not None: + renderer.start_filter() + + def after(artist, renderer): + + if artist.get_agg_filter() is not None: + renderer.stop_filter(artist.get_agg_filter()) + if artist.get_rasterized(): renderer.stop_rasterizing() @@ -69,7 +78,7 @@ self._transformSet = False self._visible = True self._animated = False - self._alpha = 1.0 + self._alpha = None self.clipbox = None self._clippath = None self._clipon = True @@ -78,6 +87,7 @@ self._picker = None self._contains = None self._rasterized = None + self._agg_filter = None self.eventson = False # fire events only if eventson self._oid = 0 # an observer id @@ -310,7 +320,11 @@ for a in self.get_children(): # make sure the event happened in the same axes ax = getattr(a, 'axes', None) - if mouseevent.inaxes==ax: + if mouseevent.inaxes is None or mouseevent.inaxes==ax: + # we need to check if mouseevent.inaxes is None + # because some objects associated with an axes (eg a + # tick label) can be outside the bounding box of the + # axes and inaxes will be None a.pick(mouseevent) def set_picker(self, picker): @@ -398,9 +412,12 @@ * None: (auto) If the path contains only rectilinear line segments, round to the nearest pixel center - Only supported by the Agg backends. + Only supported by the Agg and MacOSX backends. """ - return self._snap + if rcParams['path.snap']: + return self._snap + else: + return False def set_snap(self, snap): """ @@ -413,7 +430,7 @@ * None: (auto) If the path contains only rectilinear line segments, round to the nearest pixel center - Only supported by the Agg backends. + Only supported by the Agg and MacOSX backends. """ self._snap = snap @@ -553,6 +570,7 @@ gc.set_clip_path(None) def get_rasterized(self): + "return True if the artist is to be rasterized" return self._rasterized def set_rasterized(self, rasterized): @@ -568,6 +586,17 @@ self._rasterized = rasterized + def get_agg_filter(self): + "return filter function to be used for agg filter" + return self._agg_filter + + def set_agg_filter(self, filter_func): + """ + set agg_filter fuction. + + """ + self._agg_filter = filter_func + def draw(self, renderer, *args, **kwargs): 'Derived classes drawing method' if not self.get_visible(): return @@ -797,7 +826,7 @@ for a line that begins with ACCEPTS: Eg., for a line linestyle, return - [ '-' | '--' | '-.' | ':' | 'steps' | 'None' ] + "[ ``'-'`` | ``'--'`` | ``'-.'`` | ``':'`` | ``'steps'`` | ``'None'`` ]" """ name = 'set_%s'%attr @@ -1053,25 +1082,25 @@ -def getp(o, property=None): +def getp(obj, property=None): """ - Return the value of handle property. property is an optional string + Return the value of object's property. *property* is an optional string for the property you want to return Example usage:: - getp(o) # get all the object properties - getp(o, 'linestyle') # get the linestyle property + getp(obj) # get all the object properties + getp(obj, 'linestyle') # get the linestyle property - *o* is a :class:`Artist` instance, eg + *obj* is a :class:`Artist` instance, eg :class:`~matplotllib.lines.Line2D` or an instance of a :class:`~matplotlib.axes.Axes` or :class:`matplotlib.text.Text`. If the *property* is 'somename', this function returns - o.get_somename() + obj.get_somename() :func:`getp` can be used to query all the gettable properties with - ``getp(o)``. Many properties have aliases for shorter typing, e.g. + ``getp(obj)``. Many properties have aliases for shorter typing, e.g. 'lw' is an alias for 'linewidth'. In the output, aliases and full property names will be listed as: @@ -1082,21 +1111,20 @@ linewidth or lw = 2 """ - insp = ArtistInspector(o) if property is None: + insp = ArtistInspector(obj) ret = insp.pprint_getters() print '\n'.join(ret) return - func = getattr(o, 'get_' + property) - + func = getattr(obj, 'get_' + property) return func() # alias get = getp -def setp(h, *args, **kwargs): +def setp(obj, *args, **kwargs): """ matplotlib supports the use of :func:`setp` ("set property") and :func:`getp` to set and get object properties, as well as to do @@ -1131,15 +1159,15 @@ >>> lines = plot(x, y1, x, y2) >>> setp(lines, linewidth=2, color='r') - :func:`setp` works with the matlab(TM) style string/value pairs or + :func:`setp` works with the MATLAB style string/value pairs or with python kwargs. For example, the following are equivalent:: - >>> setp(lines, 'linewidth', 2, 'color', r') # matlab style + >>> setp(lines, 'linewidth', 2, 'color', r') # MATLAB style >>> setp(lines, linewidth=2, color='r') # python style """ - insp = ArtistInspector(h) + insp = ArtistInspector(obj) if len(kwargs)==0 and len(args)==0: print '\n'.join(insp.pprint_setters()) @@ -1149,8 +1177,10 @@ print insp.pprint_setters(prop=args[0]) return - if not cbook.iterable(h): h = [h] - else: h = cbook.flatten(h) + if not cbook.iterable(obj): + objs = [obj] + else: + objs = cbook.flatten(obj) if len(args)%2: @@ -1162,11 +1192,11 @@ funcvals.extend(kwargs.items()) ret = [] - for o in h: + for o in objs: for s, val in funcvals: s = s.lower() funcName = "set_%s"%s - func = getattr(o,funcName) + func = getattr(o, funcName) ret.extend( [func(val)] ) return [x for x in cbook.flatten(ret)] @@ -1177,5 +1207,4 @@ else: return '\n'.join(ArtistInspector(a).pprint_setters(leadingspace=2)) -kwdocd = dict() -kwdocd['Artist'] = kwdoc(Artist) +docstring.interpd.update(Artist=kwdoc(Artist)) diff -Nru matplotlib-0.99.3/lib/matplotlib/axes.py matplotlib-1.0.1/lib/matplotlib/axes.py --- matplotlib-0.99.3/lib/matplotlib/axes.py 2010-03-09 14:20:20.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/axes.py 2011-01-05 15:59:56.000000000 +0000 @@ -1,5 +1,7 @@ from __future__ import division, generators import math, sys, warnings, datetime, new +from operator import itemgetter +import itertools import numpy as np from numpy import ma @@ -15,11 +17,13 @@ import matplotlib.colors as mcolors import matplotlib.contour as mcontour import matplotlib.dates as mdates +from matplotlib import docstring import matplotlib.font_manager as font_manager import matplotlib.image as mimage import matplotlib.legend as mlegend import matplotlib.lines as mlines import matplotlib.mlab as mlab +import matplotlib.path as mpath import matplotlib.patches as mpatches import matplotlib.spines as mspines import matplotlib.quiver as mquiver @@ -28,15 +32,25 @@ import matplotlib.text as mtext import matplotlib.ticker as mticker import matplotlib.transforms as mtransforms +import matplotlib.tri as mtri + iterable = cbook.iterable is_string_like = cbook.is_string_like is_sequence_of_strings = cbook.is_sequence_of_strings +def _string_to_bool(s): + if not is_string_like(s): + return s + if s == 'on': + return True + if s == 'off': + return False + raise ValueError("string argument must be either 'on' or 'off'") def _process_plot_format(fmt): """ - Process a matlab(TM) style color/line style format string. Return a + Process a MATLAB style color/line style format string. Return a (*linestyle*, *color*) tuple as a result of the processing. Default values are ('-', 'b'). Example format strings include: @@ -58,9 +72,21 @@ # Is fmt just a colorspec? try: color = mcolors.colorConverter.to_rgb(fmt) - return linestyle, marker, color # Yes. + + # We need to differentiate grayscale '1.0' from tri_down marker '1' + try: + fmtint = str(int(fmt)) + except ValueError: + return linestyle, marker, color # Yes + else: + if fmt != fmtint: + # user definitely doesn't want tri_down marker + return linestyle, marker, color # Yes + else: + # ignore converted color + color = None except ValueError: - pass # No, not just a color. + pass # No, not just a color. # handle the multi char special cases and strip them from the # string @@ -112,11 +138,18 @@ :class:`Axes` to which it will apply; it will apply to all future axes. - *clist* is a sequence of mpl color specifiers + *clist* is a sequence of mpl color specifiers. + + See also: :meth:`~matplotlib.axes.Axes.set_color_cycle`. + + .. Note:: Deprecated 2010/01/03. + Set rcParams['axes.color_cycle'] directly. """ - _process_plot_var_args.defaultColors = clist[:] - rcParams['lines.color'] = clist[0] + rcParams['axes.color_cycle'] = clist + warnings.warn("Set rcParams['axes.color_cycle'] directly", + DeprecationWarning) + class _process_plot_var_args: """ @@ -131,42 +164,15 @@ an arbitrary number of *x*, *y*, *fmt* are allowed """ - - defaultColors = ['b','g','r','c','m','y','k'] def __init__(self, axes, command='plot'): self.axes = axes self.command = command - self._clear_color_cycle() - - def _clear_color_cycle(self): - self.colors = _process_plot_var_args.defaultColors[:] - # if the default line color is a color format string, move it up - # in the que - try: - ind = self.colors.index(rcParams['lines.color']) - except ValueError: - self.firstColor = rcParams['lines.color'] - else: - self.colors[0], self.colors[ind] = self.colors[ind], self.colors[0] - self.firstColor = self.colors[0] - - self.Ncolors = len(self.colors) - - self.count = 0 + self.set_color_cycle() - def set_color_cycle(self, clist): - self.colors = clist[:] - self.firstColor = self.colors[0] - self.Ncolors = len(self.colors) - self.count = 0 - - def _get_next_cycle_color(self): - if self.count==0: - color = self.firstColor - else: - color = self.colors[int(self.count % self.Ncolors)] - self.count += 1 - return color + def set_color_cycle(self, clist=None): + if clist is None: + clist = rcParams['axes.color_cycle'] + self.color_cycle = itertools.cycle(clist) def __call__(self, *args, **kwargs): @@ -238,7 +244,7 @@ def _makeline(self, x, y, kw, kwargs): kw = kw.copy() # Don't modify the original kw. if not 'color' in kw: - kw['color'] = self._get_next_cycle_color() + kw['color'] = self.color_cycle.next() # (can't use setdefault because it always evaluates # its second argument) seg = mlines.Line2D(x, y, @@ -252,7 +258,7 @@ try: facecolor = kw['color'] except KeyError: - facecolor = self._get_next_cycle_color() + facecolor = self.color_cycle.next() seg = mpatches.Polygon(np.hstack( (x[:,np.newaxis],y[:,np.newaxis])), facecolor = facecolor, @@ -365,8 +371,8 @@ ================ ========================================= Keyword Description ================ ========================================= - *adjustable* [ 'box' | 'datalim' ] - *alpha* float: the alpha transparency + *adjustable* [ 'box' | 'datalim' | 'box-forced'] + *alpha* float: the alpha transparency (can be None) *anchor* [ 'C', 'SW', 'S', 'SE', 'E', 'NE', 'N', 'NW', 'W' ] *aspect* [ 'auto' | 'equal' | aspect_ratio ] @@ -824,7 +830,7 @@ self.xaxis.major = self._sharex.xaxis.major self.xaxis.minor = self._sharex.xaxis.minor x0, x1 = self._sharex.get_xlim() - self.set_xlim(x0, x1, emit=False) + self.set_xlim(x0, x1, emit=False, auto=None) self.xaxis.set_scale(self._sharex.xaxis.get_scale()) else: self.xaxis.set_scale('linear') @@ -833,13 +839,16 @@ self.yaxis.major = self._sharey.yaxis.major self.yaxis.minor = self._sharey.yaxis.minor y0, y1 = self._sharey.get_ylim() - self.set_ylim(y0, y1, emit=False) + self.set_ylim(y0, y1, emit=False, auto=None) self.yaxis.set_scale(self._sharey.yaxis.get_scale()) else: self.yaxis.set_scale('linear') self._autoscaleXon = True self._autoscaleYon = True + self._xmargin = 0 + self._ymargin = 0 + self._tight = False self._update_transScale() # needed? self._get_lines = _process_plot_var_args(self) @@ -852,6 +861,7 @@ self.tables = [] self.artists = [] self.images = [] + self._current_image = None # strictly for pyplot via _sci, _gci self.legend_ = None self.collections = [] # collection.Collection instances @@ -864,7 +874,7 @@ self.title = mtext.Text( x=0.5, y=1.0, text='', fontproperties=props, - verticalalignment='bottom', + verticalalignment='baseline', horizontalalignment='center', ) self.title.set_transform(self.transAxes + self.titleOffsetTrans) @@ -903,9 +913,10 @@ """ Set the color cycle for any future plot commands on this Axes. - clist is a list of mpl color specifiers. + *clist* is a list of mpl color specifiers. """ self._get_lines.set_color_cycle(clist) + self._get_patches_for_fill.set_color_cycle(clist) def ishold(self): @@ -961,12 +972,17 @@ *adjustable* - ========= ============================ - value description - ========= ============================ - 'box' change physical size of axes - 'datalim' change xlim or ylim - ========= ============================ + ============ ===================================== + value description + ============ ===================================== + 'box' change physical size of axes + 'datalim' change xlim or ylim + 'box-forced' same as 'box', but axes can be shared + ============ ===================================== + + 'box' does not allow axes sharing, as this can cause + unintended side effect. For cases when sharing axes is + fine, use 'box-forced'. *anchor* @@ -998,9 +1014,9 @@ def set_adjustable(self, adjustable): """ - ACCEPTS: [ 'box' | 'datalim' ] + ACCEPTS: [ 'box' | 'datalim' | 'box-forced'] """ - if adjustable in ('box', 'datalim'): + if adjustable in ('box', 'datalim', 'box-forced'): if self in self._shared_x_axes or self in self._shared_y_axes: if adjustable == 'box': raise ValueError( @@ -1078,20 +1094,23 @@ aspect = self.get_aspect() - xscale, yscale = self.get_xscale(), self.get_yscale() - if xscale == "linear" and yscale == "linear": + if self.name != 'polar': + xscale, yscale = self.get_xscale(), self.get_yscale() + if xscale == "linear" and yscale == "linear": + aspect_scale_mode = "linear" + elif xscale == "log" and yscale == "log": + aspect_scale_mode = "log" + elif (xscale == "linear" and yscale == "log") or \ + (xscale == "log" and yscale == "linear"): + if aspect is not "auto": + warnings.warn( + 'aspect is not supported for Axes with xscale=%s, yscale=%s' \ + % (xscale, yscale)) + aspect = "auto" + else: # some custom projections have their own scales. + pass + else: aspect_scale_mode = "linear" - elif xscale == "log" and yscale == "log": - aspect_scale_mode = "log" - elif (xscale == "linear" and yscale == "log") or \ - (xscale == "log" and yscale == "linear"): - if aspect is not "auto": - warnings.warn( - 'aspect is not supported for Axes with xscale=%s, yscale=%s' \ - % (xscale, yscale)) - aspect = "auto" - else: # some custom projections have their own scales. - pass if aspect == 'auto': self.set_position( position , which='active') @@ -1112,7 +1131,7 @@ figW,figH = self.get_figure().get_size_inches() fig_aspect = figH/figW - if self._adjustable == 'box': + if self._adjustable in ['box', 'box-forced']: if aspect_scale_mode == "log": box_aspect = A * self.get_data_ratio_log() else: @@ -1226,7 +1245,7 @@ elif s in ('equal', 'tight', 'scaled', 'normal', 'auto', 'image'): self.set_autoscale_on(True) self.set_aspect('auto') - self.autoscale_view() + self.autoscale_view(tight=False) # self.apply_aspect() if s=='equal': self.set_aspect('equal', adjustable='datalim') @@ -1323,6 +1342,27 @@ #### Adding and tracking artists + def _sci(self, im): + """ + helper for :func:`~matplotlib.pyplot.sci`; + do not use elsewhere. + """ + if isinstance(im, matplotlib.contour.ContourSet): + if im.collections[0] not in self.collections: + raise ValueError( + "ContourSet must be in current Axes") + elif im not in self.images and im not in self.collections: + raise ValueError( + "Argument must be an image, collection, or ContourSet in this Axes") + self._current_image = im + + def _gci(self): + """ + helper for :func:`~matplotlib.pyplot.gci`; + do not use elsewhere. + """ + return self._current_image + def has_data(self): '''Return *True* if any artists have been added to axes. @@ -1358,7 +1398,7 @@ ''' label = collection.get_label() if not label: - collection.set_label('collection%d'%len(self.collections)) + collection.set_label('_collection%d'%len(self.collections)) self.collections.append(collection) self._set_artist_props(collection) @@ -1422,8 +1462,9 @@ # scaling. We'll ignore rects with zero height or width in # the auto-scaling + # cannot check for '==0' since unitized data may not compare to zero if (isinstance(patch, mpatches.Rectangle) and - (patch.get_width()==0 or patch.get_height()==0)): + ((not patch.get_width()) or (not patch.get_height()))): return vertices = patch.get_path().vertices if vertices.size > 0: @@ -1450,7 +1491,12 @@ return tab def relim(self): - 'recompute the data limits based on current artists' + """ + Recompute the data limits based on current artists. + + At present, :class:`~matplotlib.collections.Collection` + instances are not supported. + """ # Collections are deliberately not supported (yet); see # the TODO note in artists.py. self.dataLim.ignore(True) @@ -1580,6 +1626,91 @@ """ self._autoscaleYon = b + def set_xmargin(self, m): + """ + Set padding of X data limits prior to autoscaling. + + *m* times the data interval will be added to each + end of that interval before it is used in autoscaling. + + accepts: float in range 0 to 1 + """ + if m < 0 or m > 1: + raise ValueError("margin must be in range 0 to 1") + self._xmargin = m + + def set_ymargin(self, m): + """ + Set padding of Y data limits prior to autoscaling. + + *m* times the data interval will be added to each + end of that interval before it is used in autoscaling. + + accepts: float in range 0 to 1 + """ + if m < 0 or m > 1: + raise ValueError("margin must be in range 0 to 1") + self._ymargin = m + + + def margins(self, *args, **kw): + """ + Convenience method to set or retrieve autoscaling margins. + + signatures:: + + margins() + + returns xmargin, ymargin + + :: + + margins(margin) + + margins(xmargin, ymargin) + + margins(x=xmargin, y=ymargin) + + margins(..., tight=False) + + All three forms above set the xmargin and ymargin parameters. + All keyword parameters are optional. A single argument + specifies both xmargin and ymargin. The *tight* parameter + is passed to :meth:`autoscale_view`, which is executed after + a margin is changed; the default here is *True*, on the + assumption that when margins are specified, no additional + padding to match tick marks is usually desired. Setting + *tight* to *None* will preserve the previous setting. + + Specifying any margin changes only the autoscaling; for example, + if *xmargin* is not None, then *xmargin* times the X data + interval will be added to each end of that interval before + it is used in autoscaling. + + """ + if not args and not kw: + return self._xmargin, self._ymargin + + tight = kw.pop('tight', True) + mx = kw.pop('x', None) + my = kw.pop('y', None) + if len(args) == 1: + mx = my = args[0] + elif len(args) == 2: + mx, my = args + else: + raise ValueError("more than two arguments were supplied") + if mx is not None: + self.set_xmargin(mx) + if my is not None: + self.set_ymargin(my) + + scalex = (mx is not None) + scaley = (my is not None) + + self.autoscale_view(tight=tight, scalex=scalex, scaley=scaley) + + def set_rasterization_zorder(self, z): """ Set zorder value below which artists will be rasterized @@ -1592,40 +1723,106 @@ """ return self._rasterization_zorder + def autoscale(self, enable=True, axis='both', tight=None): + """ + Convenience method for simple axis view autoscaling. + It turns autoscaling on or off, and then, + if autoscaling for either axis is on, it performs + the autoscaling on the specified axis or axes. + + *enable*: [True | False | None] + True (default) turns autoscaling on, False turns it off. + None leaves the autoscaling state unchanged. - def autoscale_view(self, tight=False, scalex=True, scaley=True): + *axis*: ['x' | 'y' | 'both'] + which axis to operate on; default is 'both' + + *tight*: [True | False | None] + If True, set view limits to data limits; + if False, let the locator and margins expand the view limits; + if None, use tight scaling if the only artist is an image, + otherwise treat *tight* as False. + The *tight* setting is retained for future autoscaling + until it is explicitly changed. + + + Returns None. """ - autoscale the view limits using the data limits. You can + if enable is None: + scalex = True + scaley = True + else: + scalex = False + scaley = False + if axis in ['x', 'both']: + self._autoscaleXon = bool(enable) + scalex = self._autoscaleXon + if axis in ['y', 'both']: + self._autoscaleYon = bool(enable) + scaley = self._autoscaleYon + self.autoscale_view(tight=tight, scalex=scalex, scaley=scaley) + + + def autoscale_view(self, tight=None, scalex=True, scaley=True): + """ + Autoscale the view limits using the data limits. You can selectively autoscale only a single axis, eg, the xaxis by setting *scaley* to *False*. The autoscaling preserves any axis direction reversal that has already been done. - """ - # if image data only just use the datalim + + The data limits are not updated automatically when artist + data are changed after the artist has been added to an + Axes instance. In that case, use + :meth:`matplotlib.axes.Axes.relim` + prior to calling autoscale_view. + """ + if tight is None: + # if image data only just use the datalim + _tight = self._tight or (len(self.images)>0 and + len(self.lines)==0 and + len(self.patches)==0) + else: + _tight = self._tight = bool(tight) + if scalex and self._autoscaleXon: xshared = self._shared_x_axes.get_siblings(self) dl = [ax.dataLim for ax in xshared] bb = mtransforms.BboxBase.union(dl) x0, x1 = bb.intervalx + xlocator = self.xaxis.get_major_locator() + try: + # e.g. DateLocator has its own nonsingular() + x0, x1 = xlocator.nonsingular(x0, x1) + except AttributeError: + # Default nonsingular for, e.g., MaxNLocator + x0, x1 = mtransforms.nonsingular(x0, x1, increasing=False, + expander=0.05) + if self._xmargin > 0: + delta = (x1 - x0) * self._xmargin + x0 -= delta + x1 += delta + if not _tight: + x0, x1 = xlocator.view_limits(x0, x1) + self.set_xbound(x0, x1) + if scaley and self._autoscaleYon: yshared = self._shared_y_axes.get_siblings(self) dl = [ax.dataLim for ax in yshared] bb = mtransforms.BboxBase.union(dl) y0, y1 = bb.intervaly - if (tight or (len(self.images)>0 and - len(self.lines)==0 and - len(self.patches)==0)): - if scalex and self._autoscaleXon: - self.set_xbound(x0, x1) - if scaley and self._autoscaleYon: - self.set_ybound(y0, y1) - return - - if scalex and self._autoscaleXon: - XL = self.xaxis.get_major_locator().view_limits(x0, x1) - self.set_xbound(XL) - if scaley and self._autoscaleYon: - YL = self.yaxis.get_major_locator().view_limits(y0, y1) - self.set_ybound(YL) + ylocator = self.yaxis.get_major_locator() + try: + y0, y1 = ylocator.nonsingular(y0, y1) + except AttributeError: + y0, y1 = mtransforms.nonsingular(y0, y1, increasing=False, + expander=0.05) + if self._ymargin > 0: + delta = (y1 - y0) * self._ymargin + y0 -= delta + y1 += delta + if not _tight: + y0, y1 = ylocator.view_limits(y0, y1) + self.set_ybound(y0, y1) #### Drawing @@ -1675,12 +1872,23 @@ artists.extend(self.spines.itervalues()) - dsu = [ (a.zorder, i, a) for i, a in enumerate(artists) + + dsu = [ (a.zorder, a) for a in artists if not a.get_animated() ] - dsu.sort() - # rasterze artists with negative zorder + # add images to dsu if the backend support compositing. + # otherwise, does the manaul compositing without adding images to dsu. + if len(self.images)<=1 or renderer.option_image_nocomposite(): + dsu.extend([(im.zorder, im) for im in self.images]) + _do_composite = False + else: + _do_composite = True + + + dsu.sort(key=itemgetter(0)) + + # rasterize artists with negative zorder # if the minimum zorder is negative, start rasterization rasterization_zorder = self._rasterization_zorder if len(dsu) > 0 and dsu[0][0] < rasterization_zorder: @@ -1696,16 +1904,16 @@ if self.axison and self._frameon: self.patch.draw(renderer) - if len(self.images)<=1 or renderer.option_image_nocomposite(): - for im in self.images: - im.draw(renderer) - else: + if _do_composite: # make a composite image blending alpha # list of (mimage.Image, ox, oy) + zorder_images = [(im.zorder, im) for im in self.images \ + if im.get_visible()] + zorder_images.sort(key=lambda x: x[0]) + mag = renderer.get_image_magnification() - ims = [(im.make_image(mag),0,0) - for im in self.images if im.get_visible()] + ims = [(im.make_image(mag),0,0) for z,im in zorder_images] l, b, r, t = self.bbox.extents @@ -1719,19 +1927,22 @@ l, b, w, h = self.bbox.bounds # composite images need special args so they will not # respect z-order for now - renderer.draw_image( - round(l), round(b), im, self.bbox, - self.patch.get_path(), - self.patch.get_transform()) + gc = renderer.new_gc() + gc.set_clip_rectangle(self.bbox) + gc.set_clip_path(mtransforms.TransformedPath( + self.patch.get_path(), + self.patch.get_transform())) + renderer.draw_image(gc, round(l), round(b), im) + gc.restore() if dsu_rasterized: - for zorder, i, a in dsu_rasterized: + for zorder, a in dsu_rasterized: a.draw(renderer) renderer.stop_rasterizing() - for zorder, i, a in dsu: + for zorder, a in dsu: a.draw(renderer) renderer.close_group('axes') @@ -1763,7 +1974,7 @@ if self._lastRenderer is None: raise RuntimeError('You must first call ax.draw()') dsu = [(a.zorder, a) for a in self.animated.keys()] - dsu.sort() + dsu.sort(key=lambda x: x[0]) renderer = self._lastRenderer renderer.blit() for tmp, a in dsu: @@ -1799,17 +2010,22 @@ """ self._axisbelow = b - def grid(self, b=None, **kwargs): + @docstring.dedent_interpd + def grid(self, b=None, which='major', **kwargs): """ call signature:: - grid(self, b=None, **kwargs) + grid(self, b=None, which='major', **kwargs) - Set the axes grids on or off; *b* is a boolean + Set the axes grids on or off; *b* is a boolean. (For MATLAB + compatibility, *b* may also be a string, 'on' or 'off'.) If *b* is *None* and ``len(kwargs)==0``, toggle the grid state. If *kwargs* are supplied, it is assumed that you want a grid and *b* - is thus set to *True* + is thus set to *True*. + + *which* can be 'major' (default), 'minor', or 'both' to control + whether major tick grids, minor tick grids, or both are affected. *kawrgs* are used to set the grid line properties, eg:: @@ -1819,10 +2035,11 @@ %(Line2D)s """ - if len(kwargs): b = True - self.xaxis.grid(b, **kwargs) - self.yaxis.grid(b, **kwargs) - grid.__doc__ = cbook.dedent(grid.__doc__) % martist.kwdocd + if len(kwargs): + b = True + b = _string_to_bool(b) + self.xaxis.grid(b, which=which, **kwargs) + self.yaxis.grid(b, which=which, **kwargs) def ticklabel_format(self, **kwargs): """ @@ -1831,9 +2048,9 @@ Optional keyword arguments: - ============ ===================================== + ============ ========================================= Keyword Description - ============ ===================================== + ============ ========================================= *style* [ 'sci' (or 'scientific') | 'plain' ] plain turns off scientific notation *scilimits* (m, n), pair of integers; if *style* @@ -1841,8 +2058,13 @@ be used for numbers outside the range 10`-m`:sup: to 10`n`:sup:. Use (0,0) to include all numbers. + *useOffset* [True | False | offset]; if True, + the offset will be calculated as needed; + if False, no offset will be used; if a + numeric offset is specified, it will be + used. *axis* [ 'x' | 'y' | 'both' ] - ============ ===================================== + ============ ========================================= Only the major ticks are affected. If the method is called when the @@ -1853,13 +2075,14 @@ """ style = kwargs.pop('style', '').lower() scilimits = kwargs.pop('scilimits', None) + useOffset = kwargs.pop('useOffset', None) + axis = kwargs.pop('axis', 'both').lower() if scilimits is not None: try: m, n = scilimits m+n+1 # check that both are numbers except (ValueError, TypeError): raise ValueError("scilimits must be a sequence of 2 integers") - axis = kwargs.pop('axis', 'both').lower() if style[:3] == 'sci': sb = True elif style in ['plain', 'comma']: @@ -1884,10 +2107,134 @@ self.xaxis.major.formatter.set_powerlimits(scilimits) if axis == 'both' or axis == 'y': self.yaxis.major.formatter.set_powerlimits(scilimits) + if useOffset is not None: + if axis == 'both' or axis == 'x': + self.xaxis.major.formatter.set_useOffset(useOffset) + if axis == 'both' or axis == 'y': + self.yaxis.major.formatter.set_useOffset(useOffset) except AttributeError: raise AttributeError( "This method only works with the ScalarFormatter.") + def locator_params(self, axis='both', tight=None, **kwargs): + """ + Convenience method for controlling tick locators. + + Keyword arguments: + + *axis* + ['x' | 'y' | 'both'] Axis on which to operate; + default is 'both'. + + *tight* + [True | False | None] Parameter passed to :meth:`autoscale_view`. + Default is None, for no change. + + Remaining keyword arguments are passed to directly to the + :meth:`~matplotlib.ticker.MaxNLocator.set_params` method. + + Typically one might want to reduce the maximum number + of ticks and use tight bounds when plotting small + subplots, for example:: + + ax.locator_params(tight=True, nbins=4) + + Because the locator is involved in autoscaling, + :meth:`autoscale_view` is called automatically after + the parameters are changed. + + This presently works only for the + :class:`~matplotlib.ticker.MaxNLocator` used + by default on linear axes, but it may be generalized. + """ + _x = axis in ['x', 'both'] + _y = axis in ['y', 'both'] + if _x: + self.xaxis.get_major_locator().set_params(**kwargs) + if _y: + self.yaxis.get_major_locator().set_params(**kwargs) + self.autoscale_view(tight=tight, scalex=_x, scaley=_y) + + def tick_params(self, axis='both', **kwargs): + """ + Convenience method for changing the appearance of ticks and + tick labels. + + Keyword arguments: + + *axis* + ['x' | 'y' | 'both'] Axis on which to operate; + default is 'both'. + + *reset* + [True | False] If *True*, set all parameters to defaults + before processing other keyword arguments. Default is + *False*. + + *which* + ['major' | 'minor' | 'both'] Default is 'major': apply + arguments to major ticks only. + + *direction* + ['in' | 'out'] Puts ticks inside or outside the axes. + + *length* + Tick length in points. + + *width* + Tick width in points. + + *color* + Tick color; accepts any mpl color spec. + + *pad* + Distance in points between tick and label. + + *labelsize* + Tick label font size in points or as a string (e.g. 'large'). + + *labelcolor* + Tick label color; mpl color spec. + + *colors* + Changes the tick color and the label color to the same value: + mpl color spec. + + *zorder* + Tick and label zorder. + + *bottom*, *top*, *left*, *right* + Boolean or ['on' | 'off'], controls whether to draw the + respective ticks. + + *labelbottom*, *labeltop*, *labelleft*, *labelright* + Boolean or ['on' | 'off'], controls whether to draw the + respective tick labels. + + Example:: + + ax.tick_params(direction='out', length=6, width=2, colors='r') + + This will make all major ticks be red, pointing out of the box, + and with dimensions 6 points by 2 points. Tick labels will + also be red. + + """ + if axis in ['x', 'both']: + xkw = dict(kwargs) + xkw.pop('left', None) + xkw.pop('right', None) + xkw.pop('labelleft', None) + xkw.pop('labelright', None) + self.xaxis.set_tick_params(**xkw) + if axis in ['y', 'both']: + ykw = dict(kwargs) + ykw.pop('top', None) + ykw.pop('bottom', None) + ykw.pop('labeltop', None) + ykw.pop('labelbottom', None) + self.yaxis.set_tick_params(**ykw) + def set_axis_off(self): """turn off the axis""" self.axison = False @@ -1940,6 +2287,7 @@ """ Set the lower and upper numerical bounds of the x-axis. This method will honor axes inversion regardless of parameter order. + It will not change the _autoscaleXon attribute. """ if upper is None and iterable(lower): lower,upper = lower @@ -1951,85 +2299,112 @@ if self.xaxis_inverted(): if lower < upper: - self.set_xlim(upper, lower) + self.set_xlim(upper, lower, auto=None) else: - self.set_xlim(lower, upper) + self.set_xlim(lower, upper, auto=None) else: if lower < upper: - self.set_xlim(lower, upper) + self.set_xlim(lower, upper, auto=None) else: - self.set_xlim(upper, lower) + self.set_xlim(upper, lower, auto=None) def get_xlim(self): """ - Get the x-axis range [*xmin*, *xmax*] + Get the x-axis range [*left*, *right*] """ return tuple(self.viewLim.intervalx) - def set_xlim(self, xmin=None, xmax=None, emit=True, **kwargs): + def set_xlim(self, left=None, right=None, emit=True, auto=False, **kw): """ call signature:: - set_xlim(self, *args, **kwargs) + set_xlim(self, *args, **kwargs): - Set the limits for the xaxis - - Returns the current xlimits as a length 2 tuple: [*xmin*, *xmax*] + Set the data limits for the xaxis Examples:: - set_xlim((valmin, valmax)) - set_xlim(valmin, valmax) - set_xlim(xmin=1) # xmax unchanged - set_xlim(xmax=1) # xmin unchanged + set_xlim((left, right)) + set_xlim(left, right) + set_xlim(left=1) # right unchanged + set_xlim(right=1) # left unchanged Keyword arguments: - *ymin*: scalar - the min of the ylim - *ymax*: scalar - the max of the ylim + *left*: scalar + the left xlim; *xmin*, the previous name, may still be used + *right*: scalar + the right xlim; *xmax*, the previous name, may still be used *emit*: [ True | False ] notify observers of lim change + *auto*: [ True | False | None ] + turn *x* autoscaling on (True), off (False; default), + or leave unchanged (None) - ACCEPTS: len(2) sequence of floats - """ - if xmax is None and iterable(xmin): - xmin,xmax = xmin - + Note: the *left* (formerly *xmin*) value may be greater than + the *right* (formerly *xmax*). + For example, suppose *x* is years before present. + Then one might use:: - self._process_unit_info(xdata=(xmin, xmax)) - if xmin is not None: - xmin = self.convert_xunits(xmin) - if xmax is not None: - xmax = self.convert_xunits(xmax) + set_ylim(5000, 0) - old_xmin,old_xmax = self.get_xlim() - if xmin is None: xmin = old_xmin - if xmax is None: xmax = old_xmax + so 5000 years ago is on the left of the plot and the + present is on the right. - xmin, xmax = mtransforms.nonsingular(xmin, xmax, increasing=False) - xmin, xmax = self.xaxis.limit_range_for_scale(xmin, xmax) + Returns the current xlimits as a length 2 tuple - self.viewLim.intervalx = (xmin, xmax) + ACCEPTS: len(2) sequence of floats + """ + if 'xmin' in kw: + left = kw.pop('xmin') + if 'xmax' in kw: + right = kw.pop('xmax') + if kw: + raise ValueError("unrecognized kwargs: %s" % kw.keys()) + + if right is None and iterable(left): + left,right = left + + self._process_unit_info(xdata=(left, right)) + if left is not None: + left = self.convert_xunits(left) + if right is not None: + right = self.convert_xunits(right) + + old_left, old_right = self.get_xlim() + if left is None: left = old_left + if right is None: right = old_right + + if left==right: + warnings.warn(('Attempting to set identical left==right results\n' + + 'in singular transformations; automatically expanding.\n' + + 'left=%s, right=%s') % (left, right)) + left, right = mtransforms.nonsingular(left, right, increasing=False) + left, right = self.xaxis.limit_range_for_scale(left, right) + + self.viewLim.intervalx = (left, right) + if auto is not None: + self._autoscaleXon = bool(auto) if emit: self.callbacks.process('xlim_changed', self) # Call all of the other x-axes that are shared with this one for other in self._shared_x_axes.get_siblings(self): if other is not self: - other.set_xlim(self.viewLim.intervalx, emit=False) + other.set_xlim(self.viewLim.intervalx, + emit=False, auto=auto) if (other.figure != self.figure and other.figure.canvas is not None): other.figure.canvas.draw_idle() - return xmin, xmax + return left, right def get_xscale(self): 'return the xaxis scale string: %s' % ( ", ".join(mscale.get_scale_names())) return self.xaxis.get_scale() + @docstring.dedent_interpd def set_xscale(self, value, **kwargs): """ call signature:: @@ -2044,13 +2419,9 @@ %(scale_docs)s """ self.xaxis.set_scale(value, **kwargs) - self.autoscale_view() + self.autoscale_view(scaley=False) self._update_transScale() - set_xscale.__doc__ = cbook.dedent(set_xscale.__doc__) % { - 'scale': ' | '.join([repr(x) for x in mscale.get_scale_names()]), - 'scale_docs': mscale.get_scale_docs().strip()} - def get_xticks(self, minor=False): 'Return the x ticks as a list of locations' return self.xaxis.get_ticklocs(minor=minor) @@ -2078,6 +2449,7 @@ return cbook.silent_list('Text xticklabel', self.xaxis.get_ticklabels(minor=minor)) + @docstring.dedent_interpd def set_xticklabels(self, labels, fontdict=None, minor=False, **kwargs): """ call signature:: @@ -2095,30 +2467,29 @@ """ return self.xaxis.set_ticklabels(labels, fontdict, minor=minor, **kwargs) - set_xticklabels.__doc__ = cbook.dedent( - set_xticklabels.__doc__) % martist.kwdocd def invert_yaxis(self): "Invert the y-axis." - left, right = self.get_ylim() - self.set_ylim(right, left) + bottom, top = self.get_ylim() + self.set_ylim(top, bottom) def yaxis_inverted(self): 'Returns True if the y-axis is inverted.' - left, right = self.get_ylim() - return right < left + bottom, top = self.get_ylim() + return top < bottom def get_ybound(self): "Return y-axis numerical bounds in the form of lowerBound < upperBound" - left, right = self.get_ylim() - if left < right: - return left, right + bottom, top = self.get_ylim() + if bottom < top: + return bottom, top else: - return right, left + return top, bottom def set_ybound(self, lower=None, upper=None): """Set the lower and upper numerical bounds of the y-axis. This method will honor axes inversion regardless of parameter order. + It will not change the _autoscaleYon attribute. """ if upper is None and iterable(lower): lower,upper = lower @@ -2130,80 +2501,113 @@ if self.yaxis_inverted(): if lower < upper: - self.set_ylim(upper, lower) + self.set_ylim(upper, lower, auto=None) else: - self.set_ylim(lower, upper) + self.set_ylim(lower, upper, auto=None) else: if lower < upper: - self.set_ylim(lower, upper) + self.set_ylim(lower, upper, auto=None) else: - self.set_ylim(upper, lower) + self.set_ylim(upper, lower, auto=None) def get_ylim(self): """ - Get the y-axis range [*ymin*, *ymax*] + Get the y-axis range [*bottom*, *top*] """ return tuple(self.viewLim.intervaly) - def set_ylim(self, ymin=None, ymax=None, emit=True, **kwargs): + def set_ylim(self, bottom=None, top=None, emit=True, auto=False, **kw): """ call signature:: set_ylim(self, *args, **kwargs): - Set the limits for the yaxis; v = [ymin, ymax]:: + Set the data limits for the yaxis + + Examples:: - set_ylim((valmin, valmax)) - set_ylim(valmin, valmax) - set_ylim(ymin=1) # ymax unchanged - set_ylim(ymax=1) # ymin unchanged + set_ylim((bottom, top)) + set_ylim(bottom, top) + set_ylim(bottom=1) # top unchanged + set_ylim(top=1) # bottom unchanged Keyword arguments: - *ymin*: scalar - the min of the ylim - *ymax*: scalar - the max of the ylim + *bottom*: scalar + the bottom ylim; the previous name, *ymin*, may still be used + *top*: scalar + the top ylim; the previous name, *ymax*, may still be used *emit*: [ True | False ] notify observers of lim change + *auto*: [ True | False | None ] + turn *y* autoscaling on (True), off (False; default), + or leave unchanged (None) + + Note: the *bottom* (formerly *ymin*) value may be greater than + the *top* (formerly *ymax*). + For example, suppose *y* is depth in the ocean. + Then one might use:: + + set_ylim(5000, 0) + + so 5000 m depth is at the bottom of the plot and the + surface, 0 m, is at the top. Returns the current ylimits as a length 2 tuple ACCEPTS: len(2) sequence of floats """ - if ymax is None and iterable(ymin): - ymin,ymax = ymin - - if ymin is not None: - ymin = self.convert_yunits(ymin) - if ymax is not None: - ymax = self.convert_yunits(ymax) - - old_ymin,old_ymax = self.get_ylim() - - if ymin is None: ymin = old_ymin - if ymax is None: ymax = old_ymax - - ymin, ymax = mtransforms.nonsingular(ymin, ymax, increasing=False) - ymin, ymax = self.yaxis.limit_range_for_scale(ymin, ymax) - self.viewLim.intervaly = (ymin, ymax) + if 'ymin' in kw: + bottom = kw.pop('ymin') + if 'ymax' in kw: + top = kw.pop('ymax') + if kw: + raise ValueError("unrecognized kwargs: %s" % kw.keys()) + + if top is None and iterable(bottom): + bottom,top = bottom + + if bottom is not None: + bottom = self.convert_yunits(bottom) + if top is not None: + top = self.convert_yunits(top) + + old_bottom, old_top = self.get_ylim() + + if bottom is None: bottom = old_bottom + if top is None: top = old_top + + if bottom==top: + warnings.warn(('Attempting to set identical bottom==top results\n' + + 'in singular transformations; automatically expanding.\n' + + 'bottom=%s, top=%s') % (bottom, top)) + + bottom, top = mtransforms.nonsingular(bottom, top, increasing=False) + bottom, top = self.yaxis.limit_range_for_scale(bottom, top) + + self.viewLim.intervaly = (bottom, top) + if auto is not None: + self._autoscaleYon = bool(auto) if emit: self.callbacks.process('ylim_changed', self) # Call all of the other y-axes that are shared with this one for other in self._shared_y_axes.get_siblings(self): if other is not self: - other.set_ylim(self.viewLim.intervaly, emit=False) + other.set_ylim(self.viewLim.intervaly, + emit=False, auto=auto) if (other.figure != self.figure and other.figure.canvas is not None): other.figure.canvas.draw_idle() - return ymin, ymax + + return bottom, top def get_yscale(self): 'return the xaxis scale string: %s' % ( ", ".join(mscale.get_scale_names())) return self.yaxis.get_scale() + @docstring.dedent_interpd def set_yscale(self, value, **kwargs): """ call signature:: @@ -2218,13 +2622,9 @@ %(scale_docs)s """ self.yaxis.set_scale(value, **kwargs) - self.autoscale_view() + self.autoscale_view(scalex=False) self._update_transScale() - set_yscale.__doc__ = cbook.dedent(set_yscale.__doc__) % { - 'scale': ' | '.join([repr(x) for x in mscale.get_scale_names()]), - 'scale_docs': mscale.get_scale_docs().strip()} - def get_yticks(self, minor=False): 'Return the y ticks as a list of locations' return self.yaxis.get_ticklocs(minor=minor) @@ -2257,6 +2657,7 @@ return cbook.silent_list('Text yticklabel', self.yaxis.get_ticklabels(minor=minor)) + @docstring.dedent_interpd def set_yticklabels(self, labels, fontdict=None, minor=False, **kwargs): """ call signature:: @@ -2274,81 +2675,22 @@ """ return self.yaxis.set_ticklabels(labels, fontdict, minor=minor, **kwargs) - set_yticklabels.__doc__ = cbook.dedent( - set_yticklabels.__doc__) % martist.kwdocd def xaxis_date(self, tz=None): """Sets up x-axis ticks and labels that treat the x data as dates. *tz* is the time zone to use in labeling dates. Defaults to rc value. """ - - xmin, xmax = self.dataLim.intervalx - if xmin==0.: - # no data has been added - let's set the default datalim. - # We should probably use a better proxy for the datalim - # have been updated than the ignore setting - dmax = today = datetime.date.today() - dmin = today-datetime.timedelta(days=10) - self._process_unit_info(xdata=(dmin, dmax)) - dmin, dmax = self.convert_xunits([dmin, dmax]) - self.viewLim.intervalx = dmin, dmax - self.dataLim.intervalx = dmin, dmax - - locator = self.xaxis.get_major_locator() - if not isinstance(locator, mdates.DateLocator): - locator = mdates.AutoDateLocator(tz) - self.xaxis.set_major_locator(locator) - - # the autolocator uses the viewlim to pick the right date - # locator, but it may not have correct viewlim before an - # autoscale. If the viewlim is still zero..1, set it to the - # datalim and the autoscaler will update it on request - if self.viewLim.intervalx[0]==0.: - self.viewLim.intervalx = tuple(self.dataLim.intervalx) - locator.refresh() - - formatter = self.xaxis.get_major_formatter() - if not isinstance(formatter, mdates.DateFormatter): - formatter = mdates.AutoDateFormatter(locator, tz) - self.xaxis.set_major_formatter(formatter) + # should be enough to inform the unit conversion interface + # dates are comng in + self.xaxis.axis_date() def yaxis_date(self, tz=None): """Sets up y-axis ticks and labels that treat the y data as dates. *tz* is the time zone to use in labeling dates. Defaults to rc value. """ - ymin, ymax = self.dataLim.intervaly - if ymin==0.: - # no data has been added - let's set the default datalim. - # We should probably use a better proxy for the datalim - # have been updated than the ignore setting - dmax = today = datetime.date.today() - dmin = today-datetime.timedelta(days=10) - self._process_unit_info(ydata=(dmin, dmax)) - - dmin, dmax = self.convert_yunits([dmin, dmax]) - self.viewLim.intervaly = dmin, dmax - self.dataLim.intervaly = dmin, dmax - - - locator = self.yaxis.get_major_locator() - if not isinstance(locator, mdates.DateLocator): - locator = mdates.AutoDateLocator(tz) - self.yaxis.set_major_locator(locator) - - # the autolocator uses the viewlim to pick the right date - # locator, but it may not have correct viewlim before an - # autoscale. If the viewlim is still zero..1, set it to the - # datalim and the autoscaler will update it on request - if self.viewLim.intervaly[0]==0.: - self.viewLim.intervaly = tuple(self.dataLim.intervaly) - locator.refresh() - - formatter = self.xaxis.get_major_formatter() - if not isinstance(formatter, mdates.DateFormatter): - formatter = mdates.AutoDateFormatter(locator, tz) - self.yaxis.set_major_formatter(formatter) + self.yaxis.axis_date() def format_xdata(self, x): """ @@ -2705,6 +3047,7 @@ """ return self.title.get_text() + @docstring.dedent_interpd def set_title(self, label, fontdict=None, **kwargs): """ call signature:: @@ -2725,7 +3068,7 @@ """ default = { 'fontsize':rcParams['axes.titlesize'], - 'verticalalignment' : 'bottom', + 'verticalalignment' : 'baseline', 'horizontalalignment' : 'center' } @@ -2734,7 +3077,6 @@ if fontdict is not None: self.title.update(fontdict) self.title.update(kwargs) return self.title - set_title.__doc__ = cbook.dedent(set_title.__doc__) % martist.kwdocd def get_xlabel(self): """ @@ -2743,6 +3085,7 @@ label = self.xaxis.get_label() return label.get_text() + @docstring.dedent_interpd def set_xlabel(self, xlabel, fontdict=None, labelpad=None, **kwargs): """ call signature:: @@ -2764,7 +3107,6 @@ """ if labelpad is not None: self.xaxis.labelpad = labelpad return self.xaxis.set_label_text(xlabel, fontdict, **kwargs) - set_xlabel.__doc__ = cbook.dedent(set_xlabel.__doc__) % martist.kwdocd def get_ylabel(self): """ @@ -2773,6 +3115,7 @@ label = self.yaxis.get_label() return label.get_text() + @docstring.dedent_interpd def set_ylabel(self, ylabel, fontdict=None, labelpad=None, **kwargs): """ call signature:: @@ -2794,8 +3137,8 @@ """ if labelpad is not None: self.yaxis.labelpad = labelpad return self.yaxis.set_label_text(ylabel, fontdict, **kwargs) - set_ylabel.__doc__ = cbook.dedent(set_ylabel.__doc__) % martist.kwdocd + @docstring.dedent_interpd def text(self, x, y, s, fontdict=None, withdash=False, **kwargs): """ @@ -2844,9 +3187,8 @@ %(Text)s """ default = { - 'verticalalignment' : 'bottom', + 'verticalalignment' : 'baseline', 'horizontalalignment' : 'left', - #'verticalalignment' : 'top', 'transform' : self.transData, } @@ -2876,8 +3218,8 @@ #if t.get_clip_on(): t.set_clip_box(self.bbox) if 'clip_on' in kwargs: t.set_clip_box(self.bbox) return t - text.__doc__ = cbook.dedent(text.__doc__) % martist.kwdocd + @docstring.dedent_interpd def annotate(self, *args, **kwargs): """ call signature:: @@ -2896,11 +3238,12 @@ self._set_artist_props(a) if kwargs.has_key('clip_on'): a.set_clip_path(self.patch) self.texts.append(a) + a._remove_method = lambda h: self.texts.remove(h) return a - annotate.__doc__ = cbook.dedent(annotate.__doc__) % martist.kwdocd #### Lines and spans + @docstring.dedent_interpd def axhline(self, y=0, xmin=0, xmax=1, **kwargs): """ call signature:: @@ -2934,7 +3277,8 @@ >>> axhline(y=.5, xmin=0.25, xmax=0.75) - Valid kwargs are :class:`~matplotlib.lines.Line2D` properties: + Valid kwargs are :class:`~matplotlib.lines.Line2D` properties, + with the exception of 'transform': %(Line2D)s @@ -2944,6 +3288,10 @@ for example plot and source code """ + if "transform" in kwargs: + raise ValueError( + "'transform' is not allowed as a kwarg;" + + "axhline generates its own transform.") ymin, ymax = self.get_ybound() # We need to strip away the units for comparison with @@ -2960,8 +3308,7 @@ self.autoscale_view(scalex=False, scaley=scaley) return l - axhline.__doc__ = cbook.dedent(axhline.__doc__) % martist.kwdocd - + @docstring.dedent_interpd def axvline(self, x=0, ymin=0, ymax=1, **kwargs): """ call signature:: @@ -2995,7 +3342,8 @@ >>> axvline(x=.5, ymin=0.25, ymax=0.75) - Valid kwargs are :class:`~matplotlib.lines.Line2D` properties: + Valid kwargs are :class:`~matplotlib.lines.Line2D` properties, + with the exception of 'transform': %(Line2D)s @@ -3005,6 +3353,10 @@ for example plot and source code """ + if "transform" in kwargs: + raise ValueError( + "'transform' is not allowed as a kwarg;" + + "axvline generates its own transform.") xmin, xmax = self.get_xbound() # We need to strip away the units for comparison with @@ -3021,8 +3373,7 @@ self.autoscale_view(scalex=scalex, scaley=False) return l - axvline.__doc__ = cbook.dedent(axvline.__doc__) % martist.kwdocd - + @docstring.dedent_interpd def axhspan(self, ymin, ymax, xmin=0, xmax=1, **kwargs): """ call signature:: @@ -3078,8 +3429,8 @@ self.add_patch(p) self.autoscale_view(scalex=False) return p - axhspan.__doc__ = cbook.dedent(axhspan.__doc__) % martist.kwdocd + @docstring.dedent_interpd def axvspan(self, xmin, xmax, ymin=0, ymax=1, **kwargs): """ call signature:: @@ -3135,9 +3486,9 @@ self.add_patch(p) self.autoscale_view(scaley=False) return p - axvspan.__doc__ = cbook.dedent(axvspan.__doc__) % martist.kwdocd + @docstring.dedent def hlines(self, y, xmin, xmax, colors='k', linestyles='solid', label='', **kwargs): """ @@ -3222,8 +3573,8 @@ return coll - hlines.__doc__ = cbook.dedent(hlines.__doc__) + @docstring.dedent_interpd def vlines(self, x, ymin, ymax, colors='k', linestyles='solid', label='', **kwargs): """ @@ -3302,9 +3653,9 @@ self.autoscale_view() return coll - vlines.__doc__ = cbook.dedent(vlines.__doc__) % martist.kwdocd #### Basic plotting + @docstring.dedent_interpd def plot(self, *args, **kwargs): """ Plot lines and/or markers to the @@ -3437,8 +3788,7 @@ self.autoscale_view(scalex=scalex, scaley=scaley) return lines - plot.__doc__ = cbook.dedent(plot.__doc__) % martist.kwdocd - + @docstring.dedent_interpd def plot_date(self, x, y, fmt='bo', tz=None, xdate=True, ydate=False, **kwargs): """ @@ -3508,9 +3858,9 @@ self.autoscale_view() return ret - plot_date.__doc__ = cbook.dedent(plot_date.__doc__) % martist.kwdocd + @docstring.dedent_interpd def loglog(self, *args, **kwargs): """ call signature:: @@ -3569,8 +3919,8 @@ self._hold = b # restore the hold return l - loglog.__doc__ = cbook.dedent(loglog.__doc__) % martist.kwdocd + @docstring.dedent_interpd def semilogx(self, *args, **kwargs): """ call signature:: @@ -3621,8 +3971,8 @@ l = self.plot(*args, **kwargs) self._hold = b # restore the hold return l - semilogx.__doc__ = cbook.dedent(semilogx.__doc__) % martist.kwdocd + @docstring.dedent_interpd def semilogy(self, *args, **kwargs): """ call signature:: @@ -3673,8 +4023,8 @@ self._hold = b # restore the hold return l - semilogy.__doc__ = cbook.dedent(semilogy.__doc__) % martist.kwdocd + @docstring.dedent_interpd def acorr(self, x, **kwargs): """ call signature:: @@ -3736,8 +4086,8 @@ .. plot:: mpl_examples/pylab_examples/xcorr_demo.py """ return self.xcorr(x, x, **kwargs) - acorr.__doc__ = cbook.dedent(acorr.__doc__) % martist.kwdocd + @docstring.dedent_interpd def xcorr(self, x, y, normed=True, detrend=mlab.detrend_none, usevlines=True, maxlags=10, **kwargs): """ @@ -3824,7 +4174,6 @@ a, = self.plot(lags, c, **kwargs) b = None return lags, c, a, b - xcorr.__doc__ = cbook.dedent(xcorr.__doc__) % martist.kwdocd def _get_legend_handles(self): @@ -3962,6 +4311,9 @@ The relative size of legend markers vs. original. If *None*, use rc settings. + *frameon*: [ True | False ] + if True, draw a frame. Default is True + *fancybox*: [ None | False | True ] if True, draw a frame with a round fancybox. If None, use rc @@ -3984,9 +4336,11 @@ *title* : string the legend title - Padding and spacing between various elements use following keywords - parameters. The dimensions of these values are given as a fraction - of the fontsize. Values from rcParams will be used if None. + Padding and spacing between various elements use following + keywords parameters. These values are measure in font-size + units. E.g., a fontsize of 10 points and a handlelength=5 + implies a handlelength of 50 points. Values from rcParams + will be used if None. ================ ================================================================== Keyword Description @@ -4078,19 +4432,12 @@ return self.plot(x, y, *args, **kwargs) - def bar(self, left, height, width=0.8, bottom=None, - color=None, edgecolor=None, linewidth=None, - yerr=None, xerr=None, ecolor=None, capsize=3, - align='edge', orientation='vertical', log=False, - **kwargs - ): + @docstring.dedent_interpd + def bar(self, left, height, width=0.8, bottom=None, **kwargs): """ call signature:: - bar(left, height, width=0.8, bottom=0, - color=None, edgecolor=None, linewidth=None, - yerr=None, xerr=None, ecolor=None, capsize=3, - align='edge', orientation='vertical', log=False) + bar(left, height, width=0.8, bottom=0, **kwargs) Make a bar plot with rectangles bounded by: @@ -4131,6 +4478,10 @@ *ecolor* specifies the color of any errorbar *capsize* (default 3) determines the length in points of the error bar caps + *error_kw* dictionary of kwargs to be passed to + errorbar method. *ecolor* and *capsize* + may be specified here rather than as + independent kwargs. *align* 'edge' (default) | 'center' *orientation* 'vertical' | 'horizontal' *log* [False|True] False (default) leaves the @@ -4149,6 +4500,9 @@ *xerr*, and *yerr* can be either scalars or sequences of length equal to the number of bars. This enables you to use bar as the basis for stacked bar charts, or candlestick plots. + Detail: *xerr* and *yerr* are passed directly to + :meth:`errorbar`, so they can also have shape 2xN for + independent specification of lower and upper errors. Other optional kwargs: @@ -4159,7 +4513,24 @@ .. plot:: mpl_examples/pylab_examples/bar_stacked.py """ if not self._hold: self.cla() - + color = kwargs.pop('color', None) + edgecolor = kwargs.pop('edgecolor', None) + linewidth = kwargs.pop('linewidth', None) + + # Because xerr and yerr will be passed to errorbar, + # most dimension checking and processing will be left + # to the errorbar method. + xerr = kwargs.pop('xerr', None) + yerr = kwargs.pop('yerr', None) + error_kw = kwargs.pop('error_kw', dict()) + ecolor = kwargs.pop('ecolor', None) + capsize = kwargs.pop('capsize', 3) + error_kw.setdefault('ecolor', ecolor) + error_kw.setdefault('capsize', capsize) + + align = kwargs.pop('align', 'edge') + orientation = kwargs.pop('orientation', 'vertical') + log = kwargs.pop('log', False) label = kwargs.pop('label', '') def make_iterable(x): if not iterable(x): @@ -4220,6 +4591,8 @@ color = [None] * nbars else: color = list(mcolors.colorConverter.to_rgba_array(color)) + if len(color) == 0: # until to_rgba_array is changed + color = [[0,0,0,0]] if len(color) < nbars: color *= nbars @@ -4227,17 +4600,11 @@ edgecolor = [None] * nbars else: edgecolor = list(mcolors.colorConverter.to_rgba_array(edgecolor)) + if len(edgecolor) == 0: # until to_rgba_array is changed + edgecolor = [[0,0,0,0]] if len(edgecolor) < nbars: edgecolor *= nbars - if yerr is not None: - if not iterable(yerr): - yerr = [yerr]*nbars - - if xerr is not None: - if not iterable(xerr): - xerr = [xerr]*nbars - # FIXME: convert the following to proper input validation # raising ValueError; don't use assert for this. assert len(left)==nbars, "incompatible sizes: argument 'left' must be length %d or scalar" % nbars @@ -4248,13 +4615,6 @@ assert len(bottom)==nbars, ("incompatible sizes: argument 'bottom' must be length %d or scalar" % nbars) - if yerr is not None and len(yerr)!=nbars: - raise ValueError( - "incompatible sizes: bar() argument 'yerr' must be len(%s) or scalar" % nbars) - if xerr is not None and len(xerr)!=nbars: - raise ValueError( - "incompatible sizes: bar() argument 'xerr' must be len(%s) or scalar" % nbars) - patches = [] # lets do some conversions now since some types cannot be @@ -4321,7 +4681,7 @@ self.errorbar( x, y, yerr=yerr, xerr=xerr, - fmt=None, ecolor=ecolor, capsize=capsize) + fmt=None, **error_kw) self.hold(holdstate) # restore previous hold state @@ -4342,8 +4702,8 @@ self.dataLim.intervaly = (ymin, ymax) self.autoscale_view() return patches - bar.__doc__ = cbook.dedent(bar.__doc__) % martist.kwdocd + @docstring.dedent_interpd def barh(self, bottom, width, height=0.8, left=None, **kwargs): """ call signature:: @@ -4414,8 +4774,7 @@ orientation='horizontal', **kwargs) return patches - barh.__doc__ = cbook.dedent(barh.__doc__) % martist.kwdocd - + @docstring.dedent_interpd def broken_barh(self, xranges, yrange, **kwargs): """ call signature:: @@ -4458,8 +4817,6 @@ return col - broken_barh.__doc__ = cbook.dedent(broken_barh.__doc__) % martist.kwdocd - def stem(self, x, y, linefmt='b-', markerfmt='bo', basefmt='r-'): """ call signature:: @@ -4611,6 +4968,7 @@ #props={'facecolor':w.get_facecolor()} ) shad.set_zorder(0.9*w.get_zorder()) + shad.set_label('_nolegend_') self.add_patch(shad) @@ -4653,6 +5011,7 @@ if autopct is None: return slices, texts else: return slices, texts, autotexts + @docstring.dedent_interpd def errorbar(self, x, y, yerr=None, xerr=None, fmt='-', ecolor=None, elinewidth=None, capsize=3, barsabove=False, lolims=False, uplims=False, @@ -4678,17 +5037,17 @@ If a scalar number, len(N) array-like object, or an Nx1 array-like object, errorbars are drawn +/- value. - If a rank-1, 2xN numpy array, errorbars are drawn at -row1 and + If a sequence of shape 2xN, errorbars are drawn at -row1 and +row2 *fmt*: '-' - The plot format symbol for *y*. If *fmt* is *None*, just plot the - errorbars with no line symbols. This can be useful for creating a - bar plot with errorbars. + The plot format symbol. If *fmt* is *None*, only the + errorbars are plotted. This is used for adding + errorbars to a bar plot, for example. *ecolor*: [ None | mpl color ] - a matplotlib color arg which gives the color the errorbar lines; if - *None*, use the marker color. + a matplotlib color arg which gives the color the errorbar lines; + if *None*, use the marker color. *elinewidth*: scalar the linewidth of the errorbar lines. If *None*, use the linewidth. @@ -4707,8 +5066,7 @@ type as *xerr* and *yerr*. All other keyword arguments are passed on to the plot command for the - markers, so you can add additional key=value pairs to control the - errorbar markers. For example, this code makes big red squares with + markers. For example, this code makes big red squares with thick green edges:: x,y,yerr = rand(3,10) @@ -4723,12 +5081,16 @@ %(Line2D)s - Return value is a length 3 tuple. The first element is the - :class:`~matplotlib.lines.Line2D` instance for the *y* symbol - lines. The second element is a list of error bar cap lines, - the third element is a list of - :class:`~matplotlib.collections.LineCollection` instances for - the horizontal and vertical error ranges. + Returns (*plotline*, *caplines*, *barlinecols*): + + *plotline*: :class:`~matplotlib.lines.Line2D` instance + *x*, *y* plot markers and/or line + + *caplines*: list of error bar cap + :class:`~matplotlib.lines.Line2D` instances + *barlinecols*: list of + :class:`~matplotlib.collections.LineCollection` instances for + the horizontal and vertical error ranges. **Example:** @@ -4738,6 +5100,8 @@ self._process_unit_info(xdata=x, ydata=y, kwargs=kwargs) if not self._hold: self.cla() + holdstate = self._hold + self._hold = True # make sure all the args are iterable; use lists not arrays to # preserve units @@ -4900,7 +5264,7 @@ if ecolor is None: if l0 is None: - ecolor = self._get_lines._get_next_cycle_color() + ecolor = self._get_lines.color_cycle.next() else: ecolor = l0.get_color() @@ -4910,16 +5274,17 @@ l.set_color(ecolor) self.autoscale_view() + self._hold = holdstate return (l0, caplines, barcols) - errorbar.__doc__ = cbook.dedent(errorbar.__doc__) % martist.kwdocd def boxplot(self, x, notch=0, sym='b+', vert=1, whis=1.5, - positions=None, widths=None): + positions=None, widths=None, patch_artist=False, + bootstrap=None): """ call signature:: boxplot(x, notch=0, sym='+', vert=1, whis=1.5, - positions=None, widths=None) + positions=None, widths=None, patch_artist=False) Make a box and whisker plot for each column of *x* or each vector in sequence *x*. The box extends from the lower to @@ -4927,6 +5292,8 @@ The whiskers extend from the box to show the range of the data. Flier points are those past the end of the whiskers. + *x* is an array or a sequence of vectors. + - *notch* = 0 (default) produces a rectangular box plot. - *notch* = 1 will produce a notched box plot @@ -4935,12 +5302,22 @@ - *vert* = 1 (default) makes the boxes vertical. - *vert* = 0 makes horizontal boxes. This seems goofy, but - that's how Matlab did it. + that's how MATLAB did it. *whis* (default 1.5) defines the length of the whiskers as a function of the inner quartile range. They extend to the most extreme data point within ( ``whis*(75%-25%)`` ) data range. + *bootstrap* (default None) specifies whether to bootstrap the + confidence intervals around the median for notched + boxplots. If bootstrap==None, no bootstrapping is performed, + and notches are calculated using a Gaussian-based asymptotic + approximation (see McGill, R., Tukey, J.W., and Larsen, W.A., + 1978, and Kendall and Stuart, 1967). Otherwise, bootstrap + specifies the number of times to bootstrap the median to + determine it's 95% confidence intervals. Values between 1000 + and 10000 are recommended. + *positions* (default 1,2,...,n) sets the horizontal positions of the boxes. The ticks and limits are automatically set to match the positions. @@ -4949,7 +5326,8 @@ each box. The default is 0.5, or ``0.15*(distance between extreme positions)`` if that is smaller. - *x* is an array or a sequence of vectors. + - *patch_artist* = False (default) produces boxes with the Line2D artist + - *patch_artist* = True produces boxes with the Patch artist Returns a dictionary mapping each component of the boxplot to a list of the :class:`matplotlib.lines.Line2D` @@ -5051,12 +5429,33 @@ med_x = [box_x_min, box_x_max] # calculate 'notch' plot else: - notch_max = med + 1.57*iq/np.sqrt(row) - notch_min = med - 1.57*iq/np.sqrt(row) - if notch_max > q3: - notch_max = q3 - if notch_min < q1: - notch_min = q1 + if bootstrap is not None: + # Do a bootstrap estimate of notch locations. + def bootstrapMedian(data, N=5000): + # determine 95% confidence intervals of the median + M = len(data) + percentile = [2.5,97.5] + estimate = np.zeros(N) + for n in range(N): + bsIndex = np.random.random_integers(0,M-1,M) + bsData = data[bsIndex] + estimate[n] = mlab.prctile(bsData, 50) + CI = mlab.prctile(estimate, percentile) + return CI + + # get conf. intervals around median + CI = bootstrapMedian(d, N=bootstrap) + notch_max = CI[1] + notch_min = CI[0] + else: + # Estimate notch locations using Gaussian-based + # asymptotic approximation. + # + # For discussion: McGill, R., Tukey, J.W., + # and Larsen, W.A. (1978) "Variations of + # Boxplots", The American Statistician, 32:12-16. + notch_max = med + 1.57*iq/np.sqrt(row) + notch_min = med - 1.57*iq/np.sqrt(row) # make our notched box vectors box_x = [box_x_min, box_x_max, box_x_max, cap_x_max, box_x_max, box_x_max, box_x_min, box_x_min, cap_x_min, box_x_min, @@ -5067,23 +5466,55 @@ med_x = [cap_x_min, cap_x_max] med_y = [med, med] + def to_vc(xs,ys): + # convert arguments to verts and codes + verts = [] + #codes = [] + for xi,yi in zip(xs,ys): + verts.append( (xi,yi) ) + verts.append( (0,0) ) # ignored + codes = [mpath.Path.MOVETO] + \ + [mpath.Path.LINETO]*(len(verts)-2) + \ + [mpath.Path.CLOSEPOLY] + return verts,codes + + def patch_list(xs,ys): + verts,codes = to_vc(xs,ys) + path = mpath.Path( verts, codes ) + patch = mpatches.PathPatch(path) + self.add_artist(patch) + return [patch] + # vertical or horizontal plot? if vert: def doplot(*args): return self.plot(*args) + def dopatch(xs,ys): + return patch_list(xs,ys) else: def doplot(*args): shuffled = [] for i in xrange(0, len(args), 3): shuffled.extend([args[i+1], args[i], args[i+2]]) return self.plot(*shuffled) + def dopatch(xs,ys): + xs,ys = ys,xs # flip X, Y + return patch_list(xs,ys) + + if patch_artist: + median_color = 'k' + else: + median_color = 'r' whiskers.extend(doplot(wisk_x, [q1, wisk_lo], 'b--', wisk_x, [q3, wisk_hi], 'b--')) caps.extend(doplot(cap_x, [wisk_hi, wisk_hi], 'k-', cap_x, [wisk_lo, wisk_lo], 'k-')) - boxes.extend(doplot(box_x, box_y, 'b-')) - medians.extend(doplot(med_x, med_y, 'r-')) + if patch_artist: + boxes.extend(dopatch(box_x, box_y)) + else: + boxes.extend(doplot(box_x, box_y, 'b-')) + medians.extend(doplot(med_x, med_y, median_color+'-')) fliers.extend(doplot(flier_hi_x, flier_hi, sym, flier_lo_x, flier_lo, sym)) @@ -5103,15 +5534,16 @@ return dict(whiskers=whiskers, caps=caps, boxes=boxes, medians=medians, fliers=fliers) + @docstring.dedent_interpd def scatter(self, x, y, s=20, c='b', marker='o', cmap=None, norm=None, - vmin=None, vmax=None, alpha=1.0, linewidths=None, + vmin=None, vmax=None, alpha=None, linewidths=None, faceted=True, verts=None, **kwargs): """ call signatures:: scatter(x, y, s=20, c='b', marker='o', cmap=None, norm=None, - vmin=None, vmax=None, alpha=1.0, linewidths=None, + vmin=None, vmax=None, alpha=None, linewidths=None, verts=None, **kwargs) Make a scatter plot of *x* versus *y*, where *x*, *y* are @@ -5136,22 +5568,22 @@ *marker*: can be one of: - ===== ============== - Value Description - ===== ============== - 's' square - 'o' circle - '^' triangle up - '>' triangle right - 'v' triangle down - '<' triangle left - 'd' diamond - 'p' pentagram - 'h' hexagon - '8' octagon - '+' plus - 'x' cross - ===== ============== + ======= ============== + Value Description + ======= ============== + ``'s'`` square + ``'o'`` circle + ``'^'`` triangle up + ``'>'`` triangle right + ``'v'`` triangle down + ``'<'`` triangle left + ``'d'`` diamond + ``'p'`` pentagon + ``'h'`` hexagon + ``'8'`` octagon + ``'+'`` plus + ``'x'`` cross + ======= ============== The marker can also be a tuple (*numsides*, *style*, *angle*), which will create a custom, regular symbol. @@ -5204,7 +5636,7 @@ *norm* instance, your settings for *vmin* and *vmax* will be ignored. - *alpha*: 0 <= scalar <= 1 + *alpha*: 0 <= scalar <= 1 or None The alpha value for the patches *linewidths*: [ None | scalar | sequence ] @@ -5218,10 +5650,10 @@ particular: *edgecolors*: - 'none' to plot faces with no outlines + The string 'none' to plot faces with no outlines *facecolors*: - 'none' to plot unfilled outlines + The string 'none' to plot unfilled outlines Here are the standard descriptions of all the :class:`~matplotlib.collections.Collection` kwargs: @@ -5242,7 +5674,7 @@ 'v' : (3,math.pi,0), # triangle down '<' : (3,3*math.pi/2.0,0), # triangle left 'd' : (4,0,0), # diamond - 'p' : (5,0,0), # pentagram + 'p' : (5,0,0), # pentagon 'h' : (6,0,0), # hexagon '8' : (8,0,0), # octagon '+' : (4,0,2), # plus @@ -5262,7 +5694,7 @@ s = np.ma.ravel(s) # This doesn't have to match x, y in size. - c_is_stringy = is_string_like(c) or cbook.is_sequence_of_strings(c) + c_is_stringy = is_string_like(c) or is_sequence_of_strings(c) if not c_is_stringy: c = np.asanyarray(c) if c.size == x.size: @@ -5418,12 +5850,11 @@ self.add_collection(collection) return collection - scatter.__doc__ = cbook.dedent(scatter.__doc__) % martist.kwdocd - + @docstring.dedent_interpd def hexbin(self, x, y, C = None, gridsize = 100, bins = None, xscale = 'linear', yscale = 'linear', extent = None, cmap=None, norm=None, vmin=None, vmax=None, - alpha=1.0, linewidths=None, edgecolors='none', + alpha=None, linewidths=None, edgecolors='none', reduce_C_function = np.mean, mincnt=None, marginals=False, **kwargs): """ @@ -5432,7 +5863,7 @@ hexbin(x, y, C = None, gridsize = 100, bins = None, xscale = 'linear', yscale = 'linear', cmap=None, norm=None, vmin=None, vmax=None, - alpha=1.0, linewidths=None, edgecolors='none' + alpha=None, linewidths=None, edgecolors='none' reduce_C_function = np.mean, mincnt=None, marginals=True **kwargs) @@ -5511,7 +5942,7 @@ array *C* is used. Note if you pass a norm instance, your settings for *vmin* and *vmax* will be ignored. - *alpha*: scalar + *alpha*: scalar between 0 and 1, or None the alpha value for the patches *linewidths*: [ None | scalar ] @@ -5549,6 +5980,7 @@ **Example:** .. plot:: mpl_examples/pylab_examples/hexbin_demo.py + """ if not self._hold: self.cla() @@ -5569,8 +6001,12 @@ x = np.array(x, float) y = np.array(y, float) if xscale=='log': + if np.any(x <= 0.0): + raise ValueError("x contains non-positive values, so can not be log-scaled") x = np.log10(x) if yscale=='log': + if np.any(y <= 0.0): + raise ValueError("y contains non-positive values, so can not be log-scaled") y = np.log10(y) if extent is not None: xmin, xmax, ymin, ymax = extent @@ -5722,6 +6158,17 @@ transOffset = self.transData, ) + if isinstance(norm, mcolors.LogNorm): + if (accum==0).any(): + # make sure we have not zeros + accum += 1 + + # autoscale the norm with curren accum values if it hasn't + # been set + if norm is not None: + if norm.vmin is None and norm.vmax is None: + norm.autoscale(accum) + # Transform accum if needed if bins=='log': accum = np.log10(accum+1) @@ -5747,7 +6194,7 @@ corners = ((xmin, ymin), (xmax, ymax)) self.update_datalim( corners) - self.autoscale_view() + self.autoscale_view(tight=True) # add the collection last self.add_collection(collection) @@ -5840,9 +6287,8 @@ return collection - hexbin.__doc__ = cbook.dedent(hexbin.__doc__) % martist.kwdocd - + @docstring.dedent_interpd def arrow(self, x, y, dx, dy, **kwargs): """ call signature:: @@ -5862,7 +6308,6 @@ a = mpatches.FancyArrow(x, y, dx, dy, **kwargs) self.add_artist(a) return a - arrow.__doc__ = cbook.dedent(arrow.__doc__) % martist.kwdocd def quiverkey(self, *args, **kw): qk = mquiver.QuiverKey(*args, **kw) @@ -5879,6 +6324,7 @@ return q quiver.__doc__ = mquiver.Quiver.quiver_doc + @docstring.dedent_interpd def barbs(self, *args, **kw): """ %(barbs_doc)s @@ -5892,9 +6338,8 @@ self.update_datalim(b.get_offsets()) self.autoscale_view() return b - barbs.__doc__ = cbook.dedent(barbs.__doc__) % { - 'barbs_doc': mquiver.Barbs.barbs_doc} + @docstring.dedent_interpd def fill(self, *args, **kwargs): """ call signature:: @@ -5941,9 +6386,10 @@ patches.append( poly ) self.autoscale_view() return patches - fill.__doc__ = cbook.dedent(fill.__doc__) % martist.kwdocd - def fill_between(self, x, y1, y2=0, where=None, **kwargs): + @docstring.dedent_interpd + def fill_between(self, x, y1, y2=0, where=None, interpolate=False, + **kwargs): """ call signature:: @@ -5967,6 +6413,12 @@ it is a a N length numpy boolean array and the fill will only happen over the regions where ``where==True`` + *interpolate* + If True, interpolate between the two lines to find the + precise point of intersection. Otherwise, the start and + end points of the filled region will only occur on explicit + values in the *x* array. + *kwargs* keyword args passed on to the :class:`PolyCollection` @@ -6022,11 +6474,36 @@ N = len(xslice) X = np.zeros((2*N+2, 2), np.float) - # the purpose of the next two lines is for when y2 is a - # scalar like 0 and we want the fill to go all the way - # down to 0 even if none of the y1 sample points do - X[0] = xslice[0], y2slice[0] - X[N+1] = xslice[-1], y2slice[-1] + if interpolate: + def get_interp_point(ind): + im1 = max(ind-1, 0) + x_values = x[im1:ind+1] + diff_values = y1[im1:ind+1] - y2[im1:ind+1] + y1_values = y1[im1:ind+1] + + if len(diff_values) == 2: + if np.ma.is_masked(diff_values[1]): + return x[im1], y1[im1] + elif np.ma.is_masked(diff_values[0]): + return x[ind], y1[ind] + + diff_order = diff_values.argsort() + diff_root_x = np.interp( + 0, diff_values[diff_order], x_values[diff_order]) + diff_root_y = np.interp(diff_root_x, x_values, y1_values) + return diff_root_x, diff_root_y + + start = get_interp_point(ind0) + end = get_interp_point(ind1) + else: + # the purpose of the next two lines is for when y2 is a + # scalar like 0 and we want the fill to go all the way + # down to 0 even if none of the y1 sample points do + start = xslice[0], y2slice[0] + end = xslice[-1], y2slice[-1] + + X[0] = start + X[N+1] = end X[1:N+1,0] = xslice X[1:N+1,1] = y1slice @@ -6042,14 +6519,13 @@ XY2 = np.array([x[where], y2[where]]).T self.dataLim.update_from_data_xy(XY1, self.ignore_existing_data_limits, updatex=True, updatey=True) - self.dataLim.update_from_data_xy(XY2, self.ignore_existing_data_limits, updatex=False, updatey=True) self.add_collection(collection) self.autoscale_view() return collection - fill_between.__doc__ = cbook.dedent(fill_between.__doc__) % martist.kwdocd + @docstring.dedent_interpd def fill_betweenx(self, y, x1, x2=0, where=None, **kwargs): """ call signature:: @@ -6155,19 +6631,19 @@ self.add_collection(collection) self.autoscale_view() return collection - fill_between.__doc__ = cbook.dedent(fill_between.__doc__) % martist.kwdocd #### plotting z(x,y): imshow, pcolor and relatives, contour + @docstring.dedent_interpd def imshow(self, X, cmap=None, norm=None, aspect=None, - interpolation=None, alpha=1.0, vmin=None, vmax=None, + interpolation=None, alpha=None, vmin=None, vmax=None, origin=None, extent=None, shape=None, filternorm=1, filterrad=4.0, imlim=None, resample=None, url=None, **kwargs): """ call signature:: imshow(X, cmap=None, norm=None, aspect=None, interpolation=None, - alpha=1.0, vmin=None, vmax=None, origin=None, extent=None, + alpha=None, vmin=None, vmax=None, origin=None, extent=None, **kwargs) Display the image in *X* to current axes. *X* may be a float @@ -6204,10 +6680,9 @@ *interpolation*: Acceptable values are *None*, 'nearest', 'bilinear', - 'bicubic', 'spline16', 'spline36', 'hanning', 'hamming', - 'hermite', 'kaiser', 'quadric', 'catrom', 'gaussian', - 'bessel', 'mitchell', 'sinc', 'lanczos', - + 'bicubic', 'spline16', 'spline36', 'hanning', 'hamming', + 'hermite', 'kaiser', 'quadric', 'catrom', 'gaussian', + 'bessel', 'mitchell', 'sinc', 'lanczos' If *interpolation* is *None*, default to rc ``image.interpolation``. See also the *filternorm* and @@ -6228,6 +6703,7 @@ *alpha*: scalar The alpha blending value, between 0 (transparent) and 1 (opaque) + or *None* *origin*: [ None | 'upper' | 'lower' ] Place the [0,0] index of the array in the upper left or lower left @@ -6275,7 +6751,7 @@ im.set_data(X) im.set_alpha(alpha) self._set_artist_props(im) - if not im.get_clip_on(): + if im.get_clip_path() is None: # image does not already have clipping set, clip to axes patch im.set_clip_path(self.patch) #if norm is None and shape is None: @@ -6286,19 +6762,14 @@ im.autoscale_None() im.set_url(url) - xmin, xmax, ymin, ymax = im.get_extent() + # update ax.dataLim, and, if autoscaling, set viewLim + # to tightly fit the image, regardless of dataLim. + im.set_extent(im.get_extent()) - corners = (xmin, ymin), (xmax, ymax) - self.update_datalim(corners) - if self._autoscaleXon: - self.set_xlim((xmin, xmax)) - if self._autoscaleYon: - self.set_ylim((ymin, ymax)) self.images.append(im) im._remove_method = lambda h: self.images.remove(h) return im - imshow.__doc__ = cbook.dedent(imshow.__doc__) % martist.kwdocd def _pcolorargs(self, funcname, *args): @@ -6326,6 +6797,7 @@ funcname, funcname)) return X, Y, C + @docstring.dedent_interpd def pcolor(self, *args, **kwargs): """ call signatures:: @@ -6383,20 +6855,20 @@ *shading*: [ 'flat' | 'faceted' ] If 'faceted', a black grid is drawn around each rectangle; if 'flat', edges are not drawn. Default is 'flat', contrary to - Matlab(TM). + MATLAB. This kwarg is deprecated; please use 'edgecolors' instead: - * shading='flat' -- edgecolors='None' + * shading='flat' -- edgecolors='none' * shading='faceted -- edgecolors='k' - *edgecolors*: [ None | 'None' | color | color sequence] + *edgecolors*: [ None | 'none' | color | color sequence] If *None*, the rc setting is used by default. - If 'None', edges will not be visible. + If 'none', edges will not be visible. An mpl color or sequence of colors will set the edge color - *alpha*: 0 <= scalar <= 1 + *alpha*: 0 <= scalar <= 1 or *None* the alpha blending value Return value is a :class:`matplotlib.collection.Collection` @@ -6404,7 +6876,7 @@ .. _axes-pcolor-grid-orientation: - The grid orientation follows the Matlab(TM) convention: an + The grid orientation follows the MATLAB convention: an array *C* with shape (*nrows*, *ncolumns*) is plotted with the column number as *X* and the row number as *Y*, increasing up; hence it is plotted the way the array would be printed, @@ -6439,7 +6911,7 @@ pcolor(C.T) - Matlab :func:`pcolor` always discards the last row and column + MATLAB :func:`pcolor` always discards the last row and column of *C*, but matplotlib displays the last row and column if *X* and *Y* are not specified, or if *X* and *Y* have one more row and column than *C*. @@ -6448,11 +6920,21 @@ :class:`~matplotlib.collection.PolyCollection` properties: %(PolyCollection)s + + Note: the default *antialiaseds* is taken from + rcParams['patch.antialiased'], which defaults to *True*. + In some cases, particularly if *alpha* is 1, + you may be able to reduce rendering artifacts (light or + dark patch boundaries) by setting it to *False*. An + alternative it to set *edgecolors* to 'face'. Unfortunately, + there seems to be no single combination of parameters that + eliminates artifacts under all conditions. + """ if not self._hold: self.cla() - alpha = kwargs.pop('alpha', 1.0) + alpha = kwargs.pop('alpha', None) norm = kwargs.pop('norm', None) cmap = kwargs.pop('cmap', None) vmin = kwargs.pop('vmin', None) @@ -6493,19 +6975,22 @@ axis=1) verts = xy.reshape((npoly, 5, 2)) - #verts = zip(zip(X1,Y1),zip(X2,Y2),zip(X3,Y3),zip(X4,Y4)) - C = compress(ravelmask, ma.filled(C[0:Ny-1,0:Nx-1]).ravel()) - if shading == 'faceted': - edgecolors = (0,0,0,1), - linewidths = (0.25,) + edgecolors = 'k', else: - edgecolors = 'face' - linewidths = (1.0,) + edgecolors = 'none' + linewidths = (0.25,) + # Not sure if we want to have the following, or just trap + # invalid kwargs and raise an exception. + if 'edgecolor' in kwargs: + kwargs['edgecolors'] = kwargs.pop('edgecolor') + if 'linewidth' in kwargs: + kwargs['linewidths'] = kwargs.pop('linewidth') + if 'antialiased' in kwargs: + kwargs['antialiaseds'] = kwargs.pop('antialiased') kwargs.setdefault('edgecolors', edgecolors) - kwargs.setdefault('antialiaseds', (0,)) kwargs.setdefault('linewidths', linewidths) collection = mcoll.PolyCollection(verts, **kwargs) @@ -6533,8 +7018,8 @@ self.autoscale_view() self.add_collection(collection) return collection - pcolor.__doc__ = cbook.dedent(pcolor.__doc__) % martist.kwdocd + @docstring.dedent_interpd def pcolormesh(self, *args, **kwargs): """ call signatures:: @@ -6565,10 +7050,10 @@ and max of the color array *C* is used. If you pass a *norm* instance, *vmin* and *vmax* will be ignored. - *shading*: [ 'flat' | 'faceted' ] + *shading*: [ 'flat' | 'faceted' | 'gouraud' ] If 'faceted', a black grid is drawn around each rectangle; if 'flat', edges are not drawn. Default is 'flat', contrary to - Matlab(TM). + MATLAB. This kwarg is deprecated; please use 'edgecolors' instead: * shading='flat' -- edgecolors='None' @@ -6581,7 +7066,7 @@ An mpl color or sequence of colors will set the edge color - *alpha*: 0 <= scalar <= 1 + *alpha*: 0 <= scalar <= 1 or *None* the alpha blending value Return value is a :class:`matplotlib.collection.QuadMesh` @@ -6601,12 +7086,12 @@ """ if not self._hold: self.cla() - alpha = kwargs.pop('alpha', 1.0) + alpha = kwargs.pop('alpha', None) norm = kwargs.pop('norm', None) cmap = kwargs.pop('cmap', None) vmin = kwargs.pop('vmin', None) vmax = kwargs.pop('vmax', None) - shading = kwargs.pop('shading', 'flat') + shading = kwargs.pop('shading', 'flat').lower() edgecolors = kwargs.pop('edgecolors', 'None') antialiased = kwargs.pop('antialiased', False) @@ -6614,8 +7099,11 @@ Ny, Nx = X.shape # convert to one dimensional arrays - C = ma.ravel(C[0:Ny-1, 0:Nx-1]) # data point in each cell is value at - # lower left corner + if shading != 'gouraud': + C = ma.ravel(C[0:Ny-1, 0:Nx-1]) # data point in each cell is value at + # lower left corner + else: + C = C.ravel() X = X.ravel() Y = Y.ravel() @@ -6630,7 +7118,7 @@ collection = mcoll.QuadMesh( Nx - 1, Ny - 1, coords, showedges, - antialiased=antialiased) # kwargs are not used + antialiased=antialiased, shading=shading, **kwargs) collection.set_alpha(alpha) collection.set_array(C) if norm is not None: assert(isinstance(norm, mcolors.Normalize)) @@ -6653,8 +7141,8 @@ self.autoscale_view() self.add_collection(collection) return collection - pcolormesh.__doc__ = cbook.dedent(pcolormesh.__doc__) % martist.kwdocd + @docstring.dedent_interpd def pcolorfast(self, *args, **kwargs): """ pseudocolor plot of a 2-D array @@ -6723,7 +7211,7 @@ luminance data. If either are *None*, the min and max of the color array *C* is used. If you pass a norm instance, *vmin* and *vmax* will be *None*. - *alpha*: 0 <= scalar <= 1 + *alpha*: 0 <= scalar <= 1 or *None* the alpha blending value Return value is an image if a regular or rectangular grid @@ -6734,7 +7222,7 @@ if not self._hold: self.cla() - alpha = kwargs.pop('alpha', 1.0) + alpha = kwargs.pop('alpha', None) norm = kwargs.pop('norm', None) cmap = kwargs.pop('cmap', None) vmin = kwargs.pop('vmin', None) @@ -6835,19 +7323,20 @@ def contour(self, *args, **kwargs): if not self._hold: self.cla() kwargs['filled'] = False - return mcontour.ContourSet(self, *args, **kwargs) - contour.__doc__ = mcontour.ContourSet.contour_doc + return mcontour.QuadContourSet(self, *args, **kwargs) + contour.__doc__ = mcontour.QuadContourSet.contour_doc def contourf(self, *args, **kwargs): if not self._hold: self.cla() kwargs['filled'] = True - return mcontour.ContourSet(self, *args, **kwargs) - contourf.__doc__ = mcontour.ContourSet.contour_doc + return mcontour.QuadContourSet(self, *args, **kwargs) + contourf.__doc__ = mcontour.QuadContourSet.contour_doc def clabel(self, CS, *args, **kwargs): return CS.clabel(*args, **kwargs) clabel.__doc__ = mcontour.ContourSet.clabel.__doc__ + @docstring.dedent_interpd def table(self, **kwargs): """ call signature:: @@ -6872,7 +7361,6 @@ %(Table)s """ return mtable.table(self, **kwargs) - table.__doc__ = cbook.dedent(table.__doc__) % martist.kwdocd def twinx(self): """ @@ -6890,6 +7378,7 @@ frameon=False) ax2.yaxis.tick_right() ax2.yaxis.set_label_position('right') + ax2.yaxis.set_offset_position('right') self.yaxis.tick_left() ax2.xaxis.set_visible(False) return ax2 @@ -6924,9 +7413,11 @@ #### Data analysis + @docstring.dedent_interpd def hist(self, x, bins=10, range=None, normed=False, weights=None, cumulative=False, bottom=None, histtype='bar', align='mid', orientation='vertical', rwidth=None, log=False, + color=None, label=None, **kwargs): """ call signature:: @@ -6940,16 +7431,21 @@ [*patches0*, *patches1*,...]) if the input contains multiple data. + Multiple data can be provided via *x* as a list of datasets + of potentially different length ([*x0*, *x1*, ...]), or as + a 2-D ndarray in which each column is a dataset. Note that + the ndarray form is transposed relative to the list form. + + Masked arrays are not supported at present. + Keyword arguments: *bins*: Either an integer number of bins or a sequence giving the - bins. *x* are the data to be binned. *x* can be an array, - a 2D array with multiple data in its columns, or a list of - arrays with data of different length. Note, if *bins* - is an integer input argument=numbins, *bins* + 1 bin edges - will be returned, compatible with the semantics of - :func:`numpy.histogram` with the *new* = True argument. + bins. If *bins* is an integer, *bins* + 1 bin edges + will be returned, consistent with :func:`numpy.histogram` + for numpy version >= 1.3, and with the *new* = True argument + in earlier versions. Unequally spaced bins are supported if *bins* is a sequence. *range*: @@ -6957,9 +7453,9 @@ are ignored. If not provided, *range* is (x.min(), x.max()). Range has no effect if *bins* is a sequence. - If *bins* is a sequence or *range* is specified, autoscaling is - set off (*autoscale_on* is set to *False*) and the xaxis limits - are set to encompass the full specified bin range. + If *bins* is a sequence or *range* is specified, autoscaling + is based on the specified bin range instead of the + range of x. *normed*: If *True*, the first element of the return tuple will @@ -6971,6 +7467,12 @@ pdf, bins, patches = ax.hist(...) print np.sum(pdf * np.diff(bins)) + .. Note:: Until numpy release 1.5, the underlying numpy + histogram function was incorrect with *normed*=*True* + if bin sizes were unequal. MPL inherited that + error. It is now corrected within MPL when using + earlier numpy versions + *weights* An array of weights, of the same shape as *x*. Each value in *x* only contributes its associated weight towards the bin @@ -7028,23 +7530,25 @@ be filtered out and only the non-empty (*n*, *bins*, *patches*) will be returned. - kwargs are used to update the properties of the hist - :class:`~matplotlib.patches.Rectangle` instances: + *color*: + Color spec or sequence of color specs, one per + dataset. Default (*None*) uses the standard line + color sequence. + + *label*: + String, or sequence of strings to match multiple + datasets. Bar charts yield multiple patches per + dataset, but only the first gets the label, so + that the legend command will work as expected:: + + ax.hist(10+2*np.random.randn(1000), label='men') + ax.hist(12+3*np.random.randn(1000), label='women', alpha=0.5) + ax.legend() - %(Rectangle)s + kwargs are used to update the properties of the + :class:`~matplotlib.patches.Patch` instances returned by *hist*: - You can use labels for your histogram, and only the first - :class:`~matplotlib.patches.Rectangle` gets the label (the - others get the magic string '_nolegend_'. This will make the - histograms work in the intuitive way for bar charts:: - - ax.hist(10+2*np.random.randn(1000), label='men') - ax.hist(12+3*np.random.randn(1000), label='women', alpha=0.5) - ax.legend() - - label can also be a sequence of strings. If multiple data is - provided in *x*, the labels are asigned sequentially to the - histograms. + %(Patch)s **Example:** @@ -7055,69 +7559,127 @@ # NOTE: the range keyword overwrites the built-in func range !!! # needs to be fixed in numpy !!! + # Validate string inputs here so we don't have to clutter + # subsequent code. + if histtype not in ['bar', 'barstacked', 'step', 'stepfilled']: + raise ValueError("histtype %s is not recognized" % histtype) + + if align not in ['left', 'mid', 'right']: + raise ValueError("align kwarg %s is not recognized" % align) + + if orientation not in [ 'horizontal', 'vertical']: + raise ValueError( + "orientation kwarg %s is not recognized" % orientation) + + if kwargs.get('width') is not None: raise DeprecationWarning( 'hist now uses the rwidth to give relative width ' 'and not absolute width') - try: - # make sure a copy is created: don't use asarray - x = np.transpose(np.array(x)) - if len(x.shape)==1: - x.shape = (1,x.shape[0]) - elif len(x.shape)==2 and x.shape[1]= 1.5. + hist_kwargs = dict(range=range) if np.__version__ < "1.3": # version 1.1 and 1.2 - hist_kwargs = dict(range=range, - normed=bool(normed), new=True) - else: # version 1.3 and later, drop new=True - hist_kwargs = dict(range=range, - normed=bool(normed)) + hist_kwargs['new'] = True n = [] - for i in xrange(len(x)): + for i in xrange(nx): # this will automatically overwrite bins, # so that each histogram uses the same bins m, bins = np.histogram(x[i], bins, weights=w[i], **hist_kwargs) + if normed: + db = np.diff(bins) + m = (m.astype(float) / db) / m.sum() n.append(m) + if normed and db.std() > 0.01 * db.mean(): + warnings.warn(""" + This release fixes a normalization bug in the NumPy histogram + function prior to version 1.5, occuring with non-uniform + bin widths. The returned and plotted value is now a density: + n / (N * bin width), + where n is the bin count and N the total number of points. + """) + + if cumulative: slc = slice(None) @@ -7133,59 +7695,48 @@ if histtype.startswith('bar'): totwidth = np.diff(bins) - stacked = False - if rwidth is not None: dr = min(1., max(0., rwidth)) - elif len(n)>1: dr = 0.8 - else: dr = 1.0 + if rwidth is not None: + dr = min(1.0, max(0.0, rwidth)) + elif len(n)>1: + dr = 0.8 + else: + dr = 1.0 if histtype=='bar': - width = dr*totwidth/len(n) + width = dr*totwidth/nx dw = width - if len(n)>1: - boffset = -0.5*dr*totwidth*(1.-1./len(n)) + if nx > 1: + boffset = -0.5*dr*totwidth*(1.0-1.0/nx) else: boffset = 0.0 + stacked = False elif histtype=='barstacked': width = dr*totwidth boffset, dw = 0.0, 0.0 - stacked = True - else: - raise ValueError, 'invalid histtype: %s' % histtype if align == 'mid' or align == 'edge': boffset += 0.5*totwidth elif align == 'right': boffset += totwidth - elif align != 'left' and align != 'center': - raise ValueError, 'invalid align: %s' % align if orientation == 'horizontal': - for m in n: - color = self._get_lines._get_next_cycle_color() - patch = self.barh(bins[:-1]+boffset, m, height=width, - left=bottom, align='center', log=log, - color=color) - patches.append(patch) - if stacked: - if bottom is None: bottom = 0.0 - bottom += m - boffset += dw - elif orientation == 'vertical': - for m in n: - color = self._get_lines._get_next_cycle_color() - patch = self.bar(bins[:-1]+boffset, m, width=width, - bottom=bottom, align='center', log=log, - color=color) - patches.append(patch) - if stacked: - if bottom is None: bottom = 0.0 - bottom += m - boffset += dw - else: - raise ValueError, 'invalid orientation: %s' % orientation + _barfunc = self.barh + else: # orientation == 'vertical' + _barfunc = self.bar + + for m, c in zip(n, color): + patch = _barfunc(bins[:-1]+boffset, m, width, bottom, + align='center', log=log, + color=c) + patches.append(patch) + if stacked: + if bottom is None: + bottom = 0.0 + bottom += m + boffset += dw elif histtype.startswith('step'): x = np.zeros( 2*len(bins), np.float ) @@ -7193,67 +7744,65 @@ x[0::2], x[1::2] = bins, bins + minimum = min(bins) + if align == 'left' or align == 'center': x -= 0.5*(bins[1]-bins[0]) elif align == 'right': x += 0.5*(bins[1]-bins[0]) - elif align != 'mid' and align != 'edge': - raise ValueError, 'invalid align: %s' % align if log: - y[0],y[-1] = 1e-100, 1e-100 + y[0],y[-1] = minimum, minimum if orientation == 'horizontal': self.set_xscale('log') - elif orientation == 'vertical': + else: # orientation == 'vertical' self.set_yscale('log') - fill = False - if histtype == 'stepfilled': - fill = True - elif histtype != 'step': - raise ValueError, 'invalid histtype: %s' % histtype + fill = (histtype == 'stepfilled') - for m in n: + for m, c in zip(n, color): y[1:-1:2], y[2::2] = m, m + if log: + y[y= total: - raise ValueError( 'Subplot number exceeds total subplots') - self._rows = rows - self._cols = cols - self._num = num + raise ValueError('Illegal argument(s) to subplot: %s' % (args,)) self.update_params() # _axes_class is set in the subplot_class_factory self._axes_class.__init__(self, fig, self.figbox, **kwargs) + + def get_geometry(self): 'get the subplot geometry, eg 2,2,3' - return self._rows, self._cols, self._num+1 + rows, cols, num1, num2 = self.get_subplotspec().get_geometry() + return rows, cols, num1+1 # for compatibility # COVERAGE NOTE: Never used internally or from examples def change_geometry(self, numrows, numcols, num): 'change subplot geometry, eg. from 1,1,1 to 2,2,3' - self._rows = numrows - self._cols = numcols - self._num = num-1 + self._subplotspec = GridSpec(numrows, numcols)[num-1] self.update_params() self.set_position(self.figbox) + def get_subplotspec(self): + 'get the SubplotSpec instance associated with the subplot' + return self._subplotspec + + def set_subplotspec(self, subplotspec): + 'set the SubplotSpec instance associated with the subplot' + self._subplotspec = subplotspec + def update_params(self): 'update the subplot position from fig.subplotpars' - rows = self._rows - cols = self._cols - num = self._num - - pars = self.figure.subplotpars - left = pars.left - right = pars.right - bottom = pars.bottom - top = pars.top - wspace = pars.wspace - hspace = pars.hspace - totWidth = right-left - totHeight = top-bottom - - figH = totHeight/(rows + hspace*(rows-1)) - sepH = hspace*figH - - figW = totWidth/(cols + wspace*(cols-1)) - sepW = wspace*figW - - rowNum, colNum = divmod(num, cols) - - figBottom = top - (rowNum+1)*figH - rowNum*sepH - figLeft = left + colNum*(figW + sepW) - - self.figbox = mtransforms.Bbox.from_bounds(figLeft, figBottom, - figW, figH) - self.rowNum = rowNum - self.colNum = colNum - self.numRows = rows - self.numCols = cols - - if 0: - print 'rcn', rows, cols, num - print 'lbrt', left, bottom, right, top - print 'self.figBottom', self.figBottom - print 'self.figLeft', self.figLeft - print 'self.figW', self.figW - print 'self.figH', self.figH - print 'self.rowNum', self.rowNum - print 'self.colNum', self.colNum - print 'self.numRows', self.numRows - print 'self.numCols', self.numCols + self.figbox, self.rowNum, self.colNum, self.numRows, self.numCols = \ + self.get_subplotspec().get_position(self.figure, + return_all=True) def is_first_col(self): @@ -7927,7 +8461,8 @@ # This is provided for backward compatibility Subplot = subplot_class_factory() -martist.kwdocd['Axes'] = martist.kwdocd['Subplot'] = martist.kwdoc(Axes) +docstring.interpd.update(Axes=martist.kwdoc(Axes)) +docstring.interpd.update(Subplot=martist.kwdoc(Axes)) """ # this is some discarded code I was using to find the minimum positive diff -Nru matplotlib-0.99.3/lib/matplotlib/axis.py matplotlib-1.0.1/lib/matplotlib/axis.py --- matplotlib-0.99.3/lib/matplotlib/axis.py 2010-05-30 20:31:09.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/axis.py 2010-08-25 16:53:11.000000000 +0000 @@ -15,6 +15,7 @@ import matplotlib.ticker as mticker import matplotlib.transforms as mtransforms import matplotlib.units as munits +import numpy as np GRIDLINE_INTERPOLATION_STEPS = 180 @@ -59,7 +60,16 @@ """ def __init__(self, axes, loc, label, - size = None, # points + + size = None, # points + width = None, + color = None, + tickdir = None, + pad = None, + labelsize = None, + labelcolor = None, + zorder = None, + gridOn = None, # defaults to axes.grid tick1On = True, tick2On = True, @@ -70,36 +80,57 @@ """ bbox is the Bound2D bounding box in display coords of the Axes loc is the tick location in data coords - size is the tick size in relative, axes coords + size is the tick size in points """ artist.Artist.__init__(self) - if gridOn is None: gridOn = rcParams['axes.grid'] + if gridOn is None: + gridOn = rcParams['axes.grid'] self.set_figure(axes.figure) self.axes = axes name = self.__name__.lower() + self._name = name + + self._loc = loc + if size is None: if major: size = rcParams['%s.major.size'%name] - pad = rcParams['%s.major.pad'%name] else: size = rcParams['%s.minor.size'%name] + self._size = size + + self._width = width # can be None for marker default + + if color is None: + color = rcParams['%s.color' % name] + self._color = color + + if pad is None: + if major: + pad = rcParams['%s.major.pad'%name] + else: pad = rcParams['%s.minor.pad'%name] + self._base_pad = pad - self._tickdir = rcParams['%s.direction'%name] - if self._tickdir == 'in': - self._xtickmarkers = (mlines.TICKUP, mlines.TICKDOWN) - self._ytickmarkers = (mlines.TICKRIGHT, mlines.TICKLEFT) - self._pad = pad - else: - self._xtickmarkers = (mlines.TICKDOWN, mlines.TICKUP) - self._ytickmarkers = (mlines.TICKLEFT, mlines.TICKRIGHT) - self._pad = pad + size + if labelcolor is None: + labelcolor = rcParams['%s.color' % name] + self._labelcolor = labelcolor - self._loc = loc - self._size = size + if labelsize is None: + labelsize = rcParams['%s.labelsize' % name] + self._labelsize = labelsize + + if zorder is None: + if major: + zorder = mlines.Line2D.zorder + 0.01 + else: + zorder = mlines.Line2D.zorder + self._zorder = zorder + + self.apply_tickdir(tickdir) self.tick1line = self._get_tick1line() self.tick2line = self._get_tick2line() @@ -117,6 +148,13 @@ self.update_position(loc) + def apply_tickdir(self, tickdir): + """ + Calculate self._pad and self._tickmarkers + """ + pass + + def get_children(self): children = [self.tick1line, self.tick2line, self.gridline, self.label1, self.label2] return children @@ -227,6 +265,47 @@ def set_view_interval(self, vmin, vmax, ignore=False): raise NotImplementedError('Derived must override') + def _apply_params(self, **kw): + switchkw = ['gridOn', 'tick1On', 'tick2On', 'label1On', 'label2On'] + switches = [k for k in kw if k in switchkw] + for k in switches: + setattr(self, k, kw.pop(k)) + dirpad = [k for k in kw if k in ['pad', 'tickdir']] + if dirpad: + self._base_pad = kw.pop('pad', self._base_pad) + self.apply_tickdir(kw.pop('tickdir', self._tickdir)) + trans = self._get_text1_transform()[0] + self.label1.set_transform(trans) + trans = self._get_text2_transform()[0] + self.label2.set_transform(trans) + self.tick1line.set_marker(self._tickmarkers[0]) + self.tick2line.set_marker(self._tickmarkers[1]) + tick_kw = dict([kv for kv in kw.items() + if kv[0] in ['color', 'zorder']]) + if tick_kw: + self.tick1line.set(**tick_kw) + self.tick2line.set(**tick_kw) + for k, v in tick_kw.items(): + setattr(self, '_'+k, v) + tick_list = [kv for kv in kw.items() if kv[0] in ['size', 'width']] + for k, v in tick_list: + setattr(self, '_'+k, v) + if k == 'size': + self.tick1line.set_markersize(v) + self.tick2line.set_markersize(v) + else: + self.tick1line.set_markeredgewidth(v) + self.tick2line.set_markeredgewidth(v) + label_list = [k for k in kw.items() + if k[0] in ['labelsize', 'labelcolor']] + if label_list: + label_kw = dict([(k[5:], v) for (k, v) in label_list]) + self.label1.set(**label_kw) + self.label2.set(**label_kw) + for k, v in label_kw.items(): + setattr(self, '_'+k, v) + + class XTick(Tick): """ @@ -234,22 +313,40 @@ the label text and the grid line """ __name__ = 'xtick' + + def _get_text1_transform(self): + return self.axes.get_xaxis_text1_transform(self._pad) + + def _get_text2_transform(self): + return self.axes.get_xaxis_text2_transform(self._pad) + + def apply_tickdir(self, tickdir): + if tickdir is None: + tickdir = rcParams['%s.direction' % self._name] + self._tickdir = tickdir + + if self._tickdir == 'in': + self._tickmarkers = (mlines.TICKUP, mlines.TICKDOWN) + self._pad = self._base_pad + else: + self._tickmarkers = (mlines.TICKDOWN, mlines.TICKUP) + self._pad = self._base_pad + self._size + + def _get_text1(self): 'Get the default Text instance' # the y loc is 3 points below the min of y axis # get the affine as an a,b,c,d,tx,ty list # x in data coords, y in axes coords #t = mtext.Text( - trans, vert, horiz = self.axes.get_xaxis_text1_transform(self._pad) - size = rcParams['xtick.labelsize'] + trans, vert, horiz = self._get_text1_transform() t = mtext.Text( x=0, y=0, - fontproperties=font_manager.FontProperties(size=size), - color=rcParams['xtick.color'], + fontproperties=font_manager.FontProperties(size=self._labelsize), + color=self._labelcolor, verticalalignment=vert, horizontalalignment=horiz, ) - t.set_transform(trans) self._set_artist_props(t) return t @@ -260,12 +357,11 @@ 'Get the default Text 2 instance' # x in data coords, y in axes coords #t = mtext.Text( - trans, vert, horiz = self.axes.get_xaxis_text2_transform(self._pad) - + trans, vert, horiz = self._get_text2_transform() t = mtext.Text( x=0, y=1, - fontproperties=font_manager.FontProperties(size=rcParams['xtick.labelsize']), - color=rcParams['xtick.color'], + fontproperties=font_manager.FontProperties(size=self._labelsize), + color=self._labelcolor, verticalalignment=vert, horizontalalignment=horiz, ) @@ -277,10 +373,12 @@ 'Get the default line2D instance' # x in data coords, y in axes coords l = mlines.Line2D(xdata=(0,), ydata=(0,), - color='k', + color=self._color, linestyle = 'None', - marker = self._xtickmarkers[0], + marker = self._tickmarkers[0], markersize=self._size, + markeredgewidth=self._width, + zorder=self._zorder, ) l.set_transform(self.axes.get_xaxis_transform(which='tick1')) self._set_artist_props(l) @@ -290,10 +388,12 @@ 'Get the default line2D instance' # x in data coords, y in axes coords l = mlines.Line2D( xdata=(0,), ydata=(1,), - color='k', + color=self._color, linestyle = 'None', - marker = self._xtickmarkers[1], + marker = self._tickmarkers[1], markersize=self._size, + markeredgewidth=self._width, + zorder=self._zorder, ) l.set_transform(self.axes.get_xaxis_transform(which='tick2')) @@ -367,17 +467,34 @@ """ __name__ = 'ytick' + def _get_text1_transform(self): + return self.axes.get_yaxis_text1_transform(self._pad) + + def _get_text2_transform(self): + return self.axes.get_yaxis_text2_transform(self._pad) + + def apply_tickdir(self, tickdir): + if tickdir is None: + tickdir = rcParams['%s.direction' % self._name] + self._tickdir = tickdir + + if self._tickdir == 'in': + self._tickmarkers = (mlines.TICKRIGHT, mlines.TICKLEFT) + self._pad = self._base_pad + else: + self._tickmarkers = (mlines.TICKLEFT, mlines.TICKRIGHT) + self._pad = self._base_pad + self._size + + # how far from the y axis line the right of the ticklabel are def _get_text1(self): 'Get the default Text instance' # x in axes coords, y in data coords - #t = mtext.Text( - trans, vert, horiz = self.axes.get_yaxis_text1_transform(self._pad) - + trans, vert, horiz = self._get_text1_transform() t = mtext.Text( x=0, y=0, - fontproperties=font_manager.FontProperties(size=rcParams['ytick.labelsize']), - color=rcParams['ytick.color'], + fontproperties=font_manager.FontProperties(size=self._labelsize), + color=self._labelcolor, verticalalignment=vert, horizontalalignment=horiz, ) @@ -389,13 +506,11 @@ def _get_text2(self): 'Get the default Text instance' # x in axes coords, y in data coords - #t = mtext.Text( - trans, vert, horiz = self.axes.get_yaxis_text2_transform(self._pad) - + trans, vert, horiz = self._get_text2_transform() t = mtext.Text( x=1, y=0, - fontproperties=font_manager.FontProperties(size=rcParams['ytick.labelsize']), - color=rcParams['ytick.color'], + fontproperties=font_manager.FontProperties(size=self._labelsize), + color=self._labelcolor, verticalalignment=vert, horizontalalignment=horiz, ) @@ -407,11 +522,14 @@ 'Get the default line2D instance' # x in axes coords, y in data coords - l = mlines.Line2D( (0,), (0,), color='k', - marker = self._ytickmarkers[0], + l = mlines.Line2D( (0,), (0,), + color=self._color, + marker = self._tickmarkers[0], linestyle = 'None', markersize=self._size, - ) + markeredgewidth=self._width, + zorder=self._zorder, + ) l.set_transform(self.axes.get_yaxis_transform(which='tick1')) self._set_artist_props(l) return l @@ -419,12 +537,14 @@ def _get_tick2line(self): 'Get the default line2D instance' # x in axes coords, y in data coords - l = mlines.Line2D( (1,), (0,), color='k', - marker = self._ytickmarkers[1], + l = mlines.Line2D( (1,), (0,), + color=self._color, + marker = self._tickmarkers[1], linestyle = 'None', markersize=self._size, + markeredgewidth=self._width, + zorder=self._zorder, ) - l.set_transform(self.axes.get_yaxis_transform(which='tick2')) self._set_artist_props(l) return l @@ -539,6 +659,8 @@ #self.minor = dummy() self._autolabelpos = True + self._smart_bounds = False + self.label = self._get_label() self.labelpad = 5 self.offsetText = self._get_offset_text() @@ -546,6 +668,10 @@ self.minorTicks = [] self.pickradius = pickradius + # Initialize here for testing; later add API + self._major_tick_kw = dict() + self._minor_tick_kw = dict() + self.cla() self.set_scale('linear') @@ -628,10 +754,16 @@ self.label.set_text('') self._set_artist_props(self.label) + self.reset_ticks() + + self.converter = None + self.units = None + self.set_units(None) + + def reset_ticks(self): # build a few default ticks; grow as necessary later; only # define 1 so properties set on ticks will be copied as they # grow - cbook.popall(self.majorTicks) cbook.popall(self.minorTicks) @@ -640,9 +772,91 @@ self._lastNumMajorTicks = 1 self._lastNumMinorTicks = 1 - self.converter = None - self.units = None - self.set_units(None) + def set_tick_params(self, which='major', reset=False, **kw): + """ + Set appearance parameters for ticks and ticklabels. + + For documentation of keyword arguments, see + :meth:`matplotlib.axes.Axes.tick_params`. + """ + dicts = [] + if which == 'major' or which == 'both': + dicts.append(self._major_tick_kw) + if which == 'minor' or which == 'both': + dicts.append(self._minor_tick_kw) + kwtrans = self._translate_tick_kw(kw, to_init_kw=True) + for d in dicts: + if reset: + d.clear() + d.update(kwtrans) + if reset: + self.reset_ticks() + else: + if which == 'major' or which == 'both': + for tick in self.majorTicks: + tick._apply_params(**self._major_tick_kw) + if which == 'minor' or which == 'both': + for tick in self.minorTicks: + tick._apply_params(**self._minor_tick_kw) + + @staticmethod + def _translate_tick_kw(kw, to_init_kw=True): + # We may want to move the following function to + # a more visible location; or maybe there already + # is something like this. + def _bool(arg): + if cbook.is_string_like(arg): + if arg.lower() == 'on': + return True + if arg.lower() == 'off': + return False + raise ValueError('String "%s" should be "on" or "off"' % arg) + return bool(arg) + # The following lists may be moved to a more + # accessible location. + kwkeys0 = ['size', 'width', 'color', 'tickdir', 'pad', + 'labelsize', 'labelcolor', 'zorder', 'gridOn', + 'tick1On', 'tick2On', 'label1On', 'label2On'] + kwkeys1 = ['length', 'direction', 'left', 'bottom', 'right', 'top', + 'labelleft', 'labelbottom', 'labelright', 'labeltop'] + kwkeys = kwkeys0 + kwkeys1 + kwtrans = dict() + if to_init_kw: + if 'length' in kw: + kwtrans['size'] = kw.pop('length') + if 'direction' in kw: + kwtrans['tickdir'] = kw.pop('direction') + if 'left' in kw: + kwtrans['tick1On'] = _bool(kw.pop('left')) + if 'bottom' in kw: + kwtrans['tick1On'] = _bool(kw.pop('bottom')) + if 'right' in kw: + kwtrans['tick2On'] = _bool(kw.pop('right')) + if 'top' in kw: + kwtrans['tick2On'] = _bool(kw.pop('top')) + + if 'labelleft' in kw: + kwtrans['label1On'] = _bool(kw.pop('labelleft')) + if 'labelbottom' in kw: + kwtrans['label1On'] = _bool(kw.pop('labelbottom')) + if 'labelright' in kw: + kwtrans['label2On'] = _bool(kw.pop('labelright')) + if 'labeltop' in kw: + kwtrans['label2On'] = _bool(kw.pop('labeltop')) + if 'colors' in kw: + c = kw.pop('colors') + kwtrans['color'] = c + kwtrans['labelcolor'] = c + # Maybe move the checking up to the caller of this method. + for key in kw: + if key not in kwkeys: + raise ValueError( + "keyword %s is not recognized; valid keywords are %s" + % (key, kwkeys)) + kwtrans.update(kw) + else: + raise NotImplementedError("Inverse translation is deferred") + return kwtrans def set_clip_path(self, clippath, transform=None): artist.Artist.set_clip_path(self, clippath, transform) @@ -663,9 +877,22 @@ raise NotImplementedError('Derived must override') def set_data_interval(self): - 'Set the axis data limits' + 'set the axis data limits' raise NotImplementedError('Derived must override') + def set_default_intervals(self): + 'set the default limits for the axis data and view interval if they are not mutated' + + # this is mainly in support of custom object plotting. For + # example, if someone passes in a datetime object, we do not + # know automagically how to set the default min/max of the + # data and view limits. The unit conversion AxisInfo + # interface provides a hook for custom types to register + # default limits through the AxisInfo.default_limits + # attribute, and the derived code below will check for that + # and use it if is available (else just use 0..1) + pass + def _set_artist_props(self, a): if a is None: return a.set_figure(self.figure) @@ -724,6 +951,14 @@ bbox2 = mtransforms.Bbox.from_extents(0, 0, 0, 0) return bbox, bbox2 + def set_smart_bounds(self,value): + """set the axis to have smart bounds""" + self._smart_bounds = value + + def get_smart_bounds(self): + """get whether the axis has smart bounds""" + return self._smart_bounds + @allow_rasterization def draw(self, renderer, *args, **kwargs): 'Draw the axis lines, grid lines, tick lines and labels' @@ -733,7 +968,47 @@ if not self.get_visible(): return renderer.open_group(__name__) interval = self.get_view_interval() - for tick, loc, label in self.iter_ticks(): + tick_tups = [ t for t in self.iter_ticks()] + if self._smart_bounds: + # handle inverted limits + view_low, view_high = min(*interval), max(*interval) + data_low, data_high = self.get_data_interval() + if data_low > data_high: + data_low, data_high = data_high, data_low + locs = [ti[1] for ti in tick_tups] + locs.sort() + locs = np.array(locs) + if len(locs): + if data_low <= view_low: + # data extends beyond view, take view as limit + ilow = view_low + else: + # data stops within view, take best tick + cond = locs <= data_low + good_locs = locs[cond] + if len(good_locs) > 0: + # last tick prior or equal to first data point + ilow = good_locs[-1] + else: + # No ticks (why not?), take first tick + ilow = locs[0] + if data_high >= view_high: + # data extends beyond view, take view as limit + ihigh = view_high + else: + # data stops within view, take best tick + cond = locs >= data_high + good_locs = locs[cond] + if len(good_locs) > 0: + # first tick after or equal to last data point + ihigh = good_locs[0] + else: + # No ticks (why not?), take last tick + ihigh = locs[-1] + tick_tups = [ ti for ti in tick_tups + if (ti[1] >= ilow) and (ti[1] <= ihigh)] + + for tick, loc, label in tick_tups: if tick is None: continue if not mtransforms.interval_contains(interval, loc): continue tick.update_position(loc) @@ -938,7 +1213,7 @@ def grid(self, b=None, which='major', **kwargs): """ Set the axis grid on or off; b is a boolean. Use *which* = - 'major' | 'minor' to set the grid for major or minor ticks. + 'major' | 'minor' | 'both' to set the grid for major or minor ticks. If *b* is *None* and len(kwargs)==0, toggle the grid state. If *kwargs* are supplied, it is assumed you want the grid on and *b* @@ -949,21 +1224,27 @@ xax.grid(color='r', linestyle='-', linewidth=2) """ if len(kwargs): b = True - if which.lower().find('minor')>=0: - if b is None: self._gridOnMinor = not self._gridOnMinor - else: self._gridOnMinor = b + which = which.lower() + if which in ['minor', 'both']: + if b is None: + self._gridOnMinor = not self._gridOnMinor + else: + self._gridOnMinor = b for tick in self.minorTicks: # don't use get_ticks here! if tick is None: continue tick.gridOn = self._gridOnMinor if len(kwargs): artist.setp(tick.gridline,**kwargs) - if which.lower().find('major')>=0: - if b is None: self._gridOnMajor = not self._gridOnMajor - else: self._gridOnMajor = b + self._minor_tick_kw['gridOn'] = self._gridOnMinor + if which in ['major', 'both']: + if b is None: + self._gridOnMajor = not self._gridOnMajor + else: + self._gridOnMajor = b for tick in self.majorTicks: # don't use get_ticks here! if tick is None: continue tick.gridOn = self._gridOnMajor if len(kwargs): artist.setp(tick.gridline,**kwargs) - + self._major_tick_kw['gridOn'] = self._gridOnMajor def update_units(self, data): """ @@ -974,12 +1255,17 @@ converter = munits.registry.get_converter(data) if converter is None: return False + + neednew = self.converter!=converter self.converter = converter default = self.converter.default_units(data, self) #print 'update units: default="%s", units=%s"'%(default, self.units) if default is not None and self.units is None: self.set_units(default) - self._update_axisinfo() + + + if neednew: + self._update_axisinfo() return True def _update_axisinfo(self): @@ -1010,6 +1296,7 @@ self.set_label_text(info.label) self.isDefault_label = True + self.set_default_intervals() def have_units(self): return self.converter is not None or self.units is not None @@ -1117,6 +1404,16 @@ """ Set the text values of the tick labels. Return a list of Text instances. Use *kwarg* *minor=True* to select minor ticks. + All other kwargs are used to update the text object properties. + As for get_ticklabels, label1 (left or bottom) is + affected for a given tick only if its label1On attribute + is True, and similarly for label2. The list of returned + label text objects consists of all such label1 objects followed + by all such label2 objects. + + The input *ticklabels* is assumed to match the set of + tick locations, regardless of the state of label1On and + label2On. ACCEPTS: sequence of strings """ @@ -1126,18 +1423,22 @@ self.set_minor_formatter(mticker.FixedFormatter(ticklabels)) ticks = self.get_minor_ticks() else: - self.set_major_formatter( mticker.FixedFormatter(ticklabels) ) + self.set_major_formatter(mticker.FixedFormatter(ticklabels)) ticks = self.get_major_ticks() - self.set_major_formatter( mticker.FixedFormatter(ticklabels) ) - - ret = [] + ret1 = [] + ret2 = [] for i, tick in enumerate(ticks): if i0 zoom in, else zoom out" self.major.locator.zoom(direction) + + def axis_date(self): + """ + Sets up x-axis ticks and labels that treat the x data as dates. + """ + import datetime + # should be enough to inform the unit conversion interface + # dates are comng in + self.update_units(datetime.date(2009,1,1)) + + class XAxis(Axis): __name__ = 'xaxis' axis_name = 'x' @@ -1205,13 +1517,18 @@ return inaxis, {} def _get_tick(self, major): - return XTick(self.axes, 0, '', major=major) + if major: + tick_kw = self._major_tick_kw + else: + tick_kw = self._minor_tick_kw + return XTick(self.axes, 0, '', major=major, **tick_kw) def _get_label(self): # x in axes coords, y in display coords (to be updated at draw # time by _update_label_positions) label = mtext.Text(x=0.5, y=0, - fontproperties = font_manager.FontProperties(size=rcParams['axes.labelsize']), + fontproperties = font_manager.FontProperties( + size=rcParams['axes.labelsize']), color = rcParams['axes.labelcolor'], verticalalignment='top', horizontalalignment='center', @@ -1227,7 +1544,8 @@ def _get_offset_text(self): # x in axes coords, y in display coords (to be updated at draw time) offsetText = mtext.Text(x=1, y=0, - fontproperties = font_manager.FontProperties(size=rcParams['xtick.labelsize']), + fontproperties = font_manager.FontProperties( + size=rcParams['xtick.labelsize']), color = rcParams['xtick.color'], verticalalignment='top', horizontalalignment='right', @@ -1252,7 +1570,7 @@ """ assert position == 'top' or position == 'bottom' if position == 'top': - self.label.set_verticalalignment('bottom') + self.label.set_verticalalignment('baseline') else: self.label.set_verticalalignment('top') self.label_position=position @@ -1319,50 +1637,30 @@ """ Set the ticks position (top, bottom, both, default or none) both sets the ticks to appear on both positions, but does not - change the tick labels. default resets the tick positions to - the default: ticks on both positions, labels at bottom. none - can be used if you don't want any ticks. + change the tick labels. 'default' resets the tick positions to + the default: ticks on both positions, labels at bottom. 'none' + can be used if you don't want any ticks. 'none' and 'both' + affect only the ticks, not the labels. ACCEPTS: [ 'top' | 'bottom' | 'both' | 'default' | 'none' ] """ - assert position in ('top', 'bottom', 'both', 'default', 'none') - - - # The first ticks of major & minor ticks should always be - # included, otherwise, the information can be lost. Thus, use - # majorTicks instead of get_major_ticks() which may return - # empty list. - ticks = list( self.majorTicks ) # a copy - ticks.extend( self.minorTicks ) - if position == 'top': - for t in ticks: - t.tick1On = False - t.tick2On = True - t.label1On = False - t.label2On = True + self.set_tick_params(which='both', top=True, labeltop=True, + bottom=False, labelbottom=False) elif position == 'bottom': - for t in ticks: - t.tick1On = True - t.tick2On = False - t.label1On = True - t.label2On = False - elif position == 'default': - for t in ticks: - t.tick1On = True - t.tick2On = True - t.label1On = True - t.label2On = False + self.set_tick_params(which='both', top=False, labeltop=False, + bottom=True, labelbottom=True) + elif position == 'both': + self.set_tick_params(which='both', top=True, + bottom=True) elif position == 'none': - for t in ticks: - t.tick1On = False - t.tick2On = False - else: - for t in ticks: - t.tick1On = True - t.tick2On = True - for t in ticks: - t.update_position(t._loc) + self.set_tick_params(which='both', top=False, + bottom=False) + elif position == 'default': + self.set_tick_params(which='both', top=True, labeltop=False, + bottom=True, labelbottom=True) + else: + raise ValueError("invalid position: %s" % position) def tick_top(self): 'use ticks only on top' @@ -1398,11 +1696,21 @@ return self.axes.viewLim.intervalx def set_view_interval(self, vmin, vmax, ignore=False): + """ + If *ignore* is *False*, the order of vmin, vmax + does not matter; the original axis orientation will + be preserved. + """ if ignore: self.axes.viewLim.intervalx = vmin, vmax else: Vmin, Vmax = self.get_view_interval() - self.axes.viewLim.intervalx = min(vmin, Vmin), max(vmax, Vmax) + if Vmin < Vmax: + self.axes.viewLim.intervalx = (min(vmin, vmax, Vmin), + max(vmin, vmax, Vmax)) + else: + self.axes.viewLim.intervalx = (max(vmin, vmax, Vmin), + min(vmin, vmax, Vmax)) def get_minpos(self): return self.axes.dataLim.minposx @@ -1412,7 +1720,7 @@ return self.axes.dataLim.intervalx def set_data_interval(self, vmin, vmax, ignore=False): - 'return the Interval instance for this axis data limits' + 'set the axis data limits' if ignore: self.axes.dataLim.intervalx = vmin, vmax else: @@ -1420,6 +1728,25 @@ self.axes.dataLim.intervalx = min(vmin, Vmin), max(vmax, Vmax) + def set_default_intervals(self): + 'set the default limits for the axis interval if they are not mutated' + xmin, xmax = 0., 1. + dataMutated = self.axes.dataLim.mutatedx() + viewMutated = self.axes.viewLim.mutatedx() + if not dataMutated or not viewMutated: + if self.converter is not None: + info = self.converter.axisinfo(self.units, self) + if info.default_limits is not None: + valmin, valmax = info.default_limits + xmin = self.converter.convert(valmin, self.units, self) + xmax = self.converter.convert(valmax, self.units, self) + if not dataMutated: + self.axes.dataLim.intervalx = xmin, xmax + if not viewMutated: + self.axes.viewLim.intervalx = xmin, xmax + + + class YAxis(Axis): __name__ = 'yaxis' axis_name = 'y' @@ -1445,7 +1772,11 @@ return inaxis, {} def _get_tick(self, major): - return YTick(self.axes, 0, '', major=major) + if major: + tick_kw = self._major_tick_kw + else: + tick_kw = self._minor_tick_kw + return YTick(self.axes, 0, '', major=major, **tick_kw) def _get_label(self): @@ -1453,7 +1784,8 @@ # y in axes coords label = mtext.Text(x=0, y=0.5, # todo: get the label position - fontproperties=font_manager.FontProperties(size=rcParams['axes.labelsize']), + fontproperties=font_manager.FontProperties( + size=rcParams['axes.labelsize']), color = rcParams['axes.labelcolor'], verticalalignment='center', horizontalalignment='right', @@ -1469,9 +1801,10 @@ def _get_offset_text(self): # x in display coords, y in axes coords (to be updated at draw time) offsetText = mtext.Text(x=0, y=0.5, - fontproperties = font_manager.FontProperties(size=rcParams['ytick.labelsize']), + fontproperties = font_manager.FontProperties( + size=rcParams['ytick.labelsize']), color = rcParams['ytick.color'], - verticalalignment = 'bottom', + verticalalignment = 'baseline', horizontalalignment = 'left', ) offsetText.set_transform(mtransforms.blended_transform_factory( @@ -1563,53 +1896,32 @@ def set_ticks_position(self, position): """ - Set the ticks position (left, right, both or default) - both sets the ticks to appear on both positions, but - does not change the tick labels. - default resets the tick positions to the default: - ticks on both positions, labels on the left. + Set the ticks position (left, right, both, default or none) + 'both' sets the ticks to appear on both positions, but does not + change the tick labels. 'default' resets the tick positions to + the default: ticks on both positions, labels at left. 'none' + can be used if you don't want any ticks. 'none' and 'both' + affect only the ticks, not the labels. ACCEPTS: [ 'left' | 'right' | 'both' | 'default' | 'none' ] """ - assert position in ('left', 'right', 'both', 'default', 'none') - - # The first ticks of major & minor ticks should always be - # included, otherwise, the information can be lost. Thus, use - # majorTicks instead of get_major_ticks() which may return - # empty list. - ticks = list( self.majorTicks ) # a copy - ticks.extend( self.minorTicks ) - if position == 'right': - self.set_offset_position('right') - for t in ticks: - t.tick1On = False - t.tick2On = True - t.label1On = False - t.label2On = True + self.set_tick_params(which='both', right=True, labelright=True, + left=False, labelleft=False) elif position == 'left': - self.set_offset_position('left') - for t in ticks: - t.tick1On = True - t.tick2On = False - t.label1On = True - t.label2On = False - elif position == 'default': - self.set_offset_position('left') - for t in ticks: - t.tick1On = True - t.tick2On = True - t.label1On = True - t.label2On = False + self.set_tick_params(which='both', right=False, labelright=False, + left=True, labelleft=True) + elif position == 'both': + self.set_tick_params(which='both', right=True, + left=True) elif position == 'none': - for t in ticks: - t.tick1On = False - t.tick2On = False - else: - self.set_offset_position('left') - for t in ticks: - t.tick1On = True - t.tick2On = True + self.set_tick_params(which='both', right=False, + left=False) + elif position == 'default': + self.set_tick_params(which='both', right=True, labelright=False, + left=True, labelleft=True) + else: + raise ValueError("invalid position: %s" % position) def tick_right(self): 'use ticks only on right' @@ -1645,11 +1957,21 @@ return self.axes.viewLim.intervaly def set_view_interval(self, vmin, vmax, ignore=False): + """ + If *ignore* is *False*, the order of vmin, vmax + does not matter; the original axis orientation will + be preserved. + """ if ignore: self.axes.viewLim.intervaly = vmin, vmax else: Vmin, Vmax = self.get_view_interval() - self.axes.viewLim.intervaly = min(vmin, Vmin), max(vmax, Vmax) + if Vmin < Vmax: + self.axes.viewLim.intervaly = (min(vmin, vmax, Vmin), + max(vmin, vmax, Vmax)) + else: + self.axes.viewLim.intervaly = (max(vmin, vmax, Vmin), + min(vmin, vmax, Vmax)) def get_minpos(self): return self.axes.dataLim.minposy @@ -1659,9 +1981,26 @@ return self.axes.dataLim.intervaly def set_data_interval(self, vmin, vmax, ignore=False): - 'return the Interval instance for this axis data limits' + 'set the axis data limits' if ignore: self.axes.dataLim.intervaly = vmin, vmax else: Vmin, Vmax = self.get_data_interval() self.axes.dataLim.intervaly = min(vmin, Vmin), max(vmax, Vmax) + + def set_default_intervals(self): + 'set the default limits for the axis interval if they are not mutated' + ymin, ymax = 0., 1. + dataMutated = self.axes.dataLim.mutatedy() + viewMutated = self.axes.viewLim.mutatedy() + if not dataMutated or not viewMutated: + if self.converter is not None: + info = self.converter.axisinfo(self.units, self) + if info.default_limits is not None: + valmin, valmax = info.default_limits + ymin = self.converter.convert(valmin, self.units, self) + ymax = self.converter.convert(valmax, self.units, self) + if not dataMutated: + self.axes.dataLim.intervaly = ymin, ymax + if not viewMutated: + self.axes.viewLim.intervaly = ymin, ymax diff -Nru matplotlib-0.99.3/lib/matplotlib/backend_bases.py matplotlib-1.0.1/lib/matplotlib/backend_bases.py --- matplotlib-0.99.3/lib/matplotlib/backend_bases.py 2009-07-31 15:14:40.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/backend_bases.py 2010-11-09 13:28:22.000000000 +0000 @@ -1,3 +1,4 @@ + """ Abstract base classes define the primitives that renderers and graphics contexts must implement to serve as a matplotlib backend @@ -20,6 +21,11 @@ pressed, x and y locations in pixel and :class:`~matplotlib.axes.Axes` coordinates. +:class:`ShowBase` + The base class for the Show class of each interactive backend; + the 'show' callable is then set to Show.__call__, inherited from + ShowBase. + """ from __future__ import division @@ -30,13 +36,56 @@ import matplotlib.colors as colors import matplotlib.transforms as transforms import matplotlib.widgets as widgets -import matplotlib.path as path +#import matplotlib.path as path from matplotlib import rcParams +from matplotlib import is_interactive +from matplotlib._pylab_helpers import Gcf from matplotlib.transforms import Bbox, TransformedBbox, Affine2D import cStringIO import matplotlib.tight_bbox as tight_bbox +import matplotlib.textpath as textpath +from matplotlib.path import Path + + + +_backend_d = {} + +def register_backend(format, backend_class): + _backend_d[format] = backend_class + + +class ShowBase(object): + """ + Simple base class to generate a show() callable in backends. + + Subclass must override mainloop() method. + """ + def __call__(self): + """ + Show all figures. + """ + managers = Gcf.get_all_fig_managers() + if not managers: + return + + for manager in managers: + manager.show() + + try: + if not self._needmain: # ipython flag + return + except AttributeError: + pass + + if not is_interactive(): + self.mainloop() + + def mainloop(self): + pass + + class RendererBase: """An abstract base class to handle drawing/rendering operations. @@ -58,6 +107,8 @@ def __init__(self): self._texmanager = None + self._text2path = textpath.TextToPath() + def open_group(self, s, gid=None): """ Open a grouping element with label *s*. If *gid* is given, use @@ -108,24 +159,23 @@ marker_trans + transforms.Affine2D().translate(x, y), rgbFace) - def draw_path_collection(self, master_transform, cliprect, clippath, - clippath_trans, paths, all_transforms, offsets, - offsetTrans, facecolors, edgecolors, linewidths, - linestyles, antialiaseds, urls): + def draw_path_collection(self, gc, master_transform, paths, all_transforms, + offsets, offsetTrans, facecolors, edgecolors, + linewidths, linestyles, antialiaseds, urls): """ - Draws a collection of paths, selecting drawing properties from + Draws a collection of paths selecting drawing properties from the lists *facecolors*, *edgecolors*, *linewidths*, *linestyles* and *antialiaseds*. *offsets* is a list of offsets to apply to each of the paths. The offsets in - *offsets* are first transformed by *offsetTrans* before - being applied. + *offsets* are first transformed by *offsetTrans* before being + applied. This provides a fallback implementation of :meth:`draw_path_collection` that makes multiple calls to - draw_path. Some backends may want to override this in order - to render each set of path data only once, and then reference - that path multiple times with the different offsets, colors, - styles etc. The generator methods + :meth:`draw_path`. Some backends may want to override this in + order to render each set of path data only once, and then + reference that path multiple times with the different offsets, + colors, styles etc. The generator methods :meth:`_iter_collection_raw_paths` and :meth:`_iter_collection` are provided to help with (and standardize) the implementation across backends. It is highly @@ -137,18 +187,16 @@ master_transform, paths, all_transforms): path_ids.append((path, transform)) - for xo, yo, path_id, gc, rgbFace in self._iter_collection( - path_ids, cliprect, clippath, clippath_trans, - offsets, offsetTrans, facecolors, edgecolors, + for xo, yo, path_id, gc0, rgbFace in self._iter_collection( + gc, path_ids, offsets, offsetTrans, facecolors, edgecolors, linewidths, linestyles, antialiaseds, urls): path, transform = path_id transform = transforms.Affine2D(transform.get_matrix()).translate(xo, yo) - self.draw_path(gc, path, transform, rgbFace) + self.draw_path(gc0, path, transform, rgbFace) - def draw_quad_mesh(self, master_transform, cliprect, clippath, - clippath_trans, meshWidth, meshHeight, coordinates, - offsets, offsetTrans, facecolors, antialiased, - showedges): + def draw_quad_mesh(self, gc, master_transform, meshWidth, meshHeight, + coordinates, offsets, offsetTrans, facecolors, + antialiased, showedges): """ This provides a fallback implementation of :meth:`draw_quad_mesh` that generates paths and then calls @@ -160,17 +208,46 @@ if showedges: edgecolors = np.array([[0.0, 0.0, 0.0, 1.0]], np.float_) - linewidths = np.array([1.0], np.float_) + linewidths = np.array([gc.get_linewidth()], np.float_) else: edgecolors = facecolors - linewidths = np.array([0.0], np.float_) + linewidths = np.array([gc.get_linewidth()], np.float_) return self.draw_path_collection( - master_transform, cliprect, clippath, clippath_trans, - paths, [], offsets, offsetTrans, facecolors, edgecolors, - linewidths, [], [antialiased], [None]) + gc, master_transform, paths, [], offsets, offsetTrans, facecolors, + edgecolors, linewidths, [], [antialiased], [None]) + + def draw_gouraud_triangle(self, gc, points, colors, transform): + """ + Draw a Gouraud-shaded triangle. + + *points* is a 3x2 array of (x, y) points for the triangle. + + *colors* is a 3x4 array of RGBA colors for each point of the + triangle. + + *transform* is an affine transform to apply to the points. + """ + raise NotImplementedError + + def draw_gouraud_triangles(self, gc, triangles_array, colors_array, + transform): + """ + Draws a series of Gouraud triangles. + + *points* is a Nx3x2 array of (x, y) points for the trianglex. + + *colors* is a Nx3x4 array of RGBA colors for each point of the + triangles. + + *transform* is an affine transform to apply to the points. + """ + transform = transform.frozen() + for tri, col in zip(triangles_array, colors_array): + self.draw_gouraud_triangle(gc, tri, col, transform) - def _iter_collection_raw_paths(self, master_transform, paths, all_transforms): + def _iter_collection_raw_paths(self, master_transform, paths, + all_transforms): """ This is a helper method (along with :meth:`_iter_collection`) to make it easier to write a space-efficent :meth:`draw_path_collection` @@ -200,9 +277,9 @@ transform = all_transforms[i % Ntransforms] yield path, transform + master_transform - def _iter_collection(self, path_ids, cliprect, clippath, clippath_trans, - offsets, offsetTrans, facecolors, edgecolors, - linewidths, linestyles, antialiaseds, urls): + def _iter_collection(self, gc, path_ids, offsets, offsetTrans, facecolors, + edgecolors, linewidths, linestyles, antialiaseds, + urls): """ This is a helper method (along with :meth:`_iter_collection_raw_paths`) to make it easier to write @@ -243,18 +320,14 @@ if Noffsets: toffsets = offsetTrans.transform(offsets) - gc = self.new_gc() - - gc.set_clip_rectangle(cliprect) - if clippath is not None: - clippath = transforms.TransformedPath(clippath, clippath_trans) - gc.set_clip_path(clippath) + gc0 = self.new_gc() + gc0.copy_properties(gc) if Nfacecolors == 0: rgbFace = None if Nedgecolors == 0: - gc.set_linewidth(0.0) + gc0.set_linewidth(0.0) xo, yo = 0, 0 for i in xrange(N): @@ -264,20 +337,26 @@ if Nfacecolors: rgbFace = facecolors[i % Nfacecolors] if Nedgecolors: - gc.set_foreground(edgecolors[i % Nedgecolors]) + fg = edgecolors[i % Nedgecolors] + if Nfacecolors == 0 and len(fg)==4: + gc0.set_alpha(fg[3]) + gc0.set_foreground(fg) if Nlinewidths: - gc.set_linewidth(linewidths[i % Nlinewidths]) + gc0.set_linewidth(linewidths[i % Nlinewidths]) if Nlinestyles: - gc.set_dashes(*linestyles[i % Nlinestyles]) + gc0.set_dashes(*linestyles[i % Nlinestyles]) if rgbFace is not None and len(rgbFace)==4: - gc.set_alpha(rgbFace[-1]) - rgbFace = rgbFace[:3] - gc.set_antialiased(antialiaseds[i % Naa]) + if rgbFace[3] == 0: + rgbFace = None + else: + gc0.set_alpha(rgbFace[3]) + rgbFace = rgbFace[:3] + gc0.set_antialiased(antialiaseds[i % Naa]) if Nurls: - gc.set_url(urls[i % Nurls]) + gc0.set_url(urls[i % Nurls]) - yield xo, yo, path_id, gc, rgbFace - gc.restore() + yield xo, yo, path_id, gc0, rgbFace + gc0.restore() def get_image_magnification(self): """ @@ -287,10 +366,13 @@ """ return 1.0 - def draw_image(self, x, y, im, bbox, clippath=None, clippath_trans=None): + def draw_image(self, gc, x, y, im): """ Draw the image instance into the current axes; + *gc* + a GraphicsContext containing clipping information + *x* is the distance in pixels from the left hand side of the canvas. @@ -301,23 +383,27 @@ *im* the :class:`matplotlib._image.Image` instance - - *bbox* - a :class:`matplotlib.transforms.Bbox` instance for clipping, or - None - """ raise NotImplementedError def option_image_nocomposite(self): """ - overwrite this method for renderers that do not necessarily + override this method for renderers that do not necessarily want to rescale and composite raster images. (like SVG) """ return False + def option_scale_image(self): + """ + override this method for renderers that support arbitrary + scaling of image (most of the vector backend). + """ + return False + def draw_tex(self, gc, x, y, s, prop, angle, ismath='TeX!'): - raise NotImplementedError + """ + """ + self._draw_text_as_path(gc, x, y, s, prop, angle, ismath="TeX") def draw_text(self, gc, x, y, s, prop, angle, ismath=False): """ @@ -352,7 +438,106 @@ to if 1, and then the actual bounding box will be blotted along with your text. """ - raise NotImplementedError + + self._draw_text_as_path(gc, x, y, s, prop, angle, ismath) + + def _get_text_path_transform(self, x, y, s, prop, angle, ismath): + """ + return the text path and transform + + *prop* + font property + + *s* + text to be converted + + *usetex* + If True, use matplotlib usetex mode. + + *ismath* + If True, use mathtext parser. If "TeX", use *usetex* mode. + """ + + text2path = self._text2path + fontsize = self.points_to_pixels(prop.get_size_in_points()) + + if ismath == "TeX": + verts, codes = text2path.get_text_path(prop, s, ismath=False, usetex=True) + else: + verts, codes = text2path.get_text_path(prop, s, ismath=ismath, usetex=False) + + path = Path(verts, codes) + angle = angle/180.*3.141592 + if self.flipy(): + transform = Affine2D().scale(fontsize/text2path.FONT_SCALE, + fontsize/text2path.FONT_SCALE).\ + rotate(angle).translate(x, self.height-y) + else: + transform = Affine2D().scale(fontsize/text2path.FONT_SCALE, + fontsize/text2path.FONT_SCALE).\ + rotate(angle).translate(x, y) + + return path, transform + + + def _draw_text_as_path(self, gc, x, y, s, prop, angle, ismath): + """ + draw the text by converting them to paths using textpath module. + + *prop* + font property + + *s* + text to be converted + + *usetex* + If True, use matplotlib usetex mode. + + *ismath* + If True, use mathtext parser. If "TeX", use *usetex* mode. + """ + + path, transform = self._get_text_path_transform(x, y, s, prop, angle, ismath) + color = gc.get_rgb()[:3] + + gc.set_linewidth(0.0) + self.draw_path(gc, path, transform, rgbFace=color) + + + def get_text_width_height_descent(self, s, prop, ismath): + """ + get the width and height, and the offset from the bottom to the + baseline (descent), in display coords of the string s with + :class:`~matplotlib.font_manager.FontProperties` prop + """ + if ismath=='TeX': + # todo: handle props + size = prop.get_size_in_points() + texmanager = self._text2path.get_texmanager() + fontsize = prop.get_size_in_points() + w, h, d = texmanager.get_text_width_height_descent(s, fontsize, + renderer=self) + return w, h, d + + dpi = self.points_to_pixels(72) + fontscale = self._text2path.FONT_SCALE + if ismath: + width, height, descent, glyphs, rects = \ + self._text2path.mathtext_parser.parse(s, dpi, prop) + return width, height, descent + + flags = self._text2path._get_hinting_flag() + font = self._text2path._get_font(prop) + size = prop.get_size_in_points() + font.set_size(size, dpi) + font.set_text(s, 0.0, flags=flags) # the width and height of unrotated string + w, h = font.get_width_height() + d = font.get_descent() + w /= 64.0 # convert from subpixels + h /= 64.0 + d /= 64.0 + return w, h, d + def flipy(self): """ @@ -375,13 +560,6 @@ self._texmanager = TexManager() return self._texmanager - def get_text_width_height_descent(self, s, prop, ismath): - """ - get the width and height, and the offset from the bottom to the - baseline (descent), in display coords of the string s with - :class:`~matplotlib.font_manager.FontProperties` prop - """ - raise NotImplementedError def new_gc(self): """ @@ -410,9 +588,33 @@ return cbook.strip_math(s) def start_rasterizing(self): + """ + Used in MixedModeRenderer. Switch to the raster renderer. + """ pass def stop_rasterizing(self): + """ + Used in MixedModeRenderer. Switch back to the vector renderer + and draw the contents of the raster renderer as an image on + the vector renderer. + """ + pass + + def start_filter(self): + """ + Used in AggRenderer. Switch to a temporary renderer for image + filtering effects. + """ + pass + + def stop_filter(self, filter_func): + """ + Used in AggRenderer. Switch back to the original renderer. + The contents of the temporary renderer is processed with the + *filter_func* and is drawn on the original renderer as an + image. + """ pass @@ -537,7 +739,7 @@ def get_rgb(self): """ returns a tuple of three floats from 0-1. color can be a - matlab format string, a html hex color string, or a rgb tuple + MATLAB format string, a html hex color string, or a rgb tuple """ return self._rgb @@ -565,6 +767,8 @@ Set the alpha value used for blending - not supported on all backends """ + if alpha is None: + alpha = 1.0 self._alpha = alpha def set_antialiased(self, b): @@ -614,7 +818,7 @@ def set_foreground(self, fg, isRGB=False): """ - Set the foreground color. fg can be a matlab format string, a + Set the foreground color. fg can be a MATLAB format string, a html hex color string, an rgb unit tuple, or a float between 0 and 1. In the latter case, grayscale is used. @@ -697,7 +901,145 @@ """ if self._hatch is None: return None - return path.Path.hatch(self._hatch, density) + return Path.hatch(self._hatch, density) + + +class TimerBase(object): + ''' + A base class for providing timer events, useful for things animations. + Backends need to implement a few specific methods in order to use their + own timing mechanisms so that the timer events are integrated into their + event loops. + + Mandatory functions that must be implemented: + * _timer_start: Contains backend-specific code for starting the timer + * _timer_stop: Contains backend-specific code for stopping the timer + + Optional overrides: + * _timer_set_single_shot: Code for setting the timer to single shot + operating mode, if supported by the timer object. If not, the Timer + class itself will store the flag and the _on_timer method should + be overridden to support such behavior. + * _timer_set_interval: Code for setting the interval on the timer, if + there is a method for doing so on the timer object. + * _on_timer: This is the internal function that any timer object should + call, which will handle the task of running all callbacks that have + been set. + + Attributes: + * interval: The time between timer events in milliseconds. Default + is 1000 ms. + * single_shot: Boolean flag indicating whether this timer should + operate as single shot (run once and then stop). Defaults to False. + * callbacks: Stores list of (func, args) tuples that will be called + upon timer events. This list can be manipulated directly, or the + functions add_callback and remove_callback can be used. + ''' + def __init__(self, interval=None, callbacks=None): + #Initialize empty callbacks list and setup default settings if necssary + if callbacks is None: + self.callbacks = [] + else: + self.callbacks = callbacks[:] # Create a copy + + if interval is None: + self._interval = 1000 + else: + self._interval = interval + + self._single = False + + # Default attribute for holding the GUI-specific timer object + self._timer = None + + def __del__(self): + 'Need to stop timer and possibly disconnect timer.' + self._timer_stop() + + def start(self, interval=None): + ''' + Start the timer object. `interval` is optional and will be used + to reset the timer interval first if provided. + ''' + if interval is not None: + self.set_interval(interval) + self._timer_start() + + def stop(self): + ''' + Stop the timer. + ''' + self._timer_stop() + + def _timer_start(self): + pass + + def _timer_stop(self): + pass + + def _get_interval(self): + return self._interval + + def _set_interval(self, interval): + # Force to int since none of the backends actually support fractional + # milliseconds, and some error or give warnings. + interval = int(interval) + self._interval = interval + self._timer_set_interval() + + interval = property(_get_interval, _set_interval) + + def _get_single_shot(self): + return self._single + + def _set_single_shot(self, ss=True): + self._single = ss + self._timer_set_single_shot() + + single_shot = property(_get_single_shot, _set_single_shot) + + def add_callback(self, func, *args, **kwargs): + ''' + Register `func` to be called by timer when the event fires. Any + additional arguments provided will be passed to `func`. + ''' + self.callbacks.append((func, args, kwargs)) + + def remove_callback(self, func, *args, **kwargs): + ''' + Remove `func` from list of callbacks. `args` and `kwargs` are optional + and used to distinguish between copies of the same function registered + to be called with different arguments. + ''' + if args or kwargs: + self.callbacks.remove((func, args, kwargs)) + else: + funcs = [c[0] for c in self.callbacks] + if func in funcs: + self.callbacks.pop(funcs.index(func)) + + def _timer_set_interval(self): + 'Used to set interval on underlying timer object.' + pass + + def _timer_set_single_shot(self): + 'Used to set single shot on underlying timer object.' + pass + + def _on_timer(self): + ''' + Runs all function that have been registered as callbacks. Functions + can return False if they should not be called any more. If there + are no callbacks, the timer is automatically stopped. + ''' + for func,args,kwargs in self.callbacks: + ret = func(*args, **kwargs) + if ret == False: + self.callbacks.remove((func,args,kwargs)) + + if len(self.callbacks) == 0: + self.stop() + class Event: """ @@ -759,14 +1101,24 @@ Event.__init__(self, name, canvas) self.width, self.height = canvas.get_width_height() +class CloseEvent(Event): + """ + An event triggered by a figure being closed + + In addition to the :class:`Event` attributes, the following event attributes are defined: + """ + def __init__(self, name, canvas, guiEvent=None): + Event.__init__(self, name, canvas, guiEvent) + class LocationEvent(Event): """ - A event that has a screen location + An event that has a screen location The following additional attributes are defined and shown with - their default values + their default values. - In addition to the :class:`Event` attributes, the following event attributes are defined: + In addition to the :class:`Event` attributes, the following + event attributes are defined: *x* x position - pixels from left of canvas @@ -810,7 +1162,10 @@ return # Find all axes containing the mouse - axes_list = [a for a in self.canvas.figure.get_axes() if a.in_axes(self)] + if self.canvas.mouse_grabber is None: + axes_list = [a for a in self.canvas.figure.get_axes() if a.in_axes(self)] + else: + axes_list = [self.canvas.mouse_grabber] if len(axes_list) == 0: # None found self.inaxes = None @@ -840,8 +1195,16 @@ last = LocationEvent.lastevent if last.inaxes!=self.inaxes: # process axes enter/leave events - if last.inaxes is not None: - last.canvas.callbacks.process('axes_leave_event', last) + try: + if last.inaxes is not None: + last.canvas.callbacks.process('axes_leave_event', last) + except: + pass + # See ticket 2901582. + # I think this is a valid exception to the rule + # against catching all exceptions; if anything goes + # wrong, we simply want to move on and process the + # current event. if self.inaxes is not None: self.canvas.callbacks.process('axes_enter_event', self) @@ -850,12 +1213,12 @@ if self.inaxes is not None: self.canvas.callbacks.process('axes_enter_event', self) - LocationEvent.lastevent = self + class MouseEvent(LocationEvent): """ A mouse event ('button_press_event', 'button_release_event', 'scroll_event', @@ -996,7 +1359,8 @@ 'figure_enter_event', 'figure_leave_event', 'axes_enter_event', - 'axes_leave_event' + 'axes_leave_event', + 'close_event' ] @@ -1011,6 +1375,7 @@ self._lastx, self._lasty = None, None self.button_pick_id = self.mpl_connect('button_press_event',self.pick) self.scroll_pick_id = self.mpl_connect('scroll_event',self.pick) + self.mouse_grabber = None # the axes currently grabbing mouse if False: ## highlight the artists that are hit @@ -1132,6 +1497,21 @@ event = ResizeEvent(s, self) self.callbacks.process(s, event) + def close_event(self, guiEvent=None): + """ + This method will be called by all functions connected to the + 'close_event' with a :class:`CloseEvent` + """ + s = 'close_event' + try: + event = CloseEvent(s, self, guiEvent=guiEvent) + self.callbacks.process(s, event) + except TypeError: + pass + # Suppress the TypeError when the python session is being killed. + # It may be that a better solution would be a mechanism to + # disconnect all callbacks upon shutdown. + def key_press_event(self, key, guiEvent=None): """ This method will be call all functions connected to the @@ -1274,6 +1654,25 @@ event = IdleEvent(s, self, guiEvent=guiEvent) self.callbacks.process(s, event) + def grab_mouse(self, ax): + """ + Set the child axes which are currently grabbing the mouse events. + Usually called by the widgets themselves. + It is an error to call this if the mouse is already grabbed by + another axes. + """ + if self.mouse_grabber not in (None, ax): + raise RuntimeError('two different attempted to grab mouse input') + self.mouse_grabber = ax + + def release_mouse(self, ax): + """ + Release the mouse grab held by the axes, ax. + Usually called by the widgets. + It is ok to call this even if you ax doesn't have the mouse grab currently. + """ + if self.mouse_grabber is ax: + self.mouse_grabber = None def draw(self, *args, **kwargs): """ @@ -1369,6 +1768,33 @@ groupings[name].sort() return groupings + + def _get_print_method(self, format): + method_name = 'print_%s' % format + + # check for registered backends + if format in _backend_d: + backend_class = _backend_d[format] + + def _print_method(*args, **kwargs): + backend = self.switch_backends(backend_class) + print_method = getattr(backend, method_name) + return print_method(*args, **kwargs) + + return _print_method + + if (format not in self.filetypes or + not hasattr(self, method_name)): + formats = self.filetypes.keys() + formats.sort() + raise ValueError( + 'Format "%s" is not supported.\n' + 'Supported formats: ' + '%s.' % (format, ', '.join(formats))) + + return getattr(self, method_name) + + def print_figure(self, filename, dpi=None, facecolor='w', edgecolor='w', orientation='portrait', format=None, **kwargs): """ @@ -1394,11 +1820,26 @@ *edgecolor* the edgecolor of the figure - *orientation* ' + *orientation* landscape' | 'portrait' (not supported on all backends) *format* when set, forcibly set the file format to save to + + + *bbox_inches* + Bbox in inches. Only the given portion of the figure is + saved. If 'tight', try to figure out the tight bbox of + the figure. + + *pad_inches* + Amount of padding around the figure when bbox_inches is + 'tight'. + + *bbox_extra_artists* + A list of extra artists that will be considered when the + tight bbox is calculated. + """ if format is None: if cbook.is_string_like(filename): @@ -1409,15 +1850,7 @@ filename = filename.rstrip('.') + '.' + format format = format.lower() - method_name = 'print_%s' % format - if (format not in self.filetypes or - not hasattr(self, method_name)): - formats = self.filetypes.keys() - formats.sort() - raise ValueError( - 'Format "%s" is not supported.\n' - 'Supported formats: ' - '%s.' % (format, ', '.join(formats))) + print_method = self._get_print_method(format) if dpi is None: dpi = rcParams['savefig.dpi'] @@ -1445,7 +1878,8 @@ # the backend to support file-like object, i'm going # to leave it as it is. However, a better solution # than stringIO seems to be needed. -JJL - result = getattr(self, method_name)( + #result = getattr(self, method_name)( + result = print_method( cStringIO.StringIO(), dpi=dpi, facecolor=facecolor, @@ -1455,6 +1889,18 @@ **kwargs) renderer = self.figure._cachedRenderer bbox_inches = self.figure.get_tightbbox(renderer) + + bb = [a.get_window_extent(renderer) for a \ + in kwargs.pop("bbox_extra_artists", [])] + if bb: + _bbox = Bbox.union([b for b in bb if b.width!=0 or b.height!=0]) + + bbox_inches1 = TransformedBbox(_bbox, + Affine2D().scale(1./self.figure.dpi)) + + bbox_inches = Bbox.union([bbox_inches, bbox_inches1]) + + pad = kwargs.pop("pad_inches", 0.1) bbox_inches = bbox_inches.padded(pad) @@ -1466,7 +1912,8 @@ _bbox_inches_restore = None try: - result = getattr(self, method_name)( + #result = getattr(self, method_name)( + result = print_method( filename, dpi=dpi, facecolor=facecolor, @@ -1533,6 +1980,7 @@ - 'figure_leave_event', - 'axes_enter_event', - 'axes_leave_event' + - 'close_event' For the location events (button and key press/release), if the mouse is over the axes, the variable ``event.inaxes`` will be @@ -1569,6 +2017,22 @@ """ return self.callbacks.disconnect(cid) + def new_timer(self, *args, **kwargs): + """ + Creates a new backend-specific subclass of :class:`backend_bases.Timer`. + This is useful for getting periodic events through the backend's native + event loop. Implemented only for backends with GUIs. + + optional arguments: + + *interval* + Timer interval in milliseconds + *callbacks* + Sequence of (func, args, kwargs) where func(*args, **kwargs) will + be executed by the timer every *interval*. + """ + return TimerBase(*args, **kwargs) + def flush_events(self): """ Flush the GUI events for the figure. Implemented only for @@ -1648,7 +2112,7 @@ class FigureManagerBase: """ - Helper class for matlab mode, wraps everything up into a neat bundle + Helper class for pyplot mode, wraps everything up into a neat bundle Public attibutes: @@ -1682,50 +2146,87 @@ # self.destroy() # how cruel to have to destroy oneself! # return - if event.key == 'f': + if event.key is None: + return + + # Load key-mappings from your matplotlibrc file. + fullscreen_keys = rcParams['keymap.fullscreen'] + home_keys = rcParams['keymap.home'] + back_keys = rcParams['keymap.back'] + forward_keys = rcParams['keymap.forward'] + pan_keys = rcParams['keymap.pan'] + zoom_keys = rcParams['keymap.zoom'] + save_keys = rcParams['keymap.save'] + grid_keys = rcParams['keymap.grid'] + toggle_yscale_keys = rcParams['keymap.yscale'] + toggle_xscale_keys = rcParams['keymap.xscale'] + all = rcParams['keymap.all_axes'] + + # toggle fullscreen mode (default key 'f') + if event.key in fullscreen_keys: self.full_screen_toggle() - # *h*ome or *r*eset mnemonic - elif event.key == 'h' or event.key == 'r' or event.key == "home": + # home or reset mnemonic (default key 'h', 'home' and 'r') + elif event.key in home_keys: self.canvas.toolbar.home() - # c and v to enable left handed quick navigation - elif event.key == 'left' or event.key == 'c' or event.key == 'backspace': + # forward / backward keys to enable left handed quick navigation + # (default key for backward: 'left', 'backspace' and 'c') + elif event.key in back_keys: self.canvas.toolbar.back() - elif event.key == 'right' or event.key == 'v': + # (default key for forward: 'right' and 'v') + elif event.key in forward_keys: self.canvas.toolbar.forward() - # *p*an mnemonic - elif event.key == 'p': + # pan mnemonic (default key 'p') + elif event.key in pan_keys: self.canvas.toolbar.pan() - # z*o*om mnemonic - elif event.key == 'o': + # zoom mnemonic (default key 'o') + elif event.key in zoom_keys: self.canvas.toolbar.zoom() - elif event.key == 's': - self.canvas.toolbar.save_figure(self.canvas.toolbar) + # saving current figure (default key 's') + elif event.key in save_keys: + self.canvas.toolbar.save_figure() if event.inaxes is None: return # the mouse has to be over an axes to trigger these - if event.key == 'g': + # switching on/off a grid in current axes (default key 'g') + if event.key in grid_keys: event.inaxes.grid() self.canvas.draw() - elif event.key == 'l': + # toggle scaling of y-axes between 'log and 'linear' (default key 'l') + elif event.key in toggle_yscale_keys: ax = event.inaxes scale = ax.get_yscale() - if scale=='log': + if scale == 'log': ax.set_yscale('linear') ax.figure.canvas.draw() - elif scale=='linear': + elif scale == 'linear': ax.set_yscale('log') ax.figure.canvas.draw() + # toggle scaling of x-axes between 'log and 'linear' (default key 'k') + elif event.key in toggle_xscale_keys: + ax = event.inaxes + scalex = ax.get_xscale() + if scalex == 'log': + ax.set_xscale('linear') + ax.figure.canvas.draw() + elif scalex == 'linear': + ax.set_xscale('log') + ax.figure.canvas.draw() - elif event.key is not None and (event.key.isdigit() and event.key!='0') or event.key=='a': - # 'a' enables all axes - if event.key!='a': - n=int(event.key)-1 + elif (event.key.isdigit() and event.key!='0') or event.key in all: + # keys in list 'all' enables all axes (default key 'a'), + # otherwise if key is a number only enable this particular axes + # if it was the axes, where the event was raised + if not (event.key in all): + n = int(event.key)-1 for i, a in enumerate(self.canvas.figure.get_axes()): - if event.x is not None and event.y is not None and a.in_axes(event): - if event.key=='a': + # consider axes, in which the event was raised + # FIXME: Why only this axes? + if event.x is not None and event.y is not None \ + and a.in_axes(event): + if event.key in all: a.set_navigate(True) else: a.set_navigate(i==n) @@ -1808,6 +2309,10 @@ self._lastCursor = None self._init_toolbar() self._idDrag=self.canvas.mpl_connect('motion_notify_event', self.mouse_move) + + self._ids_zoom = [] + self._zoom_mode = None + self._button_pressed = None # determined by the button pressed at start self.mode = '' # a mode string for the status bar @@ -1879,10 +2384,6 @@ if self._lastCursor != cursors.SELECT_REGION: self.set_cursor(cursors.SELECT_REGION) self._lastCursor = cursors.SELECT_REGION - if self._xypress: - x, y = event.x, event.y - lastx, lasty, a, ind, lim, trans = self._xypress[0] - self.draw_rubberband(event, x, y, lastx, lasty) elif (self._active=='PAN' and self._lastCursor != cursors.MOVE): self.set_cursor(cursors.MOVE) @@ -1984,8 +2485,28 @@ and a.get_navigate() and a.can_zoom(): self._xypress.append(( x, y, a, i, a.viewLim.frozen(), a.transData.frozen())) + id1 = self.canvas.mpl_connect('motion_notify_event', self.drag_zoom) + + id2 = self.canvas.mpl_connect('key_press_event', + self._switch_on_zoom_mode) + id3 = self.canvas.mpl_connect('key_release_event', + self._switch_off_zoom_mode) + + self._ids_zoom = id1, id2, id3 + + self._zoom_mode = event.key + + self.press(event) + def _switch_on_zoom_mode(self, event): + self._zoom_mode = event.key + self.mouse_move(event) + + def _switch_off_zoom_mode(self, event): + self._zoom_mode = None + self.mouse_move(event) + def push_current(self): 'push the current view limits and position onto the stack' lims = []; pos = [] @@ -2030,8 +2551,35 @@ a.drag_pan(self._button_pressed, event.key, event.x, event.y) self.dynamic_update() + def drag_zoom(self, event): + 'the drag callback in zoom mode' + + if self._xypress: + x, y = event.x, event.y + lastx, lasty, a, ind, lim, trans = self._xypress[0] + + # adjust x, last, y, last + x1, y1, x2, y2 = a.bbox.extents + x, lastx = max(min(x, lastx), x1), min(max(x, lastx), x2) + y, lasty = max(min(y, lasty), y1), min(max(y, lasty), y2) + + if self._zoom_mode == "x": + x1, y1, x2, y2 = a.bbox.extents + y, lasty = y1, y2 + elif self._zoom_mode == "y": + x1, y1, x2, y2 = a.bbox.extents + x, lastx = x1, x2 + + self.draw_rubberband(event, x, y, lastx, lasty) + + + def release_zoom(self, event): 'the release mouse button callback in zoom to rect mode' + for zoom_id in self._ids_zoom: + self.canvas.mpl_disconnect(zoom_id) + self._ids_zoom = [] + if not self._xypress: return last_a = [] @@ -2039,7 +2587,6 @@ for cur_xypress in self._xypress: x, y = event.x, event.y lastx, lasty, a, ind, lim, trans = cur_xypress - # ignore singular clicks - 5 pixels is a threshold if abs(x-lastx)<5 or abs(y-lasty)<5: self._xypress = None @@ -2093,8 +2640,13 @@ if y1 < Ymax: y1=Ymax if self._button_pressed == 1: - a.set_xlim((x0, x1)) - a.set_ylim((y0, y1)) + if self._zoom_mode == "x": + a.set_xlim((x0, x1)) + elif self._zoom_mode == "y": + a.set_ylim((y0, y1)) + else: + a.set_xlim((x0, x1)) + a.set_ylim((y0, y1)) elif self._button_pressed == 3: if a.get_xscale()=='log': alpha=np.log(Xmax/Xmin)/np.log(x1/x0) @@ -2112,13 +2664,21 @@ alpha=(Ymax-Ymin)/(y1-y0) ry1=alpha*(Ymin-y0)+Ymin ry2=alpha*(Ymax-y0)+Ymin - a.set_xlim((rx1, rx2)) - a.set_ylim((ry1, ry2)) + + if self._zoom_mode == "x": + a.set_xlim((rx1, rx2)) + elif self._zoom_mode == "y": + a.set_ylim((ry1, ry2)) + else: + a.set_xlim((rx1, rx2)) + a.set_ylim((ry1, ry2)) self.draw() self._xypress = None self._button_pressed = None + self._zoom_mode = None + self.push_current() self.release(event) diff -Nru matplotlib-0.99.3/lib/matplotlib/backends/backend_agg.py matplotlib-1.0.1/lib/matplotlib/backends/backend_agg.py --- matplotlib-0.99.3/lib/matplotlib/backends/backend_agg.py 2009-07-31 15:14:40.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/backends/backend_agg.py 2010-07-07 01:41:52.000000000 +0000 @@ -22,7 +22,7 @@ """ from __future__ import division -import numpy as npy +import numpy as np from matplotlib import verbose, rcParams from matplotlib.backend_bases import RendererBase,\ @@ -30,7 +30,7 @@ from matplotlib.cbook import is_string_like, maxdict from matplotlib.figure import Figure from matplotlib.font_manager import findfont -from matplotlib.ft2font import FT2Font, LOAD_FORCE_AUTOHINT +from matplotlib.ft2font import FT2Font, LOAD_FORCE_AUTOHINT, LOAD_NO_HINTING from matplotlib.mathtext import MathTextParser from matplotlib.path import Path from matplotlib.transforms import Bbox, BboxBase @@ -57,20 +57,39 @@ self.height = height if __debug__: verbose.report('RendererAgg.__init__ width=%s, height=%s'%(width, height), 'debug-annoying') self._renderer = _RendererAgg(int(width), int(height), dpi, debug=False) + self._filter_renderers = [] + if __debug__: verbose.report('RendererAgg.__init__ _RendererAgg done', 'debug-annoying') + + self._update_methods() + self.mathtext_parser = MathTextParser('Agg') + + self.bbox = Bbox.from_bounds(0, 0, self.width, self.height) + if __debug__: verbose.report('RendererAgg.__init__ done', + 'debug-annoying') + + def _get_hinting_flag(self): + if rcParams['text.hinting']: + return LOAD_FORCE_AUTOHINT + else: + return LOAD_NO_HINTING + + def draw_markers(self, *kl, **kw): + # for filtering to work with rastrization, methods needs to be wrapped. + # maybe there is better way to do it. + return self._renderer.draw_markers(*kl, **kw) + + def _update_methods(self): #self.draw_path = self._renderer.draw_path # see below - self.draw_markers = self._renderer.draw_markers + #self.draw_markers = self._renderer.draw_markers self.draw_path_collection = self._renderer.draw_path_collection self.draw_quad_mesh = self._renderer.draw_quad_mesh + self.draw_gouraud_triangle = self._renderer.draw_gouraud_triangle + self.draw_gouraud_triangles = self._renderer.draw_gouraud_triangles self.draw_image = self._renderer.draw_image self.copy_from_bbox = self._renderer.copy_from_bbox self.tostring_rgba_minimized = self._renderer.tostring_rgba_minimized - self.mathtext_parser = MathTextParser('Agg') - - self.bbox = Bbox.from_bounds(0, 0, self.width, self.height) - if __debug__: verbose.report('RendererAgg.__init__ done', - 'debug-annoying') def draw_path(self, gc, path, transform, rgbFace=None): """ @@ -80,10 +99,10 @@ npts = path.vertices.shape[0] if (nmax > 100 and npts > nmax and path.should_simplify and rgbFace is None and gc.get_hatch() is None): - nch = npy.ceil(npts/float(nmax)) - chsize = int(npy.ceil(npts/nch)) - i0 = npy.arange(0, npts, chsize) - i1 = npy.zeros_like(i0) + nch = np.ceil(npts/float(nmax)) + chsize = int(np.ceil(npts/nch)) + i0 = np.arange(0, npts, chsize) + i1 = np.zeros_like(i0) i1[:-1] = i0[1:] - 1 i1[-1] = npts for ii0, ii1 in zip(i0, i1): @@ -119,17 +138,18 @@ if ismath: return self.draw_mathtext(gc, x, y, s, prop, angle) + flags = self._get_hinting_flag() font = self._get_agg_font(prop) if font is None: return None if len(s) == 1 and ord(s) > 127: - font.load_char(ord(s), flags=LOAD_FORCE_AUTOHINT) + font.load_char(ord(s), flags=flags) else: # We pass '0' for angle here, since it will be rotated (in raster # space) in the following call to draw_text_image). - font.set_text(s, 0, flags=LOAD_FORCE_AUTOHINT) + font.set_text(s, 0, flags=flags) font.draw_glyphs_to_bitmap() - #print x, y, int(x), int(y) + #print x, y, int(x), int(y), s self._renderer.draw_text_image(font.get_image(), int(x), int(y) + 1, angle, gc) @@ -142,7 +162,7 @@ # texmanager more efficient. It is not meant to be used # outside the backend """ - if ismath=='TeX': + if rcParams['text.usetex']: # todo: handle props size = prop.get_size_in_points() texmanager = self.get_texmanager() @@ -155,8 +175,10 @@ ox, oy, width, height, descent, fonts, used_characters = \ self.mathtext_parser.parse(s, self.dpi, prop) return width, height, descent + + flags = self._get_hinting_flag() font = self._get_agg_font(prop) - font.set_text(s, 0.0, flags=LOAD_FORCE_AUTOHINT) # the width and height of unrotated string + font.set_text(s, 0.0, flags=flags) # the width and height of unrotated string w, h = font.get_width_height() d = font.get_descent() w /= 64.0 # convert from subpixels @@ -164,6 +186,7 @@ d /= 64.0 return w, h, d + def draw_tex(self, gc, x, y, s, prop, angle): # todo, handle props, angle, origins size = prop.get_size_in_points() @@ -173,7 +196,7 @@ im = self.texd.get(key) if im is None: Z = texmanager.get_grey(s, size, self.dpi) - Z = npy.array(Z * 255.0, npy.uint8) + Z = np.array(Z * 255.0, np.uint8) self._renderer.draw_text_image(Z, x, y, angle, gc) @@ -238,19 +261,25 @@ # with the Agg backend return True + def option_scale_image(self): + """ + agg backend support arbitrary scaling of image. + """ + return True + def restore_region(self, region, bbox=None, xy=None): """ - restore the saved region. if bbox (instance of BboxBase, or + Restore the saved region. If bbox (instance of BboxBase, or its extents) is given, only the region specified by the bbox will be restored. *xy* (a tuple of two floasts) optionally - specify the new position (of the LLC of the originally region, - not the LLC of the bbox) that the region will be restored. + specifies the new position (the LLC of the original region, + not the LLC of the bbox) where the region will be restored. >>> region = renderer.copy_from_bbox() >>> x1, y1, x2, y2 = region.get_extents() >>> renderer.restore_region(region, bbox=(x1+dx, y1, x2, y2), xy=(x1-dx, y1)) - + """ if bbox is not None or xy is not None: if bbox is None: @@ -270,6 +299,57 @@ else: self._renderer.restore_region(region) + def start_filter(self): + """ + Start filtering. It simply create a new canvas (the old one is saved). + """ + self._filter_renderers.append(self._renderer) + self._renderer = _RendererAgg(int(self.width), int(self.height), + self.dpi) + self._update_methods() + + def stop_filter(self, post_processing): + """ + Save the plot in the current canvas as a image and apply + the *post_processing* function. + + def post_processing(image, dpi): + # ny, nx, depth = image.shape + # image (numpy array) has RGBA channels and has a depth of 4. + ... + # create a new_image (numpy array of 4 channels, size can be + # different). The resulting image may have offsets from + # lower-left corner of the original image + return new_image, offset_x, offset_y + + The saved renderer is restored and the returned image from + post_processing is plotted (using draw_image) on it. + """ + + from matplotlib._image import fromarray + + width, height = int(self.width), int(self.height) + + buffer, bounds = self._renderer.tostring_rgba_minimized() + + l, b, w, h = bounds + + + self._renderer = self._filter_renderers.pop() + self._update_methods() + + if w > 0 and h > 0: + img = np.fromstring(buffer, np.uint8) + img, ox, oy = post_processing(img.reshape((h, w, 4)) / 255., + self.dpi) + image = fromarray(img, 1) + image.flipud_out() + + gc = self.new_gc() + self._renderer.draw_image(gc, + l+ox, height - b - h +oy, + image) + def new_figure_manager(num, *args, **kwargs): """ @@ -365,4 +445,3 @@ renderer.width, renderer.height, filename_or_obj, self.figure.dpi) renderer.dpi = original_dpi - diff -Nru matplotlib-0.99.3/lib/matplotlib/backends/backend_cairo.py matplotlib-1.0.1/lib/matplotlib/backends/backend_cairo.py --- matplotlib-0.99.3/lib/matplotlib/backends/backend_cairo.py 2009-07-31 15:14:40.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/backends/backend_cairo.py 2010-07-07 01:41:52.000000000 +0000 @@ -21,7 +21,7 @@ from __future__ import division import os, sys, warnings, gzip -import numpy as npy +import numpy as np def _fn_name(): return sys._getframe(1).f_code.co_name @@ -96,6 +96,8 @@ cairo.ImageSurface (cairo.FORMAT_ARGB32,1,1)) self.mathtext_parser = MathTextParser('Cairo') + RendererBase.__init__(self) + def set_ctx_from_surface (self, surface): self.gc.ctx = cairo.Context (surface) @@ -139,7 +141,7 @@ def draw_path(self, gc, path, transform, rgbFace=None): if len(path.vertices) > 18980: - raise ValueError("The Cairo backend can not draw paths longer than 18980 points.") + raise ValueError("The Cairo backend can not draw paths longer than 18980 points.") ctx = gc.ctx @@ -151,10 +153,12 @@ self._fill_and_stroke(ctx, rgbFace, gc.get_alpha()) - def draw_image(self, x, y, im, bbox, clippath=None, clippath_trans=None): + def draw_image(self, gc, x, y, im): # bbox - not currently used if _debug: print '%s.%s()' % (self.__class__.__name__, _fn_name()) + clippath, clippath_trans = gc.get_clip_path() + im.flipud_out() rows, cols, buf = im.color_conv (BYTE_FORMAT) @@ -194,7 +198,7 @@ ctx.save() if angle: - ctx.rotate (-angle * npy.pi / 180) + ctx.rotate (-angle * np.pi / 180) ctx.set_font_size (size) ctx.show_text (s.encode("utf-8")) ctx.restore() @@ -209,7 +213,7 @@ ctx.save() ctx.translate(x, y) if angle: - ctx.rotate (-angle * npy.pi / 180) + ctx.rotate (-angle * np.pi / 180) for font, fontsize, s, ox, oy in glyphs: ctx.new_path() @@ -311,9 +315,10 @@ def set_alpha(self, alpha): - self._alpha = alpha + GraphicsContextBase.set_alpha(self, alpha) + _alpha = self.get_alpha() rgb = self._rgb - self.ctx.set_source_rgba (rgb[0], rgb[1], rgb[2], alpha) + self.ctx.set_source_rgba (rgb[0], rgb[1], rgb[2], _alpha) #def set_antialiased(self, b): @@ -353,7 +358,7 @@ self.ctx.set_dash([], 0) # switch dashes off else: self.ctx.set_dash ( - self.renderer.points_to_pixels (npy.asarray(dashes)), offset) + self.renderer.points_to_pixels (np.asarray(dashes)), offset) def set_foreground(self, fg, isRGB=None): @@ -467,7 +472,7 @@ ctx = renderer.gc.ctx if orientation == 'landscape': - ctx.rotate (npy.pi/2) + ctx.rotate (np.pi/2) ctx.translate (0, -height_in_points) # cairo/src/cairo_ps_surface.c # '%%Orientation: Portrait' is always written to the file header diff -Nru matplotlib-0.99.3/lib/matplotlib/backends/backend_cocoaagg.py matplotlib-1.0.1/lib/matplotlib/backends/backend_cocoaagg.py --- matplotlib-0.99.3/lib/matplotlib/backends/backend_cocoaagg.py 2009-07-31 15:14:40.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/backends/backend_cocoaagg.py 2010-08-03 14:22:42.000000000 +0000 @@ -30,6 +30,8 @@ import matplotlib from matplotlib.figure import Figure from matplotlib.backend_bases import FigureManagerBase, FigureCanvasBase +from matplotlib.backend_bases import ShowBase + from backend_agg import FigureCanvasAgg from matplotlib._pylab_helpers import Gcf @@ -41,9 +43,23 @@ canvas = FigureCanvasCocoaAgg(thisFig) return FigureManagerCocoaAgg(canvas, num) -def show(): - for manager in Gcf.get_all_fig_managers(): - manager.show() +## Below is the original show() function: +#def show(): +# for manager in Gcf.get_all_fig_managers(): +# manager.show() +# +## It appears that this backend is unusual in having a separate +## run function invoked for each figure, instead of a single +## mainloop. Presumably there is no blocking at all. +## +## Using the Show class below should cause no difference in +## behavior. + +class Show(ShowBase): + def mainloop(self): + pass + +show = Show() def draw_if_interactive(): if matplotlib.is_interactive(): diff -Nru matplotlib-0.99.3/lib/matplotlib/backends/backend_emf.py matplotlib-1.0.1/lib/matplotlib/backends/backend_emf.py --- matplotlib-0.99.3/lib/matplotlib/backends/backend_emf.py 2010-03-09 14:20:20.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/backends/backend_emf.py 2010-07-07 01:41:52.000000000 +0000 @@ -23,6 +23,10 @@ from matplotlib.font_manager import findfont, FontProperties from matplotlib.ft2font import FT2Font, KERNING_UNFITTED, KERNING_DEFAULT, KERNING_UNSCALED +from matplotlib.path import Path +from matplotlib.transforms import Affine2D +from matplotlib.mlab import quad2cubic + # Font handling stuff snarfed from backend_ps, but only using TTF fonts _fontd = {} @@ -84,7 +88,7 @@ 'dashdot':pyemf.PS_DASHDOT, 'dotted':pyemf.PS_DOT} #style=styles.get(self.gc.get_linestyle('solid')) style=self.gc.get_linestyle('solid') - if debugHandle: print "EMFPen: style=%d" % style + if debugHandle: print "EMFPen: style=%s" % style if style in styles: self.style=styles[style] else: @@ -119,6 +123,28 @@ The renderer handles drawing/rendering operations through a pyemf.EMF instance. """ + + fontweights = { + 100 : pyemf.FW_NORMAL, + 200 : pyemf.FW_NORMAL, + 300 : pyemf.FW_NORMAL, + 400 : pyemf.FW_NORMAL, + 500 : pyemf.FW_NORMAL, + 600 : pyemf.FW_BOLD, + 700 : pyemf.FW_BOLD, + 800 : pyemf.FW_BOLD, + 900 : pyemf.FW_BOLD, + 'ultralight' : pyemf.FW_ULTRALIGHT, + 'light' : pyemf.FW_LIGHT, + 'normal' : pyemf.FW_NORMAL, + 'medium' : pyemf.FW_MEDIUM, + 'semibold' : pyemf.FW_SEMIBOLD, + 'bold' : pyemf.FW_BOLD, + 'heavy' : pyemf.FW_HEAVY, + 'ultrabold' : pyemf.FW_ULTRABOLD, + 'black' : pyemf.FW_BLACK, + } + def __init__(self, outfile, width, height, dpi): "Initialize the renderer with a gd image instance" self.outfile = outfile @@ -144,6 +170,8 @@ # set baseline for text to be bottom left corner self.emf.SetTextAlign( pyemf.TA_BOTTOM|pyemf.TA_LEFT) + self._lastClipRect = None + if debugPrint: print "RendererEMF: (%f,%f) %s dpi=%f" % (self.width,self.height,outfile,dpi) @@ -179,7 +207,65 @@ self.emf.Arc(int(x-hw),int(self.height-(y-hh)),int(x+hw),int(self.height-(y+hh)),int(x+math.cos(angle1*math.pi/180.0)*hw),int(self.height-(y+math.sin(angle1*math.pi/180.0)*hh)),int(x+math.cos(angle2*math.pi/180.0)*hw),int(self.height-(y+math.sin(angle2*math.pi/180.0)*hh))) - def draw_image(self, x, y, im, bbox): + def handle_clip_rectangle(self, gc): + new_bounds = gc.get_clip_rectangle() + if new_bounds is not None: + new_bounds = new_bounds.bounds + if self._lastClipRect != new_bounds: + self._lastClipRect = new_bounds + if new_bounds is None: + # use the maximum rectangle to disable clipping + x, y, width, height = (0, 0, self.width, self.height) + else: + x, y, width, height = new_bounds + self.emf.BeginPath() + self.emf.MoveTo(int(x), int(self.height - y)) + self.emf.LineTo(int(x) + int(width), int(self.height - y)) + self.emf.LineTo(int(x) + int(width), int(self.height - y) - int(height)) + self.emf.LineTo(int(x), int(self.height - y) - int(height)) + self.emf.CloseFigure() + self.emf.EndPath() + self.emf.SelectClipPath() + + + def convert_path(self, tpath): + self.emf.BeginPath() + last_points = None + for points, code in tpath.iter_segments(): + if code == Path.MOVETO: + self.emf.MoveTo(*points) + elif code == Path.LINETO: + self.emf.LineTo(*points) + elif code == Path.CURVE3: + points = quad2cubic(*(list(last_points[-2:]) + list(points))) + self.emf.PolyBezierTo(zip(points[2::2], points[3::2])) + elif code == Path.CURVE4: + self.emf.PolyBezierTo(zip(points[::2], points[1::2])) + elif code == Path.CLOSEPOLY: + self.emf.CloseFigure() + last_points = points + self.emf.EndPath() + + + def draw_path(self, gc, path, transform, rgbFace=None): + """ + Draws a :class:`~matplotlib.path.Path` instance using the + given affine transform. + """ + self.handle_clip_rectangle(gc) + gc._rgb = gc._rgb[:3] + self.select_pen(gc) + self.select_brush(rgbFace) + transform = transform + Affine2D().scale(1.0, -1.0).translate(0.0, self.height) + tpath = transform.transform_path(path) + self.convert_path(tpath) + if rgbFace is None: + self.emf.StrokePath() + else: + self.emf.StrokeAndFillPath() + + + def draw_image(self, x, y, im, bbox, clippath=None, clippath_trans=None): """ Draw the Image instance into the current axes; x is the distance in pixels from the left hand side of the canvas. y is @@ -288,11 +374,17 @@ to if 1, and then the actual bounding box will be blotted along with your text. """ - if debugText: print "draw_text: (%f,%f) %d degrees: '%s'" % (x,y,angle,s) - if ismath: - self.draw_math_text(gc,x,y,s,prop,angle) - else: - self.draw_plain_text(gc,x,y,s,prop,angle) + if ismath: s = self.strip_math(s) + self.handle_clip_rectangle(gc) + self.emf.SetTextColor(gc.get_rgb()[:3]) + self.select_font(prop,angle) + if isinstance(s, unicode): + # unicode characters do not seem to work with pyemf + try: + s = s.replace(u'\u2212', '-').encode('iso-8859-1') + except UnicodeEncodeError: + pass + self.emf.TextOut(x,y,s) def draw_plain_text(self, gc, x, y, s, prop, angle): @@ -372,6 +464,22 @@ return w, h + def get_text_width_height_descent(self, s, prop, ismath): + """ + get the width and height in display coords of the string s + with FontPropertry prop + """ + if ismath: s = self.strip_math(s) + font = self._get_font_ttf(prop) + font.set_text(s, 0.0) + w, h = font.get_width_height() + w /= 64.0 # convert from subpixels + h /= 64.0 + d = font.get_descent() + d /= 64.0 + return w, h, d + + def flipy(self): """return true if y small numbers are top for renderer Is used for drawing text (text.py) and images (image.py) only @@ -410,7 +518,9 @@ handle = self._fontHandle.get(key) if handle is None: handle=self.emf.CreateFont(-size, 0, int(angle)*10, int(angle)*10, - pyemf.FW_NORMAL, 0, 0, 0, + self.fontweights.get(prop.get_weight(), pyemf.FW_NORMAL), + int(prop.get_style() == 'italic'), + 0, 0, pyemf.ANSI_CHARSET, pyemf.OUT_DEFAULT_PRECIS, pyemf.CLIP_DEFAULT_PRECIS, pyemf.DEFAULT_QUALITY, pyemf.DEFAULT_PITCH | pyemf.FF_DONTCARE, face); diff -Nru matplotlib-0.99.3/lib/matplotlib/backends/backend_fltkagg.py matplotlib-1.0.1/lib/matplotlib/backends/backend_fltkagg.py --- matplotlib-0.99.3/lib/matplotlib/backends/backend_fltkagg.py 2009-07-31 15:14:40.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/backends/backend_fltkagg.py 2010-08-03 14:22:42.000000000 +0000 @@ -24,24 +24,14 @@ from matplotlib.backend_bases import \ RendererBase, GraphicsContextBase, FigureManagerBase, FigureCanvasBase,\ NavigationToolbar2, cursors +from matplotlib.backend_bases import ShowBase + + from matplotlib.figure import Figure from matplotlib._pylab_helpers import Gcf -import matplotlib.windowing as windowing +import matplotlib.backends.windowing as windowing from matplotlib.widgets import SubplotTool - -import thread,time - -Fl_running=thread.allocate_lock() -def Fltk_run_interactive(): - global Fl_running - if Fl_running.acquire(0): - while True: - Fltk.Fl.check() - time.sleep(0.005) - else: - print "fl loop already running" - # the true dots per inch on the screen; should be display dependent # see http://groups.google.com/groups?q=screen+dpi+x11&hl=en&lr=&ie=UTF-8&oe=UTF-8&safe=off&selm=7077.26e81ad5%40swift.cs.tcd.ie&rnum=5 for some info about screen dpi PIXELS_PER_INCH = 75 @@ -75,35 +65,11 @@ if figManager is not None: figManager.canvas.draw() - -def ishow(): - """ - Show all the figures and enter the fltk mainloop in another thread - This allows to keep hand in interractive python session - Warning: does not work under windows - This should be the last line of your script - """ - for manager in Gcf.get_all_fig_managers(): - manager.show() - if show._needmain: - thread.start_new_thread(Fltk_run_interactive,()) - show._needmain = False - -def show(): - """ - Show all the figures and enter the fltk mainloop - - This should be the last line of your script - """ - for manager in Gcf.get_all_fig_managers(): - manager.show() - #mainloop, if an fltk program exist no need to call that - #threaded (and interractive) version - if show._needmain: +class Show(ShowBase): + def mainloop(self): Fltk.Fl.run() - show._needmain = False -show._needmain = True +show = Show() def new_figure_manager(num, *args, **kwargs): @@ -256,8 +222,9 @@ FigureCanvasBase.stop_event_loop_default(self) stop_event_loop.__doc__=FigureCanvasBase.stop_event_loop_default.__doc__ -def destroy_figure(ptr,figman): +def destroy_figure(ptr, figman): figman.window.hide() + Fltk.Fl.wait(0) # This is needed to make the last figure vanish. Gcf.destroy(figman._num) class FigureManagerFltkAgg(FigureManagerBase): @@ -308,6 +275,11 @@ self.canvas.draw() self.window.redraw() + def destroy(self): + self.window.hide() + Fltk.Fl.wait(0) # This is needed to make the last figure vanish. + Gcf.destroy(self._num) + def set_window_title(self, title): self.window_title=title self.window.label(title) diff -Nru matplotlib-0.99.3/lib/matplotlib/backends/backend_gdk.py matplotlib-1.0.1/lib/matplotlib/backends/backend_gdk.py --- matplotlib-0.99.3/lib/matplotlib/backends/backend_gdk.py 2009-07-31 15:14:40.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/backends/backend_gdk.py 2010-07-07 01:41:52.000000000 +0000 @@ -16,7 +16,7 @@ % (gtk.pygtk_version + pygtk_version_required)) del pygtk_version_required -import numpy as npy +import numpy as np import matplotlib from matplotlib._pylab_helpers import Gcf @@ -97,7 +97,9 @@ if gc.gdkGC.line_width > 0: self.gdkDrawable.draw_lines(gc.gdkGC, polygon) - def draw_image(self, x, y, im, bbox, clippath=None, clippath_trans=None): + def draw_image(self, gc, x, y, im): + bbox = gc.get_clip_rectangle() + if bbox != None: l,b,w,h = bbox.bounds #rectangle = (int(l), self.height-int(b+h), @@ -107,7 +109,7 @@ im.flipud_out() rows, cols, image_str = im.as_rgba_str() - image_array = npy.fromstring(image_str, npy.uint8) + image_array = np.fromstring(image_str, np.uint8) image_array.shape = rows, cols, 4 pixbuf = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, @@ -172,13 +174,13 @@ N = imw * imh # a numpixels by num fonts array - Xall = npy.zeros((N,1), npy.uint8) + Xall = np.zeros((N,1), np.uint8) image_str = font_image.as_str() - Xall[:,0] = npy.fromstring(image_str, npy.uint8) + Xall[:,0] = np.fromstring(image_str, np.uint8) # get the max alpha at each pixel - Xs = npy.amax(Xall,axis=1) + Xs = np.amax(Xall,axis=1) # convert it to it's proper shape Xs.shape = imh, imw @@ -306,7 +308,9 @@ layout, inkRect, logicalRect = self._get_pango_layout(s, prop) l, b, w, h = inkRect - return w, h+1, h + 1 + ll, lb, lw, lh = logicalRect + + return w, h + 1, h - lh def new_gc(self): return GraphicsContextGDK(renderer=self) @@ -379,7 +383,7 @@ if dash_list == None: self.gdkGC.line_style = gdk.LINE_SOLID else: - pixels = self.renderer.points_to_pixels(npy.asarray(dash_list)) + pixels = self.renderer.points_to_pixels(np.asarray(dash_list)) dl = [max(1, int(round(val))) for val in pixels] self.gdkGC.set_dashes(dash_offset, dl) self.gdkGC.line_style = gdk.LINE_ON_OFF_DASH diff -Nru matplotlib-0.99.3/lib/matplotlib/backends/backend_gtk.py matplotlib-1.0.1/lib/matplotlib/backends/backend_gtk.py --- matplotlib-0.99.3/lib/matplotlib/backends/backend_gtk.py 2009-08-22 21:06:12.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/backends/backend_gtk.py 2010-09-23 19:54:49.000000000 +0000 @@ -17,11 +17,14 @@ % (gtk.pygtk_version + pygtk_version_required)) del pygtk_version_required +_new_tooltip_api = (gtk.pygtk_version[1] >= 12) + import matplotlib -from matplotlib import verbose from matplotlib._pylab_helpers import Gcf from matplotlib.backend_bases import RendererBase, GraphicsContextBase, \ - FigureManagerBase, FigureCanvasBase, NavigationToolbar2, cursors + FigureManagerBase, FigureCanvasBase, NavigationToolbar2, cursors, TimerBase +from matplotlib.backend_bases import ShowBase + from matplotlib.backends.backend_gdk import RendererGDK, FigureCanvasGDK from matplotlib.cbook import is_string_like, is_writable_file_like from matplotlib.colors import colorConverter @@ -30,6 +33,7 @@ from matplotlib import lines from matplotlib import cbook +from matplotlib import verbose backend_version = "%d.%d.%d" % gtk.pygtk_version @@ -63,17 +67,12 @@ figManager.canvas.draw_idle() -def show(mainloop=True): - """ - Show all the figures and enter the gtk main loop - This should be the last line of your script - """ - for manager in Gcf.get_all_fig_managers(): - manager.window.show() +class Show(ShowBase): + def mainloop(self): + if gtk.main_level() == 0: + gtk.main() - if mainloop and gtk.main_level() == 0 and \ - len(Gcf.get_all_fig_managers())>0: - gtk.main() +show = Show() def new_figure_manager(num, *args, **kwargs): """ @@ -88,6 +87,48 @@ return manager +class TimerGTK(TimerBase): + ''' + Subclass of :class:`backend_bases.TimerBase` that uses GTK for timer events. + + Attributes: + * interval: The time between timer events in milliseconds. Default + is 1000 ms. + * single_shot: Boolean flag indicating whether this timer should + operate as single shot (run once and then stop). Defaults to False. + * callbacks: Stores list of (func, args) tuples that will be called + upon timer events. This list can be manipulated directly, or the + functions add_callback and remove_callback can be used. + ''' + def _timer_start(self): + # Need to stop it, otherwise we potentially leak a timer id that will + # never be stopped. + self._timer_stop() + self._timer = gobject.timeout_add(self._interval, self._on_timer) + + def _timer_stop(self): + if self._timer is not None: + gobject.source_remove(self._timer) + self._timer = None + + def _timer_set_interval(self): + # Only stop and restart it if the timer has already been started + if self._timer is not None: + self._timer_stop() + self._timer_start() + + def _on_timer(self): + TimerBase._on_timer(self) + + # Gtk timeout_add() requires that the callback returns True if it + # is to be called again. + if len(self.callbacks) > 0 and not self._single: + return True + else: + self._timer = None + return False + + class FigureCanvasGTK (gtk.DrawingArea, FigureCanvasBase): keyvald = {65507 : 'control', 65505 : 'shift', @@ -184,6 +225,7 @@ def destroy(self): #gtk.DrawingArea.destroy(self) + self.close_event() gobject.source_remove(self._idle_event_id) if self._idle_draw_id != 0: gobject.source_remove(self._idle_draw_id) @@ -407,6 +449,21 @@ def get_default_filetype(self): return 'png' + def new_timer(self, *args, **kwargs): + """ + Creates a new backend-specific subclass of :class:`backend_bases.Timer`. + This is useful for getting periodic events through the backend's native + event loop. Implemented only for backends with GUIs. + + optional arguments: + + *interval* + Timer interval in milliseconds + *callbacks* + Sequence of (func, args, kwargs) where func(*args, **kwargs) will + be executed by the timer every *interval*. + """ + return TimerGTK(*args, **kwargs) def flush_events(self): gtk.gdk.threads_enter() @@ -448,7 +505,7 @@ # diong a blanket catch here, but an not sure what a # better way is - JDH verbose.report('Could not load matplotlib icon: %s' % sys.exc_info()[1]) - + self.vbox = gtk.VBox() self.window.add(self.vbox) self.vbox.show() @@ -495,7 +552,7 @@ self.canvas.destroy() if self.toolbar: self.toolbar.destroy() - self.__dict__.clear() + self.__dict__.clear() #Is this needed? Other backends don't have it. if Gcf.get_num_fig_managers()==0 and \ not matplotlib.is_interactive() and \ @@ -555,17 +612,15 @@ self.win = window gtk.Toolbar.__init__(self) NavigationToolbar2.__init__(self, canvas) - self._idle_draw_id = 0 def set_message(self, s): - if self._idle_draw_id == 0: - self.message.set_label(s) + self.message.set_label(s) def set_cursor(self, cursor): self.canvas.window.set_cursor(cursord[cursor]) def release(self, event): - try: del self._imageBack + try: del self._pixmapBack except AttributeError: pass def dynamic_update(self): @@ -588,7 +643,8 @@ h = abs(y1 - y0) rect = [int(val)for val in min(x0,x1), min(y0, y1), w, h] - try: lastrect, imageBack = self._imageBack + try: + lastrect, pixmapBack = self._pixmapBack except AttributeError: #snap image back if event.inaxes is None: @@ -598,17 +654,11 @@ l,b,w,h = [int(val) for val in ax.bbox.bounds] b = int(height)-(b+h) axrect = l,b,w,h - self._imageBack = axrect, drawable.get_image(*axrect) - drawable.draw_rectangle(gc, False, *rect) - self._idle_draw_id = 0 + self._pixmapBack = axrect, gtk.gdk.Pixmap(drawable, w, h) + self._pixmapBack[1].draw_drawable(gc, drawable, l, b, 0, 0, w, h) else: - def idle_draw(*args): - drawable.draw_image(gc, imageBack, 0, 0, *lastrect) - drawable.draw_rectangle(gc, False, *rect) - self._idle_draw_id = 0 - return False - if self._idle_draw_id == 0: - self._idle_draw_id = gobject.idle_add(idle_draw) + drawable.draw_drawable(gc, pixmapBack, 0, 0, *lastrect) + drawable.draw_rectangle(gc, False, *rect) def _init_toolbar(self): @@ -618,7 +668,8 @@ def _init_toolbar2_4(self): basedir = os.path.join(matplotlib.rcParams['datapath'],'images') - self.tooltips = gtk.Tooltips() + if not _new_tooltip_api: + self.tooltips = gtk.Tooltips() for text, tooltip_text, image_file, callback in self.toolitems: if text is None: @@ -630,7 +681,10 @@ tbutton = gtk.ToolButton(image, text) self.insert(tbutton, -1) tbutton.connect('clicked', getattr(self, callback)) - tbutton.set_tooltip(self.tooltips, tooltip_text, 'Private') + if _new_tooltip_api: + tbutton.set_tooltip_text(tooltip_text) + else: + tbutton.set_tooltip(self.tooltips, tooltip_text, 'Private') toolitem = gtk.SeparatorToolItem() self.insert(toolitem, -1) @@ -653,7 +707,7 @@ filetypes=self.canvas.get_supported_filetypes(), default_filetype=self.canvas.get_default_filetype()) - def save_figure(self, button): + def save_figure(self, *args): fname, format = self.get_filechooser().get_filename_from_user() if fname: try: @@ -760,7 +814,8 @@ def _create_toolitems_2_4(self): # use the GTK+ 2.4 GtkToolbar API iconSize = gtk.ICON_SIZE_SMALL_TOOLBAR - self.tooltips = gtk.Tooltips() + if not _new_tooltip_api: + self.tooltips = gtk.Tooltips() for text, tooltip_text, image_num, callback, callback_arg, scroll \ in self.toolitems: @@ -778,15 +833,22 @@ tbutton.connect('clicked', getattr(self, callback)) if scroll: tbutton.connect('scroll_event', getattr(self, callback)) - tbutton.set_tooltip(self.tooltips, tooltip_text, 'Private') + if _new_tooltip_api: + tbutton.set_tooltip_text(tooltip_text) + else: + tbutton.set_tooltip(self.tooltips, tooltip_text, 'Private') # Axes toolitem, is empty at start, update() adds a menu if >=2 axes self.axes_toolitem = gtk.ToolItem() self.insert(self.axes_toolitem, 0) - self.axes_toolitem.set_tooltip ( - self.tooltips, - tip_text='Select axes that controls affect', - tip_private = 'Private') + if _new_tooltip_api: + self.axes_toolitem.set_tooltip_text( + 'Select axes that controls affect') + else: + self.axes_toolitem.set_tooltip ( + self.tooltips, + tip_text='Select axes that controls affect', + tip_private = 'Private') align = gtk.Alignment (xalign=0.5, yalign=0.5, xscale=0.0, yscale=0.0) self.axes_toolitem.add(align) @@ -908,7 +970,7 @@ filetypes=self.canvas.get_supported_filetypes(), default_filetype=self.canvas.get_default_filetype()) - def save_figure(self, button): + def save_figure(self, *args): fname, format = self.get_filechooser().get_filename_from_user() if fname: try: @@ -1168,7 +1230,6 @@ window_icon = None verbose.report('Could not load matplotlib icon: %s' % sys.exc_info()[1]) - def error_msg_gtk(msg, parent=None): if parent is not None: # find the toplevel gtk.Window parent = parent.get_toplevel() diff -Nru matplotlib-0.99.3/lib/matplotlib/backends/backend_macosx.py matplotlib-1.0.1/lib/matplotlib/backends/backend_macosx.py --- matplotlib-0.99.3/lib/matplotlib/backends/backend_macosx.py 2009-07-31 15:14:40.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/backends/backend_macosx.py 2011-01-05 15:59:56.000000000 +0000 @@ -6,6 +6,8 @@ from matplotlib._pylab_helpers import Gcf from matplotlib.backend_bases import RendererBase, GraphicsContextBase,\ FigureManagerBase, FigureCanvasBase, NavigationToolbar2 +from matplotlib.backend_bases import ShowBase + from matplotlib.cbook import maxdict from matplotlib.figure import Figure from matplotlib.path import Path @@ -19,19 +21,16 @@ import matplotlib from matplotlib.backends import _macosx -def show(): - """Show all the figures and enter the Cocoa mainloop. - This function will not return until all windows are closed or - the interpreter exits.""" - # Having a Python-level function "show" wrapping the built-in - # function "show" in the _macosx extension module allows us to - # to add attributes to "show". This is something ipython does. - _macosx.show() +class Show(ShowBase): + def mainloop(self): + _macosx.show() + +show = Show() class RendererMac(RendererBase): """ The renderer handles drawing/rendering operations. Most of the renderer's - methods forwards the command to the renderer's graphics context. The + methods forward the command to the renderer's graphics context. The renderer does not wrap a C object and is written in pure Python. """ @@ -50,34 +49,68 @@ def draw_path(self, gc, path, transform, rgbFace=None): if rgbFace is not None: - rgbFace = tuple(rgbFace) - gc.draw_path(path, transform, rgbFace) + rgbFace = tuple(rgbFace[:3]) + linewidth = gc.get_linewidth() + gc.draw_path(path, transform, linewidth, rgbFace) def draw_markers(self, gc, marker_path, marker_trans, path, trans, rgbFace=None): if rgbFace is not None: - rgbFace = tuple(rgbFace) - gc.draw_markers(marker_path, marker_trans, path, trans, rgbFace) - - def draw_path_collection(self, *args): - gc = self.gc - args = args[:13] - gc.draw_path_collection(*args) - - def draw_quad_mesh(self, *args): - gc = self.gc - gc.draw_quad_mesh(*args) + rgbFace = tuple(rgbFace[:3]) + linewidth = gc.get_linewidth() + gc.draw_markers(marker_path, marker_trans, path, trans, linewidth, rgbFace) + + def draw_path_collection(self, gc, master_transform, paths, all_transforms, + offsets, offsetTrans, facecolors, edgecolors, + linewidths, linestyles, antialiaseds, urls): + cliprect = gc.get_clip_rectangle() + clippath, clippath_transform = gc.get_clip_path() + if all_transforms: + transforms = [numpy.dot(master_transform, t) for t in all_transforms] + else: + transforms = [master_transform] + gc.draw_path_collection(cliprect, + clippath, + clippath_transform, + paths, + transforms, + offsets, + offsetTrans, + facecolors, + edgecolors, + linewidths, + linestyles, + antialiaseds) + + def draw_quad_mesh(self, gc, master_transform, meshWidth, meshHeight, + coordinates, offsets, offsetTrans, facecolors, + antialiased, showedges): + cliprect = gc.get_clip_rectangle() + clippath, clippath_transform = gc.get_clip_path() + gc.draw_quad_mesh(master_transform, + cliprect, + clippath, + clippath_transform, + meshWidth, + meshHeight, + coordinates, + offsets, + offsetTrans, + facecolors, + antialiased, + showedges) def new_gc(self): self.gc.save() self.gc.set_hatch(None) return self.gc - def draw_image(self, x, y, im, bbox, clippath=None, clippath_trans=None): + def draw_image(self, gc, x, y, im): im.flipud_out() nrows, ncols, data = im.as_rgba_str() - self.gc.draw_image(x, y, nrows, ncols, data, bbox, clippath, clippath_trans) + gc.draw_image(x, y, nrows, ncols, data, gc.get_clip_rectangle(), + *gc.get_clip_path()) im.flipud_out() - + def draw_tex(self, gc, x, y, s, prop, angle): # todo, handle props, angle, origins size = prop.get_size_in_points() @@ -128,7 +161,7 @@ def flipy(self): return False - + def points_to_pixels(self, points): return points/72.0 * self.dpi @@ -147,6 +180,11 @@ GraphicsContextBase.__init__(self) _macosx.GraphicsContext.__init__(self) + def set_alpha(self, alpha): + GraphicsContextBase.set_alpha(self, alpha) + _alpha = self.get_alpha() + _macosx.GraphicsContext.set_alpha(self, _alpha) + def set_foreground(self, fg, isRGB=False): GraphicsContextBase.set_foreground(self, fg, isRGB) rgb = self.get_rgb() @@ -168,7 +206,7 @@ _macosx.GraphicsContext.set_clip_path(self, path) ######################################################################## -# +# # The following functions and classes are for pylab and implement # window/figure managers, etc... # @@ -190,6 +228,9 @@ """ Create a new figure manager instance """ + if not _macosx.verify_main_display(): + import warnings + warnings.warn("Python is not installed as a framework. The MacOSX backend may not work correctly if Python is not installed as a framework. Please see the Python documentation for more information on installing Python as a framework on Mac OS X") FigureClass = kwargs.pop('FigureClass', Figure) figure = FigureClass(*args, **kwargs) canvas = FigureCanvasMac(figure) @@ -281,7 +322,7 @@ self.toolbar = NavigationToolbar2Mac(canvas) else: self.toolbar = None - if self.toolbar is not None: + if self.toolbar is not None: self.toolbar.update() def notify_axes_change(fig): @@ -300,7 +341,7 @@ Gcf.destroy(self.num) class NavigationToolbarMac(_macosx.NavigationToolbar): - + def __init__(self, canvas): self.canvas = canvas basedir = os.path.join(matplotlib.rcParams['datapath'], "images") @@ -331,7 +372,7 @@ assert magic=="P6" assert len(imagedata)==width*height*3 # 3 colors in RGB return (width, height, imagedata) - + def panx(self, direction): axes = self.canvas.figure.axes selected = self.get_active() @@ -360,7 +401,7 @@ axes[i].yaxis.zoom(direction) self.canvas.invalidate() - def save_figure(self): + def save_figure(self, *args): filename = _macosx.choose_save_file('Save the figure') if filename is None: # Cancel return @@ -384,7 +425,7 @@ def set_cursor(self, cursor): _macosx.set_cursor(cursor) - def save_figure(self): + def save_figure(self, *args): filename = _macosx.choose_save_file('Save the figure') if filename is None: # Cancel return @@ -401,9 +442,9 @@ _macosx.NavigationToolbar2.set_message(self, message.encode('utf-8')) ######################################################################## -# +# # Now just provide the standard names that backend.__init__ is expecting -# +# ######################################################################## diff -Nru matplotlib-0.99.3/lib/matplotlib/backends/backend_mixed.py matplotlib-1.0.1/lib/matplotlib/backends/backend_mixed.py --- matplotlib-0.99.3/lib/matplotlib/backends/backend_mixed.py 2010-03-09 14:20:20.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/backends/backend_mixed.py 2010-07-07 01:41:52.000000000 +0000 @@ -58,6 +58,8 @@ finalize flipy get_canvas_width_height get_image_magnification get_texmanager get_text_width_height_descent new_gc open_group option_image_nocomposite points_to_pixels strip_math + start_filter stop_filter draw_gouraud_triangle + draw_gouraud_triangles option_scale_image """.split() def _set_current_renderer(self, renderer): self._renderer = renderer @@ -117,10 +119,12 @@ image = frombuffer(buffer, w, h, True) image.is_grayscale = False image.flipud_out() + gc = self._renderer.new_gc() self._renderer.draw_image( + gc, float(l)/self.dpi*72., (float(height) - b - h)/self.dpi*72., - image, None) + image) self._raster_renderer = None self._rasterizing = False diff -Nru matplotlib-0.99.3/lib/matplotlib/backends/backend_pdf.py matplotlib-1.0.1/lib/matplotlib/backends/backend_pdf.py --- matplotlib-0.99.3/lib/matplotlib/backends/backend_pdf.py 2010-03-09 14:20:20.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/backends/backend_pdf.py 2010-07-07 01:41:52.000000000 +0000 @@ -5,6 +5,7 @@ """ from __future__ import division +import codecs import os import re import sys @@ -12,7 +13,7 @@ import warnings import zlib -import numpy as npy +import numpy as np from cStringIO import StringIO from datetime import datetime @@ -135,15 +136,30 @@ # need to use %f with some precision. Perhaps the precision # should adapt to the magnitude of the number? elif isinstance(obj, float): - if not npy.isfinite(obj): + if not np.isfinite(obj): raise ValueError, "Can only output finite numbers in PDF" r = "%.10f" % obj return r.rstrip('0').rstrip('.') + # Booleans. Needs to be tested before integers since + # isinstance(True, int) is true. + elif isinstance(obj, bool): + return ['false', 'true'][obj] + # Integers are written as such. elif isinstance(obj, (int, long)): return "%d" % obj + # Unicode strings are encoded in UTF-16BE with byte-order mark. + elif isinstance(obj, unicode): + try: + # But maybe it's really ASCII? + s = obj.encode('ASCII') + return pdfRepr(s) + except UnicodeEncodeError: + s = codecs.BOM_UTF16_BE + obj.encode('UTF-16BE') + return pdfRepr(s) + # Strings are written in parentheses, with backslashes and parens # escaped. Actually balanced parens are allowed, but it is # simpler to escape them all. TODO: cut long strings into lines; @@ -169,10 +185,6 @@ r.append("]") return fill(r) - # Booleans. - elif isinstance(obj, bool): - return ['false', 'true'][obj] - # The null keyword. elif obj is None: return 'null' @@ -268,7 +280,7 @@ gsave='q', grestore='Q', textpos='Td', selectfont='Tf', textmatrix='Tm', show='Tj', showkern='TJ', - setlinewidth='w', clip='W') + setlinewidth='w', clip='W', shading='sh') Op = Bunch(**dict([(name, Operator(value)) for name, value in _pdfops.items()])) @@ -348,7 +360,7 @@ self.compressobj = None class PdfFile(object): - """PDF file with one page.""" + """PDF file object.""" def __init__(self, filename): self.nextObject = 1 # next free object id @@ -362,6 +374,8 @@ else: raise ValueError("filename must be a path or a file-like object") + self._core14fontdir = os.path.join( + rcParams['datapath'], 'fonts', 'pdfcorefonts') self.fh = fh self.currentstream = None # stream object to write to, if any fh.write("%PDF-1.4\n") # 1.4 is the first version to have alpha @@ -371,12 +385,12 @@ fh.write("%\254\334 \253\272\n") self.rootObject = self.reserveObject('root') - self.infoObject = self.reserveObject('info') self.pagesObject = self.reserveObject('pages') self.pageList = [] self.fontObject = self.reserveObject('fonts') self.alphaStateObject = self.reserveObject('extended graphics states') self.hatchObject = self.reserveObject('tiling patterns') + self.gouraudObject = self.reserveObject('Gouraud triangles') self.XObjectObject = self.reserveObject('external objects') self.resourceObject = self.reserveObject('resources') @@ -384,13 +398,16 @@ 'Pages': self.pagesObject } self.writeObject(self.rootObject, root) - info = { 'Creator': 'matplotlib ' + __version__ \ - + ', http://matplotlib.sf.net', - 'Producer': 'matplotlib pdf backend', - 'CreationDate': datetime.today() } - - # Possible TODO: Title, Author, Subject, Keywords - self.writeObject(self.infoObject, info) + svn_special_string = '$Rev: 8292 $' # on checkout, gets replaced by svn client + if ':' in svn_special_string: + revision = ' r'+svn_special_string.strip('$').split(':')[1].strip() + else: + revision = '' + self.infoDict = { + 'Creator': 'matplotlib %s, http://matplotlib.sf.net' % __version__, + 'Producer': 'matplotlib pdf backend%s' % revision, + 'CreationDate': datetime.today() + } self.fontNames = {} # maps filenames to internal font names self.nextFont = 1 # next free internal font name @@ -403,6 +420,7 @@ self.nextAlphaState = 1 self.hatchPatterns = {} self.nextHatch = 1 + self.gouraudTriangles = [] self.images = {} self.nextImage = 1 @@ -421,6 +439,7 @@ 'XObject': self.XObjectObject, 'ExtGState': self.alphaStateObject, 'Pattern': self.hatchObject, + 'Shading': self.gouraudObject, 'ProcSet': procsets } self.writeObject(self.resourceObject, resources) @@ -452,6 +471,7 @@ dict([(val[0], val[1]) for val in self.alphaStates.values()])) self.writeHatches() + self.writeGouraudTriangles() xobjects = dict(self.images.values()) for tup in self.markers.values(): xobjects[tup[0]] = tup[1] @@ -464,6 +484,7 @@ { 'Type': Name('Pages'), 'Kids': self.pageList, 'Count': len(self.pageList) }) + self.writeInfoDict() # Finalize the file self.writeXref() @@ -502,7 +523,11 @@ if is_string_like(fontprop): filename = fontprop elif rcParams['pdf.use14corefonts']: - filename = findfont(fontprop, fontext='afm') + filename = findfont( + fontprop, fontext='afm', directory=self._core14fontdir) + if filename is None: + filename = findfont( + "Helvetica", fontext='afm', directory=self._core14fontdir) else: filename = findfont(fontprop) @@ -629,7 +654,7 @@ if 0: flags |= 1 << 17 # TODO: small caps if 0: flags |= 1 << 18 # TODO: force bold - ft2font = FT2Font(fontfile) + ft2font = FT2Font(str(fontfile)) descriptor = { 'Type': Name('FontDescriptor'), @@ -1050,6 +1075,49 @@ self.endStream() self.writeObject(self.hatchObject, hatchDict) + def addGouraudTriangles(self, points, colors): + name = Name('GT%d' % len(self.gouraudTriangles)) + self.gouraudTriangles.append((name, points, colors)) + return name + + def writeGouraudTriangles(self): + gouraudDict = dict() + for name, points, colors in self.gouraudTriangles: + ob = self.reserveObject('Gouraud triangle') + gouraudDict[name] = ob + shape = points.shape + flat_points = points.reshape((shape[0] * shape[1], 2)) + flat_colors = colors.reshape((shape[0] * shape[1], 4)) + points_min = np.min(flat_points, axis=0) - (1 << 8) + points_max = np.max(flat_points, axis=0) + (1 << 8) + factor = float(0xffffffff) / (points_max - points_min) + + self.beginStream( + ob.id, None, + { 'ShadingType': 4, + 'BitsPerCoordinate': 32, + 'BitsPerComponent': 8, + 'BitsPerFlag': 8, + 'ColorSpace': Name('DeviceRGB'), + 'AntiAlias': True, + 'Decode': [points_min[0], points_max[0], + points_min[1], points_max[1], + 0, 1, 0, 1, 0, 1] + }) + + streamarr = np.empty( + (shape[0] * shape[1],), + dtype=[('flags', 'u1'), + ('points', '>u4', (2,)), + ('colors', 'u1', (3,))]) + streamarr['flags'] = 0 + streamarr['points'] = (flat_points - points_min) * factor + streamarr['colors'] = flat_colors[:, :3] * 255.0 + + self.write(streamarr.tostring()) + self.endStream() + self.writeObject(self.gouraudObject, gouraudDict) + def imageObject(self, image): """Return name of an image XObject representing the given image.""" @@ -1069,7 +1137,7 @@ def _rgb(self, im): h,w,s = im.as_rgba_str() - rgba = npy.fromstring(s, npy.uint8) + rgba = np.fromstring(s, np.uint8) rgba.shape = (h, w, 4) rgb = rgba[:,:,:3] a = rgba[:,:,3:] @@ -1077,13 +1145,13 @@ def _gray(self, im, rc=0.3, gc=0.59, bc=0.11): rgbat = im.as_rgba_str() - rgba = npy.fromstring(rgbat[2], npy.uint8) + rgba = np.fromstring(rgbat[2], np.uint8) rgba.shape = (rgbat[0], rgbat[1], 4) - rgba_f = rgba.astype(npy.float32) + rgba_f = rgba.astype(np.float32) r = rgba_f[:,:,0] g = rgba_f[:,:,1] b = rgba_f[:,:,2] - gray = (r*rc + g*gc + b*bc).astype(npy.uint8) + gray = (r*rc + g*gc + b*bc).astype(np.uint8) return rgbat[0], rgbat[1], gray.tostring() def writeImages(self): @@ -1160,8 +1228,12 @@ for points, code in path.iter_segments(transform, clip=clip, simplify=simplify): if code == Path.MOVETO: + # This is allowed anywhere in the path cmds.extend(points) cmds.append(Op.moveto) + elif last_points is None: + # The other operations require a previous point + raise ValueError, 'Path lacks initial MOVETO' elif code == Path.LINETO: cmds.extend(points) cmds.append(Op.lineto) @@ -1226,6 +1298,31 @@ if borken: raise AssertionError, 'Indirect object does not exist' + def writeInfoDict(self): + """Write out the info dictionary, checking it for good form""" + + is_date = lambda x: isinstance(x, datetime) + check_trapped = lambda x: isinstance(x, Name) and x.name in \ + ('True', 'False', 'Unknown') + keywords = {'Title': is_string_like, + 'Author': is_string_like, + 'Subject': is_string_like, + 'Keywords': is_string_like, + 'Creator': is_string_like, + 'Producer': is_string_like, + 'CreationDate': is_date, + 'ModDate': is_date, + 'Trapped': check_trapped} + for k in self.infoDict.keys(): + if k not in keywords: + warnings.warn('Unknown infodict keyword: %s' % k) + else: + if not keywords[k](self.infoDict[k]): + warnings.warn('Bad value for infodict keyword %s' % k) + + self.infoObject = self.reserveObject('info') + self.writeObject(self.infoObject, self.infoDict) + def writeTrailer(self): """Write out the PDF trailer.""" @@ -1289,13 +1386,7 @@ def get_image_magnification(self): return self.image_dpi/72.0 - def draw_image(self, x, y, im, bbox, clippath=None, clippath_trans=None): - gc = self.new_gc() - if bbox is not None: - gc.set_clip_rectangle(bbox) - if clippath is not None: - clippath = TransformedPath(clippath, clippath_trans) - gc.set_clip_path(clippath) + def draw_image(self, gc, x, y, im): self.check_gc(gc) h, w = im.get_size_out() @@ -1337,6 +1428,27 @@ lastx, lasty = x, y output(Op.grestore) + def draw_gouraud_triangle(self, gc, points, colors, trans): + self.draw_gouraud_triangles(gc, points.reshape((1, 3, 2)), + colors.reshape((1, 3, 4)), trans) + + def draw_gouraud_triangles(self, gc, points, colors, trans): + assert len(points) == len(colors) + assert points.ndim == 3 + assert points.shape[1] == 3 + assert points.shape[2] == 2 + assert colors.ndim == 3 + assert colors.shape[1] == 3 + assert colors.shape[2] == 4 + + shape = points.shape + points = points.reshape((shape[0] * shape[1], 2)) + tpoints = trans.transform(points) + tpoints = tpoints.reshape(shape) + name = self.file.addGouraudTriangles(tpoints, colors) + self.check_gc(gc) + self.file.output(name, Op.shading) + def _setup_textpos(self, x, y, descent, angle, oldx=0, oldy=0, olddescent=0, oldangle=0): if angle == oldangle == 0: self.file.output(x - oldx, (y + descent) - (oldy + olddescent), Op.textpos) @@ -1680,7 +1792,12 @@ key = hash(prop) font = self.afm_font_cache.get(key) if font is None: - filename = findfont(prop, fontext='afm') + filename = findfont( + prop, fontext='afm', directory=self.file._core14fontdir) + if filename is None: + filename = findfont( + "Helvetica", fontext='afm', + directory=self.file._core14fontdir) font = self.afm_font_cache.get(filename) if font is None: fh = file(filename) @@ -1888,9 +2005,9 @@ try: different = bool(ours != theirs) except ValueError: - ours = npy.asarray(ours) - theirs = npy.asarray(theirs) - different = ours.shape != theirs.shape or npy.any(ours != theirs) + ours = np.asarray(ours) + theirs = np.asarray(theirs) + different = ours.shape != theirs.shape or np.any(ours != theirs) if different: break @@ -1943,18 +2060,18 @@ """ A multi-page PDF file. - Use like this: + Use like this:: - # Initialize: - pdf_pages = PdfPages('foo.pdf') + # Initialize: + pp = PdfPages('foo.pdf') - # As many times as you like, create a figure fig, then either: - fig.savefig(pdf_pages, format='pdf') # note the format argument! - # or: - pdf_pages.savefig(fig) + # As many times as you like, create a figure fig, then either: + fig.savefig(pp, format='pdf') # note the format argument! + # or: + pp.savefig(fig) - # Once you are done, remember to close the object: - pdf_pages.close() + # Once you are done, remember to close the object: + pp.close() (In reality PdfPages is a thin wrapper around PdfFile, in order to avoid confusion when using savefig and forgetting the format @@ -1978,6 +2095,14 @@ self._file.close() self._file = None + def infodict(self): + """ + Return a modifiable information dictionary object + (see PDF reference section 10.2.1 'Document Information + Dictionary'). + """ + return self._file.infoDict + def savefig(self, figure=None, **kwargs): """ Save the Figure instance *figure* to this file as a new page. diff -Nru matplotlib-0.99.3/lib/matplotlib/backends/backend_ps.py matplotlib-1.0.1/lib/matplotlib/backends/backend_ps.py --- matplotlib-0.99.3/lib/matplotlib/backends/backend_ps.py 2010-03-09 14:20:20.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/backends/backend_ps.py 2010-11-04 18:28:10.000000000 +0000 @@ -36,7 +36,7 @@ from matplotlib.backends.backend_mixed import MixedModeRenderer -import numpy as npy +import numpy as np import binascii import re try: @@ -127,7 +127,7 @@ #ok, neither are None:, assuming iterable if len(seq1) != len(seq2): return False - return npy.alltrue(npy.equal(seq1, seq2)) + return np.alltrue(np.equal(seq1, seq2)) class RendererPS(RendererBase): @@ -170,6 +170,9 @@ self.used_characters = {} self.mathtext_parser = MathTextParser("PS") + self._afm_font_dir = os.path.join( + rcParams['datapath'], 'fonts', 'afm') + def track_characters(self, font, s): """Keeps track of which characters are required from each font.""" @@ -313,10 +316,13 @@ key = hash(prop) font = self.afmfontd.get(key) if font is None: - fname = findfont(prop, fontext='afm') + fname = findfont(prop, fontext='afm', directory=self._afm_font_dir) + if fname is None: + fname = findfont( + "Helvetica", fontext='afm', directory=self._afm_font_dir) font = self.afmfontd.get(fname) if font is None: - font = AFM(file(findfont(prop, fontext='afm'))) + font = AFM(file(fname)) self.afmfontd[fname] = font self.afmfontd[key] = font return font @@ -342,20 +348,20 @@ def _rgb(self, im): h,w,s = im.as_rgba_str() - rgba = npy.fromstring(s, npy.uint8) + rgba = np.fromstring(s, np.uint8) rgba.shape = (h, w, 4) rgb = rgba[:,:,:3] return h, w, rgb.tostring() def _gray(self, im, rc=0.3, gc=0.59, bc=0.11): rgbat = im.as_rgba_str() - rgba = npy.fromstring(rgbat[2], npy.uint8) + rgba = np.fromstring(rgbat[2], np.uint8) rgba.shape = (rgbat[0], rgbat[1], 4) - rgba_f = rgba.astype(npy.float32) + rgba_f = rgba.astype(np.float32) r = rgba_f[:,:,0] g = rgba_f[:,:,1] b = rgba_f[:,:,2] - gray = (r*rc + g*gc + b*bc).astype(npy.uint8) + gray = (r*rc + g*gc + b*bc).astype(np.uint8) return rgbat[0], rgbat[1], gray.tostring() def _hex_lines(self, s, chars_per_line=128): @@ -375,32 +381,60 @@ """ return self.image_magnification - def draw_image(self, x, y, im, bbox, clippath=None, clippath_trans=None): + def option_scale_image(self): """ - Draw the Image instance into the current axes; x is the - distance in pixels from the left hand side of the canvas and y - is the distance from bottom - - bbox is a matplotlib.transforms.BBox instance for clipping, or - None + ps backend support arbitrary scaling of image. """ + return True - im.flipud_out() - + def _get_image_h_w_bits_command(self, im): if im.is_grayscale: h, w, bits = self._gray(im) imagecmd = "image" else: h, w, bits = self._rgb(im) imagecmd = "false 3 colorimage" + + return h, w, bits, imagecmd + + def draw_image(self, gc, x, y, im, dx=None, dy=None, transform=None): + """ + Draw the Image instance into the current axes; x is the + distance in pixels from the left hand side of the canvas and y + is the distance from bottom + + dx, dy is the width and height of the image. If a transform + (which must be an affine transform) is given, x, y, dx, dy are + interpreted as the coordinate of the transform. + """ + + im.flipud_out() + + h, w, bits, imagecmd = self._get_image_h_w_bits_command(im) hexlines = '\n'.join(self._hex_lines(bits)) - xscale, yscale = ( - w/self.image_magnification, h/self.image_magnification) + if dx is None: + xscale = w / self.image_magnification + else: + xscale = dx + + if dy is None: + yscale = h/self.image_magnification + else: + yscale = dy + + + if transform is None: + matrix = "1 0 0 1 0 0" + else: + matrix = " ".join(map(str, transform.to_values())) figh = self.height*72 #print 'values', origin, flipud, figh, h, y + bbox = gc.get_clip_rectangle() + clippath, clippath_trans = gc.get_clip_path() + clip = [] if bbox is not None: clipx,clipy,clipw,cliph = bbox.bounds @@ -413,6 +447,7 @@ #y = figh-(y+h) ps = """gsave %(clip)s +[%(matrix)s] concat %(x)s %(y)s translate %(xscale)s %(yscale)s scale /DataString %(w)s string def @@ -511,10 +546,9 @@ ps = '\n'.join(ps_cmd) self._draw_ps(ps, gc, rgbFace, fill=False, stroke=False) - def draw_path_collection(self, master_transform, cliprect, clippath, - clippath_trans, paths, all_transforms, offsets, - offsetTrans, facecolors, edgecolors, linewidths, - linestyles, antialiaseds, urls): + def draw_path_collection(self, gc, master_transform, paths, all_transforms, + offsets, offsetTrans, facecolors, edgecolors, + linewidths, linestyles, antialiaseds, urls): write = self._pswriter.write path_codes = [] @@ -528,13 +562,11 @@ write('\n'.join(ps_cmd)) path_codes.append(name) - for xo, yo, path_id, gc, rgbFace in self._iter_collection( - path_codes, cliprect, clippath, clippath_trans, - offsets, offsetTrans, facecolors, edgecolors, + for xo, yo, path_id, gc0, rgbFace in self._iter_collection( + gc, path_codes, offsets, offsetTrans, facecolors, edgecolors, linewidths, linestyles, antialiaseds, urls): - ps = "%g %g %s" % (xo, yo, path_id) - self._draw_ps(ps, gc, rgbFace) + self._draw_ps(ps, gc0, rgbFace) self._path_collection_id += 1 @@ -578,8 +610,6 @@ draw a Text instance """ # local to avoid repeated attribute lookups - - write = self._pswriter.write if debugPS: write("% text\n") @@ -590,69 +620,7 @@ elif ismath: return self.draw_mathtext(gc, x, y, s, prop, angle) - elif isinstance(s, unicode): - return self.draw_unicode(gc, x, y, s, prop, angle) - elif rcParams['ps.useafm']: - font = self._get_font_afm(prop) - - l,b,w,h = font.get_str_bbox(s) - - fontsize = prop.get_size_in_points() - l *= 0.001*fontsize - b *= 0.001*fontsize - w *= 0.001*fontsize - h *= 0.001*fontsize - - if angle==90: l,b = -b, l # todo generalize for arb rotations - - pos = _nums_to_str(x-l, y-b) - thetext = '(%s)' % s - fontname = font.get_fontname() - fontsize = prop.get_size_in_points() - rotate = '%1.1f rotate' % angle - setcolor = '%1.3f %1.3f %1.3f setrgbcolor' % gc.get_rgb()[:3] - #h = 0 - ps = """\ -gsave -/%(fontname)s findfont -%(fontsize)s scalefont -setfont -%(pos)s moveto -%(rotate)s -%(thetext)s -%(setcolor)s -show -grestore - """ % locals() - self._draw_ps(ps, gc, None) - - else: - font = self._get_font_ttf(prop) - font.set_text(s, 0, flags=LOAD_NO_HINTING) - self.track_characters(font, s) - - self.set_color(*gc.get_rgb()) - self.set_font(font.get_sfnt()[(1,0,0,6)], prop.get_size_in_points()) - write("%s m\n"%_nums_to_str(x,y)) - if angle: - write("gsave\n") - write("%s rotate\n"%_num_to_str(angle)) - descent = font.get_descent() / 64.0 - if descent: - write("0 %s rmoveto\n"%_num_to_str(descent)) - write("(%s) show\n"%quote_ps_string(s)) - if angle: - write("grestore\n") - - def new_gc(self): - return GraphicsContextPS() - - def draw_unicode(self, gc, x, y, s, prop, angle): - """draw a unicode string. ps doesn't have unicode support, so - we have to do this the hard way - """ - if rcParams['ps.useafm']: self.set_color(*gc.get_rgb()) font = self._get_font_afm(prop) @@ -740,6 +708,9 @@ """ % locals() self._pswriter.write(ps) + def new_gc(self): + return GraphicsContextPS() + def draw_mathtext(self, gc, x, y, s, prop, angle): """ @@ -761,6 +732,57 @@ """ % locals() self._pswriter.write(ps) + def draw_gouraud_triangle(self, gc, points, colors, trans): + self.draw_gouraud_triangles(gc, points.reshape((1, 3, 2)), + colors.reshape((1, 3, 4)), trans) + + def draw_gouraud_triangles(self, gc, points, colors, trans): + assert len(points) == len(colors) + assert points.ndim == 3 + assert points.shape[1] == 3 + assert points.shape[2] == 2 + assert colors.ndim == 3 + assert colors.shape[1] == 3 + assert colors.shape[2] == 4 + + points = trans.transform(points) + + shape = points.shape + flat_points = points.reshape((shape[0] * shape[1], 2)) + flat_colors = colors.reshape((shape[0] * shape[1], 4)) + points_min = np.min(flat_points, axis=0) - (1 << 8) + points_max = np.max(flat_points, axis=0) + (1 << 8) + factor = float(0xffffffff) / (points_max - points_min) + + xmin, ymin = points_min + xmax, ymax = points_max + + streamarr = np.empty( + (shape[0] * shape[1],), + dtype=[('flags', 'u1'), + ('points', '>u4', (2,)), + ('colors', 'u1', (3,))]) + streamarr['flags'] = 0 + streamarr['points'] = (flat_points - points_min) * factor + streamarr['colors'] = flat_colors[:, :3] * 255.0 + + stream = quote_ps_string(streamarr.tostring()) + + self._pswriter.write(""" +gsave +<< /ShadingType 4 + /ColorSpace [/DeviceRGB] + /BitsPerCoordinate 32 + /BitsPerComponent 8 + /BitsPerFlag 8 + /AntiAlias true + /Decode [ %(xmin)f %(xmax)f %(ymin)f %(ymax)f 0 1 0 1 0 1 ] + /DataSource (%(stream)s) +>> +shfill +grestore +""" % locals()) + def _draw_ps(self, ps, gc, rgbFace, fill=True, stroke=True, command=None): """ Emit the PostScript sniplet 'ps' with all the attributes from 'gc' @@ -846,6 +868,8 @@ return manager class FigureCanvasPS(FigureCanvasBase): + _renderer_class = RendererPS + def draw(self): pass @@ -912,7 +936,6 @@ """ isEPSF = format == 'eps' passed_in_file_object = False - fd, tmpfile = mkstemp() if is_string_like(outfile): title = outfile elif is_writable_file_like(outfile): @@ -920,8 +943,9 @@ passed_in_file_object = True else: raise ValueError("outfile must be a path or a file-like object") - os.close(fd) - fh = file(tmpfile, 'w') + + fd, tmpfile = mkstemp() + fh = os.fdopen(fd, 'w') # find the appropriate papertype width, height = self.figure.get_size_inches() @@ -979,7 +1003,8 @@ # mixed mode rendering _bbox_inches_restore = kwargs.pop("bbox_inches_restore", None) - ps_renderer = RendererPS(width, height, self._pswriter, imagedpi=dpi) + ps_renderer = self._renderer_class(width, height, self._pswriter, + imagedpi=dpi) renderer = MixedModeRenderer(self.figure, width, height, dpi, ps_renderer, bbox_inches_restore=_bbox_inches_restore) @@ -1018,12 +1043,20 @@ if not rcParams['ps.useafm']: for font_filename, chars in ps_renderer.used_characters.values(): if len(chars): - font = FT2Font(font_filename) + font = FT2Font(str(font_filename)) cmap = font.get_charmap() glyph_ids = [] for c in chars: gind = cmap.get(c) or 0 glyph_ids.append(gind) + + fonttype = rcParams['ps.fonttype'] + + # Can not use more than 255 characters from a + # single font for Type 3 + if len(glyph_ids) > 255: + fonttype = 42 + # The ttf to ps (subsetting) support doesn't work for # OpenType fonts that are Postscript inside (like the # STIX fonts). This will simply turn that off to avoid @@ -1031,8 +1064,7 @@ if is_opentype_cff_font(font_filename): raise RuntimeError("OpenType CFF fonts can not be saved using the internal Postscript backend at this time.\nConsider using the Cairo backend.") else: - fonttype = rcParams['ps.fonttype'] - convert_ttf_to_ps(font_filename, fh, rcParams['ps.fonttype'], glyph_ids) + convert_ttf_to_ps(font_filename, fh, fonttype, glyph_ids) print >>fh, "end" print >>fh, "%%EndProlog" @@ -1059,10 +1091,13 @@ xpdf_distill(tmpfile, isEPSF, ptype=papertype, bbox=bbox) if passed_in_file_object: - fh = file(tmpfile) + fh = open(tmpfile) print >>outfile, fh.read() else: + open(outfile, 'w') + mode = os.stat(outfile).st_mode shutil.move(tmpfile, outfile) + os.chmod(outfile, mode) def _print_figure_tex(self, outfile, format, dpi, facecolor, edgecolor, orientation, isLandscape, papertype, @@ -1077,8 +1112,7 @@ # write to a temp file, we'll move it to outfile when done fd, tmpfile = mkstemp() - os.close(fd) - fh = file(tmpfile, 'w') + fh = os.fdopen(fd, 'w') self.figure.dpi = 72 # ignore the dpi kwarg width, height = self.figure.get_size_inches() @@ -1111,7 +1145,8 @@ # mixed mode rendering _bbox_inches_restore = kwargs.pop("bbox_inches_restore", None) - ps_renderer = RendererPS(width, height, self._pswriter, imagedpi=dpi) + ps_renderer = self._renderer_class(width, height, + self._pswriter, imagedpi=dpi) renderer = MixedModeRenderer(self.figure, width, height, dpi, ps_renderer, bbox_inches_restore=_bbox_inches_restore) @@ -1187,22 +1222,30 @@ font_preamble = texmanager.get_font_preamble() custom_preamble = texmanager.get_custom_preamble() - convert_psfrags(tmpfile, ps_renderer.psfrag, font_preamble, - custom_preamble, paperWidth, paperHeight, - orientation) + psfrag_rotated = convert_psfrags(tmpfile, ps_renderer.psfrag, + font_preamble, + custom_preamble, paperWidth, paperHeight, + orientation) if rcParams['ps.usedistiller'] == 'ghostscript': - gs_distill(tmpfile, isEPSF, ptype=papertype, bbox=bbox) + gs_distill(tmpfile, isEPSF, ptype=papertype, bbox=bbox, + rotated=psfrag_rotated) elif rcParams['ps.usedistiller'] == 'xpdf': - xpdf_distill(tmpfile, isEPSF, ptype=papertype, bbox=bbox) + xpdf_distill(tmpfile, isEPSF, ptype=papertype, bbox=bbox, + rotated=psfrag_rotated) elif rcParams['text.usetex']: if False: pass # for debugging - else: gs_distill(tmpfile, isEPSF, ptype=papertype, bbox=bbox) + else: gs_distill(tmpfile, isEPSF, ptype=papertype, bbox=bbox, + rotated=psfrag_rotated) if isinstance(outfile, file): fh = file(tmpfile) print >>outfile, fh.read() - else: shutil.move(tmpfile, outfile) + else: + open(outfile, 'w') + mode = os.stat(outfile).st_mode + shutil.move(tmpfile, outfile) + os.chmod(outfile, mode) def convert_psfrags(tmpfile, psfrags, font_preamble, custom_preamble, paperWidth, paperHeight, orientation): @@ -1294,25 +1337,42 @@ os.remove(outfile) os.remove(epsfile) shutil.move(psfile, tmpfile) + + # check if the dvips created a ps in landscape paper. Somehow, + # above latex+dvips results in a ps file in a landscape mode for a + # certain figure sizes (e.g., 8.3in,5.8in which is a5). And the + # bounding box of the final output got messed up. We check see if + # the generated ps file is in landscape and return this + # information. The return value is used in pstoeps step to recover + # the correct bounding box. 2010-06-05 JJL + if "Landscape" in open(tmpfile).read(1000): + psfrag_rotated = True + else: + psfrag_rotated = False + if not debugPS: for fname in glob.glob(tmpfile+'.*'): os.remove(fname) + return psfrag_rotated -def gs_distill(tmpfile, eps=False, ptype='letter', bbox=None): +def gs_distill(tmpfile, eps=False, ptype='letter', bbox=None, rotated=False): """ Use ghostscript's pswrite or epswrite device to distill a file. This yields smaller files without illegal encapsulated postscript operators. The output is low-level, converting text to outlines. """ - paper = '-sPAPERSIZE=%s'% ptype + + paper_option = "-sPAPERSIZE=%s" % ptype + psfile = tmpfile + '.ps' outfile = tmpfile + '.output' dpi = rcParams['ps.distiller.res'] if sys.platform == 'win32': gs_exe = 'gswin32c' else: gs_exe = 'gs' + command = '%s -dBATCH -dNOPAUSE -r%d -sDEVICE=pswrite %s -sOutputFile="%s" \ - "%s" > "%s"'% (gs_exe, dpi, paper, psfile, tmpfile, outfile) + "%s" > "%s"'% (gs_exe, dpi, paper_option, psfile, tmpfile, outfile) verbose.report(command, 'debug') exit_status = os.system(command) fh = file(outfile) @@ -1325,15 +1385,15 @@ shutil.move(psfile, tmpfile) + # While it is best if above steps preserve the original bounding + # box, it does not seems to be the case. pstoeps not only convert + # the input to eps format, but also restores the original bbox. - # Since the the paper size is set to the figure size for eps - # output (in '_print_figure_tex'), pstoeps call is not required. - - #if eps: - # pstoeps(tmpfile, bbox) + if eps: + pstoeps(tmpfile, bbox, rotated=rotated) -def xpdf_distill(tmpfile, eps=False, ptype='letter', bbox=None): +def xpdf_distill(tmpfile, eps=False, ptype='letter', bbox=None, rotated=False): """ Use ghostscript's ps2pdf and xpdf's/poppler's pdftops to distill a file. This yields smaller files without illegal encapsulated postscript @@ -1343,9 +1403,13 @@ pdffile = tmpfile + '.pdf' psfile = tmpfile + '.ps' outfile = tmpfile + '.output' + + if eps: paper_option = "-dEPSCrop" + else: paper_option = "-sPAPERSIZE=%s" % ptype + command = 'ps2pdf -dAutoFilterColorImages=false \ --sColorImageFilter=FlateEncode -sPAPERSIZE=%s "%s" "%s" > "%s"'% \ -(ptype, tmpfile, pdffile, outfile) +-sColorImageFilter=FlateEncode %s "%s" "%s" > "%s"'% \ +(paper_option, tmpfile, pdffile, outfile) if sys.platform == 'win32': command = command.replace('=', '#') verbose.report(command, 'debug') exit_status = os.system(command) @@ -1367,17 +1431,43 @@ os.remove(outfile) os.remove(tmpfile) shutil.move(psfile, tmpfile) + + + # Similar to the gs_distillier case, ps2pdf does not seem to + # preserve the bbox of the original file (at least w/ gs + # 8.61). Thus, the original bbox need to be resotred. + if eps: - pstoeps(tmpfile, bbox) + pstoeps(tmpfile, bbox, rotated) for fname in glob.glob(tmpfile+'.*'): os.remove(fname) +def get_bbox_header(lbrt, rotated=False): + """ + return a postscript header stringfor the given bbox lbrt=(l, b, r, t). + Optionally, return rotate command. + """ + + l, b, r, t = lbrt + if rotated: + rotate = "%.2f %.2f translate\n90 rotate" % (l+r, 0) + else: + rotate = "" + bbox_info = '%%%%BoundingBox: %d %d %d %d' % (l, b, np.ceil(r), np.ceil(t)) + hires_bbox_info = '%%%%HiResBoundingBox: %.6f %.6f %.6f %.6f' % (l, b, r, t) + + return '\n'.join([bbox_info, hires_bbox_info]), rotate + + +# get_bbox is deprecated. I don't see any reason to use ghostscript to +# find the bounding box, as the required bounding box is alread known. def get_bbox(tmpfile, bbox): """ Use ghostscript's bbox device to find the center of the bounding box. Return an appropriately sized bbox centered around that point. A bit of a hack. """ + outfile = tmpfile + '.output' if sys.platform == 'win32': gs_exe = 'gswin32c' else: gs_exe = 'gs' @@ -1409,17 +1499,19 @@ dy = (bbox[3]-bbox[1])/2 l,b,r,t = (x-dx, y-dy, x+dx, y+dy) - bbox_info = '%%%%BoundingBox: %d %d %d %d' % (l, b, npy.ceil(r), npy.ceil(t)) + bbox_info = '%%%%BoundingBox: %d %d %d %d' % (l, b, np.ceil(r), np.ceil(t)) hires_bbox_info = '%%%%HiResBoundingBox: %.6f %.6f %.6f %.6f' % (l, b, r, t) return '\n'.join([bbox_info, hires_bbox_info]) -def pstoeps(tmpfile, bbox): +def pstoeps(tmpfile, bbox, rotated=False): """ Convert the postscript to encapsulated postscript. """ - bbox_info = get_bbox(tmpfile, bbox) + + # if rotated==True, the output eps file need to be rotated + bbox_info, rotate = get_bbox_header(bbox, rotated=rotated) epsfile = tmpfile + '.eps' epsh = file(epsfile, 'w') @@ -1442,9 +1534,12 @@ print >>epsh, '/setpagedevice {pop} def' print >>epsh, '%%EndProlog' print >>epsh, '%%Page 1 1' + if rotate: + print >>epsh, rotate break elif line.startswith('%%Bound') \ or line.startswith('%%HiResBound') \ + or line.startswith('%%DocumentMedia') \ or line.startswith('%%Pages'): pass else: @@ -1474,6 +1569,7 @@ shutil.move(epsfile, tmpfile) + class FigureManagerPS(FigureManagerBase): pass diff -Nru matplotlib-0.99.3/lib/matplotlib/backends/backend_qt4agg.py matplotlib-1.0.1/lib/matplotlib/backends/backend_qt4agg.py --- matplotlib-0.99.3/lib/matplotlib/backends/backend_qt4agg.py 2009-07-31 15:14:40.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/backends/backend_qt4agg.py 2010-07-07 01:41:52.000000000 +0000 @@ -138,7 +138,7 @@ self.replot = bbox l, b, w, h = bbox.bounds t = b + h - self.update(l, self.renderer.height-t, w, h) + self.repaint(l, self.renderer.height-t, w, h) def print_figure(self, *args, **kwargs): FigureCanvasAgg.print_figure(self, *args, **kwargs) diff -Nru matplotlib-0.99.3/lib/matplotlib/backends/backend_qt4.py matplotlib-1.0.1/lib/matplotlib/backends/backend_qt4.py --- matplotlib-0.99.3/lib/matplotlib/backends/backend_qt4.py 2009-07-31 15:14:40.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/backends/backend_qt4.py 2011-01-05 15:59:56.000000000 +0000 @@ -7,11 +7,15 @@ from matplotlib import verbose from matplotlib.cbook import is_string_like, onetrue from matplotlib.backend_bases import RendererBase, GraphicsContextBase, \ - FigureManagerBase, FigureCanvasBase, NavigationToolbar2, IdleEvent, cursors + FigureManagerBase, FigureCanvasBase, NavigationToolbar2, IdleEvent, \ + cursors, TimerBase +from matplotlib.backend_bases import ShowBase + from matplotlib._pylab_helpers import Gcf from matplotlib.figure import Figure from matplotlib.mathtext import MathTextParser from matplotlib.widgets import SubplotTool +import matplotlib.backends.qt4_editor.figureoptions as figureoptions try: from PyQt4 import QtCore, QtGui, Qt @@ -54,22 +58,12 @@ _create_qApp.qAppCreatedHere = False -def show(): - """ - Show all the figures and enter the qt main loop - This should be the last line of your script - """ - for manager in Gcf.get_all_fig_managers(): - manager.window.show() - - if DEBUG: print 'Inside show' +class Show(ShowBase): + def mainloop(self): + if _create_qApp.qAppCreatedHere: + QtGui.qApp.exec_() - figManager = Gcf.get_active() - if figManager != None: - figManager.canvas.draw() - - if _create_qApp.qAppCreatedHere: - QtGui.qApp.exec_() +show = Show() def new_figure_manager( num, *args, **kwargs ): @@ -82,10 +76,52 @@ return manager +class TimerQT(TimerBase): + ''' + Subclass of :class:`backend_bases.TimerBase` that uses Qt4 timer events. + + Attributes: + * interval: The time between timer events in milliseconds. Default + is 1000 ms. + * single_shot: Boolean flag indicating whether this timer should + operate as single shot (run once and then stop). Defaults to False. + * callbacks: Stores list of (func, args) tuples that will be called + upon timer events. This list can be manipulated directly, or the + functions add_callback and remove_callback can be used. + ''' + def __init__(self, *args, **kwargs): + TimerBase.__init__(self, *args, **kwargs) + + # Create a new timer and connect the timeout() signal to the + # _on_timer method. + self._timer = QtCore.QTimer() + QtCore.QObject.connect(self._timer, QtCore.SIGNAL('timeout()'), + self._on_timer) + + def __del__(self): + # Probably not necessary in practice, but is good behavior to disconnect + TimerBase.__del__(self) + QtCore.QObject.disconnect(self._timer , QtCore.SIGNAL('timeout()'), + self._on_timer) + + def _timer_set_single_shot(self): + self._timer.setSingleShot(self._single) + + def _timer_set_interval(self): + self._timer.setInterval(self._interval) + + def _timer_start(self): + self._timer.start() + + def _timer_stop(self): + self._timer.stop() + + class FigureCanvasQT( QtGui.QWidget, FigureCanvasBase ): keyvald = { QtCore.Qt.Key_Control : 'control', QtCore.Qt.Key_Shift : 'shift', QtCore.Qt.Key_Alt : 'alt', + QtCore.Qt.Key_Return : 'enter' } # left 1, middle 2, right 3 buttond = {1:1, 2:3, 4:2} @@ -103,6 +139,9 @@ w,h = self.get_width_height() self.resize( w, h ) + QtCore.QObject.connect(self, QtCore.SIGNAL('destroyed()'), + self.close_event) + def __timerEvent(self, event): # hide until we can test and fix self.mpl_idle_event(event) @@ -111,6 +150,7 @@ FigureCanvasBase.enter_notify_event(self, event) def leaveEvent(self, event): + QtGui.QApplication.restoreOverrideCursor() FigureCanvasBase.leave_notify_event(self, event) def mousePressEvent( self, event ): @@ -142,7 +182,7 @@ y = self.figure.bbox.height - event.y() # from QWheelEvent::delta doc steps = event.delta()/120 - if (event.orientation() == Qt.Qt.Vertical): + if (event.orientation() == QtCore.Qt.Vertical): FigureCanvasBase.scroll_event( self, x, y, steps) if DEBUG: print 'scroll event : delta = %i, steps = %i ' % (event.delta(),steps) @@ -186,6 +226,22 @@ return key + def new_timer(self, *args, **kwargs): + """ + Creates a new backend-specific subclass of :class:`backend_bases.Timer`. + This is useful for getting periodic events through the backend's native + event loop. Implemented only for backends with GUIs. + + optional arguments: + + *interval* + Timer interval in milliseconds + *callbacks* + Sequence of (func, args, kwargs) where func(*args, **kwargs) will + be executed by the timer every *interval*. + """ + return TimerQT(*args, **kwargs) + def flush_events(self): Qt.qApp.processEvents() @@ -206,6 +262,22 @@ self._idle = True if d: QtCore.QTimer.singleShot(0, idle_draw) + +# XXX Hackish fix: There's a bug in PyQt. See this thread for details: +# http://old.nabble.com/Qt4-backend:-critical-bug-with-PyQt4-v4.6%2B-td26205716.html +# Once a release of Qt/PyQt is available without the bug, the version check +# below can be tightened further to only be applied in the necessary versions. +if Qt.PYQT_VERSION_STR.startswith('4.6'): + class FigureWindow(QtGui.QMainWindow): + def __init__(self): + super(FigureWindow, self).__init__() + def closeEvent(self, event): + super(FigureWindow, self).closeEvent(event) + self.emit(Qt.SIGNAL('destroyed()')) +else: + FigureWindow = QtGui.QMainWindow +# /end pyqt hackish bugfix + class FigureManagerQT( FigureManagerBase ): """ Public attributes @@ -220,7 +292,7 @@ if DEBUG: print 'FigureManagerQT.%s' % fn_name() FigureManagerBase.__init__( self, canvas, num ) self.canvas = canvas - self.window = QtGui.QMainWindow() + self.window = FigureWindow() self.window.setAttribute(QtCore.Qt.WA_DeleteOnClose) self.window.setWindowTitle("Figure %d" % num) @@ -236,9 +308,19 @@ self.window._destroying = False self.toolbar = self._get_toolbar(self.canvas, self.window) - self.window.addToolBar(self.toolbar) - QtCore.QObject.connect(self.toolbar, QtCore.SIGNAL("message"), - self.window.statusBar().showMessage) + if self.toolbar is not None: + self.window.addToolBar(self.toolbar) + QtCore.QObject.connect(self.toolbar, QtCore.SIGNAL("message"), + self.window.statusBar().showMessage) + tbs_height = self.toolbar.sizeHint().height() + else: + tbs_height = 0 + + # resize the main window so it will display the canvas with the + # requested size: + cs = canvas.sizeHint() + sbs = self.window.statusBar().sizeHint() + self.window.resize(cs.width(), cs.height()+tbs_height+sbs.height()) self.window.setCentralWidget(self.canvas) @@ -250,13 +332,21 @@ def notify_axes_change( fig ): # This will be called whenever the current axes is changed - if self.toolbar != None: self.toolbar.update() + if self.toolbar is not None: + self.toolbar.update() self.canvas.figure.add_axobserver( notify_axes_change ) def _widgetclosed( self ): if self.window._destroying: return self.window._destroying = True - Gcf.destroy(self.num) + try: + Gcf.destroy(self.num) + except AttributeError: + pass + # It seems that when the python session is killed, + # Gcf can get destroyed before the Gcf.destroy + # line is run, leading to a useless AttributeError. + def _get_toolbar(self, canvas, parent): # must be inited after the window, drawingArea and figure @@ -273,6 +363,9 @@ 'set the canvas size in pixels' self.window.resize(width, height) + def show(self): + self.window.show() + def destroy( self, *args ): if self.window._destroying: return self.window._destroying = True @@ -314,10 +407,16 @@ a = self.addAction(self._icon('subplots.png'), 'Subplots', self.configure_subplots) a.setToolTip('Configure subplots') + + a = self.addAction(self._icon("qt4_editor_options.svg"), + 'Customize', self.edit_parameters) + a.setToolTip('Edit curves line and axes parameters') + a = self.addAction(self._icon('filesave.svg'), 'Save', self.save_figure) a.setToolTip('Save the figure') + self.buttons = {} # Add the x,y location widget at the right side of the toolbar @@ -336,6 +435,36 @@ # reference holder for subplots_adjust window self.adj_window = None + def edit_parameters(self): + allaxes = self.canvas.figure.get_axes() + if len(allaxes) == 1: + axes = allaxes[0] + else: + titles = [] + for axes in allaxes: + title = axes.get_title() + ylabel = axes.get_ylabel() + if title: + text = title + if ylabel: + text += ": "+ylabel + text += " (%s)" + elif ylabel: + text = "%%s (%s)" % ylabel + else: + text = "%s" + titles.append(text % repr(axes)) + item, ok = QtGui.QInputDialog.getItem(self, 'Customize', + 'Select axes:', titles, + 0, False) + if ok: + axes = allaxes[titles.index(unicode(item))] + else: + return + + figureoptions.figure_edit(axes, self) + + def dynamic_update( self ): self.canvas.draw() @@ -378,7 +507,7 @@ def _get_canvas(self, fig): return FigureCanvasQT(fig) - def save_figure( self ): + def save_figure(self, *args): filetypes = self.canvas.get_supported_filetypes_grouped() sorted_filetypes = filetypes.items() sorted_filetypes.sort() diff -Nru matplotlib-0.99.3/lib/matplotlib/backends/backend_qt.py matplotlib-1.0.1/lib/matplotlib/backends/backend_qt.py --- matplotlib-0.99.3/lib/matplotlib/backends/backend_qt.py 2009-07-31 15:14:40.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/backends/backend_qt.py 2010-08-03 14:22:42.000000000 +0000 @@ -8,6 +8,8 @@ from matplotlib.cbook import is_string_like, onetrue from matplotlib.backend_bases import RendererBase, GraphicsContextBase, \ FigureManagerBase, FigureCanvasBase, NavigationToolbar2, cursors +from matplotlib.backend_bases import ShowBase + from matplotlib._pylab_helpers import Gcf from matplotlib.figure import Figure from matplotlib.mathtext import MathTextParser @@ -54,22 +56,12 @@ _create_qApp.qAppCreatedHere = False -def show(): - """ - Show all the figures and enter the qt main loop - This should be the last line of your script - """ - for manager in Gcf.get_all_fig_managers(): - manager.window.show() - - if DEBUG: print 'Inside show' +class Show(ShowBase): + def mainloop(self): + if _create_qApp.qAppCreatedHere: + qt.qApp.exec_loop() - figManager = Gcf.get_active() - if figManager != None: - figManager.canvas.draw() - - if _create_qApp.qAppCreatedHere: - qt.qApp.exec_loop() +show = Show() def new_figure_manager( num, *args, **kwargs ): @@ -176,7 +168,7 @@ def _get_key( self, event ): if event.key() < 256: key = event.text().latin1() - elif event.key() in self.keyvald.has_key: + elif event.key() in self.keyvald: key = self.keyvald[ event.key() ] else: key = None @@ -281,6 +273,9 @@ 'set the canvas size in pixels' self.window.resize(width, height) + def show(self): + self.window.show() + def destroy( self, *args ): if self.window._destroying: return self.window._destroying = True @@ -359,6 +354,7 @@ # reference holder for subplots_adjust window self.adj_window = None + def destroy( self ): for text, tooltip_text, image_file, callback in self.toolitems: if text is not None: @@ -422,7 +418,7 @@ def _get_canvas(self, fig): return FigureCanvasQT(fig) - def save_figure( self ): + def save_figure(self, *args): filetypes = self.canvas.get_supported_filetypes_grouped() sorted_filetypes = filetypes.items() sorted_filetypes.sort() diff -Nru matplotlib-0.99.3/lib/matplotlib/backends/backend_svg.py matplotlib-1.0.1/lib/matplotlib/backends/backend_svg.py --- matplotlib-0.99.3/lib/matplotlib/backends/backend_svg.py 2010-03-09 14:20:20.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/backends/backend_svg.py 2011-01-05 15:59:56.000000000 +0000 @@ -2,6 +2,8 @@ import os, codecs, base64, tempfile, urllib, gzip, cStringIO +import numpy as np + try: from hashlib import md5 except ImportError: @@ -54,7 +56,12 @@ self._path_collection_id = 0 self._imaged = {} self._hatchd = {} + self._n_gradients = 0 self.mathtext_parser = MathTextParser('SVG') + + RendererBase.__init__(self) + self._glyph_map = dict() + svgwriter.write(svgProlog%(width,height,width,height)) def _draw_svg_element(self, element, details, gc, rgbFace): @@ -111,7 +118,7 @@ '' % (HATCH_SIZE+1, HATCH_SIZE+1, fill)) path = '' % ( - path_data, rgb2hex(gc.get_rgb()[:3]), rgb2hex(gc.get_rgb()[:3])) + path_data, rgb2hex(gc.get_rgb()), rgb2hex(gc.get_rgb())) self._svgwriter.write(path) self._svgwriter.write('\n \n') self._hatchd[dictkey] = id @@ -128,7 +135,7 @@ if rgbFace is None: fill = 'none' else: - fill = rgb2hex(rgbFace[:3]) + fill = rgb2hex(rgbFace) offset, seq = gc.get_dashes() if seq is None: @@ -142,7 +149,7 @@ return 'fill: %s; stroke: %s; stroke-width: %f; ' \ 'stroke-linejoin: %s; stroke-linecap: %s; %s opacity: %f' % ( fill, - rgb2hex(gc.get_rgb()[:3]), + rgb2hex(gc.get_rgb()), linewidth, gc.get_joinstyle(), _capstyle_d[gc.get_capstyle()], @@ -270,10 +277,9 @@ self._svgwriter.write ('\n' % (style, details)) write('') - def draw_path_collection(self, master_transform, cliprect, clippath, - clippath_trans, paths, all_transforms, offsets, - offsetTrans, facecolors, edgecolors, linewidths, - linestyles, antialiaseds, urls): + def draw_path_collection(self, gc, master_transform, paths, all_transforms, + offsets, offsetTrans, facecolors, edgecolors, + linewidths, linestyles, antialiaseds, urls): write = self._svgwriter.write path_codes = [] @@ -288,18 +294,17 @@ path_codes.append(name) write('\n') - for xo, yo, path_id, gc, rgbFace in self._iter_collection( - path_codes, cliprect, clippath, clippath_trans, - offsets, offsetTrans, facecolors, edgecolors, + for xo, yo, path_id, gc0, rgbFace in self._iter_collection( + gc, path_codes, offsets, offsetTrans, facecolors, edgecolors, linewidths, linestyles, antialiaseds, urls): - clipid = self._get_gc_clip_svg(gc) - url = gc.get_url() + clipid = self._get_gc_clip_svg(gc0) + url = gc0.get_url() if url is not None: self._svgwriter.write('' % url) if clipid is not None: write('' % clipid) details = 'xlink:href="#%s" x="%f" y="%f"' % (path_id, xo, self.height - yo) - style = self._get_style(gc, rgbFace) + style = self._get_style(gc0, rgbFace) self._svgwriter.write ('\n' % (style, details)) if clipid is not None: write('') @@ -308,14 +313,99 @@ self._path_collection_id += 1 - def draw_image(self, x, y, im, bbox, clippath=None, clippath_trans=None): - # MGDTODO: Support clippath here + def draw_gouraud_triangle(self, gc, points, colors, trans): + # This uses a method described here: + # + # http://www.svgopen.org/2005/papers/Converting3DFaceToSVG/index.html + # + # that uses three overlapping linear gradients to simulate a + # Gouraud triangle. Each gradient goes from fully opaque in + # one corner to fully transparent along the opposite edge. + # The line between the stop points is perpendicular to the + # opposite edge. Underlying these three gradients is a solid + # triangle whose color is the average of all three points. + + avg_color = np.sum(colors[:, :], axis=0) / 3.0 + # Just skip fully-transparent triangles + if avg_color[-1] == 0.0: + return + + trans_and_flip = self._make_flip_transform(trans) + tpoints = trans_and_flip.transform(points) + write = self._svgwriter.write + + write('') + for i in range(3): + x1, y1 = points[i] + x2, y2 = points[(i + 1) % 3] + x3, y3 = points[(i + 2) % 3] + c = colors[i][:] + + if x2 == x3: + xb = x2 + yb = y1 + elif y2 == y3: + xb = x1 + yb = y2 + else: + m1 = (y2 - y3) / (x2 - x3) + b1 = y2 - (m1 * x2) + m2 = -(1.0 / m1) + b2 = y1 - (m2 * x1) + xb = (-b1 + b2) / (m1 - m2) + yb = m2 * xb + b2 + + write('' % + (self._n_gradients, i, x1, y1, xb, yb)) + write('' % (rgb2hex(c), c[-1])) + write('' % rgb2hex(c)) + write('') + + # Define the triangle itself as a "def" since we use it 4 times + write('' % + (self._n_gradients, x1, y1, x2, y2, x3, y3)) + write('\n') + + avg_color = np.sum(colors[:, :], axis=0) / 3.0 + write('\n' % + (self._n_gradients, rgb2hex(avg_color), avg_color[-1])) + for i in range(3): + write('\n' % + (self._n_gradients, self._n_gradients, i)) + + self._n_gradients += 1 + + def draw_gouraud_triangles(self, gc, triangles_array, colors_array, + transform): + write = self._svgwriter.write + + clipid = self._get_gc_clip_svg(gc) + if clipid is None: + clippath = '' + else: + clippath = 'clip-path="url(#%s)"' % clipid + + write('\n' % clippath) + + transform = transform.frozen() + for tri, col in zip(triangles_array, colors_array): + self.draw_gouraud_triangle(gc, tri, col, transform) + + write('\n') + + def draw_image(self, gc, x, y, im): + clipid = self._get_gc_clip_svg(gc) + if clipid is None: + clippath = '' + else: + clippath = 'clip-path="url(#%s)"' % clipid + trans = [1,0,0,1,0,0] transstr = '' if rcParams['svg.image_noscale']: trans = list(im.get_matrix()) trans[5] = -trans[5] - transstr = 'transform="matrix(%f %f %f %f %f %f)" '%tuple(trans) + transstr = 'transform="matrix(%f %f %f %f %f %f)" ' % tuple(trans) assert trans[1] == 0 assert trans[2] == 0 numrows,numcols = im.get_size() @@ -330,7 +420,9 @@ self._svgwriter.write('' % url) self._svgwriter.write ( '') + def _adjust_char_id(self, char_id): + return char_id.replace("%20","_") + + def draw_text_as_path(self, gc, x, y, s, prop, angle, ismath): + """ + draw the text by converting them to paths using textpath module. + + *prop* + font property + + *s* + text to be converted + + *usetex* + If True, use matplotlib usetex mode. + + *ismath* + If True, use mathtext parser. If "TeX", use *usetex* mode. + + + """ + # this method works for normal text, mathtext and usetex mode. + # But currently only utilized by draw_tex method. + + glyph_map=self._glyph_map + + text2path = self._text2path + color = rgb2hex(gc.get_rgb()) + fontsize = prop.get_size_in_points() + + write = self._svgwriter.write + + if ismath == False: + font = text2path._get_font(prop) + _glyphs = text2path.get_glyphs_with_font(font, s, glyph_map=glyph_map, + return_new_glyphs_only=True) + glyph_info, glyph_map_new, rects = _glyphs + + _flip = Affine2D().scale(1.0, -1.0) + + if glyph_map_new: + write('\n') + for char_id, glyph_path in glyph_map_new.iteritems(): + path = Path(*glyph_path) + path_data = self._convert_path(path, _flip, simplify=False) + path_element = '\n' % (char_id, ''.join(path_data)) + write(path_element) + write('\n') + + glyph_map.update(glyph_map_new) + + svg = [] + clipid = self._get_gc_clip_svg(gc) + if clipid is not None: + svg.append('\n' % clipid) + + svg.append('\n' % (fontsize / text2path.FONT_SCALE)) + + for glyph_id, xposition, yposition, scale in glyph_info: + svg.append('\n') + + svg.append('\n') + if clipid is not None: + svg.append('\n') + svg = ''.join(svg) + + + + else: + if ismath == "TeX": + _glyphs = text2path.get_glyphs_tex(prop, s, glyph_map=glyph_map) + else: + _glyphs = text2path.get_glyphs_mathtext(prop, s, glyph_map=glyph_map) + + glyph_info, glyph_map_new, rects = _glyphs + + # we store the character glyphs w/o flipping. Instead, the + # coordinate will be flipped when this characters are + # used. + if glyph_map_new: + write('\n') + for char_id, glyph_path in glyph_map_new.iteritems(): + char_id = self._adjust_char_id(char_id) + path = Path(*glyph_path) + path_data = self._convert_path(path, None, simplify=False) #_flip) + path_element = '\n' % (char_id, ''.join(path_data)) + write(path_element) + write('\n') + + glyph_map.update(glyph_map_new) + + svg = [] + clipid = self._get_gc_clip_svg(gc) + if clipid is not None: + svg.append('\n' % clipid) + + svg.append('\n' % (fontsize / text2path.FONT_SCALE, + fontsize / text2path.FONT_SCALE)) + + for char_id, xposition, yposition, scale in glyph_info: + char_id = self._adjust_char_id(char_id) + svg.append('\n') + + + for verts, codes in rects: + path = Path(verts, codes) + path_data = self._convert_path(path, None, simplify=False) + path_element = '\n' % (''.join(path_data)) + svg.append(path_element) + + + svg.append('\n') + if clipid is not None: + svg.append('\n') + svg = ''.join(svg) + + write(svg) + + + def draw_tex(self, gc, x, y, s, prop, angle): + self.draw_text_as_path(gc, x, y, s, prop, angle, ismath="TeX") + def draw_text(self, gc, x, y, s, prop, angle, ismath): + if ismath: self._draw_mathtext(gc, x, y, s, prop, angle) return @@ -365,7 +597,7 @@ y -= font.get_descent() / 64.0 fontsize = prop.get_size_in_points() - color = rgb2hex(gc.get_rgb()[:3]) + color = rgb2hex(gc.get_rgb()) write = self._svgwriter.write if rcParams['svg.embed_char_paths']: @@ -503,7 +735,7 @@ self.mathtext_parser.parse(s, 72, prop) svg_glyphs = svg_elements.svg_glyphs svg_rects = svg_elements.svg_rects - color = rgb2hex(gc.get_rgb()[:3]) + color = rgb2hex(gc.get_rgb()) write = self._svgwriter.write style = "fill: %s" % color @@ -598,6 +830,14 @@ return self.width, self.height def get_text_width_height_descent(self, s, prop, ismath): + if rcParams['text.usetex']: + size = prop.get_size_in_points() + texmanager = self._text2path.get_texmanager() + fontsize = prop.get_size_in_points() + w, h, d = texmanager.get_text_width_height_descent(s, fontsize, + renderer=self) + return w, h, d + if ismath: width, height, descent, trash, used_characters = \ self.mathtext_parser.parse(s, 72, prop) @@ -620,7 +860,7 @@ if is_string_like(filename): fh_to_close = svgwriter = codecs.open(filename, 'w', 'utf-8') elif is_writable_file_like(filename): - svgwriter = codecs.EncodedFile(filename, 'utf-8') + svgwriter = codecs.getwriter('utf-8')(filename) fh_to_close = None else: raise ValueError("filename must be a path or a file-like object") @@ -629,10 +869,10 @@ def print_svgz(self, filename, *args, **kwargs): if is_string_like(filename): gzipwriter = gzip.GzipFile(filename, 'w') - fh_to_close = svgwriter = codecs.EncodedFile(gzipwriter, 'utf-8') + fh_to_close = svgwriter = codecs.getwriter('utf-8')(gzipwriter) elif is_writable_file_like(filename): fh_to_close = gzipwriter = gzip.GzipFile(fileobj=filename, mode='w') - svgwriter = codecs.EncodedFile(gzipwriter, 'utf-8') + svgwriter = codecs.getwriter('utf-8')(gzipwriter) else: raise ValueError("filename must be a path or a file-like object") return self._print_svg(filename, svgwriter, fh_to_close) @@ -682,4 +922,5 @@ xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="svg1"> + """ diff -Nru matplotlib-0.99.3/lib/matplotlib/backends/backend_template.py matplotlib-1.0.1/lib/matplotlib/backends/backend_template.py --- matplotlib-0.99.3/lib/matplotlib/backends/backend_template.py 2009-07-31 15:14:40.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/backends/backend_template.py 2010-07-07 01:41:52.000000000 +0000 @@ -87,22 +87,21 @@ # draw_path_collection is optional, and we get more correct # relative timings by leaving it out. backend implementers concerned with # performance will probably want to implement it -# def draw_path_collection(self, master_transform, cliprect, clippath, -# clippath_trans, paths, all_transforms, offsets, -# offsetTrans, facecolors, edgecolors, linewidths, -# linestyles, antialiaseds): +# def draw_path_collection(self, gc, master_transform, paths, +# all_transforms, offsets, offsetTrans, facecolors, +# edgecolors, linewidths, linestyles, +# antialiaseds): # pass # draw_quad_mesh is optional, and we get more correct # relative timings by leaving it out. backend implementers concerned with # performance will probably want to implement it -# def draw_quad_mesh(self, master_transform, cliprect, clippath, -# clippath_trans, meshWidth, meshHeight, coordinates, -# offsets, offsetTrans, facecolors, antialiased, -# showedges): +# def draw_quad_mesh(self, gc, master_transform, meshWidth, meshHeight, +# coordinates, offsets, offsetTrans, facecolors, +# antialiased, showedges): # pass - def draw_image(self, x, y, im, bbox, clippath=None, clippath_trans=None): + def draw_image(self, gc, x, y, im): pass def draw_text(self, gc, x, y, s, prop, angle, ismath=False): diff -Nru matplotlib-0.99.3/lib/matplotlib/backends/backend_tkagg.py matplotlib-1.0.1/lib/matplotlib/backends/backend_tkagg.py --- matplotlib-0.99.3/lib/matplotlib/backends/backend_tkagg.py 2009-07-31 15:14:40.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/backends/backend_tkagg.py 2010-11-04 18:28:10.000000000 +0000 @@ -3,22 +3,26 @@ from __future__ import division import os, sys, math +import os.path import Tkinter as Tk, FileDialog -import tkagg # Paint image to Tk photo blitter extension -from backend_agg import FigureCanvasAgg -import os.path +# Paint image to Tk photo blitter extension +import matplotlib.backends.tkagg as tkagg + +from matplotlib.backends.backend_agg import FigureCanvasAgg +import matplotlib.backends.windowing as windowing import matplotlib from matplotlib.cbook import is_string_like -from matplotlib.backend_bases import RendererBase, GraphicsContextBase, \ - FigureManagerBase, FigureCanvasBase, NavigationToolbar2, cursors +from matplotlib.backend_bases import RendererBase, GraphicsContextBase +from matplotlib.backend_bases import FigureManagerBase, FigureCanvasBase +from matplotlib.backend_bases import NavigationToolbar2, cursors, TimerBase +from matplotlib.backend_bases import ShowBase +from matplotlib._pylab_helpers import Gcf from matplotlib.figure import Figure -from matplotlib._pylab_helpers import Gcf -import matplotlib.windowing as windowing from matplotlib.widgets import SubplotTool import matplotlib.cbook as cbook @@ -60,25 +64,11 @@ if figManager is not None: figManager.show() - -def show(): - """ - Show all the figures and enter the gtk mainloop - - This should be the last line of your script. This function sets - interactive mode to True, as detailed on - http://matplotlib.sf.net/interactive.html - """ - for manager in Gcf.get_all_fig_managers(): - manager.show() - import matplotlib - matplotlib.interactive(True) - if rcParams['tk.pythoninspect']: - os.environ['PYTHONINSPECT'] = '1' - if show._needmain: +class Show(ShowBase): + def mainloop(self): Tk.mainloop() - show._needmain = False -show._needmain = True + +show = Show() def new_figure_manager(num, *args, **kwargs): """ @@ -95,6 +85,42 @@ return figManager +class TimerTk(TimerBase): + ''' + Subclass of :class:`backend_bases.TimerBase` that uses Tk's timer events. + + Attributes: + * interval: The time between timer events in milliseconds. Default + is 1000 ms. + * single_shot: Boolean flag indicating whether this timer should + operate as single shot (run once and then stop). Defaults to False. + * callbacks: Stores list of (func, args) tuples that will be called + upon timer events. This list can be manipulated directly, or the + functions add_callback and remove_callback can be used. + ''' + def __init__(self, parent, *args, **kwargs): + TimerBase.__init__(self, *args, **kwargs) + self.parent = parent + + def _timer_start(self): + self._timer = self.parent.after(self._interval, self._on_timer) + + def _timer_stop(self): + if self._timer is not None: + self.parent.after_cancel(self._timer) + self._timer = None + + def _on_timer(self): + TimerBase._on_timer(self) + + # Tk after() is only a single shot, so we need to add code here to + # reset the timer if we're not operating in single shot mode. + if not self._single and len(self.callbacks) > 0: + self._timer = self.parent.after(self._interval, self._on_timer) + else: + self._timer = None + + class FigureCanvasTkAgg(FigureCanvasAgg): keyvald = {65507 : 'control', 65505 : 'shift', @@ -177,6 +203,13 @@ root = self._tkcanvas.winfo_toplevel() root.bind("", self.scroll_event_windows) + # Can't get destroy events by binding to _tkcanvas. Therefore, bind + # to the window and filter. + def filter_destroy(evt): + if evt.widget is self._tkcanvas: + self.close_event() + root.bind("", filter_destroy) + self._master = master self._tkcanvas.focus_set() @@ -198,7 +231,7 @@ self._resize_callback(event) # compute desired figure size in inches - dpival = self.figure.dpi + dpival = self.figure.dpi winch = width/dpival hinch = height/dpival self.figure.set_size_inches(winch, hinch) @@ -279,8 +312,8 @@ x = event.x y = self.figure.bbox.height - event.y num = getattr(event, 'num', None) - if num==4: step = -1 - elif num==5: step = +1 + if num==4: step = +1 + elif num==5: step = -1 else: step = 0 FigureCanvasBase.scroll_event(self, x, y, step, guiEvent=event) @@ -315,6 +348,22 @@ key = self._get_key(event) FigureCanvasBase.key_release_event(self, key, guiEvent=event) + def new_timer(self, *args, **kwargs): + """ + Creates a new backend-specific subclass of :class:`backend_bases.Timer`. + This is useful for getting periodic events through the backend's native + event loop. Implemented only for backends with GUIs. + + optional arguments: + + *interval* + Timer interval in milliseconds + *callbacks* + Sequence of (func, args, kwargs) where func(*args, **kwargs) will + be executed by the timer every *interval*. + """ + return TimerTk(self._tkcanvas, *args, **kwargs) + def flush_events(self): self._master.update() @@ -367,9 +416,22 @@ self.canvas.figure.show = lambda *args: self.show() - def resize(self, event): - width, height = event.width, event.height - self.toolbar.configure(width=width) # , height=height) + def resize(self, width, height=None): + # before 09-12-22, the resize method takes a single *event* + # parameter. On the other hand, the resize method of other + # FigureManager class takes *width* and *height* parameter, + # which is used to change the size of the window. For the + # Figure.set_size_inches with forward=True work with Tk + # backend, I changed the function signature but tried to keep + # it backward compatible. -JJL + + # when a single parameter is given, consider it as a event + if height is None: + width = width.width + else: + self.canvas._tkcanvas.master.geometry("%dx%d" % (width, height)) + + self.toolbar.configure(width=width) def show(self): @@ -377,17 +439,15 @@ this function doesn't segfault but causes the PyEval_RestoreThread: NULL state bug on win32 """ - - def destroy(*args): - self.window = None - Gcf.destroy(self._num) - - if not self._shown: self.canvas._tkcanvas.bind("", destroy) _focus = windowing.FocusManager() if not self._shown: + def destroy(*args): + self.window = None + Gcf.destroy(self._num) + self.canvas._tkcanvas.bind("", destroy) self.window.deiconify() # anim.py requires this - if sys.platform=='win32' : self.window.update() + self.window.update() else: self.canvas.draw_idle() self._shown = True @@ -400,9 +460,7 @@ if self.window is not None: #self.toolbar.destroy() self.window.destroy() - - pass - self.window = None + self.window = None def set_window_title(self, title): self.window.wm_title(title) @@ -563,7 +621,7 @@ a.yaxis.zoom(direction) self.canvas.draw() - def save_figure(self): + def save_figure(self, *args): fs = FileDialog.SaveFileDialog(master=self.window, title='Save the figure') try: @@ -690,7 +748,7 @@ canvas.show() canvas.get_tk_widget().pack(side=Tk.TOP, fill=Tk.BOTH, expand=1) - def save_figure(self): + def save_figure(self, *args): from tkFileDialog import asksaveasfilename from tkMessageBox import showerror filetypes = self.canvas.get_supported_filetypes().copy() @@ -752,4 +810,3 @@ FigureManager = FigureManagerTkAgg - diff -Nru matplotlib-0.99.3/lib/matplotlib/backends/backend_wx.py matplotlib-1.0.1/lib/matplotlib/backends/backend_wx.py --- matplotlib-0.99.3/lib/matplotlib/backends/backend_wx.py 2010-03-09 14:20:20.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/backends/backend_wx.py 2010-11-04 18:28:10.000000000 +0000 @@ -17,86 +17,14 @@ should be included with this source code. """ -""" -KNOWN BUGS - - - Mousewheel (on Windows) only works after menu button has been pressed - at least once - - Mousewheel on Linux (wxGTK linked against GTK 1.2) does not work at all - - Vertical text renders horizontally if you use a non TrueType font - on Windows. This is a known wxPython issue. Work-around is to ensure - that you use a TrueType font. - - Pcolor demo puts chart slightly outside bounding box (approx 1-2 pixels - to the bottom left) - - Outputting to bitmap more than 300dpi results in some text being incorrectly - scaled. Seems to be a wxPython bug on Windows or font point sizes > 60, as - font size is correctly calculated. - - Performance poorer than for previous direct rendering version - - TIFF output not supported on wxGTK. This is a wxGTK issue - - Text is not anti-aliased on wxGTK. This is probably a platform - configuration issue. - - If a second call is made to show(), no figure is generated (#866965) - -Not implemented: - - Printing - -Fixed this release: - - Bug #866967: Interactive operation issues fixed [JDH] - - Bug #866969: Dynamic update does not function with backend_wx [JOD] - -Examples which work on this release: - --------------------------------------------------------------- - | Windows 2000 | Linux | - | wxPython 2.3.3 | wxPython 2.4.2.4 | - --------------------------------------------------------------| - - alignment_test.py | TBE | OK | - - arctest.py | TBE | (3) | - - axes_demo.py | OK | OK | - - axes_props.py | OK | OK | - - bar_stacked.py | TBE | OK | - - barchart_demo.py | OK | OK | - - color_demo.py | OK | OK | - - csd_demo.py | OK | OK | - - dynamic_demo.py | N/A | N/A | - - dynamic_demo_wx.py | TBE | OK | - - embedding_in_gtk.py | N/A | N/A | - - embedding_in_wx.py | OK | OK | - - errorbar_demo.py | OK | OK | - - figtext.py | OK | OK | - - histogram_demo.py | OK | OK | - - interactive.py | N/A (2) | N/A (2) | - - interactive2.py | N/A (2) | N/A (2) | - - legend_demo.py | OK | OK | - - legend_demo2.py | OK | OK | - - line_styles.py | OK | OK | - - log_demo.py | OK | OK | - - logo.py | OK | OK | - - mpl_with_glade.py | N/A (2) | N/A (2) | - - mri_demo.py | OK | OK | - - mri_demo_with_eeg.py | OK | OK | - - multiple_figs_demo.py | OK | OK | - - pcolor_demo.py | OK | OK | - - psd_demo.py | OK | OK | - - scatter_demo.py | OK | OK | - - scatter_demo2.py | OK | OK | - - simple_plot.py | OK | OK | - - stock_demo.py | OK | OK | - - subplot_demo.py | OK | OK | - - system_monitor.py | N/A (2) | N/A (2) | - - text_handles.py | OK | OK | - - text_themes.py | OK | OK | - - vline_demo.py | OK | OK | - --------------------------------------------------------------- - - (2) - Script uses GTK-specific features - cannot not run, - but wxPython equivalent should be written. - (3) - Clipping seems to be broken. -""" -cvs_id = '$Id: backend_wx.py 7924 2009-11-03 16:27:13Z mdboom $' +cvs_id = '$Id: backend_wx.py 8767 2010-11-01 13:04:29Z mdboom $' import sys, os, os.path, math, StringIO, weakref, warnings -import numpy as npy +import numpy as np + + # Debugging settings here... # Debug level set here. If the debug level is less than 5, information @@ -190,7 +118,9 @@ from matplotlib import verbose from matplotlib.backend_bases import RendererBase, GraphicsContextBase,\ FigureCanvasBase, FigureManagerBase, NavigationToolbar2, \ - cursors + cursors, TimerBase +from matplotlib.backend_bases import ShowBase + from matplotlib._pylab_helpers import Gcf from matplotlib.artist import Artist from matplotlib.cbook import exception_to_str, is_string_like, is_writable_file_like @@ -226,6 +156,51 @@ msg = '\n'.join(map(str, msg)) return msg + +class TimerWx(TimerBase): + ''' + Subclass of :class:`backend_bases.TimerBase` that uses WxTimer events. + + Attributes: + * interval: The time between timer events in milliseconds. Default + is 1000 ms. + * single_shot: Boolean flag indicating whether this timer should + operate as single shot (run once and then stop). Defaults to False. + * callbacks: Stores list of (func, args) tuples that will be called + upon timer events. This list can be manipulated directly, or the + functions add_callback and remove_callback can be used. + ''' + def __init__(self, parent, *args, **kwargs): + TimerBase.__init__(self, *args, **kwargs) + + # Create a new timer and connect the timer event to our handler. + # For WX, the events have to use a widget for binding. + self.parent = parent + self._timer = wx.Timer(self.parent, wx.NewId()) + self.parent.Bind(wx.EVT_TIMER, self._on_timer, self._timer) + + # Unbinding causes Wx to stop for some reason. Disabling for now. +# def __del__(self): +# import wx +# TimerBase.__del__(self) +# self.parent.Bind(wx.EVT_TIMER, None, self._timer) + + def _timer_start(self): + self._timer.Start(self._interval, self._single) + + def _timer_stop(self): + self._timer.Stop() + + def _timer_set_interval(self): + self._timer_start() + + def _timer_set_single_shot(self): + self._timer.start() + + def _on_timer(self, *args): + TimerBase._on_timer(self) + + class RendererWx(RendererBase): """ The renderer handles all the drawing primitives using a graphics @@ -362,7 +337,8 @@ gfx_ctx.StrokePath(wxpath) gc.unselect() - def draw_image(self, x, y, im, bbox, clippath=None, clippath_trans=None): + def draw_image(self, gc, x, y, im): + bbox = gc.get_clip_rectangle() if bbox != None: l,b,w,h = bbox.bounds else: @@ -371,7 +347,7 @@ w=self.width h=self.height rows, cols, image_str = im.as_rgba_str() - image_array = npy.fromstring(image_str, npy.uint8) + image_array = np.fromstring(image_str, np.uint8) image_array.shape = rows, cols, 4 bitmap = wx.BitmapFromBufferRGBA(cols,rows,image_array) gc = self.get_gc() @@ -782,7 +758,11 @@ self.macros = {} # dict from wx id to seq of macros - self.Printer_Init() + # printer attributes and methods deprecated, 2010/06/19 + self._printerData = None + self._printerPageData = None + self.printer_width = 5.5 + self.printer_margin = 0.5 def Destroy(self, *args, **kwargs): wx.Panel.Destroy(self, *args, **kwargs) @@ -795,9 +775,15 @@ wx.TheClipboard.Open() wx.TheClipboard.SetData(bmp_obj) wx.TheClipboard.Close() + wx.TheClipboard.Flush() def Printer_Init(self): - """initialize printer settings using wx methods""" + """ + initialize printer settings using wx methods + + Deprecated. + """ + warnings.warn("Printer* methods will be removed", DeprecationWarning) self.printerData = wx.PrintData() self.printerData.SetPaperId(wx.PAPER_LETTER) self.printerData.SetPrintMode(wx.PRINT_MODE_PRINTER) @@ -809,14 +795,37 @@ self.printer_width = 5.5 self.printer_margin= 0.5 + def _get_printerData(self): + if self._printerData is None: + warnings.warn("Printer* methods will be removed", DeprecationWarning) + self._printerData = wx.PrintData() + self._printerData.SetPaperId(wx.PAPER_LETTER) + self._printerData.SetPrintMode(wx.PRINT_MODE_PRINTER) + return self._printerData + printerData = property(_get_printerData) + + def _get_printerPageData(self): + if self._printerPageData is None: + warnings.warn("Printer* methods will be removed", DeprecationWarning) + self._printerPageData= wx.PageSetupDialogData() + self._printerPageData.SetMarginBottomRight((25,25)) + self._printerPageData.SetMarginTopLeft((25,25)) + self._printerPageData.SetPrintData(self.printerData) + return self._printerPageData + printerPageData = property(_get_printerPageData) + def Printer_Setup(self, event=None): - """set up figure for printing. The standard wx Printer + """ + set up figure for printing. The standard wx Printer Setup Dialog seems to die easily. Therefore, this setup - simply asks for image width and margin for printing. """ + simply asks for image width and margin for printing. + Deprecated. + """ dmsg = """Width of output figure in inches. -The current aspect ration will be kept.""" +The current aspect ratio will be kept.""" + warnings.warn("Printer* methods will be removed", DeprecationWarning) dlg = wx.Dialog(self, -1, 'Page Setup for Printing' , (-1,-1)) df = dlg.GetFont() df.SetWeight(wx.NORMAL) @@ -872,9 +881,14 @@ return def Printer_Setup2(self, event=None): - """set up figure for printing. Using the standard wx Printer - Setup Dialog. """ + """ + set up figure for printing. Using the standard wx Printer + Setup Dialog. + + Deprecated. + """ + warnings.warn("Printer* methods will be removed", DeprecationWarning) if hasattr(self, 'printerData'): data = wx.PageSetupDialogData() data.SetPrintData(self.printerData) @@ -893,7 +907,12 @@ dlg.Destroy() def Printer_Preview(self, event=None): - """ generate Print Preview with wx Print mechanism""" + """ + generate Print Preview with wx Print mechanism + + Deprecated. + """ + warnings.warn("Printer* methods will be removed", DeprecationWarning) po1 = PrintoutWx(self, width=self.printer_width, margin=self.printer_margin) po2 = PrintoutWx(self, width=self.printer_width, @@ -914,7 +933,12 @@ self.gui_repaint() def Printer_Print(self, event=None): - """ Print figure using wx Print mechanism""" + """ + Print figure using wx Print mechanism + + Deprecated. + """ + warnings.warn("Printer* methods will be removed", DeprecationWarning) pdd = wx.PrintDialogData() # SetPrintData for 2.4 combatibility pdd.SetPrintData(self.printerData) @@ -937,7 +961,6 @@ printout.Destroy() self.gui_repaint() - def draw_idle(self): """ Delay rendering until the GUI is idle. @@ -977,6 +1000,22 @@ self._isDrawn = True self.gui_repaint(drawDC=drawDC) + def new_timer(self, *args, **kwargs): + """ + Creates a new backend-specific subclass of :class:`backend_bases.Timer`. + This is useful for getting periodic events through the backend's native + event loop. Implemented only for backends with GUIs. + + optional arguments: + + *interval* + Timer interval in milliseconds + *callbacks* + Sequence of (func, args, kwargs) where func(*args, **kwargs) will + be executed by the timer every *interval*. + """ + return TimerWx(self, *args, **kwargs) + def flush_events(self): wx.Yield() @@ -1360,33 +1399,15 @@ if figManager is not None: figManager.canvas.draw_idle() -def show(): - """ - Current implementation assumes that matplotlib is executed in a PyCrust - shell. It appears to be possible to execute wxPython applications from - within a PyCrust without having to ensure that wxPython has been created - in a secondary thread (e.g. SciPy gui_thread). - - Unfortunately, gui_thread seems to introduce a number of further - dependencies on SciPy modules, which I do not wish to introduce - into the backend at this point. If there is a need I will look - into this in a later release. - """ - DEBUG_MSG("show()", 3, None) - - for figwin in Gcf.get_all_fig_managers(): - figwin.frame.Show() - - if show._needmain and not matplotlib.is_interactive(): - # start the wxPython gui event if there is not already one running - wxapp = wx.GetApp() - if wxapp is not None: - # wxPython 2.4 has no wx.App.IsMainLoopRunning() method - imlr = getattr(wxapp, 'IsMainLoopRunning', lambda: False) - if not imlr(): +class Show(ShowBase): + def mainloop(self): + needmain = not wx.App.IsMainLoopRunning() + if needmain: + wxapp = wx.GetApp() + if wxapp is not None: wxapp.MainLoop() - show._needmain = False -show._needmain = True + +show = Show() def new_figure_manager(num, *args, **kwargs): """ @@ -1475,6 +1496,7 @@ def _onClose(self, evt): DEBUG_MSG("onClose()", 1, self) + self.canvas.close_event() self.canvas.stop_event_loop() Gcf.destroy(self.num) #self.Destroy() @@ -1484,6 +1506,11 @@ return self.toolbar def Destroy(self, *args, **kwargs): + try: + self.canvas.mpl_disconnect(self.toolbar._idDrag) + # Rationale for line above: see issue 2941338. + except AttributeError: + pass # classic toolbar lacks the attribute wx.Frame.Destroy(self, *args, **kwargs) if self.toolbar is not None: self.toolbar.Destroy() @@ -1525,6 +1552,8 @@ # attach a show method to the figure self.canvas.figure.show = showfig + def show(self): + self.frame.Show() def destroy(self, *args): DEBUG_MSG("destroy()", 1, self) @@ -1643,6 +1672,8 @@ else: new = True self._menu.Check(evt.GetId(), new) + # Lines above would be deleted based on svn tracker ID 2841525; + # not clear whether this matters or not. self._toolbar.set_active(self.getActiveAxes()) evt.Skip() @@ -1656,7 +1687,11 @@ self._menu.Append(menuId, "Axis %d" % i, "Select axis %d" % i, True) self._menu.Check(menuId, True) bind(self, wx.EVT_MENU, self._onMenuItemSelected, id=menuId) - self._toolbar.set_active(range(len(self._axisId))) + elif maxAxis < len(self._axisId): + for menuId in self._axisId[maxAxis:]: + self._menu.Delete(menuId) + self._axisId = self._axisId[:maxAxis] + self._toolbar.set_active(range(maxAxis)) def getActiveAxes(self): """Return a list of the selected axes.""" @@ -2016,7 +2051,8 @@ def update(self): """ - Update the toolbar menu - called when (e.g.) a new subplot or axes are added + Update the toolbar menu - called when (e.g.) a new subplot + or axes are added """ DEBUG_MSG("update()", 1, self) self._axes = self.canvas.figure.get_axes() diff -Nru matplotlib-0.99.3/lib/matplotlib/backends/qt4_editor/figureoptions.py matplotlib-1.0.1/lib/matplotlib/backends/qt4_editor/figureoptions.py --- matplotlib-0.99.3/lib/matplotlib/backends/qt4_editor/figureoptions.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/backends/qt4_editor/figureoptions.py 2010-07-07 01:41:52.000000000 +0000 @@ -0,0 +1,157 @@ +# -*- coding: utf-8 -*- +# +# Copyright © 2009 Pierre Raybaut +# Licensed under the terms of the MIT License +# see the mpl licenses directory for a copy of the license + +"""Module that provides a GUI-based editor for matplotlib's figure options""" + +import os.path as osp + +import matplotlib.backends.qt4_editor.formlayout as formlayout +from PyQt4.QtGui import QIcon + +def get_icon(name): + import matplotlib + basedir = osp.join(matplotlib.rcParams['datapath'], 'images') + return QIcon(osp.join(basedir, name)) + +LINESTYLES = { + '-': 'Solid', + '--': 'Dashed', + '-.': 'DashDot', + ':': 'Dotted', + 'steps': 'Steps', + 'none': 'None', + } + +MARKERS = { + 'none': 'None', + 'o': 'circles', + '^': 'triangle_up', + 'v': 'triangle_down', + '<': 'triangle_left', + '>': 'triangle_right', + 's': 'square', + '+': 'plus', + 'x': 'cross', + '*': 'star', + 'D': 'diamond', + 'd': 'thin_diamond', + '1': 'tripod_down', + '2': 'tripod_up', + '3': 'tripod_left', + '4': 'tripod_right', + 'h': 'hexagon', + 'H': 'rotated_hexagon', + 'p': 'pentagon', + '|': 'vertical_line', + '_': 'horizontal_line', + '.': 'dots', + } + +COLORS = {'b': '#0000ff', 'g': '#00ff00', 'r': '#ff0000', 'c': '#ff00ff', + 'm': '#ff00ff', 'y': '#ffff00', 'k': '#000000', 'w': '#ffffff'} + +def col2hex(color): + """Convert matplotlib color to hex""" + return COLORS.get(color, color) + +def figure_edit(axes, parent=None): + """Edit matplotlib figure options""" + sep = (None, None) # separator + + has_curve = len(axes.get_lines()) > 0 + + # Get / General + xmin, xmax = axes.get_xlim() + ymin, ymax = axes.get_ylim() + general = [('Title', axes.get_title()), + sep, + (None, "X-Axis"), + ('Min', xmin), ('Max', xmax), + ('Label', axes.get_xlabel()), + ('Scale', [axes.get_xscale(), 'linear', 'log']), + sep, + (None, "Y-Axis"), + ('Min', ymin), ('Max', ymax), + ('Label', axes.get_ylabel()), + ('Scale', [axes.get_yscale(), 'linear', 'log']) + ] + + if has_curve: + # Get / Curves + linedict = {} + for line in axes.get_lines(): + label = line.get_label() + if label == '_nolegend_': + continue + linedict[label] = line + curves = [] + linestyles = LINESTYLES.items() + markers = MARKERS.items() + curvelabels = sorted(linedict.keys()) + for label in curvelabels: + line = linedict[label] + curvedata = [ + ('Label', label), + sep, + (None, 'Line'), + ('Style', [line.get_linestyle()] + linestyles), + ('Width', line.get_linewidth()), + ('Color', col2hex(line.get_color())), + sep, + (None, 'Marker'), + ('Style', [line.get_marker()] + markers), + ('Size', line.get_markersize()), + ('Facecolor', col2hex(line.get_markerfacecolor())), + ('Edgecolor', col2hex(line.get_markeredgecolor())), + ] + curves.append([curvedata, label, ""]) + + datalist = [(general, "Axes", "")] + if has_curve: + datalist.append((curves, "Curves", "")) + + def apply_callback(data): + """This function will be called to apply changes""" + if has_curve: + general, curves = data + else: + general, = data + + # Set / General + title, xmin, xmax, xlabel, xscale, ymin, ymax, ylabel, yscale = general + axes.set_xscale(xscale) + axes.set_yscale(yscale) + axes.set_title(title) + axes.set_xlim(xmin, xmax) + axes.set_xlabel(xlabel) + axes.set_ylim(ymin, ymax) + axes.set_ylabel(ylabel) + + if has_curve: + # Set / Curves + for index, curve in enumerate(curves): + line = linedict[curvelabels[index]] + label, linestyle, linewidth, color, \ + marker, markersize, markerfacecolor, markeredgecolor = curve + line.set_label(label) + line.set_linestyle(linestyle) + line.set_linewidth(linewidth) + line.set_color(color) + if marker is not 'none': + line.set_marker(marker) + line.set_markersize(markersize) + line.set_markerfacecolor(markerfacecolor) + line.set_markeredgecolor(markeredgecolor) + + # Redraw + figure = axes.get_figure() + figure.canvas.draw() + + data = formlayout.fedit(datalist, title="Figure options", parent=parent, + icon=get_icon('qt4_editor_options.svg'), apply=apply_callback) + if data is not None: + apply_callback(data) + diff -Nru matplotlib-0.99.3/lib/matplotlib/backends/qt4_editor/formlayout.py matplotlib-1.0.1/lib/matplotlib/backends/qt4_editor/formlayout.py --- matplotlib-0.99.3/lib/matplotlib/backends/qt4_editor/formlayout.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/backends/qt4_editor/formlayout.py 2011-01-05 15:59:56.000000000 +0000 @@ -0,0 +1,511 @@ +# -*- coding: utf-8 -*- +""" +formlayout +========== + +Module creating PyQt4 form dialogs/layouts to edit various type of parameters + + +formlayout License Agreement (MIT License) +------------------------------------------ + +Copyright (c) 2009 Pierre Raybaut + +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. +""" + +# History: +# 1.0.7: added support for "Apply" button +# 1.0.6: code cleaning + +__version__ = '1.0.7' +__license__ = __doc__ + +DEBUG = False + +import sys +STDERR = sys.stderr + +try: + from PyQt4.QtGui import QFormLayout +except ImportError: + raise ImportError, "Warning: formlayout requires PyQt4 >v4.3" + +from PyQt4.QtGui import (QWidget, QLineEdit, QComboBox, QLabel, QSpinBox, QIcon, + QStyle, QDialogButtonBox, QHBoxLayout, QVBoxLayout, + QDialog, QColor, QPushButton, QCheckBox, QColorDialog, + QPixmap, QTabWidget, QApplication, QStackedWidget, + QDateEdit, QDateTimeEdit, QFont, QFontComboBox, + QFontDatabase, QGridLayout) +from PyQt4.QtCore import (Qt, SIGNAL, SLOT, QSize, QString, + pyqtSignature, pyqtProperty) +from datetime import date + + +class ColorButton(QPushButton): + """ + Color choosing push button + """ + __pyqtSignals__ = ("colorChanged(QColor)",) + + def __init__(self, parent=None): + QPushButton.__init__(self, parent) + self.setFixedSize(20, 20) + self.setIconSize(QSize(12, 12)) + self.connect(self, SIGNAL("clicked()"), self.choose_color) + self._color = QColor() + + def choose_color(self): + rgba, valid = QColorDialog.getRgba(self._color.rgba(), + self.parentWidget()) + if valid: + color = QColor.fromRgba(rgba) + self.set_color(color) + + def get_color(self): + return self._color + + @pyqtSignature("QColor") + def set_color(self, color): + if color != self._color: + self._color = color + self.emit(SIGNAL("colorChanged(QColor)"), self._color) + pixmap = QPixmap(self.iconSize()) + pixmap.fill(color) + self.setIcon(QIcon(pixmap)) + + color = pyqtProperty("QColor", get_color, set_color) + + +def text_to_qcolor(text): + """ + Create a QColor from specified string + Avoid warning from Qt when an invalid QColor is instantiated + """ + color = QColor() + if isinstance(text, QString): + text = str(text) + if not isinstance(text, (unicode, str)): + return color + if text.startswith('#') and len(text)==7: + correct = '#0123456789abcdef' + for char in text: + if char.lower() not in correct: + return color + elif text not in list(QColor.colorNames()): + return color + color.setNamedColor(text) + return color + + +class ColorLayout(QHBoxLayout): + """Color-specialized QLineEdit layout""" + def __init__(self, color, parent=None): + QHBoxLayout.__init__(self) + assert isinstance(color, QColor) + self.lineedit = QLineEdit(color.name(), parent) + self.connect(self.lineedit, SIGNAL("textChanged(QString)"), + self.update_color) + self.addWidget(self.lineedit) + self.colorbtn = ColorButton(parent) + self.colorbtn.color = color + self.connect(self.colorbtn, SIGNAL("colorChanged(QColor)"), + self.update_text) + self.addWidget(self.colorbtn) + + def update_color(self, text): + color = text_to_qcolor(text) + if color.isValid(): + self.colorbtn.color = color + + def update_text(self, color): + self.lineedit.setText(color.name()) + + def text(self): + return self.lineedit.text() + + +def font_is_installed(font): + """Check if font is installed""" + return [fam for fam in QFontDatabase().families() if unicode(fam)==font] + +def tuple_to_qfont(tup): + """ + Create a QFont from tuple: + (family [string], size [int], italic [bool], bold [bool]) + """ + if not isinstance(tup, tuple) or len(tup) != 4 \ + or not font_is_installed(tup[0]) \ + or not isinstance(tup[1], int) \ + or not isinstance(tup[2], bool) \ + or not isinstance(tup[3], bool): + return None + font = QFont() + family, size, italic, bold = tup + font.setFamily(family) + font.setPointSize(size) + font.setItalic(italic) + font.setBold(bold) + return font + +def qfont_to_tuple(font): + return (unicode(font.family()), int(font.pointSize()), + font.italic(), font.bold()) + + +class FontLayout(QGridLayout): + """Font selection""" + def __init__(self, value, parent=None): + QGridLayout.__init__(self) + font = tuple_to_qfont(value) + assert font is not None + + # Font family + self.family = QFontComboBox(parent) + self.family.setCurrentFont(font) + self.addWidget(self.family, 0, 0, 1, -1) + + # Font size + self.size = QComboBox(parent) + self.size.setEditable(True) + sizelist = range(6, 12) + range(12, 30, 2) + [36, 48, 72] + size = font.pointSize() + if size not in sizelist: + sizelist.append(size) + sizelist.sort() + self.size.addItems([str(s) for s in sizelist]) + self.size.setCurrentIndex(sizelist.index(size)) + self.addWidget(self.size, 1, 0) + + # Italic or not + self.italic = QCheckBox(self.tr("Italic"), parent) + self.italic.setChecked(font.italic()) + self.addWidget(self.italic, 1, 1) + + # Bold or not + self.bold = QCheckBox(self.tr("Bold"), parent) + self.bold.setChecked(font.bold()) + self.addWidget(self.bold, 1, 2) + + def get_font(self): + font = self.family.currentFont() + font.setItalic(self.italic.isChecked()) + font.setBold(self.bold.isChecked()) + font.setPointSize(int(self.size.currentText())) + return qfont_to_tuple(font) + + +class FormWidget(QWidget): + def __init__(self, data, comment="", parent=None): + super(FormWidget, self).__init__(parent) + from copy import deepcopy + self.data = deepcopy(data) + self.widgets = [] + self.formlayout = QFormLayout(self) + if comment: + self.formlayout.addRow(QLabel(comment)) + self.formlayout.addRow(QLabel(" ")) + if DEBUG: + print "\n"+("*"*80) + print "DATA:", self.data + print "*"*80 + print "COMMENT:", comment + print "*"*80 + self.setup() + + def setup(self): + for label, value in self.data: + if DEBUG: + print "value:", value + if label is None and value is None: + # Separator: (None, None) + self.formlayout.addRow(QLabel(" "), QLabel(" ")) + self.widgets.append(None) + continue + elif label is None: + # Comment + self.formlayout.addRow(QLabel(value)) + self.widgets.append(None) + continue + elif tuple_to_qfont(value) is not None: + field = FontLayout(value, self) + elif text_to_qcolor(value).isValid(): + field = ColorLayout(QColor(value), self) + elif isinstance(value, (str, unicode)): + field = QLineEdit(value, self) + elif isinstance(value, (list, tuple)): + selindex = value.pop(0) + field = QComboBox(self) + if isinstance(value[0], (list, tuple)): + keys = [ key for key, _val in value ] + value = [ val for _key, val in value ] + else: + keys = value + field.addItems(value) + if selindex in value: + selindex = value.index(selindex) + elif selindex in keys: + selindex = keys.index(selindex) + elif not isinstance(selindex, int): + print >>STDERR, "Warning: '%s' index is invalid (label: " \ + "%s, value: %s)" % (selindex, label, value) + selindex = 0 + field.setCurrentIndex(selindex) + elif isinstance(value, bool): + field = QCheckBox(self) + if value: + field.setCheckState(Qt.Checked) + else: + field.setCheckedState(Qt.Unchecked) + + elif isinstance(value, float): + field = QLineEdit(repr(value), self) + elif isinstance(value, int): + field = QSpinBox(self) + field.setValue(value) + field.setMaximum(1e9) + elif isinstance(value, date): + if hasattr(value, 'hour'): + field = QDateTimeEdit(self) + field.setDateTime(value) + else: + field = QDateEdit(self) + field.setDate(value) + else: + field = QLineEdit(repr(value), self) + self.formlayout.addRow(label, field) + self.widgets.append(field) + + def get(self): + valuelist = [] + for index, (label, value) in enumerate(self.data): + field = self.widgets[index] + if label is None: + # Separator / Comment + continue + elif tuple_to_qfont(value) is not None: + value = field.get_font() + elif isinstance(value, (str, unicode)): + value = unicode(field.text()) + elif isinstance(value, (list, tuple)): + index = int(field.currentIndex()) + if isinstance(value[0], (list, tuple)): + value = value[index][0] + else: + value = value[index] + elif isinstance(value, bool): + value = field.checkState() == Qt.Checked + elif isinstance(value, float): + value = float(field.text()) + elif isinstance(value, int): + value = int(field.value()) + elif isinstance(value, date): + if hasattr(value, 'hour'): + value = field.dateTime().toPyDateTime() + else: + value = field.date().toPyDate() + else: + value = eval(str(field.text())) + valuelist.append(value) + return valuelist + + +class FormComboWidget(QWidget): + def __init__(self, datalist, comment="", parent=None): + super(FormComboWidget, self).__init__(parent) + layout = QVBoxLayout() + self.setLayout(layout) + self.combobox = QComboBox() + layout.addWidget(self.combobox) + + self.stackwidget = QStackedWidget(self) + layout.addWidget(self.stackwidget) + self.connect(self.combobox, SIGNAL("currentIndexChanged(int)"), + self.stackwidget, SLOT("setCurrentIndex(int)")) + + self.widgetlist = [] + for data, title, comment in datalist: + self.combobox.addItem(title) + widget = FormWidget(data, comment=comment, parent=self) + self.stackwidget.addWidget(widget) + self.widgetlist.append(widget) + + def get(self): + return [ widget.get() for widget in self.widgetlist] + + +class FormTabWidget(QWidget): + def __init__(self, datalist, comment="", parent=None): + super(FormTabWidget, self).__init__(parent) + layout = QVBoxLayout() + self.tabwidget = QTabWidget() + layout.addWidget(self.tabwidget) + self.setLayout(layout) + self.widgetlist = [] + for data, title, comment in datalist: + if len(data[0])==3: + widget = FormComboWidget(data, comment=comment, parent=self) + else: + widget = FormWidget(data, comment=comment, parent=self) + index = self.tabwidget.addTab(widget, title) + self.tabwidget.setTabToolTip(index, comment) + self.widgetlist.append(widget) + + def get(self): + return [ widget.get() for widget in self.widgetlist] + + +class FormDialog(QDialog): + """Form Dialog""" + def __init__(self, data, title="", comment="", + icon=None, parent=None, apply=None): + super(FormDialog, self).__init__(parent) + + self.apply_callback = apply + + # Form + if isinstance(data[0][0], (list, tuple)): + self.formwidget = FormTabWidget(data, comment=comment, + parent=self) + elif len(data[0])==3: + self.formwidget = FormComboWidget(data, comment=comment, + parent=self) + else: + self.formwidget = FormWidget(data, comment=comment, + parent=self) + layout = QVBoxLayout() + layout.addWidget(self.formwidget) + + # Button box + bbox = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) + if self.apply_callback is not None: + apply_btn = bbox.addButton(QDialogButtonBox.Apply) + self.connect(apply_btn, SIGNAL("clicked()"), self.apply) + self.connect(bbox, SIGNAL("accepted()"), SLOT("accept()")) + self.connect(bbox, SIGNAL("rejected()"), SLOT("reject()")) + layout.addWidget(bbox) + + self.setLayout(layout) + + self.setWindowTitle(title) + if not isinstance(icon, QIcon): + icon = QWidget().style().standardIcon(QStyle.SP_MessageBoxQuestion) + self.setWindowIcon(icon) + + def accept(self): + self.data = self.formwidget.get() + QDialog.accept(self) + + def reject(self): + self.data = None + QDialog.reject(self) + + def apply(self): + self.apply_callback(self.formwidget.get()) + + def get(self): + """Return form result""" + return self.data + + +def fedit(data, title="", comment="", icon=None, parent=None, apply=None): + """ + Create form dialog and return result + (if Cancel button is pressed, return None) + + data: datalist, datagroup + title: string + comment: string + icon: QIcon instance + parent: parent QWidget + apply: apply callback (function) + + datalist: list/tuple of (field_name, field_value) + datagroup: list/tuple of (datalist *or* datagroup, title, comment) + + -> one field for each member of a datalist + -> one tab for each member of a top-level datagroup + -> one page (of a multipage widget, each page can be selected with a combo + box) for each member of a datagroup inside a datagroup + + Supported types for field_value: + - int, float, str, unicode, bool + - colors: in Qt-compatible text form, i.e. in hex format or name (red,...) + (automatically detected from a string) + - list/tuple: + * the first element will be the selected index (or value) + * the other elements can be couples (key, value) or only values + """ + + # Create a QApplication instance if no instance currently exists + # (e.g. if the module is used directly from the interpreter) + if QApplication.startingUp(): + QApplication([]) + + dialog = FormDialog(data, title, comment, icon, parent, apply) + if dialog.exec_(): + return dialog.get() + + + +if __name__ == "__main__": + + def create_datalist_example(): + return [('str', 'this is a string'), + ('list', [0, '1', '3', '4']), + ('list2', ['--', ('none', 'None'), ('--', 'Dashed'), + ('-.', 'DashDot'), ('-', 'Solid'), + ('steps', 'Steps'), (':', 'Dotted')]), + ('float', 1.2), + (None, 'Other:'), + ('int', 12), + ('font', ('Arial', 10, False, True)), + ('color', '#123409'), + ('bool', True), + ('datetime', date(2010, 10, 10)), + ] + + def create_datagroup_example(): + datalist = create_datalist_example() + return ((datalist, "Category 1", "Category 1 comment"), + (datalist, "Category 2", "Category 2 comment"), + (datalist, "Category 3", "Category 3 comment")) + + #--------- datalist example + datalist = create_datalist_example() + def apply_test(data): + print "data:", data + print "result:", fedit(datalist, title="Example", + comment="This is just an example.", + apply=apply_test) + + #--------- datagroup example + datagroup = create_datagroup_example() + print "result:", fedit(datagroup, "Global title") + + #--------- datagroup inside a datagroup example + datalist = create_datalist_example() + datagroup = create_datagroup_example() + print "result:", fedit(((datagroup, "Title 1", "Tab 1 comment"), + (datalist, "Title 2", "Tab 2 comment"), + (datalist, "Title 3", "Tab 3 comment")), + "Global title") diff -Nru matplotlib-0.99.3/lib/matplotlib/backends/windowing.py matplotlib-1.0.1/lib/matplotlib/backends/windowing.py --- matplotlib-0.99.3/lib/matplotlib/backends/windowing.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/backends/windowing.py 2010-07-07 01:41:52.000000000 +0000 @@ -0,0 +1,26 @@ +""" +MS Windows-specific helper for TkAgg and FltkAgg backends. + +With rcParams['tk.window_focus'] default of False, it is +effectively disabled. + +It uses a tiny C++ extension module to access MS Win functions. +""" +from matplotlib import rcParams + +try: + if not rcParams['tk.window_focus']: + raise ImportError + from matplotlib._windowing import GetForegroundWindow, SetForegroundWindow +except ImportError: + def GetForegroundWindow(): + return 0 + def SetForegroundWindow(hwnd): + pass + +class FocusManager: + def __init__(self): + self._shellWindow = GetForegroundWindow() + + def __del__(self): + SetForegroundWindow(self._shellWindow) diff -Nru matplotlib-0.99.3/lib/matplotlib/bezier.py matplotlib-1.0.1/lib/matplotlib/bezier.py --- matplotlib-0.99.3/lib/matplotlib/bezier.py 2009-09-21 18:56:19.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/bezier.py 2010-10-12 16:14:42.000000000 +0000 @@ -9,6 +9,7 @@ from matplotlib.path import Path from operator import xor +import warnings # some functions @@ -323,6 +324,22 @@ d = (dx*dx + dy*dy)**.5 return dx/d, dy/d +def check_if_parallel(dx1, dy1, dx2, dy2, tolerence=1.e-5): + """ returns + * 1 if two lines are parralel in same direction + * -1 if two lines are parralel in opposite direction + * 0 otherwise + """ + theta1 = np.arctan2(dx1, dy1) + theta2 = np.arctan2(dx2, dy2) + dtheta = np.abs(theta1 - theta2) + if dtheta < tolerence: + return 1 + elif np.abs(dtheta - np.pi) < tolerence: + return -1 + else: + return False + def get_parallels(bezier2, width): """ @@ -338,10 +355,18 @@ cmx, cmy = bezier2[1] c2x, c2y = bezier2[2] - # t1 and t2 is the anlge between c1 and cm, cm, c2. - # They are also a angle of the tangential line of the path at c1 and c2 - cos_t1, sin_t1 = get_cos_sin(c1x, c1y, cmx, cmy) - cos_t2, sin_t2 = get_cos_sin(cmx, cmy, c2x, c2y) + parallel_test = check_if_parallel(c1x-cmx, c1y-cmy, cmx-c2x, cmy-c2y) + + if parallel_test == -1: + warnings.warn("Lines do not intersect. A straight line is used instead.") + #cmx, cmy = 0.5*(c1x+c2x), 0.5*(c1y+c2y) + cos_t1, sin_t1 = get_cos_sin(c1x, c1y, c2x, c2y) + cos_t2, sin_t2 = cos_t1, sin_t1 + else: + # t1 and t2 is the anlge between c1 and cm, cm, c2. They are + # also a angle of the tangential line of the path at c1 and c2 + cos_t1, sin_t1 = get_cos_sin(c1x, c1y, cmx, cmy) + cos_t2, sin_t2 = get_cos_sin(cmx, cmy, c2x, c2y) # find c1_left, c1_right which are located along the lines # throught c1 and perpendicular to the tangential lines of the @@ -355,11 +380,21 @@ # find cm_left which is the intersectng point of a line through # c1_left with angle t1 and a line throught c2_left with angle # t2. Same with cm_right. - cmx_left, cmy_left = get_intersection(c1x_left, c1y_left, cos_t1, sin_t1, - c2x_left, c2y_left, cos_t2, sin_t2) - - cmx_right, cmy_right = get_intersection(c1x_right, c1y_right, cos_t1, sin_t1, - c2x_right, c2y_right, cos_t2, sin_t2) + if parallel_test != 0: + # a special case for a straight line, i.e., angle between two + # lines are smaller than some (arbitrtay) value. + cmx_left, cmy_left = \ + 0.5*(c1x_left+c2x_left), 0.5*(c1y_left+c2y_left) + cmx_right, cmy_right = \ + 0.5*(c1x_right+c2x_right), 0.5*(c1y_right+c2y_right) + else: + cmx_left, cmy_left = \ + get_intersection(c1x_left, c1y_left, cos_t1, sin_t1, + c2x_left, c2y_left, cos_t2, sin_t2) + + cmx_right, cmy_right = \ + get_intersection(c1x_right, c1y_right, cos_t1, sin_t1, + c2x_right, c2y_right, cos_t2, sin_t2) # the parralel bezier lines are created with control points of # [c1_left, cm_left, c2_left] and [c1_right, cm_right, c2_right] diff -Nru matplotlib-0.99.3/lib/matplotlib/blocking_input.py matplotlib-1.0.1/lib/matplotlib/blocking_input.py --- matplotlib-0.99.3/lib/matplotlib/blocking_input.py 2009-08-31 03:25:47.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/blocking_input.py 2010-07-07 01:41:52.000000000 +0000 @@ -19,6 +19,7 @@ from matplotlib import path, verbose from matplotlib.cbook import is_sequence_of_strings +import matplotlib.lines as mlines class BlockingInput(object): """ @@ -161,6 +162,10 @@ ''' event = self.events[-1] + if event.key is None: + # at least in mac os X gtk backend some key returns None. + return + key = event.key.lower() if key in ['backspace', 'delete']: @@ -190,10 +195,10 @@ BlockingInput.pop(self,-1) # This will exit even if not in infinite mode. This is - # consistent with matlab and sometimes quite useful, but will + # consistent with MATLAB and sometimes quite useful, but will # require the user to test how many points were actually # returned before using data. - self.fig.canvas.stop_event_loop(event) + self.fig.canvas.stop_event_loop() def mouse_event_pop( self, event ): """ @@ -218,18 +223,10 @@ # If desired plot up click if self.show_clicks: - - # make sure we don't mess with the axes zoom - xlim = event.inaxes.get_xlim() - ylim = event.inaxes.get_ylim() - - # plot the clicks - self.marks.extend( - event.inaxes.plot([event.xdata,], [event.ydata,], 'r+') ) - - # before we draw, make sure to reset the limits - event.inaxes.set_xlim(xlim) - event.inaxes.set_ylim(ylim) + line = mlines.Line2D([event.xdata], [event.ydata], + marker='+', color='r') + event.inaxes.add_line(line) + self.marks.append(line) self.fig.canvas.draw() @@ -243,16 +240,9 @@ if self.show_clicks: - # make sure we don't mess with the axes zoom - xlim = event.inaxes.get_xlim() - ylim = event.inaxes.get_ylim() - mark = self.marks.pop(index) mark.remove() - # before we draw, make sure to reset the limits - event.inaxes.set_xlim(xlim) - event.inaxes.set_ylim(ylim) self.fig.canvas.draw() # NOTE: I do NOT understand why the above 3 lines does not work # for the keyboard backspace event on windows XP wxAgg. @@ -271,20 +261,11 @@ def cleanup(self,event=None): # clean the figure if self.show_clicks: - if event: - # make sure we don't mess with the axes zoom - xlim = event.inaxes.get_xlim() - ylim = event.inaxes.get_ylim() for mark in self.marks: mark.remove() self.marks = [] - if event: - # before we draw, make sure to reset the limits - event.inaxes.set_xlim(xlim) - event.inaxes.set_ylim(ylim) - self.fig.canvas.draw() # Call base class to remove callbacks @@ -311,6 +292,12 @@ self.cs = cs BlockingMouseInput.__init__(self, fig=cs.ax.figure ) + def add_click(self, event): + self.button1(event) + + def pop_click(self, event, index=-1): + self.button3(event) + def button1(self,event): """ This will be called if an event involving a button other than @@ -376,10 +363,6 @@ broken contour - once humpty-dumpty is broken, he can't be put back together. In inline mode, this does nothing. """ - # Remove this last event - not too important for clabel use - # since clabel normally doesn't have a maximum number of - # events, but best for cleanliness sake. - BlockingInput.pop(self) if self.inline: pass diff -Nru matplotlib-0.99.3/lib/matplotlib/cbook.py matplotlib-1.0.1/lib/matplotlib/cbook.py --- matplotlib-0.99.3/lib/matplotlib/cbook.py 2010-03-09 14:20:20.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/cbook.py 2010-12-13 15:27:29.000000000 +0000 @@ -9,6 +9,13 @@ import numpy as np import numpy.ma as ma from weakref import ref +import cPickle +import os.path +import random +import urllib2 +import new + +import matplotlib major, minor1, minor2, s, tmp = sys.version_info @@ -16,13 +23,17 @@ # On some systems, locale.getpreferredencoding returns None, # which can break unicode; and the sage project reports that # some systems have incorrect locale specifications, e.g., -# an encoding instead of a valid locale name. +# an encoding instead of a valid locale name. Another +# pathological case that has been reported is an empty string. + +# On some systems, getpreferredencoding sets the locale, which has +# side effects. Passing False eliminates those side effects. try: - preferredencoding = locale.getpreferredencoding() -except ValueError: - preferredencoding = None -except ImportError: + preferredencoding = locale.getpreferredencoding(False).strip() + if not preferredencoding: + preferredencoding = None +except (ValueError, ImportError, AttributeError): preferredencoding = None def unicode_safe(s): @@ -120,12 +131,87 @@ callbacks.disconnect(ideat) # disconnect oneat callbacks.process('eat', 456) # nothing will be called - """ + In practice, one should always disconnect all callbacks when they + are no longer needed to avoid dangling references (and thus memory + leaks). However, real code in matplotlib rarely does so, and due + to its design, it is rather difficult to place this kind of code. + To get around this, and prevent this class of memory leaks, we + instead store weak references to bound methods only, so when the + destination object needs to die, the CallbackRegistry won't keep + it alive. The Python stdlib weakref module can not create weak + references to bound methods directly, so we need to create a proxy + object to handle weak references to bound methods (or regular free + functions). This technique was shared by Peter Parente on his + `"Mindtrove" blog + `_. + """ + class BoundMethodProxy(object): + ''' + Our own proxy object which enables weak references to bound and unbound + methods and arbitrary callables. Pulls information about the function, + class, and instance out of a bound method. Stores a weak reference to the + instance to support garbage collection. + + @organization: IBM Corporation + @copyright: Copyright (c) 2005, 2006 IBM Corporation + @license: The BSD License + + Minor bugfixes by Michael Droettboom + ''' + def __init__(self, cb): + try: + try: + self.inst = ref(cb.im_self) + except TypeError: + self.inst = None + self.func = cb.im_func + self.klass = cb.im_class + except AttributeError: + self.inst = None + self.func = cb + self.klass = None + + def __call__(self, *args, **kwargs): + ''' + Proxy for a call to the weak referenced object. Take + arbitrary params to pass to the callable. + + Raises `ReferenceError`: When the weak reference refers to + a dead object + ''' + if self.inst is not None and self.inst() is None: + raise ReferenceError + elif self.inst is not None: + # build a new instance method with a strong reference to the instance + mtd = new.instancemethod(self.func, self.inst(), self.klass) + else: + # not a bound method, just return the func + mtd = self.func + # invoke the callable and return the result + return mtd(*args, **kwargs) + + def __eq__(self, other): + ''' + Compare the held function and instance with that held by + another proxy. + ''' + try: + if self.inst is None: + return self.func == other.func and other.inst is None + else: + return self.func == other.func and self.inst() == other.inst() + except Exception: + return False + + def __ne__(self, other): + ''' + Inverse of __eq__. + ''' + return not self.__eq__(other) + def __init__(self, signals): '*signals* is a sequence of valid signals' self.signals = set(signals) - # callbacks is a dict mapping the signal to a dictionary - # mapping callback id to the callback function self.callbacks = dict([(s, dict()) for s in signals]) self._cid = 0 @@ -142,8 +228,15 @@ func will be called """ self._check_signal(s) - self._cid +=1 - self.callbacks[s][self._cid] = func + proxy = self.BoundMethodProxy(func) + for cid, callback in self.callbacks[s].items(): + # Clean out dead references + if callback.inst is not None and callback.inst() is None: + del self.callbacks[s][cid] + elif callback == proxy: + return cid + self._cid += 1 + self.callbacks[s][self._cid] = proxy return self._cid def disconnect(self, cid): @@ -151,9 +244,12 @@ disconnect the callback registered with callback id *cid* """ for eventname, callbackd in self.callbacks.items(): - try: del callbackd[cid] - except KeyError: continue - else: return + try: + del callbackd[cid] + except KeyError: + continue + else: + return def process(self, s, *args, **kwargs): """ @@ -161,8 +257,12 @@ callbacks on *s* will be called with *\*args* and *\*\*kwargs* """ self._check_signal(s) - for func in self.callbacks[s].values(): - func(*args, **kwargs) + for cid, proxy in self.callbacks[s].items(): + # Clean out dead references + if proxy.inst is not None and proxy.inst() is None: + del self.callbacks[s][cid] + else: + proxy(*args, **kwargs) class Scheduler(threading.Thread): @@ -313,7 +413,7 @@ def is_numlike(obj): 'return true if *obj* looks like a number' try: obj+1 - except TypeError: return False + except: return False else: return True def to_filehandle(fname, flag='rU', return_opened=False): @@ -348,6 +448,234 @@ def is_scalar_or_string(val): return is_string_like(val) or not iterable(val) +class ViewVCCachedServer(urllib2.BaseHandler): + """ + Urllib2 handler that takes care of caching files. + The file cache.pck holds the directory of files that have been cached. + """ + def __init__(self, cache_dir, baseurl): + self.cache_dir = cache_dir + self.baseurl = baseurl + self.read_cache() + self.remove_stale_files() + self.opener = urllib2.build_opener(self) + + def in_cache_dir(self, fn): + # make sure the datadir exists + reldir, filename = os.path.split(fn) + datadir = os.path.join(self.cache_dir, reldir) + if not os.path.exists(datadir): + os.makedirs(datadir) + + return os.path.join(datadir, filename) + + def read_cache(self): + """ + Read the cache file from the cache directory. + """ + fn = self.in_cache_dir('cache.pck') + if not os.path.exists(fn): + self.cache = {} + return + + f = open(fn, 'rb') + cache = cPickle.load(f) + f.close() + + # Earlier versions did not have the full paths in cache.pck + for url, (fn, x, y) in cache.items(): + if not os.path.isabs(fn): + cache[url] = (self.in_cache_dir(fn), x, y) + + # If any files are deleted, drop them from the cache + for url, (fn, _, _) in cache.items(): + if not os.path.exists(fn): + del cache[url] + + self.cache = cache + + def remove_stale_files(self): + """ + Remove files from the cache directory that are not listed in + cache.pck. + """ + # TODO: remove empty subdirectories + listed = set(fn for (_, (fn, _, _)) in self.cache.items()) + existing = reduce(set.union, + (set(os.path.join(dirpath, fn) for fn in filenames) + for (dirpath, _, filenames) in os.walk(self.cache_dir))) + matplotlib.verbose.report( + 'ViewVCCachedServer: files listed in cache.pck: %s' % listed, 'debug') + matplotlib.verbose.report( + 'ViewVCCachedServer: files in cache directory: %s' % existing, 'debug') + + for path in existing - listed - set([self.in_cache_dir('cache.pck')]): + matplotlib.verbose.report('ViewVCCachedServer:remove_stale_files: removing %s'%path, + level='debug') + os.remove(path) + + def write_cache(self): + """ + Write the cache data structure into the cache directory. + """ + fn = self.in_cache_dir('cache.pck') + f = open(fn, 'wb') + cPickle.dump(self.cache, f, -1) + f.close() + + def cache_file(self, url, data, headers): + """ + Store a received file in the cache directory. + """ + # Pick a filename + fn = url[len(self.baseurl):] + fullpath = self.in_cache_dir(fn) + + f = open(fullpath, 'wb') + f.write(data) + f.close() + + # Update the cache + self.cache[url] = (fullpath, headers.get('ETag'), headers.get('Last-Modified')) + self.write_cache() + + # These urllib2 entry points are used: + # http_request for preprocessing requests + # http_error_304 for handling 304 Not Modified responses + # http_response for postprocessing requests + + def http_request(self, req): + """ + Make the request conditional if we have a cached file. + """ + url = req.get_full_url() + if url in self.cache: + _, etag, lastmod = self.cache[url] + req.add_header("If-None-Match", etag) + req.add_header("If-Modified-Since", lastmod) + return req + + def http_error_304(self, req, fp, code, msg, hdrs): + """ + Read the file from the cache since the server has no newer version. + """ + url = req.get_full_url() + fn, _, _ = self.cache[url] + matplotlib.verbose.report('ViewVCCachedServer: reading data file from cache file "%s"' + %fn, 'debug') + file = open(fn, 'rb') + handle = urllib2.addinfourl(file, hdrs, url) + handle.code = 304 + return handle + + def http_response(self, req, response): + """ + Update the cache with the returned file. + """ + matplotlib.verbose.report('ViewVCCachedServer: received response %d: %s' + % (response.code, response.msg), 'debug') + if response.code != 200: + return response + else: + data = response.read() + self.cache_file(req.get_full_url(), data, response.headers) + result = urllib2.addinfourl(StringIO.StringIO(data), + response.headers, + req.get_full_url()) + result.code = response.code + result.msg = response.msg + return result + + def get_sample_data(self, fname, asfileobj=True): + """ + Check the cachedirectory for a sample_data file. If it does + not exist, fetch it with urllib from the svn repo and + store it in the cachedir. + + If asfileobj is True, a file object will be returned. Else the + path to the file as a string will be returned. + """ + # TODO: time out if the connection takes forever + # (may not be possible with urllib2 only - spawn a helper process?) + + # quote is not in python2.4, so check for it and get it from + # urllib if it is not available + quote = getattr(urllib2, 'quote', None) + if quote is None: + import urllib + quote = urllib.quote + + # retrieve the URL for the side effect of refreshing the cache + url = self.baseurl + quote(fname) + error = 'unknown error' + matplotlib.verbose.report('ViewVCCachedServer: retrieving %s' + % url, 'debug') + try: + response = self.opener.open(url) + except urllib2.URLError, e: + # could be a missing network connection + error = str(e) + + cached = self.cache.get(url) + if cached is None: + msg = 'file %s not in cache; received %s when trying to retrieve' \ + % (fname, error) + raise KeyError(msg) + + fname = cached[0] + + if asfileobj: + if os.path.splitext(fname)[-1].lower() in ('.csv', '.xrc', '.txt'): + mode = 'r' + else: + mode = 'rb' + return open(fname, mode) + else: + return fname + + +def get_sample_data(fname, asfileobj=True): + """ + Check the cachedirectory ~/.matplotlib/sample_data for a sample_data + file. If it does not exist, fetch it with urllib from the mpl svn repo + + http://matplotlib.svn.sourceforge.net/svnroot/matplotlib/trunk/sample_data/ + + and store it in the cachedir. + + If asfileobj is True, a file object will be returned. Else the + path to the file as a string will be returned + + To add a datafile to this directory, you need to check out + sample_data from matplotlib svn:: + + svn co https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/trunk/sample_data + + and svn add the data file you want to support. This is primarily + intended for use in mpl examples that need custom data. + + To bypass all downloading, set the rc parameter examples.download to False + and examples.directory to the directory where we should look. + """ + + if not matplotlib.rcParams['examples.download']: + directory = matplotlib.rcParams['examples.directory'] + f = os.path.join(directory, fname) + if asfileobj: + return open(f, 'rb') + else: + return f + + myserver = get_sample_data.myserver + if myserver is None: + configdir = matplotlib.get_configdir() + cachedir = os.path.join(configdir, 'sample_data') + baseurl = 'http://matplotlib.svn.sourceforge.net/svnroot/matplotlib/trunk/sample_data/' + myserver = get_sample_data.myserver = ViewVCCachedServer(cachedir, baseurl) + + return myserver.get_sample_data(fname, asfileobj=asfileobj) + +get_sample_data.myserver = None def flatten(seq, scalarp=is_scalar_or_string): """ this generator flattens nested containers such as @@ -693,7 +1021,7 @@ def get_recursive_filelist(args): """ - Recurs all the files and dirs in *args* ignoring symbolic links + Recurse all the files and dirs in *args* ignoring symbolic links and return the files as a list of strings """ files = [] @@ -791,7 +1119,7 @@ -class Stack: +class Stack(object): """ Implement a stack where elements can be pushed on and you can move back and forth. But no pop. Should mimic home / back / forward @@ -807,6 +1135,12 @@ if not len(self._elements): return self._default else: return self._elements[self._pos] + def __len__(self): + return self._elements.__len__() + + def __getitem__(self, ind): + return self._elements.__getitem__(ind) + def forward(self): 'move the position forward and return the current element' N = len(self._elements) @@ -1411,6 +1745,58 @@ import matplotlib.mlab as mlab return mlab.quad2cubic(q0x, q0y, q1x, q1y, q2x, q2y) +def align_iterators(func, *iterables): + """ + This generator takes a bunch of iterables that are ordered by func + It sends out ordered tuples: + + (func(row), [rows from all iterators matching func(row)]) + + It is used by :func:`matplotlib.mlab.recs_join` to join record arrays + """ + class myiter: + def __init__(self, it): + self.it = it + self.key = self.value = None + self.iternext() + + def iternext(self): + try: + self.value = self.it.next() + self.key = func(self.value) + except StopIteration: + self.value = self.key = None + + def __call__(self, key): + retval = None + if key == self.key: + retval = self.value + self.iternext() + elif self.key and key > self.key: + raise ValueError, "Iterator has been left behind" + return retval + + # This can be made more efficient by not computing the minimum key for each iteration + iters = [myiter(it) for it in iterables] + minvals = minkey = True + while 1: + minvals = (filter(None, [it.key for it in iters])) + if minvals: + minkey = min(minvals) + yield (minkey, [it(minkey) for it in iters]) + else: + break + +def is_math_text(s): + # Did we find an even number of non-escaped dollar signs? + # If so, treat is as math text. + s = unicode(s) + + dollar_count = s.count(r'$') - s.count(r'\$') + even_dollars = (dollar_count > 0 and dollar_count % 2 == 0) + + return even_dollars + if __name__=='__main__': assert( allequal([1,1,1]) ) diff -Nru matplotlib-0.99.3/lib/matplotlib/_cm.py matplotlib-1.0.1/lib/matplotlib/_cm.py --- matplotlib-0.99.3/lib/matplotlib/_cm.py 2009-07-31 15:14:40.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/_cm.py 2010-10-12 16:14:42.000000000 +0000 @@ -4,6 +4,8 @@ """ +import numpy as np + _binary_data = { 'red' : ((0., 1., 1.), (1., 0., 0.)), 'green': ((0., 1., 1.), (1., 0., 0.)), @@ -32,95 +34,114 @@ 'green': ((0., 0., 0.),(1.0, 0.7812, 0.7812)), 'blue': ((0., 0., 0.),(1.0, 0.4975, 0.4975))} -_flag_data = {'red': ((0., 1., 1.),(0.015873, 1.000000, 1.000000), - (0.031746, 0.000000, 0.000000),(0.047619, 0.000000, 0.000000), - (0.063492, 1.000000, 1.000000),(0.079365, 1.000000, 1.000000), - (0.095238, 0.000000, 0.000000),(0.111111, 0.000000, 0.000000), - (0.126984, 1.000000, 1.000000),(0.142857, 1.000000, 1.000000), - (0.158730, 0.000000, 0.000000),(0.174603, 0.000000, 0.000000), - (0.190476, 1.000000, 1.000000),(0.206349, 1.000000, 1.000000), - (0.222222, 0.000000, 0.000000),(0.238095, 0.000000, 0.000000), - (0.253968, 1.000000, 1.000000),(0.269841, 1.000000, 1.000000), - (0.285714, 0.000000, 0.000000),(0.301587, 0.000000, 0.000000), - (0.317460, 1.000000, 1.000000),(0.333333, 1.000000, 1.000000), - (0.349206, 0.000000, 0.000000),(0.365079, 0.000000, 0.000000), - (0.380952, 1.000000, 1.000000),(0.396825, 1.000000, 1.000000), - (0.412698, 0.000000, 0.000000),(0.428571, 0.000000, 0.000000), - (0.444444, 1.000000, 1.000000),(0.460317, 1.000000, 1.000000), - (0.476190, 0.000000, 0.000000),(0.492063, 0.000000, 0.000000), - (0.507937, 1.000000, 1.000000),(0.523810, 1.000000, 1.000000), - (0.539683, 0.000000, 0.000000),(0.555556, 0.000000, 0.000000), - (0.571429, 1.000000, 1.000000),(0.587302, 1.000000, 1.000000), - (0.603175, 0.000000, 0.000000),(0.619048, 0.000000, 0.000000), - (0.634921, 1.000000, 1.000000),(0.650794, 1.000000, 1.000000), - (0.666667, 0.000000, 0.000000),(0.682540, 0.000000, 0.000000), - (0.698413, 1.000000, 1.000000),(0.714286, 1.000000, 1.000000), - (0.730159, 0.000000, 0.000000),(0.746032, 0.000000, 0.000000), - (0.761905, 1.000000, 1.000000),(0.777778, 1.000000, 1.000000), - (0.793651, 0.000000, 0.000000),(0.809524, 0.000000, 0.000000), - (0.825397, 1.000000, 1.000000),(0.841270, 1.000000, 1.000000), - (0.857143, 0.000000, 0.000000),(0.873016, 0.000000, 0.000000), - (0.888889, 1.000000, 1.000000),(0.904762, 1.000000, 1.000000), - (0.920635, 0.000000, 0.000000),(0.936508, 0.000000, 0.000000), - (0.952381, 1.000000, 1.000000),(0.968254, 1.000000, 1.000000), - (0.984127, 0.000000, 0.000000),(1.0, 0., 0.)), - 'green': ((0., 0., 0.),(0.015873, 1.000000, 1.000000), - (0.031746, 0.000000, 0.000000),(0.063492, 0.000000, 0.000000), - (0.079365, 1.000000, 1.000000),(0.095238, 0.000000, 0.000000), - (0.126984, 0.000000, 0.000000),(0.142857, 1.000000, 1.000000), - (0.158730, 0.000000, 0.000000),(0.190476, 0.000000, 0.000000), - (0.206349, 1.000000, 1.000000),(0.222222, 0.000000, 0.000000), - (0.253968, 0.000000, 0.000000),(0.269841, 1.000000, 1.000000), - (0.285714, 0.000000, 0.000000),(0.317460, 0.000000, 0.000000), - (0.333333, 1.000000, 1.000000),(0.349206, 0.000000, 0.000000), - (0.380952, 0.000000, 0.000000),(0.396825, 1.000000, 1.000000), - (0.412698, 0.000000, 0.000000),(0.444444, 0.000000, 0.000000), - (0.460317, 1.000000, 1.000000),(0.476190, 0.000000, 0.000000), - (0.507937, 0.000000, 0.000000),(0.523810, 1.000000, 1.000000), - (0.539683, 0.000000, 0.000000),(0.571429, 0.000000, 0.000000), - (0.587302, 1.000000, 1.000000),(0.603175, 0.000000, 0.000000), - (0.634921, 0.000000, 0.000000),(0.650794, 1.000000, 1.000000), - (0.666667, 0.000000, 0.000000),(0.698413, 0.000000, 0.000000), - (0.714286, 1.000000, 1.000000),(0.730159, 0.000000, 0.000000), - (0.761905, 0.000000, 0.000000),(0.777778, 1.000000, 1.000000), - (0.793651, 0.000000, 0.000000),(0.825397, 0.000000, 0.000000), - (0.841270, 1.000000, 1.000000),(0.857143, 0.000000, 0.000000), - (0.888889, 0.000000, 0.000000),(0.904762, 1.000000, 1.000000), - (0.920635, 0.000000, 0.000000),(0.952381, 0.000000, 0.000000), - (0.968254, 1.000000, 1.000000),(0.984127, 0.000000, 0.000000), - (1.0, 0., 0.)), - 'blue': ((0., 0., 0.),(0.015873, 1.000000, 1.000000), - (0.031746, 1.000000, 1.000000),(0.047619, 0.000000, 0.000000), - (0.063492, 0.000000, 0.000000),(0.079365, 1.000000, 1.000000), - (0.095238, 1.000000, 1.000000),(0.111111, 0.000000, 0.000000), - (0.126984, 0.000000, 0.000000),(0.142857, 1.000000, 1.000000), - (0.158730, 1.000000, 1.000000),(0.174603, 0.000000, 0.000000), - (0.190476, 0.000000, 0.000000),(0.206349, 1.000000, 1.000000), - (0.222222, 1.000000, 1.000000),(0.238095, 0.000000, 0.000000), - (0.253968, 0.000000, 0.000000),(0.269841, 1.000000, 1.000000), - (0.285714, 1.000000, 1.000000),(0.301587, 0.000000, 0.000000), - (0.317460, 0.000000, 0.000000),(0.333333, 1.000000, 1.000000), - (0.349206, 1.000000, 1.000000),(0.365079, 0.000000, 0.000000), - (0.380952, 0.000000, 0.000000),(0.396825, 1.000000, 1.000000), - (0.412698, 1.000000, 1.000000),(0.428571, 0.000000, 0.000000), - (0.444444, 0.000000, 0.000000),(0.460317, 1.000000, 1.000000), - (0.476190, 1.000000, 1.000000),(0.492063, 0.000000, 0.000000), - (0.507937, 0.000000, 0.000000),(0.523810, 1.000000, 1.000000), - (0.539683, 1.000000, 1.000000),(0.555556, 0.000000, 0.000000), - (0.571429, 0.000000, 0.000000),(0.587302, 1.000000, 1.000000), - (0.603175, 1.000000, 1.000000),(0.619048, 0.000000, 0.000000), - (0.634921, 0.000000, 0.000000),(0.650794, 1.000000, 1.000000), - (0.666667, 1.000000, 1.000000),(0.682540, 0.000000, 0.000000), - (0.698413, 0.000000, 0.000000),(0.714286, 1.000000, 1.000000), - (0.730159, 1.000000, 1.000000),(0.746032, 0.000000, 0.000000), - (0.761905, 0.000000, 0.000000),(0.777778, 1.000000, 1.000000), - (0.793651, 1.000000, 1.000000),(0.809524, 0.000000, 0.000000), - (0.825397, 0.000000, 0.000000),(0.841270, 1.000000, 1.000000), - (0.857143, 1.000000, 1.000000),(0.873016, 0.000000, 0.000000), - (0.888889, 0.000000, 0.000000),(0.904762, 1.000000, 1.000000), - (0.920635, 1.000000, 1.000000),(0.936508, 0.000000, 0.000000), - (0.952381, 0.000000, 0.000000),(0.968254, 1.000000, 1.000000), - (0.984127, 1.000000, 1.000000),(1.0, 0., 0.))} +_flag_data = { + 'red': lambda x: 0.75 * np.sin((x * 31.5 + 0.25) * np.pi) + 0.5, + 'green': lambda x: np.sin(x * 31.5 * np.pi), + 'blue': lambda x: 0.75 * np.sin((x * 31.5 - 0.25) * np.pi) + 0.5, +} + +_prism_data = { + 'red': lambda x: 0.75 * np.sin((x * 20.9 + 0.25) * np.pi) + 0.67, + 'green': lambda x: 0.75 * np.sin((x * 20.9 - 0.25) * np.pi) + 0.33, + 'blue': lambda x: -1.1 * np.sin((x * 20.9) * np.pi), +} + +_bwr_data = ((0.0, 0.0, 1.0), (1.0, 1.0, 1.0), (1.0, 0.0, 0.0)) +_brg_data = ((0.0, 0.0, 1.0), (1.0, 0.0, 0.0), (0.0, 1.0, 0.0)) + +# Gnuplot palette functions +gfunc = { + 0: lambda x: 0, + 1: lambda x: 0.5, + 2: lambda x: 1, + 3: lambda x: x, + 4: lambda x: x**2, + 5: lambda x: x**3, + 6: lambda x: x**4, + 7: lambda x: np.sqrt(x), + 8: lambda x: np.sqrt(np.sqrt(x)), + 9: lambda x: np.sin(x * np.pi / 2), + 10: lambda x: np.cos(x * np.pi / 2), + 11: lambda x: np.abs(x - 0.5), + 12: lambda x: (2 * x - 1)**2, + 13: lambda x: np.sin(x * np.pi), + 14: lambda x: np.abs(np.cos(x * np.pi)), + 15: lambda x: np.sin(x * 2 * np.pi), + 16: lambda x: np.cos(x * 2 * np.pi), + 17: lambda x: np.abs(np.sin(x * 2 * np.pi)), + 18: lambda x: np.abs(np.cos(x * 2 * np.pi)), + 19: lambda x: np.abs(np.sin(x * 4 * np.pi)), + 20: lambda x: np.abs(np.cos(x * 4 * np.pi)), + 21: lambda x: 3 * x, + 22: lambda x: 3 * x - 1, + 23: lambda x: 3 * x - 2, + 24: lambda x: np.abs(3 * x - 1), + 25: lambda x: np.abs(3 * x - 2), + 26: lambda x: (3 * x - 1) / 2, + 27: lambda x: (3 * x - 2) / 2, + 28: lambda x: np.abs((3 * x - 1) / 2), + 29: lambda x: np.abs((3 * x - 2) / 2), + 30: lambda x: x / 0.32 - 0.78125, + 31: lambda x: 2 * x - 0.84, + 32: lambda x: gfunc32(x), + 33: lambda x: np.abs(2 * x - 0.5), + 34: lambda x: 2 * x, + 35: lambda x: 2 * x - 0.5, + 36: lambda x: 2 * x - 1. +} + +def gfunc32(x): + ret = np.zeros(len(x)) + m = (x < 0.25) + ret[m] = 4 * x[m] + m = (x >= 0.25) & (x < 0.92) + ret[m] = -2 * x[m] + 1.84 + m = (x >= 0.92) + ret[m] = x[m] / 0.08 - 11.5 + return ret + +_gnuplot_data = { + 'red': gfunc[7], + 'green': gfunc[5], + 'blue': gfunc[15], +} + +_gnuplot2_data = { + 'red': gfunc[30], + 'green': gfunc[31], + 'blue': gfunc[32], +} + +_ocean_data = { + 'red': gfunc[23], + 'green': gfunc[28], + 'blue': gfunc[3], +} + +_afmhot_data = { + 'red': gfunc[34], + 'green': gfunc[35], + 'blue': gfunc[36], +} + +_rainbow_data = { + 'red': gfunc[33], + 'green': gfunc[13], + 'blue': gfunc[10], +} + +_seismic_data = ( + (0.0, 0.0, 0.3), (0.0, 0.0, 1.0), + (1.0, 1.0, 1.0), (1.0, 0.0, 0.0), + (0.5, 0.0, 0.0)) + +_terrain_data = ( + (0.00, (0.2, 0.2, 0.6)), + (0.15, (0.0, 0.6, 1.0)), + (0.25, (0.0, 0.8, 0.4)), + (0.50, (1.0, 1.0, 0.6)), + (0.75, (0.5, 0.36, 0.33)), + (1.00, (1.0, 1.0, 1.0))) _gray_data = {'red': ((0., 0, 0), (1., 1, 1)), 'green': ((0., 0, 0), (1., 1, 1)), @@ -249,77 +270,6 @@ (0.952381, 0.951711, 0.951711),(0.968254, 0.968075, 0.968075), (0.984127, 0.984167, 0.984167),(1.0, 1.0, 1.0))} -_prism_data = {'red': ((0., 1., 1.),(0.031746, 1.000000, 1.000000), - (0.047619, 0.000000, 0.000000),(0.063492, 0.000000, 0.000000), - (0.079365, 0.666667, 0.666667),(0.095238, 1.000000, 1.000000), - (0.126984, 1.000000, 1.000000),(0.142857, 0.000000, 0.000000), - (0.158730, 0.000000, 0.000000),(0.174603, 0.666667, 0.666667), - (0.190476, 1.000000, 1.000000),(0.222222, 1.000000, 1.000000), - (0.238095, 0.000000, 0.000000),(0.253968, 0.000000, 0.000000), - (0.269841, 0.666667, 0.666667),(0.285714, 1.000000, 1.000000), - (0.317460, 1.000000, 1.000000),(0.333333, 0.000000, 0.000000), - (0.349206, 0.000000, 0.000000),(0.365079, 0.666667, 0.666667), - (0.380952, 1.000000, 1.000000),(0.412698, 1.000000, 1.000000), - (0.428571, 0.000000, 0.000000),(0.444444, 0.000000, 0.000000), - (0.460317, 0.666667, 0.666667),(0.476190, 1.000000, 1.000000), - (0.507937, 1.000000, 1.000000),(0.523810, 0.000000, 0.000000), - (0.539683, 0.000000, 0.000000),(0.555556, 0.666667, 0.666667), - (0.571429, 1.000000, 1.000000),(0.603175, 1.000000, 1.000000), - (0.619048, 0.000000, 0.000000),(0.634921, 0.000000, 0.000000), - (0.650794, 0.666667, 0.666667),(0.666667, 1.000000, 1.000000), - (0.698413, 1.000000, 1.000000),(0.714286, 0.000000, 0.000000), - (0.730159, 0.000000, 0.000000),(0.746032, 0.666667, 0.666667), - (0.761905, 1.000000, 1.000000),(0.793651, 1.000000, 1.000000), - (0.809524, 0.000000, 0.000000),(0.825397, 0.000000, 0.000000), - (0.841270, 0.666667, 0.666667),(0.857143, 1.000000, 1.000000), - (0.888889, 1.000000, 1.000000),(0.904762, 0.000000, 0.000000), - (0.920635, 0.000000, 0.000000),(0.936508, 0.666667, 0.666667), - (0.952381, 1.000000, 1.000000),(0.984127, 1.000000, 1.000000), - (1.0, 0.0, 0.0)), - 'green': ((0., 0., 0.),(0.031746, 1.000000, 1.000000), - (0.047619, 1.000000, 1.000000),(0.063492, 0.000000, 0.000000), - (0.095238, 0.000000, 0.000000),(0.126984, 1.000000, 1.000000), - (0.142857, 1.000000, 1.000000),(0.158730, 0.000000, 0.000000), - (0.190476, 0.000000, 0.000000),(0.222222, 1.000000, 1.000000), - (0.238095, 1.000000, 1.000000),(0.253968, 0.000000, 0.000000), - (0.285714, 0.000000, 0.000000),(0.317460, 1.000000, 1.000000), - (0.333333, 1.000000, 1.000000),(0.349206, 0.000000, 0.000000), - (0.380952, 0.000000, 0.000000),(0.412698, 1.000000, 1.000000), - (0.428571, 1.000000, 1.000000),(0.444444, 0.000000, 0.000000), - (0.476190, 0.000000, 0.000000),(0.507937, 1.000000, 1.000000), - (0.523810, 1.000000, 1.000000),(0.539683, 0.000000, 0.000000), - (0.571429, 0.000000, 0.000000),(0.603175, 1.000000, 1.000000), - (0.619048, 1.000000, 1.000000),(0.634921, 0.000000, 0.000000), - (0.666667, 0.000000, 0.000000),(0.698413, 1.000000, 1.000000), - (0.714286, 1.000000, 1.000000),(0.730159, 0.000000, 0.000000), - (0.761905, 0.000000, 0.000000),(0.793651, 1.000000, 1.000000), - (0.809524, 1.000000, 1.000000),(0.825397, 0.000000, 0.000000), - (0.857143, 0.000000, 0.000000),(0.888889, 1.000000, 1.000000), - (0.904762, 1.000000, 1.000000),(0.920635, 0.000000, 0.000000), - (0.952381, 0.000000, 0.000000),(0.984127, 1.000000, 1.000000), - (1.0, 1.0, 1.0)), - 'blue': ((0., 0., 0.),(0.047619, 0.000000, 0.000000), - (0.063492, 1.000000, 1.000000),(0.079365, 1.000000, 1.000000), - (0.095238, 0.000000, 0.000000),(0.142857, 0.000000, 0.000000), - (0.158730, 1.000000, 1.000000),(0.174603, 1.000000, 1.000000), - (0.190476, 0.000000, 0.000000),(0.238095, 0.000000, 0.000000), - (0.253968, 1.000000, 1.000000),(0.269841, 1.000000, 1.000000), - (0.285714, 0.000000, 0.000000),(0.333333, 0.000000, 0.000000), - (0.349206, 1.000000, 1.000000),(0.365079, 1.000000, 1.000000), - (0.380952, 0.000000, 0.000000),(0.428571, 0.000000, 0.000000), - (0.444444, 1.000000, 1.000000),(0.460317, 1.000000, 1.000000), - (0.476190, 0.000000, 0.000000),(0.523810, 0.000000, 0.000000), - (0.539683, 1.000000, 1.000000),(0.555556, 1.000000, 1.000000), - (0.571429, 0.000000, 0.000000),(0.619048, 0.000000, 0.000000), - (0.634921, 1.000000, 1.000000),(0.650794, 1.000000, 1.000000), - (0.666667, 0.000000, 0.000000),(0.714286, 0.000000, 0.000000), - (0.730159, 1.000000, 1.000000),(0.746032, 1.000000, 1.000000), - (0.761905, 0.000000, 0.000000),(0.809524, 0.000000, 0.000000), - (0.825397, 1.000000, 1.000000),(0.841270, 1.000000, 1.000000), - (0.857143, 0.000000, 0.000000),(0.904762, 0.000000, 0.000000), - (0.920635, 1.000000, 1.000000),(0.936508, 1.000000, 1.000000), - (0.952381, 0.000000, 0.000000),(1.0, 0.0, 0.0))} - _spring_data = {'red': ((0., 1., 1.),(1.0, 1.0, 1.0)), 'green': ((0., 0., 0.),(1.0, 1.0, 1.0)), 'blue': ((0., 1., 1.),(1.0, 0.0, 0.0))} @@ -1470,4362 +1420,176 @@ # an evolution of the GIST package, both by David H. Munro. # They are released under a BSD-like license (see LICENSE_YORICK in # the license directory of the matplotlib source distribution). -_gist_earth_data = {'blue': [(0.0, 0.0, 0.0), (0.0042016808874905109, -0.18039216101169586, 0.18039216101169586), (0.0084033617749810219, -0.22745098173618317, 0.22745098173618317), (0.012605042196810246, -0.27058824896812439, 0.27058824896812439), (0.016806723549962044, -0.31764706969261169, 0.31764706969261169), (0.021008403971791267, -0.36078432202339172, 0.36078432202339172), (0.025210084393620491, -0.40784314274787903, 0.40784314274787903), (0.029411764815449715, -0.45490196347236633, 0.45490196347236633), (0.033613447099924088, -0.45490196347236633, 0.45490196347236633), (0.037815127521753311, -0.45490196347236633, 0.45490196347236633), (0.042016807943582535, -0.45490196347236633, 0.45490196347236633), (0.046218488365411758, -0.45490196347236633, 0.45490196347236633), (0.050420168787240982, -0.45882353186607361, 0.45882353186607361), (0.054621849209070206, -0.45882353186607361, 0.45882353186607361), (0.058823529630899429, -0.45882353186607361, 0.45882353186607361), (0.063025213778018951, -0.45882353186607361, 0.45882353186607361), (0.067226894199848175, -0.45882353186607361, 0.45882353186607361), (0.071428574621677399, -0.46274510025978088, 0.46274510025978088), (0.075630255043506622, -0.46274510025978088, 0.46274510025978088), (0.079831935465335846, -0.46274510025978088, 0.46274510025978088), (0.08403361588716507, -0.46274510025978088, 0.46274510025978088), (0.088235296308994293, -0.46274510025978088, 0.46274510025978088), (0.092436976730823517, -0.46666666865348816, 0.46666666865348816), (0.09663865715265274, -0.46666666865348816, 0.46666666865348816), (0.10084033757448196, -0.46666666865348816, 0.46666666865348816), (0.10504201799631119, -0.46666666865348816, 0.46666666865348816), (0.10924369841814041, -0.46666666865348816, 0.46666666865348816), (0.11344537883996964, -0.47058823704719543, 0.47058823704719543), (0.11764705926179886, -0.47058823704719543, 0.47058823704719543), (0.12184873968362808, -0.47058823704719543, 0.47058823704719543), (0.1260504275560379, -0.47058823704719543, 0.47058823704719543), (0.13025210797786713, -0.47058823704719543, 0.47058823704719543), (0.13445378839969635, -0.47450980544090271, 0.47450980544090271), (0.13865546882152557, -0.47450980544090271, 0.47450980544090271), (0.1428571492433548, -0.47450980544090271, 0.47450980544090271), (0.14705882966518402, -0.47450980544090271, 0.47450980544090271), (0.15126051008701324, -0.47450980544090271, 0.47450980544090271), (0.15546219050884247, -0.47843137383460999, 0.47843137383460999), (0.15966387093067169, -0.47843137383460999, 0.47843137383460999), (0.16386555135250092, -0.47843137383460999, 0.47843137383460999), (0.16806723177433014, -0.47843137383460999, 0.47843137383460999), (0.17226891219615936, -0.47843137383460999, 0.47843137383460999), (0.17647059261798859, -0.48235294222831726, 0.48235294222831726), (0.18067227303981781, -0.48235294222831726, 0.48235294222831726), (0.18487395346164703, -0.48235294222831726, 0.48235294222831726), (0.18907563388347626, -0.48235294222831726, 0.48235294222831726), (0.19327731430530548, -0.48235294222831726, 0.48235294222831726), (0.1974789947271347, -0.48627451062202454, 0.48627451062202454), (0.20168067514896393, -0.48627451062202454, 0.48627451062202454), (0.20588235557079315, -0.48627451062202454, 0.48627451062202454), (0.21008403599262238, -0.48627451062202454, 0.48627451062202454), (0.2142857164144516, -0.48627451062202454, 0.48627451062202454), (0.21848739683628082, -0.49019607901573181, 0.49019607901573181), (0.22268907725811005, -0.49019607901573181, 0.49019607901573181), (0.22689075767993927, -0.49019607901573181, 0.49019607901573181), (0.23109243810176849, -0.49019607901573181, 0.49019607901573181), (0.23529411852359772, -0.49019607901573181, 0.49019607901573181), (0.23949579894542694, -0.49411764740943909, 0.49411764740943909), (0.24369747936725616, -0.49411764740943909, 0.49411764740943909), (0.24789915978908539, -0.49411764740943909, 0.49411764740943909), (0.25210085511207581, -0.49411764740943909, 0.49411764740943909), (0.25630253553390503, -0.49411764740943909, 0.49411764740943909), (0.26050421595573425, -0.49803921580314636, 0.49803921580314636), (0.26470589637756348, -0.49803921580314636, 0.49803921580314636), (0.2689075767993927, -0.49803921580314636, 0.49803921580314636), (0.27310925722122192, -0.49803921580314636, 0.49803921580314636), (0.27731093764305115, -0.49803921580314636, 0.49803921580314636), (0.28151261806488037, -0.50196081399917603, 0.50196081399917603), (0.28571429848670959, -0.49411764740943909, 0.49411764740943909), (0.28991597890853882, -0.49019607901573181, 0.49019607901573181), (0.29411765933036804, -0.48627451062202454, 0.48627451062202454), (0.29831933975219727, -0.48235294222831726, 0.48235294222831726), (0.30252102017402649, -0.47843137383460999, 0.47843137383460999), (0.30672270059585571, -0.47058823704719543, 0.47058823704719543), (0.31092438101768494, -0.46666666865348816, 0.46666666865348816), (0.31512606143951416, -0.46274510025978088, 0.46274510025978088), (0.31932774186134338, -0.45882353186607361, 0.45882353186607361), (0.32352942228317261, -0.45098039507865906, 0.45098039507865906), (0.32773110270500183, -0.44705882668495178, 0.44705882668495178), (0.33193278312683105, -0.44313725829124451, 0.44313725829124451), (0.33613446354866028, -0.43529412150382996, 0.43529412150382996), (0.3403361439704895, -0.43137255311012268, 0.43137255311012268), (0.34453782439231873, -0.42745098471641541, 0.42745098471641541), (0.34873950481414795, -0.42352941632270813, 0.42352941632270813), (0.35294118523597717, -0.41568627953529358, 0.41568627953529358), (0.3571428656578064, -0.4117647111415863, 0.4117647111415863), (0.36134454607963562, -0.40784314274787903, 0.40784314274787903), (0.36554622650146484, -0.40000000596046448, 0.40000000596046448), (0.36974790692329407, -0.3960784375667572, 0.3960784375667572), (0.37394958734512329, -0.39215686917304993, 0.39215686917304993), (0.37815126776695251, -0.38431373238563538, 0.38431373238563538), (0.38235294818878174, -0.3803921639919281, 0.3803921639919281), (0.38655462861061096, -0.37647059559822083, 0.37647059559822083), (0.39075630903244019, -0.36862745881080627, 0.36862745881080627), (0.39495798945426941, -0.364705890417099, 0.364705890417099), (0.39915966987609863, -0.36078432202339172, 0.36078432202339172), (0.40336135029792786, -0.35294118523597717, 0.35294118523597717), (0.40756303071975708, -0.3490196168422699, 0.3490196168422699), (0.4117647111415863, -0.34509804844856262, 0.34509804844856262), (0.41596639156341553, -0.33725491166114807, 0.33725491166114807), (0.42016807198524475, -0.3333333432674408, 0.3333333432674408), (0.42436975240707397, -0.32941177487373352, 0.32941177487373352), (0.4285714328289032, -0.32156863808631897, 0.32156863808631897), (0.43277311325073242, -0.31764706969261169, 0.31764706969261169), (0.43697479367256165, -0.31372550129890442, 0.31372550129890442), (0.44117647409439087, -0.30588236451148987, 0.30588236451148987), (0.44537815451622009, -0.30196079611778259, 0.30196079611778259), (0.44957983493804932, -0.29803922772407532, 0.29803922772407532), (0.45378151535987854, -0.29019609093666077, 0.29019609093666077), (0.45798319578170776, -0.28627452254295349, 0.28627452254295349), (0.46218487620353699, -0.27843138575553894, 0.27843138575553894), (0.46638655662536621, -0.27450981736183167, 0.27450981736183167), (0.47058823704719543, -0.27843138575553894, 0.27843138575553894), (0.47478991746902466, -0.28235295414924622, 0.28235295414924622), (0.47899159789085388, -0.28235295414924622, 0.28235295414924622), (0.48319327831268311, -0.28627452254295349, 0.28627452254295349), (0.48739495873451233, -0.28627452254295349, 0.28627452254295349), (0.49159663915634155, -0.29019609093666077, 0.29019609093666077), (0.49579831957817078, -0.29411765933036804, 0.29411765933036804), (0.5, 0.29411765933036804, -0.29411765933036804), (0.50420171022415161, 0.29803922772407532, -0.29803922772407532), (0.50840336084365845, 0.29803922772407532, -0.29803922772407532), (0.51260507106781006, 0.30196079611778259, -0.30196079611778259), (0.51680672168731689, 0.30196079611778259, -0.30196079611778259), (0.52100843191146851, 0.30588236451148987, -0.30588236451148987), (0.52521008253097534, 0.30980393290519714, -0.30980393290519714), (0.52941179275512695, 0.30980393290519714, -0.30980393290519714), (0.53361344337463379, 0.31372550129890442, -0.31372550129890442), (0.5378151535987854, 0.31372550129890442, -0.31372550129890442), (0.54201680421829224, 0.31764706969261169, -0.31764706969261169), (0.54621851444244385, 0.32156863808631897, -0.32156863808631897), (0.55042016506195068, 0.32156863808631897, -0.32156863808631897), (0.55462187528610229, 0.32156863808631897, -0.32156863808631897), (0.55882352590560913, 0.32549020648002625, -0.32549020648002625), (0.56302523612976074, 0.32549020648002625, -0.32549020648002625), (0.56722688674926758, 0.32549020648002625, -0.32549020648002625), (0.57142859697341919, 0.32941177487373352, -0.32941177487373352), (0.57563024759292603, 0.32941177487373352, -0.32941177487373352), (0.57983195781707764, 0.32941177487373352, -0.32941177487373352), (0.58403360843658447, 0.3333333432674408, -0.3333333432674408), (0.58823531866073608, 0.3333333432674408, -0.3333333432674408), (0.59243696928024292, 0.3333333432674408, -0.3333333432674408), (0.59663867950439453, 0.33725491166114807, -0.33725491166114807), (0.60084033012390137, 0.33725491166114807, -0.33725491166114807), (0.60504204034805298, 0.33725491166114807, -0.33725491166114807), (0.60924369096755981, 0.34117648005485535, -0.34117648005485535), (0.61344540119171143, 0.34117648005485535, -0.34117648005485535), (0.61764705181121826, 0.34117648005485535, -0.34117648005485535), (0.62184876203536987, 0.34509804844856262, -0.34509804844856262), (0.62605041265487671, 0.34509804844856262, -0.34509804844856262), (0.63025212287902832, 0.34509804844856262, -0.34509804844856262), (0.63445377349853516, 0.3490196168422699, -0.3490196168422699), (0.63865548372268677, 0.3490196168422699, -0.3490196168422699), (0.6428571343421936, 0.3490196168422699, -0.3490196168422699), (0.64705884456634521, 0.35294118523597717, -0.35294118523597717), (0.65126049518585205, 0.35294118523597717, -0.35294118523597717), (0.65546220541000366, 0.35294118523597717, -0.35294118523597717), (0.6596638560295105, 0.35686275362968445, -0.35686275362968445), (0.66386556625366211, 0.35686275362968445, -0.35686275362968445), (0.66806721687316895, 0.35686275362968445, -0.35686275362968445), (0.67226892709732056, 0.36078432202339172, -0.36078432202339172), (0.67647057771682739, 0.36078432202339172, -0.36078432202339172), (0.680672287940979, 0.36078432202339172, -0.36078432202339172), (0.68487393856048584, 0.364705890417099, -0.364705890417099), (0.68907564878463745, 0.364705890417099, -0.364705890417099), (0.69327729940414429, 0.364705890417099, -0.364705890417099), (0.6974790096282959, 0.36862745881080627, -0.36862745881080627), (0.70168066024780273, 0.36862745881080627, -0.36862745881080627), (0.70588237047195435, 0.36862745881080627, -0.36862745881080627), (0.71008402109146118, 0.37254902720451355, -0.37254902720451355), (0.71428573131561279, 0.37254902720451355, -0.37254902720451355), (0.71848738193511963, 0.37254902720451355, -0.37254902720451355), (0.72268909215927124, 0.37647059559822083, -0.37647059559822083), (0.72689074277877808, 0.37647059559822083, -0.37647059559822083), (0.73109245300292969, 0.3803921639919281, -0.3803921639919281), (0.73529410362243652, 0.3803921639919281, -0.3803921639919281), (0.73949581384658813, 0.3803921639919281, -0.3803921639919281), (0.74369746446609497, 0.38431373238563538, -0.38431373238563538), (0.74789917469024658, 0.38431373238563538, -0.38431373238563538), (0.75210082530975342, 0.38431373238563538, -0.38431373238563538), (0.75630253553390503, 0.38823530077934265, -0.38823530077934265), (0.76050418615341187, 0.38823530077934265, -0.38823530077934265), (0.76470589637756348, 0.38823530077934265, -0.38823530077934265), (0.76890754699707031, 0.39215686917304993, -0.39215686917304993), (0.77310925722122192, 0.39215686917304993, -0.39215686917304993), (0.77731090784072876, 0.39215686917304993, -0.39215686917304993), (0.78151261806488037, 0.3960784375667572, -0.3960784375667572), (0.78571426868438721, 0.3960784375667572, -0.3960784375667572), (0.78991597890853882, 0.40784314274787903, -0.40784314274787903), (0.79411762952804565, 0.41568627953529358, -0.41568627953529358), (0.79831933975219727, 0.42352941632270813, -0.42352941632270813), (0.8025209903717041, 0.43529412150382996, -0.43529412150382996), (0.80672270059585571, 0.44313725829124451, -0.44313725829124451), (0.81092435121536255, 0.45490196347236633, -0.45490196347236633), (0.81512606143951416, 0.46274510025978088, -0.46274510025978088), (0.819327712059021, 0.47450980544090271, -0.47450980544090271), (0.82352942228317261, 0.48235294222831726, -0.48235294222831726), (0.82773107290267944, 0.49411764740943909, -0.49411764740943909), (0.83193278312683105, 0.5058823823928833, -0.5058823823928833), (0.83613443374633789, 0.51372551918029785, -0.51372551918029785), (0.8403361439704895, 0.52549022436141968, -0.52549022436141968), (0.84453779458999634, 0.5372549295425415, -0.5372549295425415), (0.84873950481414795, 0.54509806632995605, -0.54509806632995605), (0.85294115543365479, 0.55686277151107788, -0.55686277151107788), (0.8571428656578064, 0.56862747669219971, -0.56862747669219971), (0.86134451627731323, 0.58039218187332153, -0.58039218187332153), (0.86554622650146484, 0.58823531866073608, -0.58823531866073608), (0.86974787712097168, 0.60000002384185791, -0.60000002384185791), (0.87394958734512329, 0.61176472902297974, -0.61176472902297974), (0.87815123796463013, 0.62352943420410156, -0.62352943420410156), (0.88235294818878174, 0.63529413938522339, -0.63529413938522339), (0.88655459880828857, 0.64705884456634521, -0.64705884456634521), (0.89075630903244019, 0.65882354974746704, -0.65882354974746704), (0.89495795965194702, 0.66666668653488159, -0.66666668653488159), (0.89915966987609863, 0.67843139171600342, -0.67843139171600342), (0.90336132049560547, 0.69019609689712524, -0.69019609689712524), (0.90756303071975708, 0.70196080207824707, -0.70196080207824707), (0.91176468133926392, 0.7137255072593689, -0.7137255072593689), (0.91596639156341553, 0.72549021244049072, -0.72549021244049072), (0.92016804218292236, 0.74117648601531982, -0.74117648601531982), (0.92436975240707397, 0.75294119119644165, -0.75294119119644165), (0.92857140302658081, 0.76470589637756348, -0.76470589637756348), (0.93277311325073242, 0.7764706015586853, -0.7764706015586853), (0.93697476387023926, 0.78823530673980713, -0.78823530673980713), (0.94117647409439087, 0.80000001192092896, -0.80000001192092896), (0.94537812471389771, 0.81176471710205078, -0.81176471710205078), (0.94957983493804932, 0.82745099067687988, -0.82745099067687988), (0.95378148555755615, 0.83921569585800171, -0.83921569585800171), (0.95798319578170776, 0.85098040103912354, -0.85098040103912354), (0.9621848464012146, 0.86274510622024536, -0.86274510622024536), (0.96638655662536621, 0.87843137979507446, -0.87843137979507446), (0.97058820724487305, 0.89019608497619629, -0.89019608497619629), (0.97478991746902466, 0.90196079015731812, -0.90196079015731812), (0.97899156808853149, 0.91764706373214722, -0.91764706373214722), (0.98319327831268311, 0.92941176891326904, -0.92941176891326904), (0.98739492893218994, 0.94509804248809814, -0.94509804248809814), (0.99159663915634155, 0.95686274766921997, -0.95686274766921997), (0.99579828977584839, 0.97254902124404907, -0.97254902124404907), (1.0, 0.9843137264251709, 0.9843137264251709)], -'green': [(0.0, 0.0, 0.0), (0.0042016808874905109, 0.0, 0.0), -(0.0084033617749810219, 0.0, 0.0), (0.012605042196810246, 0.0, 0.0), -(0.016806723549962044, 0.0, 0.0), (0.021008403971791267, 0.0, 0.0), -(0.025210084393620491, 0.0, 0.0), (0.029411764815449715, 0.0, 0.0), -(0.033613447099924088, 0.011764706112444401, 0.011764706112444401), -(0.037815127521753311, 0.023529412224888802, 0.023529412224888802), -(0.042016807943582535, 0.031372550874948502, 0.031372550874948502), -(0.046218488365411758, 0.043137256056070328, 0.043137256056070328), -(0.050420168787240982, 0.050980392843484879, 0.050980392843484879), -(0.054621849209070206, 0.062745101749897003, 0.062745101749897003), -(0.058823529630899429, 0.070588238537311554, 0.070588238537311554), -(0.063025213778018951, 0.08235294371843338, 0.08235294371843338), -(0.067226894199848175, 0.090196080505847931, 0.090196080505847931), -(0.071428574621677399, 0.10196078568696976, 0.10196078568696976), -(0.075630255043506622, 0.10980392247438431, 0.10980392247438431), -(0.079831935465335846, 0.12156862765550613, 0.12156862765550613), -(0.08403361588716507, 0.12941177189350128, 0.12941177189350128), -(0.088235296308994293, 0.14117647707462311, 0.14117647707462311), -(0.092436976730823517, 0.14901961386203766, 0.14901961386203766), -(0.09663865715265274, 0.16078431904315948, 0.16078431904315948), -(0.10084033757448196, 0.16862745583057404, 0.16862745583057404), -(0.10504201799631119, 0.17647059261798859, 0.17647059261798859), -(0.10924369841814041, 0.18823529779911041, 0.18823529779911041), -(0.11344537883996964, 0.19607843458652496, 0.19607843458652496), -(0.11764705926179886, 0.20392157137393951, 0.20392157137393951), -(0.12184873968362808, 0.21568627655506134, 0.21568627655506134), -(0.1260504275560379, 0.22352941334247589, 0.22352941334247589), -(0.13025210797786713, 0.23137255012989044, 0.23137255012989044), -(0.13445378839969635, 0.23921568691730499, 0.23921568691730499), -(0.13865546882152557, 0.25098040699958801, 0.25098040699958801), -(0.1428571492433548, 0.25882354378700256, 0.25882354378700256), -(0.14705882966518402, 0.26666668057441711, 0.26666668057441711), -(0.15126051008701324, 0.27450981736183167, 0.27450981736183167), -(0.15546219050884247, 0.28235295414924622, 0.28235295414924622), -(0.15966387093067169, 0.29019609093666077, 0.29019609093666077), -(0.16386555135250092, 0.30196079611778259, 0.30196079611778259), -(0.16806723177433014, 0.30980393290519714, 0.30980393290519714), -(0.17226891219615936, 0.31764706969261169, 0.31764706969261169), -(0.17647059261798859, 0.32549020648002625, 0.32549020648002625), -(0.18067227303981781, 0.3333333432674408, 0.3333333432674408), -(0.18487395346164703, 0.34117648005485535, 0.34117648005485535), -(0.18907563388347626, 0.3490196168422699, 0.3490196168422699), -(0.19327731430530548, 0.35686275362968445, 0.35686275362968445), -(0.1974789947271347, 0.364705890417099, 0.364705890417099), -(0.20168067514896393, 0.37254902720451355, 0.37254902720451355), -(0.20588235557079315, 0.3803921639919281, 0.3803921639919281), -(0.21008403599262238, 0.38823530077934265, 0.38823530077934265), -(0.2142857164144516, 0.39215686917304993, 0.39215686917304993), -(0.21848739683628082, 0.40000000596046448, 0.40000000596046448), -(0.22268907725811005, 0.40784314274787903, 0.40784314274787903), -(0.22689075767993927, 0.41568627953529358, 0.41568627953529358), -(0.23109243810176849, 0.42352941632270813, 0.42352941632270813), -(0.23529411852359772, 0.42745098471641541, 0.42745098471641541), -(0.23949579894542694, 0.43529412150382996, 0.43529412150382996), -(0.24369747936725616, 0.44313725829124451, 0.44313725829124451), -(0.24789915978908539, 0.45098039507865906, 0.45098039507865906), -(0.25210085511207581, 0.45490196347236633, 0.45490196347236633), -(0.25630253553390503, 0.46274510025978088, 0.46274510025978088), -(0.26050421595573425, 0.47058823704719543, 0.47058823704719543), -(0.26470589637756348, 0.47450980544090271, 0.47450980544090271), -(0.2689075767993927, 0.48235294222831726, 0.48235294222831726), -(0.27310925722122192, 0.49019607901573181, 0.49019607901573181), -(0.27731093764305115, 0.49411764740943909, 0.49411764740943909), -(0.28151261806488037, 0.50196081399917603, 0.50196081399917603), -(0.28571429848670959, 0.50196081399917603, 0.50196081399917603), -(0.28991597890853882, 0.5058823823928833, 0.5058823823928833), -(0.29411765933036804, 0.5058823823928833, 0.5058823823928833), -(0.29831933975219727, 0.50980395078659058, 0.50980395078659058), -(0.30252102017402649, 0.51372551918029785, 0.51372551918029785), -(0.30672270059585571, 0.51372551918029785, 0.51372551918029785), -(0.31092438101768494, 0.51764708757400513, 0.51764708757400513), -(0.31512606143951416, 0.5215686559677124, 0.5215686559677124), -(0.31932774186134338, 0.5215686559677124, 0.5215686559677124), -(0.32352942228317261, 0.52549022436141968, 0.52549022436141968), -(0.32773110270500183, 0.52549022436141968, 0.52549022436141968), -(0.33193278312683105, 0.52941179275512695, 0.52941179275512695), -(0.33613446354866028, 0.53333336114883423, 0.53333336114883423), -(0.3403361439704895, 0.53333336114883423, 0.53333336114883423), -(0.34453782439231873, 0.5372549295425415, 0.5372549295425415), -(0.34873950481414795, 0.54117649793624878, 0.54117649793624878), -(0.35294118523597717, 0.54117649793624878, 0.54117649793624878), -(0.3571428656578064, 0.54509806632995605, 0.54509806632995605), -(0.36134454607963562, 0.54901963472366333, 0.54901963472366333), -(0.36554622650146484, 0.54901963472366333, 0.54901963472366333), -(0.36974790692329407, 0.55294120311737061, 0.55294120311737061), -(0.37394958734512329, 0.55294120311737061, 0.55294120311737061), -(0.37815126776695251, 0.55686277151107788, 0.55686277151107788), -(0.38235294818878174, 0.56078433990478516, 0.56078433990478516), -(0.38655462861061096, 0.56078433990478516, 0.56078433990478516), -(0.39075630903244019, 0.56470590829849243, 0.56470590829849243), -(0.39495798945426941, 0.56862747669219971, 0.56862747669219971), -(0.39915966987609863, 0.56862747669219971, 0.56862747669219971), -(0.40336135029792786, 0.57254904508590698, 0.57254904508590698), -(0.40756303071975708, 0.57254904508590698, 0.57254904508590698), -(0.4117647111415863, 0.57647061347961426, 0.57647061347961426), -(0.41596639156341553, 0.58039218187332153, 0.58039218187332153), -(0.42016807198524475, 0.58039218187332153, 0.58039218187332153), -(0.42436975240707397, 0.58431375026702881, 0.58431375026702881), -(0.4285714328289032, 0.58823531866073608, 0.58823531866073608), -(0.43277311325073242, 0.58823531866073608, 0.58823531866073608), -(0.43697479367256165, 0.59215688705444336, 0.59215688705444336), -(0.44117647409439087, 0.59215688705444336, 0.59215688705444336), -(0.44537815451622009, 0.59607845544815063, 0.59607845544815063), -(0.44957983493804932, 0.60000002384185791, 0.60000002384185791), -(0.45378151535987854, 0.60000002384185791, 0.60000002384185791), -(0.45798319578170776, 0.60392159223556519, 0.60392159223556519), -(0.46218487620353699, 0.60784316062927246, 0.60784316062927246), -(0.46638655662536621, 0.60784316062927246, 0.60784316062927246), -(0.47058823704719543, 0.61176472902297974, 0.61176472902297974), -(0.47478991746902466, 0.61176472902297974, 0.61176472902297974), -(0.47899159789085388, 0.61568629741668701, 0.61568629741668701), -(0.48319327831268311, 0.61960786581039429, 0.61960786581039429), -(0.48739495873451233, 0.61960786581039429, 0.61960786581039429), -(0.49159663915634155, 0.62352943420410156, 0.62352943420410156), -(0.49579831957817078, 0.62745100259780884, 0.62745100259780884), (0.5, -0.62745100259780884, 0.62745100259780884), (0.50420171022415161, -0.63137257099151611, 0.63137257099151611), (0.50840336084365845, -0.63137257099151611, 0.63137257099151611), (0.51260507106781006, -0.63529413938522339, 0.63529413938522339), (0.51680672168731689, -0.63921570777893066, 0.63921570777893066), (0.52100843191146851, -0.63921570777893066, 0.63921570777893066), (0.52521008253097534, -0.64313727617263794, 0.64313727617263794), (0.52941179275512695, -0.64705884456634521, 0.64705884456634521), (0.53361344337463379, -0.64705884456634521, 0.64705884456634521), (0.5378151535987854, -0.65098041296005249, 0.65098041296005249), (0.54201680421829224, -0.65098041296005249, 0.65098041296005249), (0.54621851444244385, -0.65490198135375977, 0.65490198135375977), (0.55042016506195068, -0.65882354974746704, 0.65882354974746704), (0.55462187528610229, -0.65882354974746704, 0.65882354974746704), (0.55882352590560913, -0.65882354974746704, 0.65882354974746704), (0.56302523612976074, -0.66274511814117432, 0.66274511814117432), (0.56722688674926758, -0.66274511814117432, 0.66274511814117432), (0.57142859697341919, -0.66666668653488159, 0.66666668653488159), (0.57563024759292603, -0.66666668653488159, 0.66666668653488159), (0.57983195781707764, -0.67058825492858887, 0.67058825492858887), (0.58403360843658447, -0.67058825492858887, 0.67058825492858887), (0.58823531866073608, -0.67450982332229614, 0.67450982332229614), (0.59243696928024292, -0.67450982332229614, 0.67450982332229614), (0.59663867950439453, -0.67450982332229614, 0.67450982332229614), (0.60084033012390137, -0.67843139171600342, 0.67843139171600342), (0.60504204034805298, -0.67843139171600342, 0.67843139171600342), (0.60924369096755981, -0.68235296010971069, 0.68235296010971069), (0.61344540119171143, -0.68235296010971069, 0.68235296010971069), (0.61764705181121826, -0.68627452850341797, 0.68627452850341797), (0.62184876203536987, -0.68627452850341797, 0.68627452850341797), (0.62605041265487671, -0.68627452850341797, 0.68627452850341797), (0.63025212287902832, -0.69019609689712524, 0.69019609689712524), (0.63445377349853516, -0.69019609689712524, 0.69019609689712524), (0.63865548372268677, -0.69411766529083252, 0.69411766529083252), (0.6428571343421936, -0.69411766529083252, 0.69411766529083252), (0.64705884456634521, -0.69803923368453979, 0.69803923368453979), (0.65126049518585205, -0.69803923368453979, 0.69803923368453979), (0.65546220541000366, -0.70196080207824707, 0.70196080207824707), (0.6596638560295105, -0.70196080207824707, 0.70196080207824707), (0.66386556625366211, -0.70196080207824707, 0.70196080207824707), (0.66806721687316895, -0.70588237047195435, 0.70588237047195435), (0.67226892709732056, -0.70588237047195435, 0.70588237047195435), (0.67647057771682739, -0.70980393886566162, 0.70980393886566162), (0.680672287940979, -0.70980393886566162, 0.70980393886566162), (0.68487393856048584, -0.7137255072593689, 0.7137255072593689), (0.68907564878463745, -0.7137255072593689, 0.7137255072593689), (0.69327729940414429, -0.71764707565307617, 0.71764707565307617), (0.6974790096282959, -0.71764707565307617, 0.71764707565307617), (0.70168066024780273, -0.7137255072593689, 0.7137255072593689), (0.70588237047195435, -0.70980393886566162, 0.70980393886566162), (0.71008402109146118, -0.70980393886566162, 0.70980393886566162), (0.71428573131561279, -0.70588237047195435, 0.70588237047195435), (0.71848738193511963, -0.70196080207824707, 0.70196080207824707), (0.72268909215927124, -0.69803923368453979, 0.69803923368453979), (0.72689074277877808, -0.69411766529083252, 0.69411766529083252), (0.73109245300292969, -0.69019609689712524, 0.69019609689712524), (0.73529410362243652, -0.68627452850341797, 0.68627452850341797), (0.73949581384658813, -0.68235296010971069, 0.68235296010971069), (0.74369746446609497, -0.67843139171600342, 0.67843139171600342), (0.74789917469024658, -0.67450982332229614, 0.67450982332229614), (0.75210082530975342, -0.67058825492858887, 0.67058825492858887), (0.75630253553390503, -0.66666668653488159, 0.66666668653488159), (0.76050418615341187, -0.66274511814117432, 0.66274511814117432), (0.76470589637756348, -0.65882354974746704, 0.65882354974746704), (0.76890754699707031, -0.65490198135375977, 0.65490198135375977), (0.77310925722122192, -0.65098041296005249, 0.65098041296005249), (0.77731090784072876, -0.64705884456634521, 0.64705884456634521), (0.78151261806488037, -0.64313727617263794, 0.64313727617263794), (0.78571426868438721, -0.63921570777893066, 0.63921570777893066), (0.78991597890853882, -0.63921570777893066, 0.63921570777893066), (0.79411762952804565, -0.64313727617263794, 0.64313727617263794), (0.79831933975219727, -0.64313727617263794, 0.64313727617263794), (0.8025209903717041, -0.64705884456634521, 0.64705884456634521), (0.80672270059585571, -0.64705884456634521, 0.64705884456634521), (0.81092435121536255, -0.65098041296005249, 0.65098041296005249), (0.81512606143951416, -0.65490198135375977, 0.65490198135375977), (0.819327712059021, -0.65490198135375977, 0.65490198135375977), (0.82352942228317261, -0.65882354974746704, 0.65882354974746704), (0.82773107290267944, -0.66274511814117432, 0.66274511814117432), (0.83193278312683105, -0.66666668653488159, 0.66666668653488159), (0.83613443374633789, -0.67058825492858887, 0.67058825492858887), (0.8403361439704895, -0.67450982332229614, 0.67450982332229614), (0.84453779458999634, -0.67843139171600342, 0.67843139171600342), (0.84873950481414795, -0.68235296010971069, 0.68235296010971069), (0.85294115543365479, -0.68627452850341797, 0.68627452850341797), (0.8571428656578064, -0.69019609689712524, 0.69019609689712524), (0.86134451627731323, -0.69411766529083252, 0.69411766529083252), (0.86554622650146484, -0.69803923368453979, 0.69803923368453979), (0.86974787712097168, -0.70196080207824707, 0.70196080207824707), (0.87394958734512329, -0.70980393886566162, 0.70980393886566162), (0.87815123796463013, -0.7137255072593689, 0.7137255072593689), (0.88235294818878174, -0.72156864404678345, 0.72156864404678345), (0.88655459880828857, -0.72549021244049072, 0.72549021244049072), (0.89075630903244019, -0.73333334922790527, 0.73333334922790527), (0.89495795965194702, -0.73725491762161255, 0.73725491762161255), (0.89915966987609863, -0.7450980544090271, 0.7450980544090271), (0.90336132049560547, -0.75294119119644165, 0.75294119119644165), (0.90756303071975708, -0.7607843279838562, 0.7607843279838562), (0.91176468133926392, -0.76862746477127075, 0.76862746477127075), (0.91596639156341553, -0.7764706015586853, 0.7764706015586853), (0.92016804218292236, -0.78431373834609985, 0.78431373834609985), (0.92436975240707397, -0.7921568751335144, 0.7921568751335144), (0.92857140302658081, -0.80000001192092896, 0.80000001192092896), (0.93277311325073242, -0.80784314870834351, 0.80784314870834351), (0.93697476387023926, -0.81568628549575806, 0.81568628549575806), (0.94117647409439087, -0.82745099067687988, 0.82745099067687988), (0.94537812471389771, -0.83529412746429443, 0.83529412746429443), (0.94957983493804932, -0.84313726425170898, 0.84313726425170898), (0.95378148555755615, -0.85490196943283081, 0.85490196943283081), (0.95798319578170776, -0.86666667461395264, 0.86666667461395264), (0.9621848464012146, -0.87450981140136719, 0.87450981140136719), (0.96638655662536621, -0.88627451658248901, 0.88627451658248901), (0.97058820724487305, -0.89803922176361084, 0.89803922176361084), (0.97478991746902466, -0.90980392694473267, 0.90980392694473267), (0.97899156808853149, -0.92156863212585449, 0.92156863212585449), (0.98319327831268311, -0.93333333730697632, 0.93333333730697632), (0.98739492893218994, -0.94509804248809814, 0.94509804248809814), (0.99159663915634155, -0.95686274766921997, 0.95686274766921997), (0.99579828977584839, -0.97254902124404907, 0.97254902124404907), (1.0, 0.9843137264251709, -0.9843137264251709)], 'red': [(0.0, 0.0, 0.0), (0.0042016808874905109, -0.0, 0.0), (0.0084033617749810219, 0.0, 0.0), (0.012605042196810246, 0.0, -0.0), (0.016806723549962044, 0.0, 0.0), (0.021008403971791267, 0.0, 0.0), -(0.025210084393620491, 0.0, 0.0), (0.029411764815449715, 0.0, 0.0), -(0.033613447099924088, 0.0, 0.0), (0.037815127521753311, -0.0039215688593685627, 0.0039215688593685627), (0.042016807943582535, -0.0078431377187371254, 0.0078431377187371254), (0.046218488365411758, -0.0078431377187371254, 0.0078431377187371254), (0.050420168787240982, -0.011764706112444401, 0.011764706112444401), (0.054621849209070206, -0.015686275437474251, 0.015686275437474251), (0.058823529630899429, -0.019607843831181526, 0.019607843831181526), (0.063025213778018951, -0.019607843831181526, 0.019607843831181526), (0.067226894199848175, -0.023529412224888802, 0.023529412224888802), (0.071428574621677399, -0.027450980618596077, 0.027450980618596077), (0.075630255043506622, -0.031372550874948502, 0.031372550874948502), (0.079831935465335846, -0.031372550874948502, 0.031372550874948502), (0.08403361588716507, -0.035294119268655777, 0.035294119268655777), (0.088235296308994293, -0.039215687662363052, 0.039215687662363052), (0.092436976730823517, -0.043137256056070328, 0.043137256056070328), (0.09663865715265274, -0.043137256056070328, 0.043137256056070328), (0.10084033757448196, -0.047058824449777603, 0.047058824449777603), (0.10504201799631119, -0.050980392843484879, 0.050980392843484879), (0.10924369841814041, -0.054901961237192154, 0.054901961237192154), (0.11344537883996964, -0.058823529630899429, 0.058823529630899429), (0.11764705926179886, -0.058823529630899429, 0.058823529630899429), (0.12184873968362808, -0.062745101749897003, 0.062745101749897003), (0.1260504275560379, -0.066666670143604279, 0.066666670143604279), (0.13025210797786713, -0.070588238537311554, 0.070588238537311554), (0.13445378839969635, -0.070588238537311554, 0.070588238537311554), (0.13865546882152557, -0.074509806931018829, 0.074509806931018829), (0.1428571492433548, -0.078431375324726105, 0.078431375324726105), (0.14705882966518402, -0.08235294371843338, 0.08235294371843338), (0.15126051008701324, -0.086274512112140656, 0.086274512112140656), (0.15546219050884247, -0.086274512112140656, 0.086274512112140656), (0.15966387093067169, -0.090196080505847931, 0.090196080505847931), (0.16386555135250092, -0.094117648899555206, 0.094117648899555206), (0.16806723177433014, -0.098039217293262482, 0.098039217293262482), (0.17226891219615936, -0.10196078568696976, 0.10196078568696976), (0.17647059261798859, -0.10196078568696976, 0.10196078568696976), (0.18067227303981781, -0.10588235408067703, 0.10588235408067703), (0.18487395346164703, -0.10980392247438431, 0.10980392247438431), (0.18907563388347626, -0.11372549086809158, 0.11372549086809158), (0.19327731430530548, -0.11764705926179886, 0.11764705926179886), (0.1974789947271347, -0.12156862765550613, 0.12156862765550613), (0.20168067514896393, -0.12156862765550613, 0.12156862765550613), (0.20588235557079315, -0.12549020349979401, 0.12549020349979401), (0.21008403599262238, -0.12941177189350128, 0.12941177189350128), (0.2142857164144516, -0.13333334028720856, 0.13333334028720856), (0.21848739683628082, -0.13725490868091583, 0.13725490868091583), (0.22268907725811005, -0.14117647707462311, 0.14117647707462311), (0.22689075767993927, -0.14117647707462311, 0.14117647707462311), (0.23109243810176849, -0.14509804546833038, 0.14509804546833038), (0.23529411852359772, -0.14901961386203766, 0.14901961386203766), (0.23949579894542694, -0.15294118225574493, 0.15294118225574493), (0.24369747936725616, -0.15686275064945221, 0.15686275064945221), (0.24789915978908539, -0.16078431904315948, 0.16078431904315948), (0.25210085511207581, -0.16078431904315948, 0.16078431904315948), (0.25630253553390503, -0.16470588743686676, 0.16470588743686676), (0.26050421595573425, -0.16862745583057404, 0.16862745583057404), (0.26470589637756348, -0.17254902422428131, 0.17254902422428131), (0.2689075767993927, -0.17647059261798859, 0.17647059261798859), (0.27310925722122192, -0.18039216101169586, 0.18039216101169586), (0.27731093764305115, -0.18431372940540314, 0.18431372940540314), (0.28151261806488037, -0.18823529779911041, 0.18823529779911041), (0.28571429848670959, -0.18823529779911041, 0.18823529779911041), (0.28991597890853882, -0.18823529779911041, 0.18823529779911041), (0.29411765933036804, -0.19215686619281769, 0.19215686619281769), (0.29831933975219727, -0.19215686619281769, 0.19215686619281769), (0.30252102017402649, -0.19607843458652496, 0.19607843458652496), (0.30672270059585571, -0.19607843458652496, 0.19607843458652496), (0.31092438101768494, -0.20000000298023224, 0.20000000298023224), (0.31512606143951416, -0.20000000298023224, 0.20000000298023224), (0.31932774186134338, -0.20392157137393951, 0.20392157137393951), (0.32352942228317261, -0.20392157137393951, 0.20392157137393951), (0.32773110270500183, -0.20784313976764679, 0.20784313976764679), (0.33193278312683105, -0.20784313976764679, 0.20784313976764679), (0.33613446354866028, -0.21176470816135406, 0.21176470816135406), (0.3403361439704895, -0.21176470816135406, 0.21176470816135406), (0.34453782439231873, -0.21568627655506134, 0.21568627655506134), (0.34873950481414795, -0.21568627655506134, 0.21568627655506134), (0.35294118523597717, -0.21960784494876862, 0.21960784494876862), (0.3571428656578064, -0.21960784494876862, 0.21960784494876862), (0.36134454607963562, -0.22352941334247589, 0.22352941334247589), (0.36554622650146484, -0.22352941334247589, 0.22352941334247589), (0.36974790692329407, -0.22745098173618317, 0.22745098173618317), (0.37394958734512329, -0.22745098173618317, 0.22745098173618317), (0.37815126776695251, -0.23137255012989044, 0.23137255012989044), (0.38235294818878174, -0.23137255012989044, 0.23137255012989044), (0.38655462861061096, -0.23529411852359772, 0.23529411852359772), (0.39075630903244019, -0.23921568691730499, 0.23921568691730499), (0.39495798945426941, -0.23921568691730499, 0.23921568691730499), (0.39915966987609863, -0.24313725531101227, 0.24313725531101227), (0.40336135029792786, -0.24313725531101227, 0.24313725531101227), (0.40756303071975708, -0.24705882370471954, 0.24705882370471954), (0.4117647111415863, -0.24705882370471954, 0.24705882370471954), (0.41596639156341553, -0.25098040699958801, 0.25098040699958801), (0.42016807198524475, -0.25098040699958801, 0.25098040699958801), (0.42436975240707397, -0.25490197539329529, 0.25490197539329529), (0.4285714328289032, -0.25490197539329529, 0.25490197539329529), (0.43277311325073242, -0.25882354378700256, 0.25882354378700256), (0.43697479367256165, -0.26274511218070984, 0.26274511218070984), (0.44117647409439087, -0.26274511218070984, 0.26274511218070984), (0.44537815451622009, -0.26666668057441711, 0.26666668057441711), (0.44957983493804932, -0.26666668057441711, 0.26666668057441711), (0.45378151535987854, -0.27058824896812439, 0.27058824896812439), (0.45798319578170776, -0.27058824896812439, 0.27058824896812439), (0.46218487620353699, -0.27450981736183167, 0.27450981736183167), (0.46638655662536621, -0.27843138575553894, 0.27843138575553894), (0.47058823704719543, -0.28627452254295349, 0.28627452254295349), (0.47478991746902466, -0.29803922772407532, 0.29803922772407532), (0.47899159789085388, -0.30588236451148987, 0.30588236451148987), (0.48319327831268311, -0.31764706969261169, 0.31764706969261169), (0.48739495873451233, -0.32549020648002625, 0.32549020648002625), (0.49159663915634155, -0.33725491166114807, 0.33725491166114807), (0.49579831957817078, -0.34509804844856262, 0.34509804844856262), (0.5, 0.35686275362968445, -0.35686275362968445), (0.50420171022415161, 0.36862745881080627, -0.36862745881080627), (0.50840336084365845, 0.37647059559822083, -0.37647059559822083), (0.51260507106781006, 0.38823530077934265, -0.38823530077934265), (0.51680672168731689, 0.3960784375667572, -0.3960784375667572), (0.52100843191146851, 0.40784314274787903, -0.40784314274787903), (0.52521008253097534, 0.41568627953529358, -0.41568627953529358), (0.52941179275512695, 0.42745098471641541, -0.42745098471641541), (0.53361344337463379, 0.43529412150382996, -0.43529412150382996), (0.5378151535987854, 0.44705882668495178, -0.44705882668495178), (0.54201680421829224, 0.45882353186607361, -0.45882353186607361), (0.54621851444244385, 0.46666666865348816, -0.46666666865348816), (0.55042016506195068, 0.47450980544090271, -0.47450980544090271), (0.55462187528610229, 0.47843137383460999, -0.47843137383460999), (0.55882352590560913, 0.48627451062202454, -0.48627451062202454), (0.56302523612976074, 0.49411764740943909, -0.49411764740943909), (0.56722688674926758, 0.50196081399917603, -0.50196081399917603), (0.57142859697341919, 0.5058823823928833, -0.5058823823928833), (0.57563024759292603, 0.51372551918029785, -0.51372551918029785), (0.57983195781707764, 0.5215686559677124, -0.5215686559677124), (0.58403360843658447, 0.52941179275512695, -0.52941179275512695), (0.58823531866073608, 0.53333336114883423, -0.53333336114883423), (0.59243696928024292, 0.54117649793624878, -0.54117649793624878), (0.59663867950439453, 0.54901963472366333, -0.54901963472366333), (0.60084033012390137, 0.55294120311737061, -0.55294120311737061), (0.60504204034805298, 0.56078433990478516, -0.56078433990478516), (0.60924369096755981, 0.56862747669219971, -0.56862747669219971), (0.61344540119171143, 0.57647061347961426, -0.57647061347961426), (0.61764705181121826, 0.58431375026702881, -0.58431375026702881), (0.62184876203536987, 0.58823531866073608, -0.58823531866073608), (0.62605041265487671, 0.59607845544815063, -0.59607845544815063), (0.63025212287902832, 0.60392159223556519, -0.60392159223556519), (0.63445377349853516, 0.61176472902297974, -0.61176472902297974), (0.63865548372268677, 0.61568629741668701, -0.61568629741668701), (0.6428571343421936, 0.62352943420410156, -0.62352943420410156), (0.64705884456634521, 0.63137257099151611, -0.63137257099151611), (0.65126049518585205, 0.63921570777893066, -0.63921570777893066), (0.65546220541000366, 0.64705884456634521, -0.64705884456634521), (0.6596638560295105, 0.65098041296005249, -0.65098041296005249), (0.66386556625366211, 0.65882354974746704, -0.65882354974746704), (0.66806721687316895, 0.66666668653488159, -0.66666668653488159), (0.67226892709732056, 0.67450982332229614, -0.67450982332229614), (0.67647057771682739, 0.68235296010971069, -0.68235296010971069), (0.680672287940979, 0.68627452850341797, -0.68627452850341797), (0.68487393856048584, 0.69411766529083252, -0.69411766529083252), (0.68907564878463745, 0.70196080207824707, -0.70196080207824707), (0.69327729940414429, 0.70980393886566162, -0.70980393886566162), (0.6974790096282959, 0.71764707565307617, -0.71764707565307617), (0.70168066024780273, 0.71764707565307617, -0.71764707565307617), (0.70588237047195435, 0.72156864404678345, -0.72156864404678345), (0.71008402109146118, 0.72156864404678345, -0.72156864404678345), (0.71428573131561279, 0.72549021244049072, -0.72549021244049072), (0.71848738193511963, 0.72549021244049072, -0.72549021244049072), (0.72268909215927124, 0.729411780834198, -0.729411780834198), (0.72689074277877808, 0.729411780834198, -0.729411780834198), (0.73109245300292969, 0.73333334922790527, -0.73333334922790527), (0.73529410362243652, 0.73333334922790527, -0.73333334922790527), (0.73949581384658813, 0.73333334922790527, -0.73333334922790527), (0.74369746446609497, 0.73725491762161255, -0.73725491762161255), (0.74789917469024658, 0.73725491762161255, -0.73725491762161255), (0.75210082530975342, 0.74117648601531982, -0.74117648601531982), (0.75630253553390503, 0.74117648601531982, -0.74117648601531982), (0.76050418615341187, 0.7450980544090271, -0.7450980544090271), (0.76470589637756348, 0.7450980544090271, -0.7450980544090271), (0.76890754699707031, 0.7450980544090271, -0.7450980544090271), (0.77310925722122192, 0.74901962280273438, -0.74901962280273438), (0.77731090784072876, 0.74901962280273438, -0.74901962280273438), (0.78151261806488037, 0.75294119119644165, -0.75294119119644165), (0.78571426868438721, 0.75294119119644165, -0.75294119119644165), (0.78991597890853882, 0.75686275959014893, -0.75686275959014893), (0.79411762952804565, 0.76470589637756348, -0.76470589637756348), (0.79831933975219727, 0.76862746477127075, -0.76862746477127075), (0.8025209903717041, 0.77254903316497803, -0.77254903316497803), (0.80672270059585571, 0.7764706015586853, -0.7764706015586853), (0.81092435121536255, 0.78039216995239258, -0.78039216995239258), (0.81512606143951416, 0.78823530673980713, -0.78823530673980713), (0.819327712059021, 0.7921568751335144, -0.7921568751335144), (0.82352942228317261, 0.79607844352722168, -0.79607844352722168), (0.82773107290267944, 0.80000001192092896, -0.80000001192092896), (0.83193278312683105, 0.80392158031463623, -0.80392158031463623), (0.83613443374633789, 0.81176471710205078, -0.81176471710205078), (0.8403361439704895, 0.81568628549575806, -0.81568628549575806), (0.84453779458999634, 0.81960785388946533, -0.81960785388946533), (0.84873950481414795, 0.82352942228317261, -0.82352942228317261), (0.85294115543365479, 0.82745099067687988, -0.82745099067687988), (0.8571428656578064, 0.83529412746429443, -0.83529412746429443), (0.86134451627731323, 0.83921569585800171, -0.83921569585800171), (0.86554622650146484, 0.84313726425170898, -0.84313726425170898), (0.86974787712097168, 0.84705883264541626, -0.84705883264541626), (0.87394958734512329, 0.85098040103912354, -0.85098040103912354), (0.87815123796463013, 0.85882353782653809, -0.85882353782653809), (0.88235294818878174, 0.86274510622024536, -0.86274510622024536), (0.88655459880828857, 0.86666667461395264, -0.86666667461395264), (0.89075630903244019, 0.87058824300765991, -0.87058824300765991), (0.89495795965194702, 0.87450981140136719, -0.87450981140136719), (0.89915966987609863, 0.88235294818878174, -0.88235294818878174), (0.90336132049560547, 0.88627451658248901, -0.88627451658248901), (0.90756303071975708, 0.89019608497619629, -0.89019608497619629), (0.91176468133926392, 0.89411765336990356, -0.89411765336990356), (0.91596639156341553, 0.89803922176361084, -0.89803922176361084), (0.92016804218292236, 0.90588235855102539, -0.90588235855102539), (0.92436975240707397, 0.90980392694473267, -0.90980392694473267), (0.92857140302658081, 0.91372549533843994, -0.91372549533843994), (0.93277311325073242, 0.91764706373214722, -0.91764706373214722), (0.93697476387023926, 0.92156863212585449, -0.92156863212585449), (0.94117647409439087, 0.92941176891326904, -0.92941176891326904), (0.94537812471389771, 0.93333333730697632, -0.93333333730697632), (0.94957983493804932, 0.93725490570068359, -0.93725490570068359), (0.95378148555755615, 0.94117647409439087, -0.94117647409439087), (0.95798319578170776, 0.94509804248809814, -0.94509804248809814), (0.9621848464012146, 0.9529411792755127, -0.9529411792755127), (0.96638655662536621, 0.95686274766921997, -0.95686274766921997), (0.97058820724487305, 0.96078431606292725, -0.96078431606292725), (0.97478991746902466, 0.96470588445663452, -0.96470588445663452), (0.97899156808853149, 0.9686274528503418, -0.9686274528503418), (0.98319327831268311, 0.97647058963775635, -0.97647058963775635), (0.98739492893218994, 0.98039215803146362, -0.98039215803146362), (0.99159663915634155, 0.9843137264251709, -0.9843137264251709), (0.99579828977584839, 0.98823529481887817, -0.98823529481887817), (1.0, 0.99215686321258545, 0.99215686321258545)]} -_gist_gray_data = {'blue': [(0.0, 0.0, 0.0), (0.0042016808874905109, -0.0039215688593685627, 0.0039215688593685627), (0.0084033617749810219, -0.0078431377187371254, 0.0078431377187371254), (0.012605042196810246, -0.011764706112444401, 0.011764706112444401), (0.016806723549962044, -0.015686275437474251, 0.015686275437474251), (0.021008403971791267, -0.019607843831181526, 0.019607843831181526), (0.025210084393620491, -0.023529412224888802, 0.023529412224888802), (0.029411764815449715, -0.027450980618596077, 0.027450980618596077), (0.033613447099924088, -0.035294119268655777, 0.035294119268655777), (0.037815127521753311, -0.039215687662363052, 0.039215687662363052), (0.042016807943582535, -0.043137256056070328, 0.043137256056070328), (0.046218488365411758, -0.047058824449777603, 0.047058824449777603), (0.050420168787240982, -0.050980392843484879, 0.050980392843484879), (0.054621849209070206, -0.054901961237192154, 0.054901961237192154), (0.058823529630899429, -0.058823529630899429, 0.058823529630899429), (0.063025213778018951, -0.062745101749897003, 0.062745101749897003), (0.067226894199848175, -0.066666670143604279, 0.066666670143604279), (0.071428574621677399, -0.070588238537311554, 0.070588238537311554), (0.075630255043506622, -0.074509806931018829, 0.074509806931018829), (0.079831935465335846, -0.078431375324726105, 0.078431375324726105), (0.08403361588716507, -0.08235294371843338, 0.08235294371843338), (0.088235296308994293, -0.086274512112140656, 0.086274512112140656), (0.092436976730823517, -0.090196080505847931, 0.090196080505847931), (0.09663865715265274, -0.098039217293262482, 0.098039217293262482), (0.10084033757448196, -0.10196078568696976, 0.10196078568696976), (0.10504201799631119, -0.10588235408067703, 0.10588235408067703), (0.10924369841814041, -0.10980392247438431, 0.10980392247438431), (0.11344537883996964, -0.11372549086809158, 0.11372549086809158), (0.11764705926179886, -0.11764705926179886, 0.11764705926179886), (0.12184873968362808, -0.12156862765550613, 0.12156862765550613), (0.1260504275560379, -0.12549020349979401, 0.12549020349979401), (0.13025210797786713, -0.12941177189350128, 0.12941177189350128), (0.13445378839969635, -0.13333334028720856, 0.13333334028720856), (0.13865546882152557, -0.13725490868091583, 0.13725490868091583), (0.1428571492433548, -0.14117647707462311, 0.14117647707462311), (0.14705882966518402, -0.14509804546833038, 0.14509804546833038), (0.15126051008701324, -0.14901961386203766, 0.14901961386203766), (0.15546219050884247, -0.15294118225574493, 0.15294118225574493), (0.15966387093067169, -0.16078431904315948, 0.16078431904315948), (0.16386555135250092, -0.16470588743686676, 0.16470588743686676), (0.16806723177433014, -0.16862745583057404, 0.16862745583057404), (0.17226891219615936, -0.17254902422428131, 0.17254902422428131), (0.17647059261798859, -0.17647059261798859, 0.17647059261798859), (0.18067227303981781, -0.18039216101169586, 0.18039216101169586), (0.18487395346164703, -0.18431372940540314, 0.18431372940540314), (0.18907563388347626, -0.18823529779911041, 0.18823529779911041), (0.19327731430530548, -0.19215686619281769, 0.19215686619281769), (0.1974789947271347, -0.19607843458652496, 0.19607843458652496), (0.20168067514896393, -0.20000000298023224, 0.20000000298023224), (0.20588235557079315, -0.20392157137393951, 0.20392157137393951), (0.21008403599262238, -0.20784313976764679, 0.20784313976764679), (0.2142857164144516, -0.21176470816135406, 0.21176470816135406), (0.21848739683628082, -0.21568627655506134, 0.21568627655506134), (0.22268907725811005, -0.22352941334247589, 0.22352941334247589), (0.22689075767993927, -0.22745098173618317, 0.22745098173618317), (0.23109243810176849, -0.23137255012989044, 0.23137255012989044), (0.23529411852359772, -0.23529411852359772, 0.23529411852359772), (0.23949579894542694, -0.23921568691730499, 0.23921568691730499), (0.24369747936725616, -0.24313725531101227, 0.24313725531101227), (0.24789915978908539, -0.24705882370471954, 0.24705882370471954), (0.25210085511207581, -0.25098040699958801, 0.25098040699958801), (0.25630253553390503, -0.25490197539329529, 0.25490197539329529), (0.26050421595573425, -0.25882354378700256, 0.25882354378700256), (0.26470589637756348, -0.26274511218070984, 0.26274511218070984), (0.2689075767993927, -0.26666668057441711, 0.26666668057441711), (0.27310925722122192, -0.27058824896812439, 0.27058824896812439), (0.27731093764305115, -0.27450981736183167, 0.27450981736183167), (0.28151261806488037, -0.27843138575553894, 0.27843138575553894), (0.28571429848670959, -0.28627452254295349, 0.28627452254295349), (0.28991597890853882, -0.29019609093666077, 0.29019609093666077), (0.29411765933036804, -0.29411765933036804, 0.29411765933036804), (0.29831933975219727, -0.29803922772407532, 0.29803922772407532), (0.30252102017402649, -0.30196079611778259, 0.30196079611778259), (0.30672270059585571, -0.30588236451148987, 0.30588236451148987), (0.31092438101768494, -0.30980393290519714, 0.30980393290519714), (0.31512606143951416, -0.31372550129890442, 0.31372550129890442), (0.31932774186134338, -0.31764706969261169, 0.31764706969261169), (0.32352942228317261, -0.32156863808631897, 0.32156863808631897), (0.32773110270500183, -0.32549020648002625, 0.32549020648002625), (0.33193278312683105, -0.32941177487373352, 0.32941177487373352), (0.33613446354866028, -0.3333333432674408, 0.3333333432674408), (0.3403361439704895, -0.33725491166114807, 0.33725491166114807), (0.34453782439231873, -0.34117648005485535, 0.34117648005485535), (0.34873950481414795, -0.3490196168422699, 0.3490196168422699), (0.35294118523597717, -0.35294118523597717, 0.35294118523597717), (0.3571428656578064, -0.35686275362968445, 0.35686275362968445), (0.36134454607963562, -0.36078432202339172, 0.36078432202339172), (0.36554622650146484, -0.364705890417099, 0.364705890417099), (0.36974790692329407, -0.36862745881080627, 0.36862745881080627), (0.37394958734512329, -0.37254902720451355, 0.37254902720451355), (0.37815126776695251, -0.37647059559822083, 0.37647059559822083), (0.38235294818878174, -0.3803921639919281, 0.3803921639919281), (0.38655462861061096, -0.38431373238563538, 0.38431373238563538), (0.39075630903244019, -0.38823530077934265, 0.38823530077934265), (0.39495798945426941, -0.39215686917304993, 0.39215686917304993), (0.39915966987609863, -0.3960784375667572, 0.3960784375667572), (0.40336135029792786, -0.40000000596046448, 0.40000000596046448), (0.40756303071975708, -0.40392157435417175, 0.40392157435417175), (0.4117647111415863, -0.4117647111415863, 0.4117647111415863), (0.41596639156341553, -0.41568627953529358, 0.41568627953529358), (0.42016807198524475, -0.41960784792900085, 0.41960784792900085), (0.42436975240707397, -0.42352941632270813, 0.42352941632270813), (0.4285714328289032, -0.42745098471641541, 0.42745098471641541), (0.43277311325073242, -0.43137255311012268, 0.43137255311012268), (0.43697479367256165, -0.43529412150382996, 0.43529412150382996), (0.44117647409439087, -0.43921568989753723, 0.43921568989753723), (0.44537815451622009, -0.44313725829124451, 0.44313725829124451), (0.44957983493804932, -0.44705882668495178, 0.44705882668495178), (0.45378151535987854, -0.45098039507865906, 0.45098039507865906), (0.45798319578170776, -0.45490196347236633, 0.45490196347236633), (0.46218487620353699, -0.45882353186607361, 0.45882353186607361), (0.46638655662536621, -0.46274510025978088, 0.46274510025978088), (0.47058823704719543, -0.46666666865348816, 0.46666666865348816), (0.47478991746902466, -0.47450980544090271, 0.47450980544090271), (0.47899159789085388, -0.47843137383460999, 0.47843137383460999), (0.48319327831268311, -0.48235294222831726, 0.48235294222831726), (0.48739495873451233, -0.48627451062202454, 0.48627451062202454), (0.49159663915634155, -0.49019607901573181, 0.49019607901573181), (0.49579831957817078, -0.49411764740943909, 0.49411764740943909), (0.5, 0.49803921580314636, -0.49803921580314636), (0.50420171022415161, 0.50196081399917603, -0.50196081399917603), (0.50840336084365845, 0.5058823823928833, -0.5058823823928833), (0.51260507106781006, 0.50980395078659058, -0.50980395078659058), (0.51680672168731689, 0.51372551918029785, -0.51372551918029785), (0.52100843191146851, 0.51764708757400513, -0.51764708757400513), (0.52521008253097534, 0.5215686559677124, -0.5215686559677124), (0.52941179275512695, 0.52549022436141968, -0.52549022436141968), (0.53361344337463379, 0.52941179275512695, -0.52941179275512695), (0.5378151535987854, 0.5372549295425415, -0.5372549295425415), (0.54201680421829224, 0.54117649793624878, -0.54117649793624878), (0.54621851444244385, 0.54509806632995605, -0.54509806632995605), (0.55042016506195068, 0.54901963472366333, -0.54901963472366333), (0.55462187528610229, 0.55294120311737061, -0.55294120311737061), (0.55882352590560913, 0.55686277151107788, -0.55686277151107788), (0.56302523612976074, 0.56078433990478516, -0.56078433990478516), (0.56722688674926758, 0.56470590829849243, -0.56470590829849243), (0.57142859697341919, 0.56862747669219971, -0.56862747669219971), (0.57563024759292603, 0.57254904508590698, -0.57254904508590698), (0.57983195781707764, 0.57647061347961426, -0.57647061347961426), (0.58403360843658447, 0.58039218187332153, -0.58039218187332153), (0.58823531866073608, 0.58431375026702881, -0.58431375026702881), (0.59243696928024292, 0.58823531866073608, -0.58823531866073608), (0.59663867950439453, 0.59215688705444336, -0.59215688705444336), (0.60084033012390137, 0.60000002384185791, -0.60000002384185791), (0.60504204034805298, 0.60392159223556519, -0.60392159223556519), (0.60924369096755981, 0.60784316062927246, -0.60784316062927246), (0.61344540119171143, 0.61176472902297974, -0.61176472902297974), (0.61764705181121826, 0.61568629741668701, -0.61568629741668701), (0.62184876203536987, 0.61960786581039429, -0.61960786581039429), (0.62605041265487671, 0.62352943420410156, -0.62352943420410156), (0.63025212287902832, 0.62745100259780884, -0.62745100259780884), (0.63445377349853516, 0.63137257099151611, -0.63137257099151611), (0.63865548372268677, 0.63529413938522339, -0.63529413938522339), (0.6428571343421936, 0.63921570777893066, -0.63921570777893066), (0.64705884456634521, 0.64313727617263794, -0.64313727617263794), (0.65126049518585205, 0.64705884456634521, -0.64705884456634521), (0.65546220541000366, 0.65098041296005249, -0.65098041296005249), (0.6596638560295105, 0.65490198135375977, -0.65490198135375977), (0.66386556625366211, 0.66274511814117432, -0.66274511814117432), (0.66806721687316895, 0.66666668653488159, -0.66666668653488159), (0.67226892709732056, 0.67058825492858887, -0.67058825492858887), (0.67647057771682739, 0.67450982332229614, -0.67450982332229614), (0.680672287940979, 0.67843139171600342, -0.67843139171600342), (0.68487393856048584, 0.68235296010971069, -0.68235296010971069), (0.68907564878463745, 0.68627452850341797, -0.68627452850341797), (0.69327729940414429, 0.69019609689712524, -0.69019609689712524), (0.6974790096282959, 0.69411766529083252, -0.69411766529083252), (0.70168066024780273, 0.69803923368453979, -0.69803923368453979), (0.70588237047195435, 0.70196080207824707, -0.70196080207824707), (0.71008402109146118, 0.70588237047195435, -0.70588237047195435), (0.71428573131561279, 0.70980393886566162, -0.70980393886566162), (0.71848738193511963, 0.7137255072593689, -0.7137255072593689), (0.72268909215927124, 0.71764707565307617, -0.71764707565307617), (0.72689074277877808, 0.72549021244049072, -0.72549021244049072), (0.73109245300292969, 0.729411780834198, -0.729411780834198), (0.73529410362243652, 0.73333334922790527, -0.73333334922790527), (0.73949581384658813, 0.73725491762161255, -0.73725491762161255), (0.74369746446609497, 0.74117648601531982, -0.74117648601531982), (0.74789917469024658, 0.7450980544090271, -0.7450980544090271), (0.75210082530975342, 0.74901962280273438, -0.74901962280273438), (0.75630253553390503, 0.75294119119644165, -0.75294119119644165), (0.76050418615341187, 0.75686275959014893, -0.75686275959014893), (0.76470589637756348, 0.7607843279838562, -0.7607843279838562), (0.76890754699707031, 0.76470589637756348, -0.76470589637756348), (0.77310925722122192, 0.76862746477127075, -0.76862746477127075), (0.77731090784072876, 0.77254903316497803, -0.77254903316497803), (0.78151261806488037, 0.7764706015586853, -0.7764706015586853), (0.78571426868438721, 0.78039216995239258, -0.78039216995239258), (0.78991597890853882, 0.78823530673980713, -0.78823530673980713), (0.79411762952804565, 0.7921568751335144, -0.7921568751335144), (0.79831933975219727, 0.79607844352722168, -0.79607844352722168), (0.8025209903717041, 0.80000001192092896, -0.80000001192092896), (0.80672270059585571, 0.80392158031463623, -0.80392158031463623), (0.81092435121536255, 0.80784314870834351, -0.80784314870834351), (0.81512606143951416, 0.81176471710205078, -0.81176471710205078), (0.819327712059021, 0.81568628549575806, -0.81568628549575806), (0.82352942228317261, 0.81960785388946533, -0.81960785388946533), (0.82773107290267944, 0.82352942228317261, -0.82352942228317261), (0.83193278312683105, 0.82745099067687988, -0.82745099067687988), (0.83613443374633789, 0.83137255907058716, -0.83137255907058716), (0.8403361439704895, 0.83529412746429443, -0.83529412746429443), (0.84453779458999634, 0.83921569585800171, -0.83921569585800171), (0.84873950481414795, 0.84313726425170898, -0.84313726425170898), (0.85294115543365479, 0.85098040103912354, -0.85098040103912354), (0.8571428656578064, 0.85490196943283081, -0.85490196943283081), (0.86134451627731323, 0.85882353782653809, -0.85882353782653809), (0.86554622650146484, 0.86274510622024536, -0.86274510622024536), (0.86974787712097168, 0.86666667461395264, -0.86666667461395264), (0.87394958734512329, 0.87058824300765991, -0.87058824300765991), (0.87815123796463013, 0.87450981140136719, -0.87450981140136719), (0.88235294818878174, 0.87843137979507446, -0.87843137979507446), (0.88655459880828857, 0.88235294818878174, -0.88235294818878174), (0.89075630903244019, 0.88627451658248901, -0.88627451658248901), (0.89495795965194702, 0.89019608497619629, -0.89019608497619629), (0.89915966987609863, 0.89411765336990356, -0.89411765336990356), (0.90336132049560547, 0.89803922176361084, -0.89803922176361084), (0.90756303071975708, 0.90196079015731812, -0.90196079015731812), (0.91176468133926392, 0.90588235855102539, -0.90588235855102539), (0.91596639156341553, 0.91372549533843994, -0.91372549533843994), (0.92016804218292236, 0.91764706373214722, -0.91764706373214722), (0.92436975240707397, 0.92156863212585449, -0.92156863212585449), (0.92857140302658081, 0.92549020051956177, -0.92549020051956177), (0.93277311325073242, 0.92941176891326904, -0.92941176891326904), (0.93697476387023926, 0.93333333730697632, -0.93333333730697632), (0.94117647409439087, 0.93725490570068359, -0.93725490570068359), (0.94537812471389771, 0.94117647409439087, -0.94117647409439087), (0.94957983493804932, 0.94509804248809814, -0.94509804248809814), (0.95378148555755615, 0.94901961088180542, -0.94901961088180542), (0.95798319578170776, 0.9529411792755127, -0.9529411792755127), (0.9621848464012146, 0.95686274766921997, -0.95686274766921997), (0.96638655662536621, 0.96078431606292725, -0.96078431606292725), (0.97058820724487305, 0.96470588445663452, -0.96470588445663452), (0.97478991746902466, 0.9686274528503418, -0.9686274528503418), (0.97899156808853149, 0.97647058963775635, -0.97647058963775635), (0.98319327831268311, 0.98039215803146362, -0.98039215803146362), (0.98739492893218994, 0.9843137264251709, -0.9843137264251709), (0.99159663915634155, 0.98823529481887817, -0.98823529481887817), (0.99579828977584839, 0.99215686321258545, -0.99215686321258545), (1.0, 0.99607843160629272, 0.99607843160629272)], -'green': [(0.0, 0.0, 0.0), (0.0042016808874905109, 0.0039215688593685627, -0.0039215688593685627), (0.0084033617749810219, 0.0078431377187371254, -0.0078431377187371254), (0.012605042196810246, 0.011764706112444401, -0.011764706112444401), (0.016806723549962044, 0.015686275437474251, -0.015686275437474251), (0.021008403971791267, 0.019607843831181526, -0.019607843831181526), (0.025210084393620491, 0.023529412224888802, -0.023529412224888802), (0.029411764815449715, 0.027450980618596077, -0.027450980618596077), (0.033613447099924088, 0.035294119268655777, -0.035294119268655777), (0.037815127521753311, 0.039215687662363052, -0.039215687662363052), (0.042016807943582535, 0.043137256056070328, -0.043137256056070328), (0.046218488365411758, 0.047058824449777603, -0.047058824449777603), (0.050420168787240982, 0.050980392843484879, -0.050980392843484879), (0.054621849209070206, 0.054901961237192154, -0.054901961237192154), (0.058823529630899429, 0.058823529630899429, -0.058823529630899429), (0.063025213778018951, 0.062745101749897003, -0.062745101749897003), (0.067226894199848175, 0.066666670143604279, -0.066666670143604279), (0.071428574621677399, 0.070588238537311554, -0.070588238537311554), (0.075630255043506622, 0.074509806931018829, -0.074509806931018829), (0.079831935465335846, 0.078431375324726105, -0.078431375324726105), (0.08403361588716507, 0.08235294371843338, -0.08235294371843338), (0.088235296308994293, 0.086274512112140656, -0.086274512112140656), (0.092436976730823517, 0.090196080505847931, -0.090196080505847931), (0.09663865715265274, 0.098039217293262482, -0.098039217293262482), (0.10084033757448196, 0.10196078568696976, -0.10196078568696976), (0.10504201799631119, 0.10588235408067703, -0.10588235408067703), (0.10924369841814041, 0.10980392247438431, -0.10980392247438431), (0.11344537883996964, 0.11372549086809158, -0.11372549086809158), (0.11764705926179886, 0.11764705926179886, -0.11764705926179886), (0.12184873968362808, 0.12156862765550613, -0.12156862765550613), (0.1260504275560379, 0.12549020349979401, -0.12549020349979401), (0.13025210797786713, 0.12941177189350128, -0.12941177189350128), (0.13445378839969635, 0.13333334028720856, -0.13333334028720856), (0.13865546882152557, 0.13725490868091583, -0.13725490868091583), (0.1428571492433548, 0.14117647707462311, -0.14117647707462311), (0.14705882966518402, 0.14509804546833038, -0.14509804546833038), (0.15126051008701324, 0.14901961386203766, -0.14901961386203766), (0.15546219050884247, 0.15294118225574493, -0.15294118225574493), (0.15966387093067169, 0.16078431904315948, -0.16078431904315948), (0.16386555135250092, 0.16470588743686676, -0.16470588743686676), (0.16806723177433014, 0.16862745583057404, -0.16862745583057404), (0.17226891219615936, 0.17254902422428131, -0.17254902422428131), (0.17647059261798859, 0.17647059261798859, -0.17647059261798859), (0.18067227303981781, 0.18039216101169586, -0.18039216101169586), (0.18487395346164703, 0.18431372940540314, -0.18431372940540314), (0.18907563388347626, 0.18823529779911041, -0.18823529779911041), (0.19327731430530548, 0.19215686619281769, -0.19215686619281769), (0.1974789947271347, 0.19607843458652496, -0.19607843458652496), (0.20168067514896393, 0.20000000298023224, -0.20000000298023224), (0.20588235557079315, 0.20392157137393951, -0.20392157137393951), (0.21008403599262238, 0.20784313976764679, -0.20784313976764679), (0.2142857164144516, 0.21176470816135406, -0.21176470816135406), (0.21848739683628082, 0.21568627655506134, -0.21568627655506134), (0.22268907725811005, 0.22352941334247589, -0.22352941334247589), (0.22689075767993927, 0.22745098173618317, -0.22745098173618317), (0.23109243810176849, 0.23137255012989044, -0.23137255012989044), (0.23529411852359772, 0.23529411852359772, -0.23529411852359772), (0.23949579894542694, 0.23921568691730499, -0.23921568691730499), (0.24369747936725616, 0.24313725531101227, -0.24313725531101227), (0.24789915978908539, 0.24705882370471954, -0.24705882370471954), (0.25210085511207581, 0.25098040699958801, -0.25098040699958801), (0.25630253553390503, 0.25490197539329529, -0.25490197539329529), (0.26050421595573425, 0.25882354378700256, -0.25882354378700256), (0.26470589637756348, 0.26274511218070984, -0.26274511218070984), (0.2689075767993927, 0.26666668057441711, -0.26666668057441711), (0.27310925722122192, 0.27058824896812439, -0.27058824896812439), (0.27731093764305115, 0.27450981736183167, -0.27450981736183167), (0.28151261806488037, 0.27843138575553894, -0.27843138575553894), (0.28571429848670959, 0.28627452254295349, -0.28627452254295349), (0.28991597890853882, 0.29019609093666077, -0.29019609093666077), (0.29411765933036804, 0.29411765933036804, -0.29411765933036804), (0.29831933975219727, 0.29803922772407532, -0.29803922772407532), (0.30252102017402649, 0.30196079611778259, -0.30196079611778259), (0.30672270059585571, 0.30588236451148987, -0.30588236451148987), (0.31092438101768494, 0.30980393290519714, -0.30980393290519714), (0.31512606143951416, 0.31372550129890442, -0.31372550129890442), (0.31932774186134338, 0.31764706969261169, -0.31764706969261169), (0.32352942228317261, 0.32156863808631897, -0.32156863808631897), (0.32773110270500183, 0.32549020648002625, -0.32549020648002625), (0.33193278312683105, 0.32941177487373352, -0.32941177487373352), (0.33613446354866028, 0.3333333432674408, -0.3333333432674408), (0.3403361439704895, 0.33725491166114807, -0.33725491166114807), (0.34453782439231873, 0.34117648005485535, -0.34117648005485535), (0.34873950481414795, 0.3490196168422699, -0.3490196168422699), (0.35294118523597717, 0.35294118523597717, -0.35294118523597717), (0.3571428656578064, 0.35686275362968445, -0.35686275362968445), (0.36134454607963562, 0.36078432202339172, -0.36078432202339172), (0.36554622650146484, 0.364705890417099, -0.364705890417099), (0.36974790692329407, 0.36862745881080627, -0.36862745881080627), (0.37394958734512329, 0.37254902720451355, -0.37254902720451355), (0.37815126776695251, 0.37647059559822083, -0.37647059559822083), (0.38235294818878174, 0.3803921639919281, -0.3803921639919281), (0.38655462861061096, 0.38431373238563538, -0.38431373238563538), (0.39075630903244019, 0.38823530077934265, -0.38823530077934265), (0.39495798945426941, 0.39215686917304993, -0.39215686917304993), (0.39915966987609863, 0.3960784375667572, -0.3960784375667572), (0.40336135029792786, 0.40000000596046448, -0.40000000596046448), (0.40756303071975708, 0.40392157435417175, -0.40392157435417175), (0.4117647111415863, 0.4117647111415863, -0.4117647111415863), (0.41596639156341553, 0.41568627953529358, -0.41568627953529358), (0.42016807198524475, 0.41960784792900085, -0.41960784792900085), (0.42436975240707397, 0.42352941632270813, -0.42352941632270813), (0.4285714328289032, 0.42745098471641541, -0.42745098471641541), (0.43277311325073242, 0.43137255311012268, -0.43137255311012268), (0.43697479367256165, 0.43529412150382996, -0.43529412150382996), (0.44117647409439087, 0.43921568989753723, -0.43921568989753723), (0.44537815451622009, 0.44313725829124451, -0.44313725829124451), (0.44957983493804932, 0.44705882668495178, -0.44705882668495178), (0.45378151535987854, 0.45098039507865906, -0.45098039507865906), (0.45798319578170776, 0.45490196347236633, -0.45490196347236633), (0.46218487620353699, 0.45882353186607361, -0.45882353186607361), (0.46638655662536621, 0.46274510025978088, -0.46274510025978088), (0.47058823704719543, 0.46666666865348816, -0.46666666865348816), (0.47478991746902466, 0.47450980544090271, -0.47450980544090271), (0.47899159789085388, 0.47843137383460999, -0.47843137383460999), (0.48319327831268311, 0.48235294222831726, -0.48235294222831726), (0.48739495873451233, 0.48627451062202454, -0.48627451062202454), (0.49159663915634155, 0.49019607901573181, -0.49019607901573181), (0.49579831957817078, 0.49411764740943909, -0.49411764740943909), (0.5, 0.49803921580314636, 0.49803921580314636), -(0.50420171022415161, 0.50196081399917603, 0.50196081399917603), -(0.50840336084365845, 0.5058823823928833, 0.5058823823928833), -(0.51260507106781006, 0.50980395078659058, 0.50980395078659058), -(0.51680672168731689, 0.51372551918029785, 0.51372551918029785), -(0.52100843191146851, 0.51764708757400513, 0.51764708757400513), -(0.52521008253097534, 0.5215686559677124, 0.5215686559677124), -(0.52941179275512695, 0.52549022436141968, 0.52549022436141968), -(0.53361344337463379, 0.52941179275512695, 0.52941179275512695), -(0.5378151535987854, 0.5372549295425415, 0.5372549295425415), -(0.54201680421829224, 0.54117649793624878, 0.54117649793624878), -(0.54621851444244385, 0.54509806632995605, 0.54509806632995605), -(0.55042016506195068, 0.54901963472366333, 0.54901963472366333), -(0.55462187528610229, 0.55294120311737061, 0.55294120311737061), -(0.55882352590560913, 0.55686277151107788, 0.55686277151107788), -(0.56302523612976074, 0.56078433990478516, 0.56078433990478516), -(0.56722688674926758, 0.56470590829849243, 0.56470590829849243), -(0.57142859697341919, 0.56862747669219971, 0.56862747669219971), -(0.57563024759292603, 0.57254904508590698, 0.57254904508590698), -(0.57983195781707764, 0.57647061347961426, 0.57647061347961426), -(0.58403360843658447, 0.58039218187332153, 0.58039218187332153), -(0.58823531866073608, 0.58431375026702881, 0.58431375026702881), -(0.59243696928024292, 0.58823531866073608, 0.58823531866073608), -(0.59663867950439453, 0.59215688705444336, 0.59215688705444336), -(0.60084033012390137, 0.60000002384185791, 0.60000002384185791), -(0.60504204034805298, 0.60392159223556519, 0.60392159223556519), -(0.60924369096755981, 0.60784316062927246, 0.60784316062927246), -(0.61344540119171143, 0.61176472902297974, 0.61176472902297974), -(0.61764705181121826, 0.61568629741668701, 0.61568629741668701), -(0.62184876203536987, 0.61960786581039429, 0.61960786581039429), -(0.62605041265487671, 0.62352943420410156, 0.62352943420410156), -(0.63025212287902832, 0.62745100259780884, 0.62745100259780884), -(0.63445377349853516, 0.63137257099151611, 0.63137257099151611), -(0.63865548372268677, 0.63529413938522339, 0.63529413938522339), -(0.6428571343421936, 0.63921570777893066, 0.63921570777893066), -(0.64705884456634521, 0.64313727617263794, 0.64313727617263794), -(0.65126049518585205, 0.64705884456634521, 0.64705884456634521), -(0.65546220541000366, 0.65098041296005249, 0.65098041296005249), -(0.6596638560295105, 0.65490198135375977, 0.65490198135375977), -(0.66386556625366211, 0.66274511814117432, 0.66274511814117432), -(0.66806721687316895, 0.66666668653488159, 0.66666668653488159), -(0.67226892709732056, 0.67058825492858887, 0.67058825492858887), -(0.67647057771682739, 0.67450982332229614, 0.67450982332229614), -(0.680672287940979, 0.67843139171600342, 0.67843139171600342), -(0.68487393856048584, 0.68235296010971069, 0.68235296010971069), -(0.68907564878463745, 0.68627452850341797, 0.68627452850341797), -(0.69327729940414429, 0.69019609689712524, 0.69019609689712524), -(0.6974790096282959, 0.69411766529083252, 0.69411766529083252), -(0.70168066024780273, 0.69803923368453979, 0.69803923368453979), -(0.70588237047195435, 0.70196080207824707, 0.70196080207824707), -(0.71008402109146118, 0.70588237047195435, 0.70588237047195435), -(0.71428573131561279, 0.70980393886566162, 0.70980393886566162), -(0.71848738193511963, 0.7137255072593689, 0.7137255072593689), -(0.72268909215927124, 0.71764707565307617, 0.71764707565307617), -(0.72689074277877808, 0.72549021244049072, 0.72549021244049072), -(0.73109245300292969, 0.729411780834198, 0.729411780834198), -(0.73529410362243652, 0.73333334922790527, 0.73333334922790527), -(0.73949581384658813, 0.73725491762161255, 0.73725491762161255), -(0.74369746446609497, 0.74117648601531982, 0.74117648601531982), -(0.74789917469024658, 0.7450980544090271, 0.7450980544090271), -(0.75210082530975342, 0.74901962280273438, 0.74901962280273438), -(0.75630253553390503, 0.75294119119644165, 0.75294119119644165), -(0.76050418615341187, 0.75686275959014893, 0.75686275959014893), -(0.76470589637756348, 0.7607843279838562, 0.7607843279838562), -(0.76890754699707031, 0.76470589637756348, 0.76470589637756348), -(0.77310925722122192, 0.76862746477127075, 0.76862746477127075), -(0.77731090784072876, 0.77254903316497803, 0.77254903316497803), -(0.78151261806488037, 0.7764706015586853, 0.7764706015586853), -(0.78571426868438721, 0.78039216995239258, 0.78039216995239258), -(0.78991597890853882, 0.78823530673980713, 0.78823530673980713), -(0.79411762952804565, 0.7921568751335144, 0.7921568751335144), -(0.79831933975219727, 0.79607844352722168, 0.79607844352722168), -(0.8025209903717041, 0.80000001192092896, 0.80000001192092896), -(0.80672270059585571, 0.80392158031463623, 0.80392158031463623), -(0.81092435121536255, 0.80784314870834351, 0.80784314870834351), -(0.81512606143951416, 0.81176471710205078, 0.81176471710205078), -(0.819327712059021, 0.81568628549575806, 0.81568628549575806), -(0.82352942228317261, 0.81960785388946533, 0.81960785388946533), -(0.82773107290267944, 0.82352942228317261, 0.82352942228317261), -(0.83193278312683105, 0.82745099067687988, 0.82745099067687988), -(0.83613443374633789, 0.83137255907058716, 0.83137255907058716), -(0.8403361439704895, 0.83529412746429443, 0.83529412746429443), -(0.84453779458999634, 0.83921569585800171, 0.83921569585800171), -(0.84873950481414795, 0.84313726425170898, 0.84313726425170898), -(0.85294115543365479, 0.85098040103912354, 0.85098040103912354), -(0.8571428656578064, 0.85490196943283081, 0.85490196943283081), -(0.86134451627731323, 0.85882353782653809, 0.85882353782653809), -(0.86554622650146484, 0.86274510622024536, 0.86274510622024536), -(0.86974787712097168, 0.86666667461395264, 0.86666667461395264), -(0.87394958734512329, 0.87058824300765991, 0.87058824300765991), -(0.87815123796463013, 0.87450981140136719, 0.87450981140136719), -(0.88235294818878174, 0.87843137979507446, 0.87843137979507446), -(0.88655459880828857, 0.88235294818878174, 0.88235294818878174), -(0.89075630903244019, 0.88627451658248901, 0.88627451658248901), -(0.89495795965194702, 0.89019608497619629, 0.89019608497619629), -(0.89915966987609863, 0.89411765336990356, 0.89411765336990356), -(0.90336132049560547, 0.89803922176361084, 0.89803922176361084), -(0.90756303071975708, 0.90196079015731812, 0.90196079015731812), -(0.91176468133926392, 0.90588235855102539, 0.90588235855102539), -(0.91596639156341553, 0.91372549533843994, 0.91372549533843994), -(0.92016804218292236, 0.91764706373214722, 0.91764706373214722), -(0.92436975240707397, 0.92156863212585449, 0.92156863212585449), -(0.92857140302658081, 0.92549020051956177, 0.92549020051956177), -(0.93277311325073242, 0.92941176891326904, 0.92941176891326904), -(0.93697476387023926, 0.93333333730697632, 0.93333333730697632), -(0.94117647409439087, 0.93725490570068359, 0.93725490570068359), -(0.94537812471389771, 0.94117647409439087, 0.94117647409439087), -(0.94957983493804932, 0.94509804248809814, 0.94509804248809814), -(0.95378148555755615, 0.94901961088180542, 0.94901961088180542), -(0.95798319578170776, 0.9529411792755127, 0.9529411792755127), -(0.9621848464012146, 0.95686274766921997, 0.95686274766921997), -(0.96638655662536621, 0.96078431606292725, 0.96078431606292725), -(0.97058820724487305, 0.96470588445663452, 0.96470588445663452), -(0.97478991746902466, 0.9686274528503418, 0.9686274528503418), -(0.97899156808853149, 0.97647058963775635, 0.97647058963775635), -(0.98319327831268311, 0.98039215803146362, 0.98039215803146362), -(0.98739492893218994, 0.9843137264251709, 0.9843137264251709), -(0.99159663915634155, 0.98823529481887817, 0.98823529481887817), -(0.99579828977584839, 0.99215686321258545, 0.99215686321258545), (1.0, -0.99607843160629272, 0.99607843160629272)], 'red': [(0.0, 0.0, 0.0), -(0.0042016808874905109, 0.0039215688593685627, 0.0039215688593685627), -(0.0084033617749810219, 0.0078431377187371254, 0.0078431377187371254), -(0.012605042196810246, 0.011764706112444401, 0.011764706112444401), -(0.016806723549962044, 0.015686275437474251, 0.015686275437474251), -(0.021008403971791267, 0.019607843831181526, 0.019607843831181526), -(0.025210084393620491, 0.023529412224888802, 0.023529412224888802), -(0.029411764815449715, 0.027450980618596077, 0.027450980618596077), -(0.033613447099924088, 0.035294119268655777, 0.035294119268655777), -(0.037815127521753311, 0.039215687662363052, 0.039215687662363052), -(0.042016807943582535, 0.043137256056070328, 0.043137256056070328), -(0.046218488365411758, 0.047058824449777603, 0.047058824449777603), -(0.050420168787240982, 0.050980392843484879, 0.050980392843484879), -(0.054621849209070206, 0.054901961237192154, 0.054901961237192154), -(0.058823529630899429, 0.058823529630899429, 0.058823529630899429), -(0.063025213778018951, 0.062745101749897003, 0.062745101749897003), -(0.067226894199848175, 0.066666670143604279, 0.066666670143604279), -(0.071428574621677399, 0.070588238537311554, 0.070588238537311554), -(0.075630255043506622, 0.074509806931018829, 0.074509806931018829), -(0.079831935465335846, 0.078431375324726105, 0.078431375324726105), -(0.08403361588716507, 0.08235294371843338, 0.08235294371843338), -(0.088235296308994293, 0.086274512112140656, 0.086274512112140656), -(0.092436976730823517, 0.090196080505847931, 0.090196080505847931), -(0.09663865715265274, 0.098039217293262482, 0.098039217293262482), -(0.10084033757448196, 0.10196078568696976, 0.10196078568696976), -(0.10504201799631119, 0.10588235408067703, 0.10588235408067703), -(0.10924369841814041, 0.10980392247438431, 0.10980392247438431), -(0.11344537883996964, 0.11372549086809158, 0.11372549086809158), -(0.11764705926179886, 0.11764705926179886, 0.11764705926179886), -(0.12184873968362808, 0.12156862765550613, 0.12156862765550613), -(0.1260504275560379, 0.12549020349979401, 0.12549020349979401), -(0.13025210797786713, 0.12941177189350128, 0.12941177189350128), -(0.13445378839969635, 0.13333334028720856, 0.13333334028720856), -(0.13865546882152557, 0.13725490868091583, 0.13725490868091583), -(0.1428571492433548, 0.14117647707462311, 0.14117647707462311), -(0.14705882966518402, 0.14509804546833038, 0.14509804546833038), -(0.15126051008701324, 0.14901961386203766, 0.14901961386203766), -(0.15546219050884247, 0.15294118225574493, 0.15294118225574493), -(0.15966387093067169, 0.16078431904315948, 0.16078431904315948), -(0.16386555135250092, 0.16470588743686676, 0.16470588743686676), -(0.16806723177433014, 0.16862745583057404, 0.16862745583057404), -(0.17226891219615936, 0.17254902422428131, 0.17254902422428131), -(0.17647059261798859, 0.17647059261798859, 0.17647059261798859), -(0.18067227303981781, 0.18039216101169586, 0.18039216101169586), -(0.18487395346164703, 0.18431372940540314, 0.18431372940540314), -(0.18907563388347626, 0.18823529779911041, 0.18823529779911041), -(0.19327731430530548, 0.19215686619281769, 0.19215686619281769), -(0.1974789947271347, 0.19607843458652496, 0.19607843458652496), -(0.20168067514896393, 0.20000000298023224, 0.20000000298023224), -(0.20588235557079315, 0.20392157137393951, 0.20392157137393951), -(0.21008403599262238, 0.20784313976764679, 0.20784313976764679), -(0.2142857164144516, 0.21176470816135406, 0.21176470816135406), -(0.21848739683628082, 0.21568627655506134, 0.21568627655506134), -(0.22268907725811005, 0.22352941334247589, 0.22352941334247589), -(0.22689075767993927, 0.22745098173618317, 0.22745098173618317), -(0.23109243810176849, 0.23137255012989044, 0.23137255012989044), -(0.23529411852359772, 0.23529411852359772, 0.23529411852359772), -(0.23949579894542694, 0.23921568691730499, 0.23921568691730499), -(0.24369747936725616, 0.24313725531101227, 0.24313725531101227), -(0.24789915978908539, 0.24705882370471954, 0.24705882370471954), -(0.25210085511207581, 0.25098040699958801, 0.25098040699958801), -(0.25630253553390503, 0.25490197539329529, 0.25490197539329529), -(0.26050421595573425, 0.25882354378700256, 0.25882354378700256), -(0.26470589637756348, 0.26274511218070984, 0.26274511218070984), -(0.2689075767993927, 0.26666668057441711, 0.26666668057441711), -(0.27310925722122192, 0.27058824896812439, 0.27058824896812439), -(0.27731093764305115, 0.27450981736183167, 0.27450981736183167), -(0.28151261806488037, 0.27843138575553894, 0.27843138575553894), -(0.28571429848670959, 0.28627452254295349, 0.28627452254295349), -(0.28991597890853882, 0.29019609093666077, 0.29019609093666077), -(0.29411765933036804, 0.29411765933036804, 0.29411765933036804), -(0.29831933975219727, 0.29803922772407532, 0.29803922772407532), -(0.30252102017402649, 0.30196079611778259, 0.30196079611778259), -(0.30672270059585571, 0.30588236451148987, 0.30588236451148987), -(0.31092438101768494, 0.30980393290519714, 0.30980393290519714), -(0.31512606143951416, 0.31372550129890442, 0.31372550129890442), -(0.31932774186134338, 0.31764706969261169, 0.31764706969261169), -(0.32352942228317261, 0.32156863808631897, 0.32156863808631897), -(0.32773110270500183, 0.32549020648002625, 0.32549020648002625), -(0.33193278312683105, 0.32941177487373352, 0.32941177487373352), -(0.33613446354866028, 0.3333333432674408, 0.3333333432674408), -(0.3403361439704895, 0.33725491166114807, 0.33725491166114807), -(0.34453782439231873, 0.34117648005485535, 0.34117648005485535), -(0.34873950481414795, 0.3490196168422699, 0.3490196168422699), -(0.35294118523597717, 0.35294118523597717, 0.35294118523597717), -(0.3571428656578064, 0.35686275362968445, 0.35686275362968445), -(0.36134454607963562, 0.36078432202339172, 0.36078432202339172), -(0.36554622650146484, 0.364705890417099, 0.364705890417099), -(0.36974790692329407, 0.36862745881080627, 0.36862745881080627), -(0.37394958734512329, 0.37254902720451355, 0.37254902720451355), -(0.37815126776695251, 0.37647059559822083, 0.37647059559822083), -(0.38235294818878174, 0.3803921639919281, 0.3803921639919281), -(0.38655462861061096, 0.38431373238563538, 0.38431373238563538), -(0.39075630903244019, 0.38823530077934265, 0.38823530077934265), -(0.39495798945426941, 0.39215686917304993, 0.39215686917304993), -(0.39915966987609863, 0.3960784375667572, 0.3960784375667572), -(0.40336135029792786, 0.40000000596046448, 0.40000000596046448), -(0.40756303071975708, 0.40392157435417175, 0.40392157435417175), -(0.4117647111415863, 0.4117647111415863, 0.4117647111415863), -(0.41596639156341553, 0.41568627953529358, 0.41568627953529358), -(0.42016807198524475, 0.41960784792900085, 0.41960784792900085), -(0.42436975240707397, 0.42352941632270813, 0.42352941632270813), -(0.4285714328289032, 0.42745098471641541, 0.42745098471641541), -(0.43277311325073242, 0.43137255311012268, 0.43137255311012268), -(0.43697479367256165, 0.43529412150382996, 0.43529412150382996), -(0.44117647409439087, 0.43921568989753723, 0.43921568989753723), -(0.44537815451622009, 0.44313725829124451, 0.44313725829124451), -(0.44957983493804932, 0.44705882668495178, 0.44705882668495178), -(0.45378151535987854, 0.45098039507865906, 0.45098039507865906), -(0.45798319578170776, 0.45490196347236633, 0.45490196347236633), -(0.46218487620353699, 0.45882353186607361, 0.45882353186607361), -(0.46638655662536621, 0.46274510025978088, 0.46274510025978088), -(0.47058823704719543, 0.46666666865348816, 0.46666666865348816), -(0.47478991746902466, 0.47450980544090271, 0.47450980544090271), -(0.47899159789085388, 0.47843137383460999, 0.47843137383460999), -(0.48319327831268311, 0.48235294222831726, 0.48235294222831726), -(0.48739495873451233, 0.48627451062202454, 0.48627451062202454), -(0.49159663915634155, 0.49019607901573181, 0.49019607901573181), -(0.49579831957817078, 0.49411764740943909, 0.49411764740943909), (0.5, -0.49803921580314636, 0.49803921580314636), (0.50420171022415161, -0.50196081399917603, 0.50196081399917603), (0.50840336084365845, -0.5058823823928833, 0.5058823823928833), (0.51260507106781006, -0.50980395078659058, 0.50980395078659058), (0.51680672168731689, -0.51372551918029785, 0.51372551918029785), (0.52100843191146851, -0.51764708757400513, 0.51764708757400513), (0.52521008253097534, -0.5215686559677124, 0.5215686559677124), (0.52941179275512695, -0.52549022436141968, 0.52549022436141968), (0.53361344337463379, -0.52941179275512695, 0.52941179275512695), (0.5378151535987854, -0.5372549295425415, 0.5372549295425415), (0.54201680421829224, -0.54117649793624878, 0.54117649793624878), (0.54621851444244385, -0.54509806632995605, 0.54509806632995605), (0.55042016506195068, -0.54901963472366333, 0.54901963472366333), (0.55462187528610229, -0.55294120311737061, 0.55294120311737061), (0.55882352590560913, -0.55686277151107788, 0.55686277151107788), (0.56302523612976074, -0.56078433990478516, 0.56078433990478516), (0.56722688674926758, -0.56470590829849243, 0.56470590829849243), (0.57142859697341919, -0.56862747669219971, 0.56862747669219971), (0.57563024759292603, -0.57254904508590698, 0.57254904508590698), (0.57983195781707764, -0.57647061347961426, 0.57647061347961426), (0.58403360843658447, -0.58039218187332153, 0.58039218187332153), (0.58823531866073608, -0.58431375026702881, 0.58431375026702881), (0.59243696928024292, -0.58823531866073608, 0.58823531866073608), (0.59663867950439453, -0.59215688705444336, 0.59215688705444336), (0.60084033012390137, -0.60000002384185791, 0.60000002384185791), (0.60504204034805298, -0.60392159223556519, 0.60392159223556519), (0.60924369096755981, -0.60784316062927246, 0.60784316062927246), (0.61344540119171143, -0.61176472902297974, 0.61176472902297974), (0.61764705181121826, -0.61568629741668701, 0.61568629741668701), (0.62184876203536987, -0.61960786581039429, 0.61960786581039429), (0.62605041265487671, -0.62352943420410156, 0.62352943420410156), (0.63025212287902832, -0.62745100259780884, 0.62745100259780884), (0.63445377349853516, -0.63137257099151611, 0.63137257099151611), (0.63865548372268677, -0.63529413938522339, 0.63529413938522339), (0.6428571343421936, -0.63921570777893066, 0.63921570777893066), (0.64705884456634521, -0.64313727617263794, 0.64313727617263794), (0.65126049518585205, -0.64705884456634521, 0.64705884456634521), (0.65546220541000366, -0.65098041296005249, 0.65098041296005249), (0.6596638560295105, -0.65490198135375977, 0.65490198135375977), (0.66386556625366211, -0.66274511814117432, 0.66274511814117432), (0.66806721687316895, -0.66666668653488159, 0.66666668653488159), (0.67226892709732056, -0.67058825492858887, 0.67058825492858887), (0.67647057771682739, -0.67450982332229614, 0.67450982332229614), (0.680672287940979, -0.67843139171600342, 0.67843139171600342), (0.68487393856048584, -0.68235296010971069, 0.68235296010971069), (0.68907564878463745, -0.68627452850341797, 0.68627452850341797), (0.69327729940414429, -0.69019609689712524, 0.69019609689712524), (0.6974790096282959, -0.69411766529083252, 0.69411766529083252), (0.70168066024780273, -0.69803923368453979, 0.69803923368453979), (0.70588237047195435, -0.70196080207824707, 0.70196080207824707), (0.71008402109146118, -0.70588237047195435, 0.70588237047195435), (0.71428573131561279, -0.70980393886566162, 0.70980393886566162), (0.71848738193511963, -0.7137255072593689, 0.7137255072593689), (0.72268909215927124, -0.71764707565307617, 0.71764707565307617), (0.72689074277877808, -0.72549021244049072, 0.72549021244049072), (0.73109245300292969, -0.729411780834198, 0.729411780834198), (0.73529410362243652, -0.73333334922790527, 0.73333334922790527), (0.73949581384658813, -0.73725491762161255, 0.73725491762161255), (0.74369746446609497, -0.74117648601531982, 0.74117648601531982), (0.74789917469024658, -0.7450980544090271, 0.7450980544090271), (0.75210082530975342, -0.74901962280273438, 0.74901962280273438), (0.75630253553390503, -0.75294119119644165, 0.75294119119644165), (0.76050418615341187, -0.75686275959014893, 0.75686275959014893), (0.76470589637756348, -0.7607843279838562, 0.7607843279838562), (0.76890754699707031, -0.76470589637756348, 0.76470589637756348), (0.77310925722122192, -0.76862746477127075, 0.76862746477127075), (0.77731090784072876, -0.77254903316497803, 0.77254903316497803), (0.78151261806488037, -0.7764706015586853, 0.7764706015586853), (0.78571426868438721, -0.78039216995239258, 0.78039216995239258), (0.78991597890853882, -0.78823530673980713, 0.78823530673980713), (0.79411762952804565, -0.7921568751335144, 0.7921568751335144), (0.79831933975219727, -0.79607844352722168, 0.79607844352722168), (0.8025209903717041, -0.80000001192092896, 0.80000001192092896), (0.80672270059585571, -0.80392158031463623, 0.80392158031463623), (0.81092435121536255, -0.80784314870834351, 0.80784314870834351), (0.81512606143951416, -0.81176471710205078, 0.81176471710205078), (0.819327712059021, -0.81568628549575806, 0.81568628549575806), (0.82352942228317261, -0.81960785388946533, 0.81960785388946533), (0.82773107290267944, -0.82352942228317261, 0.82352942228317261), (0.83193278312683105, -0.82745099067687988, 0.82745099067687988), (0.83613443374633789, -0.83137255907058716, 0.83137255907058716), (0.8403361439704895, -0.83529412746429443, 0.83529412746429443), (0.84453779458999634, -0.83921569585800171, 0.83921569585800171), (0.84873950481414795, -0.84313726425170898, 0.84313726425170898), (0.85294115543365479, -0.85098040103912354, 0.85098040103912354), (0.8571428656578064, -0.85490196943283081, 0.85490196943283081), (0.86134451627731323, -0.85882353782653809, 0.85882353782653809), (0.86554622650146484, -0.86274510622024536, 0.86274510622024536), (0.86974787712097168, -0.86666667461395264, 0.86666667461395264), (0.87394958734512329, -0.87058824300765991, 0.87058824300765991), (0.87815123796463013, -0.87450981140136719, 0.87450981140136719), (0.88235294818878174, -0.87843137979507446, 0.87843137979507446), (0.88655459880828857, -0.88235294818878174, 0.88235294818878174), (0.89075630903244019, -0.88627451658248901, 0.88627451658248901), (0.89495795965194702, -0.89019608497619629, 0.89019608497619629), (0.89915966987609863, -0.89411765336990356, 0.89411765336990356), (0.90336132049560547, -0.89803922176361084, 0.89803922176361084), (0.90756303071975708, -0.90196079015731812, 0.90196079015731812), (0.91176468133926392, -0.90588235855102539, 0.90588235855102539), (0.91596639156341553, -0.91372549533843994, 0.91372549533843994), (0.92016804218292236, -0.91764706373214722, 0.91764706373214722), (0.92436975240707397, -0.92156863212585449, 0.92156863212585449), (0.92857140302658081, -0.92549020051956177, 0.92549020051956177), (0.93277311325073242, -0.92941176891326904, 0.92941176891326904), (0.93697476387023926, -0.93333333730697632, 0.93333333730697632), (0.94117647409439087, -0.93725490570068359, 0.93725490570068359), (0.94537812471389771, -0.94117647409439087, 0.94117647409439087), (0.94957983493804932, -0.94509804248809814, 0.94509804248809814), (0.95378148555755615, -0.94901961088180542, 0.94901961088180542), (0.95798319578170776, -0.9529411792755127, 0.9529411792755127), (0.9621848464012146, -0.95686274766921997, 0.95686274766921997), (0.96638655662536621, -0.96078431606292725, 0.96078431606292725), (0.97058820724487305, -0.96470588445663452, 0.96470588445663452), (0.97478991746902466, -0.9686274528503418, 0.9686274528503418), (0.97899156808853149, -0.97647058963775635, 0.97647058963775635), (0.98319327831268311, -0.98039215803146362, 0.98039215803146362), (0.98739492893218994, -0.9843137264251709, 0.9843137264251709), (0.99159663915634155, -0.98823529481887817, 0.98823529481887817), (0.99579828977584839, -0.99215686321258545, 0.99215686321258545), (1.0, 0.99607843160629272, -0.99607843160629272)]} -_gist_heat_data = {'blue': [(0.0, 0.0, 0.0), -(0.0042016808874905109, 0.0, 0.0), (0.0084033617749810219, 0.0, 0.0), -(0.012605042196810246, 0.0, 0.0), (0.016806723549962044, 0.0, 0.0), -(0.021008403971791267, 0.0, 0.0), (0.025210084393620491, 0.0, 0.0), -(0.029411764815449715, 0.0, 0.0), (0.033613447099924088, 0.0, 0.0), -(0.037815127521753311, 0.0, 0.0), (0.042016807943582535, 0.0, 0.0), -(0.046218488365411758, 0.0, 0.0), (0.050420168787240982, 0.0, 0.0), -(0.054621849209070206, 0.0, 0.0), (0.058823529630899429, 0.0, 0.0), -(0.063025213778018951, 0.0, 0.0), (0.067226894199848175, 0.0, 0.0), -(0.071428574621677399, 0.0, 0.0), (0.075630255043506622, 0.0, 0.0), -(0.079831935465335846, 0.0, 0.0), (0.08403361588716507, 0.0, 0.0), -(0.088235296308994293, 0.0, 0.0), (0.092436976730823517, 0.0, 0.0), -(0.09663865715265274, 0.0, 0.0), (0.10084033757448196, 0.0, 0.0), -(0.10504201799631119, 0.0, 0.0), (0.10924369841814041, 0.0, 0.0), -(0.11344537883996964, 0.0, 0.0), (0.11764705926179886, 0.0, 0.0), -(0.12184873968362808, 0.0, 0.0), (0.1260504275560379, 0.0, 0.0), -(0.13025210797786713, 0.0, 0.0), (0.13445378839969635, 0.0, 0.0), -(0.13865546882152557, 0.0, 0.0), (0.1428571492433548, 0.0, 0.0), -(0.14705882966518402, 0.0, 0.0), (0.15126051008701324, 0.0, 0.0), -(0.15546219050884247, 0.0, 0.0), (0.15966387093067169, 0.0, 0.0), -(0.16386555135250092, 0.0, 0.0), (0.16806723177433014, 0.0, 0.0), -(0.17226891219615936, 0.0, 0.0), (0.17647059261798859, 0.0, 0.0), -(0.18067227303981781, 0.0, 0.0), (0.18487395346164703, 0.0, 0.0), -(0.18907563388347626, 0.0, 0.0), (0.19327731430530548, 0.0, 0.0), -(0.1974789947271347, 0.0, 0.0), (0.20168067514896393, 0.0, 0.0), -(0.20588235557079315, 0.0, 0.0), (0.21008403599262238, 0.0, 0.0), -(0.2142857164144516, 0.0, 0.0), (0.21848739683628082, 0.0, 0.0), -(0.22268907725811005, 0.0, 0.0), (0.22689075767993927, 0.0, 0.0), -(0.23109243810176849, 0.0, 0.0), (0.23529411852359772, 0.0, 0.0), -(0.23949579894542694, 0.0, 0.0), (0.24369747936725616, 0.0, 0.0), -(0.24789915978908539, 0.0, 0.0), (0.25210085511207581, 0.0, 0.0), -(0.25630253553390503, 0.0, 0.0), (0.26050421595573425, 0.0, 0.0), -(0.26470589637756348, 0.0, 0.0), (0.2689075767993927, 0.0, 0.0), -(0.27310925722122192, 0.0, 0.0), (0.27731093764305115, 0.0, 0.0), -(0.28151261806488037, 0.0, 0.0), (0.28571429848670959, 0.0, 0.0), -(0.28991597890853882, 0.0, 0.0), (0.29411765933036804, 0.0, 0.0), -(0.29831933975219727, 0.0, 0.0), (0.30252102017402649, 0.0, 0.0), -(0.30672270059585571, 0.0, 0.0), (0.31092438101768494, 0.0, 0.0), -(0.31512606143951416, 0.0, 0.0), (0.31932774186134338, 0.0, 0.0), -(0.32352942228317261, 0.0, 0.0), (0.32773110270500183, 0.0, 0.0), -(0.33193278312683105, 0.0, 0.0), (0.33613446354866028, 0.0, 0.0), -(0.3403361439704895, 0.0, 0.0), (0.34453782439231873, 0.0, 0.0), -(0.34873950481414795, 0.0, 0.0), (0.35294118523597717, 0.0, 0.0), -(0.3571428656578064, 0.0, 0.0), (0.36134454607963562, 0.0, 0.0), -(0.36554622650146484, 0.0, 0.0), (0.36974790692329407, 0.0, 0.0), -(0.37394958734512329, 0.0, 0.0), (0.37815126776695251, 0.0, 0.0), -(0.38235294818878174, 0.0, 0.0), (0.38655462861061096, 0.0, 0.0), -(0.39075630903244019, 0.0, 0.0), (0.39495798945426941, 0.0, 0.0), -(0.39915966987609863, 0.0, 0.0), (0.40336135029792786, 0.0, 0.0), -(0.40756303071975708, 0.0, 0.0), (0.4117647111415863, 0.0, 0.0), -(0.41596639156341553, 0.0, 0.0), (0.42016807198524475, 0.0, 0.0), -(0.42436975240707397, 0.0, 0.0), (0.4285714328289032, 0.0, 0.0), -(0.43277311325073242, 0.0, 0.0), (0.43697479367256165, 0.0, 0.0), -(0.44117647409439087, 0.0, 0.0), (0.44537815451622009, 0.0, 0.0), -(0.44957983493804932, 0.0, 0.0), (0.45378151535987854, 0.0, 0.0), -(0.45798319578170776, 0.0, 0.0), (0.46218487620353699, 0.0, 0.0), -(0.46638655662536621, 0.0, 0.0), (0.47058823704719543, 0.0, 0.0), -(0.47478991746902466, 0.0, 0.0), (0.47899159789085388, 0.0, 0.0), -(0.48319327831268311, 0.0, 0.0), (0.48739495873451233, 0.0, 0.0), -(0.49159663915634155, 0.0, 0.0), (0.49579831957817078, 0.0, 0.0), (0.5, -0.0, 0.0), (0.50420171022415161, 0.0, 0.0), (0.50840336084365845, 0.0, -0.0), (0.51260507106781006, 0.0, 0.0), (0.51680672168731689, 0.0, 0.0), -(0.52100843191146851, 0.0, 0.0), (0.52521008253097534, 0.0, 0.0), -(0.52941179275512695, 0.0, 0.0), (0.53361344337463379, 0.0, 0.0), -(0.5378151535987854, 0.0, 0.0), (0.54201680421829224, 0.0, 0.0), -(0.54621851444244385, 0.0, 0.0), (0.55042016506195068, 0.0, 0.0), -(0.55462187528610229, 0.0, 0.0), (0.55882352590560913, 0.0, 0.0), -(0.56302523612976074, 0.0, 0.0), (0.56722688674926758, 0.0, 0.0), -(0.57142859697341919, 0.0, 0.0), (0.57563024759292603, 0.0, 0.0), -(0.57983195781707764, 0.0, 0.0), (0.58403360843658447, 0.0, 0.0), -(0.58823531866073608, 0.0, 0.0), (0.59243696928024292, 0.0, 0.0), -(0.59663867950439453, 0.0, 0.0), (0.60084033012390137, 0.0, 0.0), -(0.60504204034805298, 0.0, 0.0), (0.60924369096755981, 0.0, 0.0), -(0.61344540119171143, 0.0, 0.0), (0.61764705181121826, 0.0, 0.0), -(0.62184876203536987, 0.0, 0.0), (0.62605041265487671, 0.0, 0.0), -(0.63025212287902832, 0.0, 0.0), (0.63445377349853516, 0.0, 0.0), -(0.63865548372268677, 0.0, 0.0), (0.6428571343421936, 0.0, 0.0), -(0.64705884456634521, 0.0, 0.0), (0.65126049518585205, 0.0, 0.0), -(0.65546220541000366, 0.0, 0.0), (0.6596638560295105, 0.0, 0.0), -(0.66386556625366211, 0.0, 0.0), (0.66806721687316895, 0.0, 0.0), -(0.67226892709732056, 0.0, 0.0), (0.67647057771682739, 0.0, 0.0), -(0.680672287940979, 0.0, 0.0), (0.68487393856048584, 0.0, 0.0), -(0.68907564878463745, 0.0, 0.0), (0.69327729940414429, 0.0, 0.0), -(0.6974790096282959, 0.0, 0.0), (0.70168066024780273, 0.0, 0.0), -(0.70588237047195435, 0.0, 0.0), (0.71008402109146118, 0.0, 0.0), -(0.71428573131561279, 0.0, 0.0), (0.71848738193511963, 0.0, 0.0), -(0.72268909215927124, 0.0, 0.0), (0.72689074277877808, 0.0, 0.0), -(0.73109245300292969, 0.0, 0.0), (0.73529410362243652, 0.0, 0.0), -(0.73949581384658813, 0.0, 0.0), (0.74369746446609497, 0.0, 0.0), -(0.74789917469024658, 0.0, 0.0), (0.75210082530975342, 0.0, 0.0), -(0.75630253553390503, 0.027450980618596077, 0.027450980618596077), -(0.76050418615341187, 0.043137256056070328, 0.043137256056070328), -(0.76470589637756348, 0.058823529630899429, 0.058823529630899429), -(0.76890754699707031, 0.074509806931018829, 0.074509806931018829), -(0.77310925722122192, 0.090196080505847931, 0.090196080505847931), -(0.77731090784072876, 0.10588235408067703, 0.10588235408067703), -(0.78151261806488037, 0.12156862765550613, 0.12156862765550613), -(0.78571426868438721, 0.13725490868091583, 0.13725490868091583), -(0.78991597890853882, 0.15294118225574493, 0.15294118225574493), -(0.79411762952804565, 0.16862745583057404, 0.16862745583057404), -(0.79831933975219727, 0.20000000298023224, 0.20000000298023224), -(0.8025209903717041, 0.21176470816135406, 0.21176470816135406), -(0.80672270059585571, 0.22745098173618317, 0.22745098173618317), -(0.81092435121536255, 0.24313725531101227, 0.24313725531101227), -(0.81512606143951416, 0.25882354378700256, 0.25882354378700256), -(0.819327712059021, 0.27450981736183167, 0.27450981736183167), -(0.82352942228317261, 0.29019609093666077, 0.29019609093666077), -(0.82773107290267944, 0.30588236451148987, 0.30588236451148987), -(0.83193278312683105, 0.32156863808631897, 0.32156863808631897), -(0.83613443374633789, 0.33725491166114807, 0.33725491166114807), -(0.8403361439704895, 0.35294118523597717, 0.35294118523597717), -(0.84453779458999634, 0.36862745881080627, 0.36862745881080627), -(0.84873950481414795, 0.38431373238563538, 0.38431373238563538), -(0.85294115543365479, 0.40000000596046448, 0.40000000596046448), -(0.8571428656578064, 0.4117647111415863, 0.4117647111415863), -(0.86134451627731323, 0.42745098471641541, 0.42745098471641541), -(0.86554622650146484, 0.44313725829124451, 0.44313725829124451), -(0.86974787712097168, 0.45882353186607361, 0.45882353186607361), -(0.87394958734512329, 0.47450980544090271, 0.47450980544090271), -(0.87815123796463013, 0.49019607901573181, 0.49019607901573181), -(0.88235294818878174, 0.5215686559677124, 0.5215686559677124), -(0.88655459880828857, 0.5372549295425415, 0.5372549295425415), -(0.89075630903244019, 0.55294120311737061, 0.55294120311737061), -(0.89495795965194702, 0.56862747669219971, 0.56862747669219971), -(0.89915966987609863, 0.58431375026702881, 0.58431375026702881), -(0.90336132049560547, 0.60000002384185791, 0.60000002384185791), -(0.90756303071975708, 0.61176472902297974, 0.61176472902297974), -(0.91176468133926392, 0.62745100259780884, 0.62745100259780884), -(0.91596639156341553, 0.64313727617263794, 0.64313727617263794), -(0.92016804218292236, 0.65882354974746704, 0.65882354974746704), -(0.92436975240707397, 0.67450982332229614, 0.67450982332229614), -(0.92857140302658081, 0.69019609689712524, 0.69019609689712524), -(0.93277311325073242, 0.70588237047195435, 0.70588237047195435), -(0.93697476387023926, 0.72156864404678345, 0.72156864404678345), -(0.94117647409439087, 0.73725491762161255, 0.73725491762161255), -(0.94537812471389771, 0.75294119119644165, 0.75294119119644165), -(0.94957983493804932, 0.76862746477127075, 0.76862746477127075), -(0.95378148555755615, 0.78431373834609985, 0.78431373834609985), -(0.95798319578170776, 0.80000001192092896, 0.80000001192092896), -(0.9621848464012146, 0.81176471710205078, 0.81176471710205078), -(0.96638655662536621, 0.84313726425170898, 0.84313726425170898), -(0.97058820724487305, 0.85882353782653809, 0.85882353782653809), -(0.97478991746902466, 0.87450981140136719, 0.87450981140136719), -(0.97899156808853149, 0.89019608497619629, 0.89019608497619629), -(0.98319327831268311, 0.90588235855102539, 0.90588235855102539), -(0.98739492893218994, 0.92156863212585449, 0.92156863212585449), -(0.99159663915634155, 0.93725490570068359, 0.93725490570068359), -(0.99579828977584839, 0.9529411792755127, 0.9529411792755127), (1.0, -0.9686274528503418, 0.9686274528503418)], 'green': [(0.0, 0.0, 0.0), -(0.0042016808874905109, 0.0, 0.0), (0.0084033617749810219, 0.0, 0.0), -(0.012605042196810246, 0.0, 0.0), (0.016806723549962044, 0.0, 0.0), -(0.021008403971791267, 0.0, 0.0), (0.025210084393620491, 0.0, 0.0), -(0.029411764815449715, 0.0, 0.0), (0.033613447099924088, 0.0, 0.0), -(0.037815127521753311, 0.0, 0.0), (0.042016807943582535, 0.0, 0.0), -(0.046218488365411758, 0.0, 0.0), (0.050420168787240982, 0.0, 0.0), -(0.054621849209070206, 0.0, 0.0), (0.058823529630899429, 0.0, 0.0), -(0.063025213778018951, 0.0, 0.0), (0.067226894199848175, 0.0, 0.0), -(0.071428574621677399, 0.0, 0.0), (0.075630255043506622, 0.0, 0.0), -(0.079831935465335846, 0.0, 0.0), (0.08403361588716507, 0.0, 0.0), -(0.088235296308994293, 0.0, 0.0), (0.092436976730823517, 0.0, 0.0), -(0.09663865715265274, 0.0, 0.0), (0.10084033757448196, 0.0, 0.0), -(0.10504201799631119, 0.0, 0.0), (0.10924369841814041, 0.0, 0.0), -(0.11344537883996964, 0.0, 0.0), (0.11764705926179886, 0.0, 0.0), -(0.12184873968362808, 0.0, 0.0), (0.1260504275560379, 0.0, 0.0), -(0.13025210797786713, 0.0, 0.0), (0.13445378839969635, 0.0, 0.0), -(0.13865546882152557, 0.0, 0.0), (0.1428571492433548, 0.0, 0.0), -(0.14705882966518402, 0.0, 0.0), (0.15126051008701324, 0.0, 0.0), -(0.15546219050884247, 0.0, 0.0), (0.15966387093067169, 0.0, 0.0), -(0.16386555135250092, 0.0, 0.0), (0.16806723177433014, 0.0, 0.0), -(0.17226891219615936, 0.0, 0.0), (0.17647059261798859, 0.0, 0.0), -(0.18067227303981781, 0.0, 0.0), (0.18487395346164703, 0.0, 0.0), -(0.18907563388347626, 0.0, 0.0), (0.19327731430530548, 0.0, 0.0), -(0.1974789947271347, 0.0, 0.0), (0.20168067514896393, 0.0, 0.0), -(0.20588235557079315, 0.0, 0.0), (0.21008403599262238, 0.0, 0.0), -(0.2142857164144516, 0.0, 0.0), (0.21848739683628082, 0.0, 0.0), -(0.22268907725811005, 0.0, 0.0), (0.22689075767993927, 0.0, 0.0), -(0.23109243810176849, 0.0, 0.0), (0.23529411852359772, 0.0, 0.0), -(0.23949579894542694, 0.0, 0.0), (0.24369747936725616, 0.0, 0.0), -(0.24789915978908539, 0.0, 0.0), (0.25210085511207581, 0.0, 0.0), -(0.25630253553390503, 0.0, 0.0), (0.26050421595573425, 0.0, 0.0), -(0.26470589637756348, 0.0, 0.0), (0.2689075767993927, 0.0, 0.0), -(0.27310925722122192, 0.0, 0.0), (0.27731093764305115, 0.0, 0.0), -(0.28151261806488037, 0.0, 0.0), (0.28571429848670959, 0.0, 0.0), -(0.28991597890853882, 0.0, 0.0), (0.29411765933036804, 0.0, 0.0), -(0.29831933975219727, 0.0, 0.0), (0.30252102017402649, 0.0, 0.0), -(0.30672270059585571, 0.0, 0.0), (0.31092438101768494, 0.0, 0.0), -(0.31512606143951416, 0.0, 0.0), (0.31932774186134338, 0.0, 0.0), -(0.32352942228317261, 0.0, 0.0), (0.32773110270500183, 0.0, 0.0), -(0.33193278312683105, 0.0, 0.0), (0.33613446354866028, 0.0, 0.0), -(0.3403361439704895, 0.0, 0.0), (0.34453782439231873, 0.0, 0.0), -(0.34873950481414795, 0.0, 0.0), (0.35294118523597717, 0.0, 0.0), -(0.3571428656578064, 0.0, 0.0), (0.36134454607963562, 0.0, 0.0), -(0.36554622650146484, 0.0, 0.0), (0.36974790692329407, 0.0, 0.0), -(0.37394958734512329, 0.0, 0.0), (0.37815126776695251, 0.0, 0.0), -(0.38235294818878174, 0.0, 0.0), (0.38655462861061096, 0.0, 0.0), -(0.39075630903244019, 0.0, 0.0), (0.39495798945426941, 0.0, 0.0), -(0.39915966987609863, 0.0, 0.0), (0.40336135029792786, 0.0, 0.0), -(0.40756303071975708, 0.0, 0.0), (0.4117647111415863, 0.0, 0.0), -(0.41596639156341553, 0.0, 0.0), (0.42016807198524475, 0.0, 0.0), -(0.42436975240707397, 0.0, 0.0), (0.4285714328289032, 0.0, 0.0), -(0.43277311325073242, 0.0, 0.0), (0.43697479367256165, 0.0, 0.0), -(0.44117647409439087, 0.0, 0.0), (0.44537815451622009, 0.0, 0.0), -(0.44957983493804932, 0.0, 0.0), (0.45378151535987854, 0.0, 0.0), -(0.45798319578170776, 0.0, 0.0), (0.46218487620353699, 0.0, 0.0), -(0.46638655662536621, 0.0, 0.0), (0.47058823704719543, 0.0, 0.0), -(0.47478991746902466, 0.0, 0.0), (0.47899159789085388, -0.0039215688593685627, 0.0039215688593685627), (0.48319327831268311, -0.011764706112444401, 0.011764706112444401), (0.48739495873451233, -0.019607843831181526, 0.019607843831181526), (0.49159663915634155, -0.027450980618596077, 0.027450980618596077), (0.49579831957817078, -0.035294119268655777, 0.035294119268655777), (0.5, 0.043137256056070328, -0.043137256056070328), (0.50420171022415161, 0.058823529630899429, -0.058823529630899429), (0.50840336084365845, 0.066666670143604279, -0.066666670143604279), (0.51260507106781006, 0.070588238537311554, -0.070588238537311554), (0.51680672168731689, 0.078431375324726105, -0.078431375324726105), (0.52100843191146851, 0.086274512112140656, -0.086274512112140656), (0.52521008253097534, 0.094117648899555206, -0.094117648899555206), (0.52941179275512695, 0.10196078568696976, -0.10196078568696976), (0.53361344337463379, 0.10980392247438431, -0.10980392247438431), (0.5378151535987854, 0.11764705926179886, -0.11764705926179886), (0.54201680421829224, 0.12549020349979401, -0.12549020349979401), (0.54621851444244385, 0.13725490868091583, -0.13725490868091583), (0.55042016506195068, 0.14509804546833038, -0.14509804546833038), (0.55462187528610229, 0.15294118225574493, -0.15294118225574493), (0.55882352590560913, 0.16078431904315948, -0.16078431904315948), (0.56302523612976074, 0.16862745583057404, -0.16862745583057404), (0.56722688674926758, 0.17647059261798859, -0.17647059261798859), (0.57142859697341919, 0.18431372940540314, -0.18431372940540314), (0.57563024759292603, 0.19215686619281769, -0.19215686619281769), (0.57983195781707764, 0.20000000298023224, -0.20000000298023224), (0.58403360843658447, 0.20392157137393951, -0.20392157137393951), (0.58823531866073608, 0.21176470816135406, -0.21176470816135406), (0.59243696928024292, 0.21960784494876862, -0.21960784494876862), (0.59663867950439453, 0.22745098173618317, -0.22745098173618317), (0.60084033012390137, 0.23529411852359772, -0.23529411852359772), (0.60504204034805298, 0.24313725531101227, -0.24313725531101227), (0.60924369096755981, 0.25098040699958801, -0.25098040699958801), (0.61344540119171143, 0.25882354378700256, -0.25882354378700256), (0.61764705181121826, 0.26666668057441711, -0.26666668057441711), (0.62184876203536987, 0.27058824896812439, -0.27058824896812439), (0.62605041265487671, 0.27843138575553894, -0.27843138575553894), (0.63025212287902832, 0.29411765933036804, -0.29411765933036804), (0.63445377349853516, 0.30196079611778259, -0.30196079611778259), (0.63865548372268677, 0.30980393290519714, -0.30980393290519714), (0.6428571343421936, 0.31764706969261169, -0.31764706969261169), (0.64705884456634521, 0.32549020648002625, -0.32549020648002625), (0.65126049518585205, 0.3333333432674408, -0.3333333432674408), (0.65546220541000366, 0.33725491166114807, -0.33725491166114807), (0.6596638560295105, 0.34509804844856262, -0.34509804844856262), (0.66386556625366211, 0.35294118523597717, -0.35294118523597717), (0.66806721687316895, 0.36078432202339172, -0.36078432202339172), (0.67226892709732056, 0.36862745881080627, -0.36862745881080627), (0.67647057771682739, 0.37647059559822083, -0.37647059559822083), (0.680672287940979, 0.38431373238563538, -0.38431373238563538), (0.68487393856048584, 0.39215686917304993, -0.39215686917304993), (0.68907564878463745, 0.40000000596046448, -0.40000000596046448), (0.69327729940414429, 0.40392157435417175, -0.40392157435417175), (0.6974790096282959, 0.4117647111415863, -0.4117647111415863), (0.70168066024780273, 0.41960784792900085, -0.41960784792900085), (0.70588237047195435, 0.42745098471641541, -0.42745098471641541), (0.71008402109146118, 0.43529412150382996, -0.43529412150382996), (0.71428573131561279, 0.45098039507865906, -0.45098039507865906), (0.71848738193511963, 0.45882353186607361, -0.45882353186607361), (0.72268909215927124, 0.46666666865348816, -0.46666666865348816), (0.72689074277877808, 0.47058823704719543, -0.47058823704719543), (0.73109245300292969, 0.47843137383460999, -0.47843137383460999), (0.73529410362243652, 0.48627451062202454, -0.48627451062202454), (0.73949581384658813, 0.49411764740943909, -0.49411764740943909), (0.74369746446609497, 0.50196081399917603, -0.50196081399917603), (0.74789917469024658, 0.50980395078659058, -0.50980395078659058), (0.75210082530975342, 0.51764708757400513, -0.51764708757400513), (0.75630253553390503, 0.53333336114883423, -0.53333336114883423), (0.76050418615341187, 0.5372549295425415, -0.5372549295425415), (0.76470589637756348, 0.54509806632995605, -0.54509806632995605), (0.76890754699707031, 0.55294120311737061, -0.55294120311737061), (0.77310925722122192, 0.56078433990478516, -0.56078433990478516), (0.77731090784072876, 0.56862747669219971, -0.56862747669219971), (0.78151261806488037, 0.57647061347961426, -0.57647061347961426), (0.78571426868438721, 0.58431375026702881, -0.58431375026702881), (0.78991597890853882, 0.59215688705444336, -0.59215688705444336), (0.79411762952804565, 0.60000002384185791, -0.60000002384185791), (0.79831933975219727, 0.61176472902297974, -0.61176472902297974), (0.8025209903717041, 0.61960786581039429, -0.61960786581039429), (0.80672270059585571, 0.62745100259780884, -0.62745100259780884), (0.81092435121536255, 0.63529413938522339, -0.63529413938522339), (0.81512606143951416, 0.64313727617263794, -0.64313727617263794), (0.819327712059021, 0.65098041296005249, -0.65098041296005249), (0.82352942228317261, 0.65882354974746704, -0.65882354974746704), (0.82773107290267944, 0.66666668653488159, -0.66666668653488159), (0.83193278312683105, 0.67058825492858887, -0.67058825492858887), (0.83613443374633789, 0.67843139171600342, -0.67843139171600342), (0.8403361439704895, 0.68627452850341797, -0.68627452850341797), (0.84453779458999634, 0.69411766529083252, -0.69411766529083252), (0.84873950481414795, 0.70196080207824707, -0.70196080207824707), (0.85294115543365479, 0.70980393886566162, -0.70980393886566162), (0.8571428656578064, 0.71764707565307617, -0.71764707565307617), (0.86134451627731323, 0.72549021244049072, -0.72549021244049072), (0.86554622650146484, 0.73333334922790527, -0.73333334922790527), (0.86974787712097168, 0.73725491762161255, -0.73725491762161255), (0.87394958734512329, 0.7450980544090271, -0.7450980544090271), (0.87815123796463013, 0.75294119119644165, -0.75294119119644165), (0.88235294818878174, 0.76862746477127075, -0.76862746477127075), (0.88655459880828857, 0.7764706015586853, -0.7764706015586853), (0.89075630903244019, 0.78431373834609985, -0.78431373834609985), (0.89495795965194702, 0.7921568751335144, -0.7921568751335144), (0.89915966987609863, 0.80000001192092896, -0.80000001192092896), (0.90336132049560547, 0.80392158031463623, -0.80392158031463623), (0.90756303071975708, 0.81176471710205078, -0.81176471710205078), (0.91176468133926392, 0.81960785388946533, -0.81960785388946533), (0.91596639156341553, 0.82745099067687988, -0.82745099067687988), (0.92016804218292236, 0.83529412746429443, -0.83529412746429443), (0.92436975240707397, 0.84313726425170898, -0.84313726425170898), (0.92857140302658081, 0.85098040103912354, -0.85098040103912354), (0.93277311325073242, 0.85882353782653809, -0.85882353782653809), (0.93697476387023926, 0.86666667461395264, -0.86666667461395264), (0.94117647409439087, 0.87058824300765991, -0.87058824300765991), (0.94537812471389771, 0.87843137979507446, -0.87843137979507446), (0.94957983493804932, 0.88627451658248901, -0.88627451658248901), (0.95378148555755615, 0.89411765336990356, -0.89411765336990356), (0.95798319578170776, 0.90196079015731812, -0.90196079015731812), (0.9621848464012146, 0.90980392694473267, -0.90980392694473267), (0.96638655662536621, 0.92549020051956177, -0.92549020051956177), (0.97058820724487305, 0.93333333730697632, -0.93333333730697632), (0.97478991746902466, 0.93725490570068359, -0.93725490570068359), (0.97899156808853149, 0.94509804248809814, -0.94509804248809814), (0.98319327831268311, 0.9529411792755127, -0.9529411792755127), (0.98739492893218994, 0.96078431606292725, -0.96078431606292725), (0.99159663915634155, 0.9686274528503418, -0.9686274528503418), (0.99579828977584839, 0.97647058963775635, -0.97647058963775635), (1.0, 0.9843137264251709, 0.9843137264251709)], -'red': [(0.0, 0.0, 0.0), (0.0042016808874905109, 0.0039215688593685627, -0.0039215688593685627), (0.0084033617749810219, 0.0078431377187371254, -0.0078431377187371254), (0.012605042196810246, 0.015686275437474251, -0.015686275437474251), (0.016806723549962044, 0.019607843831181526, -0.019607843831181526), (0.021008403971791267, 0.027450980618596077, -0.027450980618596077), (0.025210084393620491, 0.031372550874948502, -0.031372550874948502), (0.029411764815449715, 0.039215687662363052, -0.039215687662363052), (0.033613447099924088, 0.043137256056070328, -0.043137256056070328), (0.037815127521753311, 0.050980392843484879, -0.050980392843484879), (0.042016807943582535, 0.058823529630899429, -0.058823529630899429), (0.046218488365411758, 0.066666670143604279, -0.066666670143604279), (0.050420168787240982, 0.070588238537311554, -0.070588238537311554), (0.054621849209070206, 0.078431375324726105, -0.078431375324726105), (0.058823529630899429, 0.08235294371843338, -0.08235294371843338), (0.063025213778018951, 0.090196080505847931, -0.090196080505847931), (0.067226894199848175, 0.094117648899555206, -0.094117648899555206), (0.071428574621677399, 0.10196078568696976, -0.10196078568696976), (0.075630255043506622, 0.10588235408067703, -0.10588235408067703), (0.079831935465335846, 0.10980392247438431, -0.10980392247438431), (0.08403361588716507, 0.11764705926179886, -0.11764705926179886), (0.088235296308994293, 0.12156862765550613, -0.12156862765550613), (0.092436976730823517, 0.12941177189350128, -0.12941177189350128), (0.09663865715265274, 0.13333334028720856, -0.13333334028720856), (0.10084033757448196, 0.14117647707462311, -0.14117647707462311), (0.10504201799631119, 0.14509804546833038, -0.14509804546833038), (0.10924369841814041, 0.15294118225574493, -0.15294118225574493), (0.11344537883996964, 0.15686275064945221, -0.15686275064945221), (0.11764705926179886, 0.16470588743686676, -0.16470588743686676), (0.12184873968362808, 0.16862745583057404, -0.16862745583057404), (0.1260504275560379, 0.18039216101169586, -0.18039216101169586), (0.13025210797786713, 0.18431372940540314, -0.18431372940540314), (0.13445378839969635, 0.19215686619281769, -0.19215686619281769), (0.13865546882152557, 0.19607843458652496, -0.19607843458652496), (0.1428571492433548, 0.20392157137393951, -0.20392157137393951), (0.14705882966518402, 0.20784313976764679, -0.20784313976764679), (0.15126051008701324, 0.21568627655506134, -0.21568627655506134), (0.15546219050884247, 0.21960784494876862, -0.21960784494876862), (0.15966387093067169, 0.22352941334247589, -0.22352941334247589), (0.16386555135250092, 0.23137255012989044, -0.23137255012989044), (0.16806723177433014, 0.23529411852359772, -0.23529411852359772), (0.17226891219615936, 0.24313725531101227, -0.24313725531101227), (0.17647059261798859, 0.24705882370471954, -0.24705882370471954), (0.18067227303981781, 0.25490197539329529, -0.25490197539329529), (0.18487395346164703, 0.25882354378700256, -0.25882354378700256), (0.18907563388347626, 0.26666668057441711, -0.26666668057441711), (0.19327731430530548, 0.27058824896812439, -0.27058824896812439), (0.1974789947271347, 0.27450981736183167, -0.27450981736183167), (0.20168067514896393, 0.28235295414924622, -0.28235295414924622), (0.20588235557079315, 0.28627452254295349, -0.28627452254295349), (0.21008403599262238, 0.29803922772407532, -0.29803922772407532), (0.2142857164144516, 0.30588236451148987, -0.30588236451148987), (0.21848739683628082, 0.30980393290519714, -0.30980393290519714), (0.22268907725811005, 0.31764706969261169, -0.31764706969261169), (0.22689075767993927, 0.32156863808631897, -0.32156863808631897), (0.23109243810176849, 0.32941177487373352, -0.32941177487373352), (0.23529411852359772, 0.3333333432674408, -0.3333333432674408), (0.23949579894542694, 0.33725491166114807, -0.33725491166114807), (0.24369747936725616, 0.34509804844856262, -0.34509804844856262), (0.24789915978908539, 0.3490196168422699, -0.3490196168422699), (0.25210085511207581, 0.36078432202339172, -0.36078432202339172), (0.25630253553390503, 0.36862745881080627, -0.36862745881080627), (0.26050421595573425, 0.37254902720451355, -0.37254902720451355), (0.26470589637756348, 0.3803921639919281, -0.3803921639919281), (0.2689075767993927, 0.38431373238563538, -0.38431373238563538), (0.27310925722122192, 0.38823530077934265, -0.38823530077934265), (0.27731093764305115, 0.3960784375667572, -0.3960784375667572), (0.28151261806488037, 0.40000000596046448, -0.40000000596046448), (0.28571429848670959, 0.40784314274787903, -0.40784314274787903), (0.28991597890853882, 0.4117647111415863, -0.4117647111415863), (0.29411765933036804, 0.42352941632270813, -0.42352941632270813), (0.29831933975219727, 0.43137255311012268, -0.43137255311012268), (0.30252102017402649, 0.43529412150382996, -0.43529412150382996), (0.30672270059585571, 0.44313725829124451, -0.44313725829124451), (0.31092438101768494, 0.44705882668495178, -0.44705882668495178), (0.31512606143951416, 0.45098039507865906, -0.45098039507865906), (0.31932774186134338, 0.45882353186607361, -0.45882353186607361), (0.32352942228317261, 0.46274510025978088, -0.46274510025978088), (0.32773110270500183, 0.47058823704719543, -0.47058823704719543), (0.33193278312683105, 0.47450980544090271, -0.47450980544090271), (0.33613446354866028, 0.48235294222831726, -0.48235294222831726), (0.3403361439704895, 0.48627451062202454, -0.48627451062202454), (0.34453782439231873, 0.49411764740943909, -0.49411764740943909), (0.34873950481414795, 0.49803921580314636, -0.49803921580314636), (0.35294118523597717, 0.50196081399917603, -0.50196081399917603), (0.3571428656578064, 0.50980395078659058, -0.50980395078659058), (0.36134454607963562, 0.51372551918029785, -0.51372551918029785), (0.36554622650146484, 0.5215686559677124, -0.5215686559677124), (0.36974790692329407, 0.52549022436141968, -0.52549022436141968), (0.37394958734512329, 0.53333336114883423, -0.53333336114883423), (0.37815126776695251, 0.54509806632995605, -0.54509806632995605), (0.38235294818878174, 0.54901963472366333, -0.54901963472366333), (0.38655462861061096, 0.55294120311737061, -0.55294120311737061), (0.39075630903244019, 0.56078433990478516, -0.56078433990478516), (0.39495798945426941, 0.56470590829849243, -0.56470590829849243), (0.39915966987609863, 0.57254904508590698, -0.57254904508590698), (0.40336135029792786, 0.57647061347961426, -0.57647061347961426), (0.40756303071975708, 0.58431375026702881, -0.58431375026702881), (0.4117647111415863, 0.58823531866073608, -0.58823531866073608), (0.41596639156341553, 0.59607845544815063, -0.59607845544815063), (0.42016807198524475, 0.60000002384185791, -0.60000002384185791), (0.42436975240707397, 0.60784316062927246, -0.60784316062927246), (0.4285714328289032, 0.61176472902297974, -0.61176472902297974), (0.43277311325073242, 0.61568629741668701, -0.61568629741668701), (0.43697479367256165, 0.62352943420410156, -0.62352943420410156), (0.44117647409439087, 0.62745100259780884, -0.62745100259780884), (0.44537815451622009, 0.63529413938522339, -0.63529413938522339), (0.44957983493804932, 0.63921570777893066, -0.63921570777893066), (0.45378151535987854, 0.64705884456634521, -0.64705884456634521), (0.45798319578170776, 0.65098041296005249, -0.65098041296005249), (0.46218487620353699, 0.66274511814117432, -0.66274511814117432), (0.46638655662536621, 0.66666668653488159, -0.66666668653488159), (0.47058823704719543, 0.67450982332229614, -0.67450982332229614), (0.47478991746902466, 0.67843139171600342, -0.67843139171600342), (0.47899159789085388, 0.68627452850341797, -0.68627452850341797), (0.48319327831268311, 0.69019609689712524, -0.69019609689712524), (0.48739495873451233, 0.69803923368453979, -0.69803923368453979), (0.49159663915634155, 0.70196080207824707, -0.70196080207824707), (0.49579831957817078, 0.70980393886566162, -0.70980393886566162), (0.5, 0.7137255072593689, 0.7137255072593689), -(0.50420171022415161, 0.72549021244049072, 0.72549021244049072), -(0.50840336084365845, 0.729411780834198, 0.729411780834198), -(0.51260507106781006, 0.73725491762161255, 0.73725491762161255), -(0.51680672168731689, 0.74117648601531982, 0.74117648601531982), -(0.52100843191146851, 0.74901962280273438, 0.74901962280273438), -(0.52521008253097534, 0.75294119119644165, 0.75294119119644165), -(0.52941179275512695, 0.7607843279838562, 0.7607843279838562), -(0.53361344337463379, 0.76470589637756348, 0.76470589637756348), -(0.5378151535987854, 0.77254903316497803, 0.77254903316497803), -(0.54201680421829224, 0.7764706015586853, 0.7764706015586853), -(0.54621851444244385, 0.78823530673980713, 0.78823530673980713), -(0.55042016506195068, 0.7921568751335144, 0.7921568751335144), -(0.55462187528610229, 0.80000001192092896, 0.80000001192092896), -(0.55882352590560913, 0.80392158031463623, 0.80392158031463623), -(0.56302523612976074, 0.81176471710205078, 0.81176471710205078), -(0.56722688674926758, 0.81568628549575806, 0.81568628549575806), -(0.57142859697341919, 0.82352942228317261, 0.82352942228317261), -(0.57563024759292603, 0.82745099067687988, 0.82745099067687988), -(0.57983195781707764, 0.83137255907058716, 0.83137255907058716), -(0.58403360843658447, 0.83921569585800171, 0.83921569585800171), -(0.58823531866073608, 0.84313726425170898, 0.84313726425170898), -(0.59243696928024292, 0.85098040103912354, 0.85098040103912354), -(0.59663867950439453, 0.85490196943283081, 0.85490196943283081), -(0.60084033012390137, 0.86274510622024536, 0.86274510622024536), -(0.60504204034805298, 0.86666667461395264, 0.86666667461395264), -(0.60924369096755981, 0.87450981140136719, 0.87450981140136719), -(0.61344540119171143, 0.87843137979507446, 0.87843137979507446), -(0.61764705181121826, 0.88627451658248901, 0.88627451658248901), -(0.62184876203536987, 0.89019608497619629, 0.89019608497619629), -(0.62605041265487671, 0.89411765336990356, 0.89411765336990356), -(0.63025212287902832, 0.90588235855102539, 0.90588235855102539), -(0.63445377349853516, 0.91372549533843994, 0.91372549533843994), -(0.63865548372268677, 0.91764706373214722, 0.91764706373214722), -(0.6428571343421936, 0.92549020051956177, 0.92549020051956177), -(0.64705884456634521, 0.92941176891326904, 0.92941176891326904), -(0.65126049518585205, 0.93725490570068359, 0.93725490570068359), -(0.65546220541000366, 0.94117647409439087, 0.94117647409439087), -(0.6596638560295105, 0.94509804248809814, 0.94509804248809814), -(0.66386556625366211, 0.9529411792755127, 0.9529411792755127), -(0.66806721687316895, 0.95686274766921997, 0.95686274766921997), -(0.67226892709732056, 0.96470588445663452, 0.96470588445663452), -(0.67647057771682739, 0.9686274528503418, 0.9686274528503418), -(0.680672287940979, 0.97647058963775635, 0.97647058963775635), -(0.68487393856048584, 0.98039215803146362, 0.98039215803146362), -(0.68907564878463745, 0.98823529481887817, 0.98823529481887817), -(0.69327729940414429, 0.99215686321258545, 0.99215686321258545), -(0.6974790096282959, 1.0, 1.0), (0.70168066024780273, 1.0, 1.0), -(0.70588237047195435, 1.0, 1.0), (0.71008402109146118, 1.0, 1.0), -(0.71428573131561279, 1.0, 1.0), (0.71848738193511963, 1.0, 1.0), -(0.72268909215927124, 1.0, 1.0), (0.72689074277877808, 1.0, 1.0), -(0.73109245300292969, 1.0, 1.0), (0.73529410362243652, 1.0, 1.0), -(0.73949581384658813, 1.0, 1.0), (0.74369746446609497, 1.0, 1.0), -(0.74789917469024658, 1.0, 1.0), (0.75210082530975342, 1.0, 1.0), -(0.75630253553390503, 1.0, 1.0), (0.76050418615341187, 1.0, 1.0), -(0.76470589637756348, 1.0, 1.0), (0.76890754699707031, 1.0, 1.0), -(0.77310925722122192, 1.0, 1.0), (0.77731090784072876, 1.0, 1.0), -(0.78151261806488037, 1.0, 1.0), (0.78571426868438721, 1.0, 1.0), -(0.78991597890853882, 1.0, 1.0), (0.79411762952804565, 1.0, 1.0), -(0.79831933975219727, 1.0, 1.0), (0.8025209903717041, 1.0, 1.0), -(0.80672270059585571, 1.0, 1.0), (0.81092435121536255, 1.0, 1.0), -(0.81512606143951416, 1.0, 1.0), (0.819327712059021, 1.0, 1.0), -(0.82352942228317261, 1.0, 1.0), (0.82773107290267944, 1.0, 1.0), -(0.83193278312683105, 1.0, 1.0), (0.83613443374633789, 1.0, 1.0), -(0.8403361439704895, 1.0, 1.0), (0.84453779458999634, 1.0, 1.0), -(0.84873950481414795, 1.0, 1.0), (0.85294115543365479, 1.0, 1.0), -(0.8571428656578064, 1.0, 1.0), (0.86134451627731323, 1.0, 1.0), -(0.86554622650146484, 1.0, 1.0), (0.86974787712097168, 1.0, 1.0), -(0.87394958734512329, 1.0, 1.0), (0.87815123796463013, 1.0, 1.0), -(0.88235294818878174, 1.0, 1.0), (0.88655459880828857, 1.0, 1.0), -(0.89075630903244019, 1.0, 1.0), (0.89495795965194702, 1.0, 1.0), -(0.89915966987609863, 1.0, 1.0), (0.90336132049560547, 1.0, 1.0), -(0.90756303071975708, 1.0, 1.0), (0.91176468133926392, 1.0, 1.0), -(0.91596639156341553, 1.0, 1.0), (0.92016804218292236, 1.0, 1.0), -(0.92436975240707397, 1.0, 1.0), (0.92857140302658081, 1.0, 1.0), -(0.93277311325073242, 1.0, 1.0), (0.93697476387023926, 1.0, 1.0), -(0.94117647409439087, 1.0, 1.0), (0.94537812471389771, 1.0, 1.0), -(0.94957983493804932, 1.0, 1.0), (0.95378148555755615, 1.0, 1.0), -(0.95798319578170776, 1.0, 1.0), (0.9621848464012146, 1.0, 1.0), -(0.96638655662536621, 1.0, 1.0), (0.97058820724487305, 1.0, 1.0), -(0.97478991746902466, 1.0, 1.0), (0.97899156808853149, 1.0, 1.0), -(0.98319327831268311, 1.0, 1.0), (0.98739492893218994, 1.0, 1.0), -(0.99159663915634155, 1.0, 1.0), (0.99579828977584839, 1.0, 1.0), (1.0, -1.0, 1.0)]} -_gist_ncar_data = {'blue': [(0.0, 0.50196081399917603, -0.50196081399917603), (0.0050505050458014011, 0.45098039507865906, -0.45098039507865906), (0.010101010091602802, 0.40392157435417175, -0.40392157435417175), (0.015151515603065491, 0.35686275362968445, -0.35686275362968445), (0.020202020183205605, 0.30980393290519714, -0.30980393290519714), (0.025252524763345718, 0.25882354378700256, -0.25882354378700256), (0.030303031206130981, 0.21176470816135406, -0.21176470816135406), (0.035353533923625946, 0.16470588743686676, -0.16470588743686676), (0.040404040366411209, 0.11764705926179886, -0.11764705926179886), (0.045454546809196472, 0.070588238537311554, -0.070588238537311554), (0.050505049526691437, 0.019607843831181526, -0.019607843831181526), (0.0555555559694767, 0.047058824449777603, -0.047058824449777603), (0.060606062412261963, 0.14509804546833038, -0.14509804546833038), (0.065656565129756927, 0.23921568691730499, -0.23921568691730499), (0.070707067847251892, 0.3333333432674408, -0.3333333432674408), (0.075757578015327454, 0.43137255311012268, -0.43137255311012268), (0.080808080732822418, 0.52549022436141968, -0.52549022436141968), (0.085858583450317383, 0.61960786581039429, -0.61960786581039429), (0.090909093618392944, 0.71764707565307617, -0.71764707565307617), (0.095959596335887909, 0.81176471710205078, -0.81176471710205078), (0.10101009905338287, 0.90588235855102539, -0.90588235855102539), (0.10606060922145844, 1.0, 1.0), -(0.1111111119389534, 1.0, 1.0), (0.11616161465644836, 1.0, 1.0), -(0.12121212482452393, 1.0, 1.0), (0.12626262009143829, 1.0, 1.0), -(0.13131313025951385, 1.0, 1.0), (0.13636364042758942, 1.0, 1.0), -(0.14141413569450378, 1.0, 1.0), (0.14646464586257935, 1.0, 1.0), -(0.15151515603065491, 1.0, 1.0), (0.15656565129756927, 1.0, 1.0), -(0.16161616146564484, 1.0, 1.0), (0.1666666716337204, 1.0, 1.0), -(0.17171716690063477, 1.0, 1.0), (0.17676767706871033, 1.0, 1.0), -(0.18181818723678589, 1.0, 1.0), (0.18686868250370026, 1.0, 1.0), -(0.19191919267177582, 1.0, 1.0), (0.19696970283985138, 1.0, 1.0), -(0.20202019810676575, 1.0, 1.0), (0.20707070827484131, 1.0, 1.0), -(0.21212121844291687, 0.99215686321258545, 0.99215686321258545), -(0.21717171370983124, 0.95686274766921997, 0.95686274766921997), -(0.2222222238779068, 0.91764706373214722, 0.91764706373214722), -(0.22727273404598236, 0.88235294818878174, 0.88235294818878174), -(0.23232322931289673, 0.84313726425170898, 0.84313726425170898), -(0.23737373948097229, 0.80392158031463623, 0.80392158031463623), -(0.24242424964904785, 0.76862746477127075, 0.76862746477127075), -(0.24747474491596222, 0.729411780834198, 0.729411780834198), -(0.25252524018287659, 0.69019609689712524, 0.69019609689712524), -(0.25757575035095215, 0.65490198135375977, 0.65490198135375977), -(0.26262626051902771, 0.61568629741668701, 0.61568629741668701), -(0.26767677068710327, 0.56470590829849243, 0.56470590829849243), -(0.27272728085517883, 0.50980395078659058, 0.50980395078659058), -(0.27777779102325439, 0.45098039507865906, 0.45098039507865906), -(0.28282827138900757, 0.39215686917304993, 0.39215686917304993), -(0.28787878155708313, 0.3333333432674408, 0.3333333432674408), -(0.29292929172515869, 0.27843138575553894, 0.27843138575553894), -(0.29797980189323425, 0.21960784494876862, 0.21960784494876862), -(0.30303031206130981, 0.16078431904315948, 0.16078431904315948), -(0.30808082222938538, 0.10588235408067703, 0.10588235408067703), -(0.31313130259513855, 0.047058824449777603, 0.047058824449777603), -(0.31818181276321411, 0.0, 0.0), (0.32323232293128967, 0.0, 0.0), -(0.32828283309936523, 0.0, 0.0), (0.3333333432674408, 0.0, 0.0), -(0.33838382363319397, 0.0, 0.0), (0.34343433380126953, 0.0, 0.0), -(0.34848484396934509, 0.0, 0.0), (0.35353535413742065, 0.0, 0.0), -(0.35858586430549622, 0.0, 0.0), (0.36363637447357178, 0.0, 0.0), -(0.36868685483932495, 0.0, 0.0), (0.37373736500740051, 0.0, 0.0), -(0.37878787517547607, 0.0, 0.0), (0.38383838534355164, 0.0, 0.0), -(0.3888888955116272, 0.0, 0.0), (0.39393940567970276, 0.0, 0.0), -(0.39898988604545593, 0.0, 0.0), (0.40404039621353149, 0.0, 0.0), -(0.40909090638160706, 0.0, 0.0), (0.41414141654968262, 0.0, 0.0), -(0.41919192671775818, 0.0, 0.0), (0.42424243688583374, -0.0039215688593685627, 0.0039215688593685627), (0.42929291725158691, -0.027450980618596077, 0.027450980618596077), (0.43434342741966248, -0.050980392843484879, 0.050980392843484879), (0.43939393758773804, -0.074509806931018829, 0.074509806931018829), (0.4444444477558136, -0.094117648899555206, 0.094117648899555206), (0.44949495792388916, -0.11764705926179886, 0.11764705926179886), (0.45454546809196472, -0.14117647707462311, 0.14117647707462311), (0.4595959484577179, -0.16470588743686676, 0.16470588743686676), (0.46464645862579346, -0.18823529779911041, 0.18823529779911041), (0.46969696879386902, -0.21176470816135406, 0.21176470816135406), (0.47474747896194458, -0.23529411852359772, 0.23529411852359772), (0.47979798913002014, -0.22352941334247589, 0.22352941334247589), (0.4848484992980957, -0.20000000298023224, 0.20000000298023224), (0.48989897966384888, -0.17647059261798859, 0.17647059261798859), (0.49494948983192444, -0.15294118225574493, 0.15294118225574493), (0.5, 0.12941177189350128, -0.12941177189350128), (0.50505048036575317, 0.10980392247438431, -0.10980392247438431), (0.51010102033615112, 0.086274512112140656, -0.086274512112140656), (0.5151515007019043, 0.062745101749897003, -0.062745101749897003), (0.52020204067230225, 0.039215687662363052, -0.039215687662363052), (0.52525252103805542, 0.015686275437474251, -0.015686275437474251), (0.53030300140380859, 0.0, 0.0), -(0.53535354137420654, 0.0, 0.0), (0.54040402173995972, 0.0, 0.0), -(0.54545456171035767, 0.0, 0.0), (0.55050504207611084, 0.0, 0.0), -(0.55555558204650879, 0.0, 0.0), (0.56060606241226196, 0.0, 0.0), -(0.56565654277801514, 0.0, 0.0), (0.57070708274841309, 0.0, 0.0), -(0.57575756311416626, 0.0, 0.0), (0.58080810308456421, 0.0, 0.0), -(0.58585858345031738, 0.0039215688593685627, 0.0039215688593685627), -(0.59090906381607056, 0.0078431377187371254, 0.0078431377187371254), -(0.59595960378646851, 0.011764706112444401, 0.011764706112444401), -(0.60101008415222168, 0.019607843831181526, 0.019607843831181526), -(0.60606062412261963, 0.023529412224888802, 0.023529412224888802), -(0.6111111044883728, 0.031372550874948502, 0.031372550874948502), -(0.61616164445877075, 0.035294119268655777, 0.035294119268655777), -(0.62121212482452393, 0.043137256056070328, 0.043137256056070328), -(0.6262626051902771, 0.047058824449777603, 0.047058824449777603), -(0.63131314516067505, 0.054901961237192154, 0.054901961237192154), -(0.63636362552642822, 0.054901961237192154, 0.054901961237192154), -(0.64141416549682617, 0.050980392843484879, 0.050980392843484879), -(0.64646464586257935, 0.043137256056070328, 0.043137256056070328), -(0.65151512622833252, 0.039215687662363052, 0.039215687662363052), -(0.65656566619873047, 0.031372550874948502, 0.031372550874948502), -(0.66161614656448364, 0.027450980618596077, 0.027450980618596077), -(0.66666668653488159, 0.019607843831181526, 0.019607843831181526), -(0.67171716690063477, 0.015686275437474251, 0.015686275437474251), -(0.67676764726638794, 0.011764706112444401, 0.011764706112444401), -(0.68181818723678589, 0.0039215688593685627, 0.0039215688593685627), -(0.68686866760253906, 0.0, 0.0), (0.69191920757293701, 0.0, 0.0), -(0.69696968793869019, 0.0, 0.0), (0.70202022790908813, 0.0, 0.0), -(0.70707070827484131, 0.0, 0.0), (0.71212118864059448, 0.0, 0.0), -(0.71717172861099243, 0.0, 0.0), (0.72222220897674561, 0.0, 0.0), -(0.72727274894714355, 0.0, 0.0), (0.73232322931289673, 0.0, 0.0), -(0.7373737096786499, 0.0, 0.0), (0.74242424964904785, -0.031372550874948502, 0.031372550874948502), (0.74747473001480103, -0.12941177189350128, 0.12941177189350128), (0.75252526998519897, -0.22352941334247589, 0.22352941334247589), (0.75757575035095215, -0.32156863808631897, 0.32156863808631897), (0.7626262903213501, -0.41568627953529358, 0.41568627953529358), (0.76767677068710327, -0.50980395078659058, 0.50980395078659058), (0.77272725105285645, -0.60784316062927246, 0.60784316062927246), (0.77777779102325439, -0.70196080207824707, 0.70196080207824707), (0.78282827138900757, -0.79607844352722168, 0.79607844352722168), (0.78787881135940552, -0.89411765336990356, 0.89411765336990356), (0.79292929172515869, -0.98823529481887817, 0.98823529481887817), (0.79797977209091187, 1.0, -1.0), (0.80303031206130981, 1.0, 1.0), (0.80808079242706299, 1.0, 1.0), -(0.81313133239746094, 1.0, 1.0), (0.81818181276321411, 1.0, 1.0), -(0.82323235273361206, 1.0, 1.0), (0.82828283309936523, 1.0, 1.0), -(0.83333331346511841, 1.0, 1.0), (0.83838385343551636, 1.0, 1.0), -(0.84343433380126953, 1.0, 1.0), (0.84848487377166748, -0.99607843160629272, 0.99607843160629272), (0.85353535413742065, -0.98823529481887817, 0.98823529481887817), (0.85858583450317383, -0.9843137264251709, 0.9843137264251709), (0.86363637447357178, -0.97647058963775635, 0.97647058963775635), (0.86868685483932495, -0.9686274528503418, 0.9686274528503418), (0.8737373948097229, -0.96470588445663452, 0.96470588445663452), (0.87878787517547607, -0.95686274766921997, 0.95686274766921997), (0.88383835554122925, -0.94901961088180542, 0.94901961088180542), (0.8888888955116272, -0.94509804248809814, 0.94509804248809814), (0.89393937587738037, -0.93725490570068359, 0.93725490570068359), (0.89898991584777832, -0.93333333730697632, 0.93333333730697632), (0.90404039621353149, -0.93333333730697632, 0.93333333730697632), (0.90909093618392944, -0.93725490570068359, 0.93725490570068359), (0.91414141654968262, -0.93725490570068359, 0.93725490570068359), (0.91919189691543579, -0.94117647409439087, 0.94117647409439087), (0.92424243688583374, -0.94509804248809814, 0.94509804248809814), (0.92929291725158691, -0.94509804248809814, 0.94509804248809814), (0.93434345722198486, -0.94901961088180542, 0.94901961088180542), (0.93939393758773804, -0.9529411792755127, 0.9529411792755127), (0.94444441795349121, -0.9529411792755127, 0.9529411792755127), (0.94949495792388916, -0.95686274766921997, 0.95686274766921997), (0.95454543828964233, -0.96078431606292725, 0.96078431606292725), (0.95959597826004028, -0.96470588445663452, 0.96470588445663452), (0.96464645862579346, -0.9686274528503418, 0.9686274528503418), (0.96969699859619141, -0.97254902124404907, 0.97254902124404907), (0.97474747896194458, -0.97647058963775635, 0.97647058963775635), (0.97979795932769775, -0.98039215803146362, 0.98039215803146362), (0.9848484992980957, -0.9843137264251709, 0.9843137264251709), (0.98989897966384888, -0.98823529481887817, 0.98823529481887817), (0.99494951963424683, -0.99215686321258545, 0.99215686321258545), (1.0, 0.99607843160629272, -0.99607843160629272)], 'green': [(0.0, 0.0, 0.0), (0.0050505050458014011, -0.035294119268655777, 0.035294119268655777), (0.010101010091602802, -0.074509806931018829, 0.074509806931018829), (0.015151515603065491, -0.10980392247438431, 0.10980392247438431), (0.020202020183205605, -0.14901961386203766, 0.14901961386203766), (0.025252524763345718, -0.18431372940540314, 0.18431372940540314), (0.030303031206130981, -0.22352941334247589, 0.22352941334247589), (0.035353533923625946, -0.25882354378700256, 0.25882354378700256), (0.040404040366411209, -0.29803922772407532, 0.29803922772407532), (0.045454546809196472, -0.3333333432674408, 0.3333333432674408), (0.050505049526691437, -0.37254902720451355, 0.37254902720451355), (0.0555555559694767, -0.36862745881080627, 0.36862745881080627), (0.060606062412261963, -0.3333333432674408, 0.3333333432674408), (0.065656565129756927, -0.29411765933036804, 0.29411765933036804), (0.070707067847251892, -0.25882354378700256, 0.25882354378700256), (0.075757578015327454, -0.21960784494876862, 0.21960784494876862), (0.080808080732822418, -0.18431372940540314, 0.18431372940540314), (0.085858583450317383, -0.14509804546833038, 0.14509804546833038), (0.090909093618392944, -0.10980392247438431, 0.10980392247438431), (0.095959596335887909, -0.070588238537311554, 0.070588238537311554), (0.10101009905338287, -0.035294119268655777, 0.035294119268655777), (0.10606060922145844, 0.0, -0.0), (0.1111111119389534, 0.074509806931018829, 0.074509806931018829), -(0.11616161465644836, 0.14509804546833038, 0.14509804546833038), -(0.12121212482452393, 0.21568627655506134, 0.21568627655506134), -(0.12626262009143829, 0.28627452254295349, 0.28627452254295349), -(0.13131313025951385, 0.36078432202339172, 0.36078432202339172), -(0.13636364042758942, 0.43137255311012268, 0.43137255311012268), -(0.14141413569450378, 0.50196081399917603, 0.50196081399917603), -(0.14646464586257935, 0.57254904508590698, 0.57254904508590698), -(0.15151515603065491, 0.64705884456634521, 0.64705884456634521), -(0.15656565129756927, 0.71764707565307617, 0.71764707565307617), -(0.16161616146564484, 0.7607843279838562, 0.7607843279838562), -(0.1666666716337204, 0.78431373834609985, 0.78431373834609985), -(0.17171716690063477, 0.80784314870834351, 0.80784314870834351), -(0.17676767706871033, 0.83137255907058716, 0.83137255907058716), -(0.18181818723678589, 0.85490196943283081, 0.85490196943283081), -(0.18686868250370026, 0.88235294818878174, 0.88235294818878174), -(0.19191919267177582, 0.90588235855102539, 0.90588235855102539), -(0.19696970283985138, 0.92941176891326904, 0.92941176891326904), -(0.20202019810676575, 0.9529411792755127, 0.9529411792755127), -(0.20707070827484131, 0.97647058963775635, 0.97647058963775635), -(0.21212121844291687, 0.99607843160629272, 0.99607843160629272), -(0.21717171370983124, 0.99607843160629272, 0.99607843160629272), -(0.2222222238779068, 0.99215686321258545, 0.99215686321258545), -(0.22727273404598236, 0.99215686321258545, 0.99215686321258545), -(0.23232322931289673, 0.99215686321258545, 0.99215686321258545), -(0.23737373948097229, 0.98823529481887817, 0.98823529481887817), -(0.24242424964904785, 0.98823529481887817, 0.98823529481887817), -(0.24747474491596222, 0.9843137264251709, 0.9843137264251709), -(0.25252524018287659, 0.9843137264251709, 0.9843137264251709), -(0.25757575035095215, 0.98039215803146362, 0.98039215803146362), -(0.26262626051902771, 0.98039215803146362, 0.98039215803146362), -(0.26767677068710327, 0.98039215803146362, 0.98039215803146362), -(0.27272728085517883, 0.98039215803146362, 0.98039215803146362), -(0.27777779102325439, 0.9843137264251709, 0.9843137264251709), -(0.28282827138900757, 0.9843137264251709, 0.9843137264251709), -(0.28787878155708313, 0.98823529481887817, 0.98823529481887817), -(0.29292929172515869, 0.98823529481887817, 0.98823529481887817), -(0.29797980189323425, 0.99215686321258545, 0.99215686321258545), -(0.30303031206130981, 0.99215686321258545, 0.99215686321258545), -(0.30808082222938538, 0.99607843160629272, 0.99607843160629272), -(0.31313130259513855, 0.99607843160629272, 0.99607843160629272), -(0.31818181276321411, 0.99607843160629272, 0.99607843160629272), -(0.32323232293128967, 0.97647058963775635, 0.97647058963775635), -(0.32828283309936523, 0.95686274766921997, 0.95686274766921997), -(0.3333333432674408, 0.93725490570068359, 0.93725490570068359), -(0.33838382363319397, 0.92156863212585449, 0.92156863212585449), -(0.34343433380126953, 0.90196079015731812, 0.90196079015731812), -(0.34848484396934509, 0.88235294818878174, 0.88235294818878174), -(0.35353535413742065, 0.86274510622024536, 0.86274510622024536), -(0.35858586430549622, 0.84705883264541626, 0.84705883264541626), -(0.36363637447357178, 0.82745099067687988, 0.82745099067687988), -(0.36868685483932495, 0.80784314870834351, 0.80784314870834351), -(0.37373736500740051, 0.81568628549575806, 0.81568628549575806), -(0.37878787517547607, 0.83529412746429443, 0.83529412746429443), -(0.38383838534355164, 0.85098040103912354, 0.85098040103912354), -(0.3888888955116272, 0.87058824300765991, 0.87058824300765991), -(0.39393940567970276, 0.89019608497619629, 0.89019608497619629), -(0.39898988604545593, 0.90980392694473267, 0.90980392694473267), -(0.40404039621353149, 0.92549020051956177, 0.92549020051956177), -(0.40909090638160706, 0.94509804248809814, 0.94509804248809814), -(0.41414141654968262, 0.96470588445663452, 0.96470588445663452), -(0.41919192671775818, 0.9843137264251709, 0.9843137264251709), -(0.42424243688583374, 1.0, 1.0), (0.42929291725158691, 1.0, 1.0), -(0.43434342741966248, 1.0, 1.0), (0.43939393758773804, 1.0, 1.0), -(0.4444444477558136, 1.0, 1.0), (0.44949495792388916, 1.0, 1.0), -(0.45454546809196472, 1.0, 1.0), (0.4595959484577179, 1.0, 1.0), -(0.46464645862579346, 1.0, 1.0), (0.46969696879386902, 1.0, 1.0), -(0.47474747896194458, 1.0, 1.0), (0.47979798913002014, 1.0, 1.0), -(0.4848484992980957, 1.0, 1.0), (0.48989897966384888, 1.0, 1.0), -(0.49494948983192444, 1.0, 1.0), (0.5, 1.0, 1.0), (0.50505048036575317, -1.0, 1.0), (0.51010102033615112, 1.0, 1.0), (0.5151515007019043, 1.0, -1.0), (0.52020204067230225, 1.0, 1.0), (0.52525252103805542, 1.0, 1.0), -(0.53030300140380859, 0.99215686321258545, 0.99215686321258545), -(0.53535354137420654, 0.98039215803146362, 0.98039215803146362), -(0.54040402173995972, 0.96470588445663452, 0.96470588445663452), -(0.54545456171035767, 0.94901961088180542, 0.94901961088180542), -(0.55050504207611084, 0.93333333730697632, 0.93333333730697632), -(0.55555558204650879, 0.91764706373214722, 0.91764706373214722), -(0.56060606241226196, 0.90588235855102539, 0.90588235855102539), -(0.56565654277801514, 0.89019608497619629, 0.89019608497619629), -(0.57070708274841309, 0.87450981140136719, 0.87450981140136719), -(0.57575756311416626, 0.85882353782653809, 0.85882353782653809), -(0.58080810308456421, 0.84313726425170898, 0.84313726425170898), -(0.58585858345031738, 0.83137255907058716, 0.83137255907058716), -(0.59090906381607056, 0.81960785388946533, 0.81960785388946533), -(0.59595960378646851, 0.81176471710205078, 0.81176471710205078), -(0.60101008415222168, 0.80000001192092896, 0.80000001192092896), -(0.60606062412261963, 0.78823530673980713, 0.78823530673980713), -(0.6111111044883728, 0.7764706015586853, 0.7764706015586853), -(0.61616164445877075, 0.76470589637756348, 0.76470589637756348), -(0.62121212482452393, 0.75294119119644165, 0.75294119119644165), -(0.6262626051902771, 0.74117648601531982, 0.74117648601531982), -(0.63131314516067505, 0.729411780834198, 0.729411780834198), -(0.63636362552642822, 0.70980393886566162, 0.70980393886566162), -(0.64141416549682617, 0.66666668653488159, 0.66666668653488159), -(0.64646464586257935, 0.62352943420410156, 0.62352943420410156), -(0.65151512622833252, 0.58039218187332153, 0.58039218187332153), -(0.65656566619873047, 0.5372549295425415, 0.5372549295425415), -(0.66161614656448364, 0.49411764740943909, 0.49411764740943909), -(0.66666668653488159, 0.45098039507865906, 0.45098039507865906), -(0.67171716690063477, 0.40392157435417175, 0.40392157435417175), -(0.67676764726638794, 0.36078432202339172, 0.36078432202339172), -(0.68181818723678589, 0.31764706969261169, 0.31764706969261169), -(0.68686866760253906, 0.27450981736183167, 0.27450981736183167), -(0.69191920757293701, 0.24705882370471954, 0.24705882370471954), -(0.69696968793869019, 0.21960784494876862, 0.21960784494876862), -(0.70202022790908813, 0.19607843458652496, 0.19607843458652496), -(0.70707070827484131, 0.16862745583057404, 0.16862745583057404), -(0.71212118864059448, 0.14509804546833038, 0.14509804546833038), -(0.71717172861099243, 0.11764705926179886, 0.11764705926179886), -(0.72222220897674561, 0.090196080505847931, 0.090196080505847931), -(0.72727274894714355, 0.066666670143604279, 0.066666670143604279), -(0.73232322931289673, 0.039215687662363052, 0.039215687662363052), -(0.7373737096786499, 0.015686275437474251, 0.015686275437474251), -(0.74242424964904785, 0.0, 0.0), (0.74747473001480103, 0.0, 0.0), -(0.75252526998519897, 0.0, 0.0), (0.75757575035095215, 0.0, 0.0), -(0.7626262903213501, 0.0, 0.0), (0.76767677068710327, 0.0, 0.0), -(0.77272725105285645, 0.0, 0.0), (0.77777779102325439, 0.0, 0.0), -(0.78282827138900757, 0.0, 0.0), (0.78787881135940552, 0.0, 0.0), -(0.79292929172515869, 0.0, 0.0), (0.79797977209091187, -0.015686275437474251, 0.015686275437474251), (0.80303031206130981, -0.031372550874948502, 0.031372550874948502), (0.80808079242706299, -0.050980392843484879, 0.050980392843484879), (0.81313133239746094, -0.066666670143604279, 0.066666670143604279), (0.81818181276321411, -0.086274512112140656, 0.086274512112140656), (0.82323235273361206, -0.10588235408067703, 0.10588235408067703), (0.82828283309936523, -0.12156862765550613, 0.12156862765550613), (0.83333331346511841, -0.14117647707462311, 0.14117647707462311), (0.83838385343551636, -0.15686275064945221, 0.15686275064945221), (0.84343433380126953, -0.17647059261798859, 0.17647059261798859), (0.84848487377166748, -0.20000000298023224, 0.20000000298023224), (0.85353535413742065, -0.23137255012989044, 0.23137255012989044), (0.85858583450317383, -0.25882354378700256, 0.25882354378700256), (0.86363637447357178, -0.29019609093666077, 0.29019609093666077), (0.86868685483932495, -0.32156863808631897, 0.32156863808631897), (0.8737373948097229, -0.35294118523597717, 0.35294118523597717), (0.87878787517547607, -0.38431373238563538, 0.38431373238563538), (0.88383835554122925, -0.41568627953529358, 0.41568627953529358), (0.8888888955116272, -0.44313725829124451, 0.44313725829124451), (0.89393937587738037, -0.47450980544090271, 0.47450980544090271), (0.89898991584777832, -0.5058823823928833, 0.5058823823928833), (0.90404039621353149, -0.52941179275512695, 0.52941179275512695), (0.90909093618392944, -0.55294120311737061, 0.55294120311737061), (0.91414141654968262, -0.57254904508590698, 0.57254904508590698), (0.91919189691543579, -0.59607845544815063, 0.59607845544815063), (0.92424243688583374, -0.61960786581039429, 0.61960786581039429), (0.92929291725158691, -0.64313727617263794, 0.64313727617263794), (0.93434345722198486, -0.66274511814117432, 0.66274511814117432), (0.93939393758773804, -0.68627452850341797, 0.68627452850341797), (0.94444441795349121, -0.70980393886566162, 0.70980393886566162), (0.94949495792388916, -0.729411780834198, 0.729411780834198), (0.95454543828964233, -0.75294119119644165, 0.75294119119644165), (0.95959597826004028, -0.78039216995239258, 0.78039216995239258), (0.96464645862579346, -0.80392158031463623, 0.80392158031463623), (0.96969699859619141, -0.82745099067687988, 0.82745099067687988), (0.97474747896194458, -0.85098040103912354, 0.85098040103912354), (0.97979795932769775, -0.87450981140136719, 0.87450981140136719), (0.9848484992980957, -0.90196079015731812, 0.90196079015731812), (0.98989897966384888, -0.92549020051956177, 0.92549020051956177), (0.99494951963424683, -0.94901961088180542, 0.94901961088180542), (1.0, 0.97254902124404907, -0.97254902124404907)], 'red': [(0.0, 0.0, 0.0), (0.0050505050458014011, -0.0, 0.0), (0.010101010091602802, 0.0, 0.0), (0.015151515603065491, 0.0, -0.0), (0.020202020183205605, 0.0, 0.0), (0.025252524763345718, 0.0, 0.0), -(0.030303031206130981, 0.0, 0.0), (0.035353533923625946, 0.0, 0.0), -(0.040404040366411209, 0.0, 0.0), (0.045454546809196472, 0.0, 0.0), -(0.050505049526691437, 0.0, 0.0), (0.0555555559694767, 0.0, 0.0), -(0.060606062412261963, 0.0, 0.0), (0.065656565129756927, 0.0, 0.0), -(0.070707067847251892, 0.0, 0.0), (0.075757578015327454, 0.0, 0.0), -(0.080808080732822418, 0.0, 0.0), (0.085858583450317383, 0.0, 0.0), -(0.090909093618392944, 0.0, 0.0), (0.095959596335887909, 0.0, 0.0), -(0.10101009905338287, 0.0, 0.0), (0.10606060922145844, 0.0, 0.0), -(0.1111111119389534, 0.0, 0.0), (0.11616161465644836, 0.0, 0.0), -(0.12121212482452393, 0.0, 0.0), (0.12626262009143829, 0.0, 0.0), -(0.13131313025951385, 0.0, 0.0), (0.13636364042758942, 0.0, 0.0), -(0.14141413569450378, 0.0, 0.0), (0.14646464586257935, 0.0, 0.0), -(0.15151515603065491, 0.0, 0.0), (0.15656565129756927, 0.0, 0.0), -(0.16161616146564484, 0.0, 0.0), (0.1666666716337204, 0.0, 0.0), -(0.17171716690063477, 0.0, 0.0), (0.17676767706871033, 0.0, 0.0), -(0.18181818723678589, 0.0, 0.0), (0.18686868250370026, 0.0, 0.0), -(0.19191919267177582, 0.0, 0.0), (0.19696970283985138, 0.0, 0.0), -(0.20202019810676575, 0.0, 0.0), (0.20707070827484131, 0.0, 0.0), -(0.21212121844291687, 0.0, 0.0), (0.21717171370983124, 0.0, 0.0), -(0.2222222238779068, 0.0, 0.0), (0.22727273404598236, 0.0, 0.0), -(0.23232322931289673, 0.0, 0.0), (0.23737373948097229, 0.0, 0.0), -(0.24242424964904785, 0.0, 0.0), (0.24747474491596222, 0.0, 0.0), -(0.25252524018287659, 0.0, 0.0), (0.25757575035095215, 0.0, 0.0), -(0.26262626051902771, 0.0, 0.0), (0.26767677068710327, 0.0, 0.0), -(0.27272728085517883, 0.0, 0.0), (0.27777779102325439, 0.0, 0.0), -(0.28282827138900757, 0.0, 0.0), (0.28787878155708313, 0.0, 0.0), -(0.29292929172515869, 0.0, 0.0), (0.29797980189323425, 0.0, 0.0), -(0.30303031206130981, 0.0, 0.0), (0.30808082222938538, 0.0, 0.0), -(0.31313130259513855, 0.0, 0.0), (0.31818181276321411, -0.0039215688593685627, 0.0039215688593685627), (0.32323232293128967, -0.043137256056070328, 0.043137256056070328), (0.32828283309936523, -0.08235294371843338, 0.08235294371843338), (0.3333333432674408, -0.11764705926179886, 0.11764705926179886), (0.33838382363319397, -0.15686275064945221, 0.15686275064945221), (0.34343433380126953, -0.19607843458652496, 0.19607843458652496), (0.34848484396934509, -0.23137255012989044, 0.23137255012989044), (0.35353535413742065, -0.27058824896812439, 0.27058824896812439), (0.35858586430549622, -0.30980393290519714, 0.30980393290519714), (0.36363637447357178, -0.3490196168422699, 0.3490196168422699), (0.36868685483932495, -0.38431373238563538, 0.38431373238563538), (0.37373736500740051, -0.40392157435417175, 0.40392157435417175), (0.37878787517547607, -0.41568627953529358, 0.41568627953529358), (0.38383838534355164, -0.42352941632270813, 0.42352941632270813), (0.3888888955116272, -0.43137255311012268, 0.43137255311012268), (0.39393940567970276, -0.44313725829124451, 0.44313725829124451), (0.39898988604545593, -0.45098039507865906, 0.45098039507865906), (0.40404039621353149, -0.45882353186607361, 0.45882353186607361), (0.40909090638160706, -0.47058823704719543, 0.47058823704719543), (0.41414141654968262, -0.47843137383460999, 0.47843137383460999), (0.41919192671775818, -0.49019607901573181, 0.49019607901573181), (0.42424243688583374, -0.50196081399917603, 0.50196081399917603), (0.42929291725158691, -0.52549022436141968, 0.52549022436141968), (0.43434342741966248, -0.54901963472366333, 0.54901963472366333), (0.43939393758773804, -0.57254904508590698, 0.57254904508590698), (0.4444444477558136, -0.60000002384185791, 0.60000002384185791), (0.44949495792388916, -0.62352943420410156, 0.62352943420410156), (0.45454546809196472, -0.64705884456634521, 0.64705884456634521), (0.4595959484577179, -0.67058825492858887, 0.67058825492858887), (0.46464645862579346, -0.69411766529083252, 0.69411766529083252), (0.46969696879386902, -0.72156864404678345, 0.72156864404678345), (0.47474747896194458, -0.7450980544090271, 0.7450980544090271), (0.47979798913002014, -0.76862746477127075, 0.76862746477127075), (0.4848484992980957, -0.7921568751335144, 0.7921568751335144), (0.48989897966384888, -0.81568628549575806, 0.81568628549575806), (0.49494948983192444, -0.83921569585800171, 0.83921569585800171), (0.5, 0.86274510622024536, -0.86274510622024536), (0.50505048036575317, 0.88627451658248901, -0.88627451658248901), (0.51010102033615112, 0.90980392694473267, -0.90980392694473267), (0.5151515007019043, 0.93333333730697632, -0.93333333730697632), (0.52020204067230225, 0.95686274766921997, -0.95686274766921997), (0.52525252103805542, 0.98039215803146362, -0.98039215803146362), (0.53030300140380859, 1.0, 1.0), -(0.53535354137420654, 1.0, 1.0), (0.54040402173995972, 1.0, 1.0), -(0.54545456171035767, 1.0, 1.0), (0.55050504207611084, 1.0, 1.0), -(0.55555558204650879, 1.0, 1.0), (0.56060606241226196, 1.0, 1.0), -(0.56565654277801514, 1.0, 1.0), (0.57070708274841309, 1.0, 1.0), -(0.57575756311416626, 1.0, 1.0), (0.58080810308456421, 1.0, 1.0), -(0.58585858345031738, 1.0, 1.0), (0.59090906381607056, 1.0, 1.0), -(0.59595960378646851, 1.0, 1.0), (0.60101008415222168, 1.0, 1.0), -(0.60606062412261963, 1.0, 1.0), (0.6111111044883728, 1.0, 1.0), -(0.61616164445877075, 1.0, 1.0), (0.62121212482452393, 1.0, 1.0), -(0.6262626051902771, 1.0, 1.0), (0.63131314516067505, 1.0, 1.0), -(0.63636362552642822, 1.0, 1.0), (0.64141416549682617, 1.0, 1.0), -(0.64646464586257935, 1.0, 1.0), (0.65151512622833252, 1.0, 1.0), -(0.65656566619873047, 1.0, 1.0), (0.66161614656448364, 1.0, 1.0), -(0.66666668653488159, 1.0, 1.0), (0.67171716690063477, 1.0, 1.0), -(0.67676764726638794, 1.0, 1.0), (0.68181818723678589, 1.0, 1.0), -(0.68686866760253906, 1.0, 1.0), (0.69191920757293701, 1.0, 1.0), -(0.69696968793869019, 1.0, 1.0), (0.70202022790908813, 1.0, 1.0), -(0.70707070827484131, 1.0, 1.0), (0.71212118864059448, 1.0, 1.0), -(0.71717172861099243, 1.0, 1.0), (0.72222220897674561, 1.0, 1.0), -(0.72727274894714355, 1.0, 1.0), (0.73232322931289673, 1.0, 1.0), -(0.7373737096786499, 1.0, 1.0), (0.74242424964904785, 1.0, 1.0), -(0.74747473001480103, 1.0, 1.0), (0.75252526998519897, 1.0, 1.0), -(0.75757575035095215, 1.0, 1.0), (0.7626262903213501, 1.0, 1.0), -(0.76767677068710327, 1.0, 1.0), (0.77272725105285645, 1.0, 1.0), -(0.77777779102325439, 1.0, 1.0), (0.78282827138900757, 1.0, 1.0), -(0.78787881135940552, 1.0, 1.0), (0.79292929172515869, 1.0, 1.0), -(0.79797977209091187, 0.96470588445663452, 0.96470588445663452), -(0.80303031206130981, 0.92549020051956177, 0.92549020051956177), -(0.80808079242706299, 0.89019608497619629, 0.89019608497619629), -(0.81313133239746094, 0.85098040103912354, 0.85098040103912354), -(0.81818181276321411, 0.81568628549575806, 0.81568628549575806), -(0.82323235273361206, 0.7764706015586853, 0.7764706015586853), -(0.82828283309936523, 0.74117648601531982, 0.74117648601531982), -(0.83333331346511841, 0.70196080207824707, 0.70196080207824707), -(0.83838385343551636, 0.66666668653488159, 0.66666668653488159), -(0.84343433380126953, 0.62745100259780884, 0.62745100259780884), -(0.84848487377166748, 0.61960786581039429, 0.61960786581039429), -(0.85353535413742065, 0.65098041296005249, 0.65098041296005249), -(0.85858583450317383, 0.68235296010971069, 0.68235296010971069), -(0.86363637447357178, 0.7137255072593689, 0.7137255072593689), -(0.86868685483932495, 0.7450980544090271, 0.7450980544090271), -(0.8737373948097229, 0.77254903316497803, 0.77254903316497803), -(0.87878787517547607, 0.80392158031463623, 0.80392158031463623), -(0.88383835554122925, 0.83529412746429443, 0.83529412746429443), -(0.8888888955116272, 0.86666667461395264, 0.86666667461395264), -(0.89393937587738037, 0.89803922176361084, 0.89803922176361084), -(0.89898991584777832, 0.92941176891326904, 0.92941176891326904), -(0.90404039621353149, 0.93333333730697632, 0.93333333730697632), -(0.90909093618392944, 0.93725490570068359, 0.93725490570068359), -(0.91414141654968262, 0.93725490570068359, 0.93725490570068359), -(0.91919189691543579, 0.94117647409439087, 0.94117647409439087), -(0.92424243688583374, 0.94509804248809814, 0.94509804248809814), -(0.92929291725158691, 0.94509804248809814, 0.94509804248809814), -(0.93434345722198486, 0.94901961088180542, 0.94901961088180542), -(0.93939393758773804, 0.9529411792755127, 0.9529411792755127), -(0.94444441795349121, 0.9529411792755127, 0.9529411792755127), -(0.94949495792388916, 0.95686274766921997, 0.95686274766921997), -(0.95454543828964233, 0.96078431606292725, 0.96078431606292725), -(0.95959597826004028, 0.96470588445663452, 0.96470588445663452), -(0.96464645862579346, 0.9686274528503418, 0.9686274528503418), -(0.96969699859619141, 0.97254902124404907, 0.97254902124404907), -(0.97474747896194458, 0.97647058963775635, 0.97647058963775635), -(0.97979795932769775, 0.98039215803146362, 0.98039215803146362), -(0.9848484992980957, 0.9843137264251709, 0.9843137264251709), -(0.98989897966384888, 0.98823529481887817, 0.98823529481887817), -(0.99494951963424683, 0.99215686321258545, 0.99215686321258545), (1.0, -0.99607843160629272, 0.99607843160629272)]} -_gist_rainbow_data = {'blue': -[(0.0, 0.16470588743686676, 0.16470588743686676), (0.0042016808874905109, -0.14117647707462311, 0.14117647707462311), (0.0084033617749810219, -0.12156862765550613, 0.12156862765550613), (0.012605042196810246, -0.10196078568696976, 0.10196078568696976), (0.016806723549962044, -0.078431375324726105, 0.078431375324726105), (0.021008403971791267, -0.058823529630899429, 0.058823529630899429), (0.025210084393620491, -0.039215687662363052, 0.039215687662363052), (0.029411764815449715, -0.015686275437474251, 0.015686275437474251), (0.033613447099924088, 0.0, -0.0), (0.037815127521753311, 0.0, 0.0), (0.042016807943582535, 0.0, 0.0), -(0.046218488365411758, 0.0, 0.0), (0.050420168787240982, 0.0, 0.0), -(0.054621849209070206, 0.0, 0.0), (0.058823529630899429, 0.0, 0.0), -(0.063025213778018951, 0.0, 0.0), (0.067226894199848175, 0.0, 0.0), -(0.071428574621677399, 0.0, 0.0), (0.075630255043506622, 0.0, 0.0), -(0.079831935465335846, 0.0, 0.0), (0.08403361588716507, 0.0, 0.0), -(0.088235296308994293, 0.0, 0.0), (0.092436976730823517, 0.0, 0.0), -(0.09663865715265274, 0.0, 0.0), (0.10084033757448196, 0.0, 0.0), -(0.10504201799631119, 0.0, 0.0), (0.10924369841814041, 0.0, 0.0), -(0.11344537883996964, 0.0, 0.0), (0.11764705926179886, 0.0, 0.0), -(0.12184873968362808, 0.0, 0.0), (0.1260504275560379, 0.0, 0.0), -(0.13025210797786713, 0.0, 0.0), (0.13445378839969635, 0.0, 0.0), -(0.13865546882152557, 0.0, 0.0), (0.1428571492433548, 0.0, 0.0), -(0.14705882966518402, 0.0, 0.0), (0.15126051008701324, 0.0, 0.0), -(0.15546219050884247, 0.0, 0.0), (0.15966387093067169, 0.0, 0.0), -(0.16386555135250092, 0.0, 0.0), (0.16806723177433014, 0.0, 0.0), -(0.17226891219615936, 0.0, 0.0), (0.17647059261798859, 0.0, 0.0), -(0.18067227303981781, 0.0, 0.0), (0.18487395346164703, 0.0, 0.0), -(0.18907563388347626, 0.0, 0.0), (0.19327731430530548, 0.0, 0.0), -(0.1974789947271347, 0.0, 0.0), (0.20168067514896393, 0.0, 0.0), -(0.20588235557079315, 0.0, 0.0), (0.21008403599262238, 0.0, 0.0), -(0.2142857164144516, 0.0, 0.0), (0.21848739683628082, 0.0, 0.0), -(0.22268907725811005, 0.0, 0.0), (0.22689075767993927, 0.0, 0.0), -(0.23109243810176849, 0.0, 0.0), (0.23529411852359772, 0.0, 0.0), -(0.23949579894542694, 0.0, 0.0), (0.24369747936725616, 0.0, 0.0), -(0.24789915978908539, 0.0, 0.0), (0.25210085511207581, 0.0, 0.0), -(0.25630253553390503, 0.0, 0.0), (0.26050421595573425, 0.0, 0.0), -(0.26470589637756348, 0.0, 0.0), (0.2689075767993927, 0.0, 0.0), -(0.27310925722122192, 0.0, 0.0), (0.27731093764305115, 0.0, 0.0), -(0.28151261806488037, 0.0, 0.0), (0.28571429848670959, 0.0, 0.0), -(0.28991597890853882, 0.0, 0.0), (0.29411765933036804, 0.0, 0.0), -(0.29831933975219727, 0.0, 0.0), (0.30252102017402649, 0.0, 0.0), -(0.30672270059585571, 0.0, 0.0), (0.31092438101768494, 0.0, 0.0), -(0.31512606143951416, 0.0, 0.0), (0.31932774186134338, 0.0, 0.0), -(0.32352942228317261, 0.0, 0.0), (0.32773110270500183, 0.0, 0.0), -(0.33193278312683105, 0.0, 0.0), (0.33613446354866028, 0.0, 0.0), -(0.3403361439704895, 0.0, 0.0), (0.34453782439231873, 0.0, 0.0), -(0.34873950481414795, 0.0, 0.0), (0.35294118523597717, 0.0, 0.0), -(0.3571428656578064, 0.0, 0.0), (0.36134454607963562, 0.0, 0.0), -(0.36554622650146484, 0.0, 0.0), (0.36974790692329407, 0.0, 0.0), -(0.37394958734512329, 0.0, 0.0), (0.37815126776695251, 0.0, 0.0), -(0.38235294818878174, 0.0, 0.0), (0.38655462861061096, 0.0, 0.0), -(0.39075630903244019, 0.0, 0.0), (0.39495798945426941, 0.0, 0.0), -(0.39915966987609863, 0.0, 0.0), (0.40336135029792786, 0.0, 0.0), -(0.40756303071975708, 0.0039215688593685627, 0.0039215688593685627), -(0.4117647111415863, 0.047058824449777603, 0.047058824449777603), -(0.41596639156341553, 0.066666670143604279, 0.066666670143604279), -(0.42016807198524475, 0.090196080505847931, 0.090196080505847931), -(0.42436975240707397, 0.10980392247438431, 0.10980392247438431), -(0.4285714328289032, 0.12941177189350128, 0.12941177189350128), -(0.43277311325073242, 0.15294118225574493, 0.15294118225574493), -(0.43697479367256165, 0.17254902422428131, 0.17254902422428131), -(0.44117647409439087, 0.19215686619281769, 0.19215686619281769), -(0.44537815451622009, 0.21568627655506134, 0.21568627655506134), -(0.44957983493804932, 0.23529411852359772, 0.23529411852359772), -(0.45378151535987854, 0.25882354378700256, 0.25882354378700256), -(0.45798319578170776, 0.27843138575553894, 0.27843138575553894), -(0.46218487620353699, 0.29803922772407532, 0.29803922772407532), -(0.46638655662536621, 0.32156863808631897, 0.32156863808631897), -(0.47058823704719543, 0.34117648005485535, 0.34117648005485535), -(0.47478991746902466, 0.38431373238563538, 0.38431373238563538), -(0.47899159789085388, 0.40392157435417175, 0.40392157435417175), -(0.48319327831268311, 0.42745098471641541, 0.42745098471641541), -(0.48739495873451233, 0.44705882668495178, 0.44705882668495178), -(0.49159663915634155, 0.46666666865348816, 0.46666666865348816), -(0.49579831957817078, 0.49019607901573181, 0.49019607901573181), (0.5, -0.50980395078659058, 0.50980395078659058), (0.50420171022415161, -0.52941179275512695, 0.52941179275512695), (0.50840336084365845, -0.55294120311737061, 0.55294120311737061), (0.51260507106781006, -0.57254904508590698, 0.57254904508590698), (0.51680672168731689, -0.59607845544815063, 0.59607845544815063), (0.52100843191146851, -0.61568629741668701, 0.61568629741668701), (0.52521008253097534, -0.63529413938522339, 0.63529413938522339), (0.52941179275512695, -0.65882354974746704, 0.65882354974746704), (0.53361344337463379, -0.67843139171600342, 0.67843139171600342), (0.5378151535987854, -0.72156864404678345, 0.72156864404678345), (0.54201680421829224, -0.74117648601531982, 0.74117648601531982), (0.54621851444244385, -0.76470589637756348, 0.76470589637756348), (0.55042016506195068, -0.78431373834609985, 0.78431373834609985), (0.55462187528610229, -0.80392158031463623, 0.80392158031463623), (0.55882352590560913, -0.82745099067687988, 0.82745099067687988), (0.56302523612976074, -0.84705883264541626, 0.84705883264541626), (0.56722688674926758, -0.87058824300765991, 0.87058824300765991), (0.57142859697341919, -0.89019608497619629, 0.89019608497619629), (0.57563024759292603, -0.90980392694473267, 0.90980392694473267), (0.57983195781707764, -0.93333333730697632, 0.93333333730697632), (0.58403360843658447, -0.9529411792755127, 0.9529411792755127), (0.58823531866073608, -0.97254902124404907, 0.97254902124404907), (0.59243696928024292, -0.99607843160629272, 0.99607843160629272), (0.59663867950439453, 1.0, -1.0), (0.60084033012390137, 1.0, 1.0), (0.60504204034805298, 1.0, 1.0), -(0.60924369096755981, 1.0, 1.0), (0.61344540119171143, 1.0, 1.0), -(0.61764705181121826, 1.0, 1.0), (0.62184876203536987, 1.0, 1.0), -(0.62605041265487671, 1.0, 1.0), (0.63025212287902832, 1.0, 1.0), -(0.63445377349853516, 1.0, 1.0), (0.63865548372268677, 1.0, 1.0), -(0.6428571343421936, 1.0, 1.0), (0.64705884456634521, 1.0, 1.0), -(0.65126049518585205, 1.0, 1.0), (0.65546220541000366, 1.0, 1.0), -(0.6596638560295105, 1.0, 1.0), (0.66386556625366211, 1.0, 1.0), -(0.66806721687316895, 1.0, 1.0), (0.67226892709732056, 1.0, 1.0), -(0.67647057771682739, 1.0, 1.0), (0.680672287940979, 1.0, 1.0), -(0.68487393856048584, 1.0, 1.0), (0.68907564878463745, 1.0, 1.0), -(0.69327729940414429, 1.0, 1.0), (0.6974790096282959, 1.0, 1.0), -(0.70168066024780273, 1.0, 1.0), (0.70588237047195435, 1.0, 1.0), -(0.71008402109146118, 1.0, 1.0), (0.71428573131561279, 1.0, 1.0), -(0.71848738193511963, 1.0, 1.0), (0.72268909215927124, 1.0, 1.0), -(0.72689074277877808, 1.0, 1.0), (0.73109245300292969, 1.0, 1.0), -(0.73529410362243652, 1.0, 1.0), (0.73949581384658813, 1.0, 1.0), -(0.74369746446609497, 1.0, 1.0), (0.74789917469024658, 1.0, 1.0), -(0.75210082530975342, 1.0, 1.0), (0.75630253553390503, 1.0, 1.0), -(0.76050418615341187, 1.0, 1.0), (0.76470589637756348, 1.0, 1.0), -(0.76890754699707031, 1.0, 1.0), (0.77310925722122192, 1.0, 1.0), -(0.77731090784072876, 1.0, 1.0), (0.78151261806488037, 1.0, 1.0), -(0.78571426868438721, 1.0, 1.0), (0.78991597890853882, 1.0, 1.0), -(0.79411762952804565, 1.0, 1.0), (0.79831933975219727, 1.0, 1.0), -(0.8025209903717041, 1.0, 1.0), (0.80672270059585571, 1.0, 1.0), -(0.81092435121536255, 1.0, 1.0), (0.81512606143951416, 1.0, 1.0), -(0.819327712059021, 1.0, 1.0), (0.82352942228317261, 1.0, 1.0), -(0.82773107290267944, 1.0, 1.0), (0.83193278312683105, 1.0, 1.0), -(0.83613443374633789, 1.0, 1.0), (0.8403361439704895, 1.0, 1.0), -(0.84453779458999634, 1.0, 1.0), (0.84873950481414795, 1.0, 1.0), -(0.85294115543365479, 1.0, 1.0), (0.8571428656578064, 1.0, 1.0), -(0.86134451627731323, 1.0, 1.0), (0.86554622650146484, 1.0, 1.0), -(0.86974787712097168, 1.0, 1.0), (0.87394958734512329, 1.0, 1.0), -(0.87815123796463013, 1.0, 1.0), (0.88235294818878174, 1.0, 1.0), -(0.88655459880828857, 1.0, 1.0), (0.89075630903244019, 1.0, 1.0), -(0.89495795965194702, 1.0, 1.0), (0.89915966987609863, 1.0, 1.0), -(0.90336132049560547, 1.0, 1.0), (0.90756303071975708, 1.0, 1.0), -(0.91176468133926392, 1.0, 1.0), (0.91596639156341553, 1.0, 1.0), -(0.92016804218292236, 1.0, 1.0), (0.92436975240707397, 1.0, 1.0), -(0.92857140302658081, 1.0, 1.0), (0.93277311325073242, 1.0, 1.0), -(0.93697476387023926, 1.0, 1.0), (0.94117647409439087, 1.0, 1.0), -(0.94537812471389771, 1.0, 1.0), (0.94957983493804932, 1.0, 1.0), -(0.95378148555755615, 1.0, 1.0), (0.95798319578170776, 1.0, 1.0), -(0.9621848464012146, 1.0, 1.0), (0.96638655662536621, 0.99607843160629272, -0.99607843160629272), (0.97058820724487305, 0.97647058963775635, -0.97647058963775635), (0.97478991746902466, 0.9529411792755127, -0.9529411792755127), (0.97899156808853149, 0.91372549533843994, -0.91372549533843994), (0.98319327831268311, 0.89019608497619629, -0.89019608497619629), (0.98739492893218994, 0.87058824300765991, -0.87058824300765991), (0.99159663915634155, 0.85098040103912354, -0.85098040103912354), (0.99579828977584839, 0.82745099067687988, -0.82745099067687988), (1.0, 0.80784314870834351, 0.80784314870834351)], -'green': [(0.0, 0.0, 0.0), (0.0042016808874905109, 0.0, 0.0), -(0.0084033617749810219, 0.0, 0.0), (0.012605042196810246, 0.0, 0.0), -(0.016806723549962044, 0.0, 0.0), (0.021008403971791267, 0.0, 0.0), -(0.025210084393620491, 0.0, 0.0), (0.029411764815449715, 0.0, 0.0), -(0.033613447099924088, 0.019607843831181526, 0.019607843831181526), -(0.037815127521753311, 0.043137256056070328, 0.043137256056070328), -(0.042016807943582535, 0.062745101749897003, 0.062745101749897003), -(0.046218488365411758, 0.086274512112140656, 0.086274512112140656), -(0.050420168787240982, 0.10588235408067703, 0.10588235408067703), -(0.054621849209070206, 0.12549020349979401, 0.12549020349979401), -(0.058823529630899429, 0.14901961386203766, 0.14901961386203766), -(0.063025213778018951, 0.16862745583057404, 0.16862745583057404), -(0.067226894199848175, 0.18823529779911041, 0.18823529779911041), -(0.071428574621677399, 0.21176470816135406, 0.21176470816135406), -(0.075630255043506622, 0.23137255012989044, 0.23137255012989044), -(0.079831935465335846, 0.25490197539329529, 0.25490197539329529), -(0.08403361588716507, 0.27450981736183167, 0.27450981736183167), -(0.088235296308994293, 0.29411765933036804, 0.29411765933036804), -(0.092436976730823517, 0.31764706969261169, 0.31764706969261169), -(0.09663865715265274, 0.35686275362968445, 0.35686275362968445), -(0.10084033757448196, 0.3803921639919281, 0.3803921639919281), -(0.10504201799631119, 0.40000000596046448, 0.40000000596046448), -(0.10924369841814041, 0.42352941632270813, 0.42352941632270813), -(0.11344537883996964, 0.44313725829124451, 0.44313725829124451), -(0.11764705926179886, 0.46274510025978088, 0.46274510025978088), -(0.12184873968362808, 0.48627451062202454, 0.48627451062202454), -(0.1260504275560379, 0.5058823823928833, 0.5058823823928833), -(0.13025210797786713, 0.52941179275512695, 0.52941179275512695), -(0.13445378839969635, 0.54901963472366333, 0.54901963472366333), -(0.13865546882152557, 0.56862747669219971, 0.56862747669219971), -(0.1428571492433548, 0.59215688705444336, 0.59215688705444336), -(0.14705882966518402, 0.61176472902297974, 0.61176472902297974), -(0.15126051008701324, 0.63137257099151611, 0.63137257099151611), -(0.15546219050884247, 0.65490198135375977, 0.65490198135375977), -(0.15966387093067169, 0.69803923368453979, 0.69803923368453979), -(0.16386555135250092, 0.71764707565307617, 0.71764707565307617), -(0.16806723177433014, 0.73725491762161255, 0.73725491762161255), -(0.17226891219615936, 0.7607843279838562, 0.7607843279838562), -(0.17647059261798859, 0.78039216995239258, 0.78039216995239258), -(0.18067227303981781, 0.80000001192092896, 0.80000001192092896), -(0.18487395346164703, 0.82352942228317261, 0.82352942228317261), -(0.18907563388347626, 0.84313726425170898, 0.84313726425170898), -(0.19327731430530548, 0.86666667461395264, 0.86666667461395264), -(0.1974789947271347, 0.88627451658248901, 0.88627451658248901), -(0.20168067514896393, 0.90588235855102539, 0.90588235855102539), -(0.20588235557079315, 0.92941176891326904, 0.92941176891326904), -(0.21008403599262238, 0.94901961088180542, 0.94901961088180542), -(0.2142857164144516, 0.9686274528503418, 0.9686274528503418), -(0.21848739683628082, 0.99215686321258545, 0.99215686321258545), -(0.22268907725811005, 1.0, 1.0), (0.22689075767993927, 1.0, 1.0), -(0.23109243810176849, 1.0, 1.0), (0.23529411852359772, 1.0, 1.0), -(0.23949579894542694, 1.0, 1.0), (0.24369747936725616, 1.0, 1.0), -(0.24789915978908539, 1.0, 1.0), (0.25210085511207581, 1.0, 1.0), -(0.25630253553390503, 1.0, 1.0), (0.26050421595573425, 1.0, 1.0), -(0.26470589637756348, 1.0, 1.0), (0.2689075767993927, 1.0, 1.0), -(0.27310925722122192, 1.0, 1.0), (0.27731093764305115, 1.0, 1.0), -(0.28151261806488037, 1.0, 1.0), (0.28571429848670959, 1.0, 1.0), -(0.28991597890853882, 1.0, 1.0), (0.29411765933036804, 1.0, 1.0), -(0.29831933975219727, 1.0, 1.0), (0.30252102017402649, 1.0, 1.0), -(0.30672270059585571, 1.0, 1.0), (0.31092438101768494, 1.0, 1.0), -(0.31512606143951416, 1.0, 1.0), (0.31932774186134338, 1.0, 1.0), -(0.32352942228317261, 1.0, 1.0), (0.32773110270500183, 1.0, 1.0), -(0.33193278312683105, 1.0, 1.0), (0.33613446354866028, 1.0, 1.0), -(0.3403361439704895, 1.0, 1.0), (0.34453782439231873, 1.0, 1.0), -(0.34873950481414795, 1.0, 1.0), (0.35294118523597717, 1.0, 1.0), -(0.3571428656578064, 1.0, 1.0), (0.36134454607963562, 1.0, 1.0), -(0.36554622650146484, 1.0, 1.0), (0.36974790692329407, 1.0, 1.0), -(0.37394958734512329, 1.0, 1.0), (0.37815126776695251, 1.0, 1.0), -(0.38235294818878174, 1.0, 1.0), (0.38655462861061096, 1.0, 1.0), -(0.39075630903244019, 1.0, 1.0), (0.39495798945426941, 1.0, 1.0), -(0.39915966987609863, 1.0, 1.0), (0.40336135029792786, 1.0, 1.0), -(0.40756303071975708, 1.0, 1.0), (0.4117647111415863, 1.0, 1.0), -(0.41596639156341553, 1.0, 1.0), (0.42016807198524475, 1.0, 1.0), -(0.42436975240707397, 1.0, 1.0), (0.4285714328289032, 1.0, 1.0), -(0.43277311325073242, 1.0, 1.0), (0.43697479367256165, 1.0, 1.0), -(0.44117647409439087, 1.0, 1.0), (0.44537815451622009, 1.0, 1.0), -(0.44957983493804932, 1.0, 1.0), (0.45378151535987854, 1.0, 1.0), -(0.45798319578170776, 1.0, 1.0), (0.46218487620353699, 1.0, 1.0), -(0.46638655662536621, 1.0, 1.0), (0.47058823704719543, 1.0, 1.0), -(0.47478991746902466, 1.0, 1.0), (0.47899159789085388, 1.0, 1.0), -(0.48319327831268311, 1.0, 1.0), (0.48739495873451233, 1.0, 1.0), -(0.49159663915634155, 1.0, 1.0), (0.49579831957817078, 1.0, 1.0), (0.5, -1.0, 1.0), (0.50420171022415161, 1.0, 1.0), (0.50840336084365845, 1.0, -1.0), (0.51260507106781006, 1.0, 1.0), (0.51680672168731689, 1.0, 1.0), -(0.52100843191146851, 1.0, 1.0), (0.52521008253097534, 1.0, 1.0), -(0.52941179275512695, 1.0, 1.0), (0.53361344337463379, 1.0, 1.0), -(0.5378151535987854, 1.0, 1.0), (0.54201680421829224, 1.0, 1.0), -(0.54621851444244385, 1.0, 1.0), (0.55042016506195068, 1.0, 1.0), -(0.55462187528610229, 1.0, 1.0), (0.55882352590560913, 1.0, 1.0), -(0.56302523612976074, 1.0, 1.0), (0.56722688674926758, 1.0, 1.0), -(0.57142859697341919, 1.0, 1.0), (0.57563024759292603, 1.0, 1.0), -(0.57983195781707764, 1.0, 1.0), (0.58403360843658447, 1.0, 1.0), -(0.58823531866073608, 1.0, 1.0), (0.59243696928024292, 1.0, 1.0), -(0.59663867950439453, 0.98039215803146362, 0.98039215803146362), -(0.60084033012390137, 0.93725490570068359, 0.93725490570068359), -(0.60504204034805298, 0.91764706373214722, 0.91764706373214722), -(0.60924369096755981, 0.89411765336990356, 0.89411765336990356), -(0.61344540119171143, 0.87450981140136719, 0.87450981140136719), -(0.61764705181121826, 0.85490196943283081, 0.85490196943283081), -(0.62184876203536987, 0.83137255907058716, 0.83137255907058716), -(0.62605041265487671, 0.81176471710205078, 0.81176471710205078), -(0.63025212287902832, 0.78823530673980713, 0.78823530673980713), -(0.63445377349853516, 0.76862746477127075, 0.76862746477127075), -(0.63865548372268677, 0.74901962280273438, 0.74901962280273438), -(0.6428571343421936, 0.72549021244049072, 0.72549021244049072), -(0.64705884456634521, 0.70588237047195435, 0.70588237047195435), -(0.65126049518585205, 0.68235296010971069, 0.68235296010971069), -(0.65546220541000366, 0.66274511814117432, 0.66274511814117432), -(0.6596638560295105, 0.64313727617263794, 0.64313727617263794), -(0.66386556625366211, 0.60000002384185791, 0.60000002384185791), -(0.66806721687316895, 0.58039218187332153, 0.58039218187332153), -(0.67226892709732056, 0.55686277151107788, 0.55686277151107788), -(0.67647057771682739, 0.5372549295425415, 0.5372549295425415), -(0.680672287940979, 0.51372551918029785, 0.51372551918029785), -(0.68487393856048584, 0.49411764740943909, 0.49411764740943909), -(0.68907564878463745, 0.47450980544090271, 0.47450980544090271), -(0.69327729940414429, 0.45098039507865906, 0.45098039507865906), -(0.6974790096282959, 0.43137255311012268, 0.43137255311012268), -(0.70168066024780273, 0.4117647111415863, 0.4117647111415863), -(0.70588237047195435, 0.38823530077934265, 0.38823530077934265), -(0.71008402109146118, 0.36862745881080627, 0.36862745881080627), -(0.71428573131561279, 0.34509804844856262, 0.34509804844856262), -(0.71848738193511963, 0.32549020648002625, 0.32549020648002625), -(0.72268909215927124, 0.30588236451148987, 0.30588236451148987), -(0.72689074277877808, 0.26274511218070984, 0.26274511218070984), -(0.73109245300292969, 0.24313725531101227, 0.24313725531101227), -(0.73529410362243652, 0.21960784494876862, 0.21960784494876862), -(0.73949581384658813, 0.20000000298023224, 0.20000000298023224), -(0.74369746446609497, 0.17647059261798859, 0.17647059261798859), -(0.74789917469024658, 0.15686275064945221, 0.15686275064945221), -(0.75210082530975342, 0.13725490868091583, 0.13725490868091583), -(0.75630253553390503, 0.11372549086809158, 0.11372549086809158), -(0.76050418615341187, 0.094117648899555206, 0.094117648899555206), -(0.76470589637756348, 0.070588238537311554, 0.070588238537311554), -(0.76890754699707031, 0.050980392843484879, 0.050980392843484879), -(0.77310925722122192, 0.031372550874948502, 0.031372550874948502), -(0.77731090784072876, 0.0078431377187371254, 0.0078431377187371254), -(0.78151261806488037, 0.0, 0.0), (0.78571426868438721, 0.0, 0.0), -(0.78991597890853882, 0.0, 0.0), (0.79411762952804565, 0.0, 0.0), -(0.79831933975219727, 0.0, 0.0), (0.8025209903717041, 0.0, 0.0), -(0.80672270059585571, 0.0, 0.0), (0.81092435121536255, 0.0, 0.0), -(0.81512606143951416, 0.0, 0.0), (0.819327712059021, 0.0, 0.0), -(0.82352942228317261, 0.0, 0.0), (0.82773107290267944, 0.0, 0.0), -(0.83193278312683105, 0.0, 0.0), (0.83613443374633789, 0.0, 0.0), -(0.8403361439704895, 0.0, 0.0), (0.84453779458999634, 0.0, 0.0), -(0.84873950481414795, 0.0, 0.0), (0.85294115543365479, 0.0, 0.0), -(0.8571428656578064, 0.0, 0.0), (0.86134451627731323, 0.0, 0.0), -(0.86554622650146484, 0.0, 0.0), (0.86974787712097168, 0.0, 0.0), -(0.87394958734512329, 0.0, 0.0), (0.87815123796463013, 0.0, 0.0), -(0.88235294818878174, 0.0, 0.0), (0.88655459880828857, 0.0, 0.0), -(0.89075630903244019, 0.0, 0.0), (0.89495795965194702, 0.0, 0.0), -(0.89915966987609863, 0.0, 0.0), (0.90336132049560547, 0.0, 0.0), -(0.90756303071975708, 0.0, 0.0), (0.91176468133926392, 0.0, 0.0), -(0.91596639156341553, 0.0, 0.0), (0.92016804218292236, 0.0, 0.0), -(0.92436975240707397, 0.0, 0.0), (0.92857140302658081, 0.0, 0.0), -(0.93277311325073242, 0.0, 0.0), (0.93697476387023926, 0.0, 0.0), -(0.94117647409439087, 0.0, 0.0), (0.94537812471389771, 0.0, 0.0), -(0.94957983493804932, 0.0, 0.0), (0.95378148555755615, 0.0, 0.0), -(0.95798319578170776, 0.0, 0.0), (0.9621848464012146, 0.0, 0.0), -(0.96638655662536621, 0.0, 0.0), (0.97058820724487305, 0.0, 0.0), -(0.97478991746902466, 0.0, 0.0), (0.97899156808853149, 0.0, 0.0), -(0.98319327831268311, 0.0, 0.0), (0.98739492893218994, 0.0, 0.0), -(0.99159663915634155, 0.0, 0.0), (0.99579828977584839, 0.0, 0.0), (1.0, -0.0, 0.0)], 'red': [(0.0, 1.0, 1.0), (0.0042016808874905109, 1.0, 1.0), -(0.0084033617749810219, 1.0, 1.0), (0.012605042196810246, 1.0, 1.0), -(0.016806723549962044, 1.0, 1.0), (0.021008403971791267, 1.0, 1.0), -(0.025210084393620491, 1.0, 1.0), (0.029411764815449715, 1.0, 1.0), -(0.033613447099924088, 1.0, 1.0), (0.037815127521753311, 1.0, 1.0), -(0.042016807943582535, 1.0, 1.0), (0.046218488365411758, 1.0, 1.0), -(0.050420168787240982, 1.0, 1.0), (0.054621849209070206, 1.0, 1.0), -(0.058823529630899429, 1.0, 1.0), (0.063025213778018951, 1.0, 1.0), -(0.067226894199848175, 1.0, 1.0), (0.071428574621677399, 1.0, 1.0), -(0.075630255043506622, 1.0, 1.0), (0.079831935465335846, 1.0, 1.0), -(0.08403361588716507, 1.0, 1.0), (0.088235296308994293, 1.0, 1.0), -(0.092436976730823517, 1.0, 1.0), (0.09663865715265274, 1.0, 1.0), -(0.10084033757448196, 1.0, 1.0), (0.10504201799631119, 1.0, 1.0), -(0.10924369841814041, 1.0, 1.0), (0.11344537883996964, 1.0, 1.0), -(0.11764705926179886, 1.0, 1.0), (0.12184873968362808, 1.0, 1.0), -(0.1260504275560379, 1.0, 1.0), (0.13025210797786713, 1.0, 1.0), -(0.13445378839969635, 1.0, 1.0), (0.13865546882152557, 1.0, 1.0), -(0.1428571492433548, 1.0, 1.0), (0.14705882966518402, 1.0, 1.0), -(0.15126051008701324, 1.0, 1.0), (0.15546219050884247, 1.0, 1.0), -(0.15966387093067169, 1.0, 1.0), (0.16386555135250092, 1.0, 1.0), -(0.16806723177433014, 1.0, 1.0), (0.17226891219615936, 1.0, 1.0), -(0.17647059261798859, 1.0, 1.0), (0.18067227303981781, 1.0, 1.0), -(0.18487395346164703, 1.0, 1.0), (0.18907563388347626, 1.0, 1.0), -(0.19327731430530548, 1.0, 1.0), (0.1974789947271347, 1.0, 1.0), -(0.20168067514896393, 1.0, 1.0), (0.20588235557079315, 1.0, 1.0), -(0.21008403599262238, 1.0, 1.0), (0.2142857164144516, 1.0, 1.0), -(0.21848739683628082, 1.0, 1.0), (0.22268907725811005, -0.96078431606292725, 0.96078431606292725), (0.22689075767993927, -0.94117647409439087, 0.94117647409439087), (0.23109243810176849, -0.92156863212585449, 0.92156863212585449), (0.23529411852359772, -0.89803922176361084, 0.89803922176361084), (0.23949579894542694, -0.87843137979507446, 0.87843137979507446), (0.24369747936725616, -0.85882353782653809, 0.85882353782653809), (0.24789915978908539, -0.83529412746429443, 0.83529412746429443), (0.25210085511207581, -0.81568628549575806, 0.81568628549575806), (0.25630253553390503, -0.7921568751335144, 0.7921568751335144), (0.26050421595573425, -0.77254903316497803, 0.77254903316497803), (0.26470589637756348, -0.75294119119644165, 0.75294119119644165), (0.2689075767993927, -0.729411780834198, 0.729411780834198), (0.27310925722122192, -0.70980393886566162, 0.70980393886566162), (0.27731093764305115, -0.68627452850341797, 0.68627452850341797), (0.28151261806488037, -0.66666668653488159, 0.66666668653488159), (0.28571429848670959, -0.62352943420410156, 0.62352943420410156), (0.28991597890853882, -0.60392159223556519, 0.60392159223556519), (0.29411765933036804, -0.58431375026702881, 0.58431375026702881), (0.29831933975219727, -0.56078433990478516, 0.56078433990478516), (0.30252102017402649, -0.54117649793624878, 0.54117649793624878), (0.30672270059585571, -0.51764708757400513, 0.51764708757400513), (0.31092438101768494, -0.49803921580314636, 0.49803921580314636), (0.31512606143951416, -0.47843137383460999, 0.47843137383460999), (0.31932774186134338, -0.45490196347236633, 0.45490196347236633), (0.32352942228317261, -0.43529412150382996, 0.43529412150382996), (0.32773110270500183, -0.41568627953529358, 0.41568627953529358), (0.33193278312683105, -0.39215686917304993, 0.39215686917304993), (0.33613446354866028, -0.37254902720451355, 0.37254902720451355), (0.3403361439704895, -0.3490196168422699, 0.3490196168422699), (0.34453782439231873, -0.32941177487373352, 0.32941177487373352), (0.34873950481414795, -0.28627452254295349, 0.28627452254295349), (0.35294118523597717, -0.26666668057441711, 0.26666668057441711), (0.3571428656578064, -0.24705882370471954, 0.24705882370471954), (0.36134454607963562, -0.22352941334247589, 0.22352941334247589), (0.36554622650146484, -0.20392157137393951, 0.20392157137393951), (0.36974790692329407, -0.18039216101169586, 0.18039216101169586), (0.37394958734512329, -0.16078431904315948, 0.16078431904315948), (0.37815126776695251, -0.14117647707462311, 0.14117647707462311), (0.38235294818878174, -0.11764705926179886, 0.11764705926179886), (0.38655462861061096, -0.098039217293262482, 0.098039217293262482), (0.39075630903244019, -0.074509806931018829, 0.074509806931018829), (0.39495798945426941, -0.054901961237192154, 0.054901961237192154), (0.39915966987609863, -0.035294119268655777, 0.035294119268655777), (0.40336135029792786, -0.011764706112444401, 0.011764706112444401), (0.40756303071975708, 0.0, -0.0), (0.4117647111415863, 0.0, 0.0), (0.41596639156341553, 0.0, 0.0), -(0.42016807198524475, 0.0, 0.0), (0.42436975240707397, 0.0, 0.0), -(0.4285714328289032, 0.0, 0.0), (0.43277311325073242, 0.0, 0.0), -(0.43697479367256165, 0.0, 0.0), (0.44117647409439087, 0.0, 0.0), -(0.44537815451622009, 0.0, 0.0), (0.44957983493804932, 0.0, 0.0), -(0.45378151535987854, 0.0, 0.0), (0.45798319578170776, 0.0, 0.0), -(0.46218487620353699, 0.0, 0.0), (0.46638655662536621, 0.0, 0.0), -(0.47058823704719543, 0.0, 0.0), (0.47478991746902466, 0.0, 0.0), -(0.47899159789085388, 0.0, 0.0), (0.48319327831268311, 0.0, 0.0), -(0.48739495873451233, 0.0, 0.0), (0.49159663915634155, 0.0, 0.0), -(0.49579831957817078, 0.0, 0.0), (0.5, 0.0, 0.0), (0.50420171022415161, -0.0, 0.0), (0.50840336084365845, 0.0, 0.0), (0.51260507106781006, 0.0, -0.0), (0.51680672168731689, 0.0, 0.0), (0.52100843191146851, 0.0, 0.0), -(0.52521008253097534, 0.0, 0.0), (0.52941179275512695, 0.0, 0.0), -(0.53361344337463379, 0.0, 0.0), (0.5378151535987854, 0.0, 0.0), -(0.54201680421829224, 0.0, 0.0), (0.54621851444244385, 0.0, 0.0), -(0.55042016506195068, 0.0, 0.0), (0.55462187528610229, 0.0, 0.0), -(0.55882352590560913, 0.0, 0.0), (0.56302523612976074, 0.0, 0.0), -(0.56722688674926758, 0.0, 0.0), (0.57142859697341919, 0.0, 0.0), -(0.57563024759292603, 0.0, 0.0), (0.57983195781707764, 0.0, 0.0), -(0.58403360843658447, 0.0, 0.0), (0.58823531866073608, 0.0, 0.0), -(0.59243696928024292, 0.0, 0.0), (0.59663867950439453, 0.0, 0.0), -(0.60084033012390137, 0.0, 0.0), (0.60504204034805298, 0.0, 0.0), -(0.60924369096755981, 0.0, 0.0), (0.61344540119171143, 0.0, 0.0), -(0.61764705181121826, 0.0, 0.0), (0.62184876203536987, 0.0, 0.0), -(0.62605041265487671, 0.0, 0.0), (0.63025212287902832, 0.0, 0.0), -(0.63445377349853516, 0.0, 0.0), (0.63865548372268677, 0.0, 0.0), -(0.6428571343421936, 0.0, 0.0), (0.64705884456634521, 0.0, 0.0), -(0.65126049518585205, 0.0, 0.0), (0.65546220541000366, 0.0, 0.0), -(0.6596638560295105, 0.0, 0.0), (0.66386556625366211, 0.0, 0.0), -(0.66806721687316895, 0.0, 0.0), (0.67226892709732056, 0.0, 0.0), -(0.67647057771682739, 0.0, 0.0), (0.680672287940979, 0.0, 0.0), -(0.68487393856048584, 0.0, 0.0), (0.68907564878463745, 0.0, 0.0), -(0.69327729940414429, 0.0, 0.0), (0.6974790096282959, 0.0, 0.0), -(0.70168066024780273, 0.0, 0.0), (0.70588237047195435, 0.0, 0.0), -(0.71008402109146118, 0.0, 0.0), (0.71428573131561279, 0.0, 0.0), -(0.71848738193511963, 0.0, 0.0), (0.72268909215927124, 0.0, 0.0), -(0.72689074277877808, 0.0, 0.0), (0.73109245300292969, 0.0, 0.0), -(0.73529410362243652, 0.0, 0.0), (0.73949581384658813, 0.0, 0.0), -(0.74369746446609497, 0.0, 0.0), (0.74789917469024658, 0.0, 0.0), -(0.75210082530975342, 0.0, 0.0), (0.75630253553390503, 0.0, 0.0), -(0.76050418615341187, 0.0, 0.0), (0.76470589637756348, 0.0, 0.0), -(0.76890754699707031, 0.0, 0.0), (0.77310925722122192, 0.0, 0.0), -(0.77731090784072876, 0.0, 0.0), (0.78151261806488037, -0.0078431377187371254, 0.0078431377187371254), (0.78571426868438721, -0.027450980618596077, 0.027450980618596077), (0.78991597890853882, -0.070588238537311554, 0.070588238537311554), (0.79411762952804565, -0.094117648899555206, 0.094117648899555206), (0.79831933975219727, -0.11372549086809158, 0.11372549086809158), (0.8025209903717041, -0.13333334028720856, 0.13333334028720856), (0.80672270059585571, -0.15686275064945221, 0.15686275064945221), (0.81092435121536255, -0.17647059261798859, 0.17647059261798859), (0.81512606143951416, -0.19607843458652496, 0.19607843458652496), (0.819327712059021, -0.21960784494876862, 0.21960784494876862), (0.82352942228317261, -0.23921568691730499, 0.23921568691730499), (0.82773107290267944, -0.26274511218070984, 0.26274511218070984), (0.83193278312683105, -0.28235295414924622, 0.28235295414924622), (0.83613443374633789, -0.30196079611778259, 0.30196079611778259), (0.8403361439704895, -0.32549020648002625, 0.32549020648002625), (0.84453779458999634, -0.34509804844856262, 0.34509804844856262), (0.84873950481414795, -0.364705890417099, 0.364705890417099), (0.85294115543365479, -0.40784314274787903, 0.40784314274787903), (0.8571428656578064, -0.43137255311012268, 0.43137255311012268), (0.86134451627731323, -0.45098039507865906, 0.45098039507865906), (0.86554622650146484, -0.47058823704719543, 0.47058823704719543), (0.86974787712097168, -0.49411764740943909, 0.49411764740943909), (0.87394958734512329, -0.51372551918029785, 0.51372551918029785), (0.87815123796463013, -0.53333336114883423, 0.53333336114883423), (0.88235294818878174, -0.55686277151107788, 0.55686277151107788), (0.88655459880828857, -0.57647061347961426, 0.57647061347961426), (0.89075630903244019, -0.60000002384185791, 0.60000002384185791), (0.89495795965194702, -0.61960786581039429, 0.61960786581039429), (0.89915966987609863, -0.63921570777893066, 0.63921570777893066), (0.90336132049560547, -0.66274511814117432, 0.66274511814117432), (0.90756303071975708, -0.68235296010971069, 0.68235296010971069), (0.91176468133926392, -0.70588237047195435, 0.70588237047195435), (0.91596639156341553, -0.7450980544090271, 0.7450980544090271), (0.92016804218292236, -0.76862746477127075, 0.76862746477127075), (0.92436975240707397, -0.78823530673980713, 0.78823530673980713), (0.92857140302658081, -0.80784314870834351, 0.80784314870834351), (0.93277311325073242, -0.83137255907058716, 0.83137255907058716), (0.93697476387023926, -0.85098040103912354, 0.85098040103912354), (0.94117647409439087, -0.87450981140136719, 0.87450981140136719), (0.94537812471389771, -0.89411765336990356, 0.89411765336990356), (0.94957983493804932, -0.91372549533843994, 0.91372549533843994), (0.95378148555755615, -0.93725490570068359, 0.93725490570068359), (0.95798319578170776, -0.95686274766921997, 0.95686274766921997), (0.9621848464012146, -0.97647058963775635, 0.97647058963775635), (0.96638655662536621, 1.0, -1.0), (0.97058820724487305, 1.0, 1.0), (0.97478991746902466, 1.0, 1.0), -(0.97899156808853149, 1.0, 1.0), (0.98319327831268311, 1.0, 1.0), -(0.98739492893218994, 1.0, 1.0), (0.99159663915634155, 1.0, 1.0), -(0.99579828977584839, 1.0, 1.0), (1.0, 1.0, 1.0)]} -_gist_stern_data = {'blue': [(0.0, 0.0, 0.0), -(0.0042016808874905109, 0.0039215688593685627, -0.0039215688593685627), (0.0084033617749810219, 0.011764706112444401, -0.011764706112444401), (0.012605042196810246, 0.019607843831181526, -0.019607843831181526), (0.016806723549962044, 0.027450980618596077, -0.027450980618596077), (0.021008403971791267, 0.035294119268655777, -0.035294119268655777), (0.025210084393620491, 0.043137256056070328, -0.043137256056070328), (0.029411764815449715, 0.050980392843484879, -0.050980392843484879), (0.033613447099924088, 0.058823529630899429, -0.058823529630899429), (0.037815127521753311, 0.066666670143604279, -0.066666670143604279), (0.042016807943582535, 0.08235294371843338, -0.08235294371843338), (0.046218488365411758, 0.090196080505847931, -0.090196080505847931), (0.050420168787240982, 0.098039217293262482, -0.098039217293262482), (0.054621849209070206, 0.10588235408067703, -0.10588235408067703), (0.058823529630899429, 0.11372549086809158, -0.11372549086809158), (0.063025213778018951, 0.12156862765550613, -0.12156862765550613), (0.067226894199848175, 0.12941177189350128, -0.12941177189350128), (0.071428574621677399, 0.13725490868091583, -0.13725490868091583), (0.075630255043506622, 0.14509804546833038, -0.14509804546833038), (0.079831935465335846, 0.15294118225574493, -0.15294118225574493), (0.08403361588716507, 0.16078431904315948, -0.16078431904315948), (0.088235296308994293, 0.16862745583057404, -0.16862745583057404), (0.092436976730823517, 0.17647059261798859, -0.17647059261798859), (0.09663865715265274, 0.18431372940540314, -0.18431372940540314), (0.10084033757448196, 0.19215686619281769, -0.19215686619281769), (0.10504201799631119, 0.20000000298023224, -0.20000000298023224), (0.10924369841814041, 0.20784313976764679, -0.20784313976764679), (0.11344537883996964, 0.21568627655506134, -0.21568627655506134), (0.11764705926179886, 0.22352941334247589, -0.22352941334247589), (0.12184873968362808, 0.23137255012989044, -0.23137255012989044), (0.1260504275560379, 0.24705882370471954, -0.24705882370471954), (0.13025210797786713, 0.25490197539329529, -0.25490197539329529), (0.13445378839969635, 0.26274511218070984, -0.26274511218070984), (0.13865546882152557, 0.27058824896812439, -0.27058824896812439), (0.1428571492433548, 0.27843138575553894, -0.27843138575553894), (0.14705882966518402, 0.28627452254295349, -0.28627452254295349), (0.15126051008701324, 0.29411765933036804, -0.29411765933036804), (0.15546219050884247, 0.30196079611778259, -0.30196079611778259), (0.15966387093067169, 0.30980393290519714, -0.30980393290519714), (0.16386555135250092, 0.31764706969261169, -0.31764706969261169), (0.16806723177433014, 0.32549020648002625, -0.32549020648002625), (0.17226891219615936, 0.3333333432674408, -0.3333333432674408), (0.17647059261798859, 0.34117648005485535, -0.34117648005485535), (0.18067227303981781, 0.3490196168422699, -0.3490196168422699), (0.18487395346164703, 0.35686275362968445, -0.35686275362968445), (0.18907563388347626, 0.364705890417099, -0.364705890417099), (0.19327731430530548, 0.37254902720451355, -0.37254902720451355), (0.1974789947271347, 0.3803921639919281, -0.3803921639919281), (0.20168067514896393, 0.38823530077934265, -0.38823530077934265), (0.20588235557079315, 0.3960784375667572, -0.3960784375667572), (0.21008403599262238, 0.4117647111415863, -0.4117647111415863), (0.2142857164144516, 0.41960784792900085, -0.41960784792900085), (0.21848739683628082, 0.42745098471641541, -0.42745098471641541), (0.22268907725811005, 0.43529412150382996, -0.43529412150382996), (0.22689075767993927, 0.44313725829124451, -0.44313725829124451), (0.23109243810176849, 0.45098039507865906, -0.45098039507865906), (0.23529411852359772, 0.45882353186607361, -0.45882353186607361), (0.23949579894542694, 0.46666666865348816, -0.46666666865348816), (0.24369747936725616, 0.47450980544090271, -0.47450980544090271), (0.24789915978908539, 0.48235294222831726, -0.48235294222831726), (0.25210085511207581, 0.49803921580314636, -0.49803921580314636), (0.25630253553390503, 0.5058823823928833, -0.5058823823928833), (0.26050421595573425, 0.51372551918029785, -0.51372551918029785), (0.26470589637756348, 0.5215686559677124, -0.5215686559677124), (0.2689075767993927, 0.52941179275512695, -0.52941179275512695), (0.27310925722122192, 0.5372549295425415, -0.5372549295425415), (0.27731093764305115, 0.54509806632995605, -0.54509806632995605), (0.28151261806488037, 0.55294120311737061, -0.55294120311737061), (0.28571429848670959, 0.56078433990478516, -0.56078433990478516), (0.28991597890853882, 0.56862747669219971, -0.56862747669219971), (0.29411765933036804, 0.58431375026702881, -0.58431375026702881), (0.29831933975219727, 0.59215688705444336, -0.59215688705444336), (0.30252102017402649, 0.60000002384185791, -0.60000002384185791), (0.30672270059585571, 0.60784316062927246, -0.60784316062927246), (0.31092438101768494, 0.61568629741668701, -0.61568629741668701), (0.31512606143951416, 0.62352943420410156, -0.62352943420410156), (0.31932774186134338, 0.63137257099151611, -0.63137257099151611), (0.32352942228317261, 0.63921570777893066, -0.63921570777893066), (0.32773110270500183, 0.64705884456634521, -0.64705884456634521), (0.33193278312683105, 0.65490198135375977, -0.65490198135375977), (0.33613446354866028, 0.66274511814117432, -0.66274511814117432), (0.3403361439704895, 0.67058825492858887, -0.67058825492858887), (0.34453782439231873, 0.67843139171600342, -0.67843139171600342), (0.34873950481414795, 0.68627452850341797, -0.68627452850341797), (0.35294118523597717, 0.69411766529083252, -0.69411766529083252), (0.3571428656578064, 0.70196080207824707, -0.70196080207824707), (0.36134454607963562, 0.70980393886566162, -0.70980393886566162), (0.36554622650146484, 0.71764707565307617, -0.71764707565307617), (0.36974790692329407, 0.72549021244049072, -0.72549021244049072), (0.37394958734512329, 0.73333334922790527, -0.73333334922790527), (0.37815126776695251, 0.74901962280273438, -0.74901962280273438), (0.38235294818878174, 0.75686275959014893, -0.75686275959014893), (0.38655462861061096, 0.76470589637756348, -0.76470589637756348), (0.39075630903244019, 0.77254903316497803, -0.77254903316497803), (0.39495798945426941, 0.78039216995239258, -0.78039216995239258), (0.39915966987609863, 0.78823530673980713, -0.78823530673980713), (0.40336135029792786, 0.79607844352722168, -0.79607844352722168), (0.40756303071975708, 0.80392158031463623, -0.80392158031463623), (0.4117647111415863, 0.81176471710205078, -0.81176471710205078), (0.41596639156341553, 0.81960785388946533, -0.81960785388946533), (0.42016807198524475, 0.82745099067687988, -0.82745099067687988), (0.42436975240707397, 0.83529412746429443, -0.83529412746429443), (0.4285714328289032, 0.84313726425170898, -0.84313726425170898), (0.43277311325073242, 0.85098040103912354, -0.85098040103912354), (0.43697479367256165, 0.85882353782653809, -0.85882353782653809), (0.44117647409439087, 0.86666667461395264, -0.86666667461395264), (0.44537815451622009, 0.87450981140136719, -0.87450981140136719), (0.44957983493804932, 0.88235294818878174, -0.88235294818878174), (0.45378151535987854, 0.89019608497619629, -0.89019608497619629), (0.45798319578170776, 0.89803922176361084, -0.89803922176361084), (0.46218487620353699, 0.91372549533843994, -0.91372549533843994), (0.46638655662536621, 0.92156863212585449, -0.92156863212585449), (0.47058823704719543, 0.92941176891326904, -0.92941176891326904), (0.47478991746902466, 0.93725490570068359, -0.93725490570068359), (0.47899159789085388, 0.94509804248809814, -0.94509804248809814), (0.48319327831268311, 0.9529411792755127, -0.9529411792755127), (0.48739495873451233, 0.96078431606292725, -0.96078431606292725), (0.49159663915634155, 0.9686274528503418, -0.9686274528503418), (0.49579831957817078, 0.97647058963775635, -0.97647058963775635), (0.5, 0.9843137264251709, 0.9843137264251709), -(0.50420171022415161, 1.0, 1.0), (0.50840336084365845, 0.9843137264251709, -0.9843137264251709), (0.51260507106781006, 0.9686274528503418, -0.9686274528503418), (0.51680672168731689, 0.9529411792755127, -0.9529411792755127), (0.52100843191146851, 0.93333333730697632, -0.93333333730697632), (0.52521008253097534, 0.91764706373214722, -0.91764706373214722), (0.52941179275512695, 0.90196079015731812, -0.90196079015731812), (0.53361344337463379, 0.88627451658248901, -0.88627451658248901), (0.5378151535987854, 0.86666667461395264, -0.86666667461395264), (0.54201680421829224, 0.85098040103912354, -0.85098040103912354), (0.54621851444244385, 0.81960785388946533, -0.81960785388946533), (0.55042016506195068, 0.80000001192092896, -0.80000001192092896), (0.55462187528610229, 0.78431373834609985, -0.78431373834609985), (0.55882352590560913, 0.76862746477127075, -0.76862746477127075), (0.56302523612976074, 0.75294119119644165, -0.75294119119644165), (0.56722688674926758, 0.73333334922790527, -0.73333334922790527), (0.57142859697341919, 0.71764707565307617, -0.71764707565307617), (0.57563024759292603, 0.70196080207824707, -0.70196080207824707), (0.57983195781707764, 0.68627452850341797, -0.68627452850341797), (0.58403360843658447, 0.66666668653488159, -0.66666668653488159), (0.58823531866073608, 0.65098041296005249, -0.65098041296005249), (0.59243696928024292, 0.63529413938522339, -0.63529413938522339), (0.59663867950439453, 0.61960786581039429, -0.61960786581039429), (0.60084033012390137, 0.60000002384185791, -0.60000002384185791), (0.60504204034805298, 0.58431375026702881, -0.58431375026702881), (0.60924369096755981, 0.56862747669219971, -0.56862747669219971), (0.61344540119171143, 0.55294120311737061, -0.55294120311737061), (0.61764705181121826, 0.53333336114883423, -0.53333336114883423), (0.62184876203536987, 0.51764708757400513, -0.51764708757400513), (0.62605041265487671, 0.50196081399917603, -0.50196081399917603), (0.63025212287902832, 0.46666666865348816, -0.46666666865348816), (0.63445377349853516, 0.45098039507865906, -0.45098039507865906), (0.63865548372268677, 0.43529412150382996, -0.43529412150382996), (0.6428571343421936, 0.41960784792900085, -0.41960784792900085), (0.64705884456634521, 0.40000000596046448, -0.40000000596046448), (0.65126049518585205, 0.38431373238563538, -0.38431373238563538), (0.65546220541000366, 0.36862745881080627, -0.36862745881080627), (0.6596638560295105, 0.35294118523597717, -0.35294118523597717), (0.66386556625366211, 0.3333333432674408, -0.3333333432674408), (0.66806721687316895, 0.31764706969261169, -0.31764706969261169), (0.67226892709732056, 0.30196079611778259, -0.30196079611778259), (0.67647057771682739, 0.28627452254295349, -0.28627452254295349), (0.680672287940979, 0.26666668057441711, -0.26666668057441711), (0.68487393856048584, 0.25098040699958801, -0.25098040699958801), (0.68907564878463745, 0.23529411852359772, -0.23529411852359772), (0.69327729940414429, 0.21960784494876862, -0.21960784494876862), (0.6974790096282959, 0.20000000298023224, -0.20000000298023224), (0.70168066024780273, 0.18431372940540314, -0.18431372940540314), (0.70588237047195435, 0.16862745583057404, -0.16862745583057404), (0.71008402109146118, 0.15294118225574493, -0.15294118225574493), (0.71428573131561279, 0.11764705926179886, -0.11764705926179886), (0.71848738193511963, 0.10196078568696976, -0.10196078568696976), (0.72268909215927124, 0.086274512112140656, -0.086274512112140656), (0.72689074277877808, 0.066666670143604279, -0.066666670143604279), (0.73109245300292969, 0.050980392843484879, -0.050980392843484879), (0.73529410362243652, 0.035294119268655777, -0.035294119268655777), (0.73949581384658813, 0.019607843831181526, -0.019607843831181526), (0.74369746446609497, 0.0, 0.0), -(0.74789917469024658, 0.011764706112444401, 0.011764706112444401), -(0.75210082530975342, 0.027450980618596077, 0.027450980618596077), -(0.75630253553390503, 0.058823529630899429, 0.058823529630899429), -(0.76050418615341187, 0.074509806931018829, 0.074509806931018829), -(0.76470589637756348, 0.086274512112140656, 0.086274512112140656), -(0.76890754699707031, 0.10196078568696976, 0.10196078568696976), -(0.77310925722122192, 0.11764705926179886, 0.11764705926179886), -(0.77731090784072876, 0.13333334028720856, 0.13333334028720856), -(0.78151261806488037, 0.14901961386203766, 0.14901961386203766), -(0.78571426868438721, 0.16078431904315948, 0.16078431904315948), -(0.78991597890853882, 0.17647059261798859, 0.17647059261798859), -(0.79411762952804565, 0.19215686619281769, 0.19215686619281769), -(0.79831933975219727, 0.22352941334247589, 0.22352941334247589), -(0.8025209903717041, 0.23529411852359772, 0.23529411852359772), -(0.80672270059585571, 0.25098040699958801, 0.25098040699958801), -(0.81092435121536255, 0.26666668057441711, 0.26666668057441711), -(0.81512606143951416, 0.28235295414924622, 0.28235295414924622), -(0.819327712059021, 0.29803922772407532, 0.29803922772407532), -(0.82352942228317261, 0.30980393290519714, 0.30980393290519714), -(0.82773107290267944, 0.32549020648002625, 0.32549020648002625), -(0.83193278312683105, 0.34117648005485535, 0.34117648005485535), -(0.83613443374633789, 0.35686275362968445, 0.35686275362968445), -(0.8403361439704895, 0.37254902720451355, 0.37254902720451355), -(0.84453779458999634, 0.38431373238563538, 0.38431373238563538), -(0.84873950481414795, 0.40000000596046448, 0.40000000596046448), -(0.85294115543365479, 0.41568627953529358, 0.41568627953529358), -(0.8571428656578064, 0.43137255311012268, 0.43137255311012268), -(0.86134451627731323, 0.44705882668495178, 0.44705882668495178), -(0.86554622650146484, 0.45882353186607361, 0.45882353186607361), -(0.86974787712097168, 0.47450980544090271, 0.47450980544090271), -(0.87394958734512329, 0.49019607901573181, 0.49019607901573181), -(0.87815123796463013, 0.5058823823928833, 0.5058823823928833), -(0.88235294818878174, 0.5372549295425415, 0.5372549295425415), -(0.88655459880828857, 0.54901963472366333, 0.54901963472366333), -(0.89075630903244019, 0.56470590829849243, 0.56470590829849243), -(0.89495795965194702, 0.58039218187332153, 0.58039218187332153), -(0.89915966987609863, 0.59607845544815063, 0.59607845544815063), -(0.90336132049560547, 0.61176472902297974, 0.61176472902297974), -(0.90756303071975708, 0.62352943420410156, 0.62352943420410156), -(0.91176468133926392, 0.63921570777893066, 0.63921570777893066), -(0.91596639156341553, 0.65490198135375977, 0.65490198135375977), -(0.92016804218292236, 0.67058825492858887, 0.67058825492858887), -(0.92436975240707397, 0.68627452850341797, 0.68627452850341797), -(0.92857140302658081, 0.69803923368453979, 0.69803923368453979), -(0.93277311325073242, 0.7137255072593689, 0.7137255072593689), -(0.93697476387023926, 0.729411780834198, 0.729411780834198), -(0.94117647409439087, 0.7450980544090271, 0.7450980544090271), -(0.94537812471389771, 0.7607843279838562, 0.7607843279838562), -(0.94957983493804932, 0.77254903316497803, 0.77254903316497803), -(0.95378148555755615, 0.78823530673980713, 0.78823530673980713), -(0.95798319578170776, 0.80392158031463623, 0.80392158031463623), -(0.9621848464012146, 0.81960785388946533, 0.81960785388946533), -(0.96638655662536621, 0.84705883264541626, 0.84705883264541626), -(0.97058820724487305, 0.86274510622024536, 0.86274510622024536), -(0.97478991746902466, 0.87843137979507446, 0.87843137979507446), -(0.97899156808853149, 0.89411765336990356, 0.89411765336990356), -(0.98319327831268311, 0.90980392694473267, 0.90980392694473267), -(0.98739492893218994, 0.92156863212585449, 0.92156863212585449), -(0.99159663915634155, 0.93725490570068359, 0.93725490570068359), -(0.99579828977584839, 0.9529411792755127, 0.9529411792755127), (1.0, -0.9686274528503418, 0.9686274528503418)], 'green': [(0.0, 0.0, 0.0), -(0.0042016808874905109, 0.0039215688593685627, 0.0039215688593685627), -(0.0084033617749810219, 0.0078431377187371254, 0.0078431377187371254), -(0.012605042196810246, 0.011764706112444401, 0.011764706112444401), -(0.016806723549962044, 0.015686275437474251, 0.015686275437474251), -(0.021008403971791267, 0.019607843831181526, 0.019607843831181526), -(0.025210084393620491, 0.023529412224888802, 0.023529412224888802), -(0.029411764815449715, 0.027450980618596077, 0.027450980618596077), -(0.033613447099924088, 0.031372550874948502, 0.031372550874948502), -(0.037815127521753311, 0.035294119268655777, 0.035294119268655777), -(0.042016807943582535, 0.043137256056070328, 0.043137256056070328), -(0.046218488365411758, 0.047058824449777603, 0.047058824449777603), -(0.050420168787240982, 0.050980392843484879, 0.050980392843484879), -(0.054621849209070206, 0.054901961237192154, 0.054901961237192154), -(0.058823529630899429, 0.058823529630899429, 0.058823529630899429), -(0.063025213778018951, 0.062745101749897003, 0.062745101749897003), -(0.067226894199848175, 0.066666670143604279, 0.066666670143604279), -(0.071428574621677399, 0.070588238537311554, 0.070588238537311554), -(0.075630255043506622, 0.074509806931018829, 0.074509806931018829), -(0.079831935465335846, 0.078431375324726105, 0.078431375324726105), -(0.08403361588716507, 0.08235294371843338, 0.08235294371843338), -(0.088235296308994293, 0.086274512112140656, 0.086274512112140656), -(0.092436976730823517, 0.090196080505847931, 0.090196080505847931), -(0.09663865715265274, 0.094117648899555206, 0.094117648899555206), -(0.10084033757448196, 0.098039217293262482, 0.098039217293262482), -(0.10504201799631119, 0.10196078568696976, 0.10196078568696976), -(0.10924369841814041, 0.10588235408067703, 0.10588235408067703), -(0.11344537883996964, 0.10980392247438431, 0.10980392247438431), -(0.11764705926179886, 0.11372549086809158, 0.11372549086809158), -(0.12184873968362808, 0.11764705926179886, 0.11764705926179886), -(0.1260504275560379, 0.12549020349979401, 0.12549020349979401), -(0.13025210797786713, 0.12941177189350128, 0.12941177189350128), -(0.13445378839969635, 0.13333334028720856, 0.13333334028720856), -(0.13865546882152557, 0.13725490868091583, 0.13725490868091583), -(0.1428571492433548, 0.14117647707462311, 0.14117647707462311), -(0.14705882966518402, 0.14509804546833038, 0.14509804546833038), -(0.15126051008701324, 0.14901961386203766, 0.14901961386203766), -(0.15546219050884247, 0.15294118225574493, 0.15294118225574493), -(0.15966387093067169, 0.15686275064945221, 0.15686275064945221), -(0.16386555135250092, 0.16078431904315948, 0.16078431904315948), -(0.16806723177433014, 0.16470588743686676, 0.16470588743686676), -(0.17226891219615936, 0.16862745583057404, 0.16862745583057404), -(0.17647059261798859, 0.17254902422428131, 0.17254902422428131), -(0.18067227303981781, 0.17647059261798859, 0.17647059261798859), -(0.18487395346164703, 0.18039216101169586, 0.18039216101169586), -(0.18907563388347626, 0.18431372940540314, 0.18431372940540314), -(0.19327731430530548, 0.18823529779911041, 0.18823529779911041), -(0.1974789947271347, 0.19215686619281769, 0.19215686619281769), -(0.20168067514896393, 0.19607843458652496, 0.19607843458652496), -(0.20588235557079315, 0.20000000298023224, 0.20000000298023224), -(0.21008403599262238, 0.20784313976764679, 0.20784313976764679), -(0.2142857164144516, 0.21176470816135406, 0.21176470816135406), -(0.21848739683628082, 0.21568627655506134, 0.21568627655506134), -(0.22268907725811005, 0.21960784494876862, 0.21960784494876862), -(0.22689075767993927, 0.22352941334247589, 0.22352941334247589), -(0.23109243810176849, 0.22745098173618317, 0.22745098173618317), -(0.23529411852359772, 0.23137255012989044, 0.23137255012989044), -(0.23949579894542694, 0.23529411852359772, 0.23529411852359772), -(0.24369747936725616, 0.23921568691730499, 0.23921568691730499), -(0.24789915978908539, 0.24313725531101227, 0.24313725531101227), -(0.25210085511207581, 0.25098040699958801, 0.25098040699958801), -(0.25630253553390503, 0.25490197539329529, 0.25490197539329529), -(0.26050421595573425, 0.25882354378700256, 0.25882354378700256), -(0.26470589637756348, 0.26274511218070984, 0.26274511218070984), -(0.2689075767993927, 0.26666668057441711, 0.26666668057441711), -(0.27310925722122192, 0.27058824896812439, 0.27058824896812439), -(0.27731093764305115, 0.27450981736183167, 0.27450981736183167), -(0.28151261806488037, 0.27843138575553894, 0.27843138575553894), -(0.28571429848670959, 0.28235295414924622, 0.28235295414924622), -(0.28991597890853882, 0.28627452254295349, 0.28627452254295349), -(0.29411765933036804, 0.29411765933036804, 0.29411765933036804), -(0.29831933975219727, 0.29803922772407532, 0.29803922772407532), -(0.30252102017402649, 0.30196079611778259, 0.30196079611778259), -(0.30672270059585571, 0.30588236451148987, 0.30588236451148987), -(0.31092438101768494, 0.30980393290519714, 0.30980393290519714), -(0.31512606143951416, 0.31372550129890442, 0.31372550129890442), -(0.31932774186134338, 0.31764706969261169, 0.31764706969261169), -(0.32352942228317261, 0.32156863808631897, 0.32156863808631897), -(0.32773110270500183, 0.32549020648002625, 0.32549020648002625), -(0.33193278312683105, 0.32941177487373352, 0.32941177487373352), -(0.33613446354866028, 0.3333333432674408, 0.3333333432674408), -(0.3403361439704895, 0.33725491166114807, 0.33725491166114807), -(0.34453782439231873, 0.34117648005485535, 0.34117648005485535), -(0.34873950481414795, 0.34509804844856262, 0.34509804844856262), -(0.35294118523597717, 0.3490196168422699, 0.3490196168422699), -(0.3571428656578064, 0.35294118523597717, 0.35294118523597717), -(0.36134454607963562, 0.35686275362968445, 0.35686275362968445), -(0.36554622650146484, 0.36078432202339172, 0.36078432202339172), -(0.36974790692329407, 0.364705890417099, 0.364705890417099), -(0.37394958734512329, 0.36862745881080627, 0.36862745881080627), -(0.37815126776695251, 0.37647059559822083, 0.37647059559822083), -(0.38235294818878174, 0.3803921639919281, 0.3803921639919281), -(0.38655462861061096, 0.38431373238563538, 0.38431373238563538), -(0.39075630903244019, 0.38823530077934265, 0.38823530077934265), -(0.39495798945426941, 0.39215686917304993, 0.39215686917304993), -(0.39915966987609863, 0.3960784375667572, 0.3960784375667572), -(0.40336135029792786, 0.40000000596046448, 0.40000000596046448), -(0.40756303071975708, 0.40392157435417175, 0.40392157435417175), -(0.4117647111415863, 0.40784314274787903, 0.40784314274787903), -(0.41596639156341553, 0.4117647111415863, 0.4117647111415863), -(0.42016807198524475, 0.41568627953529358, 0.41568627953529358), -(0.42436975240707397, 0.41960784792900085, 0.41960784792900085), -(0.4285714328289032, 0.42352941632270813, 0.42352941632270813), -(0.43277311325073242, 0.42745098471641541, 0.42745098471641541), -(0.43697479367256165, 0.43137255311012268, 0.43137255311012268), -(0.44117647409439087, 0.43529412150382996, 0.43529412150382996), -(0.44537815451622009, 0.43921568989753723, 0.43921568989753723), -(0.44957983493804932, 0.44313725829124451, 0.44313725829124451), -(0.45378151535987854, 0.44705882668495178, 0.44705882668495178), -(0.45798319578170776, 0.45098039507865906, 0.45098039507865906), -(0.46218487620353699, 0.45882353186607361, 0.45882353186607361), -(0.46638655662536621, 0.46274510025978088, 0.46274510025978088), -(0.47058823704719543, 0.46666666865348816, 0.46666666865348816), -(0.47478991746902466, 0.47058823704719543, 0.47058823704719543), -(0.47899159789085388, 0.47450980544090271, 0.47450980544090271), -(0.48319327831268311, 0.47843137383460999, 0.47843137383460999), -(0.48739495873451233, 0.48235294222831726, 0.48235294222831726), -(0.49159663915634155, 0.48627451062202454, 0.48627451062202454), -(0.49579831957817078, 0.49019607901573181, 0.49019607901573181), (0.5, -0.49411764740943909, 0.49411764740943909), (0.50420171022415161, -0.50196081399917603, 0.50196081399917603), (0.50840336084365845, -0.5058823823928833, 0.5058823823928833), (0.51260507106781006, -0.50980395078659058, 0.50980395078659058), (0.51680672168731689, -0.51372551918029785, 0.51372551918029785), (0.52100843191146851, -0.51764708757400513, 0.51764708757400513), (0.52521008253097534, -0.5215686559677124, 0.5215686559677124), (0.52941179275512695, -0.52549022436141968, 0.52549022436141968), (0.53361344337463379, -0.52941179275512695, 0.52941179275512695), (0.5378151535987854, -0.53333336114883423, 0.53333336114883423), (0.54201680421829224, -0.5372549295425415, 0.5372549295425415), (0.54621851444244385, -0.54509806632995605, 0.54509806632995605), (0.55042016506195068, -0.54901963472366333, 0.54901963472366333), (0.55462187528610229, -0.55294120311737061, 0.55294120311737061), (0.55882352590560913, -0.55686277151107788, 0.55686277151107788), (0.56302523612976074, -0.56078433990478516, 0.56078433990478516), (0.56722688674926758, -0.56470590829849243, 0.56470590829849243), (0.57142859697341919, -0.56862747669219971, 0.56862747669219971), (0.57563024759292603, -0.57254904508590698, 0.57254904508590698), (0.57983195781707764, -0.57647061347961426, 0.57647061347961426), (0.58403360843658447, -0.58039218187332153, 0.58039218187332153), (0.58823531866073608, -0.58431375026702881, 0.58431375026702881), (0.59243696928024292, -0.58823531866073608, 0.58823531866073608), (0.59663867950439453, -0.59215688705444336, 0.59215688705444336), (0.60084033012390137, -0.59607845544815063, 0.59607845544815063), (0.60504204034805298, -0.60000002384185791, 0.60000002384185791), (0.60924369096755981, -0.60392159223556519, 0.60392159223556519), (0.61344540119171143, -0.60784316062927246, 0.60784316062927246), (0.61764705181121826, -0.61176472902297974, 0.61176472902297974), (0.62184876203536987, -0.61568629741668701, 0.61568629741668701), (0.62605041265487671, -0.61960786581039429, 0.61960786581039429), (0.63025212287902832, -0.62745100259780884, 0.62745100259780884), (0.63445377349853516, -0.63137257099151611, 0.63137257099151611), (0.63865548372268677, -0.63529413938522339, 0.63529413938522339), (0.6428571343421936, -0.63921570777893066, 0.63921570777893066), (0.64705884456634521, -0.64313727617263794, 0.64313727617263794), (0.65126049518585205, -0.64705884456634521, 0.64705884456634521), (0.65546220541000366, -0.65098041296005249, 0.65098041296005249), (0.6596638560295105, -0.65490198135375977, 0.65490198135375977), (0.66386556625366211, -0.65882354974746704, 0.65882354974746704), (0.66806721687316895, -0.66274511814117432, 0.66274511814117432), (0.67226892709732056, -0.66666668653488159, 0.66666668653488159), (0.67647057771682739, -0.67058825492858887, 0.67058825492858887), (0.680672287940979, -0.67450982332229614, 0.67450982332229614), (0.68487393856048584, -0.67843139171600342, 0.67843139171600342), (0.68907564878463745, -0.68235296010971069, 0.68235296010971069), (0.69327729940414429, -0.68627452850341797, 0.68627452850341797), (0.6974790096282959, -0.69019609689712524, 0.69019609689712524), (0.70168066024780273, -0.69411766529083252, 0.69411766529083252), (0.70588237047195435, -0.69803923368453979, 0.69803923368453979), (0.71008402109146118, -0.70196080207824707, 0.70196080207824707), (0.71428573131561279, -0.70980393886566162, 0.70980393886566162), (0.71848738193511963, -0.7137255072593689, 0.7137255072593689), (0.72268909215927124, -0.71764707565307617, 0.71764707565307617), (0.72689074277877808, -0.72156864404678345, 0.72156864404678345), (0.73109245300292969, -0.72549021244049072, 0.72549021244049072), (0.73529410362243652, -0.729411780834198, 0.729411780834198), (0.73949581384658813, -0.73333334922790527, 0.73333334922790527), (0.74369746446609497, -0.73725491762161255, 0.73725491762161255), (0.74789917469024658, -0.74117648601531982, 0.74117648601531982), (0.75210082530975342, -0.7450980544090271, 0.7450980544090271), (0.75630253553390503, -0.75294119119644165, 0.75294119119644165), (0.76050418615341187, -0.75686275959014893, 0.75686275959014893), (0.76470589637756348, -0.7607843279838562, 0.7607843279838562), (0.76890754699707031, -0.76470589637756348, 0.76470589637756348), (0.77310925722122192, -0.76862746477127075, 0.76862746477127075), (0.77731090784072876, -0.77254903316497803, 0.77254903316497803), (0.78151261806488037, -0.7764706015586853, 0.7764706015586853), (0.78571426868438721, -0.78039216995239258, 0.78039216995239258), (0.78991597890853882, -0.78431373834609985, 0.78431373834609985), (0.79411762952804565, -0.78823530673980713, 0.78823530673980713), (0.79831933975219727, -0.79607844352722168, 0.79607844352722168), (0.8025209903717041, -0.80000001192092896, 0.80000001192092896), (0.80672270059585571, -0.80392158031463623, 0.80392158031463623), (0.81092435121536255, -0.80784314870834351, 0.80784314870834351), (0.81512606143951416, -0.81176471710205078, 0.81176471710205078), (0.819327712059021, -0.81568628549575806, 0.81568628549575806), (0.82352942228317261, -0.81960785388946533, 0.81960785388946533), (0.82773107290267944, -0.82352942228317261, 0.82352942228317261), (0.83193278312683105, -0.82745099067687988, 0.82745099067687988), (0.83613443374633789, -0.83137255907058716, 0.83137255907058716), (0.8403361439704895, -0.83529412746429443, 0.83529412746429443), (0.84453779458999634, -0.83921569585800171, 0.83921569585800171), (0.84873950481414795, -0.84313726425170898, 0.84313726425170898), (0.85294115543365479, -0.84705883264541626, 0.84705883264541626), (0.8571428656578064, -0.85098040103912354, 0.85098040103912354), (0.86134451627731323, -0.85490196943283081, 0.85490196943283081), (0.86554622650146484, -0.85882353782653809, 0.85882353782653809), (0.86974787712097168, -0.86274510622024536, 0.86274510622024536), (0.87394958734512329, -0.86666667461395264, 0.86666667461395264), (0.87815123796463013, -0.87058824300765991, 0.87058824300765991), (0.88235294818878174, -0.87843137979507446, 0.87843137979507446), (0.88655459880828857, -0.88235294818878174, 0.88235294818878174), (0.89075630903244019, -0.88627451658248901, 0.88627451658248901), (0.89495795965194702, -0.89019608497619629, 0.89019608497619629), (0.89915966987609863, -0.89411765336990356, 0.89411765336990356), (0.90336132049560547, -0.89803922176361084, 0.89803922176361084), (0.90756303071975708, -0.90196079015731812, 0.90196079015731812), (0.91176468133926392, -0.90588235855102539, 0.90588235855102539), (0.91596639156341553, -0.90980392694473267, 0.90980392694473267), (0.92016804218292236, -0.91372549533843994, 0.91372549533843994), (0.92436975240707397, -0.91764706373214722, 0.91764706373214722), (0.92857140302658081, -0.92156863212585449, 0.92156863212585449), (0.93277311325073242, -0.92549020051956177, 0.92549020051956177), (0.93697476387023926, -0.92941176891326904, 0.92941176891326904), (0.94117647409439087, -0.93333333730697632, 0.93333333730697632), (0.94537812471389771, -0.93725490570068359, 0.93725490570068359), (0.94957983493804932, -0.94117647409439087, 0.94117647409439087), (0.95378148555755615, -0.94509804248809814, 0.94509804248809814), (0.95798319578170776, -0.94901961088180542, 0.94901961088180542), (0.9621848464012146, -0.9529411792755127, 0.9529411792755127), (0.96638655662536621, -0.96078431606292725, 0.96078431606292725), (0.97058820724487305, -0.96470588445663452, 0.96470588445663452), (0.97478991746902466, -0.9686274528503418, 0.9686274528503418), (0.97899156808853149, -0.97254902124404907, 0.97254902124404907), (0.98319327831268311, -0.97647058963775635, 0.97647058963775635), (0.98739492893218994, -0.98039215803146362, 0.98039215803146362), (0.99159663915634155, -0.9843137264251709, 0.9843137264251709), (0.99579828977584839, -0.98823529481887817, 0.98823529481887817), (1.0, 0.99215686321258545, -0.99215686321258545)], 'red': [(0.0, 0.0, 0.0), (0.0042016808874905109, -0.070588238537311554, 0.070588238537311554), (0.0084033617749810219, -0.14117647707462311, 0.14117647707462311), (0.012605042196810246, -0.21176470816135406, 0.21176470816135406), (0.016806723549962044, -0.28235295414924622, 0.28235295414924622), (0.021008403971791267, -0.35294118523597717, 0.35294118523597717), (0.025210084393620491, -0.42352941632270813, 0.42352941632270813), (0.029411764815449715, -0.49803921580314636, 0.49803921580314636), (0.033613447099924088, -0.56862747669219971, 0.56862747669219971), (0.037815127521753311, -0.63921570777893066, 0.63921570777893066), (0.042016807943582535, -0.78039216995239258, 0.78039216995239258), (0.046218488365411758, -0.85098040103912354, 0.85098040103912354), (0.050420168787240982, -0.92156863212585449, 0.92156863212585449), (0.054621849209070206, -0.99607843160629272, 0.99607843160629272), (0.058823529630899429, -0.97647058963775635, 0.97647058963775635), (0.063025213778018951, -0.95686274766921997, 0.95686274766921997), (0.067226894199848175, -0.93725490570068359, 0.93725490570068359), (0.071428574621677399, -0.91764706373214722, 0.91764706373214722), (0.075630255043506622, -0.89803922176361084, 0.89803922176361084), (0.079831935465335846, -0.87450981140136719, 0.87450981140136719), (0.08403361588716507, -0.85490196943283081, 0.85490196943283081), (0.088235296308994293, -0.83529412746429443, 0.83529412746429443), (0.092436976730823517, -0.81568628549575806, 0.81568628549575806), (0.09663865715265274, -0.79607844352722168, 0.79607844352722168), (0.10084033757448196, -0.77254903316497803, 0.77254903316497803), (0.10504201799631119, -0.75294119119644165, 0.75294119119644165), (0.10924369841814041, -0.73333334922790527, 0.73333334922790527), (0.11344537883996964, -0.7137255072593689, 0.7137255072593689), (0.11764705926179886, -0.69411766529083252, 0.69411766529083252), (0.12184873968362808, -0.67450982332229614, 0.67450982332229614), (0.1260504275560379, -0.63137257099151611, 0.63137257099151611), (0.13025210797786713, -0.61176472902297974, 0.61176472902297974), (0.13445378839969635, -0.59215688705444336, 0.59215688705444336), (0.13865546882152557, -0.57254904508590698, 0.57254904508590698), (0.1428571492433548, -0.54901963472366333, 0.54901963472366333), (0.14705882966518402, -0.52941179275512695, 0.52941179275512695), (0.15126051008701324, -0.50980395078659058, 0.50980395078659058), (0.15546219050884247, -0.49019607901573181, 0.49019607901573181), (0.15966387093067169, -0.47058823704719543, 0.47058823704719543), (0.16386555135250092, -0.45098039507865906, 0.45098039507865906), (0.16806723177433014, -0.42745098471641541, 0.42745098471641541), (0.17226891219615936, -0.40784314274787903, 0.40784314274787903), (0.17647059261798859, -0.38823530077934265, 0.38823530077934265), (0.18067227303981781, -0.36862745881080627, 0.36862745881080627), (0.18487395346164703, -0.3490196168422699, 0.3490196168422699), (0.18907563388347626, -0.32549020648002625, 0.32549020648002625), (0.19327731430530548, -0.30588236451148987, 0.30588236451148987), (0.1974789947271347, -0.28627452254295349, 0.28627452254295349), (0.20168067514896393, -0.26666668057441711, 0.26666668057441711), (0.20588235557079315, -0.24705882370471954, 0.24705882370471954), (0.21008403599262238, -0.20392157137393951, 0.20392157137393951), (0.2142857164144516, -0.18431372940540314, 0.18431372940540314), (0.21848739683628082, -0.16470588743686676, 0.16470588743686676), (0.22268907725811005, -0.14509804546833038, 0.14509804546833038), (0.22689075767993927, -0.12549020349979401, 0.12549020349979401), (0.23109243810176849, -0.10196078568696976, 0.10196078568696976), (0.23529411852359772, -0.08235294371843338, 0.08235294371843338), (0.23949579894542694, -0.062745101749897003, 0.062745101749897003), (0.24369747936725616, -0.043137256056070328, 0.043137256056070328), (0.24789915978908539, -0.023529412224888802, 0.023529412224888802), (0.25210085511207581, -0.25098040699958801, 0.25098040699958801), (0.25630253553390503, -0.25490197539329529, 0.25490197539329529), (0.26050421595573425, -0.25882354378700256, 0.25882354378700256), (0.26470589637756348, -0.26274511218070984, 0.26274511218070984), (0.2689075767993927, -0.26666668057441711, 0.26666668057441711), (0.27310925722122192, -0.27058824896812439, 0.27058824896812439), (0.27731093764305115, -0.27450981736183167, 0.27450981736183167), (0.28151261806488037, -0.27843138575553894, 0.27843138575553894), (0.28571429848670959, -0.28235295414924622, 0.28235295414924622), (0.28991597890853882, -0.28627452254295349, 0.28627452254295349), (0.29411765933036804, -0.29411765933036804, 0.29411765933036804), (0.29831933975219727, -0.29803922772407532, 0.29803922772407532), (0.30252102017402649, -0.30196079611778259, 0.30196079611778259), (0.30672270059585571, -0.30588236451148987, 0.30588236451148987), (0.31092438101768494, -0.30980393290519714, 0.30980393290519714), (0.31512606143951416, -0.31372550129890442, 0.31372550129890442), (0.31932774186134338, -0.31764706969261169, 0.31764706969261169), (0.32352942228317261, -0.32156863808631897, 0.32156863808631897), (0.32773110270500183, -0.32549020648002625, 0.32549020648002625), (0.33193278312683105, -0.32941177487373352, 0.32941177487373352), (0.33613446354866028, -0.3333333432674408, 0.3333333432674408), (0.3403361439704895, -0.33725491166114807, 0.33725491166114807), (0.34453782439231873, -0.34117648005485535, 0.34117648005485535), (0.34873950481414795, -0.34509804844856262, 0.34509804844856262), (0.35294118523597717, -0.3490196168422699, 0.3490196168422699), (0.3571428656578064, -0.35294118523597717, 0.35294118523597717), (0.36134454607963562, -0.35686275362968445, 0.35686275362968445), (0.36554622650146484, -0.36078432202339172, 0.36078432202339172), (0.36974790692329407, -0.364705890417099, 0.364705890417099), (0.37394958734512329, -0.36862745881080627, 0.36862745881080627), (0.37815126776695251, -0.37647059559822083, 0.37647059559822083), (0.38235294818878174, -0.3803921639919281, 0.3803921639919281), (0.38655462861061096, -0.38431373238563538, 0.38431373238563538), (0.39075630903244019, -0.38823530077934265, 0.38823530077934265), (0.39495798945426941, -0.39215686917304993, 0.39215686917304993), (0.39915966987609863, -0.3960784375667572, 0.3960784375667572), (0.40336135029792786, -0.40000000596046448, 0.40000000596046448), (0.40756303071975708, -0.40392157435417175, 0.40392157435417175), (0.4117647111415863, -0.40784314274787903, 0.40784314274787903), (0.41596639156341553, -0.4117647111415863, 0.4117647111415863), (0.42016807198524475, -0.41568627953529358, 0.41568627953529358), (0.42436975240707397, -0.41960784792900085, 0.41960784792900085), (0.4285714328289032, -0.42352941632270813, 0.42352941632270813), (0.43277311325073242, -0.42745098471641541, 0.42745098471641541), (0.43697479367256165, -0.43137255311012268, 0.43137255311012268), (0.44117647409439087, -0.43529412150382996, 0.43529412150382996), (0.44537815451622009, -0.43921568989753723, 0.43921568989753723), (0.44957983493804932, -0.44313725829124451, 0.44313725829124451), (0.45378151535987854, -0.44705882668495178, 0.44705882668495178), (0.45798319578170776, -0.45098039507865906, 0.45098039507865906), (0.46218487620353699, -0.45882353186607361, 0.45882353186607361), (0.46638655662536621, -0.46274510025978088, 0.46274510025978088), (0.47058823704719543, -0.46666666865348816, 0.46666666865348816), (0.47478991746902466, -0.47058823704719543, 0.47058823704719543), (0.47899159789085388, -0.47450980544090271, 0.47450980544090271), (0.48319327831268311, -0.47843137383460999, 0.47843137383460999), (0.48739495873451233, -0.48235294222831726, 0.48235294222831726), (0.49159663915634155, -0.48627451062202454, 0.48627451062202454), (0.49579831957817078, -0.49019607901573181, 0.49019607901573181), (0.5, 0.49411764740943909, -0.49411764740943909), (0.50420171022415161, 0.50196081399917603, -0.50196081399917603), (0.50840336084365845, 0.5058823823928833, -0.5058823823928833), (0.51260507106781006, 0.50980395078659058, -0.50980395078659058), (0.51680672168731689, 0.51372551918029785, -0.51372551918029785), (0.52100843191146851, 0.51764708757400513, -0.51764708757400513), (0.52521008253097534, 0.5215686559677124, -0.5215686559677124), (0.52941179275512695, 0.52549022436141968, -0.52549022436141968), (0.53361344337463379, 0.52941179275512695, -0.52941179275512695), (0.5378151535987854, 0.53333336114883423, -0.53333336114883423), (0.54201680421829224, 0.5372549295425415, -0.5372549295425415), (0.54621851444244385, 0.54509806632995605, -0.54509806632995605), (0.55042016506195068, 0.54901963472366333, -0.54901963472366333), (0.55462187528610229, 0.55294120311737061, -0.55294120311737061), (0.55882352590560913, 0.55686277151107788, -0.55686277151107788), (0.56302523612976074, 0.56078433990478516, -0.56078433990478516), (0.56722688674926758, 0.56470590829849243, -0.56470590829849243), (0.57142859697341919, 0.56862747669219971, -0.56862747669219971), (0.57563024759292603, 0.57254904508590698, -0.57254904508590698), (0.57983195781707764, 0.57647061347961426, -0.57647061347961426), (0.58403360843658447, 0.58039218187332153, -0.58039218187332153), (0.58823531866073608, 0.58431375026702881, -0.58431375026702881), (0.59243696928024292, 0.58823531866073608, -0.58823531866073608), (0.59663867950439453, 0.59215688705444336, -0.59215688705444336), (0.60084033012390137, 0.59607845544815063, -0.59607845544815063), (0.60504204034805298, 0.60000002384185791, -0.60000002384185791), (0.60924369096755981, 0.60392159223556519, -0.60392159223556519), (0.61344540119171143, 0.60784316062927246, -0.60784316062927246), (0.61764705181121826, 0.61176472902297974, -0.61176472902297974), (0.62184876203536987, 0.61568629741668701, -0.61568629741668701), (0.62605041265487671, 0.61960786581039429, -0.61960786581039429), (0.63025212287902832, 0.62745100259780884, -0.62745100259780884), (0.63445377349853516, 0.63137257099151611, -0.63137257099151611), (0.63865548372268677, 0.63529413938522339, -0.63529413938522339), (0.6428571343421936, 0.63921570777893066, -0.63921570777893066), (0.64705884456634521, 0.64313727617263794, -0.64313727617263794), (0.65126049518585205, 0.64705884456634521, -0.64705884456634521), (0.65546220541000366, 0.65098041296005249, -0.65098041296005249), (0.6596638560295105, 0.65490198135375977, -0.65490198135375977), (0.66386556625366211, 0.65882354974746704, -0.65882354974746704), (0.66806721687316895, 0.66274511814117432, -0.66274511814117432), (0.67226892709732056, 0.66666668653488159, -0.66666668653488159), (0.67647057771682739, 0.67058825492858887, -0.67058825492858887), (0.680672287940979, 0.67450982332229614, -0.67450982332229614), (0.68487393856048584, 0.67843139171600342, -0.67843139171600342), (0.68907564878463745, 0.68235296010971069, -0.68235296010971069), (0.69327729940414429, 0.68627452850341797, -0.68627452850341797), (0.6974790096282959, 0.69019609689712524, -0.69019609689712524), (0.70168066024780273, 0.69411766529083252, -0.69411766529083252), (0.70588237047195435, 0.69803923368453979, -0.69803923368453979), (0.71008402109146118, 0.70196080207824707, -0.70196080207824707), (0.71428573131561279, 0.70980393886566162, -0.70980393886566162), (0.71848738193511963, 0.7137255072593689, -0.7137255072593689), (0.72268909215927124, 0.71764707565307617, -0.71764707565307617), (0.72689074277877808, 0.72156864404678345, -0.72156864404678345), (0.73109245300292969, 0.72549021244049072, -0.72549021244049072), (0.73529410362243652, 0.729411780834198, -0.729411780834198), (0.73949581384658813, 0.73333334922790527, -0.73333334922790527), (0.74369746446609497, 0.73725491762161255, -0.73725491762161255), (0.74789917469024658, 0.74117648601531982, -0.74117648601531982), (0.75210082530975342, 0.7450980544090271, -0.7450980544090271), (0.75630253553390503, 0.75294119119644165, -0.75294119119644165), (0.76050418615341187, 0.75686275959014893, -0.75686275959014893), (0.76470589637756348, 0.7607843279838562, -0.7607843279838562), (0.76890754699707031, 0.76470589637756348, -0.76470589637756348), (0.77310925722122192, 0.76862746477127075, -0.76862746477127075), (0.77731090784072876, 0.77254903316497803, -0.77254903316497803), (0.78151261806488037, 0.7764706015586853, -0.7764706015586853), (0.78571426868438721, 0.78039216995239258, -0.78039216995239258), (0.78991597890853882, 0.78431373834609985, -0.78431373834609985), (0.79411762952804565, 0.78823530673980713, -0.78823530673980713), (0.79831933975219727, 0.79607844352722168, -0.79607844352722168), (0.8025209903717041, 0.80000001192092896, -0.80000001192092896), (0.80672270059585571, 0.80392158031463623, -0.80392158031463623), (0.81092435121536255, 0.80784314870834351, -0.80784314870834351), (0.81512606143951416, 0.81176471710205078, -0.81176471710205078), (0.819327712059021, 0.81568628549575806, -0.81568628549575806), (0.82352942228317261, 0.81960785388946533, -0.81960785388946533), (0.82773107290267944, 0.82352942228317261, -0.82352942228317261), (0.83193278312683105, 0.82745099067687988, -0.82745099067687988), (0.83613443374633789, 0.83137255907058716, -0.83137255907058716), (0.8403361439704895, 0.83529412746429443, -0.83529412746429443), (0.84453779458999634, 0.83921569585800171, -0.83921569585800171), (0.84873950481414795, 0.84313726425170898, -0.84313726425170898), (0.85294115543365479, 0.84705883264541626, -0.84705883264541626), (0.8571428656578064, 0.85098040103912354, -0.85098040103912354), (0.86134451627731323, 0.85490196943283081, -0.85490196943283081), (0.86554622650146484, 0.85882353782653809, -0.85882353782653809), (0.86974787712097168, 0.86274510622024536, -0.86274510622024536), (0.87394958734512329, 0.86666667461395264, -0.86666667461395264), (0.87815123796463013, 0.87058824300765991, -0.87058824300765991), (0.88235294818878174, 0.87843137979507446, -0.87843137979507446), (0.88655459880828857, 0.88235294818878174, -0.88235294818878174), (0.89075630903244019, 0.88627451658248901, -0.88627451658248901), (0.89495795965194702, 0.89019608497619629, -0.89019608497619629), (0.89915966987609863, 0.89411765336990356, -0.89411765336990356), (0.90336132049560547, 0.89803922176361084, -0.89803922176361084), (0.90756303071975708, 0.90196079015731812, -0.90196079015731812), (0.91176468133926392, 0.90588235855102539, -0.90588235855102539), (0.91596639156341553, 0.90980392694473267, -0.90980392694473267), (0.92016804218292236, 0.91372549533843994, -0.91372549533843994), (0.92436975240707397, 0.91764706373214722, -0.91764706373214722), (0.92857140302658081, 0.92156863212585449, -0.92156863212585449), (0.93277311325073242, 0.92549020051956177, -0.92549020051956177), (0.93697476387023926, 0.92941176891326904, -0.92941176891326904), (0.94117647409439087, 0.93333333730697632, -0.93333333730697632), (0.94537812471389771, 0.93725490570068359, -0.93725490570068359), (0.94957983493804932, 0.94117647409439087, -0.94117647409439087), (0.95378148555755615, 0.94509804248809814, -0.94509804248809814), (0.95798319578170776, 0.94901961088180542, -0.94901961088180542), (0.9621848464012146, 0.9529411792755127, -0.9529411792755127), (0.96638655662536621, 0.96078431606292725, -0.96078431606292725), (0.97058820724487305, 0.96470588445663452, -0.96470588445663452), (0.97478991746902466, 0.9686274528503418, -0.9686274528503418), (0.97899156808853149, 0.97254902124404907, -0.97254902124404907), (0.98319327831268311, 0.97647058963775635, -0.97647058963775635), (0.98739492893218994, 0.98039215803146362, -0.98039215803146362), (0.99159663915634155, 0.9843137264251709, -0.9843137264251709), (0.99579828977584839, 0.98823529481887817, -0.98823529481887817), (1.0, 0.99215686321258545, 0.99215686321258545)]} -_gist_yarg_data = {'blue': [(0.0, 1.0, 1.0), (0.0042016808874905109, -0.99607843160629272, 0.99607843160629272), (0.0084033617749810219, -0.99215686321258545, 0.99215686321258545), (0.012605042196810246, -0.98823529481887817, 0.98823529481887817), (0.016806723549962044, -0.9843137264251709, 0.9843137264251709), (0.021008403971791267, -0.98039215803146362, 0.98039215803146362), (0.025210084393620491, -0.97647058963775635, 0.97647058963775635), (0.029411764815449715, -0.97254902124404907, 0.97254902124404907), (0.033613447099924088, -0.96470588445663452, 0.96470588445663452), (0.037815127521753311, -0.96078431606292725, 0.96078431606292725), (0.042016807943582535, -0.95686274766921997, 0.95686274766921997), (0.046218488365411758, -0.9529411792755127, 0.9529411792755127), (0.050420168787240982, -0.94901961088180542, 0.94901961088180542), (0.054621849209070206, -0.94509804248809814, 0.94509804248809814), (0.058823529630899429, -0.94117647409439087, 0.94117647409439087), (0.063025213778018951, -0.93725490570068359, 0.93725490570068359), (0.067226894199848175, -0.93333333730697632, 0.93333333730697632), (0.071428574621677399, -0.92941176891326904, 0.92941176891326904), (0.075630255043506622, -0.92549020051956177, 0.92549020051956177), (0.079831935465335846, -0.92156863212585449, 0.92156863212585449), (0.08403361588716507, -0.91764706373214722, 0.91764706373214722), (0.088235296308994293, -0.91372549533843994, 0.91372549533843994), (0.092436976730823517, -0.90980392694473267, 0.90980392694473267), (0.09663865715265274, -0.90196079015731812, 0.90196079015731812), (0.10084033757448196, -0.89803922176361084, 0.89803922176361084), (0.10504201799631119, -0.89411765336990356, 0.89411765336990356), (0.10924369841814041, -0.89019608497619629, 0.89019608497619629), (0.11344537883996964, -0.88627451658248901, 0.88627451658248901), (0.11764705926179886, -0.88235294818878174, 0.88235294818878174), (0.12184873968362808, -0.87843137979507446, 0.87843137979507446), (0.1260504275560379, -0.87450981140136719, 0.87450981140136719), (0.13025210797786713, -0.87058824300765991, 0.87058824300765991), (0.13445378839969635, -0.86666667461395264, 0.86666667461395264), (0.13865546882152557, -0.86274510622024536, 0.86274510622024536), (0.1428571492433548, -0.85882353782653809, 0.85882353782653809), (0.14705882966518402, -0.85490196943283081, 0.85490196943283081), (0.15126051008701324, -0.85098040103912354, 0.85098040103912354), (0.15546219050884247, -0.84705883264541626, 0.84705883264541626), (0.15966387093067169, -0.83921569585800171, 0.83921569585800171), (0.16386555135250092, -0.83529412746429443, 0.83529412746429443), (0.16806723177433014, -0.83137255907058716, 0.83137255907058716), (0.17226891219615936, -0.82745099067687988, 0.82745099067687988), (0.17647059261798859, -0.82352942228317261, 0.82352942228317261), (0.18067227303981781, -0.81960785388946533, 0.81960785388946533), (0.18487395346164703, -0.81568628549575806, 0.81568628549575806), (0.18907563388347626, -0.81176471710205078, 0.81176471710205078), (0.19327731430530548, -0.80784314870834351, 0.80784314870834351), (0.1974789947271347, -0.80392158031463623, 0.80392158031463623), (0.20168067514896393, -0.80000001192092896, 0.80000001192092896), (0.20588235557079315, -0.79607844352722168, 0.79607844352722168), (0.21008403599262238, -0.7921568751335144, 0.7921568751335144), (0.2142857164144516, -0.78823530673980713, 0.78823530673980713), (0.21848739683628082, -0.78431373834609985, 0.78431373834609985), (0.22268907725811005, -0.7764706015586853, 0.7764706015586853), (0.22689075767993927, -0.77254903316497803, 0.77254903316497803), (0.23109243810176849, -0.76862746477127075, 0.76862746477127075), (0.23529411852359772, -0.76470589637756348, 0.76470589637756348), (0.23949579894542694, -0.7607843279838562, 0.7607843279838562), (0.24369747936725616, -0.75686275959014893, 0.75686275959014893), (0.24789915978908539, -0.75294119119644165, 0.75294119119644165), (0.25210085511207581, -0.74901962280273438, 0.74901962280273438), (0.25630253553390503, -0.7450980544090271, 0.7450980544090271), (0.26050421595573425, -0.74117648601531982, 0.74117648601531982), (0.26470589637756348, -0.73725491762161255, 0.73725491762161255), (0.2689075767993927, -0.73333334922790527, 0.73333334922790527), (0.27310925722122192, -0.729411780834198, 0.729411780834198), (0.27731093764305115, -0.72549021244049072, 0.72549021244049072), (0.28151261806488037, -0.72156864404678345, 0.72156864404678345), (0.28571429848670959, -0.7137255072593689, 0.7137255072593689), (0.28991597890853882, -0.70980393886566162, 0.70980393886566162), (0.29411765933036804, -0.70588237047195435, 0.70588237047195435), (0.29831933975219727, -0.70196080207824707, 0.70196080207824707), (0.30252102017402649, -0.69803923368453979, 0.69803923368453979), (0.30672270059585571, -0.69411766529083252, 0.69411766529083252), (0.31092438101768494, -0.69019609689712524, 0.69019609689712524), (0.31512606143951416, -0.68627452850341797, 0.68627452850341797), (0.31932774186134338, -0.68235296010971069, 0.68235296010971069), (0.32352942228317261, -0.67843139171600342, 0.67843139171600342), (0.32773110270500183, -0.67450982332229614, 0.67450982332229614), (0.33193278312683105, -0.67058825492858887, 0.67058825492858887), (0.33613446354866028, -0.66666668653488159, 0.66666668653488159), (0.3403361439704895, -0.66274511814117432, 0.66274511814117432), (0.34453782439231873, -0.65882354974746704, 0.65882354974746704), (0.34873950481414795, -0.65098041296005249, 0.65098041296005249), (0.35294118523597717, -0.64705884456634521, 0.64705884456634521), (0.3571428656578064, -0.64313727617263794, 0.64313727617263794), (0.36134454607963562, -0.63921570777893066, 0.63921570777893066), (0.36554622650146484, -0.63529413938522339, 0.63529413938522339), (0.36974790692329407, -0.63137257099151611, 0.63137257099151611), (0.37394958734512329, -0.62745100259780884, 0.62745100259780884), (0.37815126776695251, -0.62352943420410156, 0.62352943420410156), (0.38235294818878174, -0.61960786581039429, 0.61960786581039429), (0.38655462861061096, -0.61568629741668701, 0.61568629741668701), (0.39075630903244019, -0.61176472902297974, 0.61176472902297974), (0.39495798945426941, -0.60784316062927246, 0.60784316062927246), (0.39915966987609863, -0.60392159223556519, 0.60392159223556519), (0.40336135029792786, -0.60000002384185791, 0.60000002384185791), (0.40756303071975708, -0.59607845544815063, 0.59607845544815063), (0.4117647111415863, -0.58823531866073608, 0.58823531866073608), (0.41596639156341553, -0.58431375026702881, 0.58431375026702881), (0.42016807198524475, -0.58039218187332153, 0.58039218187332153), (0.42436975240707397, -0.57647061347961426, 0.57647061347961426), (0.4285714328289032, -0.57254904508590698, 0.57254904508590698), (0.43277311325073242, -0.56862747669219971, 0.56862747669219971), (0.43697479367256165, -0.56470590829849243, 0.56470590829849243), (0.44117647409439087, -0.56078433990478516, 0.56078433990478516), (0.44537815451622009, -0.55686277151107788, 0.55686277151107788), (0.44957983493804932, -0.55294120311737061, 0.55294120311737061), (0.45378151535987854, -0.54901963472366333, 0.54901963472366333), (0.45798319578170776, -0.54509806632995605, 0.54509806632995605), (0.46218487620353699, -0.54117649793624878, 0.54117649793624878), (0.46638655662536621, -0.5372549295425415, 0.5372549295425415), (0.47058823704719543, -0.53333336114883423, 0.53333336114883423), (0.47478991746902466, -0.52549022436141968, 0.52549022436141968), (0.47899159789085388, -0.5215686559677124, 0.5215686559677124), (0.48319327831268311, -0.51764708757400513, 0.51764708757400513), (0.48739495873451233, -0.51372551918029785, 0.51372551918029785), (0.49159663915634155, -0.50980395078659058, 0.50980395078659058), (0.49579831957817078, -0.5058823823928833, 0.5058823823928833), (0.5, 0.50196081399917603, -0.50196081399917603), (0.50420171022415161, 0.49803921580314636, -0.49803921580314636), (0.50840336084365845, 0.49411764740943909, -0.49411764740943909), (0.51260507106781006, 0.49019607901573181, -0.49019607901573181), (0.51680672168731689, 0.48627451062202454, -0.48627451062202454), (0.52100843191146851, 0.48235294222831726, -0.48235294222831726), (0.52521008253097534, 0.47843137383460999, -0.47843137383460999), (0.52941179275512695, 0.47450980544090271, -0.47450980544090271), (0.53361344337463379, 0.47058823704719543, -0.47058823704719543), (0.5378151535987854, 0.46274510025978088, -0.46274510025978088), (0.54201680421829224, 0.45882353186607361, -0.45882353186607361), (0.54621851444244385, 0.45490196347236633, -0.45490196347236633), (0.55042016506195068, 0.45098039507865906, -0.45098039507865906), (0.55462187528610229, 0.44705882668495178, -0.44705882668495178), (0.55882352590560913, 0.44313725829124451, -0.44313725829124451), (0.56302523612976074, 0.43921568989753723, -0.43921568989753723), (0.56722688674926758, 0.43529412150382996, -0.43529412150382996), (0.57142859697341919, 0.43137255311012268, -0.43137255311012268), (0.57563024759292603, 0.42745098471641541, -0.42745098471641541), (0.57983195781707764, 0.42352941632270813, -0.42352941632270813), (0.58403360843658447, 0.41960784792900085, -0.41960784792900085), (0.58823531866073608, 0.41568627953529358, -0.41568627953529358), (0.59243696928024292, 0.4117647111415863, -0.4117647111415863), (0.59663867950439453, 0.40784314274787903, -0.40784314274787903), (0.60084033012390137, 0.40000000596046448, -0.40000000596046448), (0.60504204034805298, 0.3960784375667572, -0.3960784375667572), (0.60924369096755981, 0.39215686917304993, -0.39215686917304993), (0.61344540119171143, 0.38823530077934265, -0.38823530077934265), (0.61764705181121826, 0.38431373238563538, -0.38431373238563538), (0.62184876203536987, 0.3803921639919281, -0.3803921639919281), (0.62605041265487671, 0.37647059559822083, -0.37647059559822083), (0.63025212287902832, 0.37254902720451355, -0.37254902720451355), (0.63445377349853516, 0.36862745881080627, -0.36862745881080627), (0.63865548372268677, 0.364705890417099, -0.364705890417099), (0.6428571343421936, 0.36078432202339172, -0.36078432202339172), (0.64705884456634521, 0.35686275362968445, -0.35686275362968445), (0.65126049518585205, 0.35294118523597717, -0.35294118523597717), (0.65546220541000366, 0.3490196168422699, -0.3490196168422699), (0.6596638560295105, 0.34509804844856262, -0.34509804844856262), (0.66386556625366211, 0.33725491166114807, -0.33725491166114807), (0.66806721687316895, 0.3333333432674408, -0.3333333432674408), (0.67226892709732056, 0.32941177487373352, -0.32941177487373352), (0.67647057771682739, 0.32549020648002625, -0.32549020648002625), (0.680672287940979, 0.32156863808631897, -0.32156863808631897), (0.68487393856048584, 0.31764706969261169, -0.31764706969261169), (0.68907564878463745, 0.31372550129890442, -0.31372550129890442), (0.69327729940414429, 0.30980393290519714, -0.30980393290519714), (0.6974790096282959, 0.30588236451148987, -0.30588236451148987), (0.70168066024780273, 0.30196079611778259, -0.30196079611778259), (0.70588237047195435, 0.29803922772407532, -0.29803922772407532), (0.71008402109146118, 0.29411765933036804, -0.29411765933036804), (0.71428573131561279, 0.29019609093666077, -0.29019609093666077), (0.71848738193511963, 0.28627452254295349, -0.28627452254295349), (0.72268909215927124, 0.28235295414924622, -0.28235295414924622), (0.72689074277877808, 0.27450981736183167, -0.27450981736183167), (0.73109245300292969, 0.27058824896812439, -0.27058824896812439), (0.73529410362243652, 0.26666668057441711, -0.26666668057441711), (0.73949581384658813, 0.26274511218070984, -0.26274511218070984), (0.74369746446609497, 0.25882354378700256, -0.25882354378700256), (0.74789917469024658, 0.25490197539329529, -0.25490197539329529), (0.75210082530975342, 0.25098040699958801, -0.25098040699958801), (0.75630253553390503, 0.24705882370471954, -0.24705882370471954), (0.76050418615341187, 0.24313725531101227, -0.24313725531101227), (0.76470589637756348, 0.23921568691730499, -0.23921568691730499), (0.76890754699707031, 0.23529411852359772, -0.23529411852359772), (0.77310925722122192, 0.23137255012989044, -0.23137255012989044), (0.77731090784072876, 0.22745098173618317, -0.22745098173618317), (0.78151261806488037, 0.22352941334247589, -0.22352941334247589), (0.78571426868438721, 0.21960784494876862, -0.21960784494876862), (0.78991597890853882, 0.21176470816135406, -0.21176470816135406), (0.79411762952804565, 0.20784313976764679, -0.20784313976764679), (0.79831933975219727, 0.20392157137393951, -0.20392157137393951), (0.8025209903717041, 0.20000000298023224, -0.20000000298023224), (0.80672270059585571, 0.19607843458652496, -0.19607843458652496), (0.81092435121536255, 0.19215686619281769, -0.19215686619281769), (0.81512606143951416, 0.18823529779911041, -0.18823529779911041), (0.819327712059021, 0.18431372940540314, -0.18431372940540314), (0.82352942228317261, 0.18039216101169586, -0.18039216101169586), (0.82773107290267944, 0.17647059261798859, -0.17647059261798859), (0.83193278312683105, 0.17254902422428131, -0.17254902422428131), (0.83613443374633789, 0.16862745583057404, -0.16862745583057404), (0.8403361439704895, 0.16470588743686676, -0.16470588743686676), (0.84453779458999634, 0.16078431904315948, -0.16078431904315948), (0.84873950481414795, 0.15686275064945221, -0.15686275064945221), (0.85294115543365479, 0.14901961386203766, -0.14901961386203766), (0.8571428656578064, 0.14509804546833038, -0.14509804546833038), (0.86134451627731323, 0.14117647707462311, -0.14117647707462311), (0.86554622650146484, 0.13725490868091583, -0.13725490868091583), (0.86974787712097168, 0.13333334028720856, -0.13333334028720856), (0.87394958734512329, 0.12941177189350128, -0.12941177189350128), (0.87815123796463013, 0.12549020349979401, -0.12549020349979401), (0.88235294818878174, 0.12156862765550613, -0.12156862765550613), (0.88655459880828857, 0.11764705926179886, -0.11764705926179886), (0.89075630903244019, 0.11372549086809158, -0.11372549086809158), (0.89495795965194702, 0.10980392247438431, -0.10980392247438431), (0.89915966987609863, 0.10588235408067703, -0.10588235408067703), (0.90336132049560547, 0.10196078568696976, -0.10196078568696976), (0.90756303071975708, 0.098039217293262482, -0.098039217293262482), (0.91176468133926392, 0.094117648899555206, -0.094117648899555206), (0.91596639156341553, 0.086274512112140656, -0.086274512112140656), (0.92016804218292236, 0.08235294371843338, -0.08235294371843338), (0.92436975240707397, 0.078431375324726105, -0.078431375324726105), (0.92857140302658081, 0.074509806931018829, -0.074509806931018829), (0.93277311325073242, 0.070588238537311554, -0.070588238537311554), (0.93697476387023926, 0.066666670143604279, -0.066666670143604279), (0.94117647409439087, 0.062745101749897003, -0.062745101749897003), (0.94537812471389771, 0.058823529630899429, -0.058823529630899429), (0.94957983493804932, 0.054901961237192154, -0.054901961237192154), (0.95378148555755615, 0.050980392843484879, -0.050980392843484879), (0.95798319578170776, 0.047058824449777603, -0.047058824449777603), (0.9621848464012146, 0.043137256056070328, -0.043137256056070328), (0.96638655662536621, 0.039215687662363052, -0.039215687662363052), (0.97058820724487305, 0.035294119268655777, -0.035294119268655777), (0.97478991746902466, 0.031372550874948502, -0.031372550874948502), (0.97899156808853149, 0.023529412224888802, -0.023529412224888802), (0.98319327831268311, 0.019607843831181526, -0.019607843831181526), (0.98739492893218994, 0.015686275437474251, -0.015686275437474251), (0.99159663915634155, 0.011764706112444401, -0.011764706112444401), (0.99579828977584839, 0.0078431377187371254, -0.0078431377187371254), (1.0, 0.0039215688593685627, -0.0039215688593685627)], 'green': [(0.0, 1.0, 1.0), -(0.0042016808874905109, 0.99607843160629272, 0.99607843160629272), -(0.0084033617749810219, 0.99215686321258545, 0.99215686321258545), -(0.012605042196810246, 0.98823529481887817, 0.98823529481887817), -(0.016806723549962044, 0.9843137264251709, 0.9843137264251709), -(0.021008403971791267, 0.98039215803146362, 0.98039215803146362), -(0.025210084393620491, 0.97647058963775635, 0.97647058963775635), -(0.029411764815449715, 0.97254902124404907, 0.97254902124404907), -(0.033613447099924088, 0.96470588445663452, 0.96470588445663452), -(0.037815127521753311, 0.96078431606292725, 0.96078431606292725), -(0.042016807943582535, 0.95686274766921997, 0.95686274766921997), -(0.046218488365411758, 0.9529411792755127, 0.9529411792755127), -(0.050420168787240982, 0.94901961088180542, 0.94901961088180542), -(0.054621849209070206, 0.94509804248809814, 0.94509804248809814), -(0.058823529630899429, 0.94117647409439087, 0.94117647409439087), -(0.063025213778018951, 0.93725490570068359, 0.93725490570068359), -(0.067226894199848175, 0.93333333730697632, 0.93333333730697632), -(0.071428574621677399, 0.92941176891326904, 0.92941176891326904), -(0.075630255043506622, 0.92549020051956177, 0.92549020051956177), -(0.079831935465335846, 0.92156863212585449, 0.92156863212585449), -(0.08403361588716507, 0.91764706373214722, 0.91764706373214722), -(0.088235296308994293, 0.91372549533843994, 0.91372549533843994), -(0.092436976730823517, 0.90980392694473267, 0.90980392694473267), -(0.09663865715265274, 0.90196079015731812, 0.90196079015731812), -(0.10084033757448196, 0.89803922176361084, 0.89803922176361084), -(0.10504201799631119, 0.89411765336990356, 0.89411765336990356), -(0.10924369841814041, 0.89019608497619629, 0.89019608497619629), -(0.11344537883996964, 0.88627451658248901, 0.88627451658248901), -(0.11764705926179886, 0.88235294818878174, 0.88235294818878174), -(0.12184873968362808, 0.87843137979507446, 0.87843137979507446), -(0.1260504275560379, 0.87450981140136719, 0.87450981140136719), -(0.13025210797786713, 0.87058824300765991, 0.87058824300765991), -(0.13445378839969635, 0.86666667461395264, 0.86666667461395264), -(0.13865546882152557, 0.86274510622024536, 0.86274510622024536), -(0.1428571492433548, 0.85882353782653809, 0.85882353782653809), -(0.14705882966518402, 0.85490196943283081, 0.85490196943283081), -(0.15126051008701324, 0.85098040103912354, 0.85098040103912354), -(0.15546219050884247, 0.84705883264541626, 0.84705883264541626), -(0.15966387093067169, 0.83921569585800171, 0.83921569585800171), -(0.16386555135250092, 0.83529412746429443, 0.83529412746429443), -(0.16806723177433014, 0.83137255907058716, 0.83137255907058716), -(0.17226891219615936, 0.82745099067687988, 0.82745099067687988), -(0.17647059261798859, 0.82352942228317261, 0.82352942228317261), -(0.18067227303981781, 0.81960785388946533, 0.81960785388946533), -(0.18487395346164703, 0.81568628549575806, 0.81568628549575806), -(0.18907563388347626, 0.81176471710205078, 0.81176471710205078), -(0.19327731430530548, 0.80784314870834351, 0.80784314870834351), -(0.1974789947271347, 0.80392158031463623, 0.80392158031463623), -(0.20168067514896393, 0.80000001192092896, 0.80000001192092896), -(0.20588235557079315, 0.79607844352722168, 0.79607844352722168), -(0.21008403599262238, 0.7921568751335144, 0.7921568751335144), -(0.2142857164144516, 0.78823530673980713, 0.78823530673980713), -(0.21848739683628082, 0.78431373834609985, 0.78431373834609985), -(0.22268907725811005, 0.7764706015586853, 0.7764706015586853), -(0.22689075767993927, 0.77254903316497803, 0.77254903316497803), -(0.23109243810176849, 0.76862746477127075, 0.76862746477127075), -(0.23529411852359772, 0.76470589637756348, 0.76470589637756348), -(0.23949579894542694, 0.7607843279838562, 0.7607843279838562), -(0.24369747936725616, 0.75686275959014893, 0.75686275959014893), -(0.24789915978908539, 0.75294119119644165, 0.75294119119644165), -(0.25210085511207581, 0.74901962280273438, 0.74901962280273438), -(0.25630253553390503, 0.7450980544090271, 0.7450980544090271), -(0.26050421595573425, 0.74117648601531982, 0.74117648601531982), -(0.26470589637756348, 0.73725491762161255, 0.73725491762161255), -(0.2689075767993927, 0.73333334922790527, 0.73333334922790527), -(0.27310925722122192, 0.729411780834198, 0.729411780834198), -(0.27731093764305115, 0.72549021244049072, 0.72549021244049072), -(0.28151261806488037, 0.72156864404678345, 0.72156864404678345), -(0.28571429848670959, 0.7137255072593689, 0.7137255072593689), -(0.28991597890853882, 0.70980393886566162, 0.70980393886566162), -(0.29411765933036804, 0.70588237047195435, 0.70588237047195435), -(0.29831933975219727, 0.70196080207824707, 0.70196080207824707), -(0.30252102017402649, 0.69803923368453979, 0.69803923368453979), -(0.30672270059585571, 0.69411766529083252, 0.69411766529083252), -(0.31092438101768494, 0.69019609689712524, 0.69019609689712524), -(0.31512606143951416, 0.68627452850341797, 0.68627452850341797), -(0.31932774186134338, 0.68235296010971069, 0.68235296010971069), -(0.32352942228317261, 0.67843139171600342, 0.67843139171600342), -(0.32773110270500183, 0.67450982332229614, 0.67450982332229614), -(0.33193278312683105, 0.67058825492858887, 0.67058825492858887), -(0.33613446354866028, 0.66666668653488159, 0.66666668653488159), -(0.3403361439704895, 0.66274511814117432, 0.66274511814117432), -(0.34453782439231873, 0.65882354974746704, 0.65882354974746704), -(0.34873950481414795, 0.65098041296005249, 0.65098041296005249), -(0.35294118523597717, 0.64705884456634521, 0.64705884456634521), -(0.3571428656578064, 0.64313727617263794, 0.64313727617263794), -(0.36134454607963562, 0.63921570777893066, 0.63921570777893066), -(0.36554622650146484, 0.63529413938522339, 0.63529413938522339), -(0.36974790692329407, 0.63137257099151611, 0.63137257099151611), -(0.37394958734512329, 0.62745100259780884, 0.62745100259780884), -(0.37815126776695251, 0.62352943420410156, 0.62352943420410156), -(0.38235294818878174, 0.61960786581039429, 0.61960786581039429), -(0.38655462861061096, 0.61568629741668701, 0.61568629741668701), -(0.39075630903244019, 0.61176472902297974, 0.61176472902297974), -(0.39495798945426941, 0.60784316062927246, 0.60784316062927246), -(0.39915966987609863, 0.60392159223556519, 0.60392159223556519), -(0.40336135029792786, 0.60000002384185791, 0.60000002384185791), -(0.40756303071975708, 0.59607845544815063, 0.59607845544815063), -(0.4117647111415863, 0.58823531866073608, 0.58823531866073608), -(0.41596639156341553, 0.58431375026702881, 0.58431375026702881), -(0.42016807198524475, 0.58039218187332153, 0.58039218187332153), -(0.42436975240707397, 0.57647061347961426, 0.57647061347961426), -(0.4285714328289032, 0.57254904508590698, 0.57254904508590698), -(0.43277311325073242, 0.56862747669219971, 0.56862747669219971), -(0.43697479367256165, 0.56470590829849243, 0.56470590829849243), -(0.44117647409439087, 0.56078433990478516, 0.56078433990478516), -(0.44537815451622009, 0.55686277151107788, 0.55686277151107788), -(0.44957983493804932, 0.55294120311737061, 0.55294120311737061), -(0.45378151535987854, 0.54901963472366333, 0.54901963472366333), -(0.45798319578170776, 0.54509806632995605, 0.54509806632995605), -(0.46218487620353699, 0.54117649793624878, 0.54117649793624878), -(0.46638655662536621, 0.5372549295425415, 0.5372549295425415), -(0.47058823704719543, 0.53333336114883423, 0.53333336114883423), -(0.47478991746902466, 0.52549022436141968, 0.52549022436141968), -(0.47899159789085388, 0.5215686559677124, 0.5215686559677124), -(0.48319327831268311, 0.51764708757400513, 0.51764708757400513), -(0.48739495873451233, 0.51372551918029785, 0.51372551918029785), -(0.49159663915634155, 0.50980395078659058, 0.50980395078659058), -(0.49579831957817078, 0.5058823823928833, 0.5058823823928833), (0.5, -0.50196081399917603, 0.50196081399917603), (0.50420171022415161, -0.49803921580314636, 0.49803921580314636), (0.50840336084365845, -0.49411764740943909, 0.49411764740943909), (0.51260507106781006, -0.49019607901573181, 0.49019607901573181), (0.51680672168731689, -0.48627451062202454, 0.48627451062202454), (0.52100843191146851, -0.48235294222831726, 0.48235294222831726), (0.52521008253097534, -0.47843137383460999, 0.47843137383460999), (0.52941179275512695, -0.47450980544090271, 0.47450980544090271), (0.53361344337463379, -0.47058823704719543, 0.47058823704719543), (0.5378151535987854, -0.46274510025978088, 0.46274510025978088), (0.54201680421829224, -0.45882353186607361, 0.45882353186607361), (0.54621851444244385, -0.45490196347236633, 0.45490196347236633), (0.55042016506195068, -0.45098039507865906, 0.45098039507865906), (0.55462187528610229, -0.44705882668495178, 0.44705882668495178), (0.55882352590560913, -0.44313725829124451, 0.44313725829124451), (0.56302523612976074, -0.43921568989753723, 0.43921568989753723), (0.56722688674926758, -0.43529412150382996, 0.43529412150382996), (0.57142859697341919, -0.43137255311012268, 0.43137255311012268), (0.57563024759292603, -0.42745098471641541, 0.42745098471641541), (0.57983195781707764, -0.42352941632270813, 0.42352941632270813), (0.58403360843658447, -0.41960784792900085, 0.41960784792900085), (0.58823531866073608, -0.41568627953529358, 0.41568627953529358), (0.59243696928024292, -0.4117647111415863, 0.4117647111415863), (0.59663867950439453, -0.40784314274787903, 0.40784314274787903), (0.60084033012390137, -0.40000000596046448, 0.40000000596046448), (0.60504204034805298, -0.3960784375667572, 0.3960784375667572), (0.60924369096755981, -0.39215686917304993, 0.39215686917304993), (0.61344540119171143, -0.38823530077934265, 0.38823530077934265), (0.61764705181121826, -0.38431373238563538, 0.38431373238563538), (0.62184876203536987, -0.3803921639919281, 0.3803921639919281), (0.62605041265487671, -0.37647059559822083, 0.37647059559822083), (0.63025212287902832, -0.37254902720451355, 0.37254902720451355), (0.63445377349853516, -0.36862745881080627, 0.36862745881080627), (0.63865548372268677, -0.364705890417099, 0.364705890417099), (0.6428571343421936, -0.36078432202339172, 0.36078432202339172), (0.64705884456634521, -0.35686275362968445, 0.35686275362968445), (0.65126049518585205, -0.35294118523597717, 0.35294118523597717), (0.65546220541000366, -0.3490196168422699, 0.3490196168422699), (0.6596638560295105, -0.34509804844856262, 0.34509804844856262), (0.66386556625366211, -0.33725491166114807, 0.33725491166114807), (0.66806721687316895, -0.3333333432674408, 0.3333333432674408), (0.67226892709732056, -0.32941177487373352, 0.32941177487373352), (0.67647057771682739, -0.32549020648002625, 0.32549020648002625), (0.680672287940979, -0.32156863808631897, 0.32156863808631897), (0.68487393856048584, -0.31764706969261169, 0.31764706969261169), (0.68907564878463745, -0.31372550129890442, 0.31372550129890442), (0.69327729940414429, -0.30980393290519714, 0.30980393290519714), (0.6974790096282959, -0.30588236451148987, 0.30588236451148987), (0.70168066024780273, -0.30196079611778259, 0.30196079611778259), (0.70588237047195435, -0.29803922772407532, 0.29803922772407532), (0.71008402109146118, -0.29411765933036804, 0.29411765933036804), (0.71428573131561279, -0.29019609093666077, 0.29019609093666077), (0.71848738193511963, -0.28627452254295349, 0.28627452254295349), (0.72268909215927124, -0.28235295414924622, 0.28235295414924622), (0.72689074277877808, -0.27450981736183167, 0.27450981736183167), (0.73109245300292969, -0.27058824896812439, 0.27058824896812439), (0.73529410362243652, -0.26666668057441711, 0.26666668057441711), (0.73949581384658813, -0.26274511218070984, 0.26274511218070984), (0.74369746446609497, -0.25882354378700256, 0.25882354378700256), (0.74789917469024658, -0.25490197539329529, 0.25490197539329529), (0.75210082530975342, -0.25098040699958801, 0.25098040699958801), (0.75630253553390503, -0.24705882370471954, 0.24705882370471954), (0.76050418615341187, -0.24313725531101227, 0.24313725531101227), (0.76470589637756348, -0.23921568691730499, 0.23921568691730499), (0.76890754699707031, -0.23529411852359772, 0.23529411852359772), (0.77310925722122192, -0.23137255012989044, 0.23137255012989044), (0.77731090784072876, -0.22745098173618317, 0.22745098173618317), (0.78151261806488037, -0.22352941334247589, 0.22352941334247589), (0.78571426868438721, -0.21960784494876862, 0.21960784494876862), (0.78991597890853882, -0.21176470816135406, 0.21176470816135406), (0.79411762952804565, -0.20784313976764679, 0.20784313976764679), (0.79831933975219727, -0.20392157137393951, 0.20392157137393951), (0.8025209903717041, -0.20000000298023224, 0.20000000298023224), (0.80672270059585571, -0.19607843458652496, 0.19607843458652496), (0.81092435121536255, -0.19215686619281769, 0.19215686619281769), (0.81512606143951416, -0.18823529779911041, 0.18823529779911041), (0.819327712059021, -0.18431372940540314, 0.18431372940540314), (0.82352942228317261, -0.18039216101169586, 0.18039216101169586), (0.82773107290267944, -0.17647059261798859, 0.17647059261798859), (0.83193278312683105, -0.17254902422428131, 0.17254902422428131), (0.83613443374633789, -0.16862745583057404, 0.16862745583057404), (0.8403361439704895, -0.16470588743686676, 0.16470588743686676), (0.84453779458999634, -0.16078431904315948, 0.16078431904315948), (0.84873950481414795, -0.15686275064945221, 0.15686275064945221), (0.85294115543365479, -0.14901961386203766, 0.14901961386203766), (0.8571428656578064, -0.14509804546833038, 0.14509804546833038), (0.86134451627731323, -0.14117647707462311, 0.14117647707462311), (0.86554622650146484, -0.13725490868091583, 0.13725490868091583), (0.86974787712097168, -0.13333334028720856, 0.13333334028720856), (0.87394958734512329, -0.12941177189350128, 0.12941177189350128), (0.87815123796463013, -0.12549020349979401, 0.12549020349979401), (0.88235294818878174, -0.12156862765550613, 0.12156862765550613), (0.88655459880828857, -0.11764705926179886, 0.11764705926179886), (0.89075630903244019, -0.11372549086809158, 0.11372549086809158), (0.89495795965194702, -0.10980392247438431, 0.10980392247438431), (0.89915966987609863, -0.10588235408067703, 0.10588235408067703), (0.90336132049560547, -0.10196078568696976, 0.10196078568696976), (0.90756303071975708, -0.098039217293262482, 0.098039217293262482), (0.91176468133926392, -0.094117648899555206, 0.094117648899555206), (0.91596639156341553, -0.086274512112140656, 0.086274512112140656), (0.92016804218292236, -0.08235294371843338, 0.08235294371843338), (0.92436975240707397, -0.078431375324726105, 0.078431375324726105), (0.92857140302658081, -0.074509806931018829, 0.074509806931018829), (0.93277311325073242, -0.070588238537311554, 0.070588238537311554), (0.93697476387023926, -0.066666670143604279, 0.066666670143604279), (0.94117647409439087, -0.062745101749897003, 0.062745101749897003), (0.94537812471389771, -0.058823529630899429, 0.058823529630899429), (0.94957983493804932, -0.054901961237192154, 0.054901961237192154), (0.95378148555755615, -0.050980392843484879, 0.050980392843484879), (0.95798319578170776, -0.047058824449777603, 0.047058824449777603), (0.9621848464012146, -0.043137256056070328, 0.043137256056070328), (0.96638655662536621, -0.039215687662363052, 0.039215687662363052), (0.97058820724487305, -0.035294119268655777, 0.035294119268655777), (0.97478991746902466, -0.031372550874948502, 0.031372550874948502), (0.97899156808853149, -0.023529412224888802, 0.023529412224888802), (0.98319327831268311, -0.019607843831181526, 0.019607843831181526), (0.98739492893218994, -0.015686275437474251, 0.015686275437474251), (0.99159663915634155, -0.011764706112444401, 0.011764706112444401), (0.99579828977584839, -0.0078431377187371254, 0.0078431377187371254), (1.0, -0.0039215688593685627, 0.0039215688593685627)], 'red': [(0.0, 1.0, 1.0), -(0.0042016808874905109, 0.99607843160629272, 0.99607843160629272), -(0.0084033617749810219, 0.99215686321258545, 0.99215686321258545), -(0.012605042196810246, 0.98823529481887817, 0.98823529481887817), -(0.016806723549962044, 0.9843137264251709, 0.9843137264251709), -(0.021008403971791267, 0.98039215803146362, 0.98039215803146362), -(0.025210084393620491, 0.97647058963775635, 0.97647058963775635), -(0.029411764815449715, 0.97254902124404907, 0.97254902124404907), -(0.033613447099924088, 0.96470588445663452, 0.96470588445663452), -(0.037815127521753311, 0.96078431606292725, 0.96078431606292725), -(0.042016807943582535, 0.95686274766921997, 0.95686274766921997), -(0.046218488365411758, 0.9529411792755127, 0.9529411792755127), -(0.050420168787240982, 0.94901961088180542, 0.94901961088180542), -(0.054621849209070206, 0.94509804248809814, 0.94509804248809814), -(0.058823529630899429, 0.94117647409439087, 0.94117647409439087), -(0.063025213778018951, 0.93725490570068359, 0.93725490570068359), -(0.067226894199848175, 0.93333333730697632, 0.93333333730697632), -(0.071428574621677399, 0.92941176891326904, 0.92941176891326904), -(0.075630255043506622, 0.92549020051956177, 0.92549020051956177), -(0.079831935465335846, 0.92156863212585449, 0.92156863212585449), -(0.08403361588716507, 0.91764706373214722, 0.91764706373214722), -(0.088235296308994293, 0.91372549533843994, 0.91372549533843994), -(0.092436976730823517, 0.90980392694473267, 0.90980392694473267), -(0.09663865715265274, 0.90196079015731812, 0.90196079015731812), -(0.10084033757448196, 0.89803922176361084, 0.89803922176361084), -(0.10504201799631119, 0.89411765336990356, 0.89411765336990356), -(0.10924369841814041, 0.89019608497619629, 0.89019608497619629), -(0.11344537883996964, 0.88627451658248901, 0.88627451658248901), -(0.11764705926179886, 0.88235294818878174, 0.88235294818878174), -(0.12184873968362808, 0.87843137979507446, 0.87843137979507446), -(0.1260504275560379, 0.87450981140136719, 0.87450981140136719), -(0.13025210797786713, 0.87058824300765991, 0.87058824300765991), -(0.13445378839969635, 0.86666667461395264, 0.86666667461395264), -(0.13865546882152557, 0.86274510622024536, 0.86274510622024536), -(0.1428571492433548, 0.85882353782653809, 0.85882353782653809), -(0.14705882966518402, 0.85490196943283081, 0.85490196943283081), -(0.15126051008701324, 0.85098040103912354, 0.85098040103912354), -(0.15546219050884247, 0.84705883264541626, 0.84705883264541626), -(0.15966387093067169, 0.83921569585800171, 0.83921569585800171), -(0.16386555135250092, 0.83529412746429443, 0.83529412746429443), -(0.16806723177433014, 0.83137255907058716, 0.83137255907058716), -(0.17226891219615936, 0.82745099067687988, 0.82745099067687988), -(0.17647059261798859, 0.82352942228317261, 0.82352942228317261), -(0.18067227303981781, 0.81960785388946533, 0.81960785388946533), -(0.18487395346164703, 0.81568628549575806, 0.81568628549575806), -(0.18907563388347626, 0.81176471710205078, 0.81176471710205078), -(0.19327731430530548, 0.80784314870834351, 0.80784314870834351), -(0.1974789947271347, 0.80392158031463623, 0.80392158031463623), -(0.20168067514896393, 0.80000001192092896, 0.80000001192092896), -(0.20588235557079315, 0.79607844352722168, 0.79607844352722168), -(0.21008403599262238, 0.7921568751335144, 0.7921568751335144), -(0.2142857164144516, 0.78823530673980713, 0.78823530673980713), -(0.21848739683628082, 0.78431373834609985, 0.78431373834609985), -(0.22268907725811005, 0.7764706015586853, 0.7764706015586853), -(0.22689075767993927, 0.77254903316497803, 0.77254903316497803), -(0.23109243810176849, 0.76862746477127075, 0.76862746477127075), -(0.23529411852359772, 0.76470589637756348, 0.76470589637756348), -(0.23949579894542694, 0.7607843279838562, 0.7607843279838562), -(0.24369747936725616, 0.75686275959014893, 0.75686275959014893), -(0.24789915978908539, 0.75294119119644165, 0.75294119119644165), -(0.25210085511207581, 0.74901962280273438, 0.74901962280273438), -(0.25630253553390503, 0.7450980544090271, 0.7450980544090271), -(0.26050421595573425, 0.74117648601531982, 0.74117648601531982), -(0.26470589637756348, 0.73725491762161255, 0.73725491762161255), -(0.2689075767993927, 0.73333334922790527, 0.73333334922790527), -(0.27310925722122192, 0.729411780834198, 0.729411780834198), -(0.27731093764305115, 0.72549021244049072, 0.72549021244049072), -(0.28151261806488037, 0.72156864404678345, 0.72156864404678345), -(0.28571429848670959, 0.7137255072593689, 0.7137255072593689), -(0.28991597890853882, 0.70980393886566162, 0.70980393886566162), -(0.29411765933036804, 0.70588237047195435, 0.70588237047195435), -(0.29831933975219727, 0.70196080207824707, 0.70196080207824707), -(0.30252102017402649, 0.69803923368453979, 0.69803923368453979), -(0.30672270059585571, 0.69411766529083252, 0.69411766529083252), -(0.31092438101768494, 0.69019609689712524, 0.69019609689712524), -(0.31512606143951416, 0.68627452850341797, 0.68627452850341797), -(0.31932774186134338, 0.68235296010971069, 0.68235296010971069), -(0.32352942228317261, 0.67843139171600342, 0.67843139171600342), -(0.32773110270500183, 0.67450982332229614, 0.67450982332229614), -(0.33193278312683105, 0.67058825492858887, 0.67058825492858887), -(0.33613446354866028, 0.66666668653488159, 0.66666668653488159), -(0.3403361439704895, 0.66274511814117432, 0.66274511814117432), -(0.34453782439231873, 0.65882354974746704, 0.65882354974746704), -(0.34873950481414795, 0.65098041296005249, 0.65098041296005249), -(0.35294118523597717, 0.64705884456634521, 0.64705884456634521), -(0.3571428656578064, 0.64313727617263794, 0.64313727617263794), -(0.36134454607963562, 0.63921570777893066, 0.63921570777893066), -(0.36554622650146484, 0.63529413938522339, 0.63529413938522339), -(0.36974790692329407, 0.63137257099151611, 0.63137257099151611), -(0.37394958734512329, 0.62745100259780884, 0.62745100259780884), -(0.37815126776695251, 0.62352943420410156, 0.62352943420410156), -(0.38235294818878174, 0.61960786581039429, 0.61960786581039429), -(0.38655462861061096, 0.61568629741668701, 0.61568629741668701), -(0.39075630903244019, 0.61176472902297974, 0.61176472902297974), -(0.39495798945426941, 0.60784316062927246, 0.60784316062927246), -(0.39915966987609863, 0.60392159223556519, 0.60392159223556519), -(0.40336135029792786, 0.60000002384185791, 0.60000002384185791), -(0.40756303071975708, 0.59607845544815063, 0.59607845544815063), -(0.4117647111415863, 0.58823531866073608, 0.58823531866073608), -(0.41596639156341553, 0.58431375026702881, 0.58431375026702881), -(0.42016807198524475, 0.58039218187332153, 0.58039218187332153), -(0.42436975240707397, 0.57647061347961426, 0.57647061347961426), -(0.4285714328289032, 0.57254904508590698, 0.57254904508590698), -(0.43277311325073242, 0.56862747669219971, 0.56862747669219971), -(0.43697479367256165, 0.56470590829849243, 0.56470590829849243), -(0.44117647409439087, 0.56078433990478516, 0.56078433990478516), -(0.44537815451622009, 0.55686277151107788, 0.55686277151107788), -(0.44957983493804932, 0.55294120311737061, 0.55294120311737061), -(0.45378151535987854, 0.54901963472366333, 0.54901963472366333), -(0.45798319578170776, 0.54509806632995605, 0.54509806632995605), -(0.46218487620353699, 0.54117649793624878, 0.54117649793624878), -(0.46638655662536621, 0.5372549295425415, 0.5372549295425415), -(0.47058823704719543, 0.53333336114883423, 0.53333336114883423), -(0.47478991746902466, 0.52549022436141968, 0.52549022436141968), -(0.47899159789085388, 0.5215686559677124, 0.5215686559677124), -(0.48319327831268311, 0.51764708757400513, 0.51764708757400513), -(0.48739495873451233, 0.51372551918029785, 0.51372551918029785), -(0.49159663915634155, 0.50980395078659058, 0.50980395078659058), -(0.49579831957817078, 0.5058823823928833, 0.5058823823928833), (0.5, -0.50196081399917603, 0.50196081399917603), (0.50420171022415161, -0.49803921580314636, 0.49803921580314636), (0.50840336084365845, -0.49411764740943909, 0.49411764740943909), (0.51260507106781006, -0.49019607901573181, 0.49019607901573181), (0.51680672168731689, -0.48627451062202454, 0.48627451062202454), (0.52100843191146851, -0.48235294222831726, 0.48235294222831726), (0.52521008253097534, -0.47843137383460999, 0.47843137383460999), (0.52941179275512695, -0.47450980544090271, 0.47450980544090271), (0.53361344337463379, -0.47058823704719543, 0.47058823704719543), (0.5378151535987854, -0.46274510025978088, 0.46274510025978088), (0.54201680421829224, -0.45882353186607361, 0.45882353186607361), (0.54621851444244385, -0.45490196347236633, 0.45490196347236633), (0.55042016506195068, -0.45098039507865906, 0.45098039507865906), (0.55462187528610229, -0.44705882668495178, 0.44705882668495178), (0.55882352590560913, -0.44313725829124451, 0.44313725829124451), (0.56302523612976074, -0.43921568989753723, 0.43921568989753723), (0.56722688674926758, -0.43529412150382996, 0.43529412150382996), (0.57142859697341919, -0.43137255311012268, 0.43137255311012268), (0.57563024759292603, -0.42745098471641541, 0.42745098471641541), (0.57983195781707764, -0.42352941632270813, 0.42352941632270813), (0.58403360843658447, -0.41960784792900085, 0.41960784792900085), (0.58823531866073608, -0.41568627953529358, 0.41568627953529358), (0.59243696928024292, -0.4117647111415863, 0.4117647111415863), (0.59663867950439453, -0.40784314274787903, 0.40784314274787903), (0.60084033012390137, -0.40000000596046448, 0.40000000596046448), (0.60504204034805298, -0.3960784375667572, 0.3960784375667572), (0.60924369096755981, -0.39215686917304993, 0.39215686917304993), (0.61344540119171143, -0.38823530077934265, 0.38823530077934265), (0.61764705181121826, -0.38431373238563538, 0.38431373238563538), (0.62184876203536987, -0.3803921639919281, 0.3803921639919281), (0.62605041265487671, -0.37647059559822083, 0.37647059559822083), (0.63025212287902832, -0.37254902720451355, 0.37254902720451355), (0.63445377349853516, -0.36862745881080627, 0.36862745881080627), (0.63865548372268677, -0.364705890417099, 0.364705890417099), (0.6428571343421936, -0.36078432202339172, 0.36078432202339172), (0.64705884456634521, -0.35686275362968445, 0.35686275362968445), (0.65126049518585205, -0.35294118523597717, 0.35294118523597717), (0.65546220541000366, -0.3490196168422699, 0.3490196168422699), (0.6596638560295105, -0.34509804844856262, 0.34509804844856262), (0.66386556625366211, -0.33725491166114807, 0.33725491166114807), (0.66806721687316895, -0.3333333432674408, 0.3333333432674408), (0.67226892709732056, -0.32941177487373352, 0.32941177487373352), (0.67647057771682739, -0.32549020648002625, 0.32549020648002625), (0.680672287940979, -0.32156863808631897, 0.32156863808631897), (0.68487393856048584, -0.31764706969261169, 0.31764706969261169), (0.68907564878463745, -0.31372550129890442, 0.31372550129890442), (0.69327729940414429, -0.30980393290519714, 0.30980393290519714), (0.6974790096282959, -0.30588236451148987, 0.30588236451148987), (0.70168066024780273, -0.30196079611778259, 0.30196079611778259), (0.70588237047195435, -0.29803922772407532, 0.29803922772407532), (0.71008402109146118, -0.29411765933036804, 0.29411765933036804), (0.71428573131561279, -0.29019609093666077, 0.29019609093666077), (0.71848738193511963, -0.28627452254295349, 0.28627452254295349), (0.72268909215927124, -0.28235295414924622, 0.28235295414924622), (0.72689074277877808, -0.27450981736183167, 0.27450981736183167), (0.73109245300292969, -0.27058824896812439, 0.27058824896812439), (0.73529410362243652, -0.26666668057441711, 0.26666668057441711), (0.73949581384658813, -0.26274511218070984, 0.26274511218070984), (0.74369746446609497, -0.25882354378700256, 0.25882354378700256), (0.74789917469024658, -0.25490197539329529, 0.25490197539329529), (0.75210082530975342, -0.25098040699958801, 0.25098040699958801), (0.75630253553390503, -0.24705882370471954, 0.24705882370471954), (0.76050418615341187, -0.24313725531101227, 0.24313725531101227), (0.76470589637756348, -0.23921568691730499, 0.23921568691730499), (0.76890754699707031, -0.23529411852359772, 0.23529411852359772), (0.77310925722122192, -0.23137255012989044, 0.23137255012989044), (0.77731090784072876, -0.22745098173618317, 0.22745098173618317), (0.78151261806488037, -0.22352941334247589, 0.22352941334247589), (0.78571426868438721, -0.21960784494876862, 0.21960784494876862), (0.78991597890853882, -0.21176470816135406, 0.21176470816135406), (0.79411762952804565, -0.20784313976764679, 0.20784313976764679), (0.79831933975219727, -0.20392157137393951, 0.20392157137393951), (0.8025209903717041, -0.20000000298023224, 0.20000000298023224), (0.80672270059585571, -0.19607843458652496, 0.19607843458652496), (0.81092435121536255, -0.19215686619281769, 0.19215686619281769), (0.81512606143951416, -0.18823529779911041, 0.18823529779911041), (0.819327712059021, -0.18431372940540314, 0.18431372940540314), (0.82352942228317261, -0.18039216101169586, 0.18039216101169586), (0.82773107290267944, -0.17647059261798859, 0.17647059261798859), (0.83193278312683105, -0.17254902422428131, 0.17254902422428131), (0.83613443374633789, -0.16862745583057404, 0.16862745583057404), (0.8403361439704895, -0.16470588743686676, 0.16470588743686676), (0.84453779458999634, -0.16078431904315948, 0.16078431904315948), (0.84873950481414795, -0.15686275064945221, 0.15686275064945221), (0.85294115543365479, -0.14901961386203766, 0.14901961386203766), (0.8571428656578064, -0.14509804546833038, 0.14509804546833038), (0.86134451627731323, -0.14117647707462311, 0.14117647707462311), (0.86554622650146484, -0.13725490868091583, 0.13725490868091583), (0.86974787712097168, -0.13333334028720856, 0.13333334028720856), (0.87394958734512329, -0.12941177189350128, 0.12941177189350128), (0.87815123796463013, -0.12549020349979401, 0.12549020349979401), (0.88235294818878174, -0.12156862765550613, 0.12156862765550613), (0.88655459880828857, -0.11764705926179886, 0.11764705926179886), (0.89075630903244019, -0.11372549086809158, 0.11372549086809158), (0.89495795965194702, -0.10980392247438431, 0.10980392247438431), (0.89915966987609863, -0.10588235408067703, 0.10588235408067703), (0.90336132049560547, -0.10196078568696976, 0.10196078568696976), (0.90756303071975708, -0.098039217293262482, 0.098039217293262482), (0.91176468133926392, -0.094117648899555206, 0.094117648899555206), (0.91596639156341553, -0.086274512112140656, 0.086274512112140656), (0.92016804218292236, -0.08235294371843338, 0.08235294371843338), (0.92436975240707397, -0.078431375324726105, 0.078431375324726105), (0.92857140302658081, -0.074509806931018829, 0.074509806931018829), (0.93277311325073242, -0.070588238537311554, 0.070588238537311554), (0.93697476387023926, -0.066666670143604279, 0.066666670143604279), (0.94117647409439087, -0.062745101749897003, 0.062745101749897003), (0.94537812471389771, -0.058823529630899429, 0.058823529630899429), (0.94957983493804932, -0.054901961237192154, 0.054901961237192154), (0.95378148555755615, -0.050980392843484879, 0.050980392843484879), (0.95798319578170776, -0.047058824449777603, 0.047058824449777603), (0.9621848464012146, -0.043137256056070328, 0.043137256056070328), (0.96638655662536621, -0.039215687662363052, 0.039215687662363052), (0.97058820724487305, -0.035294119268655777, 0.035294119268655777), (0.97478991746902466, -0.031372550874948502, 0.031372550874948502), (0.97899156808853149, -0.023529412224888802, 0.023529412224888802), (0.98319327831268311, -0.019607843831181526, 0.019607843831181526), (0.98739492893218994, -0.015686275437474251, 0.015686275437474251), (0.99159663915634155, -0.011764706112444401, 0.011764706112444401), (0.99579828977584839, -0.0078431377187371254, 0.0078431377187371254), (1.0, -0.0039215688593685627, 0.0039215688593685627)]} +# +# Most palette functions have been reduced to simple function descriptions +# by Reinier Heeres, since the rgb components were mostly straight lines. +# gist_earth_data and gist_ncar_data were simplified by a script and some +# manual effort. + +_gist_earth_data = \ +{'red': ( +(0.0, 0.0, 0.0000), +(0.2824, 0.1882, 0.1882), +(0.4588, 0.2714, 0.2714), +(0.5490, 0.4719, 0.4719), +(0.6980, 0.7176, 0.7176), +(0.7882, 0.7553, 0.7553), +(1.0000, 0.9922, 0.9922), +), 'green': ( +(0.0, 0.0, 0.0000), +(0.0275, 0.0000, 0.0000), +(0.1098, 0.1893, 0.1893), +(0.1647, 0.3035, 0.3035), +(0.2078, 0.3841, 0.3841), +(0.2824, 0.5020, 0.5020), +(0.5216, 0.6397, 0.6397), +(0.6980, 0.7171, 0.7171), +(0.7882, 0.6392, 0.6392), +(0.7922, 0.6413, 0.6413), +(0.8000, 0.6447, 0.6447), +(0.8078, 0.6481, 0.6481), +(0.8157, 0.6549, 0.6549), +(0.8667, 0.6991, 0.6991), +(0.8745, 0.7103, 0.7103), +(0.8824, 0.7216, 0.7216), +(0.8902, 0.7323, 0.7323), +(0.8980, 0.7430, 0.7430), +(0.9412, 0.8275, 0.8275), +(0.9569, 0.8635, 0.8635), +(0.9647, 0.8816, 0.8816), +(0.9961, 0.9733, 0.9733), +(1.0000, 0.9843, 0.9843), +), 'blue': ( +(0.0, 0.0, 0.0000), +(0.0039, 0.1684, 0.1684), +(0.0078, 0.2212, 0.2212), +(0.0275, 0.4329, 0.4329), +(0.0314, 0.4549, 0.4549), +(0.2824, 0.5004, 0.5004), +(0.4667, 0.2748, 0.2748), +(0.5451, 0.3205, 0.3205), +(0.7843, 0.3961, 0.3961), +(0.8941, 0.6651, 0.6651), +(1.0000, 0.9843, 0.9843), +)} + +_gist_gray_data = { + 'red': gfunc[3], + 'green': gfunc[3], + 'blue': gfunc[3], +} + +_gist_heat_data = { + 'red': lambda x: 1.5 * x, + 'green': lambda x: 2 * x - 1, + 'blue': lambda x: 4 * x - 3, +} + +_gist_ncar_data = \ +{'red': ( +(0.0, 0.0, 0.0000), +(0.3098, 0.0000, 0.0000), +(0.3725, 0.3993, 0.3993), +(0.4235, 0.5003, 0.5003), +(0.5333, 1.0000, 1.0000), +(0.7922, 1.0000, 1.0000), +(0.8471, 0.6218, 0.6218), +(0.8980, 0.9235, 0.9235), +(1.0000, 0.9961, 0.9961), +), 'green': ( +(0.0, 0.0, 0.0000), +(0.0510, 0.3722, 0.3722), +(0.1059, 0.0000, 0.0000), +(0.1569, 0.7202, 0.7202), +(0.1608, 0.7537, 0.7537), +(0.1647, 0.7752, 0.7752), +(0.2157, 1.0000, 1.0000), +(0.2588, 0.9804, 0.9804), +(0.2706, 0.9804, 0.9804), +(0.3176, 1.0000, 1.0000), +(0.3686, 0.8081, 0.8081), +(0.4275, 1.0000, 1.0000), +(0.5216, 1.0000, 1.0000), +(0.6314, 0.7292, 0.7292), +(0.6863, 0.2796, 0.2796), +(0.7451, 0.0000, 0.0000), +(0.7922, 0.0000, 0.0000), +(0.8431, 0.1753, 0.1753), +(0.8980, 0.5000, 0.5000), +(1.0000, 0.9725, 0.9725), +), 'blue': ( +(0.0, 0.5020, 0.5020), +(0.0510, 0.0222, 0.0222), +(0.1098, 1.0000, 1.0000), +(0.2039, 1.0000, 1.0000), +(0.2627, 0.6145, 0.6145), +(0.3216, 0.0000, 0.0000), +(0.4157, 0.0000, 0.0000), +(0.4745, 0.2342, 0.2342), +(0.5333, 0.0000, 0.0000), +(0.5804, 0.0000, 0.0000), +(0.6314, 0.0549, 0.0549), +(0.6902, 0.0000, 0.0000), +(0.7373, 0.0000, 0.0000), +(0.7922, 0.9738, 0.9738), +(0.8000, 1.0000, 1.0000), +(0.8431, 1.0000, 1.0000), +(0.8980, 0.9341, 0.9341), +(1.0000, 0.9961, 0.9961), +)} + +_gist_rainbow_data = ( + (0.000, (1.00, 0.00, 0.16)), + (0.030, (1.00, 0.00, 0.00)), + (0.215, (1.00, 1.00, 0.00)), + (0.400, (0.00, 1.00, 0.00)), + (0.586, (0.00, 1.00, 1.00)), + (0.770, (0.00, 0.00, 1.00)), + (0.954, (1.00, 0.00, 1.00)), + (1.000, (1.00, 0.00, 0.75)) +) + +_gist_stern_data = { + 'red': ( + (0.000, 0.000, 0.000), (0.0547, 1.000, 1.000), + (0.250, 0.027, 0.250), #(0.2500, 0.250, 0.250), + (1.000, 1.000, 1.000)), + 'green': ((0, 0, 0), (1, 1, 1)), + 'blue': ( + (0.000, 0.000, 0.000), (0.500, 1.000, 1.000), + (0.735, 0.000, 0.000), (1.000, 1.000, 1.000)) +} + +_gist_yarg_data = { + 'red': lambda x: 1 - x, + 'green': lambda x: 1 - x, + 'blue': lambda x: 1 - x, +} datad = { + 'afmhot': _afmhot_data, 'autumn': _autumn_data, 'bone': _bone_data, - 'binary': _binary_data, + 'binary': _binary_data, + 'bwr': _bwr_data, + 'brg': _brg_data, 'cool': _cool_data, 'copper': _copper_data, 'flag': _flag_data, + 'gnuplot': _gnuplot_data, + 'gnuplot2': _gnuplot2_data, 'gray' : _gray_data, 'hot': _hot_data, 'hsv': _hsv_data, 'jet' : _jet_data, + 'ocean': _ocean_data, 'pink': _pink_data, 'prism': _prism_data, + 'rainbow': _rainbow_data, + 'seismic': _seismic_data, 'spring': _spring_data, 'summer': _summer_data, + 'terrain': _terrain_data, 'winter': _winter_data, 'spectral': _spectral_data } @@ -5874,7 +1638,3 @@ datad['gist_stern']=_gist_stern_data datad['gist_yarg']=_gist_yarg_data - - - - diff -Nru matplotlib-0.99.3/lib/matplotlib/cm.py matplotlib-1.0.1/lib/matplotlib/cm.py --- matplotlib-0.99.3/lib/matplotlib/cm.py 2009-07-31 15:14:40.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/cm.py 2010-10-12 16:14:42.000000000 +0000 @@ -14,16 +14,28 @@ import matplotlib.cbook as cbook from matplotlib._cm import datad - cmap_d = dict() # reverse all the colormaps. # reversed colormaps have '_r' appended to the name. +def _reverser(f): + def freversed(x): + return f(1-x) + return freversed + def revcmap(data): data_r = {} for key, val in data.iteritems(): - valnew = [(1.0-a, b, c) for a, b, c in reversed(val)] + if callable(val): + valnew = _reverser(val) + # This doesn't work: lambda x: val(1-x) + # The same "val" (the first one) is used + # each time, so the colors are identical + # and the result is shades of gray. + else: + # Flip x and exchange the y values facing x = 0 and x = 1. + valnew = [(1.0 - x, y1, y0) for x, y0, y1 in reversed(val)] data_r[key] = valnew return data_r @@ -33,12 +45,23 @@ for cmapname in _cmapnames: cmapname_r = cmapname+'_r' - cmapdat_r = revcmap(datad[cmapname]) - datad[cmapname_r] = cmapdat_r - cmap_d[cmapname] = colors.LinearSegmentedColormap( - cmapname, datad[cmapname], LUTSIZE) - cmap_d[cmapname_r] = colors.LinearSegmentedColormap( - cmapname_r, cmapdat_r, LUTSIZE) + cmapspec = datad[cmapname] + if 'red' in cmapspec: + datad[cmapname_r] = revcmap(cmapspec) + cmap_d[cmapname] = colors.LinearSegmentedColormap( + cmapname, cmapspec, LUTSIZE) + cmap_d[cmapname_r] = colors.LinearSegmentedColormap( + cmapname_r, datad[cmapname_r], LUTSIZE) + else: + revspec = list(reversed(cmapspec)) + if len(revspec[0]) == 2: # e.g., (1, (1.0, 0.0, 1.0)) + revspec = [(1.0 - a, b) for a, b in revspec] + datad[cmapname_r] = revspec + + cmap_d[cmapname] = colors.LinearSegmentedColormap.from_list( + cmapname, cmapspec, LUTSIZE) + cmap_d[cmapname_r] = colors.LinearSegmentedColormap.from_list( + cmapname_r, revspec, LUTSIZE) locals().update(cmap_d) @@ -138,21 +161,25 @@ 'set the colorbar image and axes associated with mappable' self.colorbar = im, ax - def to_rgba(self, x, alpha=1.0, bytes=False): + def to_rgba(self, x, alpha=None, bytes=False): '''Return a normalized rgba array corresponding to *x*. If *x* is already an rgb array, insert *alpha*; if it is already rgba, return it unchanged. If *bytes* is True, return rgba as 4 uint8s instead of 4 floats. ''' + if alpha is None: + _alpha = 1.0 + else: + _alpha = alpha try: if x.ndim == 3: if x.shape[2] == 3: if x.dtype == np.uint8: - alpha = np.array(alpha*255, np.uint8) + _alpha = np.array(_alpha*255, np.uint8) m, n = x.shape[:2] xx = np.empty(shape=(m,n,4), dtype = x.dtype) xx[:,:,:3] = x - xx[:,:,3] = alpha + xx[:,:,3] = _alpha elif x.shape[2] == 4: xx = x else: diff -Nru matplotlib-0.99.3/lib/matplotlib/collections.py matplotlib-1.0.1/lib/matplotlib/collections.py --- matplotlib-0.99.3/lib/matplotlib/collections.py 2010-03-09 14:20:20.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/collections.py 2010-12-13 15:27:29.000000000 +0000 @@ -5,16 +5,17 @@ The classes are not meant to be as flexible as their single element counterparts (e.g. you may not be able to select all line styles) but -they are meant to be fast for common use cases (e.g. a bunch of solid +they are meant to be fast for common use cases (e.g. a large set of solid line segemnts) """ -import copy, math, warnings +import warnings import numpy as np -from numpy import ma +import numpy.ma as ma import matplotlib as mpl import matplotlib.cbook as cbook -import matplotlib.colors as _colors # avoid conflict with kwarg +import matplotlib.colors as mcolors import matplotlib.cm as cm +from matplotlib import docstring import matplotlib.transforms as transforms import matplotlib.artist as artist from matplotlib.artist import allow_rasterization @@ -106,31 +107,37 @@ self._pickradius = pickradius self.update(kwargs) + self._paths = None - - def _get_value(self, val): - try: return (float(val), ) + @staticmethod + def _get_value(val): + try: + return (float(val), ) except TypeError: if cbook.iterable(val) and len(val): - try: float(val[0]) - except TypeError: pass # raise below - except ValueError: pass - else: return val + try: + float(val[0]) + except (TypeError, ValueError): + pass # raise below + else: + return val raise TypeError('val must be a float or nonzero sequence of floats') - def _get_bool(self, val): - try: return (bool(val), ) - except TypeError: - if cbook.iterable(val) and len(val): - try: bool(val[0]) - except TypeError: pass # raise below - else: return val - - raise TypeError('val must be a bool or nonzero sequence of them') - + @staticmethod + def _get_bool(val): + if not cbook.iterable(val): + val = (val,) + try: + bool(val[0]) + except (TypeError, IndexError): + raise TypeError('val must be a bool or nonzero sequence of them') + return val def get_paths(self): + return self._paths + + def set_paths(self): raise NotImplementedError def get_transforms(self): @@ -200,18 +207,18 @@ self.update_scalarmappable() - clippath, clippath_trans = self.get_transformed_clip_path_and_affine() - if clippath_trans is not None: - clippath_trans = clippath_trans.frozen() - transform, transOffset, offsets, paths = self._prepare_points() + gc = renderer.new_gc() + self._set_gc_clip(gc) + gc.set_snap(self.get_snap()) + renderer.draw_path_collection( - transform.frozen(), self.clipbox, clippath, clippath_trans, - paths, self.get_transforms(), - offsets, transOffset, - self.get_facecolor(), self.get_edgecolor(), self._linewidths, - self._linestyles, self._antialiaseds, self._urls) + gc, transform.frozen(), paths, self.get_transforms(), + offsets, transOffset, self.get_facecolor(), self.get_edgecolor(), + self._linewidths, self._linestyles, self._antialiaseds, self._urls) + + gc.restore() renderer.close_group(self.__class__.__name__) def contains(self, mouseevent): @@ -385,7 +392,7 @@ pass if c is None: c = mpl.rcParams['patch.facecolor'] self._facecolors_original = c - self._facecolors = _colors.colorConverter.to_rgba_array(c, self._alpha) + self._facecolors = mcolors.colorConverter.to_rgba_array(c, self._alpha) def set_facecolors(self, c): """alias for set_facecolor""" @@ -427,7 +434,7 @@ else: if c is None: c = mpl.rcParams['patch.edgecolor'] self._edgecolors_original = c - self._edgecolors = _colors.colorConverter.to_rgba_array(c, self._alpha) + self._edgecolors = mcolors.colorConverter.to_rgba_array(c, self._alpha) def set_edgecolors(self, c): @@ -437,25 +444,27 @@ def set_alpha(self, alpha): """ Set the alpha tranparencies of the collection. *alpha* must be - a float. + a float or *None*. - ACCEPTS: float + ACCEPTS: float or None """ - try: float(alpha) - except TypeError: raise TypeError('alpha must be a float') - else: - artist.Artist.set_alpha(self, alpha) + if alpha is not None: try: - self._facecolors = _colors.colorConverter.to_rgba_array( - self._facecolors_original, self._alpha) - except (AttributeError, TypeError, IndexError): - pass - try: - if self._edgecolors_original != 'face': - self._edgecolors = _colors.colorConverter.to_rgba_array( - self._edgecolors_original, self._alpha) - except (AttributeError, TypeError, IndexError): - pass + float(alpha) + except TypeError: + raise TypeError('alpha must be a float or None') + artist.Artist.set_alpha(self, alpha) + try: + self._facecolors = mcolors.colorConverter.to_rgba_array( + self._facecolors_original, self._alpha) + except (AttributeError, TypeError, IndexError): + pass + try: + if self._edgecolors_original != 'face': + self._edgecolors = mcolors.colorConverter.to_rgba_array( + self._edgecolors_original, self._alpha) + except (AttributeError, TypeError, IndexError): + pass def get_linewidths(self): return self._linewidths @@ -491,10 +500,16 @@ self._linestyles = other._linestyles self._pickradius = other._pickradius + # update_from for scalarmappable + self._A = other._A + self.norm = other.norm + self.cmap = other.cmap + # self.update_dict = other.update_dict # do we need to copy this? -JJL + # these are not available for the object inspector until after the # class is built so we define an initial set here for the init # function and they will be overridden after object defn -artist.kwdocd['Collection'] = """\ +docstring.interpd.update(Collection = """\ Valid Collection keyword arguments: * *edgecolors*: None @@ -514,136 +529,31 @@ If any of *edgecolors*, *facecolors*, *linewidths*, *antialiaseds* are None, they default to their :data:`matplotlib.rcParams` patch setting, in sequence form. -""" +""") -class QuadMesh(Collection): +class PathCollection(Collection): """ - Class for the efficient drawing of a quadrilateral mesh. - - A quadrilateral mesh consists of a grid of vertices. The - dimensions of this array are (*meshWidth* + 1, *meshHeight* + - 1). Each vertex in the mesh has a different set of "mesh - coordinates" representing its position in the topology of the - mesh. For any values (*m*, *n*) such that 0 <= *m* <= *meshWidth* - and 0 <= *n* <= *meshHeight*, the vertices at mesh coordinates - (*m*, *n*), (*m*, *n* + 1), (*m* + 1, *n* + 1), and (*m* + 1, *n*) - form one of the quadrilaterals in the mesh. There are thus - (*meshWidth* * *meshHeight*) quadrilaterals in the mesh. The mesh - need not be regular and the polygons need not be convex. - - A quadrilateral mesh is represented by a (2 x ((*meshWidth* + 1) * - (*meshHeight* + 1))) numpy array *coordinates*, where each row is - the *x* and *y* coordinates of one of the vertices. To define the - function that maps from a data point to its corresponding color, - use the :meth:`set_cmap` method. Each of these arrays is indexed in - row-major order by the mesh coordinates of the vertex (or the mesh - coordinates of the lower left vertex, in the case of the - colors). - - For example, the first entry in *coordinates* is the - coordinates of the vertex at mesh coordinates (0, 0), then the one - at (0, 1), then at (0, 2) .. (0, meshWidth), (1, 0), (1, 1), and - so on. + This is the most basic :class:`Collection` subclass. """ - def __init__(self, meshWidth, meshHeight, coordinates, showedges, antialiased=True): - Collection.__init__(self) - self._meshWidth = meshWidth - self._meshHeight = meshHeight - self._coordinates = coordinates - self._showedges = showedges - self._antialiased = antialiased - - self._paths = None - - self._bbox = transforms.Bbox.unit() - self._bbox.update_from_data_xy(coordinates.reshape( - ((meshWidth + 1) * (meshHeight + 1), 2))) - - # By converting to floats now, we can avoid that on every draw. - self._coordinates = self._coordinates.reshape((meshHeight + 1, meshWidth + 1, 2)) - self._coordinates = np.array(self._coordinates, np.float_) - - def get_paths(self, dataTrans=None): - if self._paths is None: - self._paths = self.convert_mesh_to_paths( - self._meshWidth, self._meshHeight, self._coordinates) - return self._paths - - @staticmethod - def convert_mesh_to_paths(meshWidth, meshHeight, coordinates): + @docstring.dedent_interpd + def __init__(self, paths, **kwargs): """ - Converts a given mesh into a sequence of - :class:`matplotlib.path.Path` objects for easier rendering by - backends that do not directly support quadmeshes. + *paths* is a sequence of :class:`matplotlib.path.Path` + instances. - This function is primarily of use to backend implementers. + %(Collection)s """ - Path = mpath.Path - - if ma.isMaskedArray(coordinates): - c = coordinates.data - else: - c = coordinates - - points = np.concatenate(( - c[0:-1, 0:-1], - c[0:-1, 1: ], - c[1: , 1: ], - c[1: , 0:-1], - c[0:-1, 0:-1] - ), axis=2) - points = points.reshape((meshWidth * meshHeight, 5, 2)) - return [Path(x) for x in points] - def get_datalim(self, transData): - return self._bbox + Collection.__init__(self, **kwargs) + self.set_paths(paths) - @allow_rasterization - def draw(self, renderer): - if not self.get_visible(): return - renderer.open_group(self.__class__.__name__) - transform = self.get_transform() - transOffset = self._transOffset - offsets = self._offsets - if self.have_units(): - if len(self._offsets): - xs = self.convert_xunits(self._offsets[:0]) - ys = self.convert_yunits(self._offsets[:1]) - offsets = zip(xs, ys) - - offsets = np.asarray(offsets, np.float_) - - if self.check_update('array'): - self.update_scalarmappable() - - clippath, clippath_trans = self.get_transformed_clip_path_and_affine() - if clippath_trans is not None: - clippath_trans = clippath_trans.frozen() - - if not transform.is_affine: - coordinates = self._coordinates.reshape( - (self._coordinates.shape[0] * - self._coordinates.shape[1], - 2)) - coordinates = transform.transform(coordinates) - coordinates = coordinates.reshape(self._coordinates.shape) - transform = transforms.IdentityTransform() - else: - coordinates = self._coordinates - - if not transOffset.is_affine: - offsets = transOffset.transform_non_affine(offsets) - transOffset = transOffset.get_affine() + def set_paths(self, paths): + self._paths = paths - renderer.draw_quad_mesh( - transform.frozen(), self.clipbox, clippath, clippath_trans, - self._meshWidth, self._meshHeight, coordinates, - offsets, transOffset, self.get_facecolor(), self._antialiased, - self._showedges) - renderer.close_group(self.__class__.__name__) class PolyCollection(Collection): + @docstring.dedent_interpd def __init__(self, verts, sizes = None, closed = True, **kwargs): """ *verts* is a sequence of ( *verts0*, *verts1*, ...) where @@ -666,7 +576,6 @@ Collection.__init__(self,**kwargs) self._sizes = sizes self.set_verts(verts, closed) - __init__.__doc__ = cbook.dedent(__init__.__doc__) % artist.kwdocd def set_verts(self, verts, closed=True): '''This allows one to delay initialization of the vertices.''' @@ -682,7 +591,7 @@ else: xy = np.asarray(xy) xy = np.concatenate([xy, np.zeros((1,2))]) - codes = np.empty(xy.shape[0], dtype='uint8') + codes = np.empty(xy.shape[0], dtype=mpath.Path.code_type) codes[:] = mpath.Path.LINETO codes[0] = mpath.Path.MOVETO codes[-1] = mpath.Path.CLOSEPOLY @@ -692,9 +601,9 @@ else: self._paths = [mpath.Path(xy) for xy in verts] - def get_paths(self): - return self._paths + set_paths = set_verts + @allow_rasterization def draw(self, renderer): if self._sizes is not None: self._transforms = [ @@ -709,6 +618,7 @@ A collection of horizontal bars spanning *yrange* with a sequence of *xranges*. """ + @docstring.dedent_interpd def __init__(self, xranges, yrange, **kwargs): """ *xranges* @@ -723,7 +633,6 @@ ymax = ymin + ywidth verts = [ [(xmin, ymin), (xmin, ymax), (xmin+xwidth, ymax), (xmin+xwidth, ymin), (xmin, ymin)] for xmin, xwidth in xranges] PolyCollection.__init__(self, verts, **kwargs) - __init__.__doc__ = cbook.dedent(__init__.__doc__) % artist.kwdocd @staticmethod @@ -750,6 +659,7 @@ """Draw a collection of regular polygons with *numsides*.""" _path_generator = mpath.Path.unit_regular_polygon + @docstring.dedent_interpd def __init__(self, numsides, rotation = 0 , @@ -792,8 +702,6 @@ self._rotation = rotation self.set_transform(transforms.IdentityTransform()) - __init__.__doc__ = cbook.dedent(__init__.__doc__) % artist.kwdocd - @allow_rasterization def draw(self, renderer): self._transforms = [ @@ -802,9 +710,6 @@ for x in self._sizes] return Collection.draw(self, renderer) - def get_paths(self): - return self._paths - def get_numsides(self): return self._numsides @@ -912,7 +817,7 @@ if antialiaseds is None: antialiaseds = (mpl.rcParams['lines.antialiased'],) self.set_linestyles(linestyles) - colors = _colors.colorConverter.to_rgba_array(colors) + colors = mcolors.colorConverter.to_rgba_array(colors) Collection.__init__( self, @@ -930,9 +835,6 @@ self.set_segments(segments) - def get_paths(self): - return self._paths - def set_segments(self, segments): if segments is None: return _segments = [] @@ -947,6 +849,7 @@ self._paths = [mpath.Path(seg) for seg in _segments] set_verts = set_segments # for compatibility with PolyCollection + set_paths = set_segments def _add_offsets(self, segs): offsets = self._uniform_offsets @@ -970,7 +873,7 @@ ACCEPTS: matplotlib color arg or sequence of rgba tuples """ - self._edgecolors = _colors.colorConverter.to_rgba_array(c) + self.set_edgecolor(c) def color(self, c): """ @@ -992,6 +895,7 @@ """ A collection of circles, drawn using splines. """ + @docstring.dedent_interpd def __init__(self, sizes, **kwargs): """ *sizes* @@ -1003,12 +907,12 @@ self._sizes = sizes self.set_transform(transforms.IdentityTransform()) self._paths = [mpath.Path.unit_circle()] - __init__.__doc__ = cbook.dedent(__init__.__doc__) % artist.kwdocd def get_sizes(self): "return sizes of circles" return self._sizes + @allow_rasterization def draw(self, renderer): # sizes is the area of the circle circumscribing the polygon # in points^2 @@ -1018,92 +922,88 @@ for x in self._sizes] return Collection.draw(self, renderer) - def get_paths(self): - return self._paths class EllipseCollection(Collection): """ A collection of ellipses, drawn using splines. """ + @docstring.dedent_interpd def __init__(self, widths, heights, angles, units='points', **kwargs): """ *widths*: sequence - half-lengths of first axes (e.g., semi-major axis lengths) + lengths of first axes (e.g., major axis lengths) *heights*: sequence - half-lengths of second axes + lengths of second axes *angles*: sequence angles of first axes, degrees CCW from the X-axis - *units*: ['points' | 'inches' | 'dots' | 'width' | 'height' | 'x' | 'y'] + *units*: ['points' | 'inches' | 'dots' | 'width' | 'height' + | 'x' | 'y' | 'xy'] units in which majors and minors are given; 'width' and 'height' refer to the dimensions of the axes, while 'x' and 'y' - refer to the *offsets* data units. + refer to the *offsets* data units. 'xy' differs from all + others in that the angle as plotted varies with the + aspect ratio, and equals the specified angle only when + the aspect ratio is unity. Hence it behaves the same + as the :class:`~matplotlib.patches.Ellipse` with + axes.transData as its transform. Additional kwargs inherited from the base :class:`Collection`: %(Collection)s """ Collection.__init__(self,**kwargs) - self._widths = np.asarray(widths).ravel() - self._heights = np.asarray(heights).ravel() + self._widths = 0.5 * np.asarray(widths).ravel() + self._heights = 0.5 * np.asarray(heights).ravel() self._angles = np.asarray(angles).ravel() *(np.pi/180.0) self._units = units self.set_transform(transforms.IdentityTransform()) self._transforms = [] self._paths = [mpath.Path.unit_circle()] - self._initialized = False - - - __init__.__doc__ = cbook.dedent(__init__.__doc__) % artist.kwdocd - - def _init(self): - def on_dpi_change(fig): - self._transforms = [] - self.figure.callbacks.connect('dpi_changed', on_dpi_change) - self._initialized = True - def set_transforms(self): - if not self._initialized: - self._init() + def _set_transforms(self): + """ + Calculate transforms immediately before drawing. + """ self._transforms = [] ax = self.axes fig = self.figure - if self._units in ('x', 'y'): - if self._units == 'x': - dx0 = ax.viewLim.width - dx1 = ax.bbox.width - else: - dx0 = ax.viewLim.height - dx1 = ax.bbox.height - sc = dx1/dx0 + + if self._units == 'xy': + sc = 1 + elif self._units == 'x': + sc = ax.bbox.width / ax.viewLim.width + elif self._units == 'y': + sc = ax.bbox.height / ax.viewLim.height + elif self._units == 'inches': + sc = fig.dpi + elif self._units == 'points': + sc = fig.dpi / 72.0 + elif self._units == 'width': + sc = ax.bbox.width + elif self._units == 'height': + sc = ax.bbox.height + elif self._units == 'dots': + sc = 1.0 else: - if self._units == 'inches': - sc = fig.dpi - elif self._units == 'points': - sc = fig.dpi / 72.0 - elif self._units == 'width': - sc = ax.bbox.width - elif self._units == 'height': - sc = ax.bbox.height - elif self._units == 'dots': - sc = 1.0 - else: - raise ValueError('unrecognized units: %s' % self._units) + raise ValueError('unrecognized units: %s' % self._units) _affine = transforms.Affine2D for x, y, a in zip(self._widths, self._heights, self._angles): trans = _affine().scale(x * sc, y * sc).rotate(a) self._transforms.append(trans) - def draw(self, renderer): - if True: ###not self._transforms: - self.set_transforms() - return Collection.draw(self, renderer) + if self._units == 'xy': + m = ax.transData.get_affine().get_matrix().copy() + m[:2, 2:] = 0 + self.set_transform(_affine(m)) - def get_paths(self): - return self._paths + @allow_rasterization + def draw(self, renderer): + self._set_transforms() + Collection.draw(self, renderer) class PatchCollection(Collection): """ @@ -1140,13 +1040,14 @@ if match_original: def determine_facecolor(patch): - if patch.fill: + if patch.get_fill(): return patch.get_facecolor() return [0, 0, 0, 0] facecolors = [determine_facecolor(p) for p in patches] edgecolors = [p.get_edgecolor() for p in patches] linewidths = [p.get_linewidth() for p in patches] + linestyles = [p.get_linestyle() for p in patches] antialiaseds = [p.get_antialiased() for p in patches] Collection.__init__( @@ -1154,22 +1055,207 @@ edgecolors=edgecolors, facecolors=facecolors, linewidths=linewidths, - linestyles='solid', + linestyles=linestyles, antialiaseds = antialiaseds) else: Collection.__init__(self, **kwargs) - paths = [p.get_transform().transform_path(p.get_path()) - for p in patches] + self.set_paths(patches) + def set_paths(self, patches): + paths = [p.get_transform().transform_path(p.get_path()) + for p in patches] self._paths = paths + +class QuadMesh(Collection): + """ + Class for the efficient drawing of a quadrilateral mesh. + + A quadrilateral mesh consists of a grid of vertices. The + dimensions of this array are (*meshWidth* + 1, *meshHeight* + + 1). Each vertex in the mesh has a different set of "mesh + coordinates" representing its position in the topology of the + mesh. For any values (*m*, *n*) such that 0 <= *m* <= *meshWidth* + and 0 <= *n* <= *meshHeight*, the vertices at mesh coordinates + (*m*, *n*), (*m*, *n* + 1), (*m* + 1, *n* + 1), and (*m* + 1, *n*) + form one of the quadrilaterals in the mesh. There are thus + (*meshWidth* * *meshHeight*) quadrilaterals in the mesh. The mesh + need not be regular and the polygons need not be convex. + + A quadrilateral mesh is represented by a (2 x ((*meshWidth* + 1) * + (*meshHeight* + 1))) numpy array *coordinates*, where each row is + the *x* and *y* coordinates of one of the vertices. To define the + function that maps from a data point to its corresponding color, + use the :meth:`set_cmap` method. Each of these arrays is indexed in + row-major order by the mesh coordinates of the vertex (or the mesh + coordinates of the lower left vertex, in the case of the + colors). + + For example, the first entry in *coordinates* is the + coordinates of the vertex at mesh coordinates (0, 0), then the one + at (0, 1), then at (0, 2) .. (0, meshWidth), (1, 0), (1, 1), and + so on. + + *shading* may be 'flat', 'faceted' or 'gouraud' + """ + def __init__(self, meshWidth, meshHeight, coordinates, showedges, + antialiased=True, shading='flat', **kwargs): + Collection.__init__(self, **kwargs) + self._meshWidth = meshWidth + self._meshHeight = meshHeight + self._coordinates = coordinates + self._showedges = showedges + self._antialiased = antialiased + self._shading = shading + + self._bbox = transforms.Bbox.unit() + self._bbox.update_from_data_xy(coordinates.reshape( + ((meshWidth + 1) * (meshHeight + 1), 2))) + + # By converting to floats now, we can avoid that on every draw. + self._coordinates = self._coordinates.reshape((meshHeight + 1, meshWidth + 1, 2)) + self._coordinates = np.array(self._coordinates, np.float_) + def get_paths(self): + if self._paths is None: + self.set_paths() return self._paths + def set_paths(self): + self._paths = self.convert_mesh_to_paths( + self._meshWidth, self._meshHeight, self._coordinates) + + @staticmethod + def convert_mesh_to_paths(meshWidth, meshHeight, coordinates): + """ + Converts a given mesh into a sequence of + :class:`matplotlib.path.Path` objects for easier rendering by + backends that do not directly support quadmeshes. + + This function is primarily of use to backend implementers. + """ + Path = mpath.Path + + if ma.isMaskedArray(coordinates): + c = coordinates.data + else: + c = coordinates + + points = np.concatenate(( + c[0:-1, 0:-1], + c[0:-1, 1: ], + c[1: , 1: ], + c[1: , 0:-1], + c[0:-1, 0:-1] + ), axis=2) + points = points.reshape((meshWidth * meshHeight, 5, 2)) + return [Path(x) for x in points] + + def convert_mesh_to_triangles(self, meshWidth, meshHeight, coordinates): + """ + Converts a given mesh into a sequence of triangles, each point + with its own color. This is useful for experiments using + `draw_qouraud_triangle`. + """ + Path = mpath.Path + + if ma.isMaskedArray(coordinates): + p = coordinates.data + else: + p = coordinates + + p_a = p[0:-1, 0:-1] + p_b = p[0:-1, 1: ] + p_c = p[1: , 1: ] + p_d = p[1: , 0:-1] + p_center = (p_a + p_b + p_c + p_d) / 4.0 + + triangles = np.concatenate(( + p_a, p_b, p_center, + p_b, p_c, p_center, + p_c, p_d, p_center, + p_d, p_a, p_center, + ), axis=2) + triangles = triangles.reshape((meshWidth * meshHeight * 4, 3, 2)) + + c = self.get_facecolor().reshape((meshHeight + 1, meshWidth + 1, 4)) + c_a = c[0:-1, 0:-1] + c_b = c[0:-1, 1: ] + c_c = c[1: , 1: ] + c_d = c[1: , 0:-1] + c_center = (c_a + c_b + c_c + c_d) / 4.0 + + colors = np.concatenate(( + c_a, c_b, c_center, + c_b, c_c, c_center, + c_c, c_d, c_center, + c_d, c_a, c_center, + ), axis=2) + colors = colors.reshape((meshWidth * meshHeight * 4, 3, 4)) + + return triangles, colors + + def get_datalim(self, transData): + return self._bbox + + @allow_rasterization + def draw(self, renderer): + if not self.get_visible(): return + renderer.open_group(self.__class__.__name__) + transform = self.get_transform() + transOffset = self._transOffset + offsets = self._offsets + + if self.have_units(): + if len(self._offsets): + xs = self.convert_xunits(self._offsets[:0]) + ys = self.convert_yunits(self._offsets[:1]) + offsets = zip(xs, ys) + + offsets = np.asarray(offsets, np.float_) + + if self.check_update('array'): + self.update_scalarmappable() + + if not transform.is_affine: + coordinates = self._coordinates.reshape( + (self._coordinates.shape[0] * + self._coordinates.shape[1], + 2)) + coordinates = transform.transform(coordinates) + coordinates = coordinates.reshape(self._coordinates.shape) + transform = transforms.IdentityTransform() + else: + coordinates = self._coordinates + + if not transOffset.is_affine: + offsets = transOffset.transform_non_affine(offsets) + transOffset = transOffset.get_affine() + + gc = renderer.new_gc() + self._set_gc_clip(gc) + gc.set_linewidth(self.get_linewidth()[0]) + + if self._shading == 'gouraud': + triangles, colors = self.convert_mesh_to_triangles( + self._meshWidth, self._meshHeight, coordinates) + renderer.draw_gouraud_triangles(gc, triangles, colors, transform.frozen()) + else: + renderer.draw_quad_mesh( + gc, transform.frozen(), self._meshWidth, self._meshHeight, + coordinates, offsets, transOffset, self.get_facecolor(), + self._antialiased, self._showedges) + gc.restore() + renderer.close_group(self.__class__.__name__) + + + -artist.kwdocd['Collection'] = patchstr = artist.kwdoc(Collection) -for k in ('QuadMesh', 'PolyCollection', 'BrokenBarHCollection', 'RegularPolyCollection', - 'StarPolygonCollection', 'PatchCollection', 'CircleCollection'): - artist.kwdocd[k] = patchstr -artist.kwdocd['LineCollection'] = artist.kwdoc(LineCollection) +patchstr = artist.kwdoc(Collection) +for k in ('QuadMesh', 'PolyCollection', 'BrokenBarHCollection', + 'RegularPolyCollection', 'PathCollection', + 'StarPolygonCollection', 'PatchCollection', + 'CircleCollection', 'Collection',): + docstring.interpd.update({k:patchstr}) +docstring.interpd.update(LineCollection = artist.kwdoc(LineCollection)) diff -Nru matplotlib-0.99.3/lib/matplotlib/colorbar.py matplotlib-1.0.1/lib/matplotlib/colorbar.py --- matplotlib-0.99.3/lib/matplotlib/colorbar.py 2009-07-31 15:14:41.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/colorbar.py 2010-07-07 01:41:52.000000000 +0000 @@ -18,11 +18,13 @@ is a thin wrapper over :meth:`~matplotlib.figure.Figure.colorbar`. ''' +import warnings import numpy as np import matplotlib as mpl import matplotlib.colors as colors import matplotlib.cm as cm +from matplotlib import docstring import matplotlib.ticker as ticker import matplotlib.cbook as cbook import matplotlib.lines as lines @@ -150,6 +152,7 @@ ''' % (make_axes_kw_doc, colormap_kw_doc) +docstring.interpd.update(colorbar_doc=colorbar_doc) class ColorbarBase(cm.ScalarMappable): @@ -157,8 +160,9 @@ Draw a colorbar in an existing axes. This is a base class for the :class:`Colorbar` class, which is the - basis for the :func:`~matplotlib.pyplot.colorbar` method and pylab - function. + basis for the :func:`~matplotlib.pyplot.colorbar` function and the + :meth:`~matplotlib.figure.Figure.colorbar` method, which are the + usual ways of creating a colorbar. It is also useful by itself for showing a colormap. If the *cmap* kwarg is given but *boundaries* and *values* are left as None, @@ -193,7 +197,7 @@ def __init__(self, ax, cmap=None, norm=None, - alpha=1.0, + alpha=None, values=None, boundaries=None, orientation='vertical', @@ -205,6 +209,7 @@ filled=True, ): self.ax = ax + self._patch_ax() if cmap is None: cmap = cm.get_cmap() if norm is None: norm = colors.Normalize() self.alpha = alpha @@ -219,6 +224,8 @@ self.filled = filled self.solids = None self.lines = None + self.outline = None + self.patch = None self.dividers = None self.set_label('') if cbook.iterable(ticks): @@ -235,8 +242,16 @@ else: self.formatter = format # Assume it is a Formatter # The rest is in a method so we can recalculate when clim changes. + self.config_axis() self.draw_all() + def _patch_ax(self): + def _warn(*args, **kw): + warnings.warn("Use the colorbar set_ticks() method instead.") + + self.ax.set_xticks = _warn + self.ax.set_yticks = _warn + def draw_all(self): ''' Calculate any free parameters based on the current cmap and norm, @@ -249,8 +264,62 @@ self._config_axes(X, Y) if self.filled: self._add_solids(X, Y, C) + + def config_axis(self): + ax = self.ax + if self.orientation == 'vertical': + ax.xaxis.set_ticks([]) + ax.yaxis.set_label_position('right') + ax.yaxis.set_ticks_position('right') + else: + ax.yaxis.set_ticks([]) + ax.xaxis.set_label_position('bottom') + self._set_label() + def update_ticks(self): + """ + Force the update of the ticks and ticklabels. This must be + called whenever the tick locator and/or tick formatter changes. + """ + ax = self.ax + ticks, ticklabels, offset_string = self._ticker() + if self.orientation == 'vertical': + ax.yaxis.set_ticks(ticks) + ax.set_yticklabels(ticklabels) + ax.yaxis.get_major_formatter().set_offset_string(offset_string) + + else: + ax.xaxis.set_ticks(ticks) + ax.set_xticklabels(ticklabels) + ax.xaxis.get_major_formatter().set_offset_string(offset_string) + + def set_ticks(self, ticks, update_ticks=True): + """ + set tick locations. Tick locations are updated immediately unless update_ticks is + *False*. To manually update the ticks, call *update_ticks* method explicitly. + """ + if cbook.iterable(ticks): + self.locator = ticker.FixedLocator(ticks, nbins=len(ticks)) + else: + self.locator = ticks + + if update_ticks: + self.update_ticks() + + def set_ticklabels(self, ticklabels, update_ticks=True): + """ + set tick labels. Tick labels are updated immediately unless update_ticks is + *False*. To manually update the ticks, call *update_ticks* method explicitly. + """ + if isinstance(self.locator, ticker.FixedLocator): + self.formatter = ticker.FixedFormatter(ticklabels) + if update_ticks: + self.update_ticks() + else: + warnings.warn("set_ticks() must have been called.") + + def _config_axes(self, X, Y): ''' Make an axes patch and outline. @@ -262,32 +331,24 @@ ax.update_datalim(xy) ax.set_xlim(*ax.dataLim.intervalx) ax.set_ylim(*ax.dataLim.intervaly) + if self.outline is not None: + self.outline.remove() self.outline = lines.Line2D(xy[:, 0], xy[:, 1], color=mpl.rcParams['axes.edgecolor'], linewidth=mpl.rcParams['axes.linewidth']) ax.add_artist(self.outline) self.outline.set_clip_box(None) self.outline.set_clip_path(None) c = mpl.rcParams['axes.facecolor'] + if self.patch is not None: + self.patch.remove() self.patch = patches.Polygon(xy, edgecolor=c, facecolor=c, linewidth=0.01, zorder=-1) ax.add_artist(self.patch) - ticks, ticklabels, offset_string = self._ticker() - if self.orientation == 'vertical': - ax.set_xticks([]) - ax.yaxis.set_label_position('right') - ax.yaxis.set_ticks_position('right') - ax.set_yticks(ticks) - ax.set_yticklabels(ticklabels) - ax.yaxis.get_major_formatter().set_offset_string(offset_string) - else: - ax.set_yticks([]) - ax.xaxis.set_label_position('bottom') - ax.set_xticks(ticks) - ax.set_xticklabels(ticklabels) - ax.xaxis.get_major_formatter().set_offset_string(offset_string) + self.update_ticks() + def _set_label(self): if self.orientation == 'vertical': @@ -336,22 +397,27 @@ Draw the colors using :meth:`~matplotlib.axes.Axes.pcolor`; optionally add separators. ''' - ## Change to pcolorfast after fixing bugs in some backends... if self.orientation == 'vertical': args = (X, Y, C) else: args = (np.transpose(Y), np.transpose(X), np.transpose(C)) kw = {'cmap':self.cmap, 'norm':self.norm, - 'shading':'flat', 'alpha':self.alpha} + 'alpha':self.alpha,} # Save, set, and restore hold state to keep pcolor from # clearing the axes. Ordinarily this will not be needed, # since the axes object should already have hold set. _hold = self.ax.ishold() self.ax.hold(True) - col = self.ax.pcolor(*args, **kw) + col = self.ax.pcolormesh(*args, **kw) self.ax.hold(_hold) #self.add_observer(col) # We should observe, not be observed... + + if self.solids is not None: + self.solids.remove() self.solids = col + if self.dividers is not None: + self.dividers.remove() + self.dividers = None if self.drawedges: self.dividers = collections.LineCollection(self._edges(X,Y), colors=(mpl.rcParams['axes.edgecolor'],), @@ -374,6 +440,9 @@ else: xy = [zip(Y[i], X[i]) for i in range(N)] col = collections.LineCollection(xy, linewidths=linewidths) + + if self.lines: + self.lines.remove() self.lines = col col.set_color(colors) self.ax.add_collection(col) @@ -412,6 +481,10 @@ locator.set_data_interval(*intv) formatter.set_view_interval(*intv) formatter.set_data_interval(*intv) + + # the dummy axis is expecting a minpos + locator.axis.get_minpos = lambda : intv[0] + formatter.axis.get_minpos = lambda : intv[0] b = np.array(locator()) b, ticks = self._locate(b) formatter.set_locs(b) @@ -618,6 +691,17 @@ self.alpha = alpha class Colorbar(ColorbarBase): + """ + This class connects a :class:`ColorbarBase` to a + :class:`~matplotlib.cm.ScalarMappable` such as a + :class:`~matplotlib.image.AxesImage` generated via + :meth:`~matplotlib.axes.Axes.imshow`. + + It is not intended to be instantiated directly; instead, + use :meth:`~matplotlib.figure.Figure.colorbar` or + :func:`~matplotlib.pyplot.colorbar` to make your colorbar. + + """ def __init__(self, ax, mappable, **kw): mappable.autoscale_None() # Ensure mappable.norm.vmin, vmax # are set when colorbar is called, @@ -666,21 +750,44 @@ #print 'tlinewidths:', tlinewidths ColorbarBase.add_lines(self, CS.levels, tcolors, tlinewidths) + def update_normal(self, mappable): + ''' + update solid, lines, etc. Unlike update_bruteforce, it does + not clear the axes. This is meant to be called when the image + or contour plot to which this colorbar belongs is changed. + ''' + self.draw_all() + if isinstance(self.mappable, contour.ContourSet): + CS = self.mappable + if not CS.filled: + self.add_lines(CS) + + def update_bruteforce(self, mappable): ''' - Manually change any contour line colors. This is called - when the image or contour plot to which this colorbar belongs - is changed. + Destroy and rebuild the colorbar. This is + intended to become obsolete, and will probably be + deprecated and then removed. It is not called when + the pyplot.colorbar function or the Figure.colorbar + method are used to create the colorbar. + ''' # We are using an ugly brute-force method: clearing and # redrawing the whole thing. The problem is that if any # properties have been changed by methods other than the # colorbar methods, those changes will be lost. self.ax.cla() + # clearing the axes will delete outline, patch, solids, and lines: + self.outline = None + self.patch = None + self.solids = None + self.lines = None + self.dividers = None + self.set_alpha(mappable.get_alpha()) + self.cmap = mappable.cmap + self.norm = mappable.norm + self.config_axis() self.draw_all() - #if self.vmin != self.norm.vmin or self.vmax != self.norm.vmax: - # self.ax.cla() - # self.draw_all() if isinstance(self.mappable, contour.ContourSet): CS = self.mappable if not CS.filled: @@ -693,7 +800,25 @@ # be recalculating everything if there was a simple alpha # change. +@docstring.Substitution(make_axes_kw_doc) def make_axes(parent, **kw): + ''' + Resize and reposition a parent axes, and return a child + axes suitable for a colorbar:: + + cax, kw = make_axes(parent, **kw) + + Keyword arguments may include the following (with defaults): + + *orientation* + 'vertical' or 'horizontal' + + %s + + All but the first of these are stripped from the input kw set. + + Returns (cax, kw), the child axes and the reduced kw dictionary. + ''' orientation = kw.setdefault('orientation', 'vertical') fraction = kw.pop('fraction', 0.15) shrink = kw.pop('shrink', 1.0) @@ -720,22 +845,3 @@ cax = fig.add_axes(pbcb) cax.set_aspect(aspect, anchor=anchor, adjustable='box') return cax, kw -make_axes.__doc__ =''' - Resize and reposition a parent axes, and return a child - axes suitable for a colorbar:: - - cax, kw = make_axes(parent, **kw) - - Keyword arguments may include the following (with defaults): - - *orientation* - 'vertical' or 'horizontal' - - %s - - All but the first of these are stripped from the input kw set. - - Returns (cax, kw), the child axes and the reduced kw dictionary. - ''' % make_axes_kw_doc - - diff -Nru matplotlib-0.99.3/lib/matplotlib/colors.py matplotlib-1.0.1/lib/matplotlib/colors.py --- matplotlib-0.99.3/lib/matplotlib/colors.py 2010-03-09 14:20:20.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/colors.py 2010-08-25 16:53:11.000000000 +0000 @@ -217,8 +217,8 @@ def rgb2hex(rgb): - 'Given a len 3 rgb tuple of 0-1 floats, return the hex string' - return '#%02x%02x%02x' % tuple([round(val*255) for val in rgb]) + 'Given an rgb or rgba sequence of 0-1 floats, return the hex string' + return '#%02x%02x%02x' % tuple([round(val*255) for val in rgb[:3]]) hexColorPattern = re.compile("\A#[a-fA-F0-9]{6}\Z") @@ -382,10 +382,17 @@ if (c.ravel() > 1).any() or (c.ravel() < 0).any(): raise ValueError( "number in rgba sequence is outside 0-1 range") - # looks like rgba already, nothing to be done; do - # we want to apply alpha here if - # (c[:,3]==1).all() ? - return np.asarray(c, np.float) + result = np.asarray(c, np.float) + if alpha is not None: + if alpha > 1 or alpha < 0: + raise ValueError("alpha must be in 0-1 range") + result[:,3] = alpha + return result + # This alpha operation above is new, and depends + # on higher levels to refrain from setting alpha + # to values other than None unless there is + # intent to override any existing alpha values. + # It must be some other sequence of color specs. result = np.zeros((nc, 4), dtype=np.float) for i, cc in enumerate(c): @@ -394,7 +401,7 @@ colorConverter = ColorConverter() -def makeMappingArray(N, data): +def makeMappingArray(N, data, gamma=1.0): """Create an *N* -element 1-d lookup table *data* represented by a list of x,y0,y1 mapping correspondences. @@ -408,9 +415,18 @@ all values of x must be in increasing order. Values between the given mapping points are determined by simple linear interpolation. + Alternatively, data can be a function mapping values between 0 - 1 + to 0 - 1. + The function returns an array "result" where ``result[x*(N-1)]`` gives the closest value for values of x between 0 and 1. """ + + if callable(data): + xind = np.linspace(0, 1, N)**gamma + lut = np.clip(np.array(data(xind), dtype=np.float), 0, 1) + return lut + try: adata = np.array(data) except: @@ -432,7 +448,7 @@ # begin generation of lookup table x = x * (N-1) lut = np.zeros((N,), np.float) - xind = np.arange(float(N)) + xind = (N - 1) * np.linspace(0, 1, N)**gamma ind = np.searchsorted(x, xind)[1:-1] lut[1:-1] = ( ((xind[1:-1] - x[ind-1]) / (x[ind] - x[ind-1])) @@ -473,7 +489,7 @@ self._isinit = False - def __call__(self, X, alpha=1.0, bytes=False): + def __call__(self, X, alpha=None, bytes=False): """ *X* is either a scalar or an array (of any dimension). If scalar, a tuple of rgba values is returned, otherwise @@ -481,18 +497,12 @@ are integers, then they are used as indices into the array. If they are floating point, then they must be in the interval (0.0, 1.0). - Alpha must be a scalar. + Alpha must be a scalar between 0 and 1, or None. If bytes is False, the rgba values will be floats on a 0-1 scale; if True, they will be uint8, 0-255. """ if not self._isinit: self._init() - alpha = min(alpha, 1.0) # alpha must be between 0 and 1 - alpha = max(alpha, 0.0) - self._lut[:-1,-1] = alpha # Don't assign global alpha to i_bad; - # it would defeat the purpose of the - # default behavior, which is to not - # show anything where data are missing. mask_bad = None if not cbook.iterable(X): vtype = 'scalar' @@ -523,7 +533,21 @@ if bytes: lut = (self._lut * 255).astype(np.uint8) else: - lut = self._lut + lut = self._lut.copy() # Don't let alpha modify original _lut. + + if alpha is not None: + alpha = min(alpha, 1.0) # alpha must be between 0 and 1 + alpha = max(alpha, 0.0) + if (lut[-1] == 0).all(): + lut[:-1, -1] = alpha + # All zeros is taken as a flag for the default bad + # color, which is no color--fully transparent. We + # don't want to override this. + else: + lut[:,-1] = alpha + # If the bad value is set to have a color, then we + # override its alpha just as for any other value. + rgba = np.empty(shape=xa.shape+(4,), dtype=lut.dtype) lut.take(xa, axis=0, mode='clip', out=rgba) # twice as fast as lut[xa]; @@ -533,20 +557,20 @@ rgba = tuple(rgba[0,:]) return rgba - def set_bad(self, color = 'k', alpha = 1.0): + def set_bad(self, color = 'k', alpha = None): '''Set color to be used for masked values. ''' self._rgba_bad = colorConverter.to_rgba(color, alpha) if self._isinit: self._set_extremes() - def set_under(self, color = 'k', alpha = 1.0): + def set_under(self, color = 'k', alpha = None): '''Set color to be used for low out-of-range values. Requires norm.clip = False ''' self._rgba_under = colorConverter.to_rgba(color, alpha) if self._isinit: self._set_extremes() - def set_over(self, color = 'k', alpha = 1.0): + def set_over(self, color = 'k', alpha = None): '''Set color to be used for high out-of-range values. Requires norm.clip = False ''' @@ -581,7 +605,7 @@ primary color, with the 0-1 domain divided into any number of segments. """ - def __init__(self, name, segmentdata, N=256): + def __init__(self, name, segmentdata, N=256, gamma=1.0): """Create color map from linear mapping segments segmentdata argument is a dictionary with a red, green and blue @@ -632,26 +656,46 @@ # needed for contouring. Colormap.__init__(self, name, N) self._segmentdata = segmentdata + self._gamma = gamma def _init(self): self._lut = np.ones((self.N + 3, 4), np.float) - self._lut[:-3, 0] = makeMappingArray(self.N, self._segmentdata['red']) - self._lut[:-3, 1] = makeMappingArray(self.N, self._segmentdata['green']) - self._lut[:-3, 2] = makeMappingArray(self.N, self._segmentdata['blue']) + self._lut[:-3, 0] = makeMappingArray(self.N, + self._segmentdata['red'], self._gamma) + self._lut[:-3, 1] = makeMappingArray(self.N, + self._segmentdata['green'], self._gamma) + self._lut[:-3, 2] = makeMappingArray(self.N, + self._segmentdata['blue'], self._gamma) self._isinit = True self._set_extremes() + def set_gamma(self, gamma): + """ + Set a new gamma value and regenerate color map. + """ + self._gamma = gamma + self._init() + @staticmethod - def from_list(name, colors, N=256): + def from_list(name, colors, N=256, gamma=1.0): """ Make a linear segmented colormap with *name* from a sequence of *colors* which evenly transitions from colors[0] at val=0 to colors[-1] at val=1. *N* is the number of rgb quantization levels. + Alternatively, a list of (value, color) tuples can be given + to divide the range unevenly. """ - ncolors = len(colors) - vals = np.linspace(0., 1., ncolors) + if not cbook.iterable(colors): + raise ValueError('colors must be iterable') + + if cbook.iterable(colors[0]) and len(colors[0]) == 2 and \ + not cbook.is_string_like(colors[0]): + # List of value, color pairs + vals, colors = zip(*colors) + else: + vals = np.linspace(0., 1., len(colors)) cdict = dict(red=[], green=[], blue=[]) for val, color in zip(vals, colors): @@ -660,7 +704,7 @@ cdict['green'].append((val, g, g)) cdict['blue'].append((val, b, b)) - return LinearSegmentedColormap(name, cdict, N) + return LinearSegmentedColormap(name, cdict, N, gamma) class ListedColormap(Colormap): """Colormap object generated from a list of colors. @@ -767,11 +811,13 @@ elif vmin==vmax: result = 0.0 * val else: + vmin = float(vmin) + vmax = float(vmax) if clip: mask = ma.getmask(val) val = ma.array(np.clip(val.filled(vmax), vmin, vmax), mask=mask) - result = (val-vmin) * (1.0/(vmax-vmin)) + result = (val-vmin) / (vmax-vmin) if vtype == 'scalar': result = result[0] return result @@ -779,7 +825,8 @@ def inverse(self, value): if not self.scaled(): raise ValueError("Not invertible until scaled") - vmin, vmax = self.vmin, self.vmax + vmin = float(self.vmin) + vmax = float(self.vmax) if cbook.iterable(value): val = ma.asarray(value) @@ -787,18 +834,17 @@ else: return vmin + value * (vmax - vmin) - def autoscale(self, A): ''' Set *vmin*, *vmax* to min, max of *A*. ''' - self.vmin = ma.minimum(A) - self.vmax = ma.maximum(A) + self.vmin = ma.min(A) + self.vmax = ma.max(A) def autoscale_None(self, A): ' autoscale only None-valued vmin or vmax' - if self.vmin is None: self.vmin = ma.minimum(A) - if self.vmax is None: self.vmax = ma.maximum(A) + if self.vmin is None: self.vmin = ma.min(A) + if self.vmax is None: self.vmax = ma.max(A) def scaled(self): 'return true if vmin and vmax set' @@ -819,6 +865,8 @@ vtype = 'scalar' val = ma.array([value]).astype(np.float) + val = ma.masked_less_equal(val, 0, copy=False) + self.autoscale_None(val) vmin, vmax = self.vmin, self.vmax if vmin > vmax: @@ -848,6 +896,24 @@ else: return vmin * pow((vmax/vmin), value) + def autoscale(self, A): + ''' + Set *vmin*, *vmax* to min, max of *A*. + ''' + A = ma.masked_less_equal(A, 0, copy=False) + self.vmin = ma.min(A) + self.vmax = ma.max(A) + + def autoscale_None(self, A): + ' autoscale only None-valued vmin or vmax' + if self.vmin is not None and self.vmax is not None: + return + A = ma.masked_less_equal(A, 0, copy=False) + if self.vmin is None: + self.vmin = ma.min(A) + if self.vmax is None: + self.vmax = ma.max(A) + class BoundaryNorm(Normalize): ''' Generate a colormap index based on discrete intervals. @@ -1025,6 +1091,19 @@ RGBA values are returned, which can then be used to plot the shaded image with imshow. """ + + rgb0 = cmap((data-data.min())/(data.max()-data.min())) + rgb1 = self.shade_rgb(rgb0, elevation=data) + rgb0[:,:,0:3] = rgb1 + return rgb0 + + def shade_rgb(self,rgb, elevation, fraction=1.): + """ + Take the input RGB array (ny*nx*3) adjust their color values + to given the impression of a shaded relief map with a + specified light source using the elevation (ny*nx). + A new RGB array ((ny*nx*3)) is returned. + """ # imagine an artificial sun placed at infinity in # some azimuth and elevation position illuminating our surface. The parts of # the surface that slope toward the sun should brighten while those sides @@ -1033,7 +1112,7 @@ az = self.azdeg*np.pi/180.0 alt = self.altdeg*np.pi/180.0 # gradient in x and y directions - dx, dy = np.gradient(data) + dx, dy = np.gradient(elevation) slope = 0.5*np.pi - np.arctan(np.hypot(dx, dy)) aspect = np.arctan2(dx, dy) intensity = np.sin(alt)*np.sin(slope) + np.cos(alt)*np.cos(slope)*np.cos(-az -\ @@ -1041,9 +1120,9 @@ # rescale to interval -1,1 # +1 means maximum sun exposure and -1 means complete shade. intensity = (intensity - intensity.min())/(intensity.max() - intensity.min()) - intensity = 2.*intensity - 1. + intensity = (2.*intensity - 1.)*fraction # convert to rgb, then rgb to hsv - rgb = cmap((data-data.min())/(data.max()-data.min())) + #rgb = cmap((data-data.min())/(data.max()-data.min())) hsv = rgb_to_hsv(rgb[:,:,0:3]) # modify hsv values to simulate illumination. hsv[:,:,1] = np.where(np.logical_and(np.abs(hsv[:,:,1])>1.e-10,intensity>0),\ @@ -1057,5 +1136,4 @@ hsv[:,:,1:] = np.where(hsv[:,:,1:]<0.,0,hsv[:,:,1:]) hsv[:,:,1:] = np.where(hsv[:,:,1:]>1.,1,hsv[:,:,1:]) # convert modified hsv back to rgb. - rgb[:,:,0:3] = hsv_to_rgb(hsv) - return rgb + return hsv_to_rgb(hsv) diff -Nru matplotlib-0.99.3/lib/matplotlib/config/checkdep.py matplotlib-1.0.1/lib/matplotlib/config/checkdep.py --- matplotlib-0.99.3/lib/matplotlib/config/checkdep.py 2009-07-31 15:14:39.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/config/checkdep.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,124 +0,0 @@ -import os -import re -import sys -import warnings -import distutils.version as version - -tex_req = '3.1415' -gs_req = '7.07' -gs_sugg = '8.60' -dvipng_req = '1.5' -pdftops_req = '3.0' - -def dvipng(): - try: - stdin, stdout = os.popen4('dvipng -version') - return stdout.readlines()[1].split()[-1] - except (IndexError, ValueError): - return None - -def ghostscript(): - try: - if sys.platform == 'win32': - command = 'gswin32c --version' - else: - command = 'gs --version' - stdin, stdout = os.popen4(command) - return stdout.read()[:-1] - except (IndexError, ValueError): - return None - -def tex(): - try: - stdin, stdout = os.popen4('tex -version') - line = stdout.readlines()[0] - pattern = '3\.1\d+' - match = re.search(pattern, line) - return match.group(0) - except (IndexError, ValueError, AttributeError): - return None - -def pdftops(): - try: - stdin, stdout = os.popen4('pdftops -v') - for line in stdout.readlines(): - if 'version' in line: - return line.split()[-1] - except (IndexError, ValueError): - return None - -def compare_versions(a, b): - "return True if a is greater than or equal to b" - if a: - a = version.LooseVersion(a) - b = version.LooseVersion(b) - if a>=b: return True - else: return False - else: return False - -def ps_distiller(s): - if not s: - return False - - flag = True - gs_v = ghostscript() - if compare_versions(gs_v, gs_sugg): pass - elif compare_versions(gs_v, gs_req): - verbose.report(('ghostscript-%s found. ghostscript-%s or later ' - 'is recommended to use the ps.usedistiller option.') %\ - (gs_v, gs_sugg)) - else: - flag = False - warnings.warn(('matplotlibrc ps.usedistiller option can not be used ' - 'unless ghostscript-%s or later is installed on your ' - 'system.') % gs_req) - - if s == 'xpdf': - pdftops_v = pdftops() - if compare_versions(pdftops_v, pdftops_req): pass - else: - flag = False - warnings.warn(('matplotlibrc ps.usedistiller can not be set to ' - 'xpdf unless pdftops-%s or later is installed on ' - 'your system.') % pdftops_req) - - if flag: - return s - else: - return False - -def usetex(s): - if not s: - return False - - flag = True - - tex_v = tex() - if compare_versions(tex_v, tex_req): pass - else: - flag = False - warnings.warn(('matplotlibrc text.usetex option can not be used ' - 'unless TeX-%s or later is ' - 'installed on your system') % tex_req) - - dvipng_v = dvipng() - if compare_versions(dvipng_v, dvipng_req): pass - else: - flag = False - warnings.warn( 'matplotlibrc text.usetex can not be used with *Agg ' - 'backend unless dvipng-1.5 or later is ' - 'installed on your system') - - gs_v = ghostscript() - if compare_versions(gs_v, gs_sugg): pass - elif compare_versions(gs_v, gs_req): - verbose.report(('ghostscript-%s found. ghostscript-%s or later is ' - 'recommended for use with the text.usetex ' - 'option.') % (gs_v, gs_sugg)) - else: - flag = False - warnings.warn(('matplotlibrc text.usetex can not be used ' - 'unless ghostscript-%s or later is ' - 'installed on your system') % gs_req) - - return flag diff -Nru matplotlib-0.99.3/lib/matplotlib/config/cutils.py matplotlib-1.0.1/lib/matplotlib/config/cutils.py --- matplotlib-0.99.3/lib/matplotlib/config/cutils.py 2009-07-31 15:14:39.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/config/cutils.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,185 +0,0 @@ -"""Configuration utilities for matplotlib -""" - - -# Stdlib imports -import os -import pytz -import sys -import tempfile -import warnings - -# matplotlib imports -from verbose import verbose -from rcsetup import defaultParams - -def is_string_like(obj): - try: obj + '' - except (TypeError, ValueError): return 0 - return 1 - -def is_writable_dir(p): - """ - p is a string pointing to a putative writable dir -- return True p - is such a string, else False - """ - try: p + '' # test is string like - except TypeError: return False - try: - t = tempfile.TemporaryFile(dir=p) - t.write('1') - t.close() - except OSError: return False - else: return True - -def _get_home(): - """Find user's home directory if possible. - Otherwise raise error. - - :see: http://mail.python.org/pipermail/python-list/2005-February/263921.html - """ - path='' - try: - path=os.path.expanduser("~") - except: - pass - if not os.path.isdir(path): - for evar in ('HOME', 'USERPROFILE', 'TMP'): - try: - path = os.environ[evar] - if os.path.isdir(path): - break - except: pass - if path: - return path - else: - raise RuntimeError('please define environment variable $HOME') - -get_home = verbose.wrap('$HOME=%s', _get_home, always=False) - -def _get_configdir(): - """ - Return the string representing the configuration dir. - - default is HOME/.matplotlib. you can override this with the - MPLCONFIGDIR environment variable - """ - - configdir = os.environ.get('MPLCONFIGDIR') - if configdir is not None: - if not is_writable_dir(configdir): - raise RuntimeError('Could not write to MPLCONFIGDIR="%s"'%configdir) - return configdir - - h = get_home() - p = os.path.join(get_home(), '.matplotlib') - - if os.path.exists(p): - if not is_writable_dir(p): - raise RuntimeError("""\ -'%s' is not a writable dir; you must set %s/.matplotlib to be a writable dir. -You can also set environment variable MPLCONFIGDIR to any writable directory -where you want matplotlib data stored """%(p,h)) - else: - if not is_writable_dir(h): - raise RuntimeError("Failed to create %s/.matplotlib; consider setting MPLCONFIGDIR to a writable directory for matplotlib configuration data"%h) - - os.mkdir(p) - - return p - -get_configdir = verbose.wrap('CONFIGDIR=%s', _get_configdir, always=False) - -def _get_data_path(): - 'get the path to matplotlib data' - - if 'MATPLOTLIBDATA' in os.environ: - path = os.environ['MATPLOTLIBDATA'] - if not os.path.isdir(path): - raise RuntimeError('Path in environment MATPLOTLIBDATA not a directory') - return path - - path = os.sep.join([os.path.dirname(__file__), 'mpl-data']) - if os.path.isdir(path): return path - - # setuptools' namespace_packages may highjack this init file - # so need to try something known to be in matplotlib, not basemap - import matplotlib.afm - path = os.sep.join([os.path.dirname(matplotlib.afm.__file__), 'mpl-data']) - if os.path.isdir(path): return path - - # py2exe zips pure python, so still need special check - if getattr(sys,'frozen',None): - path = os.path.join(os.path.split(sys.path[0])[0], 'mpl-data') - if os.path.isdir(path): return path - else: - # Try again assuming we need to step up one more directory - path = os.path.join(os.path.split(os.path.split(sys.path[0])[0])[0], - 'mpl-data') - if os.path.isdir(path): return path - else: - # Try again assuming sys.path[0] is a dir not a exe - path = os.path.join(sys.path[0], 'mpl-data') - if os.path.isdir(path): return path - - raise RuntimeError('Could not find the matplotlib data files') - -def _get_data_path_cached(): - if defaultParams['datapath'][0] is None: - defaultParams['datapath'][0] = _get_data_path() - return defaultParams['datapath'][0] - -get_data_path = verbose.wrap('matplotlib data path %s', _get_data_path_cached, always=False) - -def get_py2exe_datafiles(): - datapath = get_data_path() - head, tail = os.path.split(datapath) - d = {} - for root, dirs, files in os.walk(datapath): - # Need to explicitly remove cocoa_agg files or py2exe complains - # NOTE I dont know why, but do as previous version - if 'Matplotlib.nib' in files: - files.remove('Matplotlib.nib') - files = [os.path.join(root, filename) for filename in files] - root = root.replace(tail, 'mpl-data') - root = root[root.index('mpl-data'):] - d[root] = files - return d.items() - -# changed name from matplotlib_fname: -def get_config_file(tconfig=False): - """ - Return the path to the rc file - - Search order: - - * current working dir - * environ var MATPLOTLIBRC - * HOME/.matplotlib/matplotlibrc - * MATPLOTLIBDATA/matplotlibrc - - """ - if tconfig: - filename = 'matplotlib.conf' - else: - filename = 'matplotlibrc' - - fname = os.path.join( os.getcwd(), filename) - if os.path.exists(fname): return fname - - if 'MATPLOTLIBRC' in os.environ: - path = os.environ['MATPLOTLIBRC'] - if os.path.exists(path): - fname = os.path.join(path, filename) - if os.path.exists(fname): - return fname - - fname = os.path.join(get_configdir(), filename) - if os.path.exists(fname): return fname - - - path = get_data_path() # guaranteed to exist or raise - fname = os.path.join(path, filename) - if not os.path.exists(fname): - warnings.warn('Could not find %s; using defaults'%filename) - return fname diff -Nru matplotlib-0.99.3/lib/matplotlib/config/__init__.py matplotlib-1.0.1/lib/matplotlib/config/__init__.py --- matplotlib-0.99.3/lib/matplotlib/config/__init__.py 2009-07-31 15:14:39.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/config/__init__.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,12 +0,0 @@ -# Please keep this file empty - -USE_TRAITED_CONFIG = True - -from rcparams import rc -from cutils import get_config_file - -if USE_TRAITED_CONFIG: - #print 'Using new config system!' - from mplconfig import rcParams, mplConfig, save_config, rcdefaults -else: - from rcparams import rcParams, rcdefaults diff -Nru matplotlib-0.99.3/lib/matplotlib/config/matplotlib.conf.default matplotlib-1.0.1/lib/matplotlib/config/matplotlib.conf.default --- matplotlib-0.99.3/lib/matplotlib/config/matplotlib.conf.default 2009-07-31 15:14:39.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/config/matplotlib.conf.default 1970-01-01 00:00:00.000000000 +0000 @@ -1,402 +0,0 @@ -# MPLConfig - plaintext (in .conf format) - -# This is a sample matplotlib configuration file. It should be placed -# in HOME/.matplotlib (unix/linux like systems) and -# C:\Documents and Settings\yourname\.matplotlib (win32 systems) -# -# By default, the installer will overwrite the existing file in the install -# path, so if you want to preserve yours, please move it to your HOME dir and -# set the environment variable if necessary. -# -# This file is best viewed in a editor which supports ini or conf mode syntax -# highlighting. -# -# Blank lines, or lines starting with a comment symbol, are ignored, -# as are trailing comments. Other lines must have the format -# -# key = val optional comment -# -# val should be valid python syntax, just as you would use when setting -# properties using rcParams. This should become more obvious by inspecting -# the default values listed herein. -# -# Colors: for the color values below, you can either use -# - a matplotlib color string, such as r, k, or b -# - an rgb tuple, such as (1.0, 0.5, 0.0) -# - a hex string, such as #ff00ff or ff00ff -# - a scalar grayscale intensity such as 0.75 -# - a legal html color name, eg red, blue, darkslategray -# -# Interactivity: see http://matplotlib.sourceforge.net/interactive.html. -# -# ### CONFIGURATION BEGINS HERE ### - -# a value of type 'str' -datapath = '/usr/lib64/python2.5/site-packages/matplotlib-0.90.1_r3607-py2.5-linux-x86_64.egg/matplotlib/mpl-data' -# one of 0, on, false, 1, no, n, y, off, yes, true -interactive = False -# a value of type 'bool' -maskedarray = False -# 'numpy' or 'numeric' or 'numarray' -numerix = 'numpy' -# 'Africa/Abidjan' or 'Africa/Accra' or 'Africa/Addis_Ababa' or 'Africa/Algiers' -# or 'Africa/Asmara' or 'Africa/Asmera' or 'Africa/Bamako' or 'Africa/Bangui' o -# r 'Africa/Banjul' or 'Africa/Bissau' or 'Africa/Blantyre' or 'Africa/Brazzavil -# <...snipped 10590 chars...> -# or 'Turkey' or 'UCT' or 'US/Alaska' or 'US/Aleutian' or 'US/Arizona' or 'US/Ce -# ntral' or 'US/East-Indiana' or 'US/Eastern' or 'US/Hawaii' or 'US/Indiana-Star -# ke' or 'US/Michigan' or 'US/Mountain' or 'US/Pacific' or 'US/Pacific-New' or ' -# US/Samoa' or 'UTC' or 'Universal' or 'W-SU' or 'WET' or 'Zulu' or 'posixrules' -timezone = 'US/Eastern' -# 'toolbar2' or None -toolbar = 'toolbar2' -# a value of type 'bool' -units = False - -[axes] - # a value of type 'bool' - axisbelow = False - # any valid matplotlib color, eg an abbreviation like 'r' for red, a full - # name like 'orange', a hex color like '#efefef', a grayscale intensity - # like '0.5', or an RGBA tuple (1,0,0,1) - edgecolor = 'k' - # any valid matplotlib color, eg an abbreviation like 'r' for red, a full - # name like 'orange', a hex color like '#efefef', a grayscale intensity - # like '0.5', or an RGBA tuple (1,0,0,1) - facecolor = 'w' - # one of 0, on, false, 1, no, n, y, off, yes, true - grid = False - # one of 0, on, false, 1, no, n, y, off, yes, true - hold = True - # any valid matplotlib color, eg an abbreviation like 'r' for red, a full - # name like 'orange', a hex color like '#efefef', a grayscale intensity - # like '0.5', or an RGBA tuple (1,0,0,1) - labelcolor = 'k' - # a value of type 'float' or 'xx-small' or 'x-small' or 'small' or 'medium' - # or 'large' or 'x-large' or 'xx-large' - labelsize = 'medium' - # a value of type 'float' - linewidth = 1.0 - # one of 0, on, false, 1, no, n, y, off, yes, true - polargrid = True - # a value of type 'float' or 'xx-small' or 'x-small' or 'small' or 'medium' - # or 'large' or 'x-large' or 'xx-large' - titlesize = 'medium' - - [[formatter]] - # a list of from 2 to 2 items each of which is a value of type 'float' - limits = [-7.0, 7.0] - -[backend] - # Valid backends are: 'GTKAgg', 'GTKCairo', 'QtAgg', 'Qt4Agg', - # 'TkAgg', 'Agg', 'Cairo', 'PS', 'PDF', 'SVG' - # one of ps, qt4agg, tkagg, gtkagg, agg, cairo, gtkcairo, wxagg, qtagg, temp - # late, svg, pdf - use = 'Qt4Agg' - - [[cairo]] - # 'png' or 'ps' or 'pdf' or 'svg' - format = 'png' - - [[pdf]] - # 0 <= an integer <= 9 - compression = 6 - # 3 or 42 - fonttype = 3 - # a value of type 'bool' - inheritcolor = False - # a value of type 'bool' - use14corefonts = False - - [[ps]] - # 3 or 42 - fonttype = 3 - # 'auto' or 'letter' or 'legal' or 'ledger' or 'A0' or 'A1' or 'A2' or ' - # A3' or 'A4' or 'A5' or 'A6' or 'A7' or 'A8' or 'A9' or 'A10' or 'B0' o - # r 'B1' or 'B2' or 'B3' or 'B4' or 'B5' or 'B6' or 'B7' or 'B8' or 'B9' - # or 'B10' - papersize = 'letter' - # a value of type 'bool' - useafm = False - - [[[distiller]]] - # a value of type 'float' - resolution = 6000.0 - # None or 'ghostscript' or 'xpdf' - use = 'xpdf' - - [[svg]] - # a value of type 'bool' - embed_chars = False - # a value of type 'bool' - image_inline = True - # a value of type 'bool' - image_noscale = False - - [[tk]] - # window_focus : Maintain shell focus for TkAgg - # pythoninspect: tk sets PYTHONINSPECT - - # a value of type 'bool' - pythoninspect = False - # a value of type 'bool' - window_focus = False - -[contour] - # 'dashed' or 'solid' - negative_linestyle = 'dashed' - -[figure] - # a value of type 'float' - dpi = 86.230000000000004 - # any valid matplotlib color, eg an abbreviation like 'r' for red, a full - # name like 'orange', a hex color like '#efefef', a grayscale intensity - # like '0.5', or an RGBA tuple (1,0,0,1) - edgecolor = 'w' - # any valid matplotlib color, eg an abbreviation like 'r' for red, a full - # name like 'orange', a hex color like '#efefef', a grayscale intensity - # like '0.5', or an RGBA tuple (1,0,0,1) - facecolor = 'white' - # a list of from 2 to 2 items each of which is a value of type 'float' - figsize = [6.0, 4.0] - - [[subplot]] - # The figure subplot parameters. All dimensions are fraction - # of the figure width or height - # a value of type 'float' - bottom = 0.10000000000000001 - # a value of type 'float' - hspace = 0.20000000000000001 - # a value of type 'float' - left = 0.125 - # a value of type 'float' - right = 0.90000000000000002 - # a value of type 'float' - top = 0.90000000000000002 - # a value of type 'float' - wspace = 0.20000000000000001 - -[font] - # a list of items each of which is a value of type 'str' - cursive = ['Zapf Chancery', 'Apple Chancery', 'Textile', 'Sand', 'cursive'] - # 'sans-serif' or 'serif' or 'cursive' or 'fantasy' or 'monospace' - family = 'serif' - # a list of items each of which is a value of type 'str' - fantasy = ['Comic Sans MS', 'Chicago', 'Charcoal', 'ImpactWestern', 'fantasy'] - # a list of items each of which is a value of type 'str' - monospace = ['Courier', 'Andale Mono', 'Bitstream Vera Sans Mono', 'Nimbus Mono L', 'Courier New', 'Fixed', 'Terminal', 'monospace'] - # a list of items each of which is a value of type 'str' - sans_serif = ['Helvetica', 'Avant Garde', 'Bitstream Vera Sans', 'Lucida Grande', 'Verdana', 'Geneva', 'Lucid', 'Arial', 'sans-serif'] - # a list of items each of which is a value of type 'str' - serif = ['Times', 'Palatino', 'Bitstream Vera Serif', 'New Century Schoolbook', 'Century Schoolbook L', 'Utopia', 'ITC Bookman', 'Bookman', 'Nimbus Roman No9 L', 'Times New Roman', 'Charter', 'serif'] - # a value of type 'float' - size = 12.0 - # 'ultra-condensed' or 'extra-condensed' or 'condensed' or 'semi-condensed' - # or 'normal' or 'semi-expanded' or 'expanded' or 'extra-expanded' or 'ultra - # -expanded' or 'wider' or 'narrower' - stretch = 'normal' - # 'normal' or 'italic' or 'oblique' - style = 'normal' - # 'normal' or 'small-caps' - variant = 'normal' - # 'normal' or 'bold' or 'bolder' or 'lighter' or 100 or 200 or 300 or 400 or - # 500 or 600 or 700 or 800 or 900 - weight = 'normal' - -[grid] - # any valid matplotlib color, eg an abbreviation like 'r' for red, a full - # name like 'orange', a hex color like '#efefef', a grayscale intensity - # like '0.5', or an RGBA tuple (1,0,0,1) - color = 'k' - # '-' or '--' or '-.' or ':' or 'steps' or '' or ' ' - linestyle = ':' - # a value of type 'float' - linewidth = 0.5 - -[image] - # a value of type 'float' or 'equal' or 'auto' - aspect = 'equal' - # 'Accent' or 'Accent_r' or 'Blues' or 'Blues_r' or 'BrBG' or 'BrBG_r' or 'B - # uGn' or 'BuGn_r' or 'BuPu' or 'BuPu_r' or 'Dark2' or 'Dark2_r' or 'GnBu' o - # r 'GnBu_r' or 'Greens' or 'Greens_r' or 'Greys' or 'Greys_r' or 'OrRd' or - # <...snipped 1010 chars...> - # ist_stern' or 'gist_stern_r' or 'gist_yarg' or 'gist_yarg_r' or 'gray' or - # 'gray_r' or 'hot' or 'hot_r' or 'hsv' or 'hsv_r' or 'jet' or 'jet_r' or 'p - # ink' or 'pink_r' or 'prism' or 'prism_r' or 'spectral' or 'spectral_r' or - # 'spring' or 'spring_r' or 'summer' or 'summer_r' or 'winter' or 'winter_r' - cmap = 'bone' - # 'bilinear' or 'nearest' or 'bicubic' or 'spline16' or 'spline36' or 'hanni - # ng' or 'hamming' or 'hermite' or 'kaiser' or 'quadric' or 'catrom' or 'gau - # ssian' or 'bessel' or 'mitchell' or 'sinc' or 'lanczos' or 'blackman' - interpolation = 'bilinear' - # a value of type 'int' - lut = 256 - # 'upper' or 'lower' - origin = 'lower' - -[legend] - # a value of type 'float' - axespad = 0.02 - # a value of type 'float' or 'xx-small' or 'x-small' or 'small' or 'medium' - # or 'large' or 'x-large' or 'xx-large' - fontsize = 'small' - # a value of type 'float' - handlelen = 0.050000000000000003 - # a value of type 'float' - handletextsep = 0.02 - # a value of type 'bool' - isaxes = True - # a value of type 'float' - labelsep = 0.01 - # 'best' or 'upper right' or 'upper left' or 'lower left' or 'lower right' o - # r 'right' or 'center left' or 'center right' or 'lower center' or 'upper c - # enter' or 'center' - loc = 'upper right' - # a value of type 'float' - markerscale = 1.0 - # a value of type 'int' - numpoints = 2 - # a value of type 'float' - pad = 0.20000000000000001 - # a value of type 'bool' - shadow = False - -[lines] - # a value of type 'bool' - antialiased = True - # any valid matplotlib color, eg an abbreviation like 'r' for red, a full - # name like 'orange', a hex color like '#efefef', a grayscale intensity - # like '0.5', or an RGBA tuple (1,0,0,1) - color = 'b' - # 'butt' or 'round' or 'projecting' - dash_capstyle = 'butt' - # 'miter' or 'round' or 'bevel' - dash_joinstyle = 'round' - # '-' or '--' or '-.' or ':' or 'steps' or '' or ' ' or None - linestyle = '-' - # a value of type 'float' - linewidth = 1.0 - # 'None' or 'o' or '.' or ',' or '^' or 'v' or '<' or '>' or 's' or '+' or ' - # x' or 'D' or 'd' or '1' or '2' or '3' or '4' or 'h' or 'H' or 'p' or '|' o - # r '_' - marker = 'None' - # a value of type 'float' - markeredgewidth = 0.5 - # a value of type 'float' - markersize = 3.0 - # 'butt' or 'round' or 'projecting' - solid_capstyle = 'projecting' - # 'miter' or 'round' or 'bevel' - solid_joinstyle = 'round' - -[patch] - # a value of type 'bool' - antialiased = True - # any valid matplotlib color, eg an abbreviation like 'r' for red, a full - # name like 'orange', a hex color like '#efefef', a grayscale intensity - # like '0.5', or an RGBA tuple (1,0,0,1) - edgecolor = 'k' - # any valid matplotlib color, eg an abbreviation like 'r' for red, a full - # name like 'orange', a hex color like '#efefef', a grayscale intensity - # like '0.5', or an RGBA tuple (1,0,0,1) - facecolor = 'b' - # a value of type 'float' - linewidth = 1.0 - -[savefig] - # a value of type 'float' - dpi = 86.0 - # any valid matplotlib color, eg an abbreviation like 'r' for red, a full - # name like 'orange', a hex color like '#efefef', a grayscale intensity - # like '0.5', or an RGBA tuple (1,0,0,1) - edgecolor = 'w' - # any valid matplotlib color, eg an abbreviation like 'r' for red, a full - # name like 'orange', a hex color like '#efefef', a grayscale intensity - # like '0.5', or an RGBA tuple (1,0,0,1) - facecolor = 'w' - # 'portrait' or 'landscape' - orientation = 'portrait' - -[text] - # any valid matplotlib color, eg an abbreviation like 'r' for red, a full - # name like 'orange', a hex color like '#efefef', a grayscale intensity - # like '0.5', or an RGBA tuple (1,0,0,1) - color = 'k' - # a value of type 'bool' - usetex = True - - [[latex]] - # a value of type 'bool' - dvipnghack = False - # a list of items each of which is a value of type 'str' - preamble = [''] - # a value of type 'bool' - unicode = False - - [[math]] - # a value of type 'str' - cal = 'cmsy10.ttf' - # a value of type 'str' - it = 'cmmi10.ttf' - # a value of type 'bool' - mathtext2 = False - # a value of type 'str' - mit = 'cmmi10.ttf' - # a value of type 'str' - nonascii = 'cmex10.ttf' - # a value of type 'str' - rm = 'cmr10.ttf' - # a value of type 'str' - tt = 'cmtt10.ttf' - -[verbose] - # a value of type 'str' or a value of type 'unicode' or 'sys.stdout' - fileo = 'sys.stdout' - # 'silent' or 'helpful' or 'debug' or 'debug-annoying' - level = 'silent' - -[xticks] - # any valid matplotlib color, eg an abbreviation like 'r' for red, a full - # name like 'orange', a hex color like '#efefef', a grayscale intensity - # like '0.5', or an RGBA tuple (1,0,0,1) - color = 'k' - # 'in' or 'out' - direction = 'in' - # a value of type 'float' or 'xx-small' or 'x-small' or 'small' or 'medium' - # or 'large' or 'x-large' or 'xx-large' - labelsize = 'small' - - [[major]] - # a value of type 'float' - pad = 4.0 - # a value of type 'float' - size = 4.0 - - [[minor]] - # a value of type 'float' - pad = 4.0 - # a value of type 'float' - size = 2.0 - -[yticks] - # any valid matplotlib color, eg an abbreviation like 'r' for red, a full - # name like 'orange', a hex color like '#efefef', a grayscale intensity - # like '0.5', or an RGBA tuple (1,0,0,1) - color = 'k' - # 'in' or 'out' - direction = 'in' - # a value of type 'float' or 'xx-small' or 'x-small' or 'small' or 'medium' - # or 'large' or 'x-large' or 'xx-large' - labelsize = 'small' - - [[major]] - # a value of type 'float' - pad = 4.0 - # a value of type 'float' - size = 4.0 - - [[minor]] - # a value of type 'float' - pad = 4.0 - # a value of type 'float' - size = 2.0 \ No newline at end of file diff -Nru matplotlib-0.99.3/lib/matplotlib/config/mplconfig.py matplotlib-1.0.1/lib/matplotlib/config/mplconfig.py --- matplotlib-0.99.3/lib/matplotlib/config/mplconfig.py 2009-07-31 15:14:39.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/config/mplconfig.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,533 +0,0 @@ -"""Traits-based declaration for Matplotlib configuration. -""" - -# stdlib imports -import os - -# external imports -import enthought.traits.api as T - -# internal imports -import mpltraits as mplT -import cutils -import checkdep -from tconfig import TConfig, TConfigManager, tconf2File -import pytz - -# Code begins -DEBUG = False - -############################################################################## -# Main Config class follows -############################################################################## -class MPLConfig(TConfig): - """ - This is a sample matplotlib configuration file. It should be placed - in HOME/.matplotlib (unix/linux like systems) and - C:\Documents and Settings\yourname\.matplotlib (win32 systems) - - By default, the installer will overwrite the existing file in the install - path, so if you want to preserve yours, please move it to your HOME dir and - set the environment variable if necessary. - - This file is best viewed in a editor which supports ini or conf mode syntax - highlighting. - - Blank lines, or lines starting with a comment symbol, are ignored, - as are trailing comments. Other lines must have the format - - key = val optional comment - - val should be valid python syntax, just as you would use when setting - properties using rcParams. This should become more obvious by inspecting - the default values listed herein. - - Colors: for the color values below, you can either use - - a matplotlib color string, such as r | k | b - - an rgb tuple, such as (1.0, 0.5, 0.0) - - a hex string, such as #ff00ff or ff00ff - - a scalar grayscale intensity such as 0.75 - - a legal html color name, eg red | blue | darkslategray - - Interactivity: see http://matplotlib.sourceforge.net/interactive.html. - - ### CONFIGURATION BEGINS HERE ### - """ - - interactive = T.Trait(False, mplT.BoolHandler()) - toolbar = T.Trait('toolbar2', 'toolbar2', None) - timezone = T.Trait('UTC', pytz.all_timezones) - datapath = T.Trait(cutils.get_data_path()) - units = T.false - - class backend(TConfig): - use = T.Trait('Agg', mplT.BackendHandler()) - fallback = T.Trait(True, mplT.BoolHandler()) - - class cairo(TConfig): - format = T.Trait('png', 'png', 'ps', 'pdf', 'svg') - - class tk(TConfig): - """ - window_focus : Maintain shell focus for TkAgg - pythoninspect: tk sets PYTHONINSPECT - """ - - window_focus = T.false - pythoninspect = T.false - - class ps(TConfig): - papersize = T.Trait('letter', 'auto', 'letter', 'legal', 'ledger', - 'A0', 'A1', 'A2', 'A3', 'A4', 'A5', 'A6', 'A7', - 'A8', 'A9', 'A10', - 'B0', 'B1', 'B2', 'B3', 'B4', 'B5', 'B6', 'B7', - 'B8', 'B9', 'B10') - useafm = T.false - fonttype = T.Trait(3, 42) - - class distiller(TConfig): - use = T.Trait(None, None, 'ghostscript', 'xpdf', False) - resolution = T.Float(6000) - - class pdf(TConfig): - compression = T.Range(0, 9, 6) - fonttype = T.Trait(3, 42) - inheritcolor = T.false - use14corefonts = T.false - - class svg(TConfig): - image_inline = T.true - image_noscale = T.false - embed_char_paths = T.true - - class lines(TConfig): - linewidth = T.Float(1.0) - linestyle = T.Trait('-','--','-.', ':', 'steps', '', ' ', None) - color = T.Trait('blue',mplT.ColorHandler()) - solid_joinstyle = T.Trait('round', 'miter', 'round', 'bevel') - solid_capstyle = T.Trait('butt', 'butt', 'round', 'projecting') - dash_joinstyle = T.Trait('round', 'miter', 'round', 'bevel') - dash_capstyle = T.Trait('butt', 'butt', 'round', 'projecting') - marker = T.Trait('None', 'None', 'o', '.', ',', '^', 'v', '<', '>', 's', - '+', 'x', 'D','d', '1', '2', '3', '4', 'h', 'H', 'p', - '|', '_') - markeredgewidth = T.Float(0.5) - markersize = T.Float(6) - antialiased = T.true - - class path(TConfig): - simplify = T.false - simplify_threshold = T.float(1.0 / 9.0) - - class patch(TConfig): - linewidth = T.Float(1.0) - facecolor = T.Trait('blue', mplT.ColorHandler()) - edgecolor = T.Trait('black', mplT.ColorHandler()) - antialiased = T.true - - class font(TConfig): - family = T.Trait('sans-serif', 'sans-serif', 'serif', 'cursive', - 'fantasy', 'monospace') - style = T.Trait('normal', 'normal', 'italic', 'oblique') - variant = T.Trait('normal', 'normal', 'small-caps') - weight = T.Trait('normal', 'normal', 'bold', 'bolder', 'lighter', - 100, 200, 300, 400, 500, 600, 700, 800, 900) - stretch = T.Trait('normal', 'ultra-condensed', 'extra-condensed', - 'condensed', 'semi-condensed', 'normal', 'semi-expanded', - 'expanded', 'extra-expanded', 'ultra-expanded', - 'wider', 'narrower') - size = T.Float(12.0) - serif = T.ListStr(["Bitstream Vera Serif", "New Century Schoolbook", - "Century Schoolbook L", "Utopia", "ITC Bookman", "Bookman", - "Nimbus Roman No9 L", "Times New Roman", "Times", "Palatino", - "Charter", "serif"]) - sans_serif = T.ListStr(["Bitstream Vera Sans", "Lucida Grande", "Verdana", - "Geneva", "Lucid", "Arial", "Helvetica", "Avant Garde", - "sans-serif"]) - cursive = T.ListStr(["Apple Chancery", "Textile", "Zapf Chancery", "Sand", - "cursive"]) - fantasy = T.ListStr(["Comic Sans MS", "Chicago", "Charcoal", "Impact", "Western", - "fantasy"]) - monospace = T.ListStr(["Bitstream Vera Sans Mono", "Andale Mono", "Nimbus Mono L", - "Courier New", "Courier", "Fixed", "Terminal", "monospace"]) - - class text(TConfig): - color = T.Trait('black',mplT.ColorHandler()) - usetex = T.false - - class latex(TConfig): - unicode = T.false - preamble = T.ListStr([]) - dvipnghack = T.false - - class mathtext(TConfig): - cal = T.Trait('cursive' , mplT.FontconfigPatternHandler()) - rm = T.Trait('serif' , mplT.FontconfigPatternHandler()) - tt = T.Trait('monospace' , mplT.FontconfigPatternHandler()) - it = T.Trait('serif:oblique' , mplT.FontconfigPatternHandler()) - bf = T.Trait('serif:bold' , mplT.FontconfigPatternHandler()) - sf = T.Trait('sans' , mplT.FontconfigPatternHandler()) - fontset = T.Trait('cm', 'cm', 'stix', 'stixsans', 'custom') - default = T.Trait(*("rm cal it tt sf bf default bb frak circled scr regular".split())) - fallback_to_cm = T.true - - class axes(TConfig): - hold = T.Trait(True, mplT.BoolHandler()) - facecolor = T.Trait('white', mplT.ColorHandler()) - edgecolor = T.Trait('black', mplT.ColorHandler()) - linewidth = T.Float(1.0) - grid = T.Trait(False, mplT.BoolHandler()) - polargrid = T.Trait(True, mplT.BoolHandler()) - titlesize = T.Trait('large', 'xx-small', 'x-small', 'small', 'medium', - 'large', 'x-large', 'xx-large', T.Float) - labelsize = T.Trait('medium', 'xx-small', 'x-small', 'small', 'medium', - 'large', 'x-large', 'xx-large', T.Float) - labelcolor = T.Trait('black', mplT.ColorHandler()) - axisbelow = T.false - - class formatter(TConfig): - limits = T.List(T.Float, [-7, 7], minlen=2, maxlen=2) - - class xticks(TConfig): - color = T.Trait('black', mplT.ColorHandler()) - labelsize = T.Trait('small', 'xx-small', 'x-small', 'small', 'medium', - 'large', 'x-large', 'xx-large', T.Float) - direction = T.Trait('in', 'out') - - class major(TConfig): - size = T.Float(4) - pad = T.Float(4) - - class minor(TConfig): - size = T.Float(2) - pad = T.Float(4) - - class yticks(TConfig): - color = T.Trait('black', mplT.ColorHandler()) - labelsize = T.Trait('small', 'xx-small', 'x-small', 'small', 'medium', - 'large', 'x-large', 'xx-large', T.Float) - direction = T.Trait('in', 'out') - - class major(TConfig): - size = T.Float(4) - pad = T.Float(4) - - class minor(TConfig): - size = T.Float(2) - pad = T.Float(4) - - class grid(TConfig): - color = T.Trait('black', mplT.ColorHandler()) - linestyle = T.Trait(':','-','--','-.', ':', 'steps', '', ' ') - linewidth = T.Float(0.5) - - class legend(TConfig): - loc = T.Trait('upper right', 'best', 'upper right', 'upper left', - 'lower left', 'lower right', 'right', 'center left', - 'center right', 'lower center', 'upper center', 'center') - isaxes = T.true - numpoints = T.Int(3) - fontsize = T.Trait('medium', 'xx-small', 'x-small', 'small', 'medium', - 'large', 'x-large', 'xx-large', T.Float) - pad = T.Float(0.2) - markerscale = T.Float(1.0) - labelsep = T.Float(0.01) - handlelen = T.Float(0.05) - handletextsep = T.Float(0.02) - axespad = T.Float(0.02) - shadow = T.false - - class figure(TConfig): - figsize = T.List(T.Float, [8,6], maxlen=2, minlen=2) - dpi = T.Float(80) - facecolor = T.Trait('0.75', mplT.ColorHandler()) - edgecolor = T.Trait('white', mplT.ColorHandler()) - - class subplot(TConfig): - """The figure subplot parameters. All dimensions are fraction - of the figure width or height""" - left = T.Float(0.125) - right = T.Float(0.9) - bottom = T.Float(0.1) - top = T.Float(0.9) - wspace = T.Float(0.2) - hspace = T.Float(0.2) - - class image(TConfig): - aspect = T.Trait('equal', 'equal', 'auto', T.Float) - interpolation = T.Trait('bilinear', 'bilinear', 'nearest', 'bicubic', - 'spline16', 'spline36', 'hanning', 'hamming', - 'hermite', 'kaiser', 'quadric', 'catrom', - 'gaussian', 'bessel', 'mitchell', 'sinc', - 'lanczos', 'blackman') - cmap = T.Trait('jet', *mplT.colormaps) - lut = T.Int(256) - origin = T.Trait('upper', 'upper', 'lower') - - class contour(TConfig): - negative_linestyle = T.Trait('dashed', 'dashed', 'solid') - - class savefig(TConfig): - dpi = T.Float(100) - facecolor = T.Trait('white', mplT.ColorHandler()) - edgecolor = T.Trait('white', mplT.ColorHandler()) - orientation = T.Trait('portrait', 'portrait', 'landscape') - - class verbose(TConfig): - level = T.Trait('silent', 'silent', 'helpful', 'debug', 'debug-annoying') - fileo = T.Trait('sys.stdout', 'sys.stdout', T.File) - - -class RcParamsWrapper(dict): - - """A backwards-compatible interface to a traited config object - """ - - def __init__(self, tconfig): - self.tconfig = tconfig - - self.tconfig_map = { - 'backend' : (self.tconfig.backend, 'use'), - 'backend_fallback' : (self.tconfig.backend, 'fallback'), - 'toolbar' : (self.tconfig, 'toolbar'), - 'datapath' : (self.tconfig, 'datapath'), - 'units' : (self.tconfig, 'units'), - 'interactive' : (self.tconfig, 'interactive'), - 'timezone' : (self.tconfig, 'timezone'), - - # the verbosity setting - 'verbose.level' : (self.tconfig.verbose, 'level'), - 'verbose.fileo' : (self.tconfig.verbose, 'fileo'), - - # line props - 'lines.linewidth' : (self.tconfig.lines, 'linewidth'), - 'lines.linestyle' : (self.tconfig.lines, 'linestyle'), - 'lines.color' : (self.tconfig.lines, 'color'), - 'lines.marker' : (self.tconfig.lines, 'marker'), - 'lines.markeredgewidth' : (self.tconfig.lines, 'markeredgewidth'), - 'lines.markersize' : (self.tconfig.lines, 'markersize'), - 'lines.antialiased' : (self.tconfig.lines, 'antialiased'), - 'lines.dash_joinstyle' : (self.tconfig.lines, 'dash_joinstyle'), - 'lines.solid_joinstyle' : (self.tconfig.lines, 'solid_joinstyle'), - 'lines.dash_capstyle' : (self.tconfig.lines, 'dash_capstyle'), - 'lines.solid_capstyle' : (self.tconfig.lines, 'solid_capstyle'), - - # patch props - 'patch.linewidth' : (self.tconfig.patch, 'linewidth'), - 'patch.edgecolor' : (self.tconfig.patch, 'edgecolor'), - 'patch.facecolor' : (self.tconfig.patch, 'facecolor'), - 'patch.antialiased' : (self.tconfig.patch, 'antialiased'), - - - # font props - 'font.family' : (self.tconfig.font, 'family'), - 'font.style' : (self.tconfig.font, 'style'), - 'font.variant' : (self.tconfig.font, 'variant'), - 'font.stretch' : (self.tconfig.lines, 'color'), - 'font.weight' : (self.tconfig.font, 'weight'), - 'font.size' : (self.tconfig.font, 'size'), - 'font.serif' : (self.tconfig.font, 'serif'), - 'font.sans-serif' : (self.tconfig.font, 'sans_serif'), - 'font.cursive' : (self.tconfig.font, 'cursive'), - 'font.fantasy' : (self.tconfig.font, 'fantasy'), - 'font.monospace' : (self.tconfig.font, 'monospace'), - - # text props - 'text.color' : (self.tconfig.text, 'color'), - 'text.usetex' : (self.tconfig.text, 'usetex'), - 'text.latex.unicode' : (self.tconfig.text.latex, 'unicode'), - 'text.latex.preamble' : (self.tconfig.text.latex, 'preamble'), - 'text.dvipnghack' : (self.tconfig.text.latex, 'dvipnghack'), - - 'mathtext.cal' : (self.tconfig.mathtext, 'cal'), - 'mathtext.rm' : (self.tconfig.mathtext, 'rm'), - 'mathtext.tt' : (self.tconfig.mathtext, 'tt'), - 'mathtext.it' : (self.tconfig.mathtext, 'it'), - 'mathtext.bf' : (self.tconfig.mathtext, 'bf'), - 'mathtext.sf' : (self.tconfig.mathtext, 'sf'), - 'mathtext.fontset' : (self.tconfig.mathtext, 'fontset'), - 'mathtext.fallback_to_cm' : (self.tconfig.mathtext, 'fallback_to_cm'), - - 'image.aspect' : (self.tconfig.image, 'aspect'), - 'image.interpolation' : (self.tconfig.image, 'interpolation'), - 'image.cmap' : (self.tconfig.image, 'cmap'), - 'image.lut' : (self.tconfig.image, 'lut'), - 'image.origin' : (self.tconfig.image, 'origin'), - - 'contour.negative_linestyle' : (self.tconfig.contour, 'negative_linestyle'), - - # axes props - 'axes.axisbelow' : (self.tconfig.axes, 'axisbelow'), - 'axes.hold' : (self.tconfig.axes, 'hold'), - 'axes.facecolor' : (self.tconfig.axes, 'facecolor'), - 'axes.edgecolor' : (self.tconfig.axes, 'edgecolor'), - 'axes.linewidth' : (self.tconfig.axes, 'linewidth'), - 'axes.titlesize' : (self.tconfig.axes, 'titlesize'), - 'axes.grid' : (self.tconfig.axes, 'grid'), - 'axes.labelsize' : (self.tconfig.axes, 'labelsize'), - 'axes.labelcolor' : (self.tconfig.axes, 'labelcolor'), - 'axes.formatter.limits' : (self.tconfig.axes.formatter, 'limits'), - - 'polaraxes.grid' : (self.tconfig.axes, 'polargrid'), - - #legend properties - 'legend.loc' : (self.tconfig.legend, 'loc'), - 'legend.isaxes' : (self.tconfig.legend, 'isaxes'), - 'legend.numpoints' : (self.tconfig.legend, 'numpoints'), - 'legend.fontsize' : (self.tconfig.legend, 'fontsize'), - 'legend.pad' : (self.tconfig.legend, 'pad'), - 'legend.markerscale' : (self.tconfig.legend, 'markerscale'), - 'legend.labelsep' : (self.tconfig.legend, 'labelsep'), - 'legend.handlelen' : (self.tconfig.legend, 'handlelen'), - 'legend.handletextsep' : (self.tconfig.legend, 'handletextsep'), - 'legend.axespad' : (self.tconfig.legend, 'axespad'), - 'legend.shadow' : (self.tconfig.legend, 'shadow'), - - # tick properties - 'xtick.major.size' : (self.tconfig.xticks.major, 'size'), - 'xtick.minor.size' : (self.tconfig.xticks.minor, 'size'), - 'xtick.major.pad' : (self.tconfig.xticks.major, 'pad'), - 'xtick.minor.pad' : (self.tconfig.xticks.minor, 'pad'), - 'xtick.color' : (self.tconfig.xticks, 'color'), - 'xtick.labelsize' : (self.tconfig.xticks, 'labelsize'), - 'xtick.direction' : (self.tconfig.xticks, 'direction'), - - 'ytick.major.size' : (self.tconfig.yticks.major, 'size'), - 'ytick.minor.size' : (self.tconfig.yticks.minor, 'size'), - 'ytick.major.pad' : (self.tconfig.yticks.major, 'pad'), - 'ytick.minor.pad' : (self.tconfig.yticks.minor, 'pad'), - 'ytick.color' : (self.tconfig.yticks, 'color'), - 'ytick.labelsize' : (self.tconfig.yticks, 'labelsize'), - 'ytick.direction' : (self.tconfig.yticks, 'direction'), - - 'grid.color' : (self.tconfig.grid, 'color'), - 'grid.linestyle' : (self.tconfig.grid, 'linestyle'), - 'grid.linewidth' : (self.tconfig.grid, 'linewidth'), - - - # figure props - 'figure.figsize' : (self.tconfig.figure, 'figsize'), - 'figure.dpi' : (self.tconfig.figure, 'dpi'), - 'figure.facecolor' : (self.tconfig.figure, 'facecolor'), - 'figure.edgecolor' : (self.tconfig.figure, 'edgecolor'), - - 'figure.subplot.left' : (self.tconfig.figure.subplot, 'left'), - 'figure.subplot.right' : (self.tconfig.figure.subplot, 'right'), - 'figure.subplot.bottom' : (self.tconfig.figure.subplot, 'bottom'), - 'figure.subplot.top' : (self.tconfig.figure.subplot, 'top'), - 'figure.subplot.wspace' : (self.tconfig.figure.subplot, 'wspace'), - 'figure.subplot.hspace' : (self.tconfig.figure.subplot, 'hspace'), - - - 'savefig.dpi' : (self.tconfig.savefig, 'dpi'), - 'savefig.facecolor' : (self.tconfig.savefig, 'facecolor'), - 'savefig.edgecolor' : (self.tconfig.savefig, 'edgecolor'), - 'savefig.orientation' : (self.tconfig.savefig, 'orientation'), - - 'cairo.format' : (self.tconfig.backend.cairo, 'format'), - 'tk.window_focus' : (self.tconfig.backend.tk, 'window_focus'), - 'tk.pythoninspect' : (self.tconfig.backend.tk, 'pythoninspect'), - 'ps.papersize' : (self.tconfig.backend.ps, 'papersize'), - 'ps.useafm' : (self.tconfig.backend.ps, 'useafm'), - 'ps.usedistiller' : (self.tconfig.backend.ps.distiller, 'use'), - 'ps.distiller.res' : (self.tconfig.backend.ps.distiller, 'resolution'), - 'ps.fonttype' : (self.tconfig.backend.ps, 'fonttype'), - 'pdf.compression' : (self.tconfig.backend.pdf, 'compression'), - 'pdf.inheritcolor' : (self.tconfig.backend.pdf, 'inheritcolor'), - 'pdf.use14corefonts' : (self.tconfig.backend.pdf, 'use14corefonts'), - 'pdf.fonttype' : (self.tconfig.backend.pdf, 'fonttype'), - 'svg.image_inline' : (self.tconfig.backend.svg, 'image_inline'), - 'svg.image_noscale' : (self.tconfig.backend.svg, 'image_noscale'), - 'svg.embed_char_paths' : (self.tconfig.backend.svg, 'embed_char_paths'), - - # Path properties - 'path.simplify' : (self.tconfig.path, 'simplify'), - 'path.simplify_threshold' : (self.tconfig.path, 'simplify_threshold') - } - - def __setitem__(self, key, val): - try: - obj, attr = self.tconfig_map[key] - setattr(obj, attr, val) - except KeyError: - raise KeyError('%s is not a valid rc parameter.\ -See rcParams.keys() for a list of valid parameters.'%key) - - def __getitem__(self, key): - obj, attr = self.tconfig_map[key] - return getattr(obj, attr) - - def keys(self): - return self.tconfig_map.keys() - - def __contains__(self, val): - return val in self.tconfig_map - - def update(self, arg, **kwargs): - try: - for key in arg: - self[key] = arg[key] - except AttributeError: - for key, val in arg: - self[key] = val - - for key in kwargs: - self[key] = kwargs[key] - - -old_config_file = cutils.get_config_file(tconfig=False) -old_config_path = os.path.split(old_config_file)[0] -config_file = os.path.join(old_config_path, 'matplotlib.conf') - -if os.path.exists(old_config_file) and not os.path.exists(config_file): - CONVERT = True -else: - config_file = cutils.get_config_file(tconfig=True) - CONVERT = False - -if DEBUG: print 'loading', config_file - -configManager = TConfigManager(MPLConfig, - config_file, - filePriority=True) -mplConfig = configManager.tconf -mplConfigDefault = MPLConfig() - -# TODO: move into traits validation -mplConfig.backend.ps.distiller.use = \ - checkdep.ps_distiller(mplConfig.backend.ps.distiller.use) -mplConfig.text.usetex = checkdep.usetex(mplConfig.text.usetex) - -def save_config(): - """Save mplConfig customizations to current matplotlib.conf - """ - configManager.write() - -rcParams = RcParamsWrapper(mplConfig) -rcParamsDefault = RcParamsWrapper(mplConfigDefault) - -# convert old matplotlibrc to new matplotlib.conf -if CONVERT: - from rcparams import rcParams as old_rcParams - for key, val in old_rcParams.iteritems(): - rcParams[key] = val - save_config() - print '%s converted to %s'%(cutils.get_config_file(tconfig=False), - config_file) - -def rcdefaults(): - """ - Restore the default rc params - the ones that were created at - matplotlib load time - """ - for key in rcParamsDefault.keys(): - rcParams[key] = rcParamsDefault[key] - - -############################################################################## -# Auto-generate the mpl-data/matplotlib.conf -############################################################################## -if __name__ == "__main__": - mplConfig = MPLConfig() - tconf2File(mplConfig, '../mpl-data/matplotlib.conf.template', force=True) - print 'matplotlib.conf.template created in ../mpl-data' diff -Nru matplotlib-0.99.3/lib/matplotlib/config/mpltraits.py matplotlib-1.0.1/lib/matplotlib/config/mpltraits.py --- matplotlib-0.99.3/lib/matplotlib/config/mpltraits.py 2009-07-31 15:14:39.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/config/mpltraits.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,165 +0,0 @@ -# External imports -import enthought.traits.api as T - -# Matplotlib-specific imports -import cutils - -# For the fontconfig pattern parser -from matplotlib.fontconfig_pattern import parse_fontconfig_pattern - -# stolen from cbook -def is_string_like(obj): - if hasattr(obj, 'shape'): return 0 # this is a workaround - # for a bug in numeric<23.1 - try: obj + '' - except (TypeError, ValueError): return 0 - return 1 - - -############################################################################## -# Handlers and other support functions and data structures -############################################################################## - - -class BackendHandler(T.TraitHandler): - """ - """ - backends = {'agg': 'Agg', - 'cairo': 'Cairo', - 'cocoaagg': 'CocoaAgg', - 'fltkagg': 'FltkAgg', - 'gtk': 'GTK', - 'gtkagg': 'GTKAgg', - 'gtkcairo': 'GTKCairo', - 'pdf': 'Pdf', - 'ps': 'PS', - 'qt4agg': 'Qt4Agg', - 'qtagg': 'QtAgg', - 'svg': 'SVG', - 'template': 'Template', - 'tkagg': 'TkAgg', - 'wx': 'WX', - 'wxagg': 'WXAgg'} - - def validate(self, object, name, value): - try: - return self.backends[value.lower()] - except: - return self.error(object, name, value) - - def info(self): - be = self.backends.keys() - be.sort - return "one of: %s"% ' | '.join(['%s'%i for i in be]) - - -class BoolHandler(T.TraitHandler): - """ - """ - - bools = {'true': True, - 'yes': True, - 'y' : True, - 'on': True, - 1: True, - True: True, - 'false': False, - 'no': False, - 'n': False, - 'off': False, - 0: False, - False: False} - - def validate(self, object, name, value): - try: - return self.bools[value] - except: - return self.error(object, name, value) - - def info(self): - return "one of: %s"% ' | '.join(['%s'%i for i in self.bools.keys()]) - -flexible_true = T.Trait(True, BoolHandler()) -flexible_false = T.Trait(False, BoolHandler()) - -class ColorHandler(T.TraitHandler): - """ - """ - - def validate(self, object, name, value): - s=value - if s.lower() == 'none': return 'None' - if len(s)==1 and s.isalpha(): return s - if s.find(',')>=0: # looks like an rgb - # get rid of grouping symbols - s = ''.join([ c for c in s if c.isdigit() or c=='.' or c==',']) - vals = s.split(',') - if len(vals)!=3: - raise ValueError('Color tuples must be length 3') - - try: return [float(val) for val in vals] - except ValueError: - raise ValueError('Could not convert all entries "%s" to floats'%s) - - if s.replace('.', '').isdigit(): # looks like scalar (grayscale) - return s - - if len(s)==6 and s.isalnum(): # looks like hex - return '#' + s - - if len(s)==7 and s.startswith('#') and s[1:].isalnum(): - return s - - if s.isalpha(): - #assuming a color name, hold on - return s - - raise ValueError('%s does not look like color arg'%s) - - def info(self): - return """\ -any valid matplotlib color, eg an abbreviation like 'r' for red, a full -name like 'orange', a hex color like '#efefef', a grayscale intensity -like '0.5', or an RGBA tuple (1,0,0,1)""" - - -class IsWritableDir(T.TraitHandler): - def validate(self, object, name, value): - if cutils.is_writable_dir(value): - return value - else: - raise OSError('%s is not a writable directory'%value) - - -colormaps = ['Accent', 'Accent_r', 'Blues', 'Blues_r', 'BrBG', 'BrBG_r', 'BuGn', - 'BuGn_r', 'BuPu', 'BuPu_r', 'Dark2', 'Dark2_r', 'GnBu', 'GnBu_r', - 'Greens', 'Greens_r', 'Greys', 'Greys_r', 'OrRd', - 'OrRd_r', 'Oranges', 'Oranges_r', 'PRGn', 'PRGn_r', 'Paired', - 'Paired_r', 'Pastel1', 'Pastel1_r', 'Pastel2', 'Pastel2_r', 'PiYG', - 'PiYG_r', 'PuBu', 'PuBuGn', 'PuBuGn_r', 'PuBu_r', 'PuOr', 'PuOr_r', - 'PuRd', 'PuRd_r', 'Purples', 'Purples_r', 'RdBu', 'RdBu_r', 'RdGy', - 'RdGy_r', 'RdPu', 'RdPu_r', 'RdYlBu', 'RdYlBu_r', 'RdYlGn', - 'RdYlGn_r', 'Reds', 'Reds_r', 'Set1', 'Set1_r', 'Set2', 'Set2_r', - 'Set3', 'Set3_r', 'Spectral', 'Spectral_r', 'YlGn', 'YlGnBu', - 'YlGnBu_r', 'YlGn_r', 'YlOrBr', 'YlOrBr_r', 'YlOrRd', 'YlOrRd_r', - 'autumn', 'autumn_r', 'binary', 'binary_r', 'bone', 'bone_r', - 'cool', 'cool_r', 'copper', 'copper_r', 'flag', - 'flag_r', 'gist_earth', 'gist_earth_r', 'gist_gray', 'gist_gray_r', - 'gist_heat', 'gist_heat_r', 'gist_ncar', 'gist_ncar_r', - 'gist_rainbow', 'gist_rainbow_r', 'gist_stern', 'gist_stern_r', - 'gist_yarg', 'gist_yarg_r', 'gray', 'gray_r', 'hot', 'hot_r', - 'hsv', 'hsv_r', 'jet', 'jet_r', 'pink', 'pink_r', - 'prism', 'prism_r', 'spectral', 'spectral_r', 'spring', - 'spring_r', 'summer', 'summer_r', 'winter', 'winter_r'] - -class FontconfigPatternHandler(T.TraitHandler): - """This validates a fontconfig pattern by using the FontconfigPatternParser. - The results are not actually used here, since we can't instantiate a - FontProperties object at config-parse time.""" - def validate(self, object, name, value): - # This will throw a ValueError if value does not parse correctly - parse_fontconfig_pattern(value) - return value - - def info(self): - return """A fontconfig pattern. See the fontconfig user manual for more information.""" diff -Nru matplotlib-0.99.3/lib/matplotlib/config/rcparams.py matplotlib-1.0.1/lib/matplotlib/config/rcparams.py --- matplotlib-0.99.3/lib/matplotlib/config/rcparams.py 2009-07-31 15:14:39.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/config/rcparams.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,197 +0,0 @@ -import os -import sys -import warnings - -import checkdep -from cutils import get_config_file, get_data_path -from verbose import verbose -from rcsetup import defaultParams, validate_backend, validate_toolbar -from rcsetup import validate_cairo_format - -_deprecated_map = { - 'text.fontstyle': 'font.style', - 'text.fontangle': 'font.style', - 'text.fontvariant': 'font.variant', - 'text.fontweight': 'font.weight', - 'text.fontsize': 'font.size', - 'tick.size' : 'tick.major.size', - } - - -class RcParams(dict): - - """A dictionary object including validation - - validating functions are defined and associated with rc parameters in - rcsetup.py - """ - - validate = dict([ (key, converter) for key, (default, converter) in \ - defaultParams.iteritems() ]) - - def __setitem__(self, key, val): - try: - if key in _deprecated_map.keys(): - alt = _deprecated_map[key] - warnings.warn('%s is deprecated in matplotlibrc. Use %s \ -instead.'% (key, alt)) - key = alt - cval = self.validate[key](val) - dict.__setitem__(self, key, cval) - except KeyError: - raise KeyError('%s is not a valid rc parameter.\ -See rcParams.keys() for a list of valid parameters.'%key) - - -def rc_params(fail_on_error=False): - 'Return the default params updated from the values in the rc file' - - fname = get_config_file() - if not os.path.exists(fname): - message = 'could not find rc file; returning defaults' - ret = dict([ (key, tup[0]) for key, tup in defaultParams.items()]) - warnings.warn(message) - return ret - - cnt = 0 - rc_temp = {} - for line in file(fname): - cnt += 1 - strippedline = line.split('#',1)[0].strip() - if not strippedline: continue - tup = strippedline.split(':',1) - if len(tup) !=2: - warnings.warn('Illegal line #%d\n\t%s\n\tin file "%s"'%\ - (cnt, line, fname)) - continue - key, val = tup - key = key.strip() - val = val.strip() - if key in rc_temp: - warnings.warn('Duplicate key in file "%s", line #%d'%(fname,cnt)) - rc_temp[key] = (val, line, cnt) - - ret = RcParams([ (key, default) for key, (default, converter) in \ - defaultParams.iteritems() ]) - - for key in ('verbose.level', 'verbose.fileo'): - if key in rc_temp: - val, line, cnt = rc_temp.pop(key) - if fail_on_error: - ret[key] = val # try to convert to proper type or raise - else: - try: ret[key] = val # try to convert to proper type or skip - except Exception, msg: - warnings.warn('Bad val "%s" on line #%d\n\t"%s"\n\tin file \ -"%s"\n\t%s' % (val, cnt, line, fname, msg)) - - verbose.set_level(ret['verbose.level']) - verbose.set_fileo(ret['verbose.fileo']) - - for key, (val, line, cnt) in rc_temp.iteritems(): - if key in defaultParams: - if fail_on_error: - ret[key] = val # try to convert to proper type or raise - else: - try: ret[key] = val # try to convert to proper type or skip - except Exception, msg: - warnings.warn('Bad val "%s" on line #%d\n\t"%s"\n\tin file \ -"%s"\n\t%s' % (val, cnt, line, fname, msg)) - else: - print >> sys.stderr, """ -Bad key "%s" on line %d in -%s. -You probably need to get an updated matplotlibrc file from -http://matplotlib.sf.net/matplotlibrc or from the matplotlib source -distribution""" % (key, cnt, fname) - - if ret['datapath'] is None: - ret['datapath'] = get_data_path() - - verbose.report('loaded rc file %s'%fname) - - return ret - - -# this is the instance used by the matplotlib classes -rcParams = rc_params() - -rcParamsDefault = RcParams([ (key, default) for key, (default, converter) in \ - defaultParams.iteritems() ]) - -rcParams['ps.usedistiller'] = checkdep.ps_distiller(rcParams['ps.usedistiller']) -rcParams['text.usetex'] = checkdep.usetex(rcParams['text.usetex']) - -def rc(group, **kwargs): - """ - Set the current rc params. Group is the grouping for the rc, eg - for lines.linewidth the group is 'lines', for axes.facecolor, the - group is 'axes', and so on. Group may also be a list or tuple - of group names, eg ('xtick','ytick'). kwargs is a list of - attribute name/value pairs, eg - - rc('lines', linewidth=2, color='r') - - sets the current rc params and is equivalent to - - rcParams['lines.linewidth'] = 2 - rcParams['lines.color'] = 'r' - - The following aliases are available to save typing for interactive - users - 'lw' : 'linewidth' - 'ls' : 'linestyle' - 'c' : 'color' - 'fc' : 'facecolor' - 'ec' : 'edgecolor' - 'mew' : 'markeredgewidth' - 'aa' : 'antialiased' - - Thus you could abbreviate the above rc command as - - rc('lines', lw=2, c='r') - - - Note you can use python's kwargs dictionary facility to store - dictionaries of default parameters. Eg, you can customize the - font rc as follows - - font = {'family' : 'monospace', - 'weight' : 'bold', - 'size' : 'larger', - } - - rc('font', **font) # pass in the font dict as kwargs - - This enables you to easily switch between several configurations. - Use rcdefaults to restore the default rc params after changes. - """ - - aliases = { - 'lw' : 'linewidth', - 'ls' : 'linestyle', - 'c' : 'color', - 'fc' : 'facecolor', - 'ec' : 'edgecolor', - 'mew' : 'markeredgewidth', - 'aa' : 'antialiased', - } - - if is_string_like(group): - group = (group,) - for g in group: - for k,v in kwargs.items(): - name = aliases.get(k) or k - key = '%s.%s' % (g, name) - if key not in rcParams: - raise KeyError('Unrecognized key "%s" for group "%s" and name "%s"' % - (key, g, name)) - - rcParams[key] = v - -def rcdefaults(): - """ - Restore the default rc params - the ones that were created at - matplotlib load time - """ - rcParams.update(rcParamsDefault) diff -Nru matplotlib-0.99.3/lib/matplotlib/config/rcsetup.py matplotlib-1.0.1/lib/matplotlib/config/rcsetup.py --- matplotlib-0.99.3/lib/matplotlib/config/rcsetup.py 2009-07-31 15:14:39.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/config/rcsetup.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,486 +0,0 @@ -""" -This file contains the default values and the validation code for the options. - -The code for parsing the matplotlibrc file and setting the values of rcParams -uses the values from this file to set default values. - -Ultimately, the setup code should also use these values to write a default -matplotlibrc file that actually reflects the values given here. -""" - -import os -from matplotlib.fontconfig_pattern import parse_fontconfig_pattern - -class ValidateInStrings: - def __init__(self, key, valid, ignorecase=False): - 'valid is a list of legal strings' - self.key = key - self.ignorecase = ignorecase - def func(s): - if ignorecase: return s.lower() - else: return s - self.valid = dict([(func(k),k) for k in valid]) - - def __call__(self, s): - if self.ignorecase: s = s.lower() - if s in self.valid: return self.valid[s] - raise ValueError('Unrecognized %s string "%s": valid strings are %s' - % (self.key, s, self.valid.values())) - -def validate_path_exists(s): - 'If s is a path, return s, else False' - if os.path.exists(s): return s - else: - raise RuntimeError('"%s" should be a path but it does not exist'%s) - -def validate_bool(b): - 'Convert b to a boolean or raise' - if type(b) is str: - b = b.lower() - if b in ('t', 'y', 'yes', 'on', 'true', '1', 1, True): return True - elif b in ('f', 'n', 'no', 'off', 'false', '0', 0, False): return False - else: - raise ValueError('Could not convert "%s" to boolean' % b) - -def validate_float(s): - 'convert s to float or raise' - try: return float(s) - except ValueError: - raise ValueError('Could not convert "%s" to float' % s) - -def validate_int(s): - 'convert s to int or raise' - try: return int(s) - except ValueError: - raise ValueError('Could not convert "%s" to int' % s) - -def validate_fonttype(s): - 'confirm that this is a Postscript of PDF font type that we know how to convert to' - fonttypes = { 'type3': 3, - 'truetype': 42 } - try: - fonttype = validate_int(s) - except ValueError: - if s.lower() in fonttypes.keys(): - return fonttypes[s.lower()] - raise ValueError('Supported Postscript/PDF font types are %s' % fonttypes.keys()) - else: - if fonttype not in fonttypes.values(): - raise ValueError('Supported Postscript/PDF font types are %s' % fonttypes.values()) - return fonttype - -validate_backend = ValidateInStrings('backend',[ - 'Agg2', 'Agg', 'Aqt', 'Cairo', 'CocoaAgg', 'EMF', 'GDK', - 'GTK', 'GTKAgg', 'GTKCairo', 'FltkAgg', 'Pdf', 'PS', - 'QtAgg', 'Qt4Agg', 'SVG', 'Template', 'TkAgg', 'WX', 'WXAgg', - ], ignorecase=True) - -validate_toolbar = ValidateInStrings('toolbar',[ - 'None','classic','toolbar2', - ], ignorecase=True) - -def validate_autolayout(v): - if v: - warnings.warn("figure.autolayout is not currently supported") - -class validate_nseq_float: - def __init__(self, n): - self.n = n - def __call__(self, s): - 'return a seq of n floats or raise' - if type(s) is str: - ss = s.split(',') - if len(ss) != self.n: - raise ValueError('You must supply exactly %d comma separated values'%self.n) - try: - return [float(val) for val in ss] - except ValueError: - raise ValueError('Could not convert all entries to floats') - else: - assert type(s) in (list,tuple) - if len(s) != self.n: - raise ValueError('You must supply exactly %d values'%self.n) - return [float(val) for val in s] - -class validate_nseq_int: - def __init__(self, n): - self.n = n - def __call__(self, s): - 'return a seq of n ints or raise' - if type(s) is str: - ss = s.split(',') - if len(ss) != self.n: - raise ValueError('You must supply exactly %d comma separated values'%self.n) - try: - return [int(val) for val in ss] - except ValueError: - raise ValueError('Could not convert all entries to ints') - else: - assert type(s) in (list,tuple) - if len(s) != self.n: - raise ValueError('You must supply exactly %d values'%self.n) - return [int(val) for val in s] - - - -def validate_color(s): - 'return a valid color arg' - if s.lower() == 'none': return 'None' - if len(s)==1 and s.isalpha(): return s - if s.find(',')>=0: # looks like an rgb - # get rid of grouping symbols - s = ''.join([ c for c in s if c.isdigit() or c=='.' or c==',']) - vals = s.split(',') - if len(vals)!=3: - raise ValueError('Color tuples must be length 3') - - try: return [float(val) for val in vals] - except ValueError: - raise ValueError('Could not convert all entries "%s" to floats'%s) - - if s.replace('.', '').isdigit(): # looks like scalar (grayscale) - return s - - if len(s)==6 and s.isalnum(): # looks like hex - return '#' + s - - if len(s)==7 and s.startswith('#') and s[1:].isalnum(): - return s - - if s.isalpha(): - #assuming a color name, hold on - return s - - raise ValueError('%s does not look like color arg'%s) - -def validate_stringlist(s): - 'return a list' - if type(s) is str: - return [ v.strip() for v in s.split(',') ] - else: - assert type(s) in [list,tuple] - return [ str(v) for v in s ] - -validate_orientation = ValidateInStrings('orientation',[ - 'landscape', 'portrait', - ]) - -def validate_latex_preamble(s): - 'return a list' - preamble_list = validate_stringlist(s) - if not preamble_list == ['']: - verbose.report(""" -***************************************************************** -You have the following UNSUPPORTED LaTeX preamble customizations: -%s -Please do not ask for support with these customizations active. -***************************************************************** -"""% '\n'.join(preamble_list), 'helpful') - return preamble_list - - - -def validate_aspect(s): - if s in ('auto', 'equal'): - return s - try: - return float(s) - except ValueError: - raise ValueError('not a valid aspect specification') - -def validate_fontsize(s): - if type(s) is str: - s = s.lower() - if s in ['xx-small', 'x-small', 'small', 'medium', 'large', 'x-large', - 'xx-large', 'smaller', 'larger']: - return s - try: - return float(s) - except ValueError: - raise ValueError('not a valid font size') - -def validate_font_properties(s): - parse_fontconfig_pattern(s) - return s - -validate_fontset = ValidateInStrings('fontset', ['cm', 'stix', 'stixsans', 'custom']) - -validate_mathtext_default = ValidateInStrings( - 'default', "rm cal it tt sf bf default bb frak circled scr regular".split()) - -validate_verbose = ValidateInStrings('verbose',[ - 'silent', 'helpful', 'debug', 'debug-annoying', - ]) - -validate_cairo_format = ValidateInStrings('cairo_format', - ['png', 'ps', 'pdf', 'svg'], - ignorecase=True) - -validate_ps_papersize = ValidateInStrings('ps_papersize',[ - 'auto', 'letter', 'legal', 'ledger', - 'a0', 'a1', 'a2','a3', 'a4', 'a5', 'a6', 'a7', 'a8', 'a9', 'a10', - 'b0', 'b1', 'b2', 'b3', 'b4', 'b5', 'b6', 'b7', 'b8', 'b9', 'b10', - ], ignorecase=True) - -def validate_ps_distiller(s): - if type(s) is str: - s = s.lower() - - if s in ('none',None): - return None - elif s in ('false', False): - return False - elif s in ('ghostscript', 'xpdf'): - return s - else: - raise ValueError('matplotlibrc ps.usedistiller must either be none, ghostscript or xpdf') - -validate_joinstyle = ValidateInStrings('joinstyle',['miter', 'round', 'bevel'], ignorecase=True) - -validate_capstyle = ValidateInStrings('capstyle',['butt', 'round', 'projecting'], ignorecase=True) - -validate_negative_linestyle = ValidateInStrings('negative_linestyle',['solid', 'dashed'], ignorecase=True) - -def validate_negative_linestyle_legacy(s): - try: - res = validate_negative_linestyle(s) - return res - except ValueError: - dashes = validate_nseq_float(2)(s) - warnings.warn("Deprecated negative_linestyle specification; use 'solid' or 'dashed'") - return (0, dashes) # (offset, (solid, blank)) - -validate_legend_loc = ValidateInStrings('legend_loc',[ - 'best', - 'upper right', - 'upper left', - 'lower left', - 'lower right', - 'right', - 'center left', - 'center right', - 'lower center', - 'upper center', - 'center', -], ignorecase=True) - -class ValidateInterval: - """ - Value must be in interval - """ - def __init__(self, vmin, vmax, closedmin=True, closedmax=True): - self.vmin = vmin - self.vmax = vmax - self.cmin = closedmin - self.cmax = closedmax - - def __call__(self, s): - try: s = float(s) - except: raise RuntimeError('Value must be a float; found "%s"'%s) - - if self.cmin and s= %f; found "%f"'%(self.vmin, s)) - elif not self.cmin and s<=self.vmin: - raise RuntimeError('Value must be > %f; found "%f"'%(self.vmin, s)) - - if self.cmax and s>self.vmax: - raise RuntimeError('Value must be <= %f; found "%f"'%(self.vmax, s)) - elif not self.cmax and s>=self.vmax: - raise RuntimeError('Value must be < %f; found "%f"'%(self.vmax, s)) - return s - - - -# a map from key -> value, converter -defaultParams = { - 'backend' : ['WXAgg', validate_backend], - 'toolbar' : ['toolbar2', validate_toolbar], - 'datapath' : [None, validate_path_exists], # handled by _get_data_path_cached - 'units' : [False, validate_bool], - 'interactive' : [False, validate_bool], - 'timezone' : ['UTC', str], - - # the verbosity setting - 'verbose.level' : ['silent', validate_verbose], - 'verbose.fileo' : ['sys.stdout', str], - - # line props - 'lines.linewidth' : [1.0, validate_float], # line width in points - 'lines.linestyle' : ['-', str], # solid line - 'lines.color' : ['b', validate_color], # blue - 'lines.marker' : ['None', str], # black - 'lines.markeredgewidth' : [0.5, validate_float], - 'lines.markersize' : [6, validate_float], # markersize, in points - 'lines.antialiased' : [True, validate_bool], # antialised (no jaggies) - 'lines.dash_joinstyle' : ['round', validate_joinstyle], - 'lines.solid_joinstyle' : ['round', validate_joinstyle], - 'lines.dash_capstyle' : ['butt', validate_capstyle], - 'lines.solid_capstyle' : ['projecting', validate_capstyle], - - # patch props - 'patch.linewidth' : [1.0, validate_float], # line width in points - 'patch.edgecolor' : ['k', validate_color], # black - 'patch.facecolor' : ['b', validate_color], # blue - 'patch.antialiased' : [True, validate_bool], # antialised (no jaggies) - - - # font props - 'font.family' : ['sans-serif', str], # used by text object - 'font.style' : ['normal', str], # - 'font.variant' : ['normal', str], # - 'font.stretch' : ['normal', str], # - 'font.weight' : ['normal', str], # - 'font.size' : [12.0, validate_float], # - 'font.serif' : [['Bitstream Vera Serif', 'DejaVu Serif', - 'New Century Schoolbook', 'Century Schoolbook L', - 'Utopia', 'ITC Bookman', 'Bookman', - 'Nimbus Roman No9 L','Times New Roman', - 'Times','Palatino','Charter','serif'], - validate_stringlist], - 'font.sans-serif' : [['Bitstream Vera Sans', 'DejaVu Sans', - 'Lucida Grande', 'Verdana', 'Geneva', 'Lucid', - 'Arial', 'Helvetica', 'Avant Garde', 'sans-serif'], - validate_stringlist], - 'font.cursive' : [['Apple Chancery','Textile','Zapf Chancery', - 'Sand','cursive'], validate_stringlist], - 'font.fantasy' : [['Comic Sans MS','Chicago','Charcoal','Impact' - 'Western','fantasy'], validate_stringlist], - 'font.monospace' : [['Bitstream Vera Sans Mono', 'DejaVu Sans Mono', - 'Andale Mono', 'Nimbus Mono L', 'Courier New', - 'Courier','Fixed', 'Terminal','monospace'], - validate_stringlist], - - # text props - 'text.color' : ['k', validate_color], # black - 'text.usetex' : [False, validate_bool], - 'text.latex.unicode' : [False, validate_bool], - 'text.latex.preamble' : [[''], validate_latex_preamble], - 'text.dvipnghack' : [False, validate_bool], - 'text.fontstyle' : ['normal', str], - 'text.fontangle' : ['normal', str], - 'text.fontvariant' : ['normal', str], - 'text.fontweight' : ['normal', str], - 'text.fontsize' : ['medium', validate_fontsize], - - 'mathtext.cal' : ['cursive', validate_font_properties], - 'mathtext.rm' : ['serif', validate_font_properties], - 'mathtext.tt' : ['monospace', validate_font_properties], - 'mathtext.it' : ['serif:italic', validate_font_properties], - 'mathtext.bf' : ['serif:bold', validate_font_properties], - 'mathtext.sf' : ['sans\-serif', validate_font_properties], - 'mathtext.fontset' : ['cm', validate_fontset], - 'mathtext.default' : ['it', validate_mathtext_default], - 'mathtext.fallback_to_cm' : [True, validate_bool], - - 'image.aspect' : ['equal', validate_aspect], # equal, auto, a number - 'image.interpolation' : ['bilinear', str], - 'image.cmap' : ['jet', str], # one of gray, jet, etc - 'image.lut' : [256, validate_int], # lookup table - 'image.origin' : ['upper', str], # lookup table - - 'contour.negative_linestyle' : ['dashed', validate_negative_linestyle_legacy], - - # axes props - 'axes.axisbelow' : [False, validate_bool], - 'axes.hold' : [True, validate_bool], - 'axes.facecolor' : ['w', validate_color], # background color; white - 'axes.edgecolor' : ['k', validate_color], # edge color; black - 'axes.linewidth' : [1.0, validate_float], # edge linewidth - 'axes.titlesize' : [14, validate_fontsize], # fontsize of the axes title - 'axes.grid' : [False, validate_bool], # display grid or not - 'axes.labelsize' : [12, validate_fontsize], # fontsize of the x any y labels - 'axes.labelcolor' : ['k', validate_color], # color of axis label - 'axes.formatter.limits' : [[-7, 7], validate_nseq_int(2)], - # use scientific notation if log10 - # of the axis range is smaller than the - # first or larger than the second - - 'polaraxes.grid' : [True, validate_bool], # display polar grid or not - - #legend properties - 'legend.loc' : ['upper right',validate_legend_loc], # at some point, this should be changed to 'best' - 'legend.isaxes' : [True,validate_bool], # this option is internally ignored - it never served any useful purpose - 'legend.numpoints' : [2, validate_int], # the number of points in the legend line - 'legend.fontsize' : [14, validate_fontsize], - 'legend.pad' : [0.2, validate_float], # the fractional whitespace inside the legend border - 'legend.markerscale' : [1.0, validate_float], # the relative size of legend markers vs. original - - # the following dimensions are in axes coords - 'legend.labelsep' : [0.010, validate_float], # the vertical space between the legend entries - 'legend.handlelen' : [0.05, validate_float], # the length of the legend lines - 'legend.handletextsep' : [0.02, validate_float], # the space between the legend line and legend text - 'legend.axespad' : [0.02, validate_float], # the border between the axes and legend edge - 'legend.shadow' : [False, validate_bool], - - - # tick properties - 'xtick.major.size' : [4, validate_float], # major xtick size in points - 'xtick.minor.size' : [2, validate_float], # minor xtick size in points - 'xtick.major.pad' : [4, validate_float], # distance to label in points - 'xtick.minor.pad' : [4, validate_float], # distance to label in points - 'xtick.color' : ['k', validate_color], # color of the xtick labels - 'xtick.labelsize' : [12, validate_fontsize], # fontsize of the xtick labels - 'xtick.direction' : ['in', str], # direction of xticks - - 'ytick.major.size' : [4, validate_float], # major ytick size in points - 'ytick.minor.size' : [2, validate_float], # minor ytick size in points - 'ytick.major.pad' : [4, validate_float], # distance to label in points - 'ytick.minor.pad' : [4, validate_float], # distance to label in points - 'ytick.color' : ['k', validate_color], # color of the ytick labels - 'ytick.labelsize' : [12, validate_fontsize], # fontsize of the ytick labels - 'ytick.direction' : ['in', str], # direction of yticks - - 'grid.color' : ['k', validate_color], # grid color - 'grid.linestyle' : [':', str], # dotted - 'grid.linewidth' : [0.5, validate_float], # in points - - - # figure props - # figure size in inches: width by height - 'figure.figsize' : [[8.0,6.0], validate_nseq_float(2)], - 'figure.dpi' : [80, validate_float], # DPI - 'figure.facecolor' : ['0.75', validate_color], # facecolor; scalar gray - 'figure.edgecolor' : ['w', validate_color], # edgecolor; white - 'figure.autolayout' : [False, validate_autolayout], - - 'figure.subplot.left' : [0.125, ValidateInterval(0, 1, closedmin=False, closedmax=False)], - 'figure.subplot.right' : [0.9, ValidateInterval(0, 1, closedmin=False, closedmax=False)], - 'figure.subplot.bottom' : [0.1, ValidateInterval(0, 1, closedmin=False, closedmax=False)], - 'figure.subplot.top' : [0.9, ValidateInterval(0, 1, closedmin=False, closedmax=False)], - 'figure.subplot.wspace' : [0.2, ValidateInterval(0, 1, closedmin=False, closedmax=True)], - 'figure.subplot.hspace' : [0.2, ValidateInterval(0, 1, closedmin=False, closedmax=True)], - - - 'savefig.dpi' : [100, validate_float], # DPI - 'savefig.facecolor' : ['w', validate_color], # facecolor; white - 'savefig.edgecolor' : ['w', validate_color], # edgecolor; white - 'savefig.orientation' : ['portrait', validate_orientation], # edgecolor; white - - 'cairo.format' : ['png', validate_cairo_format], - 'tk.window_focus' : [False, validate_bool], # Maintain shell focus for TkAgg - 'tk.pythoninspect' : [False, validate_bool], # Set PYTHONINSPECT - 'ps.papersize' : ['letter', validate_ps_papersize], # Set the papersize/type - 'ps.useafm' : [False, validate_bool], # Set PYTHONINSPECT - 'ps.usedistiller' : [False, validate_ps_distiller], # use ghostscript or xpdf to distill ps output - 'ps.distiller.res' : [6000, validate_int], # dpi - 'ps.fonttype' : [3, validate_fonttype], # 3 (Type3) or 42 (Truetype) - 'pdf.compression' : [6, validate_int], # compression level from 0 to 9; 0 to disable - 'pdf.inheritcolor' : [False, validate_bool], # ignore any color-setting commands from the frontend - 'pdf.use14corefonts' : [False, validate_bool], # use only the 14 PDF core fonts - # embedded in every PDF viewing application - 'pdf.fonttype' : [3, validate_fonttype], # 3 (Type3) or 42 (Truetype) - 'svg.image_inline' : [True, validate_bool], # write raster image data directly into the svg file - 'svg.image_noscale' : [False, validate_bool], # suppress scaling of raster data embedded in SVG - 'svg.embed_char_paths' : [True, validate_bool], # True to save all characters as paths in the SVG - 'plugins.directory' : ['.matplotlib_plugins', str], # where plugin directory is locate - - 'path.simplify' : [True, validate_bool], - 'path.simplify_threshold' : [1.0 / 9.0, ValidateInterval(0.0, 1.0)] -} - -if __name__ == '__main__': - rc = defaultParams - rc['datapath'][0] = '/' - for key in rc: - if not rc[key][1](rc[key][0]) == rc[key][0]: - print "%s: %s != %s"%(key, rc[key][1](rc[key][0]), rc[key][0]) diff -Nru matplotlib-0.99.3/lib/matplotlib/config/tconfig.py matplotlib-1.0.1/lib/matplotlib/config/tconfig.py --- matplotlib-0.99.3/lib/matplotlib/config/tconfig.py 2009-07-31 15:14:39.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/config/tconfig.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,635 +0,0 @@ -"""Mix of Traits and ConfigObj. - -Provides: - -- Coupling a Traits object to a ConfigObj one, so that changes to the Traited - instance propagate back into the ConfigObj. - -- A declarative interface for describing configurations that automatically maps - to valid ConfigObj representations. - -- From these descriptions, valid .conf files can be auto-generated, with class - docstrings and traits information used for initial auto-documentation. - -- Hierarchical inclusion of files, so that a base config can be overridden only - in specific spots. - -- Automatic GUI editing of configuration objects. - - -Notes: - -The file creation policy is: - -1. Creating a TConfigManager(FooConfig,'missingfile.conf') will work -fine, and 'missingfile.conf' will be created empty. - -2. Creating TConfigManager(FooConfig,'OKfile.conf') where OKfile.conf has - -include = 'missingfile.conf' - -conks out with IOError. - -My rationale is that creating top-level empty files is a common and -reasonable need, but that having invalid include statements should -raise an error right away, so people know immediately that their files -have gone stale. - - -TODO: - - - Turn the currently interactive tests into proper doc/unit tests. Complete - docstrings. - - - Write the real ipython1 config system using this. That one is more - complicated than either the MPL one or the fake 'ipythontest' that I wrote - here, and it requires solving the issue of declaring references to other - objects inside the config files. - - - [Low priority] Write a custom TraitsUI view so that hierarchical - configurations provide nicer interactive editing. The automatic system is - remarkably good, but for very complex configurations having a nicely - organized view would be nice. -""" - -__license__ = 'BSD' - -############################################################################ -# Stdlib imports -############################################################################ -from cStringIO import StringIO -from inspect import isclass - -import os -import textwrap - -############################################################################ -# External imports -############################################################################ -from enthought.traits import api as T - -# For now we ship this internally so users don't have to download it, since -# it's just a single-file dependency. -import configobj - -############################################################################ -# Utility functions -############################################################################ - -def get_split_ind(seq, N): - """seq is a list of words. Return the index into seq such that - len(' '.join(seq[:ind])<=N - """ - - sLen = 0 - # todo: use Alex's xrange pattern from the cbook for efficiency - for (word, ind) in zip(seq, range(len(seq))): - sLen += len(word) + 1 # +1 to account for the len(' ') - if sLen>=N: return ind - return len(seq) - -def wrap(prefix, text, cols, max_lines=6): - 'wrap text with prefix at length cols' - pad = ' '*len(prefix.expandtabs()) - available = cols - len(pad) - - seq = text.split(' ') - Nseq = len(seq) - ind = 0 - lines = [] - while ind num_lines-abbr_end-1: - ret += pad + ' '.join(lines[i]) + '\n' - else: - if not lines_skipped: - lines_skipped = True - ret += ' <...snipped %d lines...> \n' % (num_lines-max_lines) -# for line in lines[1:]: -# ret += pad + ' '.join(line) + '\n' - return ret[:-1] - -def dedent(txt): - """A modified version of textwrap.dedent, specialized for docstrings. - - This version doesn't get confused by the first line of text having - inconsistent indentation from the rest, which happens a lot in docstrings. - - :Examples: - - >>> s = ''' - ... First line. - ... More... - ... End''' - - >>> print dedent(s) - First line. - More... - End - - >>> s = '''First line - ... More... - ... End''' - - >>> print dedent(s) - First line - More... - End - """ - out = [textwrap.dedent(t) for t in txt.split('\n',1) - if t and not t.isspace()] - return '\n'.join(out) - - -def comment(strng,indent=''): - """return an input string, commented out""" - template = indent + '# %s' - lines = [template % s for s in strng.splitlines(True)] - return ''.join(lines) - - -def configObj2Str(cobj): - """Dump a Configobj instance to a string.""" - outstr = StringIO() - cobj.write(outstr) - return outstr.getvalue() - -def getConfigFilename(conf): - """Find the filename attribute of a ConfigObj given a sub-section object. - """ - depth = conf.depth - for d in range(depth): - conf = conf.parent - return conf.filename - -def tconf2File(tconf,fname,force=False): - """Write a TConfig instance to a given filename. - - :Keywords: - - force : bool (False) - If true, force writing even if the file exists. - """ - - if os.path.isfile(fname) and not force: - raise IOError("File %s already exists, use force=True to overwrite" % - fname) - - txt = repr(tconf) - - fobj = open(fname,'w') - fobj.write(txt) - fobj.close() - -def filter_scalars(sc): - """ input sc MUST be sorted!!!""" - scalars = [] - maxi = len(sc)-1 - i = 0 - while i=level. Return - value indicates whether a message was issued - - """ - if self.ge(level): - print >>self.fileo, s - return True - return False - - - - def wrap(self, fmt, func, level='helpful', always=True): - """ - return a callable function that wraps func and reports it - output through the verbose handler if current verbosity level - is higher than level - - if always is True, the report will occur on every function - call; otherwise only on the first time the function is called - """ - assert callable(func) - def wrapper(*args, **kwargs): - ret = func(*args, **kwargs) - - if (always or not wrapper._spoke): - spoke = self.report(fmt%ret, level) - if not wrapper._spoke: wrapper._spoke = spoke - return ret - wrapper._spoke = False - wrapper.__doc__ = func.__doc__ - return wrapper - - def ge(self, level): - 'return true if self.level is >= level' - return self.vald[self.level]>=self.vald[level] - - -verbose=Verbose() diff -Nru matplotlib-0.99.3/lib/matplotlib/contour.py matplotlib-1.0.1/lib/matplotlib/contour.py --- matplotlib-0.99.3/lib/matplotlib/contour.py 2009-07-31 15:14:40.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/contour.py 2010-12-13 15:27:29.000000000 +0000 @@ -8,7 +8,7 @@ import numpy as np from numpy import ma import matplotlib._cntr as _cntr -import matplotlib.path as path +import matplotlib.path as mpath import matplotlib.ticker as ticker import matplotlib.cm as cm import matplotlib.colors as colors @@ -17,6 +17,8 @@ import matplotlib.text as text import matplotlib.cbook as cbook import matplotlib.mlab as mlab +import matplotlib.mathtext as mathtext +import matplotlib.texmanager as texmanager # Import needed for adding manual selection capability to clabel from matplotlib.blocking_input import BlockingContourLabeler @@ -29,6 +31,21 @@ # per level. +class ClabelText(text.Text): + """ + Unlike the ordinary text, the get_rotation returns an updated + angle in the pixel coordinate assuming that the input rotation is + an angle in data coordinate (or whatever transform set). + """ + def get_rotation(self): + angle = text.Text.get_rotation(self) + trans = self.get_transform() + x, y = self.get_position() + new_angles = trans.transform_angles(np.array([angle]), + np.array([[x, y]])) + return new_angles[0] + + class ContourLabeler: '''Mixin to provide labelling capability to ContourSet''' @@ -95,6 +112,12 @@ if *True* (default), label rotations will always be plus or minus 90 degrees from level. + *use_clabeltext*: + if *True* (default is False), ClabelText class (instead of + matplotlib.Text) is used to create labels. ClabelText + recalculates rotation angles of texts during the drawing time, + therefore this can be used if aspect of the axes changes. + .. plot:: mpl_examples/pylab_examples/contour_demo.py """ @@ -117,6 +140,8 @@ self.labelFmt = kwargs.get('fmt', '%1.3f') _colors = kwargs.get('colors', None) + self._use_clabeltext = kwargs.get('use_clabeltext', False) + # Detect if manual selection is desired and remove from argument list self.labelManual=kwargs.get('manual',False) @@ -124,7 +149,7 @@ if len(args) == 0: levels = self.levels - indices = range(len(self.levels)) + indices = range(len(levels)) elif len(args) == 1: levlabs = list(args[0]) indices, levels = [], [] @@ -245,10 +270,21 @@ def get_label_width(self, lev, fmt, fsize): "get the width of the label in points" - if cbook.is_string_like(lev): - lw = (len(lev)) * fsize + if not cbook.is_string_like(lev): + lev = self.get_text(lev, fmt) + + lev, ismath = text.Text.is_math_text(lev) + if ismath == 'TeX': + if not hasattr(self, '_TeX_manager'): + self._TeX_manager = texmanager.TexManager() + lw, _, _ = self._TeX_manager.get_text_width_height_descent(lev, fsize) + elif ismath: + if not hasattr(self, '_mathtext_parser'): + self._mathtext_parser = mathtext.MathTextParser('bitmap') + img, _ = self._mathtext_parser.parse(lev, dpi=72, prop=self.labelFontProps) + lw = img.get_width() # at dpi=72, the units are PostScript points else: - lw = (len(self.get_text(lev,fmt))) * fsize + lw = (len(lev)) * fsize return lw @@ -307,7 +343,7 @@ if xsize == 1: ysize = nsize else: - ysize = labelwidth + ysize = int(labelwidth) XX = np.resize(linecontour[:,0],(xsize, ysize)) YY = np.resize(linecontour[:,1],(xsize, ysize)) @@ -435,13 +471,29 @@ return (rotation,nlc) - - def add_label(self,x,y,rotation,lev,cvalue): + def _get_label_text(self,x,y,rotation): dx,dy = self.ax.transData.inverted().transform_point((x,y)) t = text.Text(dx, dy, rotation = rotation, horizontalalignment='center', verticalalignment='center') + return t + def _get_label_clabeltext(self,x,y,rotation): + # x, y, rotation is given in pixel coordinate. Convert them to + # the data coordinate and create a label using ClabelText + # class. This way, the roation of the clabel is along the + # contour line always. + transDataInv = self.ax.transData.inverted() + dx,dy = transDataInv.transform_point((x,y)) + drotation = transDataInv.transform_angles(np.array([rotation]), + np.array([[x,y]])) + t = ClabelText(dx, dy, rotation = drotation[0], + horizontalalignment='center', + verticalalignment='center') + + return t + + def _add_label(self, t, x, y, lev, cvalue): color = self.labelMappable.to_rgba(cvalue,alpha=self.alpha) _text = self.get_text(lev,self.labelFmt) @@ -453,6 +505,28 @@ # Add label to plot here - useful for manual mode label selection self.ax.add_artist(t) + def add_label(self,x,y,rotation,lev,cvalue): + """ + Addd contour label using Text class. + """ + + t = self._get_label_text(x,y,rotation) + self._add_label(t, x, y, lev, cvalue) + + def add_label_clabeltext(self,x,y,rotation,lev,cvalue): + """ + Addd contour label using ClabelText class. + """ + # x, y, rotation is given in pixel coordinate. Convert them to + # the data coordinate and create a label using ClabelText + # class. This way, the roation of the clabel is along the + # contour line always. + + t = self._get_label_clabeltext(x,y,rotation) + self._add_label(t, x, y, lev, cvalue) + + + def pop_label(self,index=-1): '''Defaults to removing last label, but any index can be supplied''' self.labelCValues.pop(index) @@ -460,13 +534,18 @@ t.remove() def labels(self, inline, inline_spacing): - trans = self.ax.transData # A bit of shorthand + + if self._use_clabeltext: + add_label = self.add_label_clabeltext + else: + add_label = self.add_label for icon, lev, fsize, cvalue in zip( self.labelIndiceList, self.labelLevelList, self.labelFontSizeList, self.labelCValueList ): con = self.collections[icon] + trans = con.get_transform() lw = self.get_label_width(lev, self.labelFmt, fsize) additions = [] paths = con.get_paths() @@ -493,13 +572,13 @@ inline_spacing ) # Actually add the label - self.add_label(x,y,rotation,lev,cvalue) + add_label(x,y,rotation,lev,cvalue) # If inline, add new contours if inline: for n in new: # Add path if not empty or single point - if len(n)>1: additions.append( path.Path(n) ) + if len(n)>1: additions.append( mpath.Path(n) ) else: # If not adding label, keep old path additions.append(linepath) @@ -511,7 +590,7 @@ class ContourSet(cm.ScalarMappable, ContourLabeler): """ - Create and store a set of contour lines or filled regions. + Store a set of contour lines or filled regions. User-callable method: clabel @@ -526,17 +605,49 @@ same as levels for line contours; half-way between levels for filled contours. See _process_colors method. """ - - def __init__(self, ax, *args, **kwargs): """ Draw contour lines or filled regions, depending on whether keyword arg 'filled' is False (default) or True. - The first argument of the initializer must be an axes - object. The remaining arguments and keyword arguments - are described in ContourSet.contour_doc. + The first three arguments must be: + + *ax*: axes object. + + *levels*: [level0, level1, ..., leveln] + A list of floating point numbers indicating the contour + levels. + + *allsegs*: [level0segs, level1segs, ...] + List of all the polygon segments for all the *levels*. + For contour lines len(allsegs) == len(levels), and for + filled contour regions len(allsegs) = len(levels)-1. + + level0segs = [polygon0, polygon1, ...] + + polygon0 = array_like [[x0,y0], [x1,y1], ...] + + *allkinds*: None or [level0kinds, level1kinds, ...] + Optional list of all the polygon vertex kinds (code types), as + described and used in Path. This is used to allow multiply- + connected paths such as holes within filled polygons. + If not None, len(allkinds) == len(allsegs). + level0kinds = [polygon0kinds, ...] + + polygon0kinds = [vertexcode0, vertexcode1, ...] + + If allkinds is not None, usually all polygons for a particular + contour level are grouped together so that + + level0segs = [polygon0] and level0kinds = [polygon0kinds]. + + Keyword arguments are as described in + :class:`~matplotlib.contour.QuadContourSet` object. + + **Examples:** + + .. plot:: mpl_examples/misc/contour_manual.py """ self.ax = ax self.levels = kwargs.get('levels', None) @@ -544,7 +655,7 @@ self.linewidths = kwargs.get('linewidths', None) self.linestyles = kwargs.get('linestyles', None) - self.alpha = kwargs.get('alpha', 1.0) + self.alpha = kwargs.get('alpha', None) self.origin = kwargs.get('origin', None) self.extent = kwargs.get('extent', None) cmap = kwargs.get('cmap', None) @@ -571,12 +682,17 @@ if self.colors is not None and cmap is not None: raise ValueError('Either colors or cmap must be None') if self.origin == 'image': self.origin = mpl.rcParams['image.origin'] - x, y, z = self._contour_args(*args) # also sets self.levels, - # self.layers + + self._process_args(*args, **kwargs) + self._process_levels() + if self.colors is not None: - cmap = colors.ListedColormap(self.colors, N=len(self.layers)) + ncolors = len(self.levels) + if self.filled: + ncolors -= 1 + cmap = colors.ListedColormap(self.colors, N=ncolors) if self.filled: - self.collections = cbook.silent_list('collections.PolyCollection') + self.collections = cbook.silent_list('collections.PathCollection') else: self.collections = cbook.silent_list('collections.LineCollection') # label lists must be initialized here @@ -588,48 +704,119 @@ kw['norm'] = norm cm.ScalarMappable.__init__(self, **kw) # sets self.cmap; self._process_colors() - _mask = ma.getmask(z) - if _mask is ma.nomask: - _mask = None + + self.allsegs, self.allkinds = self._get_allsegs_and_allkinds() if self.filled: if self.linewidths is not None: warnings.warn('linewidths is ignored by contourf') - C = _cntr.Cntr(x, y, z.filled(), _mask) - lowers = self._levels[:-1] - uppers = self._levels[1:] - for level, level_upper in zip(lowers, uppers): - nlist = C.trace(level, level_upper, points = 0, - nchunk = self.nchunk) - col = collections.PolyCollection(nlist, + + # Lower and upper contour levels. + lowers, uppers = self._get_lowers_and_uppers() + + # Ensure allkinds can be zipped below. + if self.allkinds is None: + self.allkinds = [None]*len(self.allsegs) + + for level, level_upper, segs, kinds in \ + zip(lowers, uppers, self.allsegs, self.allkinds): + paths = self._make_paths(segs, kinds) + # Default zorder taken from Collection + zorder = kwargs.get('zorder', 1) + col = collections.PathCollection(paths, antialiaseds = (self.antialiased,), edgecolors= 'none', - alpha=self.alpha) + alpha=self.alpha, + zorder=zorder) self.ax.add_collection(col) self.collections.append(col) - else: tlinewidths = self._process_linewidths() self.tlinewidths = tlinewidths tlinestyles = self._process_linestyles() - C = _cntr.Cntr(x, y, z.filled(), _mask) - for level, width, lstyle in zip(self.levels, tlinewidths, tlinestyles): - nlist = C.trace(level, points = 0) - col = collections.LineCollection(nlist, + for level, width, lstyle, segs in \ + zip(self.levels, tlinewidths, tlinestyles, self.allsegs): + # Default zorder taken from LineCollection + zorder = kwargs.get('zorder', 2) + col = collections.LineCollection(segs, linewidths = width, linestyle = lstyle, - alpha=self.alpha) - + alpha=self.alpha, + zorder=zorder) col.set_label('_nolegend_') self.ax.add_collection(col, False) self.collections.append(col) self.changed() # set the colors - x0 = ma.minimum(x) - x1 = ma.maximum(x) - y0 = ma.minimum(y) - y1 = ma.maximum(y) - self.ax.update_datalim([(x0,y0), (x1,y1)]) - self.ax.autoscale_view() + + def _process_args(self, *args, **kwargs): + """ + Process args and kwargs; override in derived classes. + + Must set self.levels, self.zmin and self.zmax, and update axes + limits. + """ + self.levels = args[0] + self.allsegs = args[1] + self.allkinds = len(args) > 2 and args[2] or None + self.zmax = np.amax(self.levels) + self.zmin = np.amin(self.levels) + self._auto = False + + # Check lengths of levels and allsegs. + if self.filled: + if len(self.allsegs) != len(self.levels)-1: + raise ValueError('must be one less number of segments as levels') + else: + if len(self.allsegs) != len(self.levels): + raise ValueError('must be same number of segments as levels') + + # Check length of allkinds. + if self.allkinds is not None and len(self.allkinds) != len(self.allsegs): + raise ValueError('allkinds has different length to allsegs') + + # Determine x,y bounds and update axes data limits. + havelimits = False + for segs in self.allsegs: + for seg in segs: + seg = np.asarray(seg) + if havelimits: + min = np.minimum(min, seg.min(axis=0)) + max = np.maximum(max, seg.max(axis=0)) + else: + min = seg.min(axis=0) + max = seg.max(axis=0) + havelimits = True + if havelimits: + self.ax.update_datalim([min, max]) + self.ax.autoscale_view(tight=True) + + def _get_allsegs_and_allkinds(self): + """ + Override in derived classes to create and return allsegs and allkinds. + allkinds can be None. + """ + return self.allsegs, self.allkinds + + def _get_lowers_and_uppers(self): + """ + Return (lowers,uppers) for filled contours. + """ + lowers = self._levels[:-1] + if self.zmin == lowers[0]: + # Include minimum values in lowest interval + lowers = lowers.copy() # so we don't change self._levels + if self.logscale: + lowers[0] = 0.99 * self.zmin + else: + lowers[0] -= 1 + uppers = self._levels[1:] + return (lowers, uppers) + + def _make_paths(self, segs, kinds): + if kinds is not None: + return [mpath.Path(seg,codes=kind) for seg,kind in zip(segs,kinds)] + else: + return [mpath.Path(seg) for seg in segs] def changed(self): tcolors = [ (tuple(rgba),) for rgba in @@ -646,7 +833,6 @@ # add label colors cm.ScalarMappable.changed(self) - def _autolev(self, z, N): ''' Select contour levels to span the data. @@ -668,114 +854,24 @@ zmin = self.zmin self.locator.set_bounds(zmin, zmax) lev = self.locator() - zmargin = (zmax - zmin) * 0.000001 # so z < (zmax + zmargin) - if zmax >= lev[-1]: - lev[-1] += zmargin - if zmin <= lev[0]: - if self.logscale: - lev[0] = 0.99 * zmin - else: - lev[0] -= zmargin self._auto = True if self.filled: return lev - return lev[1:-1] - - def _initialize_x_y(self, z): - ''' - Return X, Y arrays such that contour(Z) will match imshow(Z) - if origin is not None. - The center of pixel Z[i,j] depends on origin: - if origin is None, x = j, y = i; - if origin is 'lower', x = j + 0.5, y = i + 0.5; - if origin is 'upper', x = j + 0.5, y = Nrows - i - 0.5 - If extent is not None, x and y will be scaled to match, - as in imshow. - If origin is None and extent is not None, then extent - will give the minimum and maximum values of x and y. - ''' - if z.ndim != 2: - raise TypeError("Input must be a 2D array.") - else: - Ny, Nx = z.shape - if self.origin is None: # Not for image-matching. - if self.extent is None: - return np.meshgrid(np.arange(Nx), np.arange(Ny)) - else: - x0,x1,y0,y1 = self.extent - x = np.linspace(x0, x1, Nx) - y = np.linspace(y0, y1, Ny) - return np.meshgrid(x, y) - # Match image behavior: - if self.extent is None: - x0,x1,y0,y1 = (0, Nx, 0, Ny) - else: - x0,x1,y0,y1 = self.extent - dx = float(x1 - x0)/Nx - dy = float(y1 - y0)/Ny - x = x0 + (np.arange(Nx) + 0.5) * dx - y = y0 + (np.arange(Ny) + 0.5) * dy - if self.origin == 'upper': - y = y[::-1] - return np.meshgrid(x,y) - - def _check_xyz(self, args): - ''' - For functions like contour, check that the dimensions - of the input arrays match; if x and y are 1D, convert - them to 2D using meshgrid. - - Possible change: I think we should make and use an ArgumentError - Exception class (here and elsewhere). - ''' - # We can strip away the x and y units - x = self.ax.convert_xunits( args[0] ) - y = self.ax.convert_yunits( args[1] ) - - x = np.asarray(x, dtype=np.float64) - y = np.asarray(y, dtype=np.float64) - z = ma.asarray(args[2], dtype=np.float64) - if z.ndim != 2: - raise TypeError("Input z must be a 2D array.") - else: Ny, Nx = z.shape - if x.shape == z.shape and y.shape == z.shape: - return x,y,z - if x.ndim != 1 or y.ndim != 1: - raise TypeError("Inputs x and y must be 1D or 2D.") - nx, = x.shape - ny, = y.shape - if nx != Nx or ny != Ny: - raise TypeError("Length of x must be number of columns in z,\n" + - "and length of y must be number of rows.") - x,y = np.meshgrid(x,y) - return x,y,z + # For line contours, drop levels outside the data range. + return lev[(lev > zmin) & (lev < zmax)] - - - def _contour_args(self, *args): + def _contour_level_args(self, z, args): + """ + Determine the contour levels and store in self.levels. + """ if self.filled: fn = 'contourf' else: fn = 'contour' - Nargs = len(args) - if Nargs <= 2: - z = ma.asarray(args[0], dtype=np.float64) - x, y = self._initialize_x_y(z) - elif Nargs <=4: - x,y,z = self._check_xyz(args[:3]) - else: - raise TypeError("Too many arguments to %s; see help(%s)" % (fn,fn)) - z = ma.masked_invalid(z, copy=False) - self.zmax = ma.maximum(z) - self.zmin = ma.minimum(z) - if self.logscale and self.zmin <= 0: - z = ma.masked_where(z <= 0, z) - warnings.warn('Log scale: values of z <=0 have been masked') - self.zmin = z.min() self._auto = False if self.levels is None: - if Nargs == 1 or Nargs == 3: + if len(args) == 0: lev = self._autolev(z, 7) - else: # 2 or 4 args - level_arg = args[-1] + else: + level_arg = args[0] try: if type(level_arg) == int: lev = self._autolev(z, level_arg) @@ -786,14 +882,9 @@ "Last %s arg must give levels; see help(%s)" % (fn,fn)) if self.filled and len(lev) < 2: raise ValueError("Filled contours require at least 2 levels.") - # Workaround for cntr.c bug wrt masked interior regions: - #if filled: - # z = ma.masked_array(z.filled(-1e38)) - # It's not clear this is any better than the original bug. self.levels = lev - #if self._auto and self.extend in ('both', 'min', 'max'): - # raise TypeError("Auto level selection is inconsistent " - # + "with use of 'extend' kwarg") + + def _process_levels(self): self._levels = list(self.levels) if self.extend in ('both', 'min'): self._levels.insert(0, min(self.levels[0],self.zmin) - 1) @@ -806,15 +897,15 @@ self.vmin = 2 * self.levels[0] - self.levels[1] if self.extend in ('both', 'max'): self.vmax = 2 * self.levels[-1] - self.levels[-2] - self.layers = self._levels # contour: a line is a thin layer if self.filled: self.layers = 0.5 * (self._levels[:-1] + self._levels[1:]) if self.extend in ('both', 'min'): self.layers[0] = 0.5 * (self.vmin + self._levels[1]) if self.extend in ('both', 'max'): self.layers[-1] = 0.5 * (self.vmax + self._levels[-2]) - - return (x, y, z) + else: + self.layers = self.levels # contour: a line is a thin layer + # Use only original levels--no extended levels def _process_colors(self): """ @@ -830,11 +921,13 @@ """ self.monochrome = self.cmap.monochrome if self.colors is not None: - i0, i1 = 0, len(self.layers) + i0, i1 = 0, len(self.levels) + if self.filled: + i1 -= 1 if self.extend in ('both', 'min'): i0 = -1 if self.extend in ('both', 'max'): - i1 = i1 + 1 + i1 += 1 self.cvalues = range(i0, i1) self.set_norm(colors.NoNorm()) else: @@ -871,8 +964,9 @@ tlinestyles = ['solid'] * Nlev if self.monochrome: neg_ls = mpl.rcParams['contour.negative_linestyle'] + eps = - (self.zmax - self.zmin) * 1e-15 for i, lev in enumerate(self.levels): - if lev < 0.0: + if lev < eps: tlinestyles[i] = neg_ls else: if cbook.is_string_like(linestyles): @@ -897,16 +991,253 @@ self.alpha = alpha self.changed() + def find_nearest_contour( self, x, y, indices=None, pixel=True ): + """ + Finds contour that is closest to a point. Defaults to + measuring distance in pixels (screen space - useful for manual + contour labeling), but this can be controlled via a keyword + argument. + + Returns a tuple containing the contour, segment, index of + segment, x & y of segment point and distance to minimum point. + + Call signature:: + + conmin,segmin,imin,xmin,ymin,dmin = find_nearest_contour( + self, x, y, indices=None, pixel=True ) + + Optional keyword arguments:: + + *indices*: + Indexes of contour levels to consider when looking for + nearest point. Defaults to using all levels. + + *pixel*: + If *True*, measure distance in pixel space, if not, measure + distance in axes space. Defaults to *True*. + + """ + + # This function uses a method that is probably quite + # inefficient based on converting each contour segment to + # pixel coordinates and then comparing the given point to + # those coordinates for each contour. This will probably be + # quite slow for complex contours, but for normal use it works + # sufficiently well that the time is not noticeable. + # Nonetheless, improvements could probably be made. + + if indices==None: + indices = range(len(self.levels)) + + dmin = 1e10 + conmin = None + segmin = None + xmin = None + ymin = None + + for icon in indices: + con = self.collections[icon] + trans = con.get_transform() + paths = con.get_paths() + for segNum, linepath in enumerate(paths): + lc = linepath.vertices + + # transfer all data points to screen coordinates if desired + if pixel: + lc = trans.transform(lc) + + ds = (lc[:,0]-x)**2 + (lc[:,1]-y)**2 + d = min( ds ) + if d < dmin: + dmin = d + conmin = icon + segmin = segNum + imin = mpl.mlab.find( ds == d )[0] + xmin = lc[imin,0] + ymin = lc[imin,1] + + return (conmin,segmin,imin,xmin,ymin,dmin) + + +class QuadContourSet(ContourSet): + """ + Create and store a set of contour lines or filled regions. + + User-callable method: clabel + + Useful attributes: + ax: + the axes object in which the contours are drawn + collections: + a silent_list of LineCollections or PolyCollections + levels: + contour levels + layers: + same as levels for line contours; half-way between + levels for filled contours. See _process_colors method. + """ + def __init__(self, ax, *args, **kwargs): + """ + Calculate and draw contour lines or filled regions, depending + on whether keyword arg 'filled' is False (default) or True. + + The first argument of the initializer must be an axes + object. The remaining arguments and keyword arguments + are described in QuadContourSet.contour_doc. + """ + ContourSet.__init__(self, ax, *args, **kwargs) + + def _process_args(self, *args, **kwargs): + """ + Process args and kwargs. + """ + if isinstance(args[0], QuadContourSet): + C = args[0].Cntr + if self.levels is None: + self.levels = args[0].levels + self.zmin = args[0].zmin + self.zmax = args[0].zmax + else: + x, y, z = self._contour_args(args, kwargs) + + x0 = ma.minimum(x) + x1 = ma.maximum(x) + y0 = ma.minimum(y) + y1 = ma.maximum(y) + self.ax.update_datalim([(x0,y0), (x1,y1)]) + self.ax.autoscale_view(tight=True) + _mask = ma.getmask(z) + if _mask is ma.nomask: + _mask = None + C = _cntr.Cntr(x, y, z.filled(), _mask) + self.Cntr = C + + def _get_allsegs_and_allkinds(self): + """ + Create and return allsegs and allkinds by calling underlying C code. + """ + allsegs = [] + if self.filled: + lowers, uppers = self._get_lowers_and_uppers() + allkinds = [] + for level, level_upper in zip(lowers, uppers): + nlist = self.Cntr.trace(level, level_upper, nchunk = self.nchunk) + nseg = len(nlist)//2 + segs = nlist[:nseg] + kinds = nlist[nseg:] + allsegs.append(segs) + allkinds.append(kinds) + else: + allkinds = None + for level in self.levels: + nlist = self.Cntr.trace(level) + nseg = len(nlist)//2 + segs = nlist[:nseg] + allsegs.append(segs) + return allsegs, allkinds + + def _contour_args(self, args, kwargs): + if self.filled: fn = 'contourf' + else: fn = 'contour' + Nargs = len(args) + if Nargs <= 2: + z = ma.asarray(args[0], dtype=np.float64) + x, y = self._initialize_x_y(z) + args = args[1:] + elif Nargs <=4: + x,y,z = self._check_xyz(args[:3], kwargs) + args = args[3:] + else: + raise TypeError("Too many arguments to %s; see help(%s)" % (fn,fn)) + z = ma.masked_invalid(z, copy=False) + self.zmax = ma.maximum(z) + self.zmin = ma.minimum(z) + if self.logscale and self.zmin <= 0: + z = ma.masked_where(z <= 0, z) + warnings.warn('Log scale: values of z <= 0 have been masked') + self.zmin = z.min() + self._contour_level_args(z, args) + return (x, y, z) + + def _check_xyz(self, args, kwargs): + ''' + For functions like contour, check that the dimensions + of the input arrays match; if x and y are 1D, convert + them to 2D using meshgrid. + + Possible change: I think we should make and use an ArgumentError + Exception class (here and elsewhere). + ''' + x, y = args[:2] + self.ax._process_unit_info(xdata=x, ydata=y, kwargs=kwargs) + x = self.ax.convert_xunits(x) + y = self.ax.convert_yunits(y) + + x = np.asarray(x, dtype=np.float64) + y = np.asarray(y, dtype=np.float64) + z = ma.asarray(args[2], dtype=np.float64) + if z.ndim != 2: + raise TypeError("Input z must be a 2D array.") + else: Ny, Nx = z.shape + if x.shape == z.shape and y.shape == z.shape: + return x,y,z + if x.ndim != 1 or y.ndim != 1: + raise TypeError("Inputs x and y must be 1D or 2D.") + nx, = x.shape + ny, = y.shape + if nx != Nx or ny != Ny: + raise TypeError("Length of x must be number of columns in z,\n" + + "and length of y must be number of rows.") + x,y = np.meshgrid(x,y) + return x,y,z + + def _initialize_x_y(self, z): + ''' + Return X, Y arrays such that contour(Z) will match imshow(Z) + if origin is not None. + The center of pixel Z[i,j] depends on origin: + if origin is None, x = j, y = i; + if origin is 'lower', x = j + 0.5, y = i + 0.5; + if origin is 'upper', x = j + 0.5, y = Nrows - i - 0.5 + If extent is not None, x and y will be scaled to match, + as in imshow. + If origin is None and extent is not None, then extent + will give the minimum and maximum values of x and y. + ''' + if z.ndim != 2: + raise TypeError("Input must be a 2D array.") + else: + Ny, Nx = z.shape + if self.origin is None: # Not for image-matching. + if self.extent is None: + return np.meshgrid(np.arange(Nx), np.arange(Ny)) + else: + x0,x1,y0,y1 = self.extent + x = np.linspace(x0, x1, Nx) + y = np.linspace(y0, y1, Ny) + return np.meshgrid(x, y) + # Match image behavior: + if self.extent is None: + x0,x1,y0,y1 = (0, Nx, 0, Ny) + else: + x0,x1,y0,y1 = self.extent + dx = float(x1 - x0)/Nx + dy = float(y1 - y0)/Ny + x = x0 + (np.arange(Nx) + 0.5) * dx + y = y0 + (np.arange(Ny) + 0.5) * dy + if self.origin == 'upper': + y = y[::-1] + return np.meshgrid(x,y) + contour_doc = """ :func:`~matplotlib.pyplot.contour` and :func:`~matplotlib.pyplot.contourf` draw contour lines and filled contours, respectively. Except as noted, function signatures and return values are the same for both versions. - :func:`~matplotlib.pyplot.contourf` differs from the Matlab - (TM) version in that it does not draw the polygon edges, - because the contouring engine yields simply connected regions - with branch cuts. To draw the edges, add line contours with + :func:`~matplotlib.pyplot.contourf` differs from the MATLAB + version in that it does not draw the polygon edges. + To draw edges, add line contours with calls to :func:`~matplotlib.pyplot.contour`. @@ -956,7 +1287,7 @@ handle internal masked regions correctly. ``C = contour(...)`` returns a - :class:`~matplotlib.contour.ContourSet` object. + :class:`~matplotlib.contour.QuadContourSet` object. Optional keyword arguments: @@ -983,6 +1314,11 @@ scaling data values to colors. If *norm* is *None* and *colors* is *None*, the default linear scaling is used. + *levels* [level0, level1, ..., leveln] + A list of floating point numbers indicating the level + curves to draw; eg to draw just the zero contour pass + ``levels=[0]`` + *origin*: [ None | 'upper' | 'lower' | 'image' ] If *None*, the first value of *Z* will correspond to the lower left corner, location (0,0). If 'image', the rc @@ -1015,8 +1351,13 @@ are included. These added ranges are then mapped to the special colormap values which default to the ends of the colormap range, but can be set via - :meth:`matplotlib.cm.Colormap.set_under` and - :meth:`matplotlib.cm.Colormap.set_over` methods. + :meth:`matplotlib.colors.Colormap.set_under` and + :meth:`matplotlib.colors.Colormap.set_over` methods. + + *xunits*, *yunits*: [ None | registered units ] + Override axis units by specifying an instance of a + :class:`matplotlib.units.ConversionInterface`. + contour-only keyword arguments: @@ -1054,74 +1395,18 @@ be removed. Chunking introduces artifacts at the chunk boundaries unless *antialiased* is *False*. - **Example:** - - .. plot:: mpl_examples/pylab_examples/contour_demo.py - """ - - def find_nearest_contour( self, x, y, indices=None, pixel=True ): - """ - Finds contour that is closest to a point. Defaults to - measuring distance in pixels (screen space - useful for manual - contour labeling), but this can be controlled via a keyword - argument. - - Returns a tuple containing the contour, segment, index of - segment, x & y of segment point and distance to minimum point. - - Call signature:: + Note: contourf fills intervals that are closed at the top; that + is, for boundaries *z1* and *z2*, the filled region is:: - conmin,segmin,imin,xmin,ymin,dmin = find_nearest_contour( - self, x, y, indices=None, pixel=True ) + z1 < z <= z2 - Optional keyword arguments:: + There is one exception: if the lowest boundary coincides with + the minimum value of the *z* array, then that minimum value + will be included in the lowest interval. - *indices*: - Indexes of contour levels to consider when looking for - nearest point. Defaults to using all levels. + **Examples:** - *pixel*: - If *True*, measure distance in pixel space, if not, measure - distance in axes space. Defaults to *True*. + .. plot:: mpl_examples/pylab_examples/contour_demo.py + .. plot:: mpl_examples/pylab_examples/contourf_demo.py """ - - # This function uses a method that is probably quite - # inefficient based on converting each contour segment to - # pixel coordinates and then comparing the given point to - # those coordinates for each contour. This will probably be - # quite slow for complex contours, but for normal use it works - # sufficiently well that the time is not noticeable. - # Nonetheless, improvements could probably be made. - - if indices==None: - indices = range(len(self.levels)) - - dmin = 1e10 - conmin = None - segmin = None - xmin = None - ymin = None - - for icon in indices: - con = self.collections[icon] - paths = con.get_paths() - for segNum, linepath in enumerate(paths): - lc = linepath.vertices - - # transfer all data points to screen coordinates if desired - if pixel: - lc = self.ax.transData.transform(lc) - - ds = (lc[:,0]-x)**2 + (lc[:,1]-y)**2 - d = min( ds ) - if d < dmin: - dmin = d - conmin = icon - segmin = segNum - imin = mpl.mlab.find( ds == d )[0] - xmin = lc[imin,0] - ymin = lc[imin,1] - - return (conmin,segmin,imin,xmin,ymin,dmin) - diff -Nru matplotlib-0.99.3/lib/matplotlib/dates.py matplotlib-1.0.1/lib/matplotlib/dates.py --- matplotlib-0.99.3/lib/matplotlib/dates.py 2010-03-09 14:20:20.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/dates.py 2010-07-07 01:41:52.000000000 +0000 @@ -9,6 +9,23 @@ :func:`num2date` and :func:`drange` are used to facilitate easy conversion to and from :mod:`datetime` and numeric ranges. +.. note:: + Like Python's datetime, mpl uses the Gregorian calendar for + all conversions between dates and floating point numbers. + This practice is not universal, and calendar differences can + cause confusing differences between what Python and mpl + give as the number of days since 0001-01-01 and what other + software and databases yield. For example, the + `US Naval Observatory `_ + uses a calendar that switches from Julian to Gregorian in + October, 1582. Hence, using their calculator, the number of + days between 0001-01-01 and 2006-04-01 is 732403, whereas using + the Gregorian calendar via the datetime module we find:: + + In [31]:date(2006,4,1).toordinal() - date(1,1,1).toordinal() + Out[31]:732401 + + A wide range of specific and general purpose date tick locators and formatters are provided in this module. See :mod:`matplotlib.ticker` for general information on tick locators @@ -92,15 +109,6 @@ """ import re, time, math, datetime -import pytz - -# compatability for 2008c and older versions -try: - import pytz.zoneinfo -except ImportError: - pytz.zoneinfo = pytz.tzinfo - pytz.zoneinfo.UTC = pytz.UTC - import matplotlib import numpy as np @@ -108,7 +116,6 @@ import matplotlib.cbook as cbook import matplotlib.ticker as ticker -from pytz import timezone from dateutil.rrule import rrule, MO, TU, WE, TH, FR, SA, SU, YEARLY, \ MONTHLY, WEEKLY, DAILY, HOURLY, MINUTELY, SECONDLY from dateutil.relativedelta import relativedelta @@ -127,11 +134,28 @@ 'seconds', 'minutes', 'hours', 'weeks') +# Make a simple UTC instance so we don't always have to import +# pytz. From the python datetime library docs: + +class _UTC(datetime.tzinfo): + """UTC""" -UTC = pytz.timezone('UTC') + def utcoffset(self, dt): + return datetime.timedelta(0) + + def tzname(self, dt): + return "UTC" + + def dst(self, dt): + return datetime.timedelta(0) + +UTC = _UTC() def _get_rc_timezone(): s = matplotlib.rcParams['timezone'] + if s == 'UTC': + return UTC + import pytz return pytz.timezone(s) @@ -226,8 +250,11 @@ *d* is either a :class:`datetime` instance or a sequence of datetimes. Return value is a floating point number (or sequence of floats) - which gives one plus the number of days (fraction part represents hours, - minutes, seconds) since 0001-01-01 00:00:00 UTC. + which gives the number of days (fraction part represents hours, + minutes, seconds) since 0001-01-01 00:00:00 UTC, *plus* *one*. + The addition of one here is a historical artifact. Also, note + that the Gregorian calendar is assumed; this is not universal + practice. For details, see the module docstring. """ if not cbook.iterable(d): return _to_ordinalf(d) else: return np.asarray([_to_ordinalf(val) for val in d]) @@ -245,9 +272,12 @@ def num2date(x, tz=None): """ - *x* is a float value which gives one plus the number of days + *x* is a float value which gives the number of days (fraction part represents hours, minutes, seconds) since - 0001-01-01 00:00:00 UTC. + 0001-01-01 00:00:00 UTC *plus* *one*. + The addition of one here is a historical artifact. Also, note + that the Gregorian calendar is assumed; this is not universal + practice. For details, see the module docstring. Return value is a :class:`datetime` instance in timezone *tz* (default to rcparams TZ value). @@ -300,6 +330,8 @@ self.tz = tz def __call__(self, x, pos=0): + if x==0: + raise ValueError('DateFormatter found a value of x=0, which is an illegal date. This usually occurs because you have not informed the axis that it is plotting dates, eg with ax.xaxis_date()') dt = num2date(x, self.tz) return self.strftime(dt, self.fmt) @@ -388,6 +420,28 @@ """ This class attempts to figure out the best format to use. This is most useful when used with the :class:`AutoDateLocator`. + + + The AutoDateFormatter has a scale dictionary that maps the scale + of the tick (the distance in days between one major tick) and a + format string. The default looks like this:: + + self.scaled = { + 365.0 : '%Y', + 30. : '%b %Y', + 1.0 : '%b %d %Y', + 1./24. : '%H:%M:%D', + } + + + The algorithm picks the key in the dictionary that is >= the + current scale and uses that format string. You can customize this + dictionary by doing:: + + + formatter = AutoDateFormatter() + formatter.scaled[1/(24.*60.)] = '%M:%S' # only show min and sec + """ # This can be improved by providing some user-level direction on @@ -401,32 +455,38 @@ # Or more simply, perhaps just a format string for each # possibility... - def __init__(self, locator, tz=None): + def __init__(self, locator, tz=None, defaultfmt='%Y-%m-%d'): + """ + Autofmt the date labels. The default format is the one to use + if none of the times in scaled match + """ self._locator = locator - self._formatter = DateFormatter("%b %d %Y %H:%M:%S %Z", tz) self._tz = tz + self.defaultfmt = defaultfmt + self._formatter = DateFormatter(self.defaultfmt, tz) + self.scaled = { + 365.0 : '%Y', + 30. : '%b %Y', + 1.0 : '%b %d %Y', + 1./24. : '%H:%M:%S', + } def __call__(self, x, pos=0): + scale = float( self._locator._get_unit() ) - if ( scale == 365.0 ): - self._formatter = DateFormatter("%Y", self._tz) - elif ( scale == 30.0 ): - self._formatter = DateFormatter("%b %Y", self._tz) - elif ( (scale == 1.0) or (scale == 7.0) ): - self._formatter = DateFormatter("%b %d %Y", self._tz) - elif ( scale == (1.0/24.0) ): - self._formatter = DateFormatter("%H:%M:%S %Z", self._tz) - elif ( scale == (1.0/(24*60)) ): - self._formatter = DateFormatter("%H:%M:%S %Z", self._tz) - elif ( scale == (1.0/(24*3600)) ): - self._formatter = DateFormatter("%H:%M:%S %Z", self._tz) - else: - self._formatter = DateFormatter("%b %d %Y %H:%M:%S %Z", self._tz) + fmt = self.defaultfmt + for k in sorted(self.scaled): + if k>=scale: + fmt = self.scaled[k] + break + + self._formatter = DateFormatter(fmt, self._tz) return self._formatter(x, pos) + class rrulewrapper: def __init__(self, freq, **kwargs): @@ -470,10 +530,18 @@ """ return 1 + def _get_interval(self): + """ + Return the number of units for each tick. + """ + return 1 + def nonsingular(self, vmin, vmax): unit = self._get_unit() - vmin -= 2*unit - vmax += 2*unit + interval = self._get_interval() + if abs(vmax - vmin) < 1e-6: + vmin -= 2*unit*interval + vmax += 2*unit*interval return vmin, vmax class RRuleLocator(DateLocator): @@ -504,9 +572,23 @@ # The magic number! stop = _from_ordinalf( 3652059.9999999 ) - self.rule.set(dtstart=start, until=stop) + self.rule.set(dtstart=start, until=stop, count=self.MAXTICKS + 1) + + # estimate the number of ticks very approximately so we don't + # have to do a very expensive (and potentially near infinite) + # 'between' calculation, only to find out it will fail. + nmax, nmin = date2num((dmax, dmin)) + estimate = (nmax - nmin) / (self._get_unit() * self._get_interval()) + # This estimate is only an estimate, so be really conservative + # about bailing... + if estimate > self.MAXTICKS * 2: + raise RuntimeError( + 'RRuleLocator estimated to generate %d ticks from %s to %s: exceeds Locator.MAXTICKS * 2 (%d) ' % (estimate, dmin, dmax, self.MAXTICKS * 2)) + dates = self.rule.between(dmin, dmax, True) - return date2num(dates) + if len(dates) == 0: + return date2num([dmin, dmax]) + return self.raise_if_exceeds(date2num(dates)) def _get_unit(self): """ @@ -514,14 +596,17 @@ intelligent autoscaling. """ freq = self.rule._rrule._freq + return self.get_unit_generic(freq) + + def get_unit_generic(freq): if ( freq == YEARLY ): - return 365 + return 365.0 elif ( freq == MONTHLY ): - return 30 + return 30.0 elif ( freq == WEEKLY ): - return 7 + return 7.0 elif ( freq == DAILY ): - return 1 + return 1.0 elif ( freq == HOURLY ): return (1.0/24.0) elif ( freq == MINUTELY ): @@ -531,6 +616,10 @@ else: # error return -1 #or should this just return '1'? + get_unit_generic = staticmethod(get_unit_generic) + + def _get_interval(self): + return self.rule._rrule._interval def autoscale(self): """ @@ -576,10 +665,78 @@ :class:`MultipleDateLocator` to set the view limits and the tick locations. """ - def __init__(self, tz=None): + def __init__(self, tz=None, minticks=5, maxticks=None, + interval_multiples=False): + """ + *minticks* is the minimum number of ticks desired, which is used to + select the type of ticking (yearly, monthly, etc.). + + *maxticks* is the maximum number of ticks desired, which controls + any interval between ticks (ticking every other, every 3, etc.). + For really fine-grained control, this can be a dictionary mapping + individual rrule frequency constants (YEARLY, MONTHLY, etc.) + to their own maximum number of ticks. This can be used to keep + the number of ticks appropriate to the format chosen in + class:`AutoDateFormatter`. Any frequency not specified in this + dictionary is given a default value. + + *tz* is a :class:`tzinfo` instance. + + *interval_multiples* is a boolean that indicates whether ticks + should be chosen to be multiple of the interval. This will lock + ticks to 'nicer' locations. For example, this will force the + ticks to be at hours 0,6,12,18 when hourly ticking is done at + 6 hour intervals. + + The AutoDateLocator has an interval dictionary that maps the + frequency of the tick (a constant from dateutil.rrule) and a + multiple allowed for that ticking. The default looks like this:: + + self.intervald = { + YEARLY : [1, 2, 4, 5, 10], + MONTHLY : [1, 2, 3, 4, 6], + DAILY : [1, 2, 3, 7, 14], + HOURLY : [1, 2, 3, 4, 6, 12], + MINUTELY: [1, 5, 10, 15, 30], + SECONDLY: [1, 5, 10, 15, 30] + } + + The interval is used to specify multiples that are appropriate for + the frequency of ticking. For instance, every 7 days is sensible + for daily ticks, but for minutes/seconds, 15 or 30 make sense. + You can customize this dictionary by doing:: + + locator = AutoDateLocator() + locator.intervald[HOURLY] = [3] # only show every 3 hours + """ DateLocator.__init__(self, tz) self._locator = YearLocator() self._freq = YEARLY + self._freqs = [YEARLY, MONTHLY, DAILY, HOURLY, MINUTELY, SECONDLY] + self.minticks = minticks + + self.maxticks = {YEARLY : 16, MONTHLY : 12, DAILY : 11, HOURLY : 16, + MINUTELY : 11, SECONDLY : 11} + if maxticks is not None: + try: + self.maxticks.update(maxticks) + except TypeError: + # Assume we were given an integer. Use this as the maximum + # number of ticks for every frequency and create a + # dictionary for this + self.maxticks = dict(zip(self._freqs, + [maxticks]*len(self._freqs))) + self.interval_multiples = interval_multiples + self.intervald = { + YEARLY : [1, 2, 4, 5, 10], + MONTHLY : [1, 2, 3, 4, 6], + DAILY : [1, 2, 3, 7, 14], + HOURLY : [1, 2, 3, 4, 6, 12], + MINUTELY: [1, 5, 10, 15, 30], + SECONDLY: [1, 5, 10, 15, 30] + } + self._byranges = [None, range(1, 13), range(1, 32), range(0, 24), + range(0, 60), range(0, 60)] def __call__(self): 'Return the locations of the ticks' @@ -596,23 +753,7 @@ self._locator = self.get_locator(dmin, dmax) def _get_unit(self): - if ( self._freq == YEARLY ): - return 365.0 - elif ( self._freq == MONTHLY ): - return 30.0 - elif ( self._freq == WEEKLY ): - return 7.0 - elif ( self._freq == DAILY ): - return 1.0 - elif ( self._freq == HOURLY ): - return 1.0/24 - elif ( self._freq == MINUTELY ): - return 1.0/(24*60) - elif ( self._freq == SECONDLY ): - return 1.0/(24*3600) - else: - # error - return -1 + return RRuleLocator.get_unit_generic(self._freq) def autoscale(self): 'Try to choose the view limits intelligently.' @@ -632,89 +773,59 @@ numMinutes = (numHours * 60.0) + delta.minutes numSeconds = (numMinutes * 60.0) + delta.seconds - numticks = 5 + nums = [numYears, numMonths, numDays, numHours, numMinutes, numSeconds] - # self._freq = YEARLY - interval = 1 - bymonth = 1 - bymonthday = 1 - byhour = 0 - byminute = 0 - bysecond = 0 - - if ( numYears >= numticks ): - self._freq = YEARLY - elif ( numMonths >= numticks ): - self._freq = MONTHLY - bymonth = range(1, 13) - if ( (0 <= numMonths) and (numMonths <= 14) ): - interval = 1 # show every month - elif ( (15 <= numMonths) and (numMonths <= 29) ): - interval = 3 # show every 3 months - elif ( (30 <= numMonths) and (numMonths <= 44) ): - interval = 4 # show every 4 months - else: # 45 <= numMonths <= 59 - interval = 6 # show every 6 months - elif ( numDays >= numticks ): - self._freq = DAILY - bymonth = None - bymonthday = range(1, 32) - if ( (0 <= numDays) and (numDays <= 9) ): - interval = 1 # show every day - elif ( (10 <= numDays) and (numDays <= 19) ): - interval = 2 # show every 2 days - elif ( (20 <= numDays) and (numDays <= 49) ): - interval = 3 # show every 3 days - elif ( (50 <= numDays) and (numDays <= 99) ): - interval = 7 # show every 1 week - else: # 100 <= numDays <= ~150 - interval = 14 # show every 2 weeks - elif ( numHours >= numticks ): - self._freq = HOURLY - bymonth = None - bymonthday = None - byhour = range(0, 24) # show every hour - if ( (0 <= numHours) and (numHours <= 14) ): - interval = 1 # show every hour - elif ( (15 <= numHours) and (numHours <= 30) ): - interval = 2 # show every 2 hours - elif ( (30 <= numHours) and (numHours <= 45) ): - interval = 3 # show every 3 hours - elif ( (45 <= numHours) and (numHours <= 68) ): - interval = 4 # show every 4 hours - elif ( (68 <= numHours) and (numHours <= 90) ): - interval = 6 # show every 6 hours - else: # 90 <= numHours <= 120 - interval = 12 # show every 12 hours - elif ( numMinutes >= numticks ): - self._freq = MINUTELY - bymonth = None - bymonthday = None - byhour = None - byminute = range(0, 60) - if ( numMinutes > (10.0 * numticks) ): - interval = 10 - # end if - elif ( numSeconds >= numticks ): - self._freq = SECONDLY - bymonth = None - bymonthday = None - byhour = None - byminute = None - bysecond = range(0, 60) - if ( numSeconds > (10.0 * numticks) ): - interval = 10 - # end if + # Default setting of bymonth, etc. to pass to rrule + # [unused (for year), bymonth, bymonthday, byhour, byminute, bysecond] + byranges = [None, 1, 1, 0, 0, 0] + + # Loop over all the frequencies and try to find one that gives at + # least a minticks tick positions. Once this is found, look for + # an interval from an list specific to that frequency that gives no + # more than maxticks tick positions. Also, set up some ranges + # (bymonth, etc.) as appropriate to be passed to rrulewrapper. + for i, (freq, num) in enumerate(zip(self._freqs, nums)): + # If this particular frequency doesn't give enough ticks, continue + if num < self.minticks: + # Since we're not using this particular frequency, set + # the corresponding by_ to None so the rrule can act as + # appropriate + byranges[i] = None + continue + + # Find the first available interval that doesn't give too many ticks + for interval in self.intervald[freq]: + if num <= interval * (self.maxticks[freq] - 1): + break + else: + # We went through the whole loop without breaking, default to 1 + interval = 1 + + # Set some parameters as appropriate + self._freq = freq + + if self._byranges[i] and self.interval_multiples: + byranges[i] = self._byranges[i][::interval] + interval = 1 + else: + byranges[i] = self._byranges[i] + + # We found what frequency to use + break else: + # We couldn't find a good frequency. # do what? # microseconds as floats, but floats from what reference point? - pass + byranges = [None, 1, 1, 0, 0, 0] + interval = 1 + unused, bymonth, bymonthday, byhour, byminute, bysecond = byranges + del unused - rrule = rrulewrapper( self._freq, interval=interval, \ - dtstart=dmin, until=dmax, \ - bymonth=bymonth, bymonthday=bymonthday, \ - byhour=byhour, byminute = byminute, \ + rrule = rrulewrapper( self._freq, interval=interval, + dtstart=dmin, until=dmax, + bymonth=bymonth, bymonthday=bymonthday, + byhour=byhour, byminute = byminute, bysecond=bysecond ) locator = RRuleLocator(rrule, self.tz) @@ -752,14 +863,6 @@ 'tzinfo' : tz } - - def _get_unit(self): - """ - Return how many days a unit of the locator is; used for - intelligent autoscaling. - """ - return 365 - def __call__(self): dmin, dmax = self.viewlim_to_dt() ymin = self.base.le(dmin.year) @@ -788,6 +891,7 @@ vmax = date2num(vmax) return self.nonsingular(vmin, vmax) + class MonthLocator(RRuleLocator): """ Make ticks on occurances of each month month, eg 1, 3, 12. @@ -805,13 +909,6 @@ interval=interval, **self.hms0d) RRuleLocator.__init__(self, o, tz) - def _get_unit(self): - """ - Return how many days a unit of the locator is; used for - intelligent autoscaling. - """ - return 30 - class WeekdayLocator(RRuleLocator): """ @@ -833,13 +930,6 @@ interval=interval, **self.hms0d) RRuleLocator.__init__(self, o, tz) - def _get_unit(self): - """ - return how many days a unit of the locator is; used for - intelligent autoscaling. - """ - return 7 - class DayLocator(RRuleLocator): """ @@ -858,12 +948,6 @@ interval=interval, **self.hms0d) RRuleLocator.__init__(self, o, tz) - def _get_unit(self): - """ - Return how many days a unit of the locator is; used for - intelligent autoscaling. - """ - return 1 class HourLocator(RRuleLocator): """ @@ -882,12 +966,6 @@ byminute=0, bysecond=0) RRuleLocator.__init__(self, rule, tz) - def _get_unit(self): - """ - return how many days a unit of the locator is; use for - intelligent autoscaling - """ - return 1/24. class MinuteLocator(RRuleLocator): """ @@ -906,12 +984,6 @@ bysecond=0) RRuleLocator.__init__(self, rule, tz) - def _get_unit(self): - """ - Return how many days a unit of the locator is; used for - intelligent autoscaling. - """ - return 1./(24*60) class SecondLocator(RRuleLocator): """ @@ -930,14 +1002,6 @@ rule = rrulewrapper(SECONDLY, bysecond=bysecond, interval=interval) RRuleLocator.__init__(self, rule, tz) - def _get_unit(self): - """ - Return how many days a unit of the locator is; used for - intelligent autoscaling. - """ - return 1./(24*60*60) - - def _close_to_dt(d1, d2, epsilon=5): 'Assert that datetimes *d1* and *d2* are within *epsilon* microseconds.' @@ -1046,41 +1110,14 @@ def axisinfo(unit, axis): 'return the unit AxisInfo' # make sure that the axis does not start at 0 - if axis: - ax = axis.axes - - if axis is ax.get_xaxis(): - xmin, xmax = ax.dataLim.intervalx - if xmin==0.: - # no data has been added - let's set the default datalim. - # We should probably use a better proxy for the datalim - # have been updated than the ignore setting - dmax = today = datetime.date.today() - dmin = today-datetime.timedelta(days=10) - - ax._process_unit_info(xdata=(dmin, dmax)) - dmin, dmax = ax.convert_xunits([dmin, dmax]) - - ax.viewLim.intervalx = dmin, dmax - ax.dataLim.intervalx = dmin, dmax - elif axis is ax.get_yaxis(): - ymin, ymax = ax.dataLim.intervaly - if ymin==0.: - # no data has been added - let's set the default datalim. - # We should probably use a better proxy for the datalim - # have been updated than the ignore setting - dmax = today = datetime.date.today() - dmin = today-datetime.timedelta(days=10) - - ax._process_unit_info(ydata=(dmin, dmax)) - dmin, dmax = ax.convert_yunits([dmin, dmax]) - - ax.viewLim.intervaly = dmin, dmax - ax.dataLim.intervaly = dmin, dmax majloc = AutoDateLocator(tz=unit) majfmt = AutoDateFormatter(majloc, tz=unit) - return units.AxisInfo( majloc=majloc, majfmt=majfmt, label='' ) + datemin = datetime.date(2000, 1, 1) + datemax = datetime.date(2010, 1, 1) + + return units.AxisInfo( majloc=majloc, majfmt=majfmt, label='', + default_limits=(datemin, datemax)) @staticmethod def convert(value, unit, axis): diff -Nru matplotlib-0.99.3/lib/matplotlib/delaunay/_delaunay.cpp matplotlib-1.0.1/lib/matplotlib/delaunay/_delaunay.cpp --- matplotlib-0.99.3/lib/matplotlib/delaunay/_delaunay.cpp 2009-07-31 15:14:35.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/delaunay/_delaunay.cpp 2010-07-07 01:41:51.000000000 +0000 @@ -12,8 +12,8 @@ extern "C" { -static void reorder_edges(int npoints, int ntriangles, - double *x, double *y, +static void reorder_edges(int npoints, int ntriangles, + double *x, double *y, int *edge_db, int *tri_edges, int *tri_nbrs) { int neighbors[3], nodes[3]; @@ -69,7 +69,7 @@ // Not trusting me? Okay, let's go through it: // We have three edges to deal with and three nodes. Without loss - // of generality, let's label the nodes A, B, and C with (A, B) + // of generality, let's label the nodes A, B, and C with (A, B) // forming the first edge in the order they arrive on input. // Then there are eight possibilities as to how the other edge-tuples // may be labeled, but only two variations that are going to affect the @@ -85,7 +85,7 @@ // The second test we need to perform is for counter-clockwiseness. // Again, there are only two variations that will affect the outcome: // either ABC is counter-clockwise, or it isn't. In the former case, - // we're done setting the node order, we just need to associate the + // we're done setting the node order, we just need to associate the // appropriate neighbor triangles with their opposite nodes, something // which can be done by inspection. In the latter case, to order the // nodes counter-clockwise, we only have to switch B and C to get @@ -113,7 +113,7 @@ static PyObject* getMesh(int npoints, double *x, double *y) { - PyObject *vertices, *edge_db, *tri_edges, *tri_nbrs; + PyObject *vertices = NULL, *edge_db = NULL, *tri_edges = NULL, *tri_nbrs = NULL; PyObject *temp; int tri0, tri1, reg0, reg1; double tri0x, tri0y, tri1x, tri1y; @@ -138,7 +138,7 @@ edge_db = PyArray_SimpleNew(2, dim, PyArray_INT); if (!edge_db) goto fail; edge_db_ptr = (int*)PyArray_DATA(edge_db); - + dim[0] = numtri; vertices = PyArray_SimpleNew(2, dim, PyArray_DOUBLE); if (!vertices) goto fail; @@ -192,7 +192,7 @@ // tri_edges contains lists of edges; convert to lists of nodes in // counterclockwise order and reorder tri_nbrs to match. Each node // corresponds to the edge opposite it in the triangle. - reorder_edges(npoints, numtri, x, y, edge_db_ptr, tri_edges_ptr, + reorder_edges(npoints, numtri, x, y, edge_db_ptr, tri_edges_ptr, tri_nbrs_ptr); temp = Py_BuildValue("(OOOO)", vertices, edge_db, tri_edges, tri_nbrs); @@ -221,7 +221,7 @@ int i; double *planes_ptr; double x02, y02, z02, x12, y12, z12, xy0212; - + dims[0] = ntriangles; dims[1] = 3; planes = PyArray_SimpleNew(2, dims, PyArray_DOUBLE); @@ -240,15 +240,15 @@ xy0212 = y02/y12; INDEX3(planes_ptr,i,0) = (z02 - z12 * xy0212) / (x02 - x12 * xy0212); INDEX3(planes_ptr,i,1) = (z12 - INDEX3(planes_ptr,i,0)*x12) / y12; - INDEX3(planes_ptr,i,2) = (z[INDEX3(nodes,i,2)] - - INDEX3(planes_ptr,i,0)*x[INDEX3(nodes,i,2)] - + INDEX3(planes_ptr,i,2) = (z[INDEX3(nodes,i,2)] - + INDEX3(planes_ptr,i,0)*x[INDEX3(nodes,i,2)] - INDEX3(planes_ptr,i,1)*y[INDEX3(nodes,i,2)]); } else { xy0212 = x02/x12; INDEX3(planes_ptr,i,1) = (z02 - z12 * xy0212) / (y02 - y12 * xy0212); INDEX3(planes_ptr,i,0) = (z12 - INDEX3(planes_ptr,i,1)*y12) / x12; - INDEX3(planes_ptr,i,2) = (z[INDEX3(nodes,i,2)] - - INDEX3(planes_ptr,i,0)*x[INDEX3(nodes,i,2)] - + INDEX3(planes_ptr,i,2) = (z[INDEX3(nodes,i,2)] - + INDEX3(planes_ptr,i,0)*x[INDEX3(nodes,i,2)] - INDEX3(planes_ptr,i,1)*y[INDEX3(nodes,i,2)]); } } @@ -256,24 +256,24 @@ return (PyObject*)planes; } -static double linear_interpolate_single(double targetx, double targety, +static double linear_interpolate_single(double targetx, double targety, double *x, double *y, int *nodes, int *neighbors, PyObject *planes, double defvalue, int start_triangle, int *end_triangle) { double *planes_ptr; planes_ptr = (double*)PyArray_DATA(planes); if (start_triangle == -1) start_triangle = 0; - *end_triangle = walking_triangles(start_triangle, targetx, targety, + *end_triangle = walking_triangles(start_triangle, targetx, targety, x, y, nodes, neighbors); if (*end_triangle == -1) return defvalue; - return (targetx*INDEX3(planes_ptr,*end_triangle,0) + + return (targetx*INDEX3(planes_ptr,*end_triangle,0) + targety*INDEX3(planes_ptr,*end_triangle,1) + INDEX3(planes_ptr,*end_triangle,2)); } -static PyObject *linear_interpolate_grid(double x0, double x1, int xsteps, +static PyObject *linear_interpolate_grid(double x0, double x1, int xsteps, double y0, double y1, int ysteps, - PyObject *planes, double defvalue, + PyObject *planes, double defvalue, int npoints, double *x, double *y, int *nodes, int *neighbors) { int ix, iy; @@ -312,7 +312,7 @@ static PyObject *compute_planes_method(PyObject *self, PyObject *args) { PyObject *pyx, *pyy, *pyz, *pynodes; - PyObject *x, *y, *z, *nodes; + PyObject *x = NULL, *y = NULL, *z = NULL, *nodes = NULL; int npoints, ntriangles; PyObject *planes; @@ -351,7 +351,7 @@ goto fail; } - planes = linear_planes(ntriangles, (double*)PyArray_DATA(x), + planes = linear_planes(ntriangles, (double*)PyArray_DATA(x), (double*)PyArray_DATA(y), (double*)PyArray_DATA(z), (int*)PyArray_DATA(nodes)); Py_DECREF(x); @@ -374,7 +374,7 @@ double x0, x1, y0, y1, defvalue; int xsteps, ysteps; PyObject *pyplanes, *pyx, *pyy, *pynodes, *pyneighbors, *grid; - PyObject *planes, *x, *y, *nodes, *neighbors; + PyObject *planes = NULL, *x = NULL, *y = NULL, *nodes = NULL, *neighbors = NULL; int npoints; @@ -417,7 +417,7 @@ (PyObject*)planes, defvalue, npoints, (double*)PyArray_DATA(x), (double*)PyArray_DATA(y), (int*)PyArray_DATA(nodes), (int*)PyArray_DATA(neighbors)); - + Py_DECREF(x); Py_DECREF(y); Py_DECREF(planes); @@ -455,7 +455,7 @@ { PyObject *pyx, *pyy, *pyz, *pycenters, *pynodes, *pyneighbors, *pyintx, *pyinty; PyObject *x = NULL, *y = NULL, *z = NULL, *centers = NULL, *nodes = NULL, - *neighbors = NULL, *intx = NULL, *inty = NULL, *intz; + *neighbors = NULL, *intx = NULL, *inty = NULL, *intz = NULL; double defvalue; int size, npoints, ntriangles; @@ -506,7 +506,7 @@ return NULL; } ntriangles = PyArray_DIM(neighbors, 0); - if ((PyArray_DIM(nodes, 0) != ntriangles) || + if ((PyArray_DIM(nodes, 0) != ntriangles) || (PyArray_DIM(centers, 0) != ntriangles)) { PyErr_SetString(PyExc_ValueError, "centers,nodes,neighbors must be of equal length"); CLEANUP @@ -542,13 +542,13 @@ return NULL; } - NaturalNeighbors nn(npoints, ntriangles, + NaturalNeighbors nn(npoints, ntriangles, (double*)PyArray_DATA(x), (double*)PyArray_DATA(y), - (double*)PyArray_DATA(centers), (int*)PyArray_DATA(nodes), + (double*)PyArray_DATA(centers), (int*)PyArray_DATA(nodes), (int*)PyArray_DATA(neighbors)); size = PyArray_Size(intx); - nn.interpolate_unstructured((double*)PyArray_DATA(z), size, - (double*)PyArray_DATA(intx), (double*)PyArray_DATA(inty), + nn.interpolate_unstructured((double*)PyArray_DATA(z), size, + (double*)PyArray_DATA(intx), (double*)PyArray_DATA(inty), (double*)PyArray_DATA(intz), defvalue); Py_XDECREF(x); @@ -575,13 +575,13 @@ static PyObject *nn_interpolate_method(PyObject *self, PyObject *args) { PyObject *pyx, *pyy, *pyz, *pycenters, *pynodes, *pyneighbors, *grid; - PyObject *x, *y, *z, *centers, *nodes, *neighbors; + PyObject *x = NULL, *y = NULL, *z = NULL, *centers = NULL, *nodes = NULL, *neighbors = NULL; double x0, x1, y0, y1, defvalue; int xsteps, ysteps; int npoints, ntriangles; intp dims[2]; - if (!PyArg_ParseTuple(args, "ddiddidOOOOOO", &x0, &x1, &xsteps, + if (!PyArg_ParseTuple(args, "ddiddidOOOOOO", &x0, &x1, &xsteps, &y0, &y1, &ysteps, &defvalue, &pyx, &pyy, &pyz, &pycenters, &pynodes, &pyneighbors)) { return NULL; @@ -629,7 +629,7 @@ return NULL; } ntriangles = PyArray_DIM(neighbors, 0); - if ((PyArray_DIM(nodes, 0) != ntriangles) || + if ((PyArray_DIM(nodes, 0) != ntriangles) || (PyArray_DIM(centers, 0) != ntriangles)) { PyErr_SetString(PyExc_ValueError, "centers,nodes,neighbors must be of equal length"); CLEANUP @@ -644,11 +644,11 @@ return NULL; } - NaturalNeighbors nn(npoints, ntriangles, + NaturalNeighbors nn(npoints, ntriangles, (double*)PyArray_DATA(x), (double*)PyArray_DATA(y), - (double*)PyArray_DATA(centers), (int*)PyArray_DATA(nodes), + (double*)PyArray_DATA(centers), (int*)PyArray_DATA(nodes), (int*)PyArray_DATA(neighbors)); - nn.interpolate_grid((double*)PyArray_DATA(z), + nn.interpolate_grid((double*)PyArray_DATA(z), x0, x1, xsteps, y0, y1, ysteps, (double*)PyArray_DATA(grid), @@ -664,7 +664,7 @@ static PyObject *delaunay_method(PyObject *self, PyObject *args) { PyObject *pyx, *pyy, *mesh; - PyObject *x, *y; + PyObject *x = NULL, *y = NULL; int npoints; if (!PyArg_ParseTuple(args, "OO", &pyx, &pyy)) { @@ -703,7 +703,7 @@ } static PyMethodDef delaunay_methods[] = { - {"delaunay", (PyCFunction)delaunay_method, METH_VARARGS, + {"delaunay", (PyCFunction)delaunay_method, METH_VARARGS, "Compute the Delaunay triangulation of a cloud of 2-D points.\n\n" "circumcenters, edges, tri_points, tri_neighbors = delaunay(x, y)\n\n" "x, y -- shape-(npoints,) arrays of floats giving the X and Y coordinates of the points\n" @@ -730,7 +730,7 @@ PyMODINIT_FUNC init_delaunay(void) { PyObject* m; - m = Py_InitModule3("_delaunay", delaunay_methods, + m = Py_InitModule3("_delaunay", delaunay_methods, "Tools for computing the Delaunay triangulation and some operations on it.\n" ); if (m == NULL) diff -Nru matplotlib-0.99.3/lib/matplotlib/docstring.py matplotlib-1.0.1/lib/matplotlib/docstring.py --- matplotlib-0.99.3/lib/matplotlib/docstring.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/docstring.py 2010-07-07 01:41:52.000000000 +0000 @@ -0,0 +1,112 @@ +from matplotlib import cbook + +class Substitution(object): + """ + A decorator to take a function's docstring and perform string + substitution on it. + + This decorator should be robust even if func.__doc__ is None + (for example, if -OO was passed to the interpreter) + + Usage: construct a docstring.Substitution with a sequence or + dictionary suitable for performing substitution; then + decorate a suitable function with the constructed object. e.g. + + sub_author_name = Substitution(author='Jason') + + @sub_author_name + def some_function(x): + "%(author)s wrote this function" + + # note that some_function.__doc__ is now "Jason wrote this function" + + One can also use positional arguments. + + sub_first_last_names = Substitution('Edgar Allen', 'Poe') + + @sub_first_last_names + def some_function(x): + "%s %s wrote the Raven" + """ + def __init__(self, *args, **kwargs): + assert not (args and kwargs), "Only positional or keyword args are allowed" + self.params = args or kwargs + + def __call__(self, func): + func.__doc__ = func.__doc__ and func.__doc__ % self.params + return func + + def update(self, *args, **kwargs): + "Assume self.params is a dict and update it with supplied args" + self.params.update(*args, **kwargs) + + @classmethod + def from_params(cls, params): + """ + In the case where the params is a mutable sequence (list or dictionary) + and it may change before this class is called, one may explicitly use + a reference to the params rather than using *args or **kwargs which will + copy the values and not reference them. + """ + result = cls() + result.params = params + return result + +class Appender(object): + """ + A function decorator that will append an addendum to the docstring + of the target function. + + This decorator should be robust even if func.__doc__ is None + (for example, if -OO was passed to the interpreter). + + Usage: construct a docstring.Appender with a string to be joined to + the original docstring. An optional 'join' parameter may be supplied + which will be used to join the docstring and addendum. e.g. + + add_copyright = Appender("Copyright (c) 2009", join='\n') + + @add_copyright + def my_dog(has='fleas'): + "This docstring will have a copyright below" + pass + """ + def __init__(self, addendum, join=''): + self.addendum = addendum + self.join = join + + def __call__(self, func): + docitems = [func.__doc__, self.addendum] + func.__doc__ = func.__doc__ and ''.join(docitems) + return func + +def dedent(func): + "Dedent a docstring (if present)" + func.__doc__ = func.__doc__ and cbook.dedent(func.__doc__) + return func + +def copy(source): + "Copy a docstring from another source function (if present)" + def do_copy(target): + if source.__doc__: + target.__doc__ = source.__doc__ + return target + return do_copy + +# create a decorator that will house the various documentation that +# is reused throughout matplotlib +interpd = Substitution() + +def dedent_interpd(func): + """A special case of the interpd that first performs a dedent on + the incoming docstring""" + return interpd(dedent(func)) + +def copy_dedent(source): + """A decorator that will copy the docstring from the source and + then dedent it""" + # note the following is ugly because "Python is not a functional + # language" - GVR. Perhaps one day, functools.compose will exist. + # or perhaps not. + # http://mail.python.org/pipermail/patches/2007-February/021687.html + return lambda target: dedent(copy(source)(target)) diff -Nru matplotlib-0.99.3/lib/matplotlib/figure.py matplotlib-1.0.1/lib/matplotlib/figure.py --- matplotlib-0.99.3/lib/matplotlib/figure.py 2009-09-21 18:56:19.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/figure.py 2010-07-07 01:41:52.000000000 +0000 @@ -16,7 +16,7 @@ import artist from artist import Artist, allow_rasterization from axes import Axes, SubplotBase, subplot_class_factory -from cbook import flatten, allequal, Stack, iterable, dedent +from cbook import flatten, allequal, Stack, iterable, is_string_like import _image import colorbar as cbar from image import FigureImage @@ -31,7 +31,11 @@ from matplotlib.blocking_input import BlockingMouseInput, BlockingKeyMouseInput import matplotlib.cbook as cbook +from matplotlib import docstring +from operator import itemgetter + +docstring.interpd.update(projection_names = get_projection_names()) class SubplotParams: """ @@ -336,12 +340,13 @@ def figimage(self, X, xo=0, yo=0, - alpha=1.0, + alpha=None, norm=None, cmap=None, vmin=None, vmax=None, - origin=None): + origin=None, + **kwargs): """ call signatures:: @@ -375,7 +380,7 @@ None, the min and max of the luminance values will be used. Note if you pass a norm instance, the settings for *vmin* and *vmax* will be ignored. - alpha the alpha blending value, default is 1.0 + alpha the alpha blending value, default is None origin [ 'upper' | 'lower' ] Indicates where the [0,0] index of the array is in the upper left or lower left corner of the axes. Defaults to the rc image.origin value @@ -391,11 +396,14 @@ .. plot:: mpl_examples/pylab_examples/figimage_demo.py + + Additional kwargs are Artist kwargs passed on to + :class:`~matplotlib.image.FigureImage` """ if not self._hold: self.clf() - im = FigureImage(self, cmap, norm, xo, yo, origin) + im = FigureImage(self, cmap, norm, xo, yo, origin, **kwargs) im.set_array(X) im.set_alpha(alpha) if norm is None: @@ -403,11 +411,6 @@ self.images.append(im) return im - def set_figsize_inches(self, *args, **kwargs): - import warnings - warnings.warn('Use set_size_inches instead!', DeprecationWarning) - self.set_size_inches(*args, **kwargs) - def set_size_inches(self, *args, **kwargs): """ set_size_inches(w,h, forward=False) @@ -423,9 +426,6 @@ automatically updated; eg you can resize the figure window from the shell - WARNING: forward=True is broken on all backends except GTK* - and WX* - ACCEPTS: a w,h tuple with w,h in inches """ @@ -554,6 +554,7 @@ key = fixlist(args), fixitems(kwargs.items()) return key + @docstring.dedent_interpd def add_axes(self, *args, **kwargs): """ Add an a axes with axes rect [*left*, *bottom*, *width*, @@ -563,7 +564,7 @@ sets the projection type of the axes. (For backward compatibility, ``polar=True`` may also be provided, which is equivalent to ``projection='polar'``). Valid values for - *projection* are: %(list)s. Some of these projections support + *projection* are: %(projection_names)s. Some of these projections support additional kwargs, which may be provided to :meth:`add_axes`:: rect = l,b,w,h @@ -623,10 +624,7 @@ self._seen[key] = a return a - add_axes.__doc__ = dedent(add_axes.__doc__) % \ - {'list': (", ".join(get_projection_names())), - 'Axes': artist.kwdocd['Axes']} - + @docstring.dedent_interpd def add_subplot(self, *args, **kwargs): """ Add a subplot. Examples: @@ -641,7 +639,7 @@ *projection*, which chooses a projection type for the axes. (For backward compatibility, *polar=True* may also be provided, which is equivalent to *projection='polar'*). Valid - values for *projection* are: %(list)s. Some of these projections + values for *projection* are: %(projection_names)s. Some of these projections support additional *kwargs*, which may be provided to :meth:`add_axes`. @@ -692,13 +690,13 @@ self._axstack.push(a) self.sca(a) return a - add_subplot.__doc__ = dedent(add_subplot.__doc__) % { - 'list': ", ".join(get_projection_names()), - 'Axes': artist.kwdocd['Axes']} - def clf(self): + def clf(self, keep_observers=False): """ - Clear the figure + Clear the figure. + + Set *keep_observers* to True if, for example, + a gui widget is tracking the axes in the figure. """ self.suppressComposite = None self.callbacks = cbook.CallbackRegistry(('dpi_changed', )) @@ -718,7 +716,8 @@ self.texts=[] self.images = [] self.legends = [] - self._axobservers = [] + if not keep_observers: + self._axobservers = [] def clear(self): """ @@ -738,20 +737,28 @@ if self.frameon: self.patch.draw(renderer) - # todo: respect zorder - for p in self.patches: p.draw(renderer) - for l in self.lines: l.draw(renderer) - for a in self.artists: a.draw(renderer) + # a list of (zorder, func_to_call, list_of_args) + dsu = [] + + for a in self.patches: + dsu.append( (a.get_zorder(), a.draw, [renderer])) + + for a in self.lines: + dsu.append( (a.get_zorder(), a.draw, [renderer])) + + for a in self.artists: + dsu.append( (a.get_zorder(), a.draw, [renderer])) # override the renderer default if self.suppressComposite # is not None - composite = renderer.option_image_nocomposite() + not_composite = renderer.option_image_nocomposite() if self.suppressComposite is not None: - composite = self.suppressComposite + not_composite = self.suppressComposite - if len(self.images)<=1 or composite or not allequal([im.origin for im in self.images]): - for im in self.images: - im.draw(renderer) + if len(self.images)<=1 or not_composite or \ + not allequal([im.origin for im in self.images]): + for a in self.images: + dsu.append( (a.get_zorder(), a.draw, [renderer])) else: # make a composite image blending alpha # list of (_image.Image, ox, oy) @@ -765,18 +772,30 @@ im.is_grayscale = False l, b, w, h = self.bbox.bounds - clippath, affine = self.get_transformed_clip_path_and_affine() - renderer.draw_image(l, b, im, self.bbox, - clippath, affine) + + def draw_composite(): + gc = renderer.new_gc() + gc.set_clip_rectangle(self.bbox) + gc.set_clip_path(self.get_clip_path()) + renderer.draw_image(gc, l, b, im) + gc.restore() + + dsu.append((self.images[0].get_zorder(), draw_composite, [])) # render the axes - for a in self.axes: a.draw(renderer) + for a in self.axes: + dsu.append( (a.get_zorder(), a.draw, [renderer])) # render the figure text - for t in self.texts: t.draw(renderer) + for a in self.texts: + dsu.append( (a.get_zorder(), a.draw, [renderer])) - for legend in self.legends: - legend.draw(renderer) + for a in self.legends: + dsu.append( (a.get_zorder(), a.draw, [renderer])) + + dsu.sort(key=itemgetter(0)) + for zorder, func, args in dsu: + func(*args) renderer.close_group('figure') @@ -889,6 +908,7 @@ self.legends.append(l) return l + @docstring.dedent_interpd def text(self, x, y, s, *args, **kwargs): """ Call signature:: @@ -913,13 +933,13 @@ self._set_artist_props(t) self.texts.append(t) return t - text.__doc__ = dedent(text.__doc__) % artist.kwdocd def _set_artist_props(self, a): if a!= self: a.set_figure(self) a.set_transform(self.transFigure) + @docstring.dedent_interpd def gca(self, **kwargs): """ Return the current axes, creating one if necessary @@ -943,7 +963,6 @@ if isinstance(ax, projection_class): return ax return self.add_subplot(111, **kwargs) - gca.__doc__ = dedent(gca.__doc__) % artist.kwdocd def sca(self, a): 'Set the current axes to be a and return a' @@ -951,6 +970,17 @@ for func in self._axobservers: func(self) return a + def _gci(self): + """ + helper for :func:`~matplotlib.pyplot.gci`; + do not use elsewhere. + """ + for ax in reversed(self._axstack): + im = ax._gci() + if im is not None: + return im + return None + def add_axobserver(self, func): 'whenever the axes state change, func(self) will be called' self._axobservers.append(func) @@ -962,7 +992,7 @@ savefig(fname, dpi=None, facecolor='w', edgecolor='w', orientation='portrait', papertype=None, format=None, - transparent=False): + transparent=False, bbox_inches=None, pad_inches=0.1): Save the current figure. @@ -971,10 +1001,18 @@ Arguments: *fname*: - A string containing a path to a filename, or a Python file-like object. + A string containing a path to a filename, or a Python file-like object, + or possibly some backend-dependent object such as + :class:`~matplotlib.backends.backend_pdf.PdfPages`. If *format* is *None* and *fname* is a string, the output - format is deduced from the extension of the filename. + format is deduced from the extension of the filename. If + the filename has no extension, the value of the rc parameter + ``savefig.extension`` is used. If that value is 'auto', + the backend determines the extension. + + If *fname* is not a string, remember to specify *format* to + ensure that the correct backend is used. Keyword arguments: @@ -998,8 +1036,10 @@ backend. Most backends support png, pdf, ps, eps and svg. *transparent*: - If *True*, the figure patch and axes patches will all be - transparent. This is useful, for example, for displaying + If *True*, the axes patches will all be transparent; the + figure patch will also be transparent unless facecolor + and/or edgecolor are specified via kwargs. + This is useful, for example, for displaying a plot on top of a colored background on a web page. The transparency of these patches will be restored to their original values upon exit of this function. @@ -1013,30 +1053,49 @@ Amount of padding around the figure when bbox_inches is 'tight'. + *bbox_extra_artists*: + A list of extra artists that will be considered when the + tight bbox is calculated. + """ - for key in ('dpi', 'facecolor', 'edgecolor'): - if key not in kwargs: - kwargs[key] = rcParams['savefig.%s'%key] + kwargs.setdefault('dpi', rcParams['savefig.dpi']) + + extension = rcParams['savefig.extension'] + if args and is_string_like(args[0]) and '.' not in args[0] and extension != 'auto': + fname = args[0] + '.' + extension + args = (fname,) + args[1:] transparent = kwargs.pop('transparent', False) if transparent: - original_figure_alpha = self.patch.get_alpha() - self.patch.set_alpha(0.0) - original_axes_alpha = [] + kwargs.setdefault('facecolor', 'none') + kwargs.setdefault('edgecolor', 'none') + original_axes_colors = [] for ax in self.axes: patch = ax.patch - original_axes_alpha.append(patch.get_alpha()) - patch.set_alpha(0.0) + original_axes_colors.append((patch.get_facecolor(), + patch.get_edgecolor())) + patch.set_facecolor('none') + patch.set_edgecolor('none') + else: + kwargs.setdefault('facecolor', rcParams['savefig.facecolor']) + kwargs.setdefault('edgecolor', rcParams['savefig.edgecolor']) self.canvas.print_figure(*args, **kwargs) if transparent: - self.patch.set_alpha(original_figure_alpha) - for ax, alpha in zip(self.axes, original_axes_alpha): - ax.patch.set_alpha(alpha) + for ax, cc in zip(self.axes, original_axes_colors): + ax.patch.set_facecolor(cc[0]) + ax.patch.set_edgecolor(cc[1]) + @docstring.dedent_interpd def colorbar(self, mappable, cax=None, ax=None, **kw): + """ + Create a colorbar for a ScalarMappable instance. + + Documentation for the pylab thin wrapper: + %(colorbar_doc)s + """ if ax is None: ax = self.gca() if cax is None: @@ -1048,19 +1107,12 @@ #print 'calling on changed', m.get_cmap().name cb.set_cmap(m.get_cmap()) cb.set_clim(m.get_clim()) - cb.update_bruteforce(m) + cb.update_normal(m) self.cbid = mappable.callbacksSM.connect('changed', on_changed) mappable.set_colorbar(cb, cax) self.sca(ax) return cb - colorbar.__doc__ = ''' - Create a colorbar for a ScalarMappable instance. - - Documentation for the pylab thin wrapper: - %s - - '''% cbar.colorbar_doc def subplots_adjust(self, *args, **kwargs): """ @@ -1228,4 +1280,4 @@ newsize = np.clip(newsize,figsize_min,figsize_max) return newsize -artist.kwdocd['Figure'] = artist.kwdoc(Figure) +docstring.interpd.update(Figure=artist.kwdoc(Figure)) diff -Nru matplotlib-0.99.3/lib/matplotlib/finance.py matplotlib-1.0.1/lib/matplotlib/finance.py --- matplotlib-0.99.3/lib/matplotlib/finance.py 2010-03-09 14:20:20.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/finance.py 2011-01-05 15:59:56.000000000 +0000 @@ -4,94 +4,141 @@ """ #from __future__ import division -import os, time, warnings +import os, warnings from urllib2 import urlopen try: from hashlib import md5 except ImportError: from md5 import md5 #Deprecated in 2.5 - -try: import datetime -except ImportError: - raise ImportError('The finance module requires datetime support (python2.3)') +import datetime import numpy as np from matplotlib import verbose, get_configdir -from dates import date2num -from matplotlib.cbook import Bunch +from matplotlib.dates import date2num +from matplotlib.cbook import iterable from matplotlib.collections import LineCollection, PolyCollection from matplotlib.colors import colorConverter -from lines import Line2D, TICKLEFT, TICKRIGHT -from patches import Rectangle +from matplotlib.lines import Line2D, TICKLEFT, TICKRIGHT +from matplotlib.patches import Rectangle from matplotlib.transforms import Affine2D - configdir = get_configdir() cachedir = os.path.join(configdir, 'finance.cache') -def parse_yahoo_historical(fh, asobject=False, adjusted=True): +stock_dt = np.dtype([('date', object), + ('year', np.int16), + ('month', np.int8), + ('day', np.int8), + ('d', np.float), # mpl datenum + ('open', np.float), + ('close', np.float), + ('high', np.float), + ('low', np.float), + ('volume', np.float), + ('aclose', np.float)]) + + +def parse_yahoo_historical(fh, adjusted=True, asobject=False): """ - Parse the historical data in file handle fh from yahoo finance and return - results as a list of + Parse the historical data in file handle fh from yahoo finance. + + *adjusted* + If True (default) replace open, close, high, and low prices with + their adjusted values. The adjustment is by a scale factor, S = + adjusted_close/close. Adjusted prices are actual prices + multiplied by S. + + Volume is not adjusted as it is already backward split adjusted + by Yahoo. If you want to compute dollars traded, multiply volume + by the adjusted close, regardless of whether you choose adjusted + = True|False. + - d, open, close, high, low, volume + *asobject* + If False (default for compatibility with earlier versions) + return a list of tuples containing - where d is a floating poing representation of date, as returned by date2num + d, open, close, high, low, volume + + If None (preferred alternative to False), return + a 2-D ndarray corresponding to the list of tuples. + + Otherwise return a numpy recarray with + + date, year, month, day, d, open, close, high, low, + volume, adjusted_close + + where d is a floating poing representation of date, + as returned by date2num, and date is a python standard + library datetime.date instance. + + The name of this kwarg is a historical artifact. Formerly, + True returned a cbook Bunch + holding 1-D ndarrays. The behavior of a numpy recarray is + very similar to the Bunch. - if adjust=True, use adjusted prices """ - results = [] lines = fh.readlines() - datefmt = None + results = [] + + datefmt = '%Y-%m-%d' for line in lines[1:]: vals = line.split(',') - - if len(vals)!=7: continue + if len(vals)!=7: + continue # add warning? datestr = vals[0] - if datefmt is None: - try: - datefmt = '%Y-%m-%d' - dt = datetime.date(*time.strptime(datestr, datefmt)[:3]) - except ValueError: - datefmt = '%d-%b-%y' # Old Yahoo--cached file? - dt = datetime.date(*time.strptime(datestr, datefmt)[:3]) - d = date2num(dt) + #dt = datetime.date(*time.strptime(datestr, datefmt)[:3]) + # Using strptime doubles the runtime. With the present + # format, we don't need it. + dt = datetime.date(*[int(val) for val in datestr.split('-')]) + dnum = date2num(dt) open, high, low, close = [float(val) for val in vals[1:5]] - volume = int(vals[5]) - if adjusted: - aclose = float(vals[6]) - m = aclose/close - open *= m - high *= m - low *= m - close = aclose + volume = float(vals[5]) + aclose = float(vals[6]) - results.append((d, open, close, high, low, volume)) + results.append((dt, dt.year, dt.month, dt.day, + dnum, open, close, high, low, volume, aclose)) results.reverse() - if asobject: - if len(results)==0: return None - else: - date, open, close, high, low, volume = map(np.asarray, zip(*results)) - return Bunch(date=date, open=open, close=close, high=high, low=low, volume=volume) - else: + d = np.array(results, dtype=stock_dt) + if adjusted: + scale = d['aclose'] / d['close'] + scale[np.isinf(scale)] = np.nan + d['open'] *= scale + d['close'] *= scale + d['high'] *= scale + d['low'] *= scale + + if not asobject: + # 2-D sequence; formerly list of tuples, now ndarray + ret = np.zeros((len(d), 6), dtype=np.float) + ret[:,0] = d['d'] + ret[:,1] = d['open'] + ret[:,2] = d['close'] + ret[:,3] = d['high'] + ret[:,4] = d['low'] + ret[:,5] = d['volume'] + if asobject is None: + return ret + return [tuple(row) for row in ret] + + return d.view(np.recarray) # Close enough to former Bunch return - return results def fetch_historical_yahoo(ticker, date1, date2, cachename=None): """ Fetch historical data for ticker between date1 and date2. date1 and - date2 are datetime instances + date2 are date or datetime instances, or (year, month, day) sequences. Ex: - fh = fetch_historical_yahoo('^GSPC', d1, d2) + fh = fetch_historical_yahoo('^GSPC', (2000, 1, 1), (2001, 12, 31)) cachename is the name of the local file cache. If None, will default to the md5 hash or the url (which incorporates the ticker @@ -103,8 +150,14 @@ ticker = ticker.upper() - d1 = (date1.month-1, date1.day, date1.year) - d2 = (date2.month-1, date2.day, date2.year) + if iterable(date1): + d1 = (date1[1]-1, date1[2], date1[0]) + else: + d1 = (date1.month-1, date1.day, date1.year) + if iterable(date2): + d2 = (date2[1]-1, date2[2], date2[0]) + else: + d2 = (date2.month-1, date2.day, date2.year) urlFmt = 'http://table.finance.yahoo.com/table.csv?a=%d&b=%d&c=%d&d=%d&e=%d&f=%d&s=%s&y=0&g=d&ignore=.csv' @@ -120,7 +173,8 @@ fh = file(cachename) verbose.report('Using cachefile %s for %s'%(cachename, ticker)) else: - if not os.path.isdir(cachedir): os.mkdir(cachedir) + if not os.path.isdir(cachedir): + os.mkdir(cachedir) urlfh = urlopen(url) fh = file(cachename, 'w') @@ -132,24 +186,18 @@ return fh -def quotes_historical_yahoo(ticker, date1, date2, asobject=False, adjusted=True, cachename=None): +def quotes_historical_yahoo(ticker, date1, date2, asobject=False, + adjusted=True, cachename=None): """ Get historical data for ticker between date1 and date2. date1 and - date2 are datetime instances - - results are a list of tuples - - (d, open, close, high, low, volume) - - where d is a floating poing representation of date, as returned by date2num + date2 are datetime instances or (year, month, day) sequences. - if asobject is True, the return val is an object with attrs date, - open, close, high, low, volume, which are equal length arrays - - if adjust=True, use adjusted prices + See :func:`parse_yahoo_historical` for explanation of output formats + and the *asobject* and *adjusted* kwargs. Ex: - sp = f.quotes_historical_yahoo('^GSPC', d1, d2, asobject=True, adjusted=True) + sp = f.quotes_historical_yahoo('^GSPC', d1, d2, + asobject=True, adjusted=True) returns = (sp.open[1:] - sp.open[:-1])/sp.open[1:] [n,bins,patches] = hist(returns, 100) mu = mean(returns) @@ -161,12 +209,20 @@ default to the md5 hash or the url (which incorporates the ticker and date range) """ + # Maybe enable a warning later as part of a slow transition + # to using None instead of False. + #if asobject is False: + # warnings.warn("Recommend changing to asobject=None") fh = fetch_historical_yahoo(ticker, date1, date2, cachename) - try: ret = parse_yahoo_historical(fh, asobject, adjusted) + try: + ret = parse_yahoo_historical(fh, asobject=asobject, + adjusted=adjusted) + if len(ret) == 0: + return None except IOError, exc: - warnings.warn('urlopen() failure\n' + url + '\n' + exc.strerror[1]) + warnings.warn('fh failure\n%s'%(exc.strerror[1])) return None return ret @@ -175,7 +231,7 @@ colorup='k', colordown='r', ): """ - quotes is a list of (time, open, close, high, low, ...) tuples + quotes is a sequence of (time, open, close, high, low, ...) sequences Represent the time, open, close, high, low as a vertical line ranging from low to high. The left tick is the open and the right @@ -190,9 +246,6 @@ return value is a list of lines added """ - - - lines = [] for q in quotes: @@ -238,9 +291,9 @@ """ - quotes is a list of (time, open, close, high, low, ...) tuples. - As long as the first 5 elements of the tuples are these values, - the tuple can be as long as you want (eg it may store volume). + quotes is a sequence of (time, open, close, high, low, ...) sequences. + As long as the first 5 elements are these values, + the record can be as long as you want (eg it may store volume). time must be in float days format - see date2num @@ -257,12 +310,11 @@ return value is lines, patches where lines is a list of lines added and patches is a list of the rectangle patches added - """ + """ OFFSET = width/2.0 - lines = [] patches = [] for q in quotes: diff -Nru matplotlib-0.99.3/lib/matplotlib/font_manager.py matplotlib-1.0.1/lib/matplotlib/font_manager.py --- matplotlib-0.99.3/lib/matplotlib/font_manager.py 2009-09-21 18:56:19.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/font_manager.py 2010-09-23 19:54:49.000000000 +0000 @@ -42,7 +42,7 @@ see license/LICENSE_TTFQUERY. """ -import os, sys, glob +import os, sys, glob, subprocess, warnings try: set except NameError: @@ -106,6 +106,7 @@ font_family_aliases = set([ 'serif', 'sans-serif', + 'sans serif', 'cursive', 'fantasy', 'monospace', @@ -292,16 +293,17 @@ grab all of the fonts the user wants to be made available to applications, without needing knowing where all of them reside. """ - try: - import commands - except ImportError: - return {} - fontext = get_fontext_synonyms(fontext) fontfiles = {} - status, output = commands.getstatusoutput("fc-list file") - if status == 0: + try: + pipe = subprocess.Popen(['fc-list', '', 'file'], stdout=subprocess.PIPE) + output = pipe.communicate()[0] + except OSError: + # Calling fc-list did not work, so we'll just return nothing + return fontfiles + + if pipe.returncode == 0: for line in output.split('\n'): fname = line.split(':')[0] if (os.path.splitext(fname)[1][1:] in fontext and @@ -396,6 +398,11 @@ except ValueError: self.size = size + def __repr__(self): + return "" % ( + self.name, os.path.basename(self.fname), self.style, self.variant, + self.weight, self.stretch) + def ttfFontProperty(font): """ @@ -462,8 +469,7 @@ # Relative stretches are: wider, narrower # Child value is: inherit - # !!!! Incomplete - if sfnt4.find('narrow') >= 0 or sfnt4.find('condensed') >= 0 or \ + if sfnt4.find('narrow') >= 0 or sfnt4.find('condensed') >= 0 or \ sfnt4.find('cond') >= 0: stretch = 'condensed' elif sfnt4.find('demi cond') >= 0: @@ -501,6 +507,7 @@ """ name = font.get_familyname() + fontname = font.get_fontname().lower() # Styles are: italic, oblique, and normal (default) @@ -531,9 +538,15 @@ # and ultra-expanded. # Relative stretches are: wider, narrower # Child value is: inherit - - # !!!! Incomplete - stretch = 'normal' + if fontname.find('narrow') >= 0 or fontname.find('condensed') >= 0 or \ + fontname.find('cond') >= 0: + stretch = 'condensed' + elif fontname.find('demi cond') >= 0: + stretch = 'semi-condensed' + elif fontname.find('wide') >= 0 or fontname.find('expanded') >= 0: + stretch = 'expanded' + else: + stretch = 'normal' # Sizes can be absolute and relative. # Absolute sizes are: xx-small, x-small, small, medium, large, x-large, @@ -642,8 +655,7 @@ The preferred usage of font sizes is to use the relative values, e.g. 'large', instead of absolute font sizes, e.g. 12. This approach allows all text sizes to be made larger or smaller based - on the font manager's default font size, i.e. by using the - :meth:`FontManager.set_default_size` method. + on the font manager's default font size. This class will also accept a `fontconfig `_ pattern, if it is the only argument @@ -960,12 +972,20 @@ matches the specification. If no good enough match is found, a default font is returned. """ + # Increment this version number whenever the font cache data + # format or behavior has changed and requires a existing font + # cache files to be rebuilt. + __version__ = 7 + def __init__(self, size=None, weight='normal'): + self._version = self.__version__ + self.__default_weight = weight self.default_size = size paths = [os.path.join(rcParams['datapath'], 'fonts', 'ttf'), - os.path.join(rcParams['datapath'], 'fonts', 'afm')] + os.path.join(rcParams['datapath'], 'fonts', 'afm'), + os.path.join(rcParams['datapath'], 'fonts', 'pdfcorefonts')] # Create list of font paths for pathname in ['TTFPATH', 'AFMPATH']: @@ -982,32 +1002,26 @@ # Load TrueType fonts and create font dictionary. self.ttffiles = findSystemFonts(paths) + findSystemFonts() + self.defaultFamily = { + 'ttf': 'Bitstream Vera Sans', + 'afm': 'Helvetica'} + self.defaultFont = {} for fname in self.ttffiles: verbose.report('trying fontname %s' % fname, 'debug') if fname.lower().find('vera.ttf')>=0: - self.defaultFont = fname + self.defaultFont['ttf'] = fname break else: # use anything - self.defaultFont = self.ttffiles[0] + self.defaultFont['ttf'] = self.ttffiles[0] self.ttflist = createFontList(self.ttffiles) - if rcParams['pdf.use14corefonts']: - # Load only the 14 PDF core fonts. These fonts do not need to be - # embedded; every PDF viewing application is required to have them: - # Helvetica, Helvetica-Bold, Helvetica-Oblique, Helvetica-BoldOblique, - # Courier, Courier-Bold, Courier-Oblique, Courier-BoldOblique, - # Times-Roman, Times-Bold, Times-Italic, Times-BoldItalic, Symbol, - # ZapfDingbats. - afmpath = os.path.join(rcParams['datapath'],'fonts','pdfcorefonts') - afmfiles = findSystemFonts(afmpath, fontext='afm') - self.afmlist = createFontList(afmfiles, fontext='afm') - else: - self.afmfiles = findSystemFonts(paths, fontext='afm') + \ - findSystemFonts(fontext='afm') - self.afmlist = createFontList(self.afmfiles, fontext='afm') + self.afmfiles = findSystemFonts(paths, fontext='afm') + \ + findSystemFonts(fontext='afm') + self.afmlist = createFontList(self.afmfiles, fontext='afm') + self.defaultFont['afm'] = None self.ttf_lookup_cache = {} self.afm_lookup_cache = {} @@ -1022,9 +1036,7 @@ """ Return the default font size. """ - if self.default_size is None: - return rcParams['font.size'] - return self.default_size + return rcParams['font.size'] def set_default_weight(self, weight): """ @@ -1032,13 +1044,6 @@ """ self.__default_weight = weight - def set_default_size(self, size): - """ - Set the default font size in points. The initial value is set - by ``font.size`` in rc. - """ - self.default_size = size - def update_fonts(self, filenames): """ Update the font dictionary with new font files. @@ -1060,15 +1065,18 @@ No match will return 1.0. """ + family2 = family2.lower() for i, family1 in enumerate(families): - if family1.lower() in font_family_aliases: - if family1 == 'sans': - family1 == 'sans-serif' + family1 = family1.lower() + if family1 in font_family_aliases: + if family1 in ('sans', 'sans serif'): + family1 = 'sans-serif' options = rcParams['font.' + family1] + options = [x.lower() for x in options] if family2 in options: idx = options.index(family2) return 0.1 * (float(idx) / len(options)) - elif family1.lower() == family2.lower(): + elif family1 == family2: return 0.0 return 1.0 @@ -1160,7 +1168,8 @@ return 1.0 return abs(sizeval1 - sizeval2) / 72.0 - def findfont(self, prop, fontext='ttf'): + def findfont(self, prop, fontext='ttf', directory=None, + fallback_to_default=True, rebuild_if_missing=True): """ Search the font list for the font that most closely matches the :class:`FontProperties` *prop*. @@ -1171,17 +1180,21 @@ returned. If no matches below a certain threshold are found, the default font (usually Vera Sans) is returned. + `directory`, is specified, will only return fonts from the + given directory (or subdirectory of that directory). + The result is cached, so subsequent lookups don't have to perform the O(n) nearest neighbor search. + If `fallback_to_default` is True, will fallback to the default + font family (usually "Bitstream Vera Sans" or "Helvetica") if + the first lookup hard-fails. + See the `W3C Cascading Style Sheet, Level 1 `_ documentation for a description of the font finding algorithm. """ - debug = False - if prop is None: - prop = FontProperties() - if is_string_like(prop): + if not isinstance(prop, FontProperties): prop = FontProperties(prop) fname = prop.get_file() if fname is not None: @@ -1195,14 +1208,18 @@ font_cache = self.ttf_lookup_cache fontlist = self.ttflist - cached = font_cache.get(hash(prop)) - if cached: - return cached + if directory is None: + cached = font_cache.get(hash(prop)) + if cached: + return cached best_score = 1e64 best_font = None for font in fontlist: + if (directory is not None and + os.path.commonprefix([font.fname, directory]) != directory): + continue # Matching family should have highest priority, so it is multiplied # by 10.0 score = \ @@ -1219,15 +1236,39 @@ break if best_font is None or best_score >= 10.0: - verbose.report('findfont: Could not match %s. Returning %s' % - (prop, self.defaultFont)) - result = self.defaultFont + if fallback_to_default: + warnings.warn( + 'findfont: Font family %s not found. Falling back to %s' % + (prop.get_family(), self.defaultFamily[fontext])) + default_prop = prop.copy() + default_prop.set_family(self.defaultFamily[fontext]) + return self.findfont(default_prop, fontext, directory, False) + else: + # This is a hard fail -- we can't find anything reasonable, + # so just return the vera.ttf + warnings.warn( + 'findfont: Could not match %s. Returning %s' % + (prop, self.defaultFont[fontext]), + UserWarning) + result = self.defaultFont[fontext] else: - verbose.report('findfont: Matching %s to %s (%s) with score of %f' % - (prop, best_font.name, best_font.fname, best_score)) + verbose.report( + 'findfont: Matching %s to %s (%s) with score of %f' % + (prop, best_font.name, best_font.fname, best_score)) result = best_font.fname - font_cache[hash(prop)] = result + if not os.path.isfile(result): + if rebuild_if_missing: + verbose.report( + 'findfont: Found a missing font file. Rebuilding cache.') + _rebuild() + return fontManager.findfont( + prop, fontext, directory, True, False) + else: + raise ValueError("No valid font could be found") + + if directory is None: + font_cache[hash(prop)] = result return result @@ -1249,16 +1290,29 @@ return result return False +fontManager = None + +_fmcache = os.path.join(get_configdir(), 'fontList.cache') + +def _rebuild(): + global fontManager + fontManager = FontManager() + pickle_dump(fontManager, _fmcache) + verbose.report("generated new fontManager") + # The experimental fontconfig-based backend. if USE_FONTCONFIG and sys.platform != 'win32': import re def fc_match(pattern, fontext): - import commands fontexts = get_fontext_synonyms(fontext) ext = "." + fontext - status, output = commands.getstatusoutput('fc-match -sv "%s"' % pattern) - if status == 0: + try: + pipe = subprocess.Popen(['fc-match', '-sv', pattern], stdout=subprocess.PIPE) + output = pipe.communicate()[0] + except OSError: + return None + if pipe.returncode == 0: for match in _fc_match_regex.finditer(output): file = match.group(1) if os.path.splitext(file)[1][1:] in fontexts: @@ -1283,28 +1337,18 @@ return result else: - _fmcache = os.path.join(get_configdir(), 'fontList.cache') - - fontManager = None - - def _rebuild(): - global fontManager - fontManager = FontManager() - pickle_dump(fontManager, _fmcache) - verbose.report("generated new fontManager") - try: fontManager = pickle_load(_fmcache) - fontManager.default_size = None - verbose.report("Using fontManager instance from %s" % _fmcache) + if (not hasattr(fontManager, '_version') or + fontManager._version != FontManager.__version__): + _rebuild() + else: + fontManager.default_size = None + verbose.report("Using fontManager instance from %s" % _fmcache) except: _rebuild() def findfont(prop, **kw): global fontManager font = fontManager.findfont(prop, **kw) - if not os.path.exists(font): - verbose.report("%s returned by pickled fontManager does not exist" % font) - _rebuild() - font = fontManager.findfont(prop, **kw) return font diff -Nru matplotlib-0.99.3/lib/matplotlib/gridspec.py matplotlib-1.0.1/lib/matplotlib/gridspec.py --- matplotlib-0.99.3/lib/matplotlib/gridspec.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/gridspec.py 2010-09-23 19:54:49.000000000 +0000 @@ -0,0 +1,397 @@ +""" +:mod:`~matplotlib.gridspec` is a module which specifies the location +of the subplot in the figure. + + ``GridSpec`` + specifies the geometry of the grid that a subplot will be + placed. The number of rows and number of columns of the grid + need to be set. Optionally, the subplot layout parameters + (e.g., left, right, etc.) can be tuned. + + ``SubplotSpec`` + specifies the location of the subplot in the given *GridSpec*. + + +""" + +from __future__ import division + +import matplotlib +rcParams = matplotlib.rcParams + +import matplotlib.transforms as mtransforms + +import numpy as np + +class GridSpecBase(object): + """ + A base class of GridSpec that specifies the geometry of the grid + that a subplot will be placed. + """ + + def __init__(self, nrows, ncols, + height_ratios=None, width_ratios=None): + """ + The number of rows and number of columns of the grid need to + be set. Optionally, the ratio of heights and widths of ros and + columns can be specified. + """ + #self.figure = figure + self._nrows , self._ncols = nrows, ncols + + self.set_height_ratios(height_ratios) + self.set_width_ratios(width_ratios) + + def get_geometry(self): + 'get the geometry of the grid, eg 2,3' + return self._nrows, self._ncols + + def get_subplot_params(self, fig=None): + pass + + def new_subplotspec(self, loc, rowspan=1, colspan=1): + """ + create and return a SuplotSpec instance. + """ + loc1, loc2 = loc + subplotspec = self[loc1:loc1+rowspan, loc2:loc2+colspan] + return subplotspec + + + def set_width_ratios(self, width_ratios): + self._col_width_ratios = width_ratios + + def get_width_ratios(self): + return self._col_width_ratios + + def set_height_ratios(self, height_ratios): + self._row_height_ratios = height_ratios + + def get_height_ratios(self): + return self._row_height_ratios + + + def get_grid_positions(self, fig): + """ + return lists of bottom and top position of rows, left and + right positions of columns. + """ + nrows, ncols = self.get_geometry() + + subplot_params = self.get_subplot_params(fig) + left = subplot_params.left + right = subplot_params.right + bottom = subplot_params.bottom + top = subplot_params.top + wspace = subplot_params.wspace + hspace = subplot_params.hspace + totWidth = right-left + totHeight = top-bottom + + # calculate accumulated heights of columns + cellH = totHeight/(nrows + hspace*(nrows-1)) + sepH = hspace*cellH + + if self._row_height_ratios is not None: + netHeight = cellH * nrows + tr = float(sum(self._row_height_ratios)) + cellHeights = [netHeight*r/tr for r in self._row_height_ratios] + else: + cellHeights = [cellH] * nrows + + sepHeights = [0] + ([sepH] * (nrows-1)) + cellHs = np.add.accumulate(np.ravel(zip(sepHeights, cellHeights))) + + + # calculate accumulated widths of rows + cellW = totWidth/(ncols + wspace*(ncols-1)) + sepW = wspace*cellW + + if self._col_width_ratios is not None: + netWidth = cellW * ncols + tr = float(sum(self._col_width_ratios)) + cellWidths = [netWidth*r/tr for r in self._col_width_ratios] + else: + cellWidths = [cellW] * ncols + + sepWidths = [0] + ([sepW] * (ncols-1)) + cellWs = np.add.accumulate(np.ravel(zip(sepWidths, cellWidths))) + + + + figTops = [top - cellHs[2*rowNum] for rowNum in range(nrows)] + figBottoms = [top - cellHs[2*rowNum+1] for rowNum in range(nrows)] + figLefts = [left + cellWs[2*colNum] for colNum in range(ncols)] + figRights = [left + cellWs[2*colNum+1] for colNum in range(ncols)] + + + return figBottoms, figTops, figLefts, figRights + + + def __getitem__(self, key): + """ + create and return a SuplotSpec instance. + """ + nrows, ncols = self.get_geometry() + total = nrows*ncols + + if isinstance(key, tuple): + try: + k1, k2 = key + except ValueError: + raise ValueError("unrecognized subplot spec") + + if isinstance(k1, slice): + row1, row2, _ = k1.indices(nrows) + else: + if k1 < 0: + k1 += nrows + row1, row2 = k1, k1+1 + + + if isinstance(k2, slice): + col1, col2, _ = k2.indices(ncols) + else: + if k2 < 0: + k2 += ncols + col1, col2 = k2, k2+1 + + + num1 = row1*ncols + col1 + num2 = (row2-1)*ncols + (col2-1) + + # single key + else: + if isinstance(key, slice): + num1, num2, _ = key.indices(total) + num2 -= 1 + else: + if key < 0: + key += total + num1, num2 = key, None + + + return SubplotSpec(self, num1, num2) + + +class GridSpec(GridSpecBase): + """ + A class that specifies the geometry of the grid that a subplot + will be placed. The location of grid is determined by similar way + as the SubplotParams. + """ + + def __init__(self, nrows, ncols, + left=None, bottom=None, right=None, top=None, + wspace=None, hspace=None, + width_ratios=None, height_ratios=None): + """ + The number of rows and number of columns of the + grid need to be set. Optionally, the subplot layout parameters + (e.g., left, right, etc.) can be tuned. + """ + #self.figure = figure + self.left=left + self.bottom=bottom + self.right=right + self.top=top + self.wspace=wspace + self.hspace=hspace + + GridSpecBase.__init__(self, nrows, ncols, + width_ratios=width_ratios, + height_ratios=height_ratios) + #self.set_width_ratios(width_ratios) + #self.set_height_ratios(height_ratios) + + + _AllowedKeys = ["left", "bottom", "right", "top", "wspace", "hspace"] + + def update(self, **kwargs): + """ + Update the current values. If any kwarg is None, default to + the current value, if set, otherwise to rc. + """ + + for k, v in kwargs.items(): + if k in self._AllowedKeys: + setattr(self, k, v) + else: + raise AttributeError("%s is unknown keyword" % (k,)) + + + from matplotlib import _pylab_helpers + from matplotlib.axes import SubplotBase + for figmanager in _pylab_helpers.Gcf.figs.values(): + for ax in figmanager.canvas.figure.axes: + # copied from Figure.subplots_adjust + if not isinstance(ax, SubplotBase): + # Check if sharing a subplots axis + if ax._sharex is not None and isinstance(ax._sharex, SubplotBase): + ax._sharex.update_params() + ax.set_position(ax._sharex.figbox) + elif ax._sharey is not None and isinstance(ax._sharey,SubplotBase): + ax._sharey.update_params() + ax.set_position(ax._sharey.figbox) + else: + ax.update_params() + ax.set_position(ax.figbox) + + + + def get_subplot_params(self, fig=None): + """ + return a dictionary of subplot layout parameters. The default + parameters are from rcParams unless a figure attribute is set. + """ + from matplotlib.figure import SubplotParams + import copy + if fig is None: + kw = dict([(k, rcParams["figure.subplot."+k]) \ + for k in self._AllowedKeys]) + subplotpars = SubplotParams(**kw) + else: + subplotpars = copy.copy(fig.subplotpars) + + update_kw = dict([(k, getattr(self, k)) for k in self._AllowedKeys]) + subplotpars.update(**update_kw) + + return subplotpars + + +class GridSpecFromSubplotSpec(GridSpecBase): + """ + GridSpec whose subplot layout parameters are inherited from the + location specified by a given SubplotSpec. + """ + def __init__(self, nrows, ncols, + subplot_spec, + wspace=None, hspace=None, + height_ratios=None, width_ratios=None): + """ + The number of rows and number of columns of the grid need to + be set. An instance of SubplotSpec is also needed to be set + from which the layout parameters will be inheirted. The wspace + and hspace of the layout can be optionally specified or the + default values (from the figure or rcParams) will be used. + """ + self._wspace=wspace + self._hspace=hspace + + self._subplot_spec = subplot_spec + + GridSpecBase.__init__(self, nrows, ncols, + width_ratios=width_ratios, + height_ratios=height_ratios) + + + def get_subplot_params(self, fig=None): + """ + return a dictionary of subplot layout parameters. + """ + + if fig is None: + hspace = rcParams["figure.subplot.hspace"] + wspace = rcParams["figure.subplot.wspace"] + else: + hspace = fig.subplotpars.hspace + wspace = fig.subplotpars.wspace + + if self._hspace is not None: + hspace = self._hspace + + if self._wspace is not None: + wspace = self._wspace + + figbox = self._subplot_spec.get_position(fig, return_all=False) + + left, bottom, right, top = figbox.extents + + from matplotlib.figure import SubplotParams + sp = SubplotParams(left=left, + right=right, + bottom=bottom, + top=top, + wspace=wspace, + hspace=hspace) + + return sp + + + + +class SubplotSpec(object): + """ + specifies the location of the subplot in the given *GridSpec*. + """ + + def __init__(self, gridspec, num1, num2=None): + """ + The subplot will occupy the num1-th cell of the given + gridspec. If num2 is provided, the subplot will span between + num1-th cell and num2-th cell. + + The index stars from 0. + """ + + rows, cols = gridspec.get_geometry() + total = rows*cols + + self._gridspec = gridspec + self.num1 = num1 + self.num2 = num2 + + def get_gridspec(self): + return self._gridspec + + + def get_geometry(self): + """ + get the subplot geometry, eg 2,2,3. Unlike SuplorParams, + index is 0-based + """ + rows, cols = self.get_gridspec().get_geometry() + return rows, cols, self.num1, self.num2 + + + def get_position(self, fig, return_all=False): + """ + update the subplot position from fig.subplotpars + """ + + gridspec = self.get_gridspec() + nrows, ncols = gridspec.get_geometry() + + figBottoms, figTops, figLefts, figRights = \ + gridspec.get_grid_positions(fig) + + + rowNum, colNum = divmod(self.num1, ncols) + figBottom = figBottoms[rowNum] + figTop = figTops[rowNum] + figLeft = figLefts[colNum] + figRight = figRights[colNum] + + if self.num2 is not None: + + rowNum2, colNum2 = divmod(self.num2, ncols) + figBottom2 = figBottoms[rowNum2] + figTop2 = figTops[rowNum2] + figLeft2 = figLefts[colNum2] + figRight2 = figRights[colNum2] + + figBottom = min(figBottom, figBottom2) + figLeft = min(figLeft, figLeft2) + figTop = max(figTop, figTop2) + figRight = max(figRight, figRight2) + + figbox = mtransforms.Bbox.from_extents(figLeft, figBottom, + figRight, figTop) + + + if return_all: + return figbox, rowNum, colNum, nrows, ncols + else: + return figbox + + diff -Nru matplotlib-0.99.3/lib/matplotlib/image.py matplotlib-1.0.1/lib/matplotlib/image.py --- matplotlib-0.99.3/lib/matplotlib/image.py 2009-08-22 21:06:12.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/image.py 2011-01-05 15:59:56.000000000 +0000 @@ -24,8 +24,11 @@ # the image namespace: from matplotlib._image import * -class AxesImage(martist.Artist, cm.ScalarMappable): - zorder = 1 +from matplotlib.transforms import BboxBase, Bbox +import matplotlib.transforms as mtransforms + +class _AxesImageBase(martist.Artist, cm.ScalarMappable): + zorder = 0 # map interpolation strings to module constants _interpd = { 'nearest' : _image.NEAREST, @@ -60,7 +63,6 @@ norm = None, interpolation=None, origin=None, - extent=None, filternorm=1, filterrad=4.0, resample = False, @@ -85,7 +87,6 @@ if origin is None: origin = rcParams['image.origin'] self.origin = origin - self._extent = extent self.set_filternorm(filternorm) self.set_filterrad(filterrad) self._filterrad = filterrad @@ -96,6 +97,12 @@ self._imcache = None + # this is an expetimental attribute, if True, unsampled image + # will be drawn using the affine transform that are + # appropriately skewed so that the given postition + # corresponds to the actual position in the coordinate. -JJL + self._image_skew_coordinate = None + self.update(kwargs) def get_size(self): @@ -124,37 +131,49 @@ self._rgbacache = None cm.ScalarMappable.changed(self) - def make_image(self, magnification=1.0): - if self._A is None: - raise RuntimeError('You must first set the image array or the image attribute') + raise RuntimeError('The make_image method must be overridden.') - xmin, xmax, ymin, ymax = self.get_extent() + + def _get_unsampled_image(self, A, image_extents, viewlim): + """ + convert numpy array A with given extents ([x1, x2, y1, y2] in + data coordinate) into the Image, given the vielim (should be a + bbox instance). Image will be clipped if the extents is + significantly larger than the viewlim. + """ + xmin, xmax, ymin, ymax = image_extents dxintv = xmax-xmin dyintv = ymax-ymin # the viewport scale factor - sx = dxintv/self.axes.viewLim.width - sy = dyintv/self.axes.viewLim.height - numrows, numcols = self._A.shape[:2] + if viewlim.width == 0.0 and dxintv == 0.0: + sx = 1.0 + else: + sx = dxintv/viewlim.width + if viewlim.height == 0.0 and dyintv == 0.0: + sy = 1.0 + else: + sy = dyintv/viewlim.height + numrows, numcols = A.shape[:2] if sx > 2: - x0 = (self.axes.viewLim.x0-xmin)/dxintv * numcols + x0 = (viewlim.x0-xmin)/dxintv * numcols ix0 = max(0, int(x0 - self._filterrad)) - x1 = (self.axes.viewLim.x1-xmin)/dxintv * numcols + x1 = (viewlim.x1-xmin)/dxintv * numcols ix1 = min(numcols, int(x1 + self._filterrad)) xslice = slice(ix0, ix1) xmin_old = xmin xmin = xmin_old + ix0*dxintv/numcols xmax = xmin_old + ix1*dxintv/numcols dxintv = xmax - xmin - sx = dxintv/self.axes.viewLim.width + sx = dxintv/viewlim.width else: xslice = slice(0, numcols) if sy > 2: - y0 = (self.axes.viewLim.y0-ymin)/dyintv * numrows + y0 = (viewlim.y0-ymin)/dyintv * numrows iy0 = max(0, int(y0 - self._filterrad)) - y1 = (self.axes.viewLim.y1-ymin)/dyintv * numrows + y1 = (viewlim.y1-ymin)/dyintv * numrows iy1 = min(numrows, int(y1 + self._filterrad)) if self.origin == 'upper': yslice = slice(numrows-iy1, numrows-iy0) @@ -164,7 +183,7 @@ ymin = ymin_old + iy0*dyintv/numrows ymax = ymin_old + iy1*dyintv/numrows dyintv = ymax - ymin - sy = dyintv/self.axes.viewLim.height + sy = dyintv/viewlim.height else: yslice = slice(0, numrows) @@ -195,6 +214,100 @@ else: im = self._imcache + return im, xmin, ymin, dxintv, dyintv, sx, sy + + + @staticmethod + def _get_rotate_and_skew_transform(x1, y1, x2, y2, x3, y3): + """ + Retuen a transform that does + (x1, y1) -> (x1, y1) + (x2, y2) -> (x2, y2) + (x2, y1) -> (x3, y3) + + It was intended to derive a skew transform that preserve the + lower-left corner (x1, y1) and top-right corner(x2,y2), but + change the the lower-right-corner(x2, y1) to a new position + (x3, y3). + """ + tr1 = mtransforms.Affine2D() + tr1.translate(-x1, -y1) + x2a, y2a = tr1.transform_point((x2, y2)) + x3a, y3a = tr1.transform_point((x3, y3)) + + inv_mat = 1./(x2a*y3a-y2a*x3a) * np.mat([[y3a, -y2a],[-x3a, x2a]]) + + a, b = (inv_mat * np.mat([[x2a], [x2a]])).flat + c, d = (inv_mat * np.mat([[y2a], [0]])).flat + + tr2 = mtransforms.Affine2D.from_values(a, c, b, d, 0, 0) + + tr = (tr1 + tr2 + mtransforms.Affine2D().translate(x1, y1)).inverted().get_affine() + + return tr + + + def _draw_unsampled_image(self, renderer, gc): + """ + draw unsampled image. The renderer should support a draw_image method + with scale parameter. + """ + + + trans = self.get_transform() #axes.transData + + # convert the coordinates to the intermediate coordinate (ic). + # The transformation from the ic to the canvas is a pure + # affine transfor. + + # A straight-forward way is to use the non-affine part of the + # original transform for conversion to the ic. + + # firs, convert the image extent to the ic + x_llc, x_trc, y_llc, y_trc = self.get_extent() + + xy = trans.transform_non_affine(np.array([(x_llc, y_llc), + (x_trc, y_trc)])) + + _xx1, _yy1 = xy[0] + _xx2, _yy2 = xy[1] + + extent_in_ic = _xx1, _xx2, _yy1, _yy2 + + # define trans_ic_to_canvas : unless _image_skew_coordinate is + # set, it is simply a affine part of the original transform. + if self._image_skew_coordinate: + # skew the image when required. + x_lrc, y_lrc = self._image_skew_coordinate + xy2 = trans.transform_non_affine(np.array([(x_lrc, y_lrc)])) + _xx3, _yy3 = xy2[0] + + tr_rotate_skew = self._get_rotate_and_skew_transform(_xx1, _yy1, + _xx2, _yy2, + _xx3, _yy3) + trans_ic_to_canvas = tr_rotate_skew+trans.get_affine() + else: + trans_ic_to_canvas = trans.get_affine() + + # Now, viewLim in the ic. It can be roated and can be + # skewed. Make it big enough. + x1, y1, x2, y2 = self.axes.bbox.extents + trans_canvas_to_ic = trans_ic_to_canvas.inverted() + xy_ = trans_canvas_to_ic.transform(np.array([(x1, y1), + (x2, y1), + (x2, y2), + (x1, y2)])) + x1_, x2_ = min(xy_[:,0]), max(xy_[:,0]) + y1_, y2_ = min(xy_[:,1]), max(xy_[:,1]) + viewLim_in_ic = Bbox.from_extents(x1_, y1_, x2_, y2_) + + + # get the image, sliced if necessary. This is done in the ic. + im, xmin, ymin, dxintv, dyintv, sx, sy = \ + self._get_unsampled_image(self._A, extent_in_ic, viewLim_in_ic) + + if im is None: return # I'm not if this check is required. -JJL + fc = self.axes.patch.get_facecolor() bg = mcolors.colorConverter.to_rgba(fc, 0) im.set_bg( *bg) @@ -202,31 +315,23 @@ # image input dimensions im.reset_matrix() numrows, numcols = im.get_size() - if numrows < 1 or numcols < 1: # out of range - return None - im.set_interpolation(self._interpd[self._interpolation]) + im.resize(numcols, numrows) # just to create im.bufOut that + # is required by backends. There + # may be better solution -JJL - im.set_resample(self._resample) + im._url = self.get_url() - # the viewport translation - tx = (xmin-self.axes.viewLim.x0)/dxintv * numcols - ty = (ymin-self.axes.viewLim.y0)/dyintv * numrows + renderer.draw_image(gc, xmin, ymin, im, dxintv, dyintv, + trans_ic_to_canvas) - l, b, r, t = self.axes.bbox.extents - widthDisplay = (round(r) + 0.5) - (round(l) - 0.5) - heightDisplay = (round(t) + 0.5) - (round(b) - 0.5) - widthDisplay *= magnification - heightDisplay *= magnification - im.apply_translation(tx, ty) - # resize viewport to display - rx = widthDisplay / numcols - ry = heightDisplay / numrows - im.apply_scaling(rx*sx, ry*sy) - im.resize(int(widthDisplay+0.5), int(heightDisplay+0.5), - norm=self._filternorm, radius=self._filterrad) - return im + def _check_unsampled_image(self, renderer): + """ + return True if the image is better to be drawn unsampled. + The derived class needs to override it. + """ + return False @allow_rasterization def draw(self, renderer, *args, **kwargs): @@ -234,14 +339,24 @@ if (self.axes.get_xscale() != 'linear' or self.axes.get_yscale() != 'linear'): warnings.warn("Images are not supported on non-linear axes.") - im = self.make_image(renderer.get_image_magnification()) - if im is None: # out of range - return - im._url = self.get_url() + l, b, widthDisplay, heightDisplay = self.axes.bbox.bounds - clippath, affine = self.get_transformed_clip_path_and_affine() - renderer.draw_image(round(l), round(b), im, self.axes.bbox.frozen(), - clippath, affine) + gc = renderer.new_gc() + gc.set_clip_rectangle(self.axes.bbox.frozen()) + gc.set_clip_path(self.get_clip_path()) + + if self._check_unsampled_image(renderer): + self._draw_unsampled_image(renderer, gc) + else: + if self._image_skew_coordinate is not None: + warnings.warn("Image will not be shown correctly with this backend.") + + im = self.make_image(renderer.get_image_magnification()) + if im is None: + return + im._url = self.get_url() + renderer.draw_image(gc, l, b, im) + gc.restore() def contains(self, mouseevent): """ @@ -269,7 +384,7 @@ def write_png(self, fname, noscale=False): """Write the image to png file with fname""" im = self.make_image() - if im is None: # out of range + if im is None: return if noscale: numrows, numcols = im.get_size() @@ -317,20 +432,6 @@ - def set_extent(self, extent): - """ - extent is data axes (left, right, bottom, top) for making image plots - """ - self._extent = extent - - xmin, xmax, ymin, ymax = extent - corners = (xmin, ymin), (xmax, ymax) - self.axes.update_datalim(corners) - if self.axes._autoscaleXon: - self.axes.set_xlim((xmin, xmax)) - if self.axes._autoscaleYon: - self.axes.set_ylim((ymin, ymax)) - def get_interpolation(self): """ Return the interpolation method the image uses when resizing. @@ -370,19 +471,6 @@ 'return the image resample boolean' return self._resample - def get_extent(self): - 'get the image extent: left, right, bottom, top' - if self._extent is not None: - return self._extent - else: - sz = self.get_size() - #print 'sz', sz - numrows, numcols = sz - if self.origin == 'upper': - return (-0.5, numcols-0.5, numrows-0.5, -0.5) - else: - return (-0.5, numcols-0.5, -0.5, numrows-0.5) - def set_filternorm(self, filternorm): """ Set whether the resize filter norms the weights -- see @@ -415,6 +503,153 @@ return self._filterrad + +class AxesImage(_AxesImageBase): + def __str__(self): + return "AxesImage(%g,%g;%gx%g)" % tuple(self.axes.bbox.bounds) + + def __init__(self, ax, + cmap = None, + norm = None, + interpolation=None, + origin=None, + extent=None, + filternorm=1, + filterrad=4.0, + resample = False, + **kwargs + ): + + """ + interpolation and cmap default to their rc settings + + cmap is a colors.Colormap instance + norm is a colors.Normalize instance to map luminance to 0-1 + + extent is data axes (left, right, bottom, top) for making image plots + registered with data plots. Default is to label the pixel + centers with the zero-based row and column indices. + + Additional kwargs are matplotlib.artist properties + + """ + + self._extent = extent + + _AxesImageBase.__init__(self, ax, + cmap = cmap, + norm = norm, + interpolation=interpolation, + origin=origin, + filternorm=filternorm, + filterrad=filterrad, + resample = resample, + **kwargs + ) + + + def make_image(self, magnification=1.0): + if self._A is None: + raise RuntimeError('You must first set the image array or the image attribute') + + # image is created in the canvas coordinate. + x1, x2, y1, y2 = self.get_extent() + trans = self.get_transform() + xy = trans.transform(np.array([(x1, y1), + (x2, y2), + ])) + _x1, _y1 = xy[0] + _x2, _y2 = xy[1] + + transformed_viewLim = mtransforms.TransformedBbox(self.axes.viewLim, + trans) + + im, xmin, ymin, dxintv, dyintv, sx, sy = \ + self._get_unsampled_image(self._A, [_x1, _x2, _y1, _y2], + transformed_viewLim) + + fc = self.axes.patch.get_facecolor() + bg = mcolors.colorConverter.to_rgba(fc, 0) + im.set_bg( *bg) + + # image input dimensions + im.reset_matrix() + numrows, numcols = im.get_size() + if numrows < 1 or numcols < 1: # out of range + return None + im.set_interpolation(self._interpd[self._interpolation]) + + im.set_resample(self._resample) + + # the viewport translation + if dxintv == 0.0: + tx = 0.0 + else: + tx = (xmin-transformed_viewLim.x0)/dxintv * numcols + if dyintv == 0.0: + ty = 0.0 + else: + ty = (ymin-transformed_viewLim.y0)/dyintv * numrows + + im.apply_translation(tx, ty) + + l, b, r, t = self.axes.bbox.extents + widthDisplay = (round(r*magnification) + 0.5) - (round(l*magnification) - 0.5) + heightDisplay = (round(t*magnification) + 0.5) - (round(b*magnification) - 0.5) + + # resize viewport to display + rx = widthDisplay / numcols + ry = heightDisplay / numrows + im.apply_scaling(rx*sx, ry*sy) + im.resize(int(widthDisplay+0.5), int(heightDisplay+0.5), + norm=self._filternorm, radius=self._filterrad) + return im + + + def _check_unsampled_image(self, renderer): + """ + return True if the image is better to be drawn unsampled. + """ + if renderer.option_scale_image() and self.get_interpolation() == "nearest": + return True + else: + return False + + def set_extent(self, extent): + """ + extent is data axes (left, right, bottom, top) for making image plots + + This updates ax.dataLim, and, if autoscaling, sets viewLim + to tightly fit the image, regardless of dataLim. Autoscaling + state is not changed, so following this with ax.autoscale_view + will redo the autoscaling in accord with dataLim. + + """ + self._extent = extent + + xmin, xmax, ymin, ymax = extent + corners = (xmin, ymin), (xmax, ymax) + self.axes.update_datalim(corners) + if self.axes._autoscaleXon: + self.axes.set_xlim((xmin, xmax), auto=None) + if self.axes._autoscaleYon: + self.axes.set_ylim((ymin, ymax), auto=None) + + def get_extent(self): + 'get the image extent: left, right, bottom, top' + if self._extent is not None: + return self._extent + else: + sz = self.get_size() + #print 'sz', sz + numrows, numcols = sz + if self.origin == 'upper': + return (-0.5, numcols-0.5, numrows-0.5, -0.5) + else: + return (-0.5, numcols-0.5, -0.5, numrows-0.5) + + + class NonUniformImage(AxesImage): def __init__(self, ax, **kwargs): """ @@ -424,7 +659,13 @@ interp = kwargs.pop('interpolation', 'nearest') AxesImage.__init__(self, ax, **kwargs) - AxesImage.set_interpolation(self, interp) + self.set_interpolation(interp) + + def _check_unsampled_image(self, renderer): + """ + return False. Do not use unsampled image. + """ + return False def make_image(self, magnification=1.0): if self._A is None: @@ -491,6 +732,13 @@ self._Ay = y self._imcache = None + # I am adding this in accor with _AxesImageBase.set_data -- + # examples/pylab_examples/image_nonuniform.py was breaking on + # the call to _get_unsampled_image when the oldxslice attr was + # accessed - JDH 3/3/2010 + self._oldxslice = None + self._oldyslice = None + def set_array(self, *args): raise NotImplementedError('Method not supported') @@ -582,11 +830,14 @@ def draw(self, renderer, *args, **kwargs): if not self.get_visible(): return im = self.make_image(renderer.get_image_magnification()) - renderer.draw_image(round(self.axes.bbox.xmin), + gc = renderer.new_gc() + gc.set_clip_rectangle(self.axes.bbox.frozen()) + gc.set_clip_path(self.get_clip_path()) + renderer.draw_image(gc, + round(self.axes.bbox.xmin), round(self.axes.bbox.ymin), - im, - self.axes.bbox.frozen(), - *self.get_transformed_clip_path_and_affine()) + im) + gc.restore() def set_data(self, x, y, A): @@ -635,7 +886,7 @@ self.update_dict['array'] = True class FigureImage(martist.Artist, cm.ScalarMappable): - zorder = 1 + zorder = 0 def __init__(self, fig, cmap = None, norm = None, @@ -736,8 +987,11 @@ if not self.get_visible(): return # todo: we should be able to do some cacheing here im = self.make_image(renderer.get_image_magnification()) - renderer.draw_image(round(self.ox), round(self.oy), im, self.figure.bbox, - *self.get_transformed_clip_path_and_affine()) + gc = renderer.new_gc() + gc.set_clip_rectangle(self.figure.bbox) + gc.set_clip_path(self.get_clip_path()) + renderer.draw_image(gc, round(self.ox), round(self.oy), im) + gc.restore() def write_png(self, fname): """Write the image to png file with fname""" @@ -745,9 +999,151 @@ rows, cols, buffer = im.as_rgba_str() _png.write_png(buffer, cols, rows, fname) -def imread(fname): + +class BboxImage(_AxesImageBase): """ - Return image file in *fname* as :class:`numpy.array`. + The Image class whose size is determined by the given bbox. + """ + def __init__(self, bbox, + cmap = None, + norm = None, + interpolation=None, + origin=None, + filternorm=1, + filterrad=4.0, + resample = False, + **kwargs + ): + + """ + cmap is a colors.Colormap instance + norm is a colors.Normalize instance to map luminance to 0-1 + + kwargs are an optional list of Artist keyword args + """ + + _AxesImageBase.__init__(self, ax=None, + cmap = cmap, + norm = norm, + interpolation=interpolation, + origin=origin, + filternorm=filternorm, + filterrad=filterrad, + resample = resample, + **kwargs + ) + + self.bbox = bbox + + def get_window_extent(self, renderer=None): + if renderer is None: + renderer = self.get_figure()._cachedRenderer + + if isinstance(self.bbox, BboxBase): + return self.bbox + elif callable(self.bbox): + return self.bbox(renderer) + else: + raise ValueError("unknown type of bbox") + + + def contains(self, mouseevent): + """Test whether the mouse event occured within the image. + """ + + if callable(self._contains): return self._contains(self,mouseevent) + + if not self.get_visible():# or self.get_figure()._renderer is None: + return False,{} + + x, y = mouseevent.x, mouseevent.y + inside = self.get_window_extent().contains(x, y) + + return inside,{} + + def get_size(self): + 'Get the numrows, numcols of the input image' + if self._A is None: + raise RuntimeError('You must first set the image array') + + return self._A.shape[:2] + + def make_image(self, renderer, magnification=1.0): + if self._A is None: + raise RuntimeError('You must first set the image array or the image attribute') + + if self._imcache is None: + if self._A.dtype == np.uint8 and len(self._A.shape) == 3: + im = _image.frombyte(self._A, 0) + im.is_grayscale = False + else: + if self._rgbacache is None: + x = self.to_rgba(self._A, self._alpha) + self._rgbacache = x + else: + x = self._rgbacache + im = _image.fromarray(x, 0) + if len(self._A.shape) == 2: + im.is_grayscale = self.cmap.is_gray() + else: + im.is_grayscale = False + self._imcache = im + + if self.origin=='upper': + im.flipud_in() + else: + im = self._imcache + + # image input dimensions + im.reset_matrix() + + im.set_interpolation(self._interpd[self._interpolation]) + + im.set_resample(self._resample) + + l, b, r, t = self.get_window_extent(renderer).extents #bbox.extents + widthDisplay = (round(r) + 0.5) - (round(l) - 0.5) + heightDisplay = (round(t) + 0.5) - (round(b) - 0.5) + widthDisplay *= magnification + heightDisplay *= magnification + + numrows, numcols = self._A.shape[:2] + + # resize viewport to display + rx = widthDisplay / numcols + ry = heightDisplay / numrows + #im.apply_scaling(rx*sx, ry*sy) + im.apply_scaling(rx, ry) + #im.resize(int(widthDisplay+0.5), int(heightDisplay+0.5), + # norm=self._filternorm, radius=self._filterrad) + im.resize(int(widthDisplay), int(heightDisplay), + norm=self._filternorm, radius=self._filterrad) + return im + + + @allow_rasterization + def draw(self, renderer, *args, **kwargs): + if not self.get_visible(): return + # todo: we should be able to do some cacheing here + image_mag = renderer.get_image_magnification() + im = self.make_image(renderer, image_mag) + l, b, r, t = self.get_window_extent(renderer).extents + gc = renderer.new_gc() + self._set_gc_clip(gc) + #gc.set_clip_path(self.get_clip_path()) + renderer.draw_image(gc, round(l), round(b), im) + gc.restore() + + + +def imread(fname, format=None): + """ + Return image file in *fname* as :class:`numpy.array`. *fname* may + be a string path or a Python file-like object. + + If *format* is provided, will try to read file of that type, + otherwise the format is deduced from the filename. If nothing can + be deduced, PNG is tried. Return value is a :class:`numpy.array`. For grayscale images, the return array is MxN. For RGB images, the return value is MxNx3. @@ -766,11 +1162,15 @@ image = Image.open( fname ) return pil_to_array(image) - - handlers = {'png' :_png.read_png, - } - basename, ext = os.path.splitext(fname) - ext = ext.lower()[1:] + handlers = {'png' :_png.read_png, } + if format is None: + if cbook.is_string_like(fname): + basename, ext = os.path.splitext(fname) + ext = ext.lower()[1:] + else: + ext = 'png' + else: + ext = format if ext not in handlers.keys(): im = pilread() @@ -779,10 +1179,18 @@ return im handler = handlers[ext] + + # To handle Unicode filenames, we pass a file object to the PNG + # reader extension, since Python handles them quite well, but it's + # tricky in C. + if cbook.is_string_like(fname): + fname = open(fname, 'rb') + return handler(fname) -def imsave(fname, arr, vmin=None, vmax=None, cmap=None, format=None, origin=None): +def imsave(fname, arr, vmin=None, vmax=None, cmap=None, format=None, + origin=None, dpi=100): """ Saves a 2D :class:`numpy.array` as an image with one pixel per element. The output formats available depend on the backend being used. @@ -809,14 +1217,18 @@ [ 'upper' | 'lower' ] Indicates where the [0,0] index of the array is in the upper left or lower left corner of the axes. Defaults to the rc image.origin value. + *dpi* + The DPI to store in the metadata of the file. This does not affect the + resolution of the output image. """ from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas from matplotlib.figure import Figure - fig = Figure(figsize=arr.shape[::-1], dpi=1, frameon=False) + figsize = [x / float(dpi) for x in arr.shape[::-1]] + fig = Figure(figsize=figsize, dpi=dpi, frameon=False) canvas = FigureCanvas(fig) - fig.figimage(arr, cmap=cmap, vmin=vmin, vmax=vmax, origin=origin) - fig.savefig(fname, dpi=1, format=format) + im = fig.figimage(arr, cmap=cmap, vmin=vmin, vmax=vmax, origin=origin) + fig.savefig(fname, dpi=dpi, format=format) def pil_to_array( pilImage ): diff -Nru matplotlib-0.99.3/lib/matplotlib/__init__.py matplotlib-1.0.1/lib/matplotlib/__init__.py --- matplotlib-0.99.3/lib/matplotlib/__init__.py 2010-05-30 20:31:09.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/__init__.py 2011-01-06 13:50:08.000000000 +0000 @@ -1,9 +1,13 @@ """ This is an object-orient plotting library. -A procedural interface is provided by the companion pylab module, +A procedural interface is provided by the companion pyplot module, which may be imported directly, e.g:: + from matplotlib.pyplot import * + +To include numpy functions too, use:: + from pylab import * or using ipython:: @@ -11,9 +15,11 @@ ipython -pylab For the most part, direct use of the object-oriented library is -encouraged when programming rather than working interactively. The -exceptions are the pylab commands :func:`~matplotlib.pyplot.figure`, +encouraged when programming; pyplot is primarily for working +interactively. The +exceptions are the pyplot commands :func:`~matplotlib.pyplot.figure`, :func:`~matplotlib.pyplot.subplot`, +:func:`~matplotlib.pyplot.subplots`, :func:`~matplotlib.backends.backend_qt4agg.show`, and :func:`~pyplot.savefig`, which can greatly simplify scripting. @@ -84,23 +90,23 @@ for the first time. In particular, it must be called **before** importing pylab (if pylab is imported). -matplotlib is written by John D. Hunter (jdh2358 at gmail.com) and a -host of others. +matplotlib was initially written by John D. Hunter (jdh2358 at +gmail.com) and is now developed and maintained by a host of others. + +Occasionally the internal documentation (python docstrings) will refer +to MATLAB®, a registered trademark of The MathWorks, Inc. + """ from __future__ import generators -__version__ = '0.99.3' -__revision__ = '$Revision: 8345 $' -__date__ = '$Date: 2010-05-30 13:30:47 -0700 (Sun, 30 May 2010) $' +__version__ = '1.0.1' +__revision__ = '$Revision: 8897 $' +__date__ = '$Date: 2011-01-06 05:50:07 -0800 (Thu, 06 Jan 2011) $' import os, re, shutil, subprocess, sys, warnings import distutils.sysconfig import distutils.version - -NEWCONFIG = False - - # Needed for toolkit setuptools support if 0: try: @@ -126,8 +132,10 @@ import sys, os, tempfile -from rcsetup import defaultParams, validate_backend, validate_toolbar -from rcsetup import validate_cairo_format +from matplotlib.rcsetup import (defaultParams, + validate_backend, + validate_toolbar, + validate_cairo_format) major, minor1, minor2, s, tmp = sys.version_info _python24 = major>=2 and minor1>=4 @@ -145,8 +153,8 @@ raise ImportError('matplotlib requires Python 2.4 or later') import numpy -nn = numpy.__version__.split('.') -if not (int(nn[0]) >= 1 and int(nn[1]) >= 1): +nmajor, nminor = [int(n) for n in numpy.__version__.split('.')[:2]] +if not (nmajor > 1 or (nmajor == 1 and nminor >= 1)): raise ImportError( 'numpy 1.1 or later is required; you have %s' % numpy.__version__) @@ -301,6 +309,30 @@ except (IndexError, ValueError, UnboundLocalError, OSError): return None +def checkdep_inkscape(): + try: + s = subprocess.Popen(['inkscape','-V'], stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + for line in s.stdout: + if 'Inkscape' in line: + v = line.split()[1] + break + return v + except (IndexError, ValueError, UnboundLocalError, OSError): + return None + +def checkdep_xmllint(): + try: + s = subprocess.Popen(['xmllint','--version'], stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + for line in s.stderr: + if 'version' in line: + v = line.split()[-1] + break + return v + except (IndexError, ValueError, UnboundLocalError, OSError): + return None + def compare_versions(a, b): "return True if a is greater than or equal to b" if a: @@ -454,27 +486,32 @@ return path path = os.sep.join([os.path.dirname(__file__), 'mpl-data']) - if os.path.isdir(path): return path + if os.path.isdir(path): + return path # setuptools' namespace_packages may highjack this init file # so need to try something known to be in matplotlib, not basemap import matplotlib.afm path = os.sep.join([os.path.dirname(matplotlib.afm.__file__), 'mpl-data']) - if os.path.isdir(path): return path + if os.path.isdir(path): + return path # py2exe zips pure python, so still need special check if getattr(sys,'frozen',None): - path = os.path.join(os.path.split(sys.path[0])[0], 'mpl-data') - if os.path.isdir(path): return path - else: - # Try again assuming we need to step up one more directory - path = os.path.join(os.path.split(os.path.split(sys.path[0])[0])[0], - 'mpl-data') - if os.path.isdir(path): return path - else: - # Try again assuming sys.path[0] is a dir not a exe - path = os.path.join(sys.path[0], 'mpl-data') - if os.path.isdir(path): return path + exe_path = os.path.dirname(sys.executable) + path = os.path.join(exe_path, 'mpl-data') + if os.path.isdir(path): + return path + + # Try again assuming we need to step up one more directory + path = os.path.join(os.path.split(exe_path)[0], 'mpl-data') + if os.path.isdir(path): + return path + + # Try again assuming sys.path[0] is a dir not a exe + path = os.path.join(sys.path[0], 'mpl-data') + if os.path.isdir(path): + return path raise RuntimeError('Could not find the matplotlib data files') @@ -487,19 +524,12 @@ always=False) + def get_example_data(fname): """ - return a filehandle to one of the example files in mpl-data/example - - *fname* - the name of one of the files in mpl-data/example + get_example_data is deprecated -- use matplotlib.cbook.get_sample_data instead """ - datadir = os.path.join(get_data_path(), 'example') - fullpath = os.path.join(datadir, fname) - if not os.path.exists(fullpath): - raise IOError('could not find matplotlib example file "%s" in data directory "%s"'%( - fname, datadir)) - return file(fullpath, 'rb') + raise NotImplementedError('get_example_data is deprecated -- use matplotlib.cbook.get_sample_data instead') def get_py2exe_datafiles(): @@ -602,24 +632,49 @@ validate = dict([ (key, converter) for key, (default, converter) in \ defaultParams.iteritems() ]) + msg_depr = "%s is deprecated and replaced with %s; please use the latter." + msg_depr_ignore = "%s is deprecated and ignored. Use %s" def __setitem__(self, key, val): try: - if key in _deprecated_map.keys(): + if key in _deprecated_map: alt = _deprecated_map[key] - warnings.warn('%s is deprecated in matplotlibrc. Use %s \ -instead.'% (key, alt)) + warnings.warn(self.msg_depr % (key, alt)) key = alt elif key in _deprecated_ignore_map: alt = _deprecated_ignore_map[key] - warnings.warn('%s is deprecated. Use %s instead.'% (key, alt)) + warnings.warn(self.msg_depr_ignore % (key, alt)) return cval = self.validate[key](val) dict.__setitem__(self, key, cval) except KeyError: raise KeyError('%s is not a valid rc parameter.\ -See rcParams.keys() for a list of valid parameters.'%key) +See rcParams.keys() for a list of valid parameters.' % (key,)) + def __getitem__(self, key): + if key in _deprecated_map: + alt = _deprecated_map[key] + warnings.warn(self.msg_depr % (key, alt)) + key = alt + elif key in _deprecated_ignore_map: + alt = _deprecated_ignore_map[key] + warnings.warn(self.msg_depr_ignore % (key, alt)) + key = alt + return dict.__getitem__(self, key) + + def keys(self): + """ + Return sorted list of keys. + """ + k = dict.keys(self) + k.sort() + return k + + def values(self): + """ + Return values in order of sorted keys. + """ + return [self[k] for k in self.keys()] def rc_params(fail_on_error=False): 'Return the default params updated from the values in the rc file' @@ -707,6 +762,7 @@ # this is the instance used by the matplotlib classes rcParams = rc_params() +rcParamsOrig = rcParams.copy() rcParamsDefault = RcParams([ (key, default) for key, (default, converter) in \ defaultParams.iteritems() ]) @@ -780,27 +836,26 @@ for k,v in kwargs.items(): name = aliases.get(k) or k key = '%s.%s' % (g, name) - if key not in rcParams: + try: + rcParams[key] = v + except KeyError: raise KeyError('Unrecognized key "%s" for group "%s" and name "%s"' % (key, g, name)) - rcParams[key] = v - def rcdefaults(): """ - Restore the default rc params - the ones that were created at - matplotlib load time. + Restore the default rc params - these are not the params loaded by + the rc file, but mpl's internal params. See rc_file_defaults for + reloading the default params from the rc file """ rcParams.update(rcParamsDefault) -if NEWCONFIG: - #print "importing from reorganized config system!" - try: - from config import rcParams, rcdefaults, mplConfig, save_config - verbose.set_level(rcParams['verbose.level']) - verbose.set_fileo(rcParams['verbose.fileo']) - except: - from config import rcParams, rcdefaults +def rc_file_defaults(): + """ + Restore the default rc params from the original matplotlib rc that + was loaded + """ + rcParams.update(rcParamsOrig) _use_error_msg = """ This call to matplotlib.use() has no effect because the the backend has already been chosen; @@ -872,7 +927,7 @@ # Now allow command line to override -# Allow command line access to the backend with -d (matlab compatible +# Allow command line access to the backend with -d (MATLAB compatible # flag) for s in sys.argv[1:]: @@ -883,6 +938,43 @@ pass # we don't want to assume all -d flags are backends, eg -debug +default_test_modules = [ + 'matplotlib.tests.test_agg', + 'matplotlib.tests.test_backend_svg', + 'matplotlib.tests.test_basic', + 'matplotlib.tests.test_cbook', + 'matplotlib.tests.test_mlab', + 'matplotlib.tests.test_transforms', + 'matplotlib.tests.test_axes', + 'matplotlib.tests.test_dates', + 'matplotlib.tests.test_spines', + 'matplotlib.tests.test_image', + 'matplotlib.tests.test_simplification', + 'matplotlib.tests.test_mathtext' + ] + +def test(verbosity=0): + """run the matplotlib test suite""" + import nose + import nose.plugins.builtin + from testing.noseclasses import KnownFailure + from nose.plugins.manager import PluginManager + + # store the old values before overriding + plugins = [] + plugins.append( KnownFailure() ) + plugins.extend( [plugin() for plugin in nose.plugins.builtin.plugins] ) + + manager = PluginManager(plugins=plugins) + config = nose.config.Config(verbosity=verbosity, plugins=manager) + + success = nose.run( defaultTest=default_test_modules, + config=config, + ) + + return success + +test.__test__ = False # nose: this function is not a test verbose.report('matplotlib version %s'%__version__) verbose.report('verbose.level %s'%verbose.level) diff -Nru matplotlib-0.99.3/lib/matplotlib/legend.py matplotlib-1.0.1/lib/matplotlib/legend.py --- matplotlib-0.99.3/lib/matplotlib/legend.py 2010-05-30 20:31:09.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/legend.py 2010-10-12 16:14:42.000000000 +0000 @@ -33,9 +33,33 @@ from matplotlib.patches import Patch, Rectangle, Shadow, FancyBboxPatch from matplotlib.collections import LineCollection, RegularPolyCollection, \ CircleCollection -from matplotlib.transforms import Bbox, BboxBase, TransformedBbox, BboxTransformTo +from matplotlib.transforms import Bbox, BboxBase, TransformedBbox, BboxTransformTo, BboxTransformFrom -from matplotlib.offsetbox import HPacker, VPacker, TextArea, DrawingArea +from matplotlib.offsetbox import HPacker, VPacker, TextArea, DrawingArea, DraggableOffsetBox + + +class DraggableLegend(DraggableOffsetBox): + def __init__(self, legend, use_blit=False): + self.legend=legend + DraggableOffsetBox.__init__(self, legend, legend._legend_box, + use_blit=use_blit) + + def artist_picker(self, legend, evt): + return self.legend.legendPatch.contains(evt) + + def finalize_offset(self): + loc_in_canvas = self.get_loc_in_canvas() + + bbox = self.legend.get_bbox_to_anchor() + + # if bbox has zero width or height, the transformation is + # ill-defined. Fall back to the defaul bbox_to_anchor. + if bbox.width ==0 or bbox.height ==0: + self.legend.set_bbox_to_anchor(None) + bbox = self.legend.get_bbox_to_anchor() + + _bbox_transform = BboxTransformFrom(bbox) + self.legend._loc = tuple(_bbox_transform.transform_point(loc_in_canvas)) class Legend(Artist): @@ -115,6 +139,7 @@ title = None, # set a title for the legend bbox_to_anchor = None, # bbox that the legend will be anchored. bbox_transform = None, # transform for the bbox + frameon = True, # draw frame ): """ - *parent* : the artist that contains the legend @@ -132,6 +157,7 @@ numpoints the number of points in the legend for line scatterpoints the number of points in the legend for scatter plot scatteryoffsets a list of yoffsets for scatter symbols in legend + frameon if True, draw a frame (default is True) fancybox if True, draw a frame with a round fancybox. If None, use rc shadow if True, draw a shadow behind legend ncol number of columns @@ -146,8 +172,10 @@ bbox_transform the transform for the bbox. transAxes if None. ================ ================================================================== -The dimensions of pad and spacing are given as a fraction of the -_fontsize. Values from rcParams will be used if None. + +The pad and spacing parameters are measure in font-size units. E.g., +a fontsize of 10 points and a handlelength=5 implies a handlelength of +50 points. Values from rcParams will be used if None. Users can specify any arbitrary location for the legend using the *bbox_to_anchor* keyword argument. bbox_to_anchor can be an instance @@ -177,6 +205,10 @@ propnames=['numpoints', 'markerscale', 'shadow', "columnspacing", "scatterpoints"] + self.texts = [] + self.legendHandles = [] + self._legend_title_box = None + localdict = locals() for name in propnames: @@ -230,7 +262,7 @@ self._scatteryoffsets = np.array([3./8., 4./8., 2.5/8.]) else: self._scatteryoffsets = np.asarray(scatteryoffsets) - reps = int(self.numpoints / len(self._scatteryoffsets)) + 1 + reps = int(self.scatterpoints / len(self._scatteryoffsets)) + 1 self._scatteryoffsets = np.tile(self._scatteryoffsets, reps)[:self.scatterpoints] # _legend_box is an OffsetBox instance that contains all @@ -240,6 +272,7 @@ if isinstance(parent,Axes): self.isaxes = True + self.set_axes(parent) self.set_figure(parent.figure) elif isinstance(parent,Figure): self.isaxes = False @@ -271,15 +304,16 @@ 'Falling back on "upper right".') loc = 1 - self._loc = loc self._mode = mode self.set_bbox_to_anchor(bbox_to_anchor, bbox_transform) # We use FancyBboxPatch to draw a legend frame. The location # and size of the box will be updated during the drawing time. + self.legendPatch = FancyBboxPatch( xy=(0.0, 0.0), width=1., height=1., - facecolor='w', edgecolor='k', + facecolor=rcParams["axes.facecolor"], + edgecolor=rcParams["axes.edgecolor"], mutation_scale=self._fontsize, snap=True ) @@ -298,27 +332,50 @@ self._set_artist_props(self.legendPatch) - self._drawFrame = True + self._drawFrame = frameon # init with null renderer self._init_legend_box(handles, labels) + self._loc = loc + self.set_title(title) self._last_fontsize_points = self._fontsize + self._draggable = None def _set_artist_props(self, a): """ set the boilerplate props for artists added to axes """ a.set_figure(self.figure) + if self.isaxes: + a.set_axes(self.axes) + a.set_transform(self.get_transform()) - for c in self.get_children(): - c.set_figure(self.figure) - a.set_transform(self.get_transform()) + def _set_loc(self, loc): + # find_offset function will be provided to _legend_box and + # _legend_box will draw itself at the location of the return + # value of the find_offset. + self._loc_real = loc + if loc == 0: + _findoffset = self._findoffset_best + else: + _findoffset = self._findoffset_loc + + #def findoffset(width, height, xdescent, ydescent): + # return _findoffset(width, height, xdescent, ydescent, renderer) + + self._legend_box.set_offset(_findoffset) + self._loc_real = loc + + def _get_loc(self): + return self._loc_real + + _loc = property(_get_loc, _set_loc) def _findoffset_best(self, width, height, xdescent, ydescent, renderer): "Helper function to locate the legend at its best position" @@ -348,19 +405,6 @@ renderer.open_group('legend') - # find_offset function will be provided to _legend_box and - # _legend_box will draw itself at the location of the return - # value of the find_offset. - if self._loc == 0: - _findoffset = self._findoffset_best - else: - _findoffset = self._findoffset_loc - - def findoffset(width, height, xdescent, ydescent): - return _findoffset(width, height, xdescent, ydescent, renderer) - - self._legend_box.set_offset(findoffset) - fontsize = renderer.points_to_pixels(self._fontsize) # if mode == fill, set the width of the legend_box to the @@ -427,13 +471,6 @@ ) labelboxes = [] - - for l in labels: - textbox = TextArea(l, textprops=label_prop, - multilinebaseline=True, minimumdescent=True) - text_list.append(textbox._text) - labelboxes.append(textbox) - handleboxes = [] @@ -451,7 +488,8 @@ # default trasnform (eg, Collections), you need to # manually set their transform to the self.get_transform(). - for handle in handles: + + for handle, lab in zip(handles, labels): if isinstance(handle, RegularPolyCollection) or \ isinstance(handle, CircleCollection): npoints = self.scatterpoints @@ -487,6 +525,9 @@ legline_marker.set_clip_box(None) legline_marker.set_clip_path(None) legline_marker.set_linestyle('None') + if self.markerscale !=1: + newsz = legline_marker.get_markersize()*self.markerscale + legline_marker.set_markersize(newsz) # we don't want to add this to the return list because # the texts and handles are assumed to be in one-to-one # correpondence. @@ -522,11 +563,8 @@ #ydata = self._scatteryoffsets ydata = height*self._scatteryoffsets - size_max, size_min = max(handle.get_sizes()),\ - min(handle.get_sizes()) - # we may need to scale these sizes by "markerscale" - # attribute. But other handle types does not seem - # to care about this attribute and it is currently ignored. + size_max, size_min = max(handle.get_sizes())*self.markerscale**2,\ + min(handle.get_sizes())*self.markerscale**2 if self.scatterpoints < 4: sizes = [.5*(size_max+size_min), size_max, size_min] @@ -550,11 +588,8 @@ ydata = height*self._scatteryoffsets - size_max, size_min = max(handle.get_sizes()),\ - min(handle.get_sizes()) - # we may need to scale these sizes by "markerscale" - # attribute. But other handle types does not seem - # to care about this attribute and it is currently ignored. + size_max, size_min = max(handle.get_sizes())*self.markerscale**2,\ + min(handle.get_sizes())*self.markerscale**2 if self.scatterpoints < 4: sizes = [.5*(size_max+size_min), size_max, size_min] @@ -572,38 +607,54 @@ p.set_clip_path(None) handle_list.append(p) else: + handle_type = type(handle) + warnings.warn("Legend does not support %s\nUse proxy artist instead.\n\nhttp://matplotlib.sourceforge.net/users/legend_guide.html#using-proxy-artist\n" % (str(handle_type),)) handle_list.append(None) - handlebox = DrawingArea(width=self.handlelength*fontsize, - height=height, - xdescent=0., ydescent=descent) + handle = handle_list[-1] - handlebox.add_artist(handle) + if handle is not None: # handle is None is the artist is not supproted + textbox = TextArea(lab, textprops=label_prop, + multilinebaseline=True, minimumdescent=True) + text_list.append(textbox._text) + + labelboxes.append(textbox) + + handlebox = DrawingArea(width=self.handlelength*fontsize, + height=height, + xdescent=0., ydescent=descent) + + handlebox.add_artist(handle) + + # special case for collection instances + if isinstance(handle, RegularPolyCollection) or \ + isinstance(handle, CircleCollection): + handle._transOffset = handlebox.get_transform() + handle.set_transform(None) - # special case for collection instances - if isinstance(handle, RegularPolyCollection) or \ - isinstance(handle, CircleCollection): - handle._transOffset = handlebox.get_transform() - handle.set_transform(None) - if hasattr(handle, "_legmarker"): - handlebox.add_artist(handle._legmarker) - handleboxes.append(handlebox) - - - # We calculate number of lows in each column. The first - # (num_largecol) columns will have (nrows+1) rows, and remaing - # (num_smallcol) columns will have (nrows) rows. - ncol = min(self._ncol, len(handleboxes)) - nrows, num_largecol = divmod(len(handleboxes), ncol) - num_smallcol = ncol-num_largecol - - # starting index of each column and number of rows in it. - largecol = safezip(range(0, num_largecol*(nrows+1), (nrows+1)), - [nrows+1] * num_largecol) - smallcol = safezip(range(num_largecol*(nrows+1), len(handleboxes), nrows), - [nrows] * num_smallcol) + if hasattr(handle, "_legmarker"): + handlebox.add_artist(handle._legmarker) + handleboxes.append(handlebox) + + + if len(handleboxes) > 0: + + # We calculate number of lows in each column. The first + # (num_largecol) columns will have (nrows+1) rows, and remaing + # (num_smallcol) columns will have (nrows) rows. + ncol = min(self._ncol, len(handleboxes)) + nrows, num_largecol = divmod(len(handleboxes), ncol) + num_smallcol = ncol-num_largecol + + # starting index of each column and number of rows in it. + largecol = safezip(range(0, num_largecol*(nrows+1), (nrows+1)), + [nrows+1] * num_largecol) + smallcol = safezip(range(num_largecol*(nrows+1), len(handleboxes), nrows), + [nrows] * num_smallcol) + else: + largecol, smallcol = [], [] handle_label = safezip(handleboxes, labelboxes) columnbox = [] @@ -690,13 +741,20 @@ def draw_frame(self, b): 'b is a boolean. Set draw frame to b' - self._drawFrame = b + self.set_frame_on(b) def get_children(self): 'return a list of child artists' children = [] if self._legend_box: children.append(self._legend_box) + children.extend(self.get_lines()) + children.extend(self.get_patches()) + children.extend(self.get_texts()) + children.append(self.get_frame()) + + if self._legend_title_box: + children.append(self.get_title()) return children def get_frame(self): @@ -733,6 +791,20 @@ return self.legendPatch.get_window_extent() + def get_frame_on(self): + """ + Get whether the legend box patch is drawn + """ + return self._drawFrame + + def set_frame_on(self, b): + """ + Set whether the legend box patch is drawn + + ACCEPTS: [ *True* | *False* ] + """ + self._drawFrame = b + def get_bbox_to_anchor(self): """ return the bbox that the legend will be anchored @@ -859,3 +931,32 @@ return ox, oy + def draggable(self, state=None, use_blit=False): + """ + Set the draggable state -- if state is + + * None : toggle the current state + + * True : turn draggable on + + * False : turn draggable off + + If draggable is on, you can drag the legend on the canvas with + the mouse. The DraggableLegend helper instance is returned if + draggable is on. + """ + is_draggable = self._draggable is not None + + # if state is None we'll toggle + if state is None: + state = not is_draggable + + if state: + if self._draggable is None: + self._draggable = DraggableLegend(self, use_blit) + else: + if self._draggable is not None: + self._draggable.disconnect() + self._draggable = None + + return self._draggable diff -Nru matplotlib-0.99.3/lib/matplotlib/lines.py matplotlib-1.0.1/lib/matplotlib/lines.py --- matplotlib-0.99.3/lib/matplotlib/lines.py 2009-09-21 18:56:19.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/lines.py 2010-12-13 15:27:29.000000000 +0000 @@ -12,28 +12,21 @@ import artist from artist import Artist from cbook import iterable, is_string_like, is_numlike, ls_mapper, dedent,\ -flatten +flatten, is_math_text from colors import colorConverter from path import Path from transforms import Affine2D, Bbox, TransformedPath, IdentityTransform from matplotlib import rcParams from artist import allow_rasterization +from matplotlib import docstring +from matplotlib.font_manager import FontProperties # special-purpose marker identifiers: (TICKLEFT, TICKRIGHT, TICKUP, TICKDOWN, CARETLEFT, CARETRIGHT, CARETUP, CARETDOWN) = range(8) -# COVERAGE NOTE: Never called internally or from examples -def unmasked_index_ranges(mask, compressed = True): - warnings.warn("Import this directly from matplotlib.cbook", - DeprecationWarning) - # Warning added 2008/07/22 - from matplotlib.cbook import unmasked_index_ranges as _unmasked_index_ranges - return _unmasked_index_ranges(mask, compressed=compressed) - - def segment_hits(cx, cy, x, y, radius): """ Determine if any line segments are within radius of a @@ -107,6 +100,8 @@ drawStyles = {} drawStyles.update(_drawStyles_l) drawStyles.update(_drawStyles_s) + # Need a list ordered with long names first: + drawStyleKeys = _drawStyles_l.keys() + _drawStyles_s.keys() markers = _markers = { # hidden names deprecated '.' : '_draw_point', @@ -145,7 +140,9 @@ } filled_markers = ('o', '^', 'v', '<', '>', - 's', 'd', 'D', 'h', 'H', 'p', '*') + 's', 'd', 'D', 'h', 'H', 'p', '*') + + fillStyles = ('full', 'left' , 'right' , 'bottom' , 'top') zorder = 2 validCap = ('butt', 'round', 'projecting') @@ -172,7 +169,8 @@ markeredgewidth = None, markeredgecolor = None, markerfacecolor = None, - fillstyle = 'full', + markerfacecoloralt = 'none', + fillstyle = 'full', antialiased = None, dash_capstyle = None, solid_capstyle = None, @@ -237,9 +235,10 @@ self.set_markerfacecolor(markerfacecolor) + self.set_markerfacecoloralt(markerfacecoloralt) self.set_markeredgecolor(markeredgecolor) self.set_markeredgewidth(markeredgewidth) - self.set_fillstyle(fillstyle) + self.set_fillstyle(fillstyle) self._point_size_reduction = 0.5 @@ -254,7 +253,8 @@ self._xorig = np.asarray([]) self._yorig = np.asarray([]) - self._invalid = True + self._invalidx = True + self._invalidy = True self.set_data(xdata, ydata) def contains(self, mouseevent): @@ -278,7 +278,7 @@ raise ValueError,"pick radius should be a distance" # Make sure we have data to plot - if self._invalid: + if self._invalidy or self._invalidx: self.recache() if len(self._xy)==0: return False,{} @@ -305,6 +305,8 @@ # If line, return the nearby segment(s) ind = segment_hits(mouseevent.x,mouseevent.y,xt,yt,pixels) + ind += self.ind_offset + # Debugging message if False and self._label != u'': print "Checking line",self._label,"at",mouseevent.x,mouseevent.y @@ -329,9 +331,9 @@ def get_fillstyle(self): """ - return the marker fillstyle + return the marker fillstyle """ - return self._fillstyle + return self._fillstyle def set_fillstyle(self, fs): """ @@ -340,8 +342,8 @@ ACCEPTS: ['full' | 'left' | 'right' | 'bottom' | 'top'] """ - assert fs in ['full', 'left' , 'right' , 'bottom' , 'top'] - self._fillstyle = fs + assert fs in self.fillStyles + self._fillstyle = fs def set_markevery(self, every): """ @@ -393,52 +395,47 @@ def set_axes(self, ax): Artist.set_axes(self, ax) if ax.xaxis is not None: - self._xcid = ax.xaxis.callbacks.connect('units', self.recache) + self._xcid = ax.xaxis.callbacks.connect('units', self.recache_always) if ax.yaxis is not None: - self._ycid = ax.yaxis.callbacks.connect('units', self.recache) + self._ycid = ax.yaxis.callbacks.connect('units', self.recache_always) set_axes.__doc__ = Artist.set_axes.__doc__ def set_data(self, *args): """ Set the x and y data - ACCEPTS: 2D array + ACCEPTS: 2D array (rows are x, y) or two 1D arrays """ if len(args)==1: x, y = args[0] else: x, y = args - not_masked = 0 - if not ma.isMaskedArray(x): - x = np.asarray(x) - not_masked += 1 - if not ma.isMaskedArray(y): - y = np.asarray(y) - not_masked += 1 - - if (not_masked < 2 or - (x is not self._xorig and - (x.shape != self._xorig.shape or np.any(x != self._xorig))) or - (y is not self._yorig and - (y.shape != self._yorig.shape or np.any(y != self._yorig)))): - self._xorig = x - self._yorig = y - self._invalid = True - - def recache(self): - #if self.axes is None: print 'recache no axes' - #else: print 'recache units', self.axes.xaxis.units, self.axes.yaxis.units - if ma.isMaskedArray(self._xorig) or ma.isMaskedArray(self._yorig): - x = ma.asarray(self.convert_xunits(self._xorig), float) - y = ma.asarray(self.convert_yunits(self._yorig), float) - x = ma.ravel(x) - y = ma.ravel(y) - else: - x = np.asarray(self.convert_xunits(self._xorig), float) - y = np.asarray(self.convert_yunits(self._yorig), float) - x = np.ravel(x) - y = np.ravel(y) + self.set_xdata(x) + self.set_ydata(y) + + def recache_always(self): + self.recache(always=True) + + def recache(self, always=False): + if always or self._invalidx: + xconv = self.convert_xunits(self._xorig) + if ma.isMaskedArray(self._xorig): + x = ma.asarray(xconv, float) + else: + x = np.asarray(xconv, float) + x = x.ravel() + else: + x = self._x + if always or self._invalidy: + yconv = self.convert_yunits(self._yorig) + if ma.isMaskedArray(self._yorig): + y = ma.asarray(yconv, float) + else: + y = np.asarray(yconv, float) + y = y.ravel() + else: + y = self._y if len(x)==1 and len(y)>1: x = x * np.ones(y.shape, float) @@ -462,7 +459,7 @@ if (self.axes and len(x) > 100 and self._is_sorted(x) and self.axes.name == 'rectilinear' and self.axes.get_xscale() == 'linear' and - self.axes.get_yscale() == 'linear'): + self._markevery is None): self._subslice = True if hasattr(self, '_path'): interpolation_steps = self._path._interpolation_steps @@ -470,7 +467,8 @@ interpolation_steps = 1 self._path = Path(self._xy, None, interpolation_steps) self._transformed_path = None - self._invalid = False + self._invalidx = False + self._invalidy = False def _transform_path(self, subslice=None): # Masked arrays are now handled by the Path class itself @@ -488,7 +486,8 @@ ACCEPTS: a :class:`matplotlib.transforms.Transform` instance """ Artist.set_transform(self, t) - self._invalid = True + self._invalidx = True + self._invalidy = True def _is_sorted(self, x): "return true if x is sorted" @@ -497,14 +496,16 @@ @allow_rasterization def draw(self, renderer): - if self._invalid: + if self._invalidy or self._invalidx: self.recache() + self.ind_offset = 0 # Needed for contains() method. if self._subslice and self.axes: # Need to handle monotonically decreasing case also... x0, x1 = self.axes.get_xbound() i0, = self._x.searchsorted([x0], 'left') i1, = self._x.searchsorted([x1], 'right') subslice = slice(max(i0-1, 0), i1+1) + self.ind_offset = subslice.start self._transform_path(subslice) if self._transformed_path is None: self._transform_path() @@ -544,7 +545,7 @@ gc.set_foreground(self.get_markeredgecolor()) gc.set_linewidth(self._markeredgewidth) gc.set_alpha(self._alpha) - funcname = self._markers.get(self._marker, '_draw_nothing') + funcname = self._markerFunc if funcname != '_draw_nothing': tpath, affine = self._transformed_path.get_transformed_points_and_affine() if len(tpath.vertices): @@ -582,7 +583,8 @@ def get_markeredgecolor(self): if (is_string_like(self._markeredgecolor) and self._markeredgecolor == 'auto'): - if self._marker in self.filled_markers: + if (self._marker in self.filled_markers or + is_math_text(self._marker)): return 'k' else: return self._color @@ -593,17 +595,24 @@ return self._markeredgecolor def get_markeredgewidth(self): return self._markeredgewidth - def get_markerfacecolor(self): - if (self._markerfacecolor is None or - (is_string_like(self._markerfacecolor) and - self._markerfacecolor.lower()=='none') ): - return self._markerfacecolor - elif (is_string_like(self._markerfacecolor) and - self._markerfacecolor.lower() == 'auto'): + def _get_markerfacecolor(self, alt=False): + if alt: + fc = self._markerfacecoloralt + else: + fc = self._markerfacecolor + + if (fc is None or (is_string_like(fc) and fc.lower()=='none') ): + return fc + elif (is_string_like(fc) and fc.lower() == 'auto'): return self._color else: - return self._markerfacecolor + return fc + + def get_markerfacecolor(self): + return self._get_markerfacecolor(alt=False) + def get_markerfacecoloralt(self): + return self._get_markerfacecolor(alt=True) def get_markersize(self): return self._markersize @@ -625,7 +634,7 @@ """ if orig: return self._xorig - if self._invalid: + if self._invalidx: self.recache() return self._x @@ -638,7 +647,7 @@ """ if orig: return self._yorig - if self._invalid: + if self._invalidy: self.recache() return self._y @@ -647,7 +656,7 @@ Return the :class:`~matplotlib.path.Path` object associated with this line. """ - if self._invalid: + if self._invalidy or self._invalidx: self.recache() return self._path @@ -655,7 +664,7 @@ """ Return the *xy* data as a Nx2 numpy array. """ - if self._invalid: + if self._invalidy or self._invalidx: self.recache() return self._xy @@ -703,13 +712,13 @@ ================ ================= linestyle description ================ ================= - '-' solid - '--' dashed - '-.' dash_dot - ':' dotted - 'None' draw nothing - ' ' draw nothing - '' draw nothing + ``'-'`` solid + ``'--'`` dashed + ``'-.'`` dash_dot + ``':'`` dotted + ``'None'`` draw nothing + ``' '`` draw nothing + ``''`` draw nothing ================ ================= 'steps' is equivalent to 'steps-pre' and is maintained for @@ -720,19 +729,18 @@ :meth:`set_drawstyle` To set the drawing style (stepping) of the plot. - ACCEPTS: [ '-' | '--' | '-.' | ':' | 'None' | ' ' | '' ] and - any drawstyle in combination with a linestyle, e.g. 'steps--'. + ACCEPTS: [ ``'-'`` | ``'--'`` | ``'-.'`` | ``':'`` | ``'None'`` | ``' '`` | ``''`` ] + and any drawstyle in combination with a linestyle, e.g. ``'steps--'``. """ - # handle long drawstyle names before short ones ! - for ds in flatten([k.keys() for k in (self._drawStyles_l, - self._drawStyles_s)], is_string_like): + for ds in self.drawStyleKeys: # long names are first in the list if linestyle.startswith(ds): self.set_drawstyle(ds) if len(linestyle) > len(ds): linestyle = linestyle[len(ds):] else: linestyle = '-' + break if linestyle not in self._lineStyles: if linestyle in ls_mapper: @@ -751,28 +759,28 @@ ========== ========================== marker description ========== ========================== - '.' point - ',' pixel - 'o' circle - 'v' triangle_down - '^' triangle_up - '<' triangle_left - '>' triangle_right - '1' tri_down - '2' tri_up - '3' tri_left - '4' tri_right - 's' square - 'p' pentagon - '*' star - 'h' hexagon1 - 'H' hexagon2 - '+' plus - 'x' x - 'D' diamond - 'd' thin_diamond - '|' vline - '_' hline + ``'.'`` point + ``','`` pixel + ``'o'`` circle + ``'v'`` triangle_down + ``'^'`` triangle_up + ``'<'`` triangle_left + ``'>'`` triangle_right + ``'1'`` tri_down + ``'2'`` tri_up + ``'3'`` tri_left + ``'4'`` tri_right + ``'s'`` square + ``'p'`` pentagon + ``'*'`` star + ``'h'`` hexagon1 + ``'H'`` hexagon2 + ``'+'`` plus + ``'x'`` x + ``'D'`` diamond + ``'d'`` thin_diamond + ``'|'`` vline + ``'_'`` hline TICKLEFT tickleft TICKRIGHT tickright TICKUP tickup @@ -781,27 +789,34 @@ CARETRIGHT caretright CARETUP caretup CARETDOWN caretdown - 'None' nothing - ' ' nothing - '' nothing + ``'None'`` nothing + ``' '`` nothing + ``''`` nothing + '$...$' render the string using mathtext ========== ========================== - ACCEPTS: [ '+' | '*' | ',' | '.' | '1' | '2' | '3' | '4' - | '<' | '>' | 'D' | 'H' | '^' | '_' | 'd' - | 'h' | 'o' | 'p' | 's' | 'v' | 'x' | '|' + ACCEPTS: [ ``'+'`` | ``'*'`` | ``','`` | ``'.'`` + | ``'1'`` | ``'2'`` | ``'3'`` | ``'4'`` + | ``'<'`` | ``'>'`` | ``'D'`` | ``'H'`` + | ``'^'`` | ``'_'`` | ``'d'`` | ``'h'`` + | ``'o'`` | ``'p'`` | ``'s'`` | ``'v'`` + | ``'x'`` | ``'|'`` | TICKUP | TICKDOWN | TICKLEFT | TICKRIGHT - | 'None' | ' ' | '' ] + | CARETUP | CARETDOWN | CARETLEFT | CARETRIGHT + | ``'None'`` | ``' '`` | ``''`` | '$...$'] """ - if marker not in self._markers: + if marker in self._markers: + self._marker = marker + self._markerFunc = self._markers[marker] + elif is_math_text(marker): + self._marker = marker + self._markerFunc = '_draw_mathtext_path' + else: #already handle ' ', '' in marker list verbose.report('Unrecognized marker style %s, %s' % (marker, type(marker))) - if marker in [' ','']: - marker = 'None' - self._marker = marker - self._markerFunc = self._markers[marker] def set_markeredgecolor(self, ec): """ @@ -825,14 +840,26 @@ def set_markerfacecolor(self, fc): """ - Set the marker face color + Set the marker face color. ACCEPTS: any matplotlib color """ - if fc is None : + if fc is None: fc = 'auto' + self._markerfacecolor = fc + def set_markerfacecoloralt(self, fc): + """ + Set the alternate marker face color. + + ACCEPTS: any matplotlib color + """ + if fc is None: + fc = 'auto' + + self._markerfacecoloralt = fc + def set_markersize(self, sz): """ Set the marker size in points @@ -847,7 +874,8 @@ ACCEPTS: 1D array """ - self.set_data(x, self._yorig) + self._xorig = x + self._invalidx = True def set_ydata(self, y): """ @@ -855,7 +883,8 @@ ACCEPTS: 1D array """ - self.set_data(self._xorig, y) + self._yorig = y + self._invalidy = True def set_dashes(self, seq): """ @@ -875,6 +904,40 @@ def _draw_lines(self, renderer, gc, path, trans): self._lineFunc(renderer, gc, path, trans) + + def _draw_mathtext_path(self, renderer, gc, path, trans): + """ + Draws mathtext markers '$...$' using TextPath object. + + Submitted by tcb + """ + from matplotlib.patches import PathPatch + from matplotlib.text import TextPath + + gc.set_snap(False) + + # again, the properties could be initialised just once outside + # this function + # Font size is irrelevant here, it will be rescaled based on + # the drawn size later + props = FontProperties(size=1.0) + text = TextPath(xy=(0,0), s=self.get_marker(), fontproperties=props, + usetex=rcParams['text.usetex']) + if len(text.vertices) == 0: + return + xmin, ymin = text.vertices.min(axis=0) + xmax, ymax = text.vertices.max(axis=0) + width = xmax - xmin + height = ymax - ymin + max_dim = max(width, height) + path_trans = Affine2D() \ + .translate(-xmin + 0.5 * -width, -ymin + 0.5 * -height) \ + .scale((renderer.points_to_pixels(self.get_markersize()) / max_dim)) + + rgbFace = self._get_rgb_face() + renderer.draw_markers(gc, text, path_trans, path, trans, rgbFace) + + def _draw_steps_pre(self, renderer, gc, path, trans): vertices = self._xy steps = ma.zeros((2*len(vertices)-1, 2), np.float_) @@ -886,6 +949,7 @@ path = path.transformed(self.get_transform()) self._lineFunc(renderer, gc, path, IdentityTransform()) + def _draw_steps_post(self, renderer, gc, path, trans): vertices = self._xy steps = ma.zeros((2*len(vertices)-1, 2), np.float_) @@ -897,6 +961,7 @@ path = path.transformed(self.get_transform()) self._lineFunc(renderer, gc, path, IdentityTransform()) + def _draw_steps_mid(self, renderer, gc, path, trans): vertices = self._xy steps = ma.zeros((2*len(vertices), 2), np.float_) @@ -915,10 +980,12 @@ def _draw_nothing(self, *args, **kwargs): pass + def _draw_solid(self, renderer, gc, path, trans): gc.set_linestyle('solid') renderer.draw_path(gc, path, trans) + def _draw_dashed(self, renderer, gc, path, trans): gc.set_linestyle('dashed') if self._dashSeq is not None: @@ -938,98 +1005,149 @@ def _draw_point(self, renderer, gc, path, path_trans): - fs = self.get_fillstyle() - if fs!='full': - raise NotImplementedError('non-full markers have not been implemented for this marker style yet; please contribute') - + # just like _draw_circle + gc.set_snap(renderer.points_to_pixels(self._markersize) > 3.0) w = renderer.points_to_pixels(self._markersize) * \ self._point_size_reduction * 0.5 - gc.set_snap(renderer.points_to_pixels(self._markersize) > 3.0) - rgbFace = self._get_rgb_face() transform = Affine2D().scale(w) - renderer.draw_markers( - gc, Path.unit_circle(), transform, path, path_trans, - rgbFace) + rgbFace = self._get_rgb_face() + fs = self.get_fillstyle() + if fs=='full': + renderer.draw_markers( + gc, Path.unit_circle(), transform, path, path_trans, rgbFace) + else: + rgbFace_alt = self._get_rgb_face(alt=True) + # build a right-half circle + if fs=='bottom': rotate = 270. + elif fs=='top': rotate = 90. + elif fs=='left': rotate = 180. + else: rotate = 0. + + righthalf = Path.unit_circle_righthalf() + transform = transform.rotate_deg(rotate) + renderer.draw_markers(gc, righthalf, transform, + path, path_trans, rgbFace) + transform = transform.rotate_deg(180.) + renderer.draw_markers(gc, righthalf, transform, + path, path_trans, rgbFace_alt) + _draw_pixel_transform = Affine2D().translate(-0.5, -0.5) def _draw_pixel(self, renderer, gc, path, path_trans): - fs = self.get_fillstyle() - if fs!='full': - raise NotImplementedError('non-full markers have not been implemented for this marker style yet; please contribute') - - rgbFace = self._get_rgb_face() gc.set_snap(False) + rgbFace = self._get_rgb_face() + fs = self.get_fillstyle() + # There is no visible difference, so always paint it 'full' renderer.draw_markers(gc, Path.unit_rectangle(), self._draw_pixel_transform, path, path_trans, rgbFace) def _draw_circle(self, renderer, gc, path, path_trans): - fs = self.get_fillstyle() - if fs!='full': - raise NotImplementedError('non-full markers have not been implemented for this marker style yet; please contribute') - - w = renderer.points_to_pixels(self._markersize) * 0.5 gc.set_snap(renderer.points_to_pixels(self._markersize) > 3.0) - rgbFace = self._get_rgb_face() + w = renderer.points_to_pixels(self._markersize) * 0.5 transform = Affine2D().scale(w, w) - renderer.draw_markers( - gc, Path.unit_circle(), transform, path, path_trans, - rgbFace) - - - _triangle_path = Path([[0.0, 1.0], [-1.0, -1.0], [1.0, -1.0], [0.0, 1.0]]) - def _draw_triangle_up(self, renderer, gc, path, path_trans): - - fs = self.get_fillstyle() - if fs!='full': - raise NotImplementedError('non-full markers have not been implemented for this marker style yet; please contribute') + rgbFace = self._get_rgb_face() + fs = self.get_fillstyle() + if fs=='full': + renderer.draw_markers(gc, Path.unit_circle(), transform, + path, path_trans, rgbFace) + else: + rgbFace_alt = self._get_rgb_face(alt=True) + # build a right-half circle + if fs=='bottom': rotate = 270. + elif fs=='top': rotate = 90. + elif fs=='left': rotate = 180. + else: rotate = 0. + righthalf = Path.unit_circle_righthalf() + transform = transform.rotate_deg(rotate) + renderer.draw_markers(gc, righthalf, transform, + path, path_trans, rgbFace) + transform = transform.rotate_deg(180.) + renderer.draw_markers(gc, righthalf, transform, + path, path_trans, rgbFace_alt) + + + _triangle_path = Path([[0.0, 1.0], [-1.0, -1.0], [1.0, -1.0], [0.0, 1.0]], + [Path.MOVETO, Path.LINETO, Path.LINETO, Path.CLOSEPOLY]) + # Going down halfway looks to small. Golden ratio is too far. + _triangle_path_u = Path([[0.0, 1.0], [-3/5., -1/5.], [3/5., -1/5.], [0.0, 1.0]], + [Path.MOVETO, Path.LINETO, Path.LINETO, Path.CLOSEPOLY]) + _triangle_path_d = Path([[-3/5., -1/5.], [3/5., -1/5.], [1.0, -1.0], [-1.0, -1.0], [-3/5., -1/5.]], + [Path.MOVETO, Path.LINETO, Path.LINETO, Path.LINETO, Path.CLOSEPOLY]) + _triangle_path_l = Path([[0.0, 1.0], [0.0, -1.0], [-1.0, -1.0], [0.0, 1.0]], + [Path.MOVETO, Path.LINETO, Path.LINETO, Path.CLOSEPOLY]) + _triangle_path_r = Path([[0.0, 1.0], [0.0, -1.0], [1.0, -1.0], [0.0, 1.0]], + [Path.MOVETO, Path.LINETO, Path.LINETO, Path.CLOSEPOLY]) + def _draw_triangle(self, renderer, gc, path, path_trans, direction): gc.set_snap(renderer.points_to_pixels(self._markersize) >= 5.0) offset = 0.5*renderer.points_to_pixels(self._markersize) - transform = Affine2D().scale(offset, offset) + assert direction in ['up', 'down', 'left', 'right'] + if direction == 'up': + x,y = offset, offset + rot = 0.0 + skip = 0 + elif direction == 'down': + x,y = offset, offset + rot = 180.0 + skip = 2 + elif direction == 'left': + x,y = offset, offset + rot = 90.0 + skip = 3 + else: + x,y = offset, offset + rot = 270.0 + skip = 1 + transform = Affine2D().scale(x,y).rotate_deg(rot) rgbFace = self._get_rgb_face() - renderer.draw_markers(gc, self._triangle_path, transform, - path, path_trans, rgbFace) + fs = self.get_fillstyle() + if fs=='full': + renderer.draw_markers(gc, self._triangle_path, transform, + path, path_trans, rgbFace) + else: + rgbFace_alt = self._get_rgb_face(alt=True) - def _draw_triangle_down(self, renderer, gc, path, path_trans): - fs = self.get_fillstyle() - if fs!='full': - raise NotImplementedError('non-full markers have not been implemented for this marker style yet; please contribute') + mpaths = [self._triangle_path_u, + self._triangle_path_l, + self._triangle_path_d, + self._triangle_path_r] + + if fs=='top': + mpath = mpaths[(0+skip) % 4] + mpath_alt = mpaths[(2+skip) % 4] + elif fs=='bottom': + mpath = mpaths[(2+skip) % 4] + mpath_alt = mpaths[(0+skip) % 4] + elif fs=='left': + mpath = mpaths[(1+skip) % 4] + mpath_alt = mpaths[(3+skip) % 4] + else: + mpath = mpaths[(3+skip) % 4] + mpath_alt = mpaths[(1+skip) % 4] - gc.set_snap(renderer.points_to_pixels(self._markersize) >= 5.0) - offset = 0.5*renderer.points_to_pixels(self._markersize) - transform = Affine2D().scale(offset, -offset) - rgbFace = self._get_rgb_face() - renderer.draw_markers(gc, self._triangle_path, transform, - path, path_trans, rgbFace) + renderer.draw_markers(gc, mpath, transform, + path, path_trans, rgbFace) + renderer.draw_markers(gc, mpath_alt, transform, + path, path_trans, rgbFace_alt) - def _draw_triangle_left(self, renderer, gc, path, path_trans): - fs = self.get_fillstyle() - if fs!='full': - raise NotImplementedError('non-full markers have not been implemented for this marker style yet; please contribute') + def _draw_triangle_up(self, renderer, gc, path, path_trans): + self._draw_triangle(renderer, gc, path, path_trans, 'up') - gc.set_snap(renderer.points_to_pixels(self._markersize) >= 5.0) - offset = 0.5*renderer.points_to_pixels(self._markersize) - transform = Affine2D().scale(offset, offset).rotate_deg(90) - rgbFace = self._get_rgb_face() - renderer.draw_markers(gc, self._triangle_path, transform, - path, path_trans, rgbFace) + def _draw_triangle_down(self, renderer, gc, path, path_trans): + self._draw_triangle(renderer, gc, path, path_trans, 'down') - def _draw_triangle_right(self, renderer, gc, path, path_trans): - fs = self.get_fillstyle() - if fs!='full': - raise NotImplementedError('non-full markers have not been implemented for this marker style yet; please contribute') - gc.set_snap(renderer.points_to_pixels(self._markersize) >= 5.0) - offset = 0.5*renderer.points_to_pixels(self._markersize) - transform = Affine2D().scale(offset, offset).rotate_deg(-90) - rgbFace = self._get_rgb_face() - renderer.draw_markers(gc, self._triangle_path, transform, - path, path_trans, rgbFace) + def _draw_triangle_left(self, renderer, gc, path, path_trans): + self._draw_triangle(renderer, gc, path, path_trans, 'left') + + + def _draw_triangle_right(self, renderer, gc, path, path_trans): + self._draw_triangle(renderer, gc, path, path_trans, 'right') def _draw_square(self, renderer, gc, path, path_trans): @@ -1037,11 +1155,12 @@ side = renderer.points_to_pixels(self._markersize) transform = Affine2D().translate(-0.5, -0.5).scale(side) rgbFace = self._get_rgb_face() - fs = self.get_fillstyle() - if fs=='full': + fs = self.get_fillstyle() + if fs=='full': renderer.draw_markers(gc, Path.unit_rectangle(), transform, path, path_trans, rgbFace) else: + rgbFace_alt = self._get_rgb_face(alt=True) # build a bottom filled square out of two rectangles, one # filled. Use the rotation to support left, right, bottom # or top @@ -1051,84 +1170,224 @@ else: rotate = 90. bottom = Path([[0.0, 0.0], [1.0, 0.0], [1.0, 0.5], [0.0, 0.5], [0.0, 0.0]]) - top = Path([[0.0, 0.5], [1.0, 0.5], [1.0, 1.0], [0.0, 1.0], [0.0, 0.05]]) + top = Path([[0.0, 0.5], [1.0, 0.5], [1.0, 1.0], [0.0, 1.0], [0.0, 0.5]]) transform = transform.rotate_deg(rotate) renderer.draw_markers(gc, bottom, transform, path, path_trans, rgbFace) renderer.draw_markers(gc, top, transform, - path, path_trans, None) + path, path_trans, rgbFace_alt) + def _draw_diamond(self, renderer, gc, path, path_trans): - fs = self.get_fillstyle() - if fs!='full': - raise NotImplementedError('non-full markers have not been implemented for this marker style yet; please contribute') gc.set_snap(renderer.points_to_pixels(self._markersize) >= 5.0) side = renderer.points_to_pixels(self._markersize) transform = Affine2D().translate(-0.5, -0.5).rotate_deg(45).scale(side) + rgbFace = self._get_rgb_face() - renderer.draw_markers(gc, Path.unit_rectangle(), transform, - path, path_trans, rgbFace) + fs = self.get_fillstyle() + if fs=='full': + renderer.draw_markers(gc, Path.unit_rectangle(), transform, + path, path_trans, rgbFace) + else: + right = Path([[0.0, 0.0], [1.0, 0.0], [1.0, 1.0], [0.0, 0.0]]) + left = Path([[0.0, 0.0], [0.0, 1.0], [1.0, 1.0], [0.0, 0.0]]) + + if fs=='bottom': rotate = 270. + elif fs=='top': rotate = 90. + elif fs=='left': rotate = 180. + else: rotate = 0. + + transform = transform.rotate_deg(rotate) + rgbFace_alt = self._get_rgb_face(alt=True) + + renderer.draw_markers(gc, right, transform, + path, path_trans, rgbFace) + renderer.draw_markers(gc, left, transform, + path, path_trans, rgbFace_alt) def _draw_thin_diamond(self, renderer, gc, path, path_trans): - fs = self.get_fillstyle() - if fs!='full': - raise NotImplementedError('non-full markers have not been implemented for this marker style yet; please contribute') gc.set_snap(renderer.points_to_pixels(self._markersize) >= 3.0) offset = renderer.points_to_pixels(self._markersize) transform = Affine2D().translate(-0.5, -0.5) \ - .rotate_deg(45).scale(offset * 0.6, offset) + .rotate_deg(45) + rgbFace = self._get_rgb_face() - renderer.draw_markers(gc, Path.unit_rectangle(), transform, - path, path_trans, rgbFace) + fs = self.get_fillstyle() + if fs=='full': + transform = transform.scale(offset * 0.6, offset) + renderer.draw_markers(gc, Path.unit_rectangle(), transform, + path, path_trans, rgbFace) + else: + right = Path([[0.0, 0.0], [1.0, 0.0], [1.0, 1.0], [0.0, 0.0]]) + left = Path([[0.0, 0.0], [0.0, 1.0], [1.0, 1.0], [0.0, 0.0]]) + + if fs=='bottom': rotate = 270. + elif fs=='top': rotate = 90. + elif fs=='left': rotate = 180. + else: rotate = 0. + + # scale after rotation + transform = transform.rotate_deg(rotate).scale(offset * 0.6, offset) + rgbFace_alt = self._get_rgb_face(alt=True) + + renderer.draw_markers(gc, right, transform, + path, path_trans, rgbFace) + renderer.draw_markers(gc, left, transform, + path, path_trans, rgbFace_alt) def _draw_pentagon(self, renderer, gc, path, path_trans): - fs = self.get_fillstyle() - if fs!='full': - raise NotImplementedError('non-full markers have not been implemented for this marker style yet; please contribute') gc.set_snap(renderer.points_to_pixels(self._markersize) >= 5.0) offset = 0.5 * renderer.points_to_pixels(self._markersize) transform = Affine2D().scale(offset) + rgbFace = self._get_rgb_face() - renderer.draw_markers(gc, Path.unit_regular_polygon(5), transform, - path, path_trans, rgbFace) + fs = self.get_fillstyle() + + polypath = Path.unit_regular_polygon(5) + + if fs == 'full': + renderer.draw_markers(gc, polypath, transform, + path, path_trans, rgbFace) + else: + verts = polypath.vertices + + y = (1+np.sqrt(5))/4. + top = Path([verts[0], verts[1], verts[4], verts[0]]) + bottom = Path([verts[1], verts[2], verts[3], verts[4], verts[1]]) + left = Path([verts[0], verts[1], verts[2], [0,-y], verts[0]]) + right = Path([verts[0], verts[4], verts[3], [0,-y], verts[0]]) + + if fs == 'top': + mpath, mpath_alt = top, bottom + elif fs == 'bottom': + mpath, mpath_alt = bottom, top + elif fs == 'left': + mpath, mpath_alt = left, right + else: + mpath, mpath_alt = right, left + + rgbFace_alt = self._get_rgb_face(alt=True) + renderer.draw_markers(gc, mpath, transform, + path, path_trans, rgbFace) + renderer.draw_markers(gc, mpath_alt, transform, + path, path_trans, rgbFace_alt) + def _draw_star(self, renderer, gc, path, path_trans): - fs = self.get_fillstyle() - if fs!='full': - raise NotImplementedError('non-full markers have not been implemented for this marker style yet; please contribute') gc.set_snap(renderer.points_to_pixels(self._markersize) >= 5.0) offset = 0.5 * renderer.points_to_pixels(self._markersize) transform = Affine2D().scale(offset) + rgbFace = self._get_rgb_face() - _starpath = Path.unit_regular_star(5, innerCircle=0.381966) - renderer.draw_markers(gc, _starpath, transform, - path, path_trans, rgbFace) + fs = self.get_fillstyle() + + polypath = Path.unit_regular_star(5, innerCircle=0.381966) + + if fs == 'full': + renderer.draw_markers(gc, polypath, transform, + path, path_trans, rgbFace) + else: + verts = polypath.vertices + + top = Path(np.vstack((verts[0:4,:], verts[7:10,:], verts[0]))) + bottom = Path(np.vstack((verts[3:8,:], verts[3]))) + left = Path(np.vstack((verts[0:6,:], verts[0]))) + right = Path(np.vstack((verts[0], verts[5:10,:], verts[0]))) + + if fs == 'top': + mpath, mpath_alt = top, bottom + elif fs == 'bottom': + mpath, mpath_alt = bottom, top + elif fs == 'left': + mpath, mpath_alt = left, right + else: + mpath, mpath_alt = right, left + + rgbFace_alt = self._get_rgb_face(alt=True) + renderer.draw_markers(gc, mpath, transform, + path, path_trans, rgbFace) + renderer.draw_markers(gc, mpath_alt, transform, + path, path_trans, rgbFace_alt) def _draw_hexagon1(self, renderer, gc, path, path_trans): - fs = self.get_fillstyle() - if fs!='full': - raise NotImplementedError('non-full markers have not been implemented for this marker style yet; please contribute') gc.set_snap(renderer.points_to_pixels(self._markersize) >= 5.0) offset = 0.5 * renderer.points_to_pixels(self._markersize) transform = Affine2D().scale(offset) + rgbFace = self._get_rgb_face() - renderer.draw_markers(gc, Path.unit_regular_polygon(6), transform, - path, path_trans, rgbFace) + fs = self.get_fillstyle() + + polypath = Path.unit_regular_polygon(6) + + if fs == 'full': + renderer.draw_markers(gc, polypath, transform, + path, path_trans, rgbFace) + else: + verts = polypath.vertices + + # not drawing inside lines + x = abs(np.cos(5*np.pi/6.)) + top = Path(np.vstack(([-x,0],verts[(1,0,5),:],[x,0]))) + bottom = Path(np.vstack(([-x,0],verts[2:5,:],[x,0]))) + left = Path(verts[(0,1,2,3),:]) + right = Path(verts[(0,5,4,3),:]) + + if fs == 'top': + mpath, mpath_alt = top, bottom + elif fs == 'bottom': + mpath, mpath_alt = bottom, top + elif fs == 'left': + mpath, mpath_alt = left, right + else: + mpath, mpath_alt = right, left + + rgbFace_alt = self._get_rgb_face(alt=True) + renderer.draw_markers(gc, mpath, transform, + path, path_trans, rgbFace) + renderer.draw_markers(gc, mpath_alt, transform, + path, path_trans, rgbFace_alt) def _draw_hexagon2(self, renderer, gc, path, path_trans): - fs = self.get_fillstyle() - if fs!='full': - raise NotImplementedError('non-full markers have not been implemented for this marker style yet; please contribute') gc.set_snap(renderer.points_to_pixels(self._markersize) >= 5.0) offset = 0.5 * renderer.points_to_pixels(self._markersize) transform = Affine2D().scale(offset).rotate_deg(30) + rgbFace = self._get_rgb_face() - renderer.draw_markers(gc, Path.unit_regular_polygon(6), transform, - path, path_trans, rgbFace) + fs = self.get_fillstyle() + + polypath = Path.unit_regular_polygon(6) + + if fs == 'full': + renderer.draw_markers(gc, polypath, transform, + path, path_trans, rgbFace) + else: + verts = polypath.vertices + + # not drawing inside lines + x, y = np.sqrt(3)/4, 3/4. + top = Path(verts[(1,0,5,4,1),:]) + bottom = Path(verts[(1,2,3,4),:]) + left = Path(np.vstack(([x,y],verts[(0,1,2),:],[-x,-y],[x,y]))) + right = Path(np.vstack(([x,y],verts[(5,4,3),:],[-x,-y]))) + + if fs == 'top': + mpath, mpath_alt = top, bottom + elif fs == 'bottom': + mpath, mpath_alt = bottom, top + elif fs == 'left': + mpath, mpath_alt = left, right + else: + mpath, mpath_alt = right, left + + rgbFace_alt = self._get_rgb_face(alt=True) + renderer.draw_markers(gc, mpath, transform, + path, path_trans, rgbFace) + renderer.draw_markers(gc, mpath_alt, transform, + path, path_trans, rgbFace_alt) _line_marker_path = Path([[0.0, -1.0], [0.0, 1.0]]) @@ -1285,6 +1544,7 @@ self._color = other._color self._markersize = other._markersize self._markerfacecolor = other._markerfacecolor + self._markerfacecoloralt = other._markerfacecoloralt self._markeredgecolor = other._markeredgecolor self._markeredgewidth = other._markeredgewidth self._fillstyle = other._fillstyle @@ -1296,11 +1556,12 @@ self._linestyle = other._linestyle self._marker = other._marker + self._markerFunc = other._markerFunc self._drawstyle = other._drawstyle - def _get_rgb_face(self): - facecolor = self.get_markerfacecolor() + def _get_rgb_face(self, alt=False): + facecolor = self._get_markerfacecolor(alt=alt) if is_string_like(facecolor) and facecolor.lower()=='none': rgbFace = None else: @@ -1341,6 +1602,9 @@ 'alias for set_markerfacecolor' self.set_markerfacecolor(val) + def set_mfcalt(self, val): + 'alias for set_markerfacecoloralt' + self.set_markerfacecoloralt(val) def set_ms(self, val): 'alias for set_markersize' @@ -1379,6 +1643,9 @@ 'alias for get_markerfacecolor' return self.get_markerfacecolor() + def get_mfcalt(self, alt=False): + 'alias for get_markerfacecoloralt' + return self.get_markerfacecoloralt() def get_ms(self): 'alias for get_markersize' @@ -1547,9 +1814,10 @@ lineStyles = Line2D._lineStyles lineMarkers = Line2D._markers drawStyles = Line2D.drawStyles +fillStyles = Line2D.fillStyles -artist.kwdocd['Line2D'] = artist.kwdoc(Line2D) +docstring.interpd.update(Line2D = artist.kwdoc(Line2D)) # You can not set the docstring of an instancemethod, # but you can on the underlying function. Go figure. -Line2D.__init__.im_func.__doc__ = dedent(Line2D.__init__.__doc__) % artist.kwdocd +docstring.dedent_interpd(Line2D.__init__.im_func) diff -Nru matplotlib-0.99.3/lib/matplotlib/_mathtext_data.py matplotlib-1.0.1/lib/matplotlib/_mathtext_data.py --- matplotlib-0.99.3/lib/matplotlib/_mathtext_data.py 2010-03-09 14:20:20.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/_mathtext_data.py 2010-07-07 01:41:52.000000000 +0000 @@ -15,123 +15,123 @@ """ latex_to_bakoma = { - r'\oint' : ('cmex10', 45), - r'\bigodot' : ('cmex10', 50), - r'\bigoplus' : ('cmex10', 55), - r'\bigotimes' : ('cmex10', 59), - r'\sum' : ('cmex10', 51), - r'\prod' : ('cmex10', 24), - r'\int' : ('cmex10', 56), - r'\bigcup' : ('cmex10', 28), - r'\bigcap' : ('cmex10', 60), - r'\biguplus' : ('cmex10', 32), - r'\bigwedge' : ('cmex10', 4), - r'\bigvee' : ('cmex10', 37), - r'\coprod' : ('cmex10', 42), - r'\__sqrt__' : ('cmex10', 48), - r'\leftbrace' : ('cmex10', 92), - r'{' : ('cmex10', 92), - r'\{' : ('cmex10', 92), - r'\rightbrace' : ('cmex10', 130), - r'}' : ('cmex10', 130), - r'\}' : ('cmex10', 130), - r'\leftangle' : ('cmex10', 97), - r'\rightangle' : ('cmex10', 64), - r'\langle' : ('cmex10', 97), - r'\rangle' : ('cmex10', 64), - r'\widehat' : ('cmex10', 15), - r'\widetilde' : ('cmex10', 52), - r'\widebar' : ('cmr10', 131), + r'\oint' : ('cmex10', 45), + r'\bigodot' : ('cmex10', 50), + r'\bigoplus' : ('cmex10', 55), + r'\bigotimes' : ('cmex10', 59), + r'\sum' : ('cmex10', 51), + r'\prod' : ('cmex10', 24), + r'\int' : ('cmex10', 56), + r'\bigcup' : ('cmex10', 28), + r'\bigcap' : ('cmex10', 60), + r'\biguplus' : ('cmex10', 32), + r'\bigwedge' : ('cmex10', 4), + r'\bigvee' : ('cmex10', 37), + r'\coprod' : ('cmex10', 42), + r'\__sqrt__' : ('cmex10', 48), + r'\leftbrace' : ('cmex10', 92), + r'{' : ('cmex10', 92), + r'\{' : ('cmex10', 92), + r'\rightbrace' : ('cmex10', 130), + r'}' : ('cmex10', 130), + r'\}' : ('cmex10', 130), + r'\leftangle' : ('cmex10', 97), + r'\rightangle' : ('cmex10', 64), + r'\langle' : ('cmex10', 97), + r'\rangle' : ('cmex10', 64), + r'\widehat' : ('cmex10', 15), + r'\widetilde' : ('cmex10', 52), + r'\widebar' : ('cmr10', 131), - r'\omega' : ('cmmi10', 29), - r'\varepsilon' : ('cmmi10', 20), - r'\vartheta' : ('cmmi10', 22), - r'\varrho' : ('cmmi10', 61), - r'\varsigma' : ('cmmi10', 41), - r'\varphi' : ('cmmi10', 6), - r'\leftharpoonup' : ('cmmi10', 108), - r'\leftharpoondown' : ('cmmi10', 68), - r'\rightharpoonup' : ('cmmi10', 117), - r'\rightharpoondown' : ('cmmi10', 77), - r'\triangleright' : ('cmmi10', 130), - r'\triangleleft' : ('cmmi10', 89), - r'.' : ('cmmi10', 51), - r',' : ('cmmi10', 44), - r'<' : ('cmmi10', 99), - r'/' : ('cmmi10', 98), - r'>' : ('cmmi10', 107), - r'\flat' : ('cmmi10', 131), - r'\natural' : ('cmmi10', 90), - r'\sharp' : ('cmmi10', 50), - r'\smile' : ('cmmi10', 97), - r'\frown' : ('cmmi10', 58), - r'\ell' : ('cmmi10', 102), - r'\imath' : ('cmmi10', 8), - r'\jmath' : ('cmmi10', 65), - r'\wp' : ('cmmi10', 14), - r'\alpha' : ('cmmi10', 13), - r'\beta' : ('cmmi10', 35), - r'\gamma' : ('cmmi10', 24), - r'\delta' : ('cmmi10', 38), - r'\epsilon' : ('cmmi10', 54), - r'\zeta' : ('cmmi10', 10), - r'\eta' : ('cmmi10', 5), - r'\theta' : ('cmmi10', 18), - r'\iota' : ('cmmi10', 28), - r'\lambda' : ('cmmi10', 9), - r'\mu' : ('cmmi10', 32), - r'\nu' : ('cmmi10', 34), - r'\xi' : ('cmmi10', 7), - r'\pi' : ('cmmi10', 36), - r'\kappa' : ('cmmi10', 30), - r'\rho' : ('cmmi10', 39), - r'\sigma' : ('cmmi10', 21), - r'\tau' : ('cmmi10', 43), - r'\upsilon' : ('cmmi10', 25), - r'\phi' : ('cmmi10', 42), - r'\chi' : ('cmmi10', 17), - r'\psi' : ('cmmi10', 31), - r'|' : ('cmsy10', 47), - r'\|' : ('cmsy10', 47), - r'(' : ('cmr10', 119), - r'\leftparen' : ('cmr10', 119), - r'\rightparen' : ('cmr10', 68), - r')' : ('cmr10', 68), - r'+' : ('cmr10', 76), - r'0' : ('cmr10', 40), - r'1' : ('cmr10', 100), - r'2' : ('cmr10', 49), - r'3' : ('cmr10', 110), - r'4' : ('cmr10', 59), - r'5' : ('cmr10', 120), - r'6' : ('cmr10', 69), - r'7' : ('cmr10', 127), - r'8' : ('cmr10', 77), - r'9' : ('cmr10', 22), - r':' : ('cmr10', 85), - r';' : ('cmr10', 31), - r'=' : ('cmr10', 41), - r'\leftbracket' : ('cmr10', 62), - r'[' : ('cmr10', 62), - r'\rightbracket' : ('cmr10', 72), - r']' : ('cmr10', 72), - r'\%' : ('cmr10', 48), - r'%' : ('cmr10', 48), - r'\$' : ('cmr10', 99), - r'@' : ('cmr10', 111), - r'\#' : ('cmr10', 39), - r'\_' : ('cmtt10', 79), - r'\Gamma' : ('cmr10', 19), - r'\Delta' : ('cmr10', 6), - r'\Theta' : ('cmr10', 7), - r'\Lambda' : ('cmr10', 14), - r'\Xi' : ('cmr10', 3), - r'\Pi' : ('cmr10', 17), - r'\Sigma' : ('cmr10', 10), - r'\Upsilon' : ('cmr10', 11), - r'\Phi' : ('cmr10', 9), - r'\Psi' : ('cmr10', 15), - r'\Omega' : ('cmr10', 12), + r'\omega' : ('cmmi10', 29), + r'\varepsilon' : ('cmmi10', 20), + r'\vartheta' : ('cmmi10', 22), + r'\varrho' : ('cmmi10', 61), + r'\varsigma' : ('cmmi10', 41), + r'\varphi' : ('cmmi10', 6), + r'\leftharpoonup' : ('cmmi10', 108), + r'\leftharpoondown' : ('cmmi10', 68), + r'\rightharpoonup' : ('cmmi10', 117), + r'\rightharpoondown' : ('cmmi10', 77), + r'\triangleright' : ('cmmi10', 130), + r'\triangleleft' : ('cmmi10', 89), + r'.' : ('cmmi10', 51), + r',' : ('cmmi10', 44), + r'<' : ('cmmi10', 99), + r'/' : ('cmmi10', 98), + r'>' : ('cmmi10', 107), + r'\flat' : ('cmmi10', 131), + r'\natural' : ('cmmi10', 90), + r'\sharp' : ('cmmi10', 50), + r'\smile' : ('cmmi10', 97), + r'\frown' : ('cmmi10', 58), + r'\ell' : ('cmmi10', 102), + r'\imath' : ('cmmi10', 8), + r'\jmath' : ('cmmi10', 65), + r'\wp' : ('cmmi10', 14), + r'\alpha' : ('cmmi10', 13), + r'\beta' : ('cmmi10', 35), + r'\gamma' : ('cmmi10', 24), + r'\delta' : ('cmmi10', 38), + r'\epsilon' : ('cmmi10', 54), + r'\zeta' : ('cmmi10', 10), + r'\eta' : ('cmmi10', 5), + r'\theta' : ('cmmi10', 18), + r'\iota' : ('cmmi10', 28), + r'\lambda' : ('cmmi10', 9), + r'\mu' : ('cmmi10', 32), + r'\nu' : ('cmmi10', 34), + r'\xi' : ('cmmi10', 7), + r'\pi' : ('cmmi10', 36), + r'\kappa' : ('cmmi10', 30), + r'\rho' : ('cmmi10', 39), + r'\sigma' : ('cmmi10', 21), + r'\tau' : ('cmmi10', 43), + r'\upsilon' : ('cmmi10', 25), + r'\phi' : ('cmmi10', 42), + r'\chi' : ('cmmi10', 17), + r'\psi' : ('cmmi10', 31), + r'|' : ('cmsy10', 47), + r'\|' : ('cmsy10', 47), + r'(' : ('cmr10', 119), + r'\leftparen' : ('cmr10', 119), + r'\rightparen' : ('cmr10', 68), + r')' : ('cmr10', 68), + r'+' : ('cmr10', 76), + r'0' : ('cmr10', 40), + r'1' : ('cmr10', 100), + r'2' : ('cmr10', 49), + r'3' : ('cmr10', 110), + r'4' : ('cmr10', 59), + r'5' : ('cmr10', 120), + r'6' : ('cmr10', 69), + r'7' : ('cmr10', 127), + r'8' : ('cmr10', 77), + r'9' : ('cmr10', 22), + r' :' : ('cmr10', 85), + r';' : ('cmr10', 31), + r'=' : ('cmr10', 41), + r'\leftbracket' : ('cmr10', 62), + r'[' : ('cmr10', 62), + r'\rightbracket' : ('cmr10', 72), + r']' : ('cmr10', 72), + r'\%' : ('cmr10', 48), + r'%' : ('cmr10', 48), + r'\$' : ('cmr10', 99), + r'@' : ('cmr10', 111), + r'\#' : ('cmr10', 39), + r'\_' : ('cmtt10', 79), + r'\Gamma' : ('cmr10', 19), + r'\Delta' : ('cmr10', 6), + r'\Theta' : ('cmr10', 7), + r'\Lambda' : ('cmr10', 14), + r'\Xi' : ('cmr10', 3), + r'\Pi' : ('cmr10', 17), + r'\Sigma' : ('cmr10', 10), + r'\Upsilon' : ('cmr10', 11), + r'\Phi' : ('cmr10', 9), + r'\Psi' : ('cmr10', 15), + r'\Omega' : ('cmr10', 12), # these are mathml names, I think. I'm just using them for the # tex methods noted @@ -145,107 +145,107 @@ r'\combiningrightarrowabove' : ('cmmi10', 110), # for \vec r'\combiningdotabove' : ('cmr10', 26), # for \dot - r'\leftarrow' : ('cmsy10', 10), - r'\uparrow' : ('cmsy10', 25), - r'\downarrow' : ('cmsy10', 28), - r'\leftrightarrow' : ('cmsy10', 24), - r'\nearrow' : ('cmsy10', 99), - r'\searrow' : ('cmsy10', 57), - r'\simeq' : ('cmsy10', 108), - r'\Leftarrow' : ('cmsy10', 104), - r'\Rightarrow' : ('cmsy10', 112), - r'\Uparrow' : ('cmsy10', 60), - r'\Downarrow' : ('cmsy10', 68), - r'\Leftrightarrow' : ('cmsy10', 51), - r'\nwarrow' : ('cmsy10', 65), - r'\swarrow' : ('cmsy10', 116), - r'\propto' : ('cmsy10', 15), - r'\prime' : ('cmsy10', 73), - r"'" : ('cmsy10', 73), - r'\infty' : ('cmsy10', 32), - r'\in' : ('cmsy10', 59), - r'\ni' : ('cmsy10', 122), - r'\bigtriangleup' : ('cmsy10', 80), - r'\bigtriangledown' : ('cmsy10', 132), - r'\slash' : ('cmsy10', 87), - r'\forall' : ('cmsy10', 21), - r'\exists' : ('cmsy10', 5), - r'\neg' : ('cmsy10', 20), - r'\emptyset' : ('cmsy10', 33), - r'\Re' : ('cmsy10', 95), - r'\Im' : ('cmsy10', 52), - r'\top' : ('cmsy10', 100), - r'\bot' : ('cmsy10', 11), - r'\aleph' : ('cmsy10', 26), - r'\cup' : ('cmsy10', 6), - r'\cap' : ('cmsy10', 19), - r'\uplus' : ('cmsy10', 58), - r'\wedge' : ('cmsy10', 43), - r'\vee' : ('cmsy10', 96), - r'\vdash' : ('cmsy10', 109), - r'\dashv' : ('cmsy10', 66), - r'\lfloor' : ('cmsy10', 117), - r'\rfloor' : ('cmsy10', 74), - r'\lceil' : ('cmsy10', 123), - r'\rceil' : ('cmsy10', 81), - r'\lbrace' : ('cmsy10', 92), - r'\rbrace' : ('cmsy10', 105), - r'\mid' : ('cmsy10', 47), - r'\vert' : ('cmsy10', 47), - r'\Vert' : ('cmsy10', 44), - r'\updownarrow' : ('cmsy10', 94), - r'\Updownarrow' : ('cmsy10', 53), - r'\backslash' : ('cmsy10', 126), - r'\wr' : ('cmsy10', 101), - r'\nabla' : ('cmsy10', 110), - r'\sqcup' : ('cmsy10', 67), - r'\sqcap' : ('cmsy10', 118), - r'\sqsubseteq' : ('cmsy10', 75), - r'\sqsupseteq' : ('cmsy10', 124), - r'\S' : ('cmsy10', 129), - r'\dag' : ('cmsy10', 71), - r'\ddag' : ('cmsy10', 127), - r'\P' : ('cmsy10', 130), - r'\clubsuit' : ('cmsy10', 18), - r'\diamondsuit' : ('cmsy10', 34), - r'\heartsuit' : ('cmsy10', 22), - r'-' : ('cmsy10', 17), - r'\cdot' : ('cmsy10', 78), - r'\times' : ('cmsy10', 13), - r'*' : ('cmsy10', 9), - r'\ast' : ('cmsy10', 9), - r'\div' : ('cmsy10', 31), - r'\diamond' : ('cmsy10', 48), - r'\pm' : ('cmsy10', 8), - r'\mp' : ('cmsy10', 98), - r'\oplus' : ('cmsy10', 16), - r'\ominus' : ('cmsy10', 56), - r'\otimes' : ('cmsy10', 30), - r'\oslash' : ('cmsy10', 107), - r'\odot' : ('cmsy10', 64), - r'\bigcirc' : ('cmsy10', 115), - r'\circ' : ('cmsy10', 72), - r'\bullet' : ('cmsy10', 84), - r'\asymp' : ('cmsy10', 121), - r'\equiv' : ('cmsy10', 35), - r'\subseteq' : ('cmsy10', 103), - r'\supseteq' : ('cmsy10', 42), - r'\leq' : ('cmsy10', 14), - r'\geq' : ('cmsy10', 29), - r'\preceq' : ('cmsy10', 79), - r'\succeq' : ('cmsy10', 131), - r'\sim' : ('cmsy10', 27), - r'\approx' : ('cmsy10', 23), - r'\subset' : ('cmsy10', 50), - r'\supset' : ('cmsy10', 86), - r'\ll' : ('cmsy10', 85), - r'\gg' : ('cmsy10', 40), - r'\prec' : ('cmsy10', 93), - r'\succ' : ('cmsy10', 49), - r'\rightarrow' : ('cmsy10', 12), - r'\to' : ('cmsy10', 12), - r'\spadesuit' : ('cmsy10', 7), - } + r'\leftarrow' : ('cmsy10', 10), + r'\uparrow' : ('cmsy10', 25), + r'\downarrow' : ('cmsy10', 28), + r'\leftrightarrow' : ('cmsy10', 24), + r'\nearrow' : ('cmsy10', 99), + r'\searrow' : ('cmsy10', 57), + r'\simeq' : ('cmsy10', 108), + r'\Leftarrow' : ('cmsy10', 104), + r'\Rightarrow' : ('cmsy10', 112), + r'\Uparrow' : ('cmsy10', 60), + r'\Downarrow' : ('cmsy10', 68), + r'\Leftrightarrow' : ('cmsy10', 51), + r'\nwarrow' : ('cmsy10', 65), + r'\swarrow' : ('cmsy10', 116), + r'\propto' : ('cmsy10', 15), + r'\prime' : ('cmsy10', 73), + r"'" : ('cmsy10', 73), + r'\infty' : ('cmsy10', 32), + r'\in' : ('cmsy10', 59), + r'\ni' : ('cmsy10', 122), + r'\bigtriangleup' : ('cmsy10', 80), + r'\bigtriangledown' : ('cmsy10', 132), + r'\slash' : ('cmsy10', 87), + r'\forall' : ('cmsy10', 21), + r'\exists' : ('cmsy10', 5), + r'\neg' : ('cmsy10', 20), + r'\emptyset' : ('cmsy10', 33), + r'\Re' : ('cmsy10', 95), + r'\Im' : ('cmsy10', 52), + r'\top' : ('cmsy10', 100), + r'\bot' : ('cmsy10', 11), + r'\aleph' : ('cmsy10', 26), + r'\cup' : ('cmsy10', 6), + r'\cap' : ('cmsy10', 19), + r'\uplus' : ('cmsy10', 58), + r'\wedge' : ('cmsy10', 43), + r'\vee' : ('cmsy10', 96), + r'\vdash' : ('cmsy10', 109), + r'\dashv' : ('cmsy10', 66), + r'\lfloor' : ('cmsy10', 117), + r'\rfloor' : ('cmsy10', 74), + r'\lceil' : ('cmsy10', 123), + r'\rceil' : ('cmsy10', 81), + r'\lbrace' : ('cmsy10', 92), + r'\rbrace' : ('cmsy10', 105), + r'\mid' : ('cmsy10', 47), + r'\vert' : ('cmsy10', 47), + r'\Vert' : ('cmsy10', 44), + r'\updownarrow' : ('cmsy10', 94), + r'\Updownarrow' : ('cmsy10', 53), + r'\backslash' : ('cmsy10', 126), + r'\wr' : ('cmsy10', 101), + r'\nabla' : ('cmsy10', 110), + r'\sqcup' : ('cmsy10', 67), + r'\sqcap' : ('cmsy10', 118), + r'\sqsubseteq' : ('cmsy10', 75), + r'\sqsupseteq' : ('cmsy10', 124), + r'\S' : ('cmsy10', 129), + r'\dag' : ('cmsy10', 71), + r'\ddag' : ('cmsy10', 127), + r'\P' : ('cmsy10', 130), + r'\clubsuit' : ('cmsy10', 18), + r'\diamondsuit' : ('cmsy10', 34), + r'\heartsuit' : ('cmsy10', 22), + r'-' : ('cmsy10', 17), + r'\cdot' : ('cmsy10', 78), + r'\times' : ('cmsy10', 13), + r'*' : ('cmsy10', 9), + r'\ast' : ('cmsy10', 9), + r'\div' : ('cmsy10', 31), + r'\diamond' : ('cmsy10', 48), + r'\pm' : ('cmsy10', 8), + r'\mp' : ('cmsy10', 98), + r'\oplus' : ('cmsy10', 16), + r'\ominus' : ('cmsy10', 56), + r'\otimes' : ('cmsy10', 30), + r'\oslash' : ('cmsy10', 107), + r'\odot' : ('cmsy10', 64), + r'\bigcirc' : ('cmsy10', 115), + r'\circ' : ('cmsy10', 72), + r'\bullet' : ('cmsy10', 84), + r'\asymp' : ('cmsy10', 121), + r'\equiv' : ('cmsy10', 35), + r'\subseteq' : ('cmsy10', 103), + r'\supseteq' : ('cmsy10', 42), + r'\leq' : ('cmsy10', 14), + r'\geq' : ('cmsy10', 29), + r'\preceq' : ('cmsy10', 79), + r'\succeq' : ('cmsy10', 131), + r'\sim' : ('cmsy10', 27), + r'\approx' : ('cmsy10', 23), + r'\subset' : ('cmsy10', 50), + r'\supset' : ('cmsy10', 86), + r'\ll' : ('cmsy10', 85), + r'\gg' : ('cmsy10', 40), + r'\prec' : ('cmsy10', 93), + r'\succ' : ('cmsy10', 49), + r'\rightarrow' : ('cmsy10', 12), + r'\to' : ('cmsy10', 12), + r'\spadesuit' : ('cmsy10', 7), +} latex_to_cmex = { r'\__sqrt__' : 112, @@ -271,139 +271,139 @@ } latex_to_standard = { - r'\cong' : ('psyr', 64), - r'\Delta' : ('psyr', 68), - r'\Phi' : ('psyr', 70), - r'\Gamma' : ('psyr', 89), - r'\alpha' : ('psyr', 97), - r'\beta' : ('psyr', 98), - r'\chi' : ('psyr', 99), - r'\delta' : ('psyr', 100), - r'\varepsilon' : ('psyr', 101), - r'\phi' : ('psyr', 102), - r'\gamma' : ('psyr', 103), - r'\eta' : ('psyr', 104), - r'\iota' : ('psyr', 105), - r'\varpsi' : ('psyr', 106), - r'\kappa' : ('psyr', 108), - r'\nu' : ('psyr', 110), - r'\pi' : ('psyr', 112), - r'\theta' : ('psyr', 113), - r'\rho' : ('psyr', 114), - r'\sigma' : ('psyr', 115), - r'\tau' : ('psyr', 116), - r'\upsilon' : ('psyr', 117), - r'\varpi' : ('psyr', 118), - r'\omega' : ('psyr', 119), - r'\xi' : ('psyr', 120), - r'\psi' : ('psyr', 121), - r'\zeta' : ('psyr', 122), - r'\sim' : ('psyr', 126), - r'\leq' : ('psyr', 163), - r'\infty' : ('psyr', 165), - r'\clubsuit' : ('psyr', 167), - r'\diamondsuit' : ('psyr', 168), - r'\heartsuit' : ('psyr', 169), - r'\spadesuit' : ('psyr', 170), - r'\leftrightarrow' : ('psyr', 171), - r'\leftarrow' : ('psyr', 172), - r'\uparrow' : ('psyr', 173), - r'\rightarrow' : ('psyr', 174), - r'\downarrow' : ('psyr', 175), - r'\pm' : ('psyr', 176), - r'\geq' : ('psyr', 179), - r'\times' : ('psyr', 180), - r'\propto' : ('psyr', 181), - r'\partial' : ('psyr', 182), - r'\bullet' : ('psyr', 183), - r'\div' : ('psyr', 184), - r'\neq' : ('psyr', 185), - r'\equiv' : ('psyr', 186), - r'\approx' : ('psyr', 187), - r'\ldots' : ('psyr', 188), - r'\aleph' : ('psyr', 192), - r'\Im' : ('psyr', 193), - r'\Re' : ('psyr', 194), - r'\wp' : ('psyr', 195), - r'\otimes' : ('psyr', 196), - r'\oplus' : ('psyr', 197), - r'\oslash' : ('psyr', 198), - r'\cap' : ('psyr', 199), - r'\cup' : ('psyr', 200), - r'\supset' : ('psyr', 201), - r'\supseteq' : ('psyr', 202), - r'\subset' : ('psyr', 204), - r'\subseteq' : ('psyr', 205), - r'\in' : ('psyr', 206), - r'\notin' : ('psyr', 207), - r'\angle' : ('psyr', 208), - r'\nabla' : ('psyr', 209), - r'\textregistered' : ('psyr', 210), - r'\copyright' : ('psyr', 211), - r'\texttrademark' : ('psyr', 212), - r'\Pi' : ('psyr', 213), - r'\prod' : ('psyr', 213), - r'\surd' : ('psyr', 214), - r'\__sqrt__' : ('psyr', 214), - r'\cdot' : ('psyr', 215), - r'\urcorner' : ('psyr', 216), - r'\vee' : ('psyr', 217), - r'\wedge' : ('psyr', 218), - r'\Leftrightarrow' : ('psyr', 219), - r'\Leftarrow' : ('psyr', 220), - r'\Uparrow' : ('psyr', 221), - r'\Rightarrow' : ('psyr', 222), - r'\Downarrow' : ('psyr', 223), - r'\Diamond' : ('psyr', 224), - r'\langle' : ('psyr', 225), - r'\Sigma' : ('psyr', 229), - r'\sum' : ('psyr', 229), - r'\forall' : ('psyr', 34), - r'\exists' : ('psyr', 36), - r'\lceil' : ('psyr', 233), - r'\lbrace' : ('psyr', 123), - r'\Psi' : ('psyr', 89), - r'\bot' : ('psyr', 0136), - r'\Omega' : ('psyr', 0127), - r'\leftbracket' : ('psyr', 0133), - r'\rightbracket' : ('psyr', 0135), - r'\leftbrace' : ('psyr', 123), - r'\leftparen' : ('psyr', 050), - r'\prime' : ('psyr', 0242), - r'\sharp' : ('psyr', 043), - r'\slash' : ('psyr', 057), - r'\Lamda' : ('psyr', 0114), - r'\neg' : ('psyr', 0330), - r'\Upsilon' : ('psyr', 0241), - r'\rightbrace' : ('psyr', 0175), - r'\rfloor' : ('psyr', 0373), - r'\lambda' : ('psyr', 0154), - r'\to' : ('psyr', 0256), - r'\Xi' : ('psyr', 0130), - r'\emptyset' : ('psyr', 0306), - r'\lfloor' : ('psyr', 0353), - r'\rightparen' : ('psyr', 051), - r'\rceil' : ('psyr', 0371), - r'\ni' : ('psyr', 047), - r'\epsilon' : ('psyr', 0145), - r'\Theta' : ('psyr', 0121), - r'\langle' : ('psyr', 0341), - r'\leftangle' : ('psyr', 0341), - r'\rangle' : ('psyr', 0361), - r'\rightangle' : ('psyr', 0361), - r'\rbrace' : ('psyr', 0175), - r'\circ' : ('psyr', 0260), - r'\diamond' : ('psyr', 0340), - r'\mu' : ('psyr', 0155), - r'\mid' : ('psyr', 0352), - r'\imath' : ('pncri8a', 105), - r'\%' : ('pncr8a', 37), - r'\$' : ('pncr8a', 36), - r'\{' : ('pncr8a', 123), - r'\}' : ('pncr8a', 125), - r'\backslash' : ('pncr8a', 92), - r'\ast' : ('pncr8a', 42), - r'\#' : ('pncr8a', 35), + r'\cong' : ('psyr', 64), + r'\Delta' : ('psyr', 68), + r'\Phi' : ('psyr', 70), + r'\Gamma' : ('psyr', 89), + r'\alpha' : ('psyr', 97), + r'\beta' : ('psyr', 98), + r'\chi' : ('psyr', 99), + r'\delta' : ('psyr', 100), + r'\varepsilon' : ('psyr', 101), + r'\phi' : ('psyr', 102), + r'\gamma' : ('psyr', 103), + r'\eta' : ('psyr', 104), + r'\iota' : ('psyr', 105), + r'\varpsi' : ('psyr', 106), + r'\kappa' : ('psyr', 108), + r'\nu' : ('psyr', 110), + r'\pi' : ('psyr', 112), + r'\theta' : ('psyr', 113), + r'\rho' : ('psyr', 114), + r'\sigma' : ('psyr', 115), + r'\tau' : ('psyr', 116), + r'\upsilon' : ('psyr', 117), + r'\varpi' : ('psyr', 118), + r'\omega' : ('psyr', 119), + r'\xi' : ('psyr', 120), + r'\psi' : ('psyr', 121), + r'\zeta' : ('psyr', 122), + r'\sim' : ('psyr', 126), + r'\leq' : ('psyr', 163), + r'\infty' : ('psyr', 165), + r'\clubsuit' : ('psyr', 167), + r'\diamondsuit' : ('psyr', 168), + r'\heartsuit' : ('psyr', 169), + r'\spadesuit' : ('psyr', 170), + r'\leftrightarrow' : ('psyr', 171), + r'\leftarrow' : ('psyr', 172), + r'\uparrow' : ('psyr', 173), + r'\rightarrow' : ('psyr', 174), + r'\downarrow' : ('psyr', 175), + r'\pm' : ('psyr', 176), + r'\geq' : ('psyr', 179), + r'\times' : ('psyr', 180), + r'\propto' : ('psyr', 181), + r'\partial' : ('psyr', 182), + r'\bullet' : ('psyr', 183), + r'\div' : ('psyr', 184), + r'\neq' : ('psyr', 185), + r'\equiv' : ('psyr', 186), + r'\approx' : ('psyr', 187), + r'\ldots' : ('psyr', 188), + r'\aleph' : ('psyr', 192), + r'\Im' : ('psyr', 193), + r'\Re' : ('psyr', 194), + r'\wp' : ('psyr', 195), + r'\otimes' : ('psyr', 196), + r'\oplus' : ('psyr', 197), + r'\oslash' : ('psyr', 198), + r'\cap' : ('psyr', 199), + r'\cup' : ('psyr', 200), + r'\supset' : ('psyr', 201), + r'\supseteq' : ('psyr', 202), + r'\subset' : ('psyr', 204), + r'\subseteq' : ('psyr', 205), + r'\in' : ('psyr', 206), + r'\notin' : ('psyr', 207), + r'\angle' : ('psyr', 208), + r'\nabla' : ('psyr', 209), + r'\textregistered' : ('psyr', 210), + r'\copyright' : ('psyr', 211), + r'\texttrademark' : ('psyr', 212), + r'\Pi' : ('psyr', 213), + r'\prod' : ('psyr', 213), + r'\surd' : ('psyr', 214), + r'\__sqrt__' : ('psyr', 214), + r'\cdot' : ('psyr', 215), + r'\urcorner' : ('psyr', 216), + r'\vee' : ('psyr', 217), + r'\wedge' : ('psyr', 218), + r'\Leftrightarrow' : ('psyr', 219), + r'\Leftarrow' : ('psyr', 220), + r'\Uparrow' : ('psyr', 221), + r'\Rightarrow' : ('psyr', 222), + r'\Downarrow' : ('psyr', 223), + r'\Diamond' : ('psyr', 224), + r'\langle' : ('psyr', 225), + r'\Sigma' : ('psyr', 229), + r'\sum' : ('psyr', 229), + r'\forall' : ('psyr', 34), + r'\exists' : ('psyr', 36), + r'\lceil' : ('psyr', 233), + r'\lbrace' : ('psyr', 123), + r'\Psi' : ('psyr', 89), + r'\bot' : ('psyr', 0136), + r'\Omega' : ('psyr', 0127), + r'\leftbracket' : ('psyr', 0133), + r'\rightbracket' : ('psyr', 0135), + r'\leftbrace' : ('psyr', 123), + r'\leftparen' : ('psyr', 050), + r'\prime' : ('psyr', 0242), + r'\sharp' : ('psyr', 043), + r'\slash' : ('psyr', 057), + r'\Lamda' : ('psyr', 0114), + r'\neg' : ('psyr', 0330), + r'\Upsilon' : ('psyr', 0241), + r'\rightbrace' : ('psyr', 0175), + r'\rfloor' : ('psyr', 0373), + r'\lambda' : ('psyr', 0154), + r'\to' : ('psyr', 0256), + r'\Xi' : ('psyr', 0130), + r'\emptyset' : ('psyr', 0306), + r'\lfloor' : ('psyr', 0353), + r'\rightparen' : ('psyr', 051), + r'\rceil' : ('psyr', 0371), + r'\ni' : ('psyr', 047), + r'\epsilon' : ('psyr', 0145), + r'\Theta' : ('psyr', 0121), + r'\langle' : ('psyr', 0341), + r'\leftangle' : ('psyr', 0341), + r'\rangle' : ('psyr', 0361), + r'\rightangle' : ('psyr', 0361), + r'\rbrace' : ('psyr', 0175), + r'\circ' : ('psyr', 0260), + r'\diamond' : ('psyr', 0340), + r'\mu' : ('psyr', 0155), + r'\mid' : ('psyr', 0352), + r'\imath' : ('pncri8a', 105), + r'\%' : ('pncr8a', 37), + r'\$' : ('pncr8a', 36), + r'\{' : ('pncr8a', 123), + r'\}' : ('pncr8a', 125), + r'\backslash' : ('pncr8a', 92), + r'\ast' : ('pncr8a', 42), + r'\#' : ('pncr8a', 35), r'\circumflexaccent' : ('pncri8a', 124), # for \hat r'\combiningbreve' : ('pncri8a', 81), # for \breve @@ -417,1909 +417,1911 @@ # Automatically generated. -type12uni = {'uni24C8': 9416, -'aring': 229, -'uni22A0': 8864, -'uni2292': 8850, -'quotedblright': 8221, -'uni03D2': 978, -'uni2215': 8725, -'uni03D0': 976, -'V': 86, -'dollar': 36, -'uni301E': 12318, -'uni03D5': 981, -'four': 52, -'uni25A0': 9632, -'uni013C': 316, -'uni013B': 315, -'uni013E': 318, -'Yacute': 221, -'uni25DE': 9694, -'uni013F': 319, -'uni255A': 9562, -'uni2606': 9734, -'uni0180': 384, -'uni22B7': 8887, -'uni044F': 1103, -'uni22B5': 8885, -'uni22B4': 8884, -'uni22AE': 8878, -'uni22B2': 8882, -'uni22B1': 8881, -'uni22B0': 8880, -'uni25CD': 9677, -'uni03CE': 974, -'uni03CD': 973, -'uni03CC': 972, -'uni03CB': 971, -'uni03CA': 970, -'uni22B8': 8888, -'uni22C9': 8905, -'uni0449': 1097, -'uni20DD': 8413, -'uni20DC': 8412, -'uni20DB': 8411, -'uni2231': 8753, -'uni25CF': 9679, -'uni306E': 12398, -'uni03D1': 977, -'uni01A1': 417, -'uni20D7': 8407, -'uni03D6': 982, -'uni2233': 8755, -'uni20D2': 8402, -'uni20D1': 8401, -'uni20D0': 8400, -'P': 80, -'uni22BE': 8894, -'uni22BD': 8893, -'uni22BC': 8892, -'uni22BB': 8891, -'underscore': 95, -'uni03C8': 968, -'uni03C7': 967, -'uni0328': 808, -'uni03C5': 965, -'uni03C4': 964, -'uni03C3': 963, -'uni03C2': 962, -'uni03C1': 961, -'uni03C0': 960, -'uni2010': 8208, -'uni0130': 304, -'uni0133': 307, -'uni0132': 306, -'uni0135': 309, -'uni0134': 308, -'uni0137': 311, -'uni0136': 310, -'uni0139': 313, -'uni0138': 312, -'uni2244': 8772, -'uni229A': 8858, -'uni2571': 9585, -'uni0278': 632, -'uni2239': 8761, -'p': 112, -'uni3019': 12313, -'uni25CB': 9675, -'uni03DB': 987, -'uni03DC': 988, -'uni03DA': 986, -'uni03DF': 991, -'uni03DD': 989, -'uni013D': 317, -'uni220A': 8714, -'uni220C': 8716, -'uni220B': 8715, -'uni220E': 8718, -'uni220D': 8717, -'uni220F': 8719, -'uni22CC': 8908, -'Otilde': 213, -'uni25E5': 9701, -'uni2736': 10038, -'perthousand': 8240, -'zero': 48, -'uni279B': 10139, -'dotlessi': 305, -'uni2279': 8825, -'Scaron': 352, -'zcaron': 382, -'uni21D8': 8664, -'egrave': 232, -'uni0271': 625, -'uni01AA': 426, -'uni2332': 9010, -'section': 167, -'uni25E4': 9700, -'Icircumflex': 206, -'ntilde': 241, -'uni041E': 1054, -'ampersand': 38, -'uni041C': 1052, -'uni041A': 1050, -'uni22AB': 8875, -'uni21DB': 8667, -'dotaccent': 729, -'uni0416': 1046, -'uni0417': 1047, -'uni0414': 1044, -'uni0415': 1045, -'uni0412': 1042, -'uni0413': 1043, -'degree': 176, -'uni0411': 1041, -'K': 75, -'uni25EB': 9707, -'uni25EF': 9711, -'uni0418': 1048, -'uni0419': 1049, -'uni2263': 8803, -'uni226E': 8814, -'uni2251': 8785, -'uni02C8': 712, -'uni2262': 8802, -'acircumflex': 226, -'uni22B3': 8883, -'uni2261': 8801, -'uni2394': 9108, -'Aring': 197, -'uni2260': 8800, -'uni2254': 8788, -'uni0436': 1078, -'uni2267': 8807, -'k': 107, -'uni22C8': 8904, -'uni226A': 8810, -'uni231F': 8991, -'smalltilde': 732, -'uni2201': 8705, -'uni2200': 8704, -'uni2203': 8707, -'uni02BD': 701, -'uni2205': 8709, -'uni2204': 8708, -'Agrave': 192, -'uni2206': 8710, -'uni2209': 8713, -'uni2208': 8712, -'uni226D': 8813, -'uni2264': 8804, -'uni263D': 9789, -'uni2258': 8792, -'uni02D3': 723, -'uni02D2': 722, -'uni02D1': 721, -'uni02D0': 720, -'uni25E1': 9697, -'divide': 247, -'uni02D5': 725, -'uni02D4': 724, -'ocircumflex': 244, -'uni2524': 9508, -'uni043A': 1082, -'uni24CC': 9420, -'asciitilde': 126, -'uni22B9': 8889, -'uni24D2': 9426, -'uni211E': 8478, -'uni211D': 8477, -'uni24DD': 9437, -'uni211A': 8474, -'uni211C': 8476, -'uni211B': 8475, -'uni25C6': 9670, -'uni017F': 383, -'uni017A': 378, -'uni017C': 380, -'uni017B': 379, -'uni0346': 838, -'uni22F1': 8945, -'uni22F0': 8944, -'two': 50, -'uni2298': 8856, -'uni24D1': 9425, -'E': 69, -'uni025D': 605, -'scaron': 353, -'uni2322': 8994, -'uni25E3': 9699, -'uni22BF': 8895, -'F': 70, -'uni0440': 1088, -'uni255E': 9566, -'uni22BA': 8890, -'uni0175': 373, -'uni0174': 372, -'uni0177': 375, -'uni0176': 374, -'bracketleft': 91, -'uni0170': 368, -'uni0173': 371, -'uni0172': 370, -'asciicircum': 94, -'uni0179': 377, -'uni2590': 9616, -'uni25E2': 9698, -'uni2119': 8473, -'uni2118': 8472, -'uni25CC': 9676, -'f': 102, -'ordmasculine': 186, -'uni229B': 8859, -'uni22A1': 8865, -'uni2111': 8465, -'uni2110': 8464, -'uni2113': 8467, -'uni2112': 8466, -'mu': 181, -'uni2281': 8833, -'paragraph': 182, -'nine': 57, -'uni25EC': 9708, -'v': 118, -'uni040C': 1036, -'uni0113': 275, -'uni22D0': 8912, -'uni21CC': 8652, -'uni21CB': 8651, -'uni21CA': 8650, -'uni22A5': 8869, -'uni21CF': 8655, -'uni21CE': 8654, -'uni21CD': 8653, -'guilsinglleft': 8249, -'backslash': 92, -'uni2284': 8836, -'uni224E': 8782, -'uni224D': 8781, -'uni224F': 8783, -'uni224A': 8778, -'uni2287': 8839, -'uni224C': 8780, -'uni224B': 8779, -'uni21BD': 8637, -'uni2286': 8838, -'uni030F': 783, -'uni030D': 781, -'uni030E': 782, -'uni030B': 779, -'uni030C': 780, -'uni030A': 778, -'uni026E': 622, -'uni026D': 621, -'six': 54, -'uni026A': 618, -'uni026C': 620, -'uni25C1': 9665, -'uni20D6': 8406, -'uni045B': 1115, -'uni045C': 1116, -'uni256B': 9579, -'uni045A': 1114, -'uni045F': 1119, -'uni045E': 1118, -'A': 65, -'uni2569': 9577, -'uni0458': 1112, -'uni0459': 1113, -'uni0452': 1106, -'uni0453': 1107, -'uni2562': 9570, -'uni0451': 1105, -'uni0456': 1110, -'uni0457': 1111, -'uni0454': 1108, -'uni0455': 1109, -'icircumflex': 238, -'uni0307': 775, -'uni0304': 772, -'uni0305': 773, -'uni0269': 617, -'uni0268': 616, -'uni0300': 768, -'uni0301': 769, -'uni0265': 613, -'uni0264': 612, -'uni0267': 615, -'uni0266': 614, -'uni0261': 609, -'uni0260': 608, -'uni0263': 611, -'uni0262': 610, -'a': 97, -'uni2207': 8711, -'uni2247': 8775, -'uni2246': 8774, -'uni2241': 8769, -'uni2240': 8768, -'uni2243': 8771, -'uni2242': 8770, -'uni2312': 8978, -'ogonek': 731, -'uni2249': 8777, -'uni2248': 8776, -'uni3030': 12336, -'q': 113, -'uni21C2': 8642, -'uni21C1': 8641, -'uni21C0': 8640, -'uni21C7': 8647, -'uni21C6': 8646, -'uni21C5': 8645, -'uni21C4': 8644, -'uni225F': 8799, -'uni212C': 8492, -'uni21C8': 8648, -'uni2467': 9319, -'oacute': 243, -'uni028F': 655, -'uni028E': 654, -'uni026F': 623, -'uni028C': 652, -'uni028B': 651, -'uni028A': 650, -'uni2510': 9488, -'ograve': 242, -'edieresis': 235, -'uni22CE': 8910, -'uni22CF': 8911, -'uni219F': 8607, -'comma': 44, -'uni22CA': 8906, -'uni0429': 1065, -'uni03C6': 966, -'uni0427': 1063, -'uni0426': 1062, -'uni0425': 1061, -'uni0424': 1060, -'uni0423': 1059, -'uni0422': 1058, -'uni0421': 1057, -'uni0420': 1056, -'uni2465': 9317, -'uni24D0': 9424, -'uni2464': 9316, -'uni0430': 1072, -'otilde': 245, -'uni2661': 9825, -'uni24D6': 9430, -'uni2466': 9318, -'uni24D5': 9429, -'uni219A': 8602, -'uni2518': 9496, -'uni22B6': 8886, -'uni2461': 9313, -'uni24D4': 9428, -'uni2460': 9312, -'uni24EA': 9450, -'guillemotright': 187, -'ecircumflex': 234, -'greater': 62, -'uni2011': 8209, -'uacute': 250, -'uni2462': 9314, -'L': 76, -'bullet': 8226, -'uni02A4': 676, -'uni02A7': 679, -'cedilla': 184, -'uni02A2': 674, -'uni2015': 8213, -'uni22C4': 8900, -'uni22C5': 8901, -'uni22AD': 8877, -'uni22C7': 8903, -'uni22C0': 8896, -'uni2016': 8214, -'uni22C2': 8898, -'uni22C3': 8899, -'uni24CF': 9423, -'uni042F': 1071, -'uni042E': 1070, -'uni042D': 1069, -'ydieresis': 255, -'l': 108, -'logicalnot': 172, -'uni24CA': 9418, -'uni0287': 647, -'uni0286': 646, -'uni0285': 645, -'uni0284': 644, -'uni0283': 643, -'uni0282': 642, -'uni0281': 641, -'uni027C': 636, -'uni2664': 9828, -'exclamdown': 161, -'uni25C4': 9668, -'uni0289': 649, -'uni0288': 648, -'uni039A': 922, -'endash': 8211, -'uni2640': 9792, -'uni20E4': 8420, -'uni0473': 1139, -'uni20E1': 8417, -'uni2642': 9794, -'uni03B8': 952, -'uni03B9': 953, -'agrave': 224, -'uni03B4': 948, -'uni03B5': 949, -'uni03B6': 950, -'uni03B7': 951, -'uni03B0': 944, -'uni03B1': 945, -'uni03B2': 946, -'uni03B3': 947, -'uni2555': 9557, -'Adieresis': 196, -'germandbls': 223, -'Odieresis': 214, -'space': 32, -'uni0126': 294, -'uni0127': 295, -'uni0124': 292, -'uni0125': 293, -'uni0122': 290, -'uni0123': 291, -'uni0120': 288, -'uni0121': 289, -'quoteright': 8217, -'uni2560': 9568, -'uni2556': 9558, -'ucircumflex': 251, -'uni2561': 9569, -'uni2551': 9553, -'uni25B2': 9650, -'uni2550': 9552, -'uni2563': 9571, -'uni2553': 9555, -'G': 71, -'uni2564': 9572, -'uni2552': 9554, -'quoteleft': 8216, -'uni2565': 9573, -'uni2572': 9586, -'uni2568': 9576, -'uni2566': 9574, -'W': 87, -'uni214A': 8522, -'uni012F': 303, -'uni012D': 301, -'uni012E': 302, -'uni012B': 299, -'uni012C': 300, -'uni255C': 9564, -'uni012A': 298, -'uni2289': 8841, -'Q': 81, -'uni2320': 8992, -'uni2321': 8993, -'g': 103, -'uni03BD': 957, -'uni03BE': 958, -'uni03BF': 959, -'uni2282': 8834, -'uni2285': 8837, -'uni03BA': 954, -'uni03BB': 955, -'uni03BC': 956, -'uni2128': 8488, -'uni25B7': 9655, -'w': 119, -'uni0302': 770, -'uni03DE': 990, -'uni25DA': 9690, -'uni0303': 771, -'uni0463': 1123, -'uni0462': 1122, -'uni3018': 12312, -'uni2514': 9492, -'question': 63, -'uni25B3': 9651, -'uni24E1': 9441, -'one': 49, -'uni200A': 8202, -'uni2278': 8824, -'ring': 730, -'uni0195': 405, -'figuredash': 8210, -'uni22EC': 8940, -'uni0339': 825, -'uni0338': 824, -'uni0337': 823, -'uni0336': 822, -'uni0335': 821, -'uni0333': 819, -'uni0332': 818, -'uni0331': 817, -'uni0330': 816, -'uni01C1': 449, -'uni01C0': 448, -'uni01C3': 451, -'uni01C2': 450, -'uni2353': 9043, -'uni0308': 776, -'uni2218': 8728, -'uni2219': 8729, -'uni2216': 8726, -'uni2217': 8727, -'uni2214': 8724, -'uni0309': 777, -'uni2609': 9737, -'uni2213': 8723, -'uni2210': 8720, -'uni2211': 8721, -'uni2245': 8773, -'B': 66, -'uni25D6': 9686, -'iacute': 237, -'uni02E6': 742, -'uni02E7': 743, -'uni02E8': 744, -'uni02E9': 745, -'uni221D': 8733, -'uni221E': 8734, -'Ydieresis': 376, -'uni221C': 8732, -'uni22D7': 8919, -'uni221A': 8730, -'R': 82, -'uni24DC': 9436, -'uni033F': 831, -'uni033E': 830, -'uni033C': 828, -'uni033B': 827, -'uni033A': 826, -'b': 98, -'uni228A': 8842, -'uni22DB': 8923, -'uni2554': 9556, -'uni046B': 1131, -'uni046A': 1130, -'r': 114, -'uni24DB': 9435, -'Ccedilla': 199, -'minus': 8722, -'uni24DA': 9434, -'uni03F0': 1008, -'uni03F1': 1009, -'uni20AC': 8364, -'uni2276': 8822, -'uni24C0': 9408, -'uni0162': 354, -'uni0163': 355, -'uni011E': 286, -'uni011D': 285, -'uni011C': 284, -'uni011B': 283, -'uni0164': 356, -'uni0165': 357, -'Lslash': 321, -'uni0168': 360, -'uni0169': 361, -'uni25C9': 9673, -'uni02E5': 741, -'uni21C3': 8643, -'uni24C4': 9412, -'uni24E2': 9442, -'uni2277': 8823, -'uni013A': 314, -'uni2102': 8450, -'Uacute': 218, -'uni2317': 8983, -'uni2107': 8455, -'uni221F': 8735, -'yacute': 253, -'uni3012': 12306, -'Ucircumflex': 219, -'uni015D': 349, -'quotedbl': 34, -'uni25D9': 9689, -'uni2280': 8832, -'uni22AF': 8879, -'onehalf': 189, -'uni221B': 8731, -'Thorn': 222, -'uni2226': 8742, -'M': 77, -'uni25BA': 9658, -'uni2463': 9315, -'uni2336': 9014, -'eight': 56, -'uni2236': 8758, -'multiply': 215, -'uni210C': 8460, -'uni210A': 8458, -'uni21C9': 8649, -'grave': 96, -'uni210E': 8462, -'uni0117': 279, -'uni016C': 364, -'uni0115': 277, -'uni016A': 362, -'uni016F': 367, -'uni0112': 274, -'uni016D': 365, -'uni016E': 366, -'Ocircumflex': 212, -'uni2305': 8965, -'m': 109, -'uni24DF': 9439, -'uni0119': 281, -'uni0118': 280, -'uni20A3': 8355, -'uni20A4': 8356, -'uni20A7': 8359, -'uni2288': 8840, -'uni24C3': 9411, -'uni251C': 9500, -'uni228D': 8845, -'uni222F': 8751, -'uni222E': 8750, -'uni222D': 8749, -'uni222C': 8748, -'uni222B': 8747, -'uni222A': 8746, -'uni255B': 9563, -'Ugrave': 217, -'uni24DE': 9438, -'guilsinglright': 8250, -'uni250A': 9482, -'Ntilde': 209, -'uni0279': 633, -'questiondown': 191, -'uni256C': 9580, -'Atilde': 195, -'uni0272': 626, -'uni0273': 627, -'uni0270': 624, -'ccedilla': 231, -'uni0276': 630, -'uni0277': 631, -'uni0274': 628, -'uni0275': 629, -'uni2252': 8786, -'uni041F': 1055, -'uni2250': 8784, -'Z': 90, -'uni2256': 8790, -'uni2257': 8791, -'copyright': 169, -'uni2255': 8789, -'uni043D': 1085, -'uni043E': 1086, -'uni043F': 1087, -'yen': 165, -'uni041D': 1053, -'uni043B': 1083, -'uni043C': 1084, -'uni21B0': 8624, -'uni21B1': 8625, -'uni21B2': 8626, -'uni21B3': 8627, -'uni21B4': 8628, -'uni21B5': 8629, -'uni21B6': 8630, -'uni21B7': 8631, -'uni21B8': 8632, -'Eacute': 201, -'uni2311': 8977, -'uni2310': 8976, -'uni228F': 8847, -'uni25DB': 9691, -'uni21BA': 8634, -'uni21BB': 8635, -'uni21BC': 8636, -'uni2017': 8215, -'uni21BE': 8638, -'uni21BF': 8639, -'uni231C': 8988, -'H': 72, -'uni0293': 659, -'uni2202': 8706, -'uni22A4': 8868, -'uni231E': 8990, -'uni2232': 8754, -'uni225B': 8795, -'uni225C': 8796, -'uni24D9': 9433, -'uni225A': 8794, -'uni0438': 1080, -'uni0439': 1081, -'uni225D': 8797, -'uni225E': 8798, -'uni0434': 1076, -'X': 88, -'uni007F': 127, -'uni0437': 1079, -'Idieresis': 207, -'uni0431': 1073, -'uni0432': 1074, -'uni0433': 1075, -'uni22AC': 8876, -'uni22CD': 8909, -'uni25A3': 9635, -'bar': 124, -'uni24BB': 9403, -'uni037E': 894, -'uni027B': 635, -'h': 104, -'uni027A': 634, -'uni027F': 639, -'uni027D': 637, -'uni027E': 638, -'uni2227': 8743, -'uni2004': 8196, -'uni2225': 8741, -'uni2224': 8740, -'uni2223': 8739, -'uni2222': 8738, -'uni2221': 8737, -'uni2220': 8736, -'x': 120, -'uni2323': 8995, -'uni2559': 9561, -'uni2558': 9560, -'uni2229': 8745, -'uni2228': 8744, -'udieresis': 252, -'uni029D': 669, -'ordfeminine': 170, -'uni22CB': 8907, -'uni233D': 9021, -'uni0428': 1064, -'uni24C6': 9414, -'uni22DD': 8925, -'uni24C7': 9415, -'uni015C': 348, -'uni015B': 347, -'uni015A': 346, -'uni22AA': 8874, -'uni015F': 351, -'uni015E': 350, -'braceleft': 123, -'uni24C5': 9413, -'uni0410': 1040, -'uni03AA': 938, -'uni24C2': 9410, -'uni03AC': 940, -'uni03AB': 939, -'macron': 175, -'uni03AD': 941, -'uni03AF': 943, -'uni0294': 660, -'uni0295': 661, -'uni0296': 662, -'uni0297': 663, -'uni0290': 656, -'uni0291': 657, -'uni0292': 658, -'atilde': 227, -'Acircumflex': 194, -'uni2370': 9072, -'uni24C1': 9409, -'uni0298': 664, -'uni0299': 665, -'Oslash': 216, -'uni029E': 670, -'C': 67, -'quotedblleft': 8220, -'uni029B': 667, -'uni029C': 668, -'uni03A9': 937, -'uni03A8': 936, -'S': 83, -'uni24C9': 9417, -'uni03A1': 929, -'uni03A0': 928, -'exclam': 33, -'uni03A5': 933, -'uni03A4': 932, -'uni03A7': 935, -'Zcaron': 381, -'uni2133': 8499, -'uni2132': 8498, -'uni0159': 345, -'uni0158': 344, -'uni2137': 8503, -'uni2005': 8197, -'uni2135': 8501, -'uni2134': 8500, -'uni02BA': 698, -'uni2033': 8243, -'uni0151': 337, -'uni0150': 336, -'uni0157': 343, -'equal': 61, -'uni0155': 341, -'uni0154': 340, -'s': 115, -'uni233F': 9023, -'eth': 240, -'uni24BE': 9406, -'uni21E9': 8681, -'uni2060': 8288, -'Egrave': 200, -'uni255D': 9565, -'uni24CD': 9421, -'uni21E1': 8673, -'uni21B9': 8633, -'hyphen': 45, -'uni01BE': 446, -'uni01BB': 443, -'period': 46, -'igrave': 236, -'uni01BA': 442, -'uni2296': 8854, -'uni2297': 8855, -'uni2294': 8852, -'uni2295': 8853, -'colon': 58, -'uni2293': 8851, -'uni2290': 8848, -'uni2291': 8849, -'uni032D': 813, -'uni032E': 814, -'uni032F': 815, -'uni032A': 810, -'uni032B': 811, -'uni032C': 812, -'uni231D': 8989, -'Ecircumflex': 202, -'uni24D7': 9431, -'uni25DD': 9693, -'trademark': 8482, -'Aacute': 193, -'cent': 162, -'uni0445': 1093, -'uni266E': 9838, -'uni266D': 9837, -'uni266B': 9835, -'uni03C9': 969, -'uni2003': 8195, -'uni2047': 8263, -'lslash': 322, -'uni03A6': 934, -'uni2043': 8259, -'uni250C': 9484, -'uni2040': 8256, -'uni255F': 9567, -'uni24CB': 9419, -'uni0472': 1138, -'uni0446': 1094, -'uni0474': 1140, -'uni0475': 1141, -'uni2508': 9480, -'uni2660': 9824, -'uni2506': 9478, -'uni2502': 9474, -'c': 99, -'uni2500': 9472, -'N': 78, -'uni22A6': 8870, -'uni21E7': 8679, -'uni2130': 8496, -'uni2002': 8194, -'breve': 728, -'uni0442': 1090, -'Oacute': 211, -'uni229F': 8863, -'uni25C7': 9671, -'uni229D': 8861, -'uni229E': 8862, -'guillemotleft': 171, -'uni0329': 809, -'uni24E5': 9445, -'uni011F': 287, -'uni0324': 804, -'uni0325': 805, -'uni0326': 806, -'uni0327': 807, -'uni0321': 801, -'uni0322': 802, -'n': 110, -'uni2032': 8242, -'uni2269': 8809, -'uni2268': 8808, -'uni0306': 774, -'uni226B': 8811, -'uni21EA': 8682, -'uni0166': 358, -'uni203B': 8251, -'uni01B5': 437, -'idieresis': 239, -'uni02BC': 700, -'uni01B0': 432, -'braceright': 125, -'seven': 55, -'uni02BB': 699, -'uni011A': 282, -'uni29FB': 10747, -'brokenbar': 166, -'uni2036': 8246, -'uni25C0': 9664, -'uni0156': 342, -'uni22D5': 8917, -'uni0258': 600, -'ugrave': 249, -'uni22D6': 8918, -'uni22D1': 8913, -'uni2034': 8244, -'uni22D3': 8915, -'uni22D2': 8914, -'uni203C': 8252, -'uni223E': 8766, -'uni02BF': 703, -'uni22D9': 8921, -'uni22D8': 8920, -'uni25BD': 9661, -'uni25BE': 9662, -'uni25BF': 9663, -'uni041B': 1051, -'periodcentered': 183, -'uni25BC': 9660, -'uni019E': 414, -'uni019B': 411, -'uni019A': 410, -'uni2007': 8199, -'uni0391': 913, -'uni0390': 912, -'uni0393': 915, -'uni0392': 914, -'uni0395': 917, -'uni0394': 916, -'uni0397': 919, -'uni0396': 918, -'uni0399': 921, -'uni0398': 920, -'uni25C8': 9672, -'uni2468': 9320, -'sterling': 163, -'uni22EB': 8939, -'uni039C': 924, -'uni039B': 923, -'uni039E': 926, -'uni039D': 925, -'uni039F': 927, -'I': 73, -'uni03E1': 993, -'uni03E0': 992, -'uni2319': 8985, -'uni228B': 8843, -'uni25B5': 9653, -'uni25B6': 9654, -'uni22EA': 8938, -'uni24B9': 9401, -'uni044E': 1102, -'uni0199': 409, -'uni2266': 8806, -'Y': 89, -'uni22A2': 8866, -'Eth': 208, -'uni266F': 9839, -'emdash': 8212, -'uni263B': 9787, -'uni24BD': 9405, -'uni22DE': 8926, -'uni0360': 864, -'uni2557': 9559, -'uni22DF': 8927, -'uni22DA': 8922, -'uni22DC': 8924, -'uni0361': 865, -'i': 105, -'uni24BF': 9407, -'uni0362': 866, -'uni263E': 9790, -'uni028D': 653, -'uni2259': 8793, -'uni0323': 803, -'uni2265': 8805, -'daggerdbl': 8225, -'y': 121, -'uni010A': 266, -'plusminus': 177, -'less': 60, -'uni21AE': 8622, -'uni0315': 789, -'uni230B': 8971, -'uni21AF': 8623, -'uni21AA': 8618, -'uni21AC': 8620, -'uni21AB': 8619, -'uni01FB': 507, -'uni01FC': 508, -'uni223A': 8762, -'uni01FA': 506, -'uni01FF': 511, -'uni01FD': 509, -'uni01FE': 510, -'uni2567': 9575, -'uni25E0': 9696, -'uni0104': 260, -'uni0105': 261, -'uni0106': 262, -'uni0107': 263, -'uni0100': 256, -'uni0101': 257, -'uni0102': 258, -'uni0103': 259, -'uni2038': 8248, -'uni2009': 8201, -'uni2008': 8200, -'uni0108': 264, -'uni0109': 265, -'uni02A1': 673, -'uni223B': 8763, -'uni226C': 8812, -'uni25AC': 9644, -'uni24D3': 9427, -'uni21E0': 8672, -'uni21E3': 8675, -'Udieresis': 220, -'uni21E2': 8674, -'D': 68, -'uni21E5': 8677, -'uni2621': 9761, -'uni21D1': 8657, -'uni203E': 8254, -'uni22C6': 8902, -'uni21E4': 8676, -'uni010D': 269, -'uni010E': 270, -'uni010F': 271, -'five': 53, -'T': 84, -'uni010B': 267, -'uni010C': 268, -'uni2605': 9733, -'uni2663': 9827, -'uni21E6': 8678, -'uni24B6': 9398, -'uni22C1': 8897, -'oslash': 248, -'acute': 180, -'uni01F0': 496, -'d': 100, -'OE': 338, -'uni22E3': 8931, -'Igrave': 204, -'uni2308': 8968, -'uni2309': 8969, -'uni21A9': 8617, -'t': 116, -'uni2313': 8979, -'uni03A3': 931, -'uni21A4': 8612, -'uni21A7': 8615, -'uni21A6': 8614, -'uni21A1': 8609, -'uni21A0': 8608, -'uni21A3': 8611, -'uni21A2': 8610, -'parenright': 41, -'uni256A': 9578, -'uni25DC': 9692, -'uni24CE': 9422, -'uni042C': 1068, -'uni24E0': 9440, -'uni042B': 1067, -'uni0409': 1033, -'uni0408': 1032, -'uni24E7': 9447, -'uni25B4': 9652, -'uni042A': 1066, -'uni228E': 8846, -'uni0401': 1025, -'adieresis': 228, -'uni0403': 1027, -'quotesingle': 39, -'uni0405': 1029, -'uni0404': 1028, -'uni0407': 1031, -'uni0406': 1030, -'uni229C': 8860, -'uni2306': 8966, -'uni2253': 8787, -'twodotenleader': 8229, -'uni2131': 8497, -'uni21DA': 8666, -'uni2234': 8756, -'uni2235': 8757, -'uni01A5': 421, -'uni2237': 8759, -'uni2230': 8752, -'uni02CC': 716, -'slash': 47, -'uni01A0': 416, -'ellipsis': 8230, -'uni2299': 8857, -'uni2238': 8760, -'numbersign': 35, -'uni21A8': 8616, -'uni223D': 8765, -'uni01AF': 431, -'uni223F': 8767, -'uni01AD': 429, -'uni01AB': 427, -'odieresis': 246, -'uni223C': 8764, -'uni227D': 8829, -'uni0280': 640, -'O': 79, -'uni227E': 8830, -'uni21A5': 8613, -'uni22D4': 8916, -'uni25D4': 9684, -'uni227F': 8831, -'uni0435': 1077, -'uni2302': 8962, -'uni2669': 9833, -'uni24E3': 9443, -'uni2720': 10016, -'uni22A8': 8872, -'uni22A9': 8873, -'uni040A': 1034, -'uni22A7': 8871, -'oe': 339, -'uni040B': 1035, -'uni040E': 1038, -'uni22A3': 8867, -'o': 111, -'uni040F': 1039, -'Edieresis': 203, -'uni25D5': 9685, -'plus': 43, -'uni044D': 1101, -'uni263C': 9788, -'uni22E6': 8934, -'uni2283': 8835, -'uni258C': 9612, -'uni219E': 8606, -'uni24E4': 9444, -'uni2136': 8502, -'dagger': 8224, -'uni24B7': 9399, -'uni219B': 8603, -'uni22E5': 8933, -'three': 51, -'uni210B': 8459, -'uni2534': 9524, -'uni24B8': 9400, -'uni230A': 8970, -'hungarumlaut': 733, -'parenleft': 40, -'uni0148': 328, -'uni0149': 329, -'uni2124': 8484, -'uni2125': 8485, -'uni2126': 8486, -'uni2127': 8487, -'uni0140': 320, -'uni2129': 8489, -'uni25C5': 9669, -'uni0143': 323, -'uni0144': 324, -'uni0145': 325, -'uni0146': 326, -'uni0147': 327, -'uni210D': 8461, -'fraction': 8260, -'uni2031': 8241, -'uni2196': 8598, -'uni2035': 8245, -'uni24E6': 9446, -'uni016B': 363, -'uni24BA': 9402, -'uni266A': 9834, -'uni0116': 278, -'uni2115': 8469, -'registered': 174, -'J': 74, -'uni25DF': 9695, -'uni25CE': 9678, -'uni273D': 10045, -'dieresis': 168, -'uni212B': 8491, -'uni0114': 276, -'uni212D': 8493, -'uni212E': 8494, -'uni212F': 8495, -'uni014A': 330, -'uni014B': 331, -'uni014C': 332, -'uni014D': 333, -'uni014E': 334, -'uni014F': 335, -'uni025E': 606, -'uni24E8': 9448, -'uni0111': 273, -'uni24E9': 9449, -'Ograve': 210, -'j': 106, -'uni2195': 8597, -'uni2194': 8596, -'uni2197': 8599, -'uni2037': 8247, -'uni2191': 8593, -'uni2190': 8592, -'uni2193': 8595, -'uni2192': 8594, -'uni29FA': 10746, -'uni2713': 10003, -'z': 122, -'uni2199': 8601, -'uni2198': 8600, -'uni2667': 9831, -'ae': 230, -'uni0448': 1096, -'semicolon': 59, -'uni2666': 9830, -'uni038F': 911, -'uni0444': 1092, -'uni0447': 1095, -'uni038E': 910, -'uni0441': 1089, -'uni038C': 908, -'uni0443': 1091, -'uni038A': 906, -'uni0250': 592, -'uni0251': 593, -'uni0252': 594, -'uni0253': 595, -'uni0254': 596, -'at': 64, -'uni0256': 598, -'uni0257': 599, -'uni0167': 359, -'uni0259': 601, -'uni228C': 8844, -'uni2662': 9826, -'uni0319': 793, -'uni0318': 792, -'uni24BC': 9404, -'uni0402': 1026, -'uni22EF': 8943, -'Iacute': 205, -'uni22ED': 8941, -'uni22EE': 8942, -'uni0311': 785, -'uni0310': 784, -'uni21E8': 8680, -'uni0312': 786, -'percent': 37, -'uni0317': 791, -'uni0316': 790, -'uni21D6': 8662, -'uni21D7': 8663, -'uni21D4': 8660, -'uni21D5': 8661, -'uni21D2': 8658, -'uni21D3': 8659, -'uni21D0': 8656, -'uni2138': 8504, -'uni2270': 8816, -'uni2271': 8817, -'uni2272': 8818, -'uni2273': 8819, -'uni2274': 8820, -'uni2275': 8821, -'bracketright': 93, -'uni21D9': 8665, -'uni21DF': 8671, -'uni21DD': 8669, -'uni21DE': 8670, -'AE': 198, -'uni03AE': 942, -'uni227A': 8826, -'uni227B': 8827, -'uni227C': 8828, -'asterisk': 42, -'aacute': 225, -'uni226F': 8815, -'uni22E2': 8930, -'uni0386': 902, -'uni22E0': 8928, -'uni22E1': 8929, -'U': 85, -'uni22E7': 8935, -'uni22E4': 8932, -'uni0387': 903, -'uni031A': 794, -'eacute': 233, -'uni22E8': 8936, -'uni22E9': 8937, -'uni24D8': 9432, -'uni025A': 602, -'uni025B': 603, -'uni025C': 604, -'e': 101, -'uni0128': 296, -'uni025F': 607, -'uni2665': 9829, -'thorn': 254, -'uni0129': 297, -'uni253C': 9532, -'uni25D7': 9687, -'u': 117, -'uni0388': 904, -'uni0389': 905, -'uni0255': 597, -'uni0171': 369, -'uni0384': 900, -'uni0385': 901, -'uni044A': 1098, -'uni252C': 9516, -'uni044C': 1100, -'uni044B': 1099} +type12uni = { + 'uni24C8' : 9416, + 'aring' : 229, + 'uni22A0' : 8864, + 'uni2292' : 8850, + 'quotedblright' : 8221, + 'uni03D2' : 978, + 'uni2215' : 8725, + 'uni03D0' : 976, + 'V' : 86, + 'dollar' : 36, + 'uni301E' : 12318, + 'uni03D5' : 981, + 'four' : 52, + 'uni25A0' : 9632, + 'uni013C' : 316, + 'uni013B' : 315, + 'uni013E' : 318, + 'Yacute' : 221, + 'uni25DE' : 9694, + 'uni013F' : 319, + 'uni255A' : 9562, + 'uni2606' : 9734, + 'uni0180' : 384, + 'uni22B7' : 8887, + 'uni044F' : 1103, + 'uni22B5' : 8885, + 'uni22B4' : 8884, + 'uni22AE' : 8878, + 'uni22B2' : 8882, + 'uni22B1' : 8881, + 'uni22B0' : 8880, + 'uni25CD' : 9677, + 'uni03CE' : 974, + 'uni03CD' : 973, + 'uni03CC' : 972, + 'uni03CB' : 971, + 'uni03CA' : 970, + 'uni22B8' : 8888, + 'uni22C9' : 8905, + 'uni0449' : 1097, + 'uni20DD' : 8413, + 'uni20DC' : 8412, + 'uni20DB' : 8411, + 'uni2231' : 8753, + 'uni25CF' : 9679, + 'uni306E' : 12398, + 'uni03D1' : 977, + 'uni01A1' : 417, + 'uni20D7' : 8407, + 'uni03D6' : 982, + 'uni2233' : 8755, + 'uni20D2' : 8402, + 'uni20D1' : 8401, + 'uni20D0' : 8400, + 'P' : 80, + 'uni22BE' : 8894, + 'uni22BD' : 8893, + 'uni22BC' : 8892, + 'uni22BB' : 8891, + 'underscore' : 95, + 'uni03C8' : 968, + 'uni03C7' : 967, + 'uni0328' : 808, + 'uni03C5' : 965, + 'uni03C4' : 964, + 'uni03C3' : 963, + 'uni03C2' : 962, + 'uni03C1' : 961, + 'uni03C0' : 960, + 'uni2010' : 8208, + 'uni0130' : 304, + 'uni0133' : 307, + 'uni0132' : 306, + 'uni0135' : 309, + 'uni0134' : 308, + 'uni0137' : 311, + 'uni0136' : 310, + 'uni0139' : 313, + 'uni0138' : 312, + 'uni2244' : 8772, + 'uni229A' : 8858, + 'uni2571' : 9585, + 'uni0278' : 632, + 'uni2239' : 8761, + 'p' : 112, + 'uni3019' : 12313, + 'uni25CB' : 9675, + 'uni03DB' : 987, + 'uni03DC' : 988, + 'uni03DA' : 986, + 'uni03DF' : 991, + 'uni03DD' : 989, + 'uni013D' : 317, + 'uni220A' : 8714, + 'uni220C' : 8716, + 'uni220B' : 8715, + 'uni220E' : 8718, + 'uni220D' : 8717, + 'uni220F' : 8719, + 'uni22CC' : 8908, + 'Otilde' : 213, + 'uni25E5' : 9701, + 'uni2736' : 10038, + 'perthousand' : 8240, + 'zero' : 48, + 'uni279B' : 10139, + 'dotlessi' : 305, + 'uni2279' : 8825, + 'Scaron' : 352, + 'zcaron' : 382, + 'uni21D8' : 8664, + 'egrave' : 232, + 'uni0271' : 625, + 'uni01AA' : 426, + 'uni2332' : 9010, + 'section' : 167, + 'uni25E4' : 9700, + 'Icircumflex' : 206, + 'ntilde' : 241, + 'uni041E' : 1054, + 'ampersand' : 38, + 'uni041C' : 1052, + 'uni041A' : 1050, + 'uni22AB' : 8875, + 'uni21DB' : 8667, + 'dotaccent' : 729, + 'uni0416' : 1046, + 'uni0417' : 1047, + 'uni0414' : 1044, + 'uni0415' : 1045, + 'uni0412' : 1042, + 'uni0413' : 1043, + 'degree' : 176, + 'uni0411' : 1041, + 'K' : 75, + 'uni25EB' : 9707, + 'uni25EF' : 9711, + 'uni0418' : 1048, + 'uni0419' : 1049, + 'uni2263' : 8803, + 'uni226E' : 8814, + 'uni2251' : 8785, + 'uni02C8' : 712, + 'uni2262' : 8802, + 'acircumflex' : 226, + 'uni22B3' : 8883, + 'uni2261' : 8801, + 'uni2394' : 9108, + 'Aring' : 197, + 'uni2260' : 8800, + 'uni2254' : 8788, + 'uni0436' : 1078, + 'uni2267' : 8807, + 'k' : 107, + 'uni22C8' : 8904, + 'uni226A' : 8810, + 'uni231F' : 8991, + 'smalltilde' : 732, + 'uni2201' : 8705, + 'uni2200' : 8704, + 'uni2203' : 8707, + 'uni02BD' : 701, + 'uni2205' : 8709, + 'uni2204' : 8708, + 'Agrave' : 192, + 'uni2206' : 8710, + 'uni2209' : 8713, + 'uni2208' : 8712, + 'uni226D' : 8813, + 'uni2264' : 8804, + 'uni263D' : 9789, + 'uni2258' : 8792, + 'uni02D3' : 723, + 'uni02D2' : 722, + 'uni02D1' : 721, + 'uni02D0' : 720, + 'uni25E1' : 9697, + 'divide' : 247, + 'uni02D5' : 725, + 'uni02D4' : 724, + 'ocircumflex' : 244, + 'uni2524' : 9508, + 'uni043A' : 1082, + 'uni24CC' : 9420, + 'asciitilde' : 126, + 'uni22B9' : 8889, + 'uni24D2' : 9426, + 'uni211E' : 8478, + 'uni211D' : 8477, + 'uni24DD' : 9437, + 'uni211A' : 8474, + 'uni211C' : 8476, + 'uni211B' : 8475, + 'uni25C6' : 9670, + 'uni017F' : 383, + 'uni017A' : 378, + 'uni017C' : 380, + 'uni017B' : 379, + 'uni0346' : 838, + 'uni22F1' : 8945, + 'uni22F0' : 8944, + 'two' : 50, + 'uni2298' : 8856, + 'uni24D1' : 9425, + 'E' : 69, + 'uni025D' : 605, + 'scaron' : 353, + 'uni2322' : 8994, + 'uni25E3' : 9699, + 'uni22BF' : 8895, + 'F' : 70, + 'uni0440' : 1088, + 'uni255E' : 9566, + 'uni22BA' : 8890, + 'uni0175' : 373, + 'uni0174' : 372, + 'uni0177' : 375, + 'uni0176' : 374, + 'bracketleft' : 91, + 'uni0170' : 368, + 'uni0173' : 371, + 'uni0172' : 370, + 'asciicircum' : 94, + 'uni0179' : 377, + 'uni2590' : 9616, + 'uni25E2' : 9698, + 'uni2119' : 8473, + 'uni2118' : 8472, + 'uni25CC' : 9676, + 'f' : 102, + 'ordmasculine' : 186, + 'uni229B' : 8859, + 'uni22A1' : 8865, + 'uni2111' : 8465, + 'uni2110' : 8464, + 'uni2113' : 8467, + 'uni2112' : 8466, + 'mu' : 181, + 'uni2281' : 8833, + 'paragraph' : 182, + 'nine' : 57, + 'uni25EC' : 9708, + 'v' : 118, + 'uni040C' : 1036, + 'uni0113' : 275, + 'uni22D0' : 8912, + 'uni21CC' : 8652, + 'uni21CB' : 8651, + 'uni21CA' : 8650, + 'uni22A5' : 8869, + 'uni21CF' : 8655, + 'uni21CE' : 8654, + 'uni21CD' : 8653, + 'guilsinglleft' : 8249, + 'backslash' : 92, + 'uni2284' : 8836, + 'uni224E' : 8782, + 'uni224D' : 8781, + 'uni224F' : 8783, + 'uni224A' : 8778, + 'uni2287' : 8839, + 'uni224C' : 8780, + 'uni224B' : 8779, + 'uni21BD' : 8637, + 'uni2286' : 8838, + 'uni030F' : 783, + 'uni030D' : 781, + 'uni030E' : 782, + 'uni030B' : 779, + 'uni030C' : 780, + 'uni030A' : 778, + 'uni026E' : 622, + 'uni026D' : 621, + 'six' : 54, + 'uni026A' : 618, + 'uni026C' : 620, + 'uni25C1' : 9665, + 'uni20D6' : 8406, + 'uni045B' : 1115, + 'uni045C' : 1116, + 'uni256B' : 9579, + 'uni045A' : 1114, + 'uni045F' : 1119, + 'uni045E' : 1118, + 'A' : 65, + 'uni2569' : 9577, + 'uni0458' : 1112, + 'uni0459' : 1113, + 'uni0452' : 1106, + 'uni0453' : 1107, + 'uni2562' : 9570, + 'uni0451' : 1105, + 'uni0456' : 1110, + 'uni0457' : 1111, + 'uni0454' : 1108, + 'uni0455' : 1109, + 'icircumflex' : 238, + 'uni0307' : 775, + 'uni0304' : 772, + 'uni0305' : 773, + 'uni0269' : 617, + 'uni0268' : 616, + 'uni0300' : 768, + 'uni0301' : 769, + 'uni0265' : 613, + 'uni0264' : 612, + 'uni0267' : 615, + 'uni0266' : 614, + 'uni0261' : 609, + 'uni0260' : 608, + 'uni0263' : 611, + 'uni0262' : 610, + 'a' : 97, + 'uni2207' : 8711, + 'uni2247' : 8775, + 'uni2246' : 8774, + 'uni2241' : 8769, + 'uni2240' : 8768, + 'uni2243' : 8771, + 'uni2242' : 8770, + 'uni2312' : 8978, + 'ogonek' : 731, + 'uni2249' : 8777, + 'uni2248' : 8776, + 'uni3030' : 12336, + 'q' : 113, + 'uni21C2' : 8642, + 'uni21C1' : 8641, + 'uni21C0' : 8640, + 'uni21C7' : 8647, + 'uni21C6' : 8646, + 'uni21C5' : 8645, + 'uni21C4' : 8644, + 'uni225F' : 8799, + 'uni212C' : 8492, + 'uni21C8' : 8648, + 'uni2467' : 9319, + 'oacute' : 243, + 'uni028F' : 655, + 'uni028E' : 654, + 'uni026F' : 623, + 'uni028C' : 652, + 'uni028B' : 651, + 'uni028A' : 650, + 'uni2510' : 9488, + 'ograve' : 242, + 'edieresis' : 235, + 'uni22CE' : 8910, + 'uni22CF' : 8911, + 'uni219F' : 8607, + 'comma' : 44, + 'uni22CA' : 8906, + 'uni0429' : 1065, + 'uni03C6' : 966, + 'uni0427' : 1063, + 'uni0426' : 1062, + 'uni0425' : 1061, + 'uni0424' : 1060, + 'uni0423' : 1059, + 'uni0422' : 1058, + 'uni0421' : 1057, + 'uni0420' : 1056, + 'uni2465' : 9317, + 'uni24D0' : 9424, + 'uni2464' : 9316, + 'uni0430' : 1072, + 'otilde' : 245, + 'uni2661' : 9825, + 'uni24D6' : 9430, + 'uni2466' : 9318, + 'uni24D5' : 9429, + 'uni219A' : 8602, + 'uni2518' : 9496, + 'uni22B6' : 8886, + 'uni2461' : 9313, + 'uni24D4' : 9428, + 'uni2460' : 9312, + 'uni24EA' : 9450, + 'guillemotright' : 187, + 'ecircumflex' : 234, + 'greater' : 62, + 'uni2011' : 8209, + 'uacute' : 250, + 'uni2462' : 9314, + 'L' : 76, + 'bullet' : 8226, + 'uni02A4' : 676, + 'uni02A7' : 679, + 'cedilla' : 184, + 'uni02A2' : 674, + 'uni2015' : 8213, + 'uni22C4' : 8900, + 'uni22C5' : 8901, + 'uni22AD' : 8877, + 'uni22C7' : 8903, + 'uni22C0' : 8896, + 'uni2016' : 8214, + 'uni22C2' : 8898, + 'uni22C3' : 8899, + 'uni24CF' : 9423, + 'uni042F' : 1071, + 'uni042E' : 1070, + 'uni042D' : 1069, + 'ydieresis' : 255, + 'l' : 108, + 'logicalnot' : 172, + 'uni24CA' : 9418, + 'uni0287' : 647, + 'uni0286' : 646, + 'uni0285' : 645, + 'uni0284' : 644, + 'uni0283' : 643, + 'uni0282' : 642, + 'uni0281' : 641, + 'uni027C' : 636, + 'uni2664' : 9828, + 'exclamdown' : 161, + 'uni25C4' : 9668, + 'uni0289' : 649, + 'uni0288' : 648, + 'uni039A' : 922, + 'endash' : 8211, + 'uni2640' : 9792, + 'uni20E4' : 8420, + 'uni0473' : 1139, + 'uni20E1' : 8417, + 'uni2642' : 9794, + 'uni03B8' : 952, + 'uni03B9' : 953, + 'agrave' : 224, + 'uni03B4' : 948, + 'uni03B5' : 949, + 'uni03B6' : 950, + 'uni03B7' : 951, + 'uni03B0' : 944, + 'uni03B1' : 945, + 'uni03B2' : 946, + 'uni03B3' : 947, + 'uni2555' : 9557, + 'Adieresis' : 196, + 'germandbls' : 223, + 'Odieresis' : 214, + 'space' : 32, + 'uni0126' : 294, + 'uni0127' : 295, + 'uni0124' : 292, + 'uni0125' : 293, + 'uni0122' : 290, + 'uni0123' : 291, + 'uni0120' : 288, + 'uni0121' : 289, + 'quoteright' : 8217, + 'uni2560' : 9568, + 'uni2556' : 9558, + 'ucircumflex' : 251, + 'uni2561' : 9569, + 'uni2551' : 9553, + 'uni25B2' : 9650, + 'uni2550' : 9552, + 'uni2563' : 9571, + 'uni2553' : 9555, + 'G' : 71, + 'uni2564' : 9572, + 'uni2552' : 9554, + 'quoteleft' : 8216, + 'uni2565' : 9573, + 'uni2572' : 9586, + 'uni2568' : 9576, + 'uni2566' : 9574, + 'W' : 87, + 'uni214A' : 8522, + 'uni012F' : 303, + 'uni012D' : 301, + 'uni012E' : 302, + 'uni012B' : 299, + 'uni012C' : 300, + 'uni255C' : 9564, + 'uni012A' : 298, + 'uni2289' : 8841, + 'Q' : 81, + 'uni2320' : 8992, + 'uni2321' : 8993, + 'g' : 103, + 'uni03BD' : 957, + 'uni03BE' : 958, + 'uni03BF' : 959, + 'uni2282' : 8834, + 'uni2285' : 8837, + 'uni03BA' : 954, + 'uni03BB' : 955, + 'uni03BC' : 956, + 'uni2128' : 8488, + 'uni25B7' : 9655, + 'w' : 119, + 'uni0302' : 770, + 'uni03DE' : 990, + 'uni25DA' : 9690, + 'uni0303' : 771, + 'uni0463' : 1123, + 'uni0462' : 1122, + 'uni3018' : 12312, + 'uni2514' : 9492, + 'question' : 63, + 'uni25B3' : 9651, + 'uni24E1' : 9441, + 'one' : 49, + 'uni200A' : 8202, + 'uni2278' : 8824, + 'ring' : 730, + 'uni0195' : 405, + 'figuredash' : 8210, + 'uni22EC' : 8940, + 'uni0339' : 825, + 'uni0338' : 824, + 'uni0337' : 823, + 'uni0336' : 822, + 'uni0335' : 821, + 'uni0333' : 819, + 'uni0332' : 818, + 'uni0331' : 817, + 'uni0330' : 816, + 'uni01C1' : 449, + 'uni01C0' : 448, + 'uni01C3' : 451, + 'uni01C2' : 450, + 'uni2353' : 9043, + 'uni0308' : 776, + 'uni2218' : 8728, + 'uni2219' : 8729, + 'uni2216' : 8726, + 'uni2217' : 8727, + 'uni2214' : 8724, + 'uni0309' : 777, + 'uni2609' : 9737, + 'uni2213' : 8723, + 'uni2210' : 8720, + 'uni2211' : 8721, + 'uni2245' : 8773, + 'B' : 66, + 'uni25D6' : 9686, + 'iacute' : 237, + 'uni02E6' : 742, + 'uni02E7' : 743, + 'uni02E8' : 744, + 'uni02E9' : 745, + 'uni221D' : 8733, + 'uni221E' : 8734, + 'Ydieresis' : 376, + 'uni221C' : 8732, + 'uni22D7' : 8919, + 'uni221A' : 8730, + 'R' : 82, + 'uni24DC' : 9436, + 'uni033F' : 831, + 'uni033E' : 830, + 'uni033C' : 828, + 'uni033B' : 827, + 'uni033A' : 826, + 'b' : 98, + 'uni228A' : 8842, + 'uni22DB' : 8923, + 'uni2554' : 9556, + 'uni046B' : 1131, + 'uni046A' : 1130, + 'r' : 114, + 'uni24DB' : 9435, + 'Ccedilla' : 199, + 'minus' : 8722, + 'uni24DA' : 9434, + 'uni03F0' : 1008, + 'uni03F1' : 1009, + 'uni20AC' : 8364, + 'uni2276' : 8822, + 'uni24C0' : 9408, + 'uni0162' : 354, + 'uni0163' : 355, + 'uni011E' : 286, + 'uni011D' : 285, + 'uni011C' : 284, + 'uni011B' : 283, + 'uni0164' : 356, + 'uni0165' : 357, + 'Lslash' : 321, + 'uni0168' : 360, + 'uni0169' : 361, + 'uni25C9' : 9673, + 'uni02E5' : 741, + 'uni21C3' : 8643, + 'uni24C4' : 9412, + 'uni24E2' : 9442, + 'uni2277' : 8823, + 'uni013A' : 314, + 'uni2102' : 8450, + 'Uacute' : 218, + 'uni2317' : 8983, + 'uni2107' : 8455, + 'uni221F' : 8735, + 'yacute' : 253, + 'uni3012' : 12306, + 'Ucircumflex' : 219, + 'uni015D' : 349, + 'quotedbl' : 34, + 'uni25D9' : 9689, + 'uni2280' : 8832, + 'uni22AF' : 8879, + 'onehalf' : 189, + 'uni221B' : 8731, + 'Thorn' : 222, + 'uni2226' : 8742, + 'M' : 77, + 'uni25BA' : 9658, + 'uni2463' : 9315, + 'uni2336' : 9014, + 'eight' : 56, + 'uni2236' : 8758, + 'multiply' : 215, + 'uni210C' : 8460, + 'uni210A' : 8458, + 'uni21C9' : 8649, + 'grave' : 96, + 'uni210E' : 8462, + 'uni0117' : 279, + 'uni016C' : 364, + 'uni0115' : 277, + 'uni016A' : 362, + 'uni016F' : 367, + 'uni0112' : 274, + 'uni016D' : 365, + 'uni016E' : 366, + 'Ocircumflex' : 212, + 'uni2305' : 8965, + 'm' : 109, + 'uni24DF' : 9439, + 'uni0119' : 281, + 'uni0118' : 280, + 'uni20A3' : 8355, + 'uni20A4' : 8356, + 'uni20A7' : 8359, + 'uni2288' : 8840, + 'uni24C3' : 9411, + 'uni251C' : 9500, + 'uni228D' : 8845, + 'uni222F' : 8751, + 'uni222E' : 8750, + 'uni222D' : 8749, + 'uni222C' : 8748, + 'uni222B' : 8747, + 'uni222A' : 8746, + 'uni255B' : 9563, + 'Ugrave' : 217, + 'uni24DE' : 9438, + 'guilsinglright' : 8250, + 'uni250A' : 9482, + 'Ntilde' : 209, + 'uni0279' : 633, + 'questiondown' : 191, + 'uni256C' : 9580, + 'Atilde' : 195, + 'uni0272' : 626, + 'uni0273' : 627, + 'uni0270' : 624, + 'ccedilla' : 231, + 'uni0276' : 630, + 'uni0277' : 631, + 'uni0274' : 628, + 'uni0275' : 629, + 'uni2252' : 8786, + 'uni041F' : 1055, + 'uni2250' : 8784, + 'Z' : 90, + 'uni2256' : 8790, + 'uni2257' : 8791, + 'copyright' : 169, + 'uni2255' : 8789, + 'uni043D' : 1085, + 'uni043E' : 1086, + 'uni043F' : 1087, + 'yen' : 165, + 'uni041D' : 1053, + 'uni043B' : 1083, + 'uni043C' : 1084, + 'uni21B0' : 8624, + 'uni21B1' : 8625, + 'uni21B2' : 8626, + 'uni21B3' : 8627, + 'uni21B4' : 8628, + 'uni21B5' : 8629, + 'uni21B6' : 8630, + 'uni21B7' : 8631, + 'uni21B8' : 8632, + 'Eacute' : 201, + 'uni2311' : 8977, + 'uni2310' : 8976, + 'uni228F' : 8847, + 'uni25DB' : 9691, + 'uni21BA' : 8634, + 'uni21BB' : 8635, + 'uni21BC' : 8636, + 'uni2017' : 8215, + 'uni21BE' : 8638, + 'uni21BF' : 8639, + 'uni231C' : 8988, + 'H' : 72, + 'uni0293' : 659, + 'uni2202' : 8706, + 'uni22A4' : 8868, + 'uni231E' : 8990, + 'uni2232' : 8754, + 'uni225B' : 8795, + 'uni225C' : 8796, + 'uni24D9' : 9433, + 'uni225A' : 8794, + 'uni0438' : 1080, + 'uni0439' : 1081, + 'uni225D' : 8797, + 'uni225E' : 8798, + 'uni0434' : 1076, + 'X' : 88, + 'uni007F' : 127, + 'uni0437' : 1079, + 'Idieresis' : 207, + 'uni0431' : 1073, + 'uni0432' : 1074, + 'uni0433' : 1075, + 'uni22AC' : 8876, + 'uni22CD' : 8909, + 'uni25A3' : 9635, + 'bar' : 124, + 'uni24BB' : 9403, + 'uni037E' : 894, + 'uni027B' : 635, + 'h' : 104, + 'uni027A' : 634, + 'uni027F' : 639, + 'uni027D' : 637, + 'uni027E' : 638, + 'uni2227' : 8743, + 'uni2004' : 8196, + 'uni2225' : 8741, + 'uni2224' : 8740, + 'uni2223' : 8739, + 'uni2222' : 8738, + 'uni2221' : 8737, + 'uni2220' : 8736, + 'x' : 120, + 'uni2323' : 8995, + 'uni2559' : 9561, + 'uni2558' : 9560, + 'uni2229' : 8745, + 'uni2228' : 8744, + 'udieresis' : 252, + 'uni029D' : 669, + 'ordfeminine' : 170, + 'uni22CB' : 8907, + 'uni233D' : 9021, + 'uni0428' : 1064, + 'uni24C6' : 9414, + 'uni22DD' : 8925, + 'uni24C7' : 9415, + 'uni015C' : 348, + 'uni015B' : 347, + 'uni015A' : 346, + 'uni22AA' : 8874, + 'uni015F' : 351, + 'uni015E' : 350, + 'braceleft' : 123, + 'uni24C5' : 9413, + 'uni0410' : 1040, + 'uni03AA' : 938, + 'uni24C2' : 9410, + 'uni03AC' : 940, + 'uni03AB' : 939, + 'macron' : 175, + 'uni03AD' : 941, + 'uni03AF' : 943, + 'uni0294' : 660, + 'uni0295' : 661, + 'uni0296' : 662, + 'uni0297' : 663, + 'uni0290' : 656, + 'uni0291' : 657, + 'uni0292' : 658, + 'atilde' : 227, + 'Acircumflex' : 194, + 'uni2370' : 9072, + 'uni24C1' : 9409, + 'uni0298' : 664, + 'uni0299' : 665, + 'Oslash' : 216, + 'uni029E' : 670, + 'C' : 67, + 'quotedblleft' : 8220, + 'uni029B' : 667, + 'uni029C' : 668, + 'uni03A9' : 937, + 'uni03A8' : 936, + 'S' : 83, + 'uni24C9' : 9417, + 'uni03A1' : 929, + 'uni03A0' : 928, + 'exclam' : 33, + 'uni03A5' : 933, + 'uni03A4' : 932, + 'uni03A7' : 935, + 'Zcaron' : 381, + 'uni2133' : 8499, + 'uni2132' : 8498, + 'uni0159' : 345, + 'uni0158' : 344, + 'uni2137' : 8503, + 'uni2005' : 8197, + 'uni2135' : 8501, + 'uni2134' : 8500, + 'uni02BA' : 698, + 'uni2033' : 8243, + 'uni0151' : 337, + 'uni0150' : 336, + 'uni0157' : 343, + 'equal' : 61, + 'uni0155' : 341, + 'uni0154' : 340, + 's' : 115, + 'uni233F' : 9023, + 'eth' : 240, + 'uni24BE' : 9406, + 'uni21E9' : 8681, + 'uni2060' : 8288, + 'Egrave' : 200, + 'uni255D' : 9565, + 'uni24CD' : 9421, + 'uni21E1' : 8673, + 'uni21B9' : 8633, + 'hyphen' : 45, + 'uni01BE' : 446, + 'uni01BB' : 443, + 'period' : 46, + 'igrave' : 236, + 'uni01BA' : 442, + 'uni2296' : 8854, + 'uni2297' : 8855, + 'uni2294' : 8852, + 'uni2295' : 8853, + 'colon' : 58, + 'uni2293' : 8851, + 'uni2290' : 8848, + 'uni2291' : 8849, + 'uni032D' : 813, + 'uni032E' : 814, + 'uni032F' : 815, + 'uni032A' : 810, + 'uni032B' : 811, + 'uni032C' : 812, + 'uni231D' : 8989, + 'Ecircumflex' : 202, + 'uni24D7' : 9431, + 'uni25DD' : 9693, + 'trademark' : 8482, + 'Aacute' : 193, + 'cent' : 162, + 'uni0445' : 1093, + 'uni266E' : 9838, + 'uni266D' : 9837, + 'uni266B' : 9835, + 'uni03C9' : 969, + 'uni2003' : 8195, + 'uni2047' : 8263, + 'lslash' : 322, + 'uni03A6' : 934, + 'uni2043' : 8259, + 'uni250C' : 9484, + 'uni2040' : 8256, + 'uni255F' : 9567, + 'uni24CB' : 9419, + 'uni0472' : 1138, + 'uni0446' : 1094, + 'uni0474' : 1140, + 'uni0475' : 1141, + 'uni2508' : 9480, + 'uni2660' : 9824, + 'uni2506' : 9478, + 'uni2502' : 9474, + 'c' : 99, + 'uni2500' : 9472, + 'N' : 78, + 'uni22A6' : 8870, + 'uni21E7' : 8679, + 'uni2130' : 8496, + 'uni2002' : 8194, + 'breve' : 728, + 'uni0442' : 1090, + 'Oacute' : 211, + 'uni229F' : 8863, + 'uni25C7' : 9671, + 'uni229D' : 8861, + 'uni229E' : 8862, + 'guillemotleft' : 171, + 'uni0329' : 809, + 'uni24E5' : 9445, + 'uni011F' : 287, + 'uni0324' : 804, + 'uni0325' : 805, + 'uni0326' : 806, + 'uni0327' : 807, + 'uni0321' : 801, + 'uni0322' : 802, + 'n' : 110, + 'uni2032' : 8242, + 'uni2269' : 8809, + 'uni2268' : 8808, + 'uni0306' : 774, + 'uni226B' : 8811, + 'uni21EA' : 8682, + 'uni0166' : 358, + 'uni203B' : 8251, + 'uni01B5' : 437, + 'idieresis' : 239, + 'uni02BC' : 700, + 'uni01B0' : 432, + 'braceright' : 125, + 'seven' : 55, + 'uni02BB' : 699, + 'uni011A' : 282, + 'uni29FB' : 10747, + 'brokenbar' : 166, + 'uni2036' : 8246, + 'uni25C0' : 9664, + 'uni0156' : 342, + 'uni22D5' : 8917, + 'uni0258' : 600, + 'ugrave' : 249, + 'uni22D6' : 8918, + 'uni22D1' : 8913, + 'uni2034' : 8244, + 'uni22D3' : 8915, + 'uni22D2' : 8914, + 'uni203C' : 8252, + 'uni223E' : 8766, + 'uni02BF' : 703, + 'uni22D9' : 8921, + 'uni22D8' : 8920, + 'uni25BD' : 9661, + 'uni25BE' : 9662, + 'uni25BF' : 9663, + 'uni041B' : 1051, + 'periodcentered' : 183, + 'uni25BC' : 9660, + 'uni019E' : 414, + 'uni019B' : 411, + 'uni019A' : 410, + 'uni2007' : 8199, + 'uni0391' : 913, + 'uni0390' : 912, + 'uni0393' : 915, + 'uni0392' : 914, + 'uni0395' : 917, + 'uni0394' : 916, + 'uni0397' : 919, + 'uni0396' : 918, + 'uni0399' : 921, + 'uni0398' : 920, + 'uni25C8' : 9672, + 'uni2468' : 9320, + 'sterling' : 163, + 'uni22EB' : 8939, + 'uni039C' : 924, + 'uni039B' : 923, + 'uni039E' : 926, + 'uni039D' : 925, + 'uni039F' : 927, + 'I' : 73, + 'uni03E1' : 993, + 'uni03E0' : 992, + 'uni2319' : 8985, + 'uni228B' : 8843, + 'uni25B5' : 9653, + 'uni25B6' : 9654, + 'uni22EA' : 8938, + 'uni24B9' : 9401, + 'uni044E' : 1102, + 'uni0199' : 409, + 'uni2266' : 8806, + 'Y' : 89, + 'uni22A2' : 8866, + 'Eth' : 208, + 'uni266F' : 9839, + 'emdash' : 8212, + 'uni263B' : 9787, + 'uni24BD' : 9405, + 'uni22DE' : 8926, + 'uni0360' : 864, + 'uni2557' : 9559, + 'uni22DF' : 8927, + 'uni22DA' : 8922, + 'uni22DC' : 8924, + 'uni0361' : 865, + 'i' : 105, + 'uni24BF' : 9407, + 'uni0362' : 866, + 'uni263E' : 9790, + 'uni028D' : 653, + 'uni2259' : 8793, + 'uni0323' : 803, + 'uni2265' : 8805, + 'daggerdbl' : 8225, + 'y' : 121, + 'uni010A' : 266, + 'plusminus' : 177, + 'less' : 60, + 'uni21AE' : 8622, + 'uni0315' : 789, + 'uni230B' : 8971, + 'uni21AF' : 8623, + 'uni21AA' : 8618, + 'uni21AC' : 8620, + 'uni21AB' : 8619, + 'uni01FB' : 507, + 'uni01FC' : 508, + 'uni223A' : 8762, + 'uni01FA' : 506, + 'uni01FF' : 511, + 'uni01FD' : 509, + 'uni01FE' : 510, + 'uni2567' : 9575, + 'uni25E0' : 9696, + 'uni0104' : 260, + 'uni0105' : 261, + 'uni0106' : 262, + 'uni0107' : 263, + 'uni0100' : 256, + 'uni0101' : 257, + 'uni0102' : 258, + 'uni0103' : 259, + 'uni2038' : 8248, + 'uni2009' : 8201, + 'uni2008' : 8200, + 'uni0108' : 264, + 'uni0109' : 265, + 'uni02A1' : 673, + 'uni223B' : 8763, + 'uni226C' : 8812, + 'uni25AC' : 9644, + 'uni24D3' : 9427, + 'uni21E0' : 8672, + 'uni21E3' : 8675, + 'Udieresis' : 220, + 'uni21E2' : 8674, + 'D' : 68, + 'uni21E5' : 8677, + 'uni2621' : 9761, + 'uni21D1' : 8657, + 'uni203E' : 8254, + 'uni22C6' : 8902, + 'uni21E4' : 8676, + 'uni010D' : 269, + 'uni010E' : 270, + 'uni010F' : 271, + 'five' : 53, + 'T' : 84, + 'uni010B' : 267, + 'uni010C' : 268, + 'uni2605' : 9733, + 'uni2663' : 9827, + 'uni21E6' : 8678, + 'uni24B6' : 9398, + 'uni22C1' : 8897, + 'oslash' : 248, + 'acute' : 180, + 'uni01F0' : 496, + 'd' : 100, + 'OE' : 338, + 'uni22E3' : 8931, + 'Igrave' : 204, + 'uni2308' : 8968, + 'uni2309' : 8969, + 'uni21A9' : 8617, + 't' : 116, + 'uni2313' : 8979, + 'uni03A3' : 931, + 'uni21A4' : 8612, + 'uni21A7' : 8615, + 'uni21A6' : 8614, + 'uni21A1' : 8609, + 'uni21A0' : 8608, + 'uni21A3' : 8611, + 'uni21A2' : 8610, + 'parenright' : 41, + 'uni256A' : 9578, + 'uni25DC' : 9692, + 'uni24CE' : 9422, + 'uni042C' : 1068, + 'uni24E0' : 9440, + 'uni042B' : 1067, + 'uni0409' : 1033, + 'uni0408' : 1032, + 'uni24E7' : 9447, + 'uni25B4' : 9652, + 'uni042A' : 1066, + 'uni228E' : 8846, + 'uni0401' : 1025, + 'adieresis' : 228, + 'uni0403' : 1027, + 'quotesingle' : 39, + 'uni0405' : 1029, + 'uni0404' : 1028, + 'uni0407' : 1031, + 'uni0406' : 1030, + 'uni229C' : 8860, + 'uni2306' : 8966, + 'uni2253' : 8787, + 'twodotenleader' : 8229, + 'uni2131' : 8497, + 'uni21DA' : 8666, + 'uni2234' : 8756, + 'uni2235' : 8757, + 'uni01A5' : 421, + 'uni2237' : 8759, + 'uni2230' : 8752, + 'uni02CC' : 716, + 'slash' : 47, + 'uni01A0' : 416, + 'ellipsis' : 8230, + 'uni2299' : 8857, + 'uni2238' : 8760, + 'numbersign' : 35, + 'uni21A8' : 8616, + 'uni223D' : 8765, + 'uni01AF' : 431, + 'uni223F' : 8767, + 'uni01AD' : 429, + 'uni01AB' : 427, + 'odieresis' : 246, + 'uni223C' : 8764, + 'uni227D' : 8829, + 'uni0280' : 640, + 'O' : 79, + 'uni227E' : 8830, + 'uni21A5' : 8613, + 'uni22D4' : 8916, + 'uni25D4' : 9684, + 'uni227F' : 8831, + 'uni0435' : 1077, + 'uni2302' : 8962, + 'uni2669' : 9833, + 'uni24E3' : 9443, + 'uni2720' : 10016, + 'uni22A8' : 8872, + 'uni22A9' : 8873, + 'uni040A' : 1034, + 'uni22A7' : 8871, + 'oe' : 339, + 'uni040B' : 1035, + 'uni040E' : 1038, + 'uni22A3' : 8867, + 'o' : 111, + 'uni040F' : 1039, + 'Edieresis' : 203, + 'uni25D5' : 9685, + 'plus' : 43, + 'uni044D' : 1101, + 'uni263C' : 9788, + 'uni22E6' : 8934, + 'uni2283' : 8835, + 'uni258C' : 9612, + 'uni219E' : 8606, + 'uni24E4' : 9444, + 'uni2136' : 8502, + 'dagger' : 8224, + 'uni24B7' : 9399, + 'uni219B' : 8603, + 'uni22E5' : 8933, + 'three' : 51, + 'uni210B' : 8459, + 'uni2534' : 9524, + 'uni24B8' : 9400, + 'uni230A' : 8970, + 'hungarumlaut' : 733, + 'parenleft' : 40, + 'uni0148' : 328, + 'uni0149' : 329, + 'uni2124' : 8484, + 'uni2125' : 8485, + 'uni2126' : 8486, + 'uni2127' : 8487, + 'uni0140' : 320, + 'uni2129' : 8489, + 'uni25C5' : 9669, + 'uni0143' : 323, + 'uni0144' : 324, + 'uni0145' : 325, + 'uni0146' : 326, + 'uni0147' : 327, + 'uni210D' : 8461, + 'fraction' : 8260, + 'uni2031' : 8241, + 'uni2196' : 8598, + 'uni2035' : 8245, + 'uni24E6' : 9446, + 'uni016B' : 363, + 'uni24BA' : 9402, + 'uni266A' : 9834, + 'uni0116' : 278, + 'uni2115' : 8469, + 'registered' : 174, + 'J' : 74, + 'uni25DF' : 9695, + 'uni25CE' : 9678, + 'uni273D' : 10045, + 'dieresis' : 168, + 'uni212B' : 8491, + 'uni0114' : 276, + 'uni212D' : 8493, + 'uni212E' : 8494, + 'uni212F' : 8495, + 'uni014A' : 330, + 'uni014B' : 331, + 'uni014C' : 332, + 'uni014D' : 333, + 'uni014E' : 334, + 'uni014F' : 335, + 'uni025E' : 606, + 'uni24E8' : 9448, + 'uni0111' : 273, + 'uni24E9' : 9449, + 'Ograve' : 210, + 'j' : 106, + 'uni2195' : 8597, + 'uni2194' : 8596, + 'uni2197' : 8599, + 'uni2037' : 8247, + 'uni2191' : 8593, + 'uni2190' : 8592, + 'uni2193' : 8595, + 'uni2192' : 8594, + 'uni29FA' : 10746, + 'uni2713' : 10003, + 'z' : 122, + 'uni2199' : 8601, + 'uni2198' : 8600, + 'uni2667' : 9831, + 'ae' : 230, + 'uni0448' : 1096, + 'semicolon' : 59, + 'uni2666' : 9830, + 'uni038F' : 911, + 'uni0444' : 1092, + 'uni0447' : 1095, + 'uni038E' : 910, + 'uni0441' : 1089, + 'uni038C' : 908, + 'uni0443' : 1091, + 'uni038A' : 906, + 'uni0250' : 592, + 'uni0251' : 593, + 'uni0252' : 594, + 'uni0253' : 595, + 'uni0254' : 596, + 'at' : 64, + 'uni0256' : 598, + 'uni0257' : 599, + 'uni0167' : 359, + 'uni0259' : 601, + 'uni228C' : 8844, + 'uni2662' : 9826, + 'uni0319' : 793, + 'uni0318' : 792, + 'uni24BC' : 9404, + 'uni0402' : 1026, + 'uni22EF' : 8943, + 'Iacute' : 205, + 'uni22ED' : 8941, + 'uni22EE' : 8942, + 'uni0311' : 785, + 'uni0310' : 784, + 'uni21E8' : 8680, + 'uni0312' : 786, + 'percent' : 37, + 'uni0317' : 791, + 'uni0316' : 790, + 'uni21D6' : 8662, + 'uni21D7' : 8663, + 'uni21D4' : 8660, + 'uni21D5' : 8661, + 'uni21D2' : 8658, + 'uni21D3' : 8659, + 'uni21D0' : 8656, + 'uni2138' : 8504, + 'uni2270' : 8816, + 'uni2271' : 8817, + 'uni2272' : 8818, + 'uni2273' : 8819, + 'uni2274' : 8820, + 'uni2275' : 8821, + 'bracketright' : 93, + 'uni21D9' : 8665, + 'uni21DF' : 8671, + 'uni21DD' : 8669, + 'uni21DE' : 8670, + 'AE' : 198, + 'uni03AE' : 942, + 'uni227A' : 8826, + 'uni227B' : 8827, + 'uni227C' : 8828, + 'asterisk' : 42, + 'aacute' : 225, + 'uni226F' : 8815, + 'uni22E2' : 8930, + 'uni0386' : 902, + 'uni22E0' : 8928, + 'uni22E1' : 8929, + 'U' : 85, + 'uni22E7' : 8935, + 'uni22E4' : 8932, + 'uni0387' : 903, + 'uni031A' : 794, + 'eacute' : 233, + 'uni22E8' : 8936, + 'uni22E9' : 8937, + 'uni24D8' : 9432, + 'uni025A' : 602, + 'uni025B' : 603, + 'uni025C' : 604, + 'e' : 101, + 'uni0128' : 296, + 'uni025F' : 607, + 'uni2665' : 9829, + 'thorn' : 254, + 'uni0129' : 297, + 'uni253C' : 9532, + 'uni25D7' : 9687, + 'u' : 117, + 'uni0388' : 904, + 'uni0389' : 905, + 'uni0255' : 597, + 'uni0171' : 369, + 'uni0384' : 900, + 'uni0385' : 901, + 'uni044A' : 1098, + 'uni252C' : 9516, + 'uni044C' : 1100, + 'uni044B' : 1099 +} uni2type1 = dict([(v,k) for k,v in type12uni.items()]) tex2uni = { -'widehat': 0x0302, -'widetilde': 0x0303, -'widebar': 0x0305, -'langle': 0x27e8, -'rangle': 0x27e9, -'perp': 0x27c2, -'neq': 0x2260, -'Join': 0x2a1d, -'leqslant': 0x2a7d, -'geqslant': 0x2a7e, -'lessapprox': 0x2a85, -'gtrapprox': 0x2a86, -'lesseqqgtr': 0x2a8b, -'gtreqqless': 0x2a8c, -'triangleeq': 0x225c, -'eqslantless': 0x2a95, -'eqslantgtr': 0x2a96, -'backepsilon': 0x03f6, -'precapprox': 0x2ab7, -'succapprox': 0x2ab8, -'fallingdotseq': 0x2252, -'subseteqq': 0x2ac5, -'supseteqq': 0x2ac6, -'varpropto': 0x221d, -'precnapprox': 0x2ab9, -'succnapprox': 0x2aba, -'subsetneqq': 0x2acb, -'supsetneqq': 0x2acc, -'lnapprox': 0x2ab9, -'gnapprox': 0x2aba, -'longleftarrow': 0x27f5, -'longrightarrow': 0x27f6, -'longleftrightarrow': 0x27f7, -'Longleftarrow': 0x27f8, -'Longrightarrow': 0x27f9, -'Longleftrightarrow': 0x27fa, -'longmapsto': 0x27fc, -'leadsto': 0x21dd, -'dashleftarrow': 0x290e, -'dashrightarrow': 0x290f, -'circlearrowleft': 0x21ba, -'circlearrowright': 0x21bb, -'leftrightsquigarrow': 0x21ad, -'leftsquigarrow': 0x219c, -'rightsquigarrow': 0x219d, -'Game': 0x2141, -'hbar': 0x0127, -'hslash': 0x210f, -'ldots': 0x2026, -'vdots': 0x22ee, -'doteqdot': 0x2251, -'doteq': 8784, -'partial': 8706, -'gg': 8811, -'asymp': 8781, -'blacktriangledown': 9662, -'otimes': 8855, -'nearrow': 8599, -'varpi': 982, -'vee': 8744, -'vec': 8407, -'smile': 8995, -'succnsim': 8937, -'gimel': 8503, -'vert': 124, -'|': 124, -'varrho': 1009, -'P': 182, -'approxident': 8779, -'Swarrow': 8665, -'textasciicircum': 94, -'imageof': 8887, -'ntriangleleft': 8938, -'nleq': 8816, -'div': 247, -'nparallel': 8742, -'Leftarrow': 8656, -'lll': 8920, -'oiint': 8751, -'ngeq': 8817, -'Theta': 920, -'origof': 8886, -'blacksquare': 9632, -'solbar': 9023, -'neg': 172, -'sum': 8721, -'Vdash': 8873, -'coloneq': 8788, -'degree': 176, -'bowtie': 8904, -'blacktriangleright': 9654, -'varsigma': 962, -'leq': 8804, -'ggg': 8921, -'lneqq': 8808, -'scurel': 8881, -'stareq': 8795, -'BbbN': 8469, -'nLeftarrow': 8653, -'nLeftrightarrow': 8654, -'k': 808, -'bot': 8869, -'BbbC': 8450, -'Lsh': 8624, -'leftleftarrows': 8647, -'BbbZ': 8484, -'digamma': 989, -'BbbR': 8477, -'BbbP': 8473, -'BbbQ': 8474, -'vartriangleright': 8883, -'succsim': 8831, -'wedge': 8743, -'lessgtr': 8822, -'veebar': 8891, -'mapsdown': 8615, -'Rsh': 8625, -'chi': 967, -'prec': 8826, -'nsubseteq': 8840, -'therefore': 8756, -'eqcirc': 8790, -'textexclamdown': 161, -'nRightarrow': 8655, -'flat': 9837, -'notin': 8713, -'llcorner': 8990, -'varepsilon': 949, -'bigtriangleup': 9651, -'aleph': 8501, -'dotminus': 8760, -'upsilon': 965, -'Lambda': 923, -'cap': 8745, -'barleftarrow': 8676, -'mu': 956, -'boxplus': 8862, -'mp': 8723, -'circledast': 8859, -'tau': 964, -'in': 8712, -'backslash': 92, -'varnothing': 8709, -'sharp': 9839, -'eqsim': 8770, -'gnsim': 8935, -'Searrow': 8664, -'updownarrows': 8645, -'heartsuit': 9825, -'trianglelefteq': 8884, -'ddag': 8225, -'sqsubseteq': 8849, -'mapsfrom': 8612, -'boxbar': 9707, -'sim': 8764, -'Nwarrow': 8662, -'nequiv': 8802, -'succ': 8827, -'vdash': 8866, -'Leftrightarrow': 8660, -'parallel': 8741, -'invnot': 8976, -'natural': 9838, -'ss': 223, -'uparrow': 8593, -'nsim': 8769, -'hookrightarrow': 8618, -'Equiv': 8803, -'approx': 8776, -'Vvdash': 8874, -'nsucc': 8833, -'leftrightharpoons': 8651, -'Re': 8476, -'boxminus': 8863, -'equiv': 8801, -'Lleftarrow': 8666, -'thinspace': 8201, -'ll': 8810, -'Cup': 8915, -'measeq': 8798, -'upharpoonleft': 8639, -'lq': 8216, -'Upsilon': 933, -'subsetneq': 8842, -'greater': 62, -'supsetneq': 8843, -'Cap': 8914, -'L': 321, -'spadesuit': 9824, -'lrcorner': 8991, -'not': 824, -'bar': 772, -'rightharpoonaccent': 8401, -'boxdot': 8865, -'l': 322, -'leftharpoondown': 8637, -'bigcup': 8899, -'iint': 8748, -'bigwedge': 8896, -'downharpoonleft': 8643, -'textasciitilde': 126, -'subset': 8834, -'leqq': 8806, -'mapsup': 8613, -'nvDash': 8877, -'looparrowleft': 8619, -'nless': 8814, -'rightarrowbar': 8677, -'Vert': 8214, -'downdownarrows': 8650, -'uplus': 8846, -'simeq': 8771, -'napprox': 8777, -'ast': 8727, -'twoheaduparrow': 8607, -'doublebarwedge': 8966, -'Sigma': 931, -'leftharpoonaccent': 8400, -'ntrianglelefteq': 8940, -'nexists': 8708, -'times': 215, -'measuredangle': 8737, -'bumpeq': 8783, -'carriagereturn': 8629, -'adots': 8944, -'checkmark': 10003, -'lambda': 955, -'xi': 958, -'rbrace': 125, -'rbrack': 93, -'Nearrow': 8663, -'maltese': 10016, -'clubsuit': 9827, -'top': 8868, -'overarc': 785, -'varphi': 966, -'Delta': 916, -'iota': 953, -'nleftarrow': 8602, -'candra': 784, -'supset': 8835, -'triangleleft': 9665, -'gtreqless': 8923, -'ntrianglerighteq': 8941, -'quad': 8195, -'Xi': 926, -'gtrdot': 8919, -'leftthreetimes': 8907, -'minus': 8722, -'preccurlyeq': 8828, -'nleftrightarrow': 8622, -'lambdabar': 411, -'blacktriangle': 9652, -'kernelcontraction': 8763, -'Phi': 934, -'angle': 8736, -'spadesuitopen': 9828, -'eqless': 8924, -'mid': 8739, -'varkappa': 1008, -'Ldsh': 8626, -'updownarrow': 8597, -'beta': 946, -'textquotedblleft': 8220, -'rho': 961, -'alpha': 945, -'intercal': 8890, -'beth': 8502, -'grave': 768, -'acwopencirclearrow': 8634, -'nmid': 8740, -'nsupset': 8837, -'sigma': 963, -'dot': 775, -'Rightarrow': 8658, -'turnednot': 8985, -'backsimeq': 8909, -'leftarrowtail': 8610, -'approxeq': 8778, -'curlyeqsucc': 8927, -'rightarrowtail': 8611, -'Psi': 936, -'copyright': 169, -'yen': 165, -'vartriangleleft': 8882, -'rasp': 700, -'triangleright': 9655, -'precsim': 8830, -'infty': 8734, -'geq': 8805, -'updownarrowbar': 8616, -'precnsim': 8936, -'H': 779, -'ulcorner': 8988, -'looparrowright': 8620, -'ncong': 8775, -'downarrow': 8595, -'circeq': 8791, -'subseteq': 8838, -'bigstar': 9733, -'prime': 8242, -'lceil': 8968, -'Rrightarrow': 8667, -'oiiint': 8752, -'curlywedge': 8911, -'vDash': 8872, -'lfloor': 8970, -'ddots': 8945, -'exists': 8707, -'underbar': 817, -'Pi': 928, -'leftrightarrows': 8646, -'sphericalangle': 8738, -'coprod': 8720, -'circledcirc': 8858, -'gtrsim': 8819, -'gneqq': 8809, -'between': 8812, -'theta': 952, -'complement': 8705, -'arceq': 8792, -'nVdash': 8878, -'S': 167, -'wr': 8768, -'wp': 8472, -'backcong': 8780, -'lasp': 701, -'c': 807, -'nabla': 8711, -'dotplus': 8724, -'eta': 951, -'forall': 8704, -'eth': 240, -'colon': 58, -'sqcup': 8852, -'rightrightarrows': 8649, -'sqsupset': 8848, -'mapsto': 8614, -'bigtriangledown': 9661, -'sqsupseteq': 8850, -'propto': 8733, -'pi': 960, -'pm': 177, -'dots': 0x2026, -'nrightarrow': 8603, -'textasciiacute': 180, -'Doteq': 8785, -'breve': 774, -'sqcap': 8851, -'twoheadrightarrow': 8608, -'kappa': 954, -'vartriangle': 9653, -'diamondsuit': 9826, -'pitchfork': 8916, -'blacktriangleleft': 9664, -'nprec': 8832, -'vdots': 8942, -'curvearrowright': 8631, -'barwedge': 8892, -'multimap': 8888, -'textquestiondown': 191, -'cong': 8773, -'rtimes': 8906, -'rightzigzagarrow': 8669, -'rightarrow': 8594, -'leftarrow': 8592, -'__sqrt__': 8730, -'twoheaddownarrow': 8609, -'oint': 8750, -'bigvee': 8897, -'eqdef': 8797, -'sterling': 163, -'phi': 981, -'Updownarrow': 8661, -'backprime': 8245, -'emdash': 8212, -'Gamma': 915, -'i': 305, -'rceil': 8969, -'leftharpoonup': 8636, -'Im': 8465, -'curvearrowleft': 8630, -'wedgeq': 8793, -'fallingdotseq': 8786, -'curlyeqprec': 8926, -'questeq': 8799, -'less': 60, -'upuparrows': 8648, -'tilde': 771, -'textasciigrave': 96, -'smallsetminus': 8726, -'ell': 8467, -'cup': 8746, -'danger': 9761, -'nVDash': 8879, -'cdotp': 183, -'cdots': 8943, -'hat': 770, -'eqgtr': 8925, -'enspace': 8194, -'psi': 968, -'frown': 8994, -'acute': 769, -'downzigzagarrow': 8623, -'ntriangleright': 8939, -'cupdot': 8845, -'circleddash': 8861, -'oslash': 8856, -'mho': 8487, -'d': 803, -'sqsubset': 8847, -'cdot': 8901, -'Omega': 937, -'OE': 338, -'veeeq': 8794, -'Finv': 8498, -'t': 865, -'leftrightarrow': 8596, -'swarrow': 8601, -'rightthreetimes': 8908, -'rightleftharpoons': 8652, -'lesssim': 8818, -'searrow': 8600, -'because': 8757, -'gtrless': 8823, -'star': 8902, -'nsubset': 8836, -'zeta': 950, -'dddot': 8411, -'bigcirc': 9675, -'Supset': 8913, -'circ': 8728, -'slash': 8725, -'ocirc': 778, -'prod': 8719, -'twoheadleftarrow': 8606, -'daleth': 8504, -'upharpoonright': 8638, -'odot': 8857, -'Uparrow': 8657, -'O': 216, -'hookleftarrow': 8617, -'trianglerighteq': 8885, -'nsime': 8772, -'oe': 339, -'nwarrow': 8598, -'o': 248, -'ddddot': 8412, -'downharpoonright': 8642, -'succcurlyeq': 8829, -'gamma': 947, -'scrR': 8475, -'dag': 8224, -'thickspace': 8197, -'frakZ': 8488, -'lessdot': 8918, -'triangledown': 9663, -'ltimes': 8905, -'scrB': 8492, -'endash': 8211, -'scrE': 8496, -'scrF': 8497, -'scrH': 8459, -'scrI': 8464, -'rightharpoondown': 8641, -'scrL': 8466, -'scrM': 8499, -'frakC': 8493, -'nsupseteq': 8841, -'circledR': 174, -'circledS': 9416, -'ngtr': 8815, -'bigcap': 8898, -'scre': 8495, -'Downarrow': 8659, -'scrg': 8458, -'overleftrightarrow': 8417, -'scro': 8500, -'lnsim': 8934, -'eqcolon': 8789, -'curlyvee': 8910, -'urcorner': 8989, -'lbrace': 123, -'Bumpeq': 8782, -'delta': 948, -'boxtimes': 8864, -'overleftarrow': 8406, -'prurel': 8880, -'clubsuitopen': 9831, -'cwopencirclearrow': 8635, -'geqq': 8807, -'rightleftarrows': 8644, -'ac': 8766, -'ae': 230, -'int': 8747, -'rfloor': 8971, -'risingdotseq': 8787, -'nvdash': 8876, -'diamond': 8900, -'ddot': 776, -'backsim': 8765, -'oplus': 8853, -'triangleq': 8796, -'check': 780, -'ni': 8715, -'iiint': 8749, -'ne': 8800, -'lesseqgtr': 8922, -'obar': 9021, -'supseteq': 8839, -'nu': 957, -'AA': 8491, -'AE': 198, -'models': 8871, -'ominus': 8854, -'dashv': 8867, -'omega': 969, -'rq': 8217, -'Subset': 8912, -'rightharpoonup': 8640, -'Rdsh': 8627, -'bullet': 8729, -'divideontimes': 8903, -'lbrack': 91, -'textquotedblright': 8221, -'Colon': 8759, -'%': 37, -'$': 36, -'{': 123, -'}': 125, -'_': 95, -'#': 35, -'imath': 0x131, -'circumflexaccent' : 770, -'combiningbreve' : 774, -'combiningoverline' : 772, -'combininggraveaccent' : 768, -'combiningacuteaccent' : 769, -'combiningdiaeresis' : 776, -'combiningtilde' : 771, -'combiningrightarrowabove' : 8407, -'combiningdotabove' : 775, -'to': 8594, -'succeq': 8829, -'emptyset': 8709, -'leftparen': 40, -'rightparen': 41, -'bigoplus': 10753, -'leftangle': 10216, -'rightangle': 10217, -'leftbrace': 124, -'rightbrace': 125, -'jmath': 567, -'bigodot': 10752, -'preceq': 8828, -'biguplus': 10756, -'epsilon': 949, -'vartheta': 977, -'bigotimes': 10754 + 'widehat' : 0x0302, + 'widetilde' : 0x0303, + 'widebar' : 0x0305, + 'langle' : 0x27e8, + 'rangle' : 0x27e9, + 'perp' : 0x27c2, + 'neq' : 0x2260, + 'Join' : 0x2a1d, + 'leqslant' : 0x2a7d, + 'geqslant' : 0x2a7e, + 'lessapprox' : 0x2a85, + 'gtrapprox' : 0x2a86, + 'lesseqqgtr' : 0x2a8b, + 'gtreqqless' : 0x2a8c, + 'triangleeq' : 0x225c, + 'eqslantless' : 0x2a95, + 'eqslantgtr' : 0x2a96, + 'backepsilon' : 0x03f6, + 'precapprox' : 0x2ab7, + 'succapprox' : 0x2ab8, + 'fallingdotseq' : 0x2252, + 'subseteqq' : 0x2ac5, + 'supseteqq' : 0x2ac6, + 'varpropto' : 0x221d, + 'precnapprox' : 0x2ab9, + 'succnapprox' : 0x2aba, + 'subsetneqq' : 0x2acb, + 'supsetneqq' : 0x2acc, + 'lnapprox' : 0x2ab9, + 'gnapprox' : 0x2aba, + 'longleftarrow' : 0x27f5, + 'longrightarrow' : 0x27f6, + 'longleftrightarrow' : 0x27f7, + 'Longleftarrow' : 0x27f8, + 'Longrightarrow' : 0x27f9, + 'Longleftrightarrow' : 0x27fa, + 'longmapsto' : 0x27fc, + 'leadsto' : 0x21dd, + 'dashleftarrow' : 0x290e, + 'dashrightarrow' : 0x290f, + 'circlearrowleft' : 0x21ba, + 'circlearrowright' : 0x21bb, + 'leftrightsquigarrow' : 0x21ad, + 'leftsquigarrow' : 0x219c, + 'rightsquigarrow' : 0x219d, + 'Game' : 0x2141, + 'hbar' : 0x0127, + 'hslash' : 0x210f, + 'ldots' : 0x2026, + 'vdots' : 0x22ee, + 'doteqdot' : 0x2251, + 'doteq' : 8784, + 'partial' : 8706, + 'gg' : 8811, + 'asymp' : 8781, + 'blacktriangledown' : 9662, + 'otimes' : 8855, + 'nearrow' : 8599, + 'varpi' : 982, + 'vee' : 8744, + 'vec' : 8407, + 'smile' : 8995, + 'succnsim' : 8937, + 'gimel' : 8503, + 'vert' : 124, + '|' : 124, + 'varrho' : 1009, + 'P' : 182, + 'approxident' : 8779, + 'Swarrow' : 8665, + 'textasciicircum' : 94, + 'imageof' : 8887, + 'ntriangleleft' : 8938, + 'nleq' : 8816, + 'div' : 247, + 'nparallel' : 8742, + 'Leftarrow' : 8656, + 'lll' : 8920, + 'oiint' : 8751, + 'ngeq' : 8817, + 'Theta' : 920, + 'origof' : 8886, + 'blacksquare' : 9632, + 'solbar' : 9023, + 'neg' : 172, + 'sum' : 8721, + 'Vdash' : 8873, + 'coloneq' : 8788, + 'degree' : 176, + 'bowtie' : 8904, + 'blacktriangleright' : 9654, + 'varsigma' : 962, + 'leq' : 8804, + 'ggg' : 8921, + 'lneqq' : 8808, + 'scurel' : 8881, + 'stareq' : 8795, + 'BbbN' : 8469, + 'nLeftarrow' : 8653, + 'nLeftrightarrow' : 8654, + 'k' : 808, + 'bot' : 8869, + 'BbbC' : 8450, + 'Lsh' : 8624, + 'leftleftarrows' : 8647, + 'BbbZ' : 8484, + 'digamma' : 989, + 'BbbR' : 8477, + 'BbbP' : 8473, + 'BbbQ' : 8474, + 'vartriangleright' : 8883, + 'succsim' : 8831, + 'wedge' : 8743, + 'lessgtr' : 8822, + 'veebar' : 8891, + 'mapsdown' : 8615, + 'Rsh' : 8625, + 'chi' : 967, + 'prec' : 8826, + 'nsubseteq' : 8840, + 'therefore' : 8756, + 'eqcirc' : 8790, + 'textexclamdown' : 161, + 'nRightarrow' : 8655, + 'flat' : 9837, + 'notin' : 8713, + 'llcorner' : 8990, + 'varepsilon' : 949, + 'bigtriangleup' : 9651, + 'aleph' : 8501, + 'dotminus' : 8760, + 'upsilon' : 965, + 'Lambda' : 923, + 'cap' : 8745, + 'barleftarrow' : 8676, + 'mu' : 956, + 'boxplus' : 8862, + 'mp' : 8723, + 'circledast' : 8859, + 'tau' : 964, + 'in' : 8712, + 'backslash' : 92, + 'varnothing' : 8709, + 'sharp' : 9839, + 'eqsim' : 8770, + 'gnsim' : 8935, + 'Searrow' : 8664, + 'updownarrows' : 8645, + 'heartsuit' : 9825, + 'trianglelefteq' : 8884, + 'ddag' : 8225, + 'sqsubseteq' : 8849, + 'mapsfrom' : 8612, + 'boxbar' : 9707, + 'sim' : 8764, + 'Nwarrow' : 8662, + 'nequiv' : 8802, + 'succ' : 8827, + 'vdash' : 8866, + 'Leftrightarrow' : 8660, + 'parallel' : 8741, + 'invnot' : 8976, + 'natural' : 9838, + 'ss' : 223, + 'uparrow' : 8593, + 'nsim' : 8769, + 'hookrightarrow' : 8618, + 'Equiv' : 8803, + 'approx' : 8776, + 'Vvdash' : 8874, + 'nsucc' : 8833, + 'leftrightharpoons' : 8651, + 'Re' : 8476, + 'boxminus' : 8863, + 'equiv' : 8801, + 'Lleftarrow' : 8666, + 'thinspace' : 8201, + 'll' : 8810, + 'Cup' : 8915, + 'measeq' : 8798, + 'upharpoonleft' : 8639, + 'lq' : 8216, + 'Upsilon' : 933, + 'subsetneq' : 8842, + 'greater' : 62, + 'supsetneq' : 8843, + 'Cap' : 8914, + 'L' : 321, + 'spadesuit' : 9824, + 'lrcorner' : 8991, + 'not' : 824, + 'bar' : 772, + 'rightharpoonaccent' : 8401, + 'boxdot' : 8865, + 'l' : 322, + 'leftharpoondown' : 8637, + 'bigcup' : 8899, + 'iint' : 8748, + 'bigwedge' : 8896, + 'downharpoonleft' : 8643, + 'textasciitilde' : 126, + 'subset' : 8834, + 'leqq' : 8806, + 'mapsup' : 8613, + 'nvDash' : 8877, + 'looparrowleft' : 8619, + 'nless' : 8814, + 'rightarrowbar' : 8677, + 'Vert' : 8214, + 'downdownarrows' : 8650, + 'uplus' : 8846, + 'simeq' : 8771, + 'napprox' : 8777, + 'ast' : 8727, + 'twoheaduparrow' : 8607, + 'doublebarwedge' : 8966, + 'Sigma' : 931, + 'leftharpoonaccent' : 8400, + 'ntrianglelefteq' : 8940, + 'nexists' : 8708, + 'times' : 215, + 'measuredangle' : 8737, + 'bumpeq' : 8783, + 'carriagereturn' : 8629, + 'adots' : 8944, + 'checkmark' : 10003, + 'lambda' : 955, + 'xi' : 958, + 'rbrace' : 125, + 'rbrack' : 93, + 'Nearrow' : 8663, + 'maltese' : 10016, + 'clubsuit' : 9827, + 'top' : 8868, + 'overarc' : 785, + 'varphi' : 966, + 'Delta' : 916, + 'iota' : 953, + 'nleftarrow' : 8602, + 'candra' : 784, + 'supset' : 8835, + 'triangleleft' : 9665, + 'gtreqless' : 8923, + 'ntrianglerighteq' : 8941, + 'quad' : 8195, + 'Xi' : 926, + 'gtrdot' : 8919, + 'leftthreetimes' : 8907, + 'minus' : 8722, + 'preccurlyeq' : 8828, + 'nleftrightarrow' : 8622, + 'lambdabar' : 411, + 'blacktriangle' : 9652, + 'kernelcontraction' : 8763, + 'Phi' : 934, + 'angle' : 8736, + 'spadesuitopen' : 9828, + 'eqless' : 8924, + 'mid' : 8739, + 'varkappa' : 1008, + 'Ldsh' : 8626, + 'updownarrow' : 8597, + 'beta' : 946, + 'textquotedblleft' : 8220, + 'rho' : 961, + 'alpha' : 945, + 'intercal' : 8890, + 'beth' : 8502, + 'grave' : 768, + 'acwopencirclearrow' : 8634, + 'nmid' : 8740, + 'nsupset' : 8837, + 'sigma' : 963, + 'dot' : 775, + 'Rightarrow' : 8658, + 'turnednot' : 8985, + 'backsimeq' : 8909, + 'leftarrowtail' : 8610, + 'approxeq' : 8778, + 'curlyeqsucc' : 8927, + 'rightarrowtail' : 8611, + 'Psi' : 936, + 'copyright' : 169, + 'yen' : 165, + 'vartriangleleft' : 8882, + 'rasp' : 700, + 'triangleright' : 9655, + 'precsim' : 8830, + 'infty' : 8734, + 'geq' : 8805, + 'updownarrowbar' : 8616, + 'precnsim' : 8936, + 'H' : 779, + 'ulcorner' : 8988, + 'looparrowright' : 8620, + 'ncong' : 8775, + 'downarrow' : 8595, + 'circeq' : 8791, + 'subseteq' : 8838, + 'bigstar' : 9733, + 'prime' : 8242, + 'lceil' : 8968, + 'Rrightarrow' : 8667, + 'oiiint' : 8752, + 'curlywedge' : 8911, + 'vDash' : 8872, + 'lfloor' : 8970, + 'ddots' : 8945, + 'exists' : 8707, + 'underbar' : 817, + 'Pi' : 928, + 'leftrightarrows' : 8646, + 'sphericalangle' : 8738, + 'coprod' : 8720, + 'circledcirc' : 8858, + 'gtrsim' : 8819, + 'gneqq' : 8809, + 'between' : 8812, + 'theta' : 952, + 'complement' : 8705, + 'arceq' : 8792, + 'nVdash' : 8878, + 'S' : 167, + 'wr' : 8768, + 'wp' : 8472, + 'backcong' : 8780, + 'lasp' : 701, + 'c' : 807, + 'nabla' : 8711, + 'dotplus' : 8724, + 'eta' : 951, + 'forall' : 8704, + 'eth' : 240, + 'colon' : 58, + 'sqcup' : 8852, + 'rightrightarrows' : 8649, + 'sqsupset' : 8848, + 'mapsto' : 8614, + 'bigtriangledown' : 9661, + 'sqsupseteq' : 8850, + 'propto' : 8733, + 'pi' : 960, + 'pm' : 177, + 'dots' : 0x2026, + 'nrightarrow' : 8603, + 'textasciiacute' : 180, + 'Doteq' : 8785, + 'breve' : 774, + 'sqcap' : 8851, + 'twoheadrightarrow' : 8608, + 'kappa' : 954, + 'vartriangle' : 9653, + 'diamondsuit' : 9826, + 'pitchfork' : 8916, + 'blacktriangleleft' : 9664, + 'nprec' : 8832, + 'vdots' : 8942, + 'curvearrowright' : 8631, + 'barwedge' : 8892, + 'multimap' : 8888, + 'textquestiondown' : 191, + 'cong' : 8773, + 'rtimes' : 8906, + 'rightzigzagarrow' : 8669, + 'rightarrow' : 8594, + 'leftarrow' : 8592, + '__sqrt__' : 8730, + 'twoheaddownarrow' : 8609, + 'oint' : 8750, + 'bigvee' : 8897, + 'eqdef' : 8797, + 'sterling' : 163, + 'phi' : 981, + 'Updownarrow' : 8661, + 'backprime' : 8245, + 'emdash' : 8212, + 'Gamma' : 915, + 'i' : 305, + 'rceil' : 8969, + 'leftharpoonup' : 8636, + 'Im' : 8465, + 'curvearrowleft' : 8630, + 'wedgeq' : 8793, + 'fallingdotseq' : 8786, + 'curlyeqprec' : 8926, + 'questeq' : 8799, + 'less' : 60, + 'upuparrows' : 8648, + 'tilde' : 771, + 'textasciigrave' : 96, + 'smallsetminus' : 8726, + 'ell' : 8467, + 'cup' : 8746, + 'danger' : 9761, + 'nVDash' : 8879, + 'cdotp' : 183, + 'cdots' : 8943, + 'hat' : 770, + 'eqgtr' : 8925, + 'enspace' : 8194, + 'psi' : 968, + 'frown' : 8994, + 'acute' : 769, + 'downzigzagarrow' : 8623, + 'ntriangleright' : 8939, + 'cupdot' : 8845, + 'circleddash' : 8861, + 'oslash' : 8856, + 'mho' : 8487, + 'd' : 803, + 'sqsubset' : 8847, + 'cdot' : 8901, + 'Omega' : 937, + 'OE' : 338, + 'veeeq' : 8794, + 'Finv' : 8498, + 't' : 865, + 'leftrightarrow' : 8596, + 'swarrow' : 8601, + 'rightthreetimes' : 8908, + 'rightleftharpoons' : 8652, + 'lesssim' : 8818, + 'searrow' : 8600, + 'because' : 8757, + 'gtrless' : 8823, + 'star' : 8902, + 'nsubset' : 8836, + 'zeta' : 950, + 'dddot' : 8411, + 'bigcirc' : 9675, + 'Supset' : 8913, + 'circ' : 8728, + 'slash' : 8725, + 'ocirc' : 778, + 'prod' : 8719, + 'twoheadleftarrow' : 8606, + 'daleth' : 8504, + 'upharpoonright' : 8638, + 'odot' : 8857, + 'Uparrow' : 8657, + 'O' : 216, + 'hookleftarrow' : 8617, + 'trianglerighteq' : 8885, + 'nsime' : 8772, + 'oe' : 339, + 'nwarrow' : 8598, + 'o' : 248, + 'ddddot' : 8412, + 'downharpoonright' : 8642, + 'succcurlyeq' : 8829, + 'gamma' : 947, + 'scrR' : 8475, + 'dag' : 8224, + 'thickspace' : 8197, + 'frakZ' : 8488, + 'lessdot' : 8918, + 'triangledown' : 9663, + 'ltimes' : 8905, + 'scrB' : 8492, + 'endash' : 8211, + 'scrE' : 8496, + 'scrF' : 8497, + 'scrH' : 8459, + 'scrI' : 8464, + 'rightharpoondown' : 8641, + 'scrL' : 8466, + 'scrM' : 8499, + 'frakC' : 8493, + 'nsupseteq' : 8841, + 'circledR' : 174, + 'circledS' : 9416, + 'ngtr' : 8815, + 'bigcap' : 8898, + 'scre' : 8495, + 'Downarrow' : 8659, + 'scrg' : 8458, + 'overleftrightarrow' : 8417, + 'scro' : 8500, + 'lnsim' : 8934, + 'eqcolon' : 8789, + 'curlyvee' : 8910, + 'urcorner' : 8989, + 'lbrace' : 123, + 'Bumpeq' : 8782, + 'delta' : 948, + 'boxtimes' : 8864, + 'overleftarrow' : 8406, + 'prurel' : 8880, + 'clubsuitopen' : 9831, + 'cwopencirclearrow' : 8635, + 'geqq' : 8807, + 'rightleftarrows' : 8644, + 'ac' : 8766, + 'ae' : 230, + 'int' : 8747, + 'rfloor' : 8971, + 'risingdotseq' : 8787, + 'nvdash' : 8876, + 'diamond' : 8900, + 'ddot' : 776, + 'backsim' : 8765, + 'oplus' : 8853, + 'triangleq' : 8796, + 'check' : 780, + 'ni' : 8715, + 'iiint' : 8749, + 'ne' : 8800, + 'lesseqgtr' : 8922, + 'obar' : 9021, + 'supseteq' : 8839, + 'nu' : 957, + 'AA' : 8491, + 'AE' : 198, + 'models' : 8871, + 'ominus' : 8854, + 'dashv' : 8867, + 'omega' : 969, + 'rq' : 8217, + 'Subset' : 8912, + 'rightharpoonup' : 8640, + 'Rdsh' : 8627, + 'bullet' : 8729, + 'divideontimes' : 8903, + 'lbrack' : 91, + 'textquotedblright' : 8221, + 'Colon' : 8759, + '%' : 37, + '$' : 36, + '{' : 123, + '}' : 125, + '_' : 95, + '#' : 35, + 'imath' : 0x131, + 'circumflexaccent' : 770, + 'combiningbreve' : 774, + 'combiningoverline' : 772, + 'combininggraveaccent' : 768, + 'combiningacuteaccent' : 769, + 'combiningdiaeresis' : 776, + 'combiningtilde' : 771, + 'combiningrightarrowabove' : 8407, + 'combiningdotabove' : 775, + 'to' : 8594, + 'succeq' : 8829, + 'emptyset' : 8709, + 'leftparen' : 40, + 'rightparen' : 41, + 'bigoplus' : 10753, + 'leftangle' : 10216, + 'rightangle' : 10217, + 'leftbrace' : 124, + 'rightbrace' : 125, + 'jmath' : 567, + 'bigodot' : 10752, + 'preceq' : 8828, + 'biguplus' : 10756, + 'epsilon' : 949, + 'vartheta' : 977, + 'bigotimes' : 10754 } # Each element is a 4-tuple of the form: diff -Nru matplotlib-0.99.3/lib/matplotlib/mathtext.py matplotlib-1.0.1/lib/matplotlib/mathtext.py --- matplotlib-0.99.3/lib/matplotlib/mathtext.py 2010-03-09 14:20:20.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/mathtext.py 2010-07-07 01:41:52.000000000 +0000 @@ -82,6 +82,14 @@ TeX/Type1 symbol"""%locals() raise ValueError, message +def unichr_safe(index): + """Return the Unicode character corresponding to the index, +or the replacement character if this is a narrow build of Python +and the requested character is outside the BMP.""" + try: + return unichr(index) + except ValueError: + return unichr(0xFFFD) class MathtextBackend(object): """ @@ -222,7 +230,10 @@ self.fonts_object.get_used_characters()) def get_hinting_type(self): - return LOAD_FORCE_AUTOHINT + if rcParams['text.hinting']: + return LOAD_FORCE_AUTOHINT + else: + return LOAD_NO_HINTING def MathtextBackendAgg(): return MathtextBackendBbox(MathtextBackendAggRender()) @@ -318,7 +329,8 @@ def render_glyph(self, ox, oy, info): oy = self.height - oy + info.offset - thetext = unichr(info.num) + thetext = unichr_safe(info.num) + self.svg_glyphs.append( (info.font, info.fontsize, thetext, ox, oy, info.metrics)) @@ -336,6 +348,34 @@ svg_elements, self.fonts_object.get_used_characters()) +class MathtextBackendPath(MathtextBackend): + """ + Store information to write a mathtext rendering to the Cairo + backend. + """ + + def __init__(self): + self.glyphs = [] + self.rects = [] + + def render_glyph(self, ox, oy, info): + oy = self.height - oy + info.offset + thetext = unichr_safe(info.num) + self.glyphs.append( + (info.font, info.fontsize, thetext, ox, oy)) + + def render_rect_filled(self, x1, y1, x2, y2): + self.rects.append( + (x1, self.height-y2 , x2 - x1, y2 - y1)) + + def get_results(self, box): + ship(0, -self.depth, box) + return (self.width, + self.height + self.depth, + self.depth, + self.glyphs, + self.rects) + class MathtextBackendCairo(MathtextBackend): """ Store information to write a mathtext rendering to the Cairo @@ -348,7 +388,7 @@ def render_glyph(self, ox, oy, info): oy = oy - info.offset - self.height - thetext = unichr(info.num) + thetext = unichr_safe(info.num) self.glyphs.append( (info.font, info.fontsize, thetext, ox, oy)) @@ -557,7 +597,7 @@ cached_font = self._fonts.get(basename) if cached_font is None: - font = FT2Font(basename) + font = FT2Font(str(basename)) cached_font = self.CachedFont(font) self._fonts[basename] = cached_font self._fonts[font.postscript_name] = cached_font @@ -809,11 +849,11 @@ fontname, uniindex = self._map_virtual_font( fontname, font_class, uniindex) + new_fontname = fontname + # Only characters in the "Letter" class should be italicized in 'it' # mode. Greek capital letters should be Roman. if found_symbol: - new_fontname = fontname - if fontname == 'it': if uniindex < 0x10000: unistring = unichr(uniindex) @@ -843,8 +883,8 @@ else: if fontname in ('it', 'regular') and isinstance(self, StixFonts): return self._get_glyph('rm', font_class, sym, fontsize) - warn("Font '%s' does not have a glyph for '%s'" % - (fontname, sym.encode('ascii', 'backslashreplace')), + warn("Font '%s' does not have a glyph for '%s' [U%x]" % + (new_fontname, sym.encode('ascii', 'backslashreplace'), uniindex), MathTextWarning) warn("Substituting with a dummy symbol.", MathTextWarning) fontname = 'rm' @@ -883,11 +923,11 @@ 'nonunibf' : 'STIXNonUnicode:weight=bold', 0 : 'STIXGeneral', - 1 : 'STIXSize1', - 2 : 'STIXSize2', - 3 : 'STIXSize3', - 4 : 'STIXSize4', - 5 : 'STIXSize5' + 1 : 'STIXSizeOneSym', + 2 : 'STIXSizeTwoSym', + 3 : 'STIXSizeThreeSym', + 4 : 'STIXSizeFourSym', + 5 : 'STIXSizeFiveSym' } use_cmex = False cm_fallback = False @@ -966,7 +1006,12 @@ cached_font = self._get_font(i) glyphindex = cached_font.charmap.get(uniindex) if glyphindex is not None: - alternatives.append((i, unichr(uniindex))) + alternatives.append((i, unichr_safe(uniindex))) + + # The largest size of the radical symbol in STIX has incorrect + # metrics that cause it to be disconnected from the stem. + if sym == r'\__sqrt__': + alternatives = alternatives[:-1] self._size_alternatives[sym] = alternatives return alternatives @@ -1001,7 +1046,11 @@ self.glyphd = {} self.fonts = {} - filename = findfont(default_font_prop, fontext='afm') + filename = findfont(default_font_prop, fontext='afm', + directory=self.basepath) + if filename is None: + filename = findfont('Helvetica', fontext='afm', + directory=self.basepath) default_font = AFM(file(filename, 'r')) default_font.fname = filename @@ -1151,7 +1200,7 @@ GROW_FACTOR = 1.0 / SHRINK_FACTOR # The number of different sizes of chars to use, beyond which they will not # get any smaller -NUM_SIZE_LEVELS = 4 +NUM_SIZE_LEVELS = 6 # Percentage of x-height of additional horiz. space after sub/superscripts SCRIPT_SPACE = 0.2 # Percentage of x-height that sub/superscripts drop below the baseline @@ -1613,9 +1662,10 @@ """ Convenience class to create a horizontal rule. """ - def __init__(self, state): - thickness = state.font_output.get_underline_thickness( - state.font, state.fontsize, state.dpi) + def __init__(self, state, thickness=None): + if thickness is None: + thickness = state.font_output.get_underline_thickness( + state.font, state.fontsize, state.dpi) height = depth = thickness * 0.5 Rule.__init__(self, inf, height, depth, state) @@ -2167,6 +2217,41 @@ | Error(r"Expected \frac{num}{den}")) ).setParseAction(self.frac).setName("frac") + stackrel = Group( + Suppress(Literal(r"\stackrel")) + + ((group + group) + | Error(r"Expected \stackrel{num}{den}")) + ).setParseAction(self.stackrel).setName("stackrel") + + + binom = Group( + Suppress(Literal(r"\binom")) + + ((group + group) + | Error(r"Expected \binom{num}{den}")) + ).setParseAction(self.binom).setName("binom") + + ambiDelim = oneOf(list(self._ambiDelim)) + leftDelim = oneOf(list(self._leftDelim)) + rightDelim = oneOf(list(self._rightDelim)) + rightDelimSafe = oneOf(list(self._rightDelim - set(['}']))) + genfrac = Group( + Suppress(Literal(r"\genfrac")) + + ((Suppress(Literal('{')) + + oneOf(list(self._ambiDelim | self._leftDelim | set(['']))) + + Suppress(Literal('}')) + + Suppress(Literal('{')) + + oneOf(list(self._ambiDelim | + (self._rightDelim - set(['}'])) | + set(['', r'\}']))) + + Suppress(Literal('}')) + + Suppress(Literal('{')) + + Regex("[0-9]*(\.?[0-9]*)?") + + Suppress(Literal('}')) + + group + group + group) + | Error(r"Expected \genfrac{ldelim}{rdelim}{rulesize}{style}{num}{den}")) + ).setParseAction(self.genfrac).setName("genfrac") + + sqrt = Group( Suppress(Literal(r"\sqrt")) + Optional( @@ -2183,6 +2268,9 @@ ^ accent ^ group ^ frac + ^ stackrel + ^ binom + ^ genfrac ^ sqrt ) @@ -2204,14 +2292,12 @@ | placeable ) - ambiDelim = oneOf(list(self._ambiDelim)) - leftDelim = oneOf(list(self._leftDelim)) - rightDelim = oneOf(list(self._rightDelim)) autoDelim <<(Suppress(Literal(r"\left")) + ((leftDelim | ambiDelim) | Error("Expected a delimiter")) + Group( - autoDelim - ^ OneOrMore(simple)) + OneOrMore( + autoDelim + ^ simple)) + Suppress(Literal(r"\right")) + ((rightDelim | ambiDelim) | Error("Expected a delimiter")) ) @@ -2591,9 +2677,9 @@ hlist = HCentered([sub]) hlist.hpack(width, 'exactly') vlist.extend([Kern(rule_thickness * 3.0), hlist]) - shift = hlist.height + hlist.depth + rule_thickness * 2.0 + shift = hlist.height vlist = Vlist(vlist) - vlist.shift_amount = shift + nucleus.depth * 0.5 + vlist.shift_amount = shift + nucleus.depth result = Hlist([vlist]) return [result] @@ -2642,39 +2728,77 @@ result = Hlist([nucleus, x]) return [result] - def frac(self, s, loc, toks): - assert(len(toks)==1) - assert(len(toks[0])==2) + def _genfrac(self, ldelim, rdelim, rule, style, num, den): state = self.get_state() thickness = state.font_output.get_underline_thickness( state.font, state.fontsize, state.dpi) - num, den = toks[0] + rule = float(rule) num.shrink() den.shrink() cnum = HCentered([num]) cden = HCentered([den]) - width = max(num.width, den.width) + thickness * 10. + width = max(num.width, den.width) cnum.hpack(width, 'exactly') cden.hpack(width, 'exactly') vlist = Vlist([cnum, # numerator Vbox(0, thickness * 2.0), # space - Hrule(state), # rule - Vbox(0, thickness * 4.0), # space + Hrule(state, rule), # rule + Vbox(0, thickness * 2.0), # space cden # denominator ]) # Shift so the fraction line sits in the middle of the # equals sign metrics = state.font_output.get_metrics( - state.font, rcParams['mathtext.default'], '=', state.fontsize, state.dpi) + state.font, rcParams['mathtext.default'], + '=', state.fontsize, state.dpi) shift = (cden.height - ((metrics.ymax + metrics.ymin) / 2 - thickness * 3.0)) vlist.shift_amount = shift - hlist = Hlist([vlist, Hbox(thickness * 2.)]) - return [hlist] + result = [Hlist([vlist, Hbox(thickness * 2.)])] + if ldelim or rdelim: + if ldelim == '': + ldelim = '.' + if rdelim == '': + rdelim = '.' + elif rdelim == r'\}': + rdelim = '}' + return self._auto_sized_delimiter(ldelim, result, rdelim) + return result + + def genfrac(self, s, loc, toks): + assert(len(toks)==1) + assert(len(toks[0])==6) + + return self._genfrac(*tuple(toks[0])) + + def frac(self, s, loc, toks): + assert(len(toks)==1) + assert(len(toks[0])==2) + state = self.get_state() + + thickness = state.font_output.get_underline_thickness( + state.font, state.fontsize, state.dpi) + num, den = toks[0] + + return self._genfrac('', '', thickness, '', num, den) + + def stackrel(self, s, loc, toks): + assert(len(toks)==1) + assert(len(toks[0])==2) + num, den = toks[0] + + return self._genfrac('', '', 0.0, '', num, den) + + def binom(self, s, loc, toks): + assert(len(toks)==1) + assert(len(toks[0])==2) + num, den = toks[0] + + return self._genfrac('(', ')', 0.0, '', num, den) def sqrt(self, s, loc, toks): #~ print "sqrt", toks @@ -2721,9 +2845,7 @@ rightside]) # Body return [hlist] - def auto_sized_delimiter(self, s, loc, toks): - #~ print "auto_sized_delimiter", toks - front, middle, back = toks + def _auto_sized_delimiter(self, front, middle, back): state = self.get_state() height = max([x.height for x in middle]) depth = max([x.depth for x in middle]) @@ -2731,12 +2853,19 @@ # \left. and \right. aren't supposed to produce any symbols if front != '.': parts.append(AutoHeightChar(front, height, depth, state)) - parts.extend(middle.asList()) + parts.extend(middle) if back != '.': parts.append(AutoHeightChar(back, height, depth, state)) hlist = Hlist(parts) return hlist + + def auto_sized_delimiter(self, s, loc, toks): + #~ print "auto_sized_delimiter", toks + front, middle, back = toks + + return self._auto_sized_delimiter(front, middle.asList(), back) + ### ############################################################################## @@ -2751,6 +2880,7 @@ 'ps' : MathtextBackendPs, 'pdf' : MathtextBackendPdf, 'svg' : MathtextBackendSvg, + 'path' : MathtextBackendPath, 'cairo' : MathtextBackendCairo, 'macosx': MathtextBackendAgg, } @@ -2904,7 +3034,6 @@ Returns the offset of the baseline from the bottom of the image in pixels. """ - rgba, depth = self.to_rgba(texstr, color=color, dpi=dpi, fontsize=fontsize) numrows, numcols, tmp = rgba.shape _png.write_png(rgba.tostring(), numcols, numrows, filename) diff -Nru matplotlib-0.99.3/lib/matplotlib/mlab.py matplotlib-1.0.1/lib/matplotlib/mlab.py --- matplotlib-0.99.3/lib/matplotlib/mlab.py 2010-03-09 14:20:20.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/mlab.py 2010-09-23 19:54:49.000000000 +0000 @@ -1,9 +1,9 @@ """ -Numerical python functions written for compatability with matlab(TM) +Numerical python functions written for compatability with MATLAB commands with the same names. -Matlab(TM) compatible functions +MATLAB compatible functions ------------------------------- :func:`cohere` @@ -41,10 +41,10 @@ Miscellaneous functions ------------------------- -Functions that don't exist in matlab(TM), but are useful anyway: +Functions that don't exist in MATLAB, but are useful anyway: :meth:`cohere_pairs` - Coherence over all pairs. This is not a matlab function, but we + Coherence over all pairs. This is not a MATLAB function, but we compute coherence a lot in my lab, and we compute it for a lot of pairs. This function is optimized to do this efficiently by caching the direct FFTs. @@ -91,6 +91,9 @@ :meth:`rec_join` join two record arrays on sequence of fields +:meth:`recs_join` + a simple join of multiple recarrays using a single column as a key + :meth:`rec_groupby` summarize data by groups (similar to SQL GROUP BY) @@ -139,7 +142,7 @@ """ from __future__ import division -import csv, warnings, copy, os +import csv, warnings, copy, os, operator import numpy as np ma = np.ma @@ -147,6 +150,7 @@ import matplotlib.nxutils as nxutils import matplotlib.cbook as cbook +from matplotlib import docstring def logspace(xmin,xmax,N): @@ -241,7 +245,7 @@ raise ValueError("sides must be one of: 'default', 'onesided', or " "'twosided'") - # Matlab divides by the sampling frequency so that density function + # MATLAB divides by the sampling frequency so that density function # has units of dB/Hz and can be integrated by the plotted frequency # values. Perform the same scaling here. if scale_by_freq: @@ -273,18 +277,18 @@ Pxy[:,i] = np.conjugate(fx[:numFreqs]) * fy[:numFreqs] # Scale the spectrum by the norm of the window to compensate for - # windowing loss; see Bendat & Piersol Sec 11.5.2. + # windowing loss; see Bendat & Piersol Sec 11.5.2. Pxy *= 1 / (np.abs(windowVals)**2).sum() # Also include scaling factors for one-sided densities and dividing by the # sampling frequency, if desired. Scale everything, except the DC component - # and the NFFT/2 component: + # and the NFFT/2 component: Pxy[1:-1] *= scaling_factor - #But do scale those components by Fs, if required + #But do scale those components by Fs, if required if scale_by_freq: - Pxy[[0,-1]] /= Fs - + Pxy[[0,-1]] /= Fs + t = 1./Fs * (ind + NFFT / 2.) freqs = float(Fs) / pad_to * np.arange(numFreqs) @@ -296,8 +300,7 @@ return Pxy, freqs, t #Split out these keyword docs so that they can be used elsewhere -kwdocd = dict() -kwdocd['PSD'] =""" +docstring.interpd.update(PSD=cbook.dedent(""" Keyword arguments: *NFFT*: integer @@ -312,7 +315,7 @@ *detrend*: callable The function applied to each segment before fft-ing, designed to remove the mean or linear trend. Unlike in - matlab, where the *detrend* parameter is a vector, in + MATLAB, where the *detrend* parameter is a vector, in matplotlib is it a function. The :mod:`~matplotlib.pylab` module defines :func:`~matplotlib.pylab.detrend_none`, :func:`~matplotlib.pylab.detrend_mean`, and @@ -353,9 +356,10 @@ Specifies whether the resulting density values should be scaled by the scaling frequency, which gives density in units of Hz^-1. This allows for integration over the returned frequency values. - The default is True for MatLab compatibility. -""" + The default is True for MATLAB compatibility. +""")) +@docstring.dedent_interpd def psd(x, NFFT=256, Fs=2, detrend=detrend_none, window=window_hanning, noverlap=0, pad_to=None, sides='default', scale_by_freq=None): """ @@ -385,8 +389,7 @@ scale_by_freq) return Pxx.real,freqs -psd.__doc__ = psd.__doc__ % kwdocd - +@docstring.dedent_interpd def csd(x, y, NFFT=256, Fs=2, detrend=detrend_none, window=window_hanning, noverlap=0, pad_to=None, sides='default', scale_by_freq=None): """ @@ -419,8 +422,7 @@ Pxy = Pxy.mean(axis=1) return Pxy, freqs -csd.__doc__ = csd.__doc__ % kwdocd - +@docstring.dedent_interpd def specgram(x, NFFT=256, Fs=2, detrend=detrend_none, window=window_hanning, noverlap=128, pad_to=None, sides='default', scale_by_freq=None): """ @@ -461,11 +463,10 @@ return Pxx, freqs, t -specgram.__doc__ = specgram.__doc__ % kwdocd - _coh_error = """Coherence is calculated by averaging over *NFFT* length segments. Your signal is too short for your choice of *NFFT*. """ +@docstring.dedent_interpd def cohere(x, y, NFFT=256, Fs=2, detrend=detrend_none, window=window_hanning, noverlap=0, pad_to=None, sides='default', scale_by_freq=None): """ @@ -506,8 +507,6 @@ Cxy.shape = (len(f),) return Cxy, f -cohere.__doc__ = cohere.__doc__ % kwdocd - def donothing_callback(*args): pass @@ -768,6 +767,9 @@ def prepca(P, frac=0): """ + + WARNING: this function is deprecated -- please see class PCA instead + Compute the principal components of *P*. *P* is a (*numVars*, *numObs*) array. *frac* is the minimum fraction of variance that a component must contain to be included. @@ -783,10 +785,11 @@ - *fracVar* : the fraction of the variance accounted for by each component returned - A similar function of the same name was in the Matlab (TM) + A similar function of the same name was in the MATLAB R13 Neural Network Toolbox but is not found in later versions; its successor seems to be called "processpcs". """ + warnings.warn('This function is deprecated -- see class PCA instead') U,s,v = np.linalg.svd(P) varEach = s**2/P.shape[1] totVar = varEach.sum() @@ -798,6 +801,108 @@ Pcomponents = np.dot(Trans,P) return Pcomponents, Trans, fracVar[ind] + +class PCA: + def __init__(self, a): + """ + compute the SVD of a and store data for PCA. Use project to + project the data onto a reduced set of dimensions + + Inputs: + + *a*: a numobservations x numdims array + + Attrs: + + *a* a centered unit sigma version of input a + + *numrows*, *numcols*: the dimensions of a + + *mu* : a numdims array of means of a + + *sigma* : a numdims array of atandard deviation of a + + *fracs* : the proportion of variance of each of the principal components + + *Wt* : the weight vector for projecting a numdims point or array into PCA space + + *Y* : a projected into PCA space + + + The factor loadings are in the Wt factor, ie the factor + loadings for the 1st principal component are given by Wt[0] + + """ + n, m = a.shape + if nnumcols') + + self.numrows, self.numcols = n, m + self.mu = a.mean(axis=0) + self.sigma = a.std(axis=0) + + a = self.center(a) + + self.a = a + + U, s, Vh = np.linalg.svd(a, full_matrices=False) + + + Y = np.dot(Vh, a.T).T + + vars = s**2/float(len(s)) + self.fracs = vars/vars.sum() + + + self.Wt = Vh + self.Y = Y + + + def project(self, x, minfrac=0.): + 'project x onto the principle axes, dropping any axes where fraction of variance=minfrac + if ndims==2: + Yreduced = Y[:,mask] + else: + Yreduced = Y[mask] + return Yreduced + + + + def center(self, x): + 'center the data using the mean and sigma from training set a' + return (x - self.mu)/self.sigma + + + + @staticmethod + def _get_colinear(): + c0 = np.array([ + 0.19294738, 0.6202667 , 0.45962655, 0.07608613, 0.135818 , + 0.83580842, 0.07218851, 0.48318321, 0.84472463, 0.18348462, + 0.81585306, 0.96923926, 0.12835919, 0.35075355, 0.15807861, + 0.837437 , 0.10824303, 0.1723387 , 0.43926494, 0.83705486]) + + c1 = np.array([ + -1.17705601, -0.513883 , -0.26614584, 0.88067144, 1.00474954, + -1.1616545 , 0.0266109 , 0.38227157, 1.80489433, 0.21472396, + -1.41920399, -2.08158544, -0.10559009, 1.68999268, 0.34847107, + -0.4685737 , 1.23980423, -0.14638744, -0.35907697, 0.22442616]) + + c2 = c0 + 2*c1 + c3 = -3*c0 + 4*c1 + a = np.array([c3, c0, c1, c2]).T + return a + def prctile(x, p = (0.0, 25.0, 50.0, 75.0, 100.0)): """ Return the percentiles of *x*. *p* can either be a sequence of @@ -807,18 +912,38 @@ the *p* percentage point in the sequence is returned. """ + # This implementation derived from scipy.stats.scoreatpercentile + def _interpolate(a, b, fraction): + """Returns the point at the given fraction between a and b, where + 'fraction' must be between 0 and 1. + """ + return a + (b - a)*fraction - x = np.array(x).ravel() # we need a copy - x.sort() - Nx = len(x) - - if not cbook.iterable(p): - return x[int(p*Nx/100.0)] + scalar = True + if cbook.iterable(p): + scalar = False + per = np.array(p) + values = np.array(x).ravel() # copy + values.sort() + + idxs = per /100. * (values.shape[0] - 1) + ai = idxs.astype(np.int) + bi = ai + 1 + frac = idxs % 1 + + # handle cases where attempting to interpolate past last index + cond = bi >= len(values) + if scalar: + if cond: + ai -= 1 + bi -= 1 + frac += 1 + else: + ai[cond] -= 1 + bi[cond] -= 1 + frac[cond] += 1 - p = np.asarray(p)* Nx/100.0 - ind = p.astype(int) - ind = np.where(ind>=Nx, Nx-1, ind) - return x.take(ind) + return _interpolate(values[ai],values[bi],frac) def prctile_rank(x, p): """ @@ -1607,7 +1732,7 @@ def isvector(X): """ - Like the Matlab (TM) function with the same name, returns *True* + Like the MATLAB function with the same name, returns *True* if the supplied numpy array or matrix *X* looks like a vector, meaning it has a one non-singleton axis (i.e., it can have multiple axes, but all must have length 1, except for one of @@ -1902,6 +2027,60 @@ return newrec +def recs_join(key, name, recs, jointype='outer', missing=0., postfixes=None): + """ + Join a sequence of record arrays on single column key. + + This function only joins a single column of the multiple record arrays + + *key* + is the column name that acts as a key + + *name* + is the name of the column that we want to join + + *recs* + is a list of record arrays to join + + *jointype* + is a string 'inner' or 'outer' + + *missing* + is what any missing field is replaced by + + *postfixes* + if not None, a len recs sequence of postfixes + + returns a record array with columns [rowkey, name0, name1, ... namen-1]. + or if postfixes [PF0, PF1, ..., PFN-1] are supplied, + [rowkey, namePF0, namePF1, ... namePFN-1]. + + Example:: + + r = recs_join("date", "close", recs=[r0, r1], missing=0.) + + """ + results = [] + aligned_iters = cbook.align_iterators(operator.attrgetter(key), *[iter(r) for r in recs]) + + def extract(r): + if r is None: return missing + else: return r[name] + + + if jointype == "outer": + for rowkey, row in aligned_iters: + results.append([rowkey] + map(extract, row)) + elif jointype == "inner": + for rowkey, row in aligned_iters: + if None not in row: # throw out any Nones + results.append([rowkey] + map(extract, row)) + + if postfixes is None: + postfixes = ['%d'%i for i in range(len(recs))] + names = ",".join([key] + ["%s%s" % (name, postfix) for postfix in postfixes]) + return np.rec.fromrecords(results, names=names) + def csv2rec(fname, comments='#', skiprows=0, checkrows=0, delimiter=',', converterd=None, names=None, missing='', missingd=None, @@ -1929,7 +2108,7 @@ - *checkrows*: is the number of rows to check to validate the column data type. When set to zero all rows are validated. - - *converted*: if not *None*, is a dictionary mapping column number or + - *converterd*: if not *None*, is a dictionary mapping column number or munged column name to a converter function. - *names*: if not None, is a list of header names. In this case, no @@ -2130,11 +2309,11 @@ if needheader: while 1: - # skip past any comments and consume one line of column header - row = reader.next() - if len(row) and row[0].startswith(comments): - continue - break + # skip past any comments and consume one line of column header + row = reader.next() + if len(row) and row[0].startswith(comments): + continue + break # iterate over the remaining rows and convert the data to date # objects, ints, or floats as approriate @@ -2425,6 +2604,10 @@ *withheader*: if withheader is False, do not write the attribute names in the first row + for formatd type FormatFloat, we override the precision to store + full precision floats in the CSV file + + .. seealso:: :func:`csv2rec` @@ -2443,6 +2626,9 @@ return func(val) return newfunc + if r.ndim != 1: + raise ValueError('rec2csv only operates on 1 dimensional recarrays') + formatd = get_formatd(r, formatd) funcs = [] for i, name in enumerate(r.dtype.names): @@ -2532,9 +2718,11 @@ raise TypeError("inputs x,y,z must all be 1D arrays of the same length") # remove masked points. if hasattr(z,'mask'): - x = x.compress(z.mask == False) - y = y.compress(z.mask == False) - z = z.compressed() + # make sure mask is not a scalar boolean array. + if z.mask.ndim: + x = x.compress(z.mask == False) + y = y.compress(z.mask == False) + z = z.compressed() if _use_natgrid: # use natgrid toolkit if available. if interp != 'nn': raise ValueError("only natural neighor interpolation" Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/mpl-data/example/aapl.npy and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/mpl-data/example/aapl.npy differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/mpl-data/example/goog.npy and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/mpl-data/example/goog.npy differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/mpl-data/example/msft_nasdaq.npy and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/mpl-data/example/msft_nasdaq.npy differ diff -Nru matplotlib-0.99.3/lib/matplotlib/mpl-data/fonts/ttf/LICENSE_STIX matplotlib-1.0.1/lib/matplotlib/mpl-data/fonts/ttf/LICENSE_STIX --- matplotlib-0.99.3/lib/matplotlib/mpl-data/fonts/ttf/LICENSE_STIX 2009-07-31 15:14:39.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/mpl-data/fonts/ttf/LICENSE_STIX 2010-07-07 01:41:52.000000000 +0000 @@ -1,71 +1,124 @@ -TERMS AND CONDITIONS - - 1. Permission is hereby granted, free of charge, to any person -obtaining a copy of the STIX Fonts-TM set accompanying this license -(collectively, the "Fonts") and the associated documentation files -(collectively with the Fonts, the "Font Software"), to reproduce and -distribute the Font Software, including the rights to use, copy, merge -and publish copies of the Font Software, and to permit persons to whom -the Font Software is furnished to do so same, subject to the following -terms and conditions (the "License"). - - 2. The following copyright and trademark notice and these Terms and -Conditions shall be included in all copies of one or more of the Font -typefaces and any derivative work created as permitted under this -License: - - Copyright (c) 2001-2005 by the STI Pub Companies, consisting of -the American Institute of Physics, the American Chemical Society, the -American Mathematical Society, the American Physical Society, Elsevier, -Inc., and The Institute of Electrical and Electronic Engineers, Inc. -Portions copyright (c) 1998-2003 by MicroPress, Inc. Portions copyright -(c) 1990 by Elsevier, Inc. All rights reserved. STIX Fonts-TM is a -trademark of The Institute of Electrical and Electronics Engineers, Inc. - - 3. You may (a) convert the Fonts from one format to another (e.g., -from TrueType to PostScript), in which case the normal and reasonable -distortion that occurs during such conversion shall be permitted and (b) -embed or include a subset of the Fonts in a document for the purposes of -allowing users to read text in the document that utilizes the Fonts. In -each case, you may use the STIX Fonts-TM mark to designate the resulting -Fonts or subset of the Fonts. - - 4. You may also (a) add glyphs or characters to the Fonts, or modify -the shape of existing glyphs, so long as the base set of glyphs is not -removed and (b) delete glyphs or characters from the Fonts, provided -that the resulting font set is distributed with the following -disclaimer: "This [name] font does not include all the Unicode points -covered in the STIX Fonts-TM set but may include others." In each case, -the name used to denote the resulting font set shall not include the -term "STIX" or any similar term. - - 5. You may charge a fee in connection with the distribution of the -Font Software, provided that no copy of one or more of the individual -Font typefaces that form the STIX Fonts-TM set may be sold by itself. - - 6. THE FONT SOFTWARE IS PROVIDED "AS IS," WITHOUT WARRANTY OF ANY -KIND, EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, ANY WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT -OF COPYRIGHT, PATENT, TRADEMARK OR OTHER RIGHT. IN NO EVENT SHALL -MICROPRESS OR ANY OF THE STI PUB COMPANIES BE LIABLE FOR ANY CLAIM, -DAMAGES OR OTHER LIABILITY, INCLUDING, BUT NOT LIMITED TO, ANY GENERAL, -SPECIAL, INDIRECT, INCIDENTAL OR CONSEQUENTIAL DAMAGES, WHETHER IN AN -ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM OR OUT OF THE USE OR -INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT -SOFTWARE. - - 7. Except as contained in the notice set forth in Section 2, the -names MicroPress Inc. and STI Pub Companies, as well as the names of the -companies/organizations that compose the STI Pub Companies, shall not be -used in advertising or otherwise to promote the sale, use or other -dealings in the Font Software without the prior written consent of the -respective company or organization. - - 8. This License shall become null and void in the event of any -material breach of the Terms and Conditions herein by licensee. - - 9. A substantial portion of the STIX Fonts set was developed by -MicroPress Inc. for the STI Pub Companies. To obtain additional -mathematical fonts, please contact MicroPress, Inc., 68-30 Harrow -Street, Forest Hills, NY 11375, USA - Phone: (718) 575-1816. - +The STIX fonts distributed with matplotlib have been modified from +their canonical form. They have been converted from OTF to TTF format +using Fontforge and this script: + + #!/usr/bin/env fontforge + i=1 + while ( i<$argc ) + Open($argv[i]) + Generate($argv[i]:r + ".ttf") + i = i+1 + endloop + +The original STIX Font License begins below. + +----------------------------------------------------------- + +STIX Font License + +24 May 2010 + +Copyright (c) 2001-2010 by the STI Pub Companies, consisting of the American +Institute of Physics, the American Chemical Society, the American Mathematical +Society, the American Physical Society, Elsevier, Inc., and The Institute of +Electrical and Electronic Engineers, Inc. (www.stixfonts.org), with Reserved +Font Name STIX Fonts, STIX Fonts (TM) is a trademark of The Institute of +Electrical and Electronics Engineers, Inc. + +Portions copyright (c) 1998-2003 by MicroPress, Inc. (www.micropress-inc.com), +with Reserved Font Name TM Math. To obtain additional mathematical fonts, please +contact MicroPress, Inc., 68-30 Harrow Street, Forest Hills, NY 11375, USA, +Phone: (718) 575-1816. + +Portions copyright (c) 1990 by Elsevier, Inc. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/mpl-data/fonts/ttf/STIXGeneralBolIta.ttf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/mpl-data/fonts/ttf/STIXGeneralBolIta.ttf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/mpl-data/fonts/ttf/STIXGeneralBol.ttf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/mpl-data/fonts/ttf/STIXGeneralBol.ttf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/mpl-data/fonts/ttf/STIXGeneralItalic.ttf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/mpl-data/fonts/ttf/STIXGeneralItalic.ttf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/mpl-data/fonts/ttf/STIXGeneral.ttf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/mpl-data/fonts/ttf/STIXGeneral.ttf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/mpl-data/fonts/ttf/STIXNonUniBolIta.ttf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/mpl-data/fonts/ttf/STIXNonUniBolIta.ttf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/mpl-data/fonts/ttf/STIXNonUniBol.ttf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/mpl-data/fonts/ttf/STIXNonUniBol.ttf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/mpl-data/fonts/ttf/STIXNonUniIta.ttf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/mpl-data/fonts/ttf/STIXNonUniIta.ttf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/mpl-data/fonts/ttf/STIXNonUni.ttf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/mpl-data/fonts/ttf/STIXNonUni.ttf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/mpl-data/fonts/ttf/STIXSiz1SymBol.ttf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/mpl-data/fonts/ttf/STIXSiz1SymBol.ttf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/mpl-data/fonts/ttf/STIXSiz1Sym.ttf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/mpl-data/fonts/ttf/STIXSiz1Sym.ttf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/mpl-data/fonts/ttf/STIXSiz2SymBol.ttf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/mpl-data/fonts/ttf/STIXSiz2SymBol.ttf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/mpl-data/fonts/ttf/STIXSiz2Sym.ttf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/mpl-data/fonts/ttf/STIXSiz2Sym.ttf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/mpl-data/fonts/ttf/STIXSiz3SymBol.ttf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/mpl-data/fonts/ttf/STIXSiz3SymBol.ttf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/mpl-data/fonts/ttf/STIXSiz3Sym.ttf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/mpl-data/fonts/ttf/STIXSiz3Sym.ttf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/mpl-data/fonts/ttf/STIXSiz4SymBol.ttf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/mpl-data/fonts/ttf/STIXSiz4SymBol.ttf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/mpl-data/fonts/ttf/STIXSiz4Sym.ttf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/mpl-data/fonts/ttf/STIXSiz4Sym.ttf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/mpl-data/fonts/ttf/STIXSiz5Sym.ttf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/mpl-data/fonts/ttf/STIXSiz5Sym.ttf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/mpl-data/fonts/ttf/STIXSizFiveSymReg.ttf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/mpl-data/fonts/ttf/STIXSizFiveSymReg.ttf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/mpl-data/fonts/ttf/STIXSizFourSymBol.ttf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/mpl-data/fonts/ttf/STIXSizFourSymBol.ttf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/mpl-data/fonts/ttf/STIXSizFourSymReg.ttf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/mpl-data/fonts/ttf/STIXSizFourSymReg.ttf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/mpl-data/fonts/ttf/STIXSizOneSymBol.ttf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/mpl-data/fonts/ttf/STIXSizOneSymBol.ttf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/mpl-data/fonts/ttf/STIXSizOneSymReg.ttf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/mpl-data/fonts/ttf/STIXSizOneSymReg.ttf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/mpl-data/fonts/ttf/STIXSizThreeSymBol.ttf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/mpl-data/fonts/ttf/STIXSizThreeSymBol.ttf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/mpl-data/fonts/ttf/STIXSizThreeSymReg.ttf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/mpl-data/fonts/ttf/STIXSizThreeSymReg.ttf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/mpl-data/fonts/ttf/STIXSizTwoSymBol.ttf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/mpl-data/fonts/ttf/STIXSizTwoSymBol.ttf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/mpl-data/fonts/ttf/STIXSizTwoSymReg.ttf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/mpl-data/fonts/ttf/STIXSizTwoSymReg.ttf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/mpl-data/images/filesave.png and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/mpl-data/images/filesave.png differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/mpl-data/images/filesave.ppm and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/mpl-data/images/filesave.ppm differ diff -Nru matplotlib-0.99.3/lib/matplotlib/mpl-data/images/filesave.xpm matplotlib-1.0.1/lib/matplotlib/mpl-data/images/filesave.xpm --- matplotlib-0.99.3/lib/matplotlib/mpl-data/images/filesave.xpm 2009-07-31 15:14:36.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/mpl-data/images/filesave.xpm 2010-07-07 01:41:51.000000000 +0000 @@ -1,214 +1,332 @@ /* XPM */ -static char *filesave[] = { -/* columns rows colors chars-per-pixel */ -"24 24 184 2", -" c #1D2A42", -". c #1D2A43", -"X c #2E3C53", -"o c #2F3E54", -"O c #303F55", -"+ c #164866", -"@ c #1E4763", -"# c #1E516E", -"$ c #145374", -"% c #155374", -"& c #185575", -"* c #195776", -"= c #1B5777", -"- c #1C5979", -"; c #1D5A79", -": c #1C5C7A", -"> c #214F6B", -", c #27526D", -"< c #28516B", -"1 c #2A536E", -"2 c #265974", -"3 c #215D7C", -"4 c #235F7D", -"5 c #2D5D76", -"6 c #2E5D77", -"7 c #315C77", -"8 c #26617E", -"9 c #28617E", -"0 c #2F6078", -"q c #306079", -"w c #32617A", -"e c #415A6E", -"r c #415E73", -"t c #425E73", -"y c #425F74", -"u c #435F74", -"i c #455D72", -"p c #595E64", -"a c #436075", -"s c #446075", -"d c #44647B", -"f c #45677C", -"g c #496176", -"h c #4A6074", -"j c #4E6477", -"k c #4E6679", -"l c #536375", -"z c #566678", -"x c #61625B", -"c c #786E59", -"v c #7A7975", -"b c #286280", -"n c #286380", -"m c #286482", -"M c #2A6583", -"N c #2C6683", -"B c #2B6986", -"V c #2B6A87", -"C c #2C6A87", -"Z c #2E6985", -"A c #2A6C89", -"S c #306A86", -"D c #306B86", -"F c #326F89", -"G c #356E8A", -"H c #366F8B", -"J c #37708B", -"K c #39738D", -"L c #3B728D", -"P c #3B738D", -"I c #3C748E", -"U c #3D758F", -"Y c #3A7590", -"T c #3A7691", -"R c #3D7791", -"E c #3E7590", -"W c #406981", -"Q c #41738C", -"! c #42758C", -"~ c #43758D", -"^ c #42758E", -"/ c #4D7289", -"( c #407791", -") c #417892", -"_ c #427992", -"` c #437A93", -"' c #417C94", -"] c #447A94", -"[ c #487E96", -"{ c #497F97", -"} c #4A7F97", -"| c #557587", -" . c #50768B", -".. c #557789", -"X. c #57768A", -"o. c #57768B", -"O. c #5E778A", -"+. c #5A7A8D", -"@. c #5D7C8F", -"#. c #488098", -"$. c #4B8098", -"%. c #4C8199", -"&. c #4D8299", -"*. c #4C829A", -"=. c #4D849B", -"-. c #50849B", -";. c #53869D", -":. c #55889E", -">. c #578AA0", -",. c #5B8CA1", -"<. c #608092", -"1. c #628395", -"2. c #608495", -"3. c #658597", -"4. c #678C9C", -"5. c #68899B", -"6. c #6C8C9E", -"7. c #6C8D9E", -"8. c #798C96", -"9. c #7F929C", -"0. c #648FA3", -"q. c #6090A4", -"w. c #6796A9", -"e. c #6E99AB", -"r. c #708FA0", -"t. c #7792A1", -"y. c #779AA9", -"u. c #74A0B2", -"i. c #77A0B1", -"p. c #77A2B4", -"a. c #79A2B3", -"s. c #7AA2B2", -"d. c #A1793F", -"f. c #A17A3F", -"g. c #A37B3F", -"h. c #A37B40", -"j. c #A47C40", -"k. c #A47D41", -"l. c #A47E43", -"z. c #A57E43", -"x. c #A38872", -"c. c #A68B74", -"v. c #A88E77", -"b. c #AB9079", -"n. c #AE937A", -"m. c #B0947D", -"M. c #B3977D", -"N. c #80939D", -"B. c #8497A1", -"V. c #8699A3", -"C. c #879AA4", -"Z. c #8B9EA7", -"A. c #8B9EA8", -"S. c #8DA0AA", -"D. c #8FA3AD", -"F. c #8FA2AF", -"G. c #92A3AF", -"H. c #93A3AF", -"J. c #93A6AF", -"K. c #94A6B0", -"L. c #94A7B0", -"P. c #95AAB3", -"I. c #9BAEB8", -"U. c #9DAFB8", -"Y. c #B59980", -"T. c #B79A82", -"R. c #A2B4BD", -"E. c #A2B5BF", -"W. c #A4B6BF", -"Q. c #A9BAC3", -"!. c #ADC2CB", -"~. c #AFC0C8", -"^. c #B5C6CD", -"/. c #BBCAD1", -"(. c #BDCDD5", -"). c #C1D0D7", -"_. c #C1D1D7", -"`. c #C0D1D8", -"'. c #C3D2D9", -"]. c #C4D5DC", -"[. c #C5D5DC", -"{. c #D9DEE0", -"}. c #DCDFE1", -"|. c #E6E6E6", +static char *filesave1a[] = { +/* width height ncolors chars_per_pixel */ +"24 24 301 2", +/* colors */ +" c #7CA3B5", +" . c #374F64", +" X c #7898A7", +" o c #2D4C64", +" O c #B3815D", +" + c #845646", +" @ c #5C7F92", +" # c #28465F", +" $ c #27465E", +" % c #79A3B5", +" & c #03496C", +" * c #899CA7", +" = c #02476B", +" - c #01476A", +" ; c #044063", +" : c #7B95A3", +" > c #81949F", +" , c #B6C9D3", +" < c #085374", +" 1 c #AF7F5C", +" 2 c #7893A0", +" 3 c #B4C7D1", +" 4 c #7E929C", +" 5 c #064F72", +" 6 c #A16E41", +" 7 c #A06C40", +" 8 c #044D70", +" 9 c #9F6C3F", +" 0 c #B0C3CD", +" q c #195E7E", +" w c #AFC3CC", +" e c #175C7C", +" r c #6B8C9D", +" t c #546376", +" y c #96AEBA", +" u c #ACBFC9", +" i c #155A7A", +" p c #135878", +" a c #A9BDC6", +" s c #0B597A", +" d c #A9BBC6", +" f c #205271", +" g c #125677", +" h c #034265", +" j c #0A5779", +" k c #095778", +" l c #4E5D70", +" z c #A6B9C3", +" x c #304B63", +" c c #7396A8", +" v c #8FA6B3", +" b c #4B5B6D", +" n c #A4B7C1", +" m c #0B5070", +" M c #A0B3BD", +" N c #0B5B7D", +" B c #374E63", +" V c #364C62", +" C c #7E96A2", +" Z c #B4825D", +" A c #7795A5", +" S c #2D4B63", +" D c #92A5AF", +" F c #2B4961", +" G c #29475F", +" H c #8EA1AB", +" J c #27455D", +" K c #86A0AD", +" L c #9BAFBB", +" P c #8A9DA7", +" I c #98ADB8", +" U c #014669", +" Y c #8699A3", +" T c #004468", +" R c #8497A1", +" E c #82959F", +" W c #B1805D", +" Q c #B0805C", +" ! c #90A5B0", +" ~ c #A47143", +" ^ c #7E919B", +" / c #A16D40", +" ( c #044C6F", +" ) c #7A8D97", +" _ c #195D7D", +" ` c #ADC0C9", +" ' c #768993", +" ] c #94ABB7", +" [ c #0B5879", +" { c #92A9B5", +" } c #095677", +" | c #085476", +". c #075275", +".. c #AD7E5C", +".X c #AC7C5B", +".o c #6F91A3", +".O c #1F415B", +".+ c #0C5C7D", +".@ c #0B5C7C", +".# c #5F7486", +".$ c #738593", +".% c #708190", +".& c #A4B8C3", +".* c #7492A1", +".= c #566A7D", +".- c #7BA3B5", +".; c #687988", +".: c #526679", +".> c #285874", +"., c #3A677F", +".< c #BCCFD7", +".1 c #6C8699", +".2 c #B9CBD4", +".3 c #0A5374", +".4 c #A57243", +".5 c #3C748E", +".6 c #A37041", +".7 c #27465F", +".8 c #305975", +".9 c #77A3B4", +".0 c #9BB0BD", +".q c #044B6E", +".w c #705047", +".e c #03496D", +".r c #819DAA", +".t c #01476B", +".y c #43778E", +".u c #658295", +".i c #085375", +".p c #AE7F5C", +".a c #075174", +".s c #065173", +".d c #8DA4AF", +".f c #7A8C99", +".g c #768895", +".h c #1F405A", +".j c #0C5B7C", +".k c #0B597B", +".l c #0A597A", +".z c #A7BBC5", +".x c #105676", +".c c #095779", +".v c #374C61", +".b c #4A596D", +".n c #73919F", +".m c #718F9D", +".M c #536579", +".N c #7A99A9", +".B c #95A9B3", +".V c #A4B9C5", +".C c #2E4D65", +".Z c #A67343", +".A c #B2805C", +".S c #4A7187", +".D c #335C77", +".F c #9FB5C0", +".G c #224863", +".H c #28475F", +".J c #8EA1AC", +".K c #27455E", +".L c #26455D", +".P c #587C8E", +".I c #839EAB", +".U c #02486B", +".Y c #293E56", +".T c #01466A", +".R c #8699A4", +".E c #7F9AA7", +".W c #729CAE", +".Q c #8DAAB8", +".! c #044163", +".~ c #7D98A5", +".^ c #8397A1", +"./ c #93A7B4", +".( c #AE7E5B", +".) c #A26F42", +"._ c #065072", +".` c #B3C6D0", +".' c #054E71", +".] c #B1C4CE", +".[ c #044C70", +".{ c #9F6B3F", +".} c #798D97", +".| c #AEC2CB", +"X c #6C8D9E", +"X. c #ACC0C9", +"XX c #ABBEC8", +"Xo c #145979", +"XO c #516073", +"X+ c #125777", +"X@ c #505E72", +"X# c #0A5879", +"X$ c #728590", +"X% c #095678", +"X& c #40768D", +"X* c #304A63", +"X= c #7295A7", +"X- c #889FAC", +"X; c #9DB0BA", +"X: c #0B5C7D", +"X> c #99ACB6", +"X, c #034568", +"X< c #7A4C38", +"X1 c #024367", +"X2 c #4F768B", +"X3 c #374D63", +"X4 c #304E66", +"X5 c #364D62", +"X6 c #8DA7B4", +"X7 c #2C4A62", +"X8 c #7594A3", +"X9 c #8BA5B2", +"X0 c #91A4AE", +"Xq c #576C7F", +"Xw c #2A4860", +"Xe c #89A3B0", +"Xr c #28465E", +"Xt c #9DB2BD", +"Xy c #8DA0AA", +"Xu c #8B9EA8", +"Xi c #899CA6", +"Xp c #879AA4", +"Xa c #014569", +"Xs c #213E57", +"Xd c #004568", +"Xf c #96AAB6", +"Xg c #8598A2", +"Xh c #45778E", +"Xj c #8396A0", +"Xk c #684A3D", +"Xl c #B1815D", +"Xz c #81949E", +"Xx c #7F929C", +"Xc c #A26E41", +"Xv c #7192A2", +"Xb c #7D909A", +"Xn c #7B8E98", +"Xm c #B0C3CC", +"XM c #034B6E", +"XN c #175C7B", +"XB c #778A94", +"XV c #155A79", +"XC c #536174", +"XZ c #FFFFFF", +"XA c #41758D", +"XS c #085376", +"XD c #075375", +"XF c #7194A5", +"XG c #065174", +"XH c #AD7D5C", +"XJ c #9BB4C1", +"XK c #8AA2AD", +"XL c #7CA2B3", +"XP c #6D8EA1", +"XI c #97B0BD", +"XU c #768896", +"XY c #DDE0E4", +"XT c #1D2A42", +"XR c #0B5B7C", +"XE c #7C9BA9", +"XW c #91AAB7", +"XQ c #3E758D", +"X! c #8DA6B3", +"X~ c #D5D8DC", +"X^ c #6D7E8D", +"X/ c #55697C", +"X( c #7AA2B4", +"X) c #28435D", +"X_ c #53677A", +"X` c #708D9D", +"X' c #516578", +"X] c #839CA9", +"X[ c #4F6376", +"X{ c #4D6174", +"X} c #004467", +"X| c #BACCD5", +"o c #B1805C", +"o. c #B6C8D1", +"oX c #034A6D", +"oo c #02486C", +"oO c #01466B", +"o+ c #1F516E", +"o@ c #095476", +"o# c #075274", +"o$ c #AE7E5C", +"o% c #B2C6D0", +"o& c #6E8FA1", +"o* c #5F7B8F", +"o= c #899FAB", +"o- c #20415B", +"o; c #95ADBA", +"o: c #1F415A", +"o> c #135979", +"o, c #0B5A7B", +"o< c #125778", +"o1 c #185674", +"o2 c #0A587A", +"o3 c #41768F", +"o4 c #2F4A63", +"o5 c #A1B4BF", +"o6 c None", /* pixels */ -"|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.", -"|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.", -"|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.", -"|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.", -"|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.", -"|.!.Y A c z.l.l.h.z.h.g.h.f.x V 0.|.|.|.|.|.|.|.", -"|.i./ t.v T.T.M.n.n.b.v.c.x.p F.2 |.|.|.|.|.|.|.", -"|.s.W .i.].(.y.r.7.5.3.1.4.^ 7 2 |.|.|.|.|.|.|.", -"|.s.[ &.p.].`.7.<.@.+.o.| 1.^ $ V |.|.|.|.|.|.|.", -"|.s.&.-.p.`.(.o.q q 0 6 6 | ^ $ V |.|.|.|.|.|.|.", -"|.s.&.:.s.`./.^.^.Q.R.I.P.D.^ % V |.|.|.|.|.|.|.", -"|.s.$.-.$.=.$.$.R R K F B m : % V |.|.|.|.|.|.|.", -"|.s.` } &.&.$.[ _ U J Z 9 : * % V |.|.|.|.|.|.|.", -"|.s.R _ _ ` _ ( U J D m 8 - % % V |.|.|.|.|.|.|.", -"|.s.G H U U O.g i z g i e @ % % V |.|.|.|.|.|.|.", -"|.s.N Z Z Z G.o Q.U.J.Z.> % % V |.|.|.|.|.|.|.", -"|.s.4 8 b 9 K.o . I.K.A.B.< % % C |.|.|.|.|.|.|.", -"|.w.* - - # Q.X . K.S.C.N.< % % V |.|.|.|.|.|.|.", -"|.{.Y % % + R.l l A.C.B.8.< % = ,.|.|.|.|.|.|.|.", -"|.|.{.>.,.d y y y y y y y f q.e.}.|.|.|.|.|.|.|.", -"|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.", -"|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.", -"|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.", -"|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|." +"XZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZ", +"XZ.+.+.@.+X:X: NXRXRXRXRXRXRXRXRXRXRXR.jo,o,.+XZ", +".+XRo2 [X<.Z.4 ~ ~ ~.6.)Xc 6 6 / 7 9.{XkXM.q k.+", +".+.,o*.3 + Z O.AXlo W Q 1.po$.(XH...X.wo+.1 f s", +".j.uX~ m.9.<.2 3 0 u d.&o5Xt L IXf./ !.5.8XY.D.l", +"XRo1.> < %X|o..].Q cX=XFXv.oo&XPX rX]XQX1.!X,.l", +"XR |XDo@X( ,o%.|X2 G.H #.7 $.K.K.L.L @X&Xa T -.l", +"o,. .aXS.-.` w u.V.F.0 y ] { v.dXKX-o=o3 U T -.l", +"o,.s._o#XLXmX. a.So-o-o-.O.Oo:.h.h.h.P.y.T T -.l", +".k 5.'o# ` a zX6XE.N X AX8.*.n.mX` CXhoO T -.l", +".l.' 8XG.WXJXIo;XWX!X9Xe K.I.r.E.~ : 2XA.T T -.l", +".l (.q.[ q _ eXN iXVXoXoXoo> p poXbX3 T T T T =o2", +"X% T T T T T x MX@XTXT.%Xu.R E ^.}X5 T T T T =o2", +"X# T T T T T xX; lXTXTX^XpXj 4 ) ' V T T T T.e.l", +"o,.i T T T TX*X>.;.b b.g.^XxXnXBX$.vX} T T.e.l.+", +"XZ.k jX%X%X%.GX4.C o SX7 FXw GXr JXs } k k.l.+XZ" }; Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/mpl-data/images/qt4_editor_options.png and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/mpl-data/images/qt4_editor_options.png differ diff -Nru matplotlib-0.99.3/lib/matplotlib/mpl-data/images/qt4_editor_options.svg matplotlib-1.0.1/lib/matplotlib/mpl-data/images/qt4_editor_options.svg --- matplotlib-0.99.3/lib/matplotlib/mpl-data/images/qt4_editor_options.svg 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/mpl-data/images/qt4_editor_options.svg 2010-07-07 01:41:51.000000000 +0000 @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + diff -Nru matplotlib-0.99.3/lib/matplotlib/mpl-data/matplotlib.conf matplotlib-1.0.1/lib/matplotlib/mpl-data/matplotlib.conf --- matplotlib-0.99.3/lib/matplotlib/mpl-data/matplotlib.conf 2010-05-30 20:33:50.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/mpl-data/matplotlib.conf 2011-01-06 13:52:51.000000000 +0000 @@ -89,7 +89,7 @@ [backend] # one of: ps | qt4agg | fltkagg | gtkagg | agg | cairo | gtk | gtkcairo | # wxagg | tkagg | qtagg | template | svg | cocoaagg | pdf | wx - use = 'MacOSX' + use = 'GTKAgg' [[cairo]] # 'png' or 'ps' or 'pdf' or 'svg' diff -Nru matplotlib-0.99.3/lib/matplotlib/mpl-data/matplotlibrc matplotlib-1.0.1/lib/matplotlib/mpl-data/matplotlibrc --- matplotlib-0.99.3/lib/matplotlib/mpl-data/matplotlibrc 2010-05-30 20:33:50.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/mpl-data/matplotlibrc 2011-01-06 13:52:51.000000000 +0000 @@ -28,7 +28,7 @@ # You can also deploy your own backend outside of matplotlib by # referring to the module name (which must be in the PYTHONPATH) as # 'module://my_backend' -backend : MacOSX +backend : GTKAgg # if you are runing pyplot inside a GUI and your backend choice # conflicts, we will automatically try and find a compatible one for @@ -63,10 +63,10 @@ # circles. See # http://matplotlib.sourceforge.net/api/artist_api.html#module-matplotlib.patches # information on patch properties -#patch.linewidth : 1.0 # edge width in points -#patch.facecolor : blue -#patch.edgecolor : black -#patch.antialiased : True # render patches in antialised (no jaggies) +#patch.linewidth : 1.0 # edge width in points +#patch.facecolor : blue +#patch.edgecolor : black +#patch.antialiased : True # render patches in antialised (no jaggies) ### FONT # @@ -158,14 +158,8 @@ # correction off. None will try and # guess based on your dvipng version -#text.markup : 'plain' # Affects how text, such as titles and labels, are - # interpreted by default. - # 'plain': As plain, unformatted text - # 'tex': As TeX-like text. Text between $'s will be - # formatted as a TeX math expression. - # This setting has no effect when text.usetex is True. - # In that case, all text will be sent to TeX for - # processing. +#text.hinting : True # If True, text will be hinted, otherwise not. This only + # affects the Agg backend. # The following settings allow you to select the fonts in math mode. # They map from a TeX font name to a fontconfig font pattern. @@ -181,8 +175,8 @@ #mathtext.fontset : cm # Should be 'cm' (Computer Modern), 'stix', # 'stixsans' or 'custom' #mathtext.fallback_to_cm : True # When True, use symbols from the Computer Modern - # fonts when a symbol can not be found in one of - # the custom math fonts. + # fonts when a symbol can not be found in one of + # the custom math fonts. #mathtext.default : it # The default font to use for math. # Can be any of the LaTeX font names, including @@ -208,6 +202,10 @@ # first or larger than the second #axes.unicode_minus : True # use unicode for the minus symbol # rather than hypen. See http://en.wikipedia.org/wiki/Plus_sign#Plus_sign +#axes.color_cycle : b, g, r, c, m, y, k # color cycle for plot lines + # as list of string colorspecs: + # single letter, long name, or + # web-style hex #polaraxes.grid : True # display grid on polar axes #axes3d.grid : True # display grid on 3d axes @@ -261,12 +259,12 @@ # The figure subplot parameters. All dimensions are fraction of the # figure width or height -#figure.subplot.left : 0.125 # the left side of the subplots of the figure -#figure.subplot.right : 0.9 # the right side of the subplots of the figure -#figure.subplot.bottom : 0.1 # the bottom of the subplots of the figure -#figure.subplot.top : 0.9 # the top of the subplots of the figure -#figure.subplot.wspace : 0.2 # the amount of width reserved for blank space between subplots -#figure.subplot.hspace : 0.2 # the amount of height reserved for white space between subplots +#figure.subplot.left : 0.125 # the left side of the subplots of the figure +#figure.subplot.right : 0.9 # the right side of the subplots of the figure +#figure.subplot.bottom : 0.1 # the bottom of the subplots of the figure +#figure.subplot.top : 0.9 # the top of the subplots of the figure +#figure.subplot.wspace : 0.2 # the amount of width reserved for blank space between subplots +#figure.subplot.hspace : 0.2 # the amount of height reserved for white space between subplots ### IMAGES #image.aspect : equal # equal | auto | a number @@ -290,12 +288,15 @@ # A value of 20000 is probably a good # starting point. ### SAVING FIGURES -#path.simplify : False # When True, simplify paths by removing "invisible" +#path.simplify : True # When True, simplify paths by removing "invisible" # points to reduce file size and increase rendering # speed #path.simplify_threshold : 0.1 # The threshold of similarity below which # vertices will be removed in the simplification # process +#path.snap : True # When True, rectilinear axis-aligned paths will be snapped to + # the nearest pixel when certain criteria are met. When False, + # paths will never be snapped. # the default savefig params can be different from the display params # Eg, you may want a higher resolution, or to make the figure @@ -303,12 +304,12 @@ #savefig.dpi : 100 # figure dots per inch #savefig.facecolor : white # figure facecolor when saving #savefig.edgecolor : white # figure edgecolor when saving +#savefig.extension : auto # what extension to use for savefig('foo'), or 'auto' #cairo.format : png # png, ps, pdf, svg # tk backend params #tk.window_focus : False # Maintain shell focus for TkAgg -#tk.pythoninspect : False # tk sets PYTHONINSEPCT # ps backend params #ps.papersize : letter # auto, letter, legal, ledger, A0-A10, B0-B10 @@ -352,3 +353,29 @@ # from matplotlib import verbose. #verbose.level : silent # one of silent, helpful, debug, debug-annoying #verbose.fileo : sys.stdout # a log filename, sys.stdout or sys.stderr + +# Event keys to interact with figures/plots via keyboard. +# Customize these settings according to your needs. +# Leave the field(s) empty if you don't need a key-map. (i.e., fullscreen : '') + +#keymap.fullscreen : f # toggling +#keymap.home : h, r, home # home or reset mnemonic +#keymap.back : left, c, backspace # forward / backward keys to enable +#keymap.forward : right, v # left handed quick navigation +#keymap.pan : p # pan mnemonic +#keymap.zoom : o # zoom mnemonic +#keymap.save : s # saving current figure +#keymap.grid : g # switching on/off a grid in current axes +#keymap.yscale : l # toggle scaling of y-axes ('log'/'linear') +#keymap.xscale : L, k # toggle scaling of x-axes ('log'/'linear') +#keymap.all_axes : a # enable all axes + +# Control downloading of example data. Various examples download some +# data from the Matplotlib svn repository to avoid distributing extra +# files, but sometimes you want to avoid that. In that case set +# examples.download to False and examples.directory to the directory +# where you have a checkout of +# https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/trunk/sample_data + +#examples.download : True # False to bypass downloading mechanism +#examples.directory : '' # directory to look in if download is false diff -Nru matplotlib-0.99.3/lib/matplotlib/offsetbox.py matplotlib-1.0.1/lib/matplotlib/offsetbox.py --- matplotlib-0.99.3/lib/matplotlib/offsetbox.py 2009-07-31 15:14:40.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/offsetbox.py 2010-08-03 14:22:42.000000000 +0000 @@ -19,13 +19,22 @@ import matplotlib.artist as martist import matplotlib.text as mtext import numpy as np -from matplotlib.transforms import Bbox, BboxBase, TransformedBbox, BboxTransformTo +from matplotlib.transforms import Bbox, BboxBase, TransformedBbox, \ + IdentityTransform, BboxTransformFrom from matplotlib.font_manager import FontProperties -from matplotlib.patches import FancyBboxPatch +from matplotlib.patches import FancyBboxPatch, FancyArrowPatch from matplotlib import rcParams +from matplotlib import docstring +import matplotlib.cbook as cbook + +#from bboximage import BboxImage +from matplotlib.image import BboxImage + from matplotlib.patches import bbox_artist as mbbox_artist + + DEBUG=False # for debuging use def bbox_artist(*args, **kwargs): @@ -144,6 +153,13 @@ for c in self.get_children(): c.set_figure(fig) + def contains(self, mouseevent): + for c in self.get_children(): + a, b = c.contains(mouseevent) + if a: + return a, b + return False, {} + def set_offset(self, xy): """ Set the offset @@ -152,14 +168,14 @@ """ self._offset = xy - def get_offset(self, width, height, xdescent, ydescent): + def get_offset(self, width, height, xdescent, ydescent, renderer): """ Get the offset accepts extent of the box """ if callable(self._offset): - return self._offset(width, height, xdescent, ydescent) + return self._offset(width, height, xdescent, ydescent, renderer) else: return self._offset @@ -206,7 +222,7 @@ get the bounding box in display space. ''' w, h, xd, yd, offsets = self.get_extent_offsets(renderer) - px, py = self.get_offset(w, h, xd, yd) + px, py = self.get_offset(w, h, xd, yd, renderer) return mtransforms.Bbox.from_bounds(px-xd, py-yd, w, h) def draw(self, renderer): @@ -217,7 +233,7 @@ width, height, xdescent, ydescent, offsets = self.get_extent_offsets(renderer) - px, py = self.get_offset(width, height, xdescent, ydescent) + px, py = self.get_offset(width, height, xdescent, ydescent, renderer) for c, (ox, oy) in zip(self.get_visible_children(), offsets): c.set_offset((px+ox, py+oy)) @@ -359,6 +375,9 @@ whd_list = [c.get_extent(renderer) for c in self.get_visible_children()] + if not whd_list: + return 2*pad, 2*pad, pad, pad, [] + if self.height is None: height_descent = max([h-yd for w,h,xd,yd in whd_list]) ydescent = max([yd for w,h,xd,yd in whd_list]) @@ -622,14 +641,14 @@ bbox, info = self._text._get_layout(renderer) w, h = bbox.width, bbox.height - line = info[0][0] # first line - + line = info[-1][0] # last line _, hh, dd = renderer.get_text_width_height_descent( line, self._text._fontproperties, ismath=ismath) - + d = dd # the baseline of the last line self._baseline_transform.clear() - d = h-(hh-dd) # the baseline of the first line + + if len(info) > 1 and self._multilinebaseline: d_new = 0.5 * h - 0.5 * (h_ - d_) self._baseline_transform.translate(0, d - d_new) @@ -744,7 +763,7 @@ def get_extent(self, renderer): # clear the offset transforms - _off = self.ref_offset_transform.to_values() # to be restored later + _off = self.offset_transform.to_values() # to be restored later self.ref_offset_transform.clear() self.offset_transform.clear() @@ -755,8 +774,10 @@ # adjust ref_offset_tansform self.ref_offset_transform.translate(-ub.x0, -ub.y0) + # restor offset transform - self.offset_transform.matrix_from_values(*_off) + mtx = self.offset_transform.matrix_from_values(*_off) + self.offset_transform.set_matrix(mtx) return ub.width, ub.height, 0., 0. @@ -890,7 +911,7 @@ else: return TransformedBbox(self._bbox_to_anchor, transform) - + @@ -901,7 +922,7 @@ *bbox* can be a Bbox instance, a list of [left, bottom, width, height], or a list of [left, bottom] where the width and height will be assumed to be zero. The bbox will be - transformed to display coordinate by the given transform. + transformed to display coordinate by the given transform. """ if bbox is None or isinstance(bbox, BboxBase): self._bbox_to_anchor = bbox @@ -925,7 +946,7 @@ ''' self._update_offset_func(renderer) w, h, xd, yd = self.get_extent(renderer) - ox, oy = self.get_offset(w, h, xd, yd) + ox, oy = self.get_offset(w, h, xd, yd, renderer) return Bbox.from_bounds(ox-xd, oy-yd, w, h) @@ -937,7 +958,7 @@ if fontsize is None: fontsize = renderer.points_to_pixels(self.prop.get_size_in_points()) - def _offset(w, h, xd, yd, fontsize=fontsize, self=self): + def _offset(w, h, xd, yd, renderer, fontsize=fontsize, self=self): bbox = Bbox.from_bounds(0, 0, w, h) borderpad = self.borderpad*fontsize bbox_to_anchor = self.get_bbox_to_anchor() @@ -951,6 +972,13 @@ self.set_offset(_offset) + def update_frame(self, bbox, fontsize=None): + self.patch.set_bounds(bbox.x0, bbox.y0, + bbox.width, bbox.height) + + if fontsize: + self.patch.set_mutation_scale(fontsize) + def draw(self, renderer): "draw the artist" @@ -962,17 +990,13 @@ if self._drawFrame: # update the location and size of the legend bbox = self.get_window_extent(renderer) - self.patch.set_bounds(bbox.x0, bbox.y0, - bbox.width, bbox.height) - - self.patch.set_mutation_scale(fontsize) - + self.update_frame(bbox, fontsize) self.patch.draw(renderer) width, height, xdescent, ydescent = self.get_extent(renderer) - px, py = self.get_offset(width, height, xdescent, ydescent) + px, py = self.get_offset(width, height, xdescent, ydescent, renderer) self.get_child().set_offset((px, py)) self.get_child().draw(renderer) @@ -1004,3 +1028,564 @@ container = parentbbox.padded(-borderpad) anchored_box = bbox.anchored(c, container=container) return anchored_box.x0, anchored_box.y0 + + +class AnchoredText(AnchoredOffsetbox): + """ + AnchoredOffsetbox with Text + """ + + def __init__(self, s, loc, pad=0.4, borderpad=0.5, prop=None, **kwargs): + """ + *s* : string + *loc* : location code + *prop* : font property + *pad* : pad between the text and the frame as fraction of the font size. + *borderpad* : pad between the frame and the axes (or bbox_to_anchor). + + other keyword parameters of AnchoredOffsetbox are also allowed. + """ + + self.txt = TextArea(s, textprops=prop, + minimumdescent=False) + fp = self.txt._text.get_fontproperties() + + super(AnchoredText, self).__init__(loc, pad=pad, borderpad=borderpad, + child=self.txt, + prop=fp, + **kwargs) + + + +class OffsetImage(OffsetBox): + def __init__(self, arr, + zoom=1, + cmap = None, + norm = None, + interpolation=None, + origin=None, + filternorm=1, + filterrad=4.0, + resample = False, + dpi_cor=True, + **kwargs + ): + + self._dpi_cor = dpi_cor + + self.image = BboxImage(bbox=self.get_window_extent, + cmap = cmap, + norm = norm, + interpolation=interpolation, + origin=origin, + filternorm=filternorm, + filterrad=filterrad, + resample = resample, + **kwargs + ) + + self._children = [self.image] + + self.set_zoom(zoom) + self.set_data(arr) + + OffsetBox.__init__(self) + + + def set_data(self, arr): + self._data = np.asarray(arr) + self.image.set_data(self._data) + + def get_data(self): + return self._data + + def set_zoom(self, zoom): + self._zoom = zoom + + def get_zoom(self): + return self._zoom + +# def set_axes(self, axes): +# self.image.set_axes(axes) +# martist.Artist.set_axes(self, axes) + +# def set_offset(self, xy): +# """ +# set offset of the container. + +# Accept : tuple of x,y cooridnate in disokay units. +# """ +# self._offset = xy + +# self.offset_transform.clear() +# self.offset_transform.translate(xy[0], xy[1]) + + + + def get_offset(self): + """ + return offset of the container. + """ + return self._offset + + def get_children(self): + return [self.image] + + def get_window_extent(self, renderer): + ''' + get the bounding box in display space. + ''' + w, h, xd, yd = self.get_extent(renderer) + ox, oy = self.get_offset() + return mtransforms.Bbox.from_bounds(ox-xd, oy-yd, w, h) + + + def get_extent(self, renderer): + + if self._dpi_cor: # True, do correction + dpi_cor = renderer.points_to_pixels(1.) + else: + dpi_cor = 1. + + zoom = self.get_zoom() + data = self.get_data() + ny, nx = data.shape[:2] + w, h = nx*zoom, ny*zoom + + return w, h, 0, 0 + + + + def draw(self, renderer): + """ + Draw the children + """ + + self.image.draw(renderer) + + #bbox_artist(self, renderer, fill=False, props=dict(pad=0.)) + + + +from matplotlib.text import _AnnotationBase + +class AnnotationBbox(martist.Artist, _AnnotationBase): + """ + Annotation-like class, but with offsetbox instead of Text. + """ + + zorder = 3 + + def __str__(self): + return "AnnotationBbox(%g,%g)"%(self.xy[0],self.xy[1]) + @docstring.dedent_interpd + def __init__(self, offsetbox, xy, + xybox=None, + xycoords='data', + boxcoords=None, + frameon=True, pad=0.4, # BboxPatch + annotation_clip=None, + box_alignment=(0.5, 0.5), + bboxprops=None, + arrowprops=None, + fontsize=None, + **kwargs): + """ + *offsetbox* : OffsetBox instance + + *xycoords* : same as Annotation but can be a tuple of two + strings which are interpreted as x and y coordinates. + + *boxcoords* : similar to textcoords as Annotation but can be a + tuple of two strings which are interpreted as x and y + coordinates. + + *box_alignment* : a tuple of two floats for a vertical and + horizontal alignment of the offset box w.r.t. the *boxcoords*. + The lower-left corner is (0.0) and upper-right corner is (1.1). + + other parameters are identical to that of Annotation. + """ + self.offsetbox = offsetbox + + self.arrowprops = arrowprops + + self.set_fontsize(fontsize) + + + if arrowprops is not None: + self._arrow_relpos = self.arrowprops.pop("relpos", (0.5, 0.5)) + self.arrow_patch = FancyArrowPatch((0, 0), (1,1), + **self.arrowprops) + else: + self._arrow_relpos = None + self.arrow_patch = None + + _AnnotationBase.__init__(self, + xy, xytext=xybox, + xycoords=xycoords, textcoords=boxcoords, + annotation_clip=annotation_clip) + + martist.Artist.__init__(self, **kwargs) + + #self._fw, self._fh = 0., 0. # for alignment + self._box_alignment = box_alignment + + # frame + self.patch = FancyBboxPatch( + xy=(0.0, 0.0), width=1., height=1., + facecolor='w', edgecolor='k', + mutation_scale=self.prop.get_size_in_points(), + snap=True + ) + self.patch.set_boxstyle("square",pad=pad) + if bboxprops: + self.patch.set(**bboxprops) + self._drawFrame = frameon + + + def contains(self,event): + t,tinfo = self.offsetbox.contains(event) + #if self.arrow_patch is not None: + # a,ainfo=self.arrow_patch.contains(event) + # t = t or a + + # self.arrow_patch is currently not checked as this can be a line - JJ + + return t,tinfo + + + def get_children(self): + children = [self.offsetbox, self.patch] + if self.arrow_patch: + children.append(self.arrow_patch) + return children + + def set_figure(self, fig): + + if self.arrow_patch is not None: + self.arrow_patch.set_figure(fig) + self.offsetbox.set_figure(fig) + martist.Artist.set_figure(self, fig) + + def set_fontsize(self, s=None): + """ + set fontsize in points + """ + if s is None: + s = rcParams["legend.fontsize"] + + self.prop=FontProperties(size=s) + + def get_fontsize(self, s=None): + """ + return fontsize in points + """ + return self.prop.get_size_in_points() + + def update_positions(self, renderer): + "Update the pixel positions of the annotated point and the text." + xy_pixel = self._get_position_xy(renderer) + self._update_position_xybox(renderer, xy_pixel) + + mutation_scale = renderer.points_to_pixels(self.get_fontsize()) + self.patch.set_mutation_scale(mutation_scale) + + if self.arrow_patch: + self.arrow_patch.set_mutation_scale(mutation_scale) + + + def _update_position_xybox(self, renderer, xy_pixel): + "Update the pixel positions of the annotation text and the arrow patch." + + x, y = self.xytext + if isinstance(self.textcoords, tuple): + xcoord, ycoord = self.textcoords + x1, y1 = self._get_xy(renderer, x, y, xcoord) + x2, y2 = self._get_xy(renderer, x, y, ycoord) + ox0, oy0 = x1, y2 + else: + ox0, oy0 = self._get_xy(renderer, x, y, self.textcoords) + + w, h, xd, yd = self.offsetbox.get_extent(renderer) + + _fw, _fh = self._box_alignment + self.offsetbox.set_offset((ox0-_fw*w+xd, oy0-_fh*h+yd)) + + # update patch position + bbox = self.offsetbox.get_window_extent(renderer) + #self.offsetbox.set_offset((ox0-_fw*w, oy0-_fh*h)) + self.patch.set_bounds(bbox.x0, bbox.y0, + bbox.width, bbox.height) + + x, y = xy_pixel + + ox1, oy1 = x, y + + if self.arrowprops: + x0, y0 = x, y + + d = self.arrowprops.copy() + + # Use FancyArrowPatch if self.arrowprops has "arrowstyle" key. + + # adjust the starting point of the arrow relative to + # the textbox. + # TODO : Rotation needs to be accounted. + relpos = self._arrow_relpos + + ox0 = bbox.x0 + bbox.width * relpos[0] + oy0 = bbox.y0 + bbox.height * relpos[1] + + # The arrow will be drawn from (ox0, oy0) to (ox1, + # oy1). It will be first clipped by patchA and patchB. + # Then it will be shrinked by shirnkA and shrinkB + # (in points). If patch A is not set, self.bbox_patch + # is used. + + self.arrow_patch.set_positions((ox0, oy0), (ox1,oy1)) + fs = self.prop.get_size_in_points() + mutation_scale = d.pop("mutation_scale", fs) + mutation_scale = renderer.points_to_pixels(mutation_scale) + self.arrow_patch.set_mutation_scale(mutation_scale) + + patchA = d.pop("patchA", self.patch) + self.arrow_patch.set_patchA(patchA) + + + + def draw(self, renderer): + """ + Draw the :class:`Annotation` object to the given *renderer*. + """ + + if renderer is not None: + self._renderer = renderer + if not self.get_visible(): return + + xy_pixel = self._get_position_xy(renderer) + + if not self._check_xy(renderer, xy_pixel): + return + + self.update_positions(renderer) + + if self.arrow_patch is not None: + if self.arrow_patch.figure is None and self.figure is not None: + self.arrow_patch.figure = self.figure + self.arrow_patch.draw(renderer) + + if self._drawFrame: + self.patch.draw(renderer) + + self.offsetbox.draw(renderer) + + + +class DraggableBase(object): + """ + helper code for a draggable artist (legend, offsetbox) + The derived class must override following two method. + + def saveoffset(self): + pass + + def update_offset(self, dx, dy): + pass + + *saveoffset* is called when the object is picked for dragging and it is + meant to save reference position of the artist. + + *update_offset* is called during the dragging. dx and dy is the pixel + offset from the point where the mouse drag started. + + Optionally you may override following two methods. + + def artist_picker(self, artist, evt): + return self.ref_artist.contains(evt) + + def finalize_offset(self): + pass + + *artist_picker* is a picker method that will be + used. *finalize_offset* is called when the mouse is released. In + current implementaion of DraggableLegend and DraggableAnnotation, + *update_offset* places the artists simply in display + coordinates. And *finalize_offset* recalculate their position in + the normalized axes coordinate and set a relavant attribute. + + """ + def __init__(self, ref_artist, use_blit=False): + self.ref_artist = ref_artist + self.got_artist = False + self._use_blit = use_blit + + self.canvas = self.ref_artist.figure.canvas + c2 = self.canvas.mpl_connect('pick_event', self.on_pick) + c3 = self.canvas.mpl_connect('button_release_event', self.on_release) + + ref_artist.set_picker(self.artist_picker) + self.cids = [c2, c3] + + def on_motion(self, evt): + if self.got_artist: + dx = evt.x - self.mouse_x + dy = evt.y - self.mouse_y + self.update_offset(dx, dy) + self.canvas.draw() + + def on_motion_blit(self, evt): + if self.got_artist: + dx = evt.x - self.mouse_x + dy = evt.y - self.mouse_y + self.update_offset(dx, dy) + self.canvas.restore_region(self.background) + self.ref_artist.draw(self.ref_artist.figure._cachedRenderer) + self.canvas.blit(self.ref_artist.figure.bbox) + + def on_pick(self, evt): + if evt.artist == self.ref_artist: + + self.mouse_x = evt.mouseevent.x + self.mouse_y = evt.mouseevent.y + self.got_artist = True + + if self._use_blit: + self.ref_artist.set_animated(True) + self.canvas.draw() + self.background = self.canvas.copy_from_bbox(self.ref_artist.figure.bbox) + self.ref_artist.draw(self.ref_artist.figure._cachedRenderer) + self.canvas.blit(self.ref_artist.figure.bbox) + self._c1 = self.canvas.mpl_connect('motion_notify_event', self.on_motion_blit) + else: + self._c1 = self.canvas.mpl_connect('motion_notify_event', self.on_motion) + self.save_offset() + + def on_release(self, event): + if self.got_artist: + self.finalize_offset() + self.got_artist = False + self.canvas.mpl_disconnect(self._c1) + + if self._use_blit: + self.ref_artist.set_animated(False) + + def disconnect(self): + 'disconnect the callbacks' + for cid in self.cids: + self.canvas.mpl_disconnect(cid) + + def artist_picker(self, artist, evt): + return self.ref_artist.contains(evt) + + def save_offset(self): + pass + + def update_offset(self, dx, dy): + pass + + def finalize_offset(self): + pass + + +class DraggableOffsetBox(DraggableBase): + def __init__(self, ref_artist, offsetbox, use_blit=False): + DraggableBase.__init__(self, ref_artist, use_blit=use_blit) + self.offsetbox = offsetbox + + def save_offset(self): + offsetbox = self.offsetbox + renderer = offsetbox.figure._cachedRenderer + w, h, xd, yd = offsetbox.get_extent(renderer) + offset = offsetbox.get_offset(w, h, xd, yd, renderer) + self.offsetbox_x, self.offsetbox_y = offset + + def update_offset(self, dx, dy): + loc_in_canvas = self.offsetbox_x + dx, self.offsetbox_y + dy + self.offsetbox.set_offset(loc_in_canvas) + + def get_loc_in_canvas(self): + + offsetbox=self.offsetbox + renderer = offsetbox.figure._cachedRenderer + w, h, xd, yd = offsetbox.get_extent(renderer) + ox, oy = offsetbox._offset + loc_in_canvas = (ox-xd, oy-yd) + + return loc_in_canvas + + +class DraggableAnnotation(DraggableBase): + def __init__(self, annotation, use_blit=False): + DraggableBase.__init__(self, annotation, use_blit=use_blit) + self.annotation = annotation + + def save_offset(self): + ann = self.annotation + x, y = ann.xytext + if isinstance(ann.textcoords, tuple): + xcoord, ycoord = ann.textcoords + x1, y1 = ann._get_xy(self.canvas.renderer, x, y, xcoord) + x2, y2 = ann._get_xy(self.canvas.renderer, x, y, ycoord) + ox0, oy0 = x1, y2 + else: + ox0, oy0 = ann._get_xy(self.canvas.renderer, x, y, ann.textcoords) + + self.ox, self.oy = ox0, oy0 + self.annotation.textcoords = "figure pixels" + + def update_offset(self, dx, dy): + ann = self.annotation + ann.xytext = self.ox + dx, self.oy + dy + x, y = ann.xytext + xy = ann._get_xy(self.canvas.renderer, x, y, ann.textcoords) + + def finalize_offset(self): + loc_in_canvas = self.annotation.xytext + self.annotation.textcoords = "axes fraction" + pos_axes_fraction = self.annotation.axes.transAxes.inverted().transform_point(loc_in_canvas) + self.annotation.xytext = tuple(pos_axes_fraction) + + +if __name__ == "__main__": + + fig = plt.figure(1) + fig.clf() + ax = plt.subplot(121) + + #txt = ax.text(0.5, 0.5, "Test", size=30, ha="center", color="w") + kwargs = dict() + + a = np.arange(256).reshape(16,16)/256. + myimage = OffsetImage(a, + zoom=2, + norm = None, + origin=None, + **kwargs + ) + ax.add_artist(myimage) + + myimage.set_offset((100, 100)) + + + myimage2 = OffsetImage(a, + zoom=2, + norm = None, + origin=None, + **kwargs + ) + ann = AnnotationBbox(myimage2, (0.5, 0.5), + xybox=(30, 30), + xycoords='data', + boxcoords="offset points", + frameon=True, pad=0.4, # BboxPatch + bboxprops=dict(boxstyle="round", fc="y"), + fontsize=None, + arrowprops=dict(arrowstyle="->"), + ) + + ax.add_artist(ann) + + plt.draw() + plt.show() + diff -Nru matplotlib-0.99.3/lib/matplotlib/patches.py matplotlib-1.0.1/lib/matplotlib/patches.py --- matplotlib-0.99.3/lib/matplotlib/patches.py 2010-05-30 20:31:09.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/patches.py 2010-12-13 15:27:29.000000000 +0000 @@ -9,13 +9,14 @@ import matplotlib.artist as artist from matplotlib.artist import allow_rasterization import matplotlib.colors as colors +from matplotlib import docstring import matplotlib.transforms as transforms from matplotlib.path import Path # these are not available for the object inspector until after the # class is built so we define an initial set here for the init # function and they will be overridden after object definition -artist.kwdocd['Patch'] = """ +docstring.interpd.update(Patch = """ ================= ============================================== Property Description @@ -38,7 +39,7 @@ zorder any number ================= ============================================== - """ + """) class Patch(artist.Artist): """ @@ -51,11 +52,56 @@ def __str__(self): return str(self.__class__).split('.')[-1] + def __init__(self, + edgecolor=None, + facecolor=None, + color=None, + linewidth=None, + linestyle=None, + antialiased = None, + hatch = None, + fill=True, + path_effects = None, + **kwargs + ): + """ + The following kwarg properties are supported + + %(Patch)s + """ + artist.Artist.__init__(self) + + if linewidth is None: linewidth = mpl.rcParams['patch.linewidth'] + if linestyle is None: linestyle = "solid" + if antialiased is None: antialiased = mpl.rcParams['patch.antialiased'] + + self._fill = True # needed for set_facecolor call + if color is not None: + if (edgecolor is not None or + facecolor is not None): + import warnings + warnings.warn("Setting the 'color' property will override" + "the edgecolor or facecolor properties. ") + self.set_color(color) + else: + self.set_edgecolor(edgecolor) + self.set_facecolor(facecolor) + self.set_linewidth(linewidth) + self.set_linestyle(linestyle) + self.set_antialiased(antialiased) + self.set_hatch(hatch) + self.set_fill(fill) + self._combined_transform = transforms.IdentityTransform() + + self.set_path_effects(path_effects) + + if len(kwargs): artist.setp(self, **kwargs) + def get_verts(self): """ Return a copy of the vertices used in this patch - If the patch contains Bézier curves, the curves will be + If the patch contains Bezier curves, the curves will be interpolated by line segments. To access the curves as curves, use :meth:`get_path`. """ @@ -180,7 +226,7 @@ ACCEPTS: mpl color spec, or None for default, or 'none' for no color """ if color is None: color = mpl.rcParams['patch.edgecolor'] - self._edgecolor = color + self._edgecolor = colors.colorConverter.to_rgba(color, self._alpha) def set_ec(self, color): """alias for set_edgecolor""" @@ -193,7 +239,12 @@ ACCEPTS: mpl color spec, or None for default, or 'none' for no color """ if color is None: color = mpl.rcParams['patch.facecolor'] - self._facecolor = color + self._original_facecolor = color # save: otherwise changing _fill + # may lose alpha information + self._facecolor = colors.colorConverter.to_rgba(color, self._alpha) + if not self._fill: + self._facecolor = list(self._facecolor) + self._facecolor[3] = 0 def set_fc(self, color): """alias for set_facecolor""" @@ -213,6 +264,21 @@ self.set_facecolor(c) self.set_edgecolor(c) + def set_alpha(self, alpha): + """ + Set the alpha tranparency of the patch. + + ACCEPTS: float or None + """ + if alpha is not None: + try: + float(alpha) + except TypeError: + raise TypeError('alpha must be a float or None') + artist.Artist.set_alpha(self, alpha) + self.set_facecolor(self._original_facecolor) # using self._fill and self._alpha + self._edgecolor = colors.colorConverter.to_rgba( + self._edgecolor[:3], self._alpha) def set_linewidth(self, w): """ @@ -246,11 +312,17 @@ ACCEPTS: [True | False] """ - self.fill = b + self._fill = bool(b) + self.set_facecolor(self._original_facecolor) def get_fill(self): 'return whether fill is set' - return self.fill + return self._fill + + # Make fill a property so as to preserve the long-standing + # but somewhat inconsistent behavior in which fill was an + # attribute. + fill = property(get_fill, set_fill) def set_hatch(self, hatch): """ @@ -284,6 +356,16 @@ 'Return the current hatching pattern' return self._hatch + def set_path_effects(self, path_effects): + """ + set path_effects, which should be a list of instances of + matplotlib.patheffect._Base class or its derivatives. + """ + self._path_effects = path_effects + + def get_path_effects(self): + return self._path_effects + @allow_rasterization def draw(self, renderer): 'Draw the :class:`Patch` to the given *renderer*.' @@ -292,28 +374,27 @@ renderer.open_group('patch', self.get_gid()) gc = renderer.new_gc() - if cbook.is_string_like(self._edgecolor) and self._edgecolor.lower()=='none': - gc.set_linewidth(0) - else: - gc.set_foreground(self._edgecolor) - gc.set_linewidth(self._linewidth) - gc.set_linestyle(self._linestyle) + gc.set_foreground(self._edgecolor, isRGB=True) + + lw = self._linewidth + if self._edgecolor[3] == 0: + lw = 0 + gc.set_linewidth(lw) + gc.set_linestyle(self._linestyle) gc.set_antialiased(self._antialiased) self._set_gc_clip(gc) gc.set_capstyle('projecting') gc.set_url(self._url) - gc.set_snap(self._snap) - - if (not self.fill or self._facecolor is None or - (cbook.is_string_like(self._facecolor) and self._facecolor.lower()=='none')): - rgbFace = None - gc.set_alpha(1.0) - else: - r, g, b, a = colors.colorConverter.to_rgba(self._facecolor, self._alpha) - rgbFace = (r, g, b) - gc.set_alpha(a) + gc.set_snap(self.get_snap()) + rgbFace = self._facecolor + if rgbFace[3] == 0: + rgbFace = None # (some?) renderers expect this as no-fill signal + + gc.set_alpha(self._edgecolor[3]) + if self._edgecolor[3] == 0: + gc.set_alpha(self._facecolor[3]) if self._hatch: gc.set_hatch(self._hatch ) @@ -323,7 +404,11 @@ tpath = transform.transform_path_non_affine(path) affine = transform.get_affine() - renderer.draw_path(gc, tpath, affine, rgbFace) + if self.get_path_effects(): + for path_effect in self.get_path_effects(): + path_effect.draw_path(renderer, gc, tpath, affine, rgbFace) + else: + renderer.draw_path(gc, tpath, affine, rgbFace) gc.restore() renderer.close_group('patch') @@ -337,53 +422,20 @@ def get_window_extent(self, renderer=None): return self.get_path().get_extents(self.get_transform()) -artist.kwdocd['Patch'] = patchdoc = artist.kwdoc(Patch) +patchdoc = artist.kwdoc(Patch) for k in ('Rectangle', 'Circle', 'RegularPolygon', 'Polygon', 'Wedge', 'Arrow', 'FancyArrow', 'YAArrow', 'CirclePolygon', 'Ellipse', 'Arc', - 'FancyBboxPatch'): - artist.kwdocd[k] = patchdoc - -# define Patch.__init__ after the class so that the docstring can be -# auto-generated. -def __patch__init__(self, - edgecolor=None, - facecolor=None, - linewidth=None, - linestyle=None, - antialiased = None, - hatch = None, - fill=True, - **kwargs - ): - """ - The following kwarg properties are supported - - %(Patch)s - """ - artist.Artist.__init__(self) - - if linewidth is None: linewidth = mpl.rcParams['patch.linewidth'] - if linestyle is None: linestyle = "solid" - if antialiased is None: antialiased = mpl.rcParams['patch.antialiased'] - - self.set_edgecolor(edgecolor) - self.set_facecolor(facecolor) - self.set_linewidth(linewidth) - self.set_linestyle(linestyle) - self.set_antialiased(antialiased) - self.set_hatch(hatch) - self.fill = fill - self._combined_transform = transforms.IdentityTransform() + 'FancyBboxPatch', 'Patch'): + docstring.interpd.update({k:patchdoc}) - if len(kwargs): artist.setp(self, **kwargs) - -__patch__init__.__doc__ = cbook.dedent(__patch__init__.__doc__) % artist.kwdocd -Patch.__init__ = __patch__init__ +# define Patch.__init__ docstring after the class has been added to interpd +docstring.dedent_interpd(Patch.__init__.im_func) class Shadow(Patch): def __str__(self): return "Shadow(%s)"%(str(self.patch)) + @docstring.dedent_interpd def __init__(self, patch, ox, oy, props=None, **kwargs): """ Create a shadow of the given *patch* offset by *ox*, *oy*. @@ -400,7 +452,6 @@ self._ox, self._oy = ox, oy self._shadow_transform = transforms.Affine2D() self._update() - __init__.__doc__ = cbook.dedent(__init__.__doc__) % artist.kwdocd def _update(self): self.update_from(self.patch) @@ -452,6 +503,7 @@ return self.__class__.__name__ \ + "(%g,%g;%gx%g)" % (self._x, self._y, self._width, self._height) + @docstring.dedent_interpd def __init__(self, xy, width, height, **kwargs): """ @@ -469,7 +521,6 @@ self._height = height # Note: This cannot be calculated until this is added to an Axes self._rect_transform = transforms.IdentityTransform() - __init__.__doc__ = cbook.dedent(__init__.__doc__) % artist.kwdocd def get_path(self): """ @@ -590,6 +641,7 @@ def __str__(self): return "Poly%d(%g,%g)"%(self._numVertices,self._xy[0],self._xy[1]) + @docstring.dedent_interpd def __init__(self, xy, numVertices, radius=5, orientation=0, **kwargs): """ @@ -620,8 +672,6 @@ Patch.__init__(self, **kwargs) - __init__.__doc__ = cbook.dedent(__init__.__doc__) % artist.kwdocd - def _update_transform(self): self._poly_transform.clear() \ .scale(self.radius) \ @@ -669,6 +719,7 @@ def __str__(self): return "Poly((%g, %g) ...)" % tuple(self._path.vertices[0]) + @docstring.dedent_interpd def __init__(self, path, **kwargs): """ *path* is a :class:`matplotlib.path.Path` object. @@ -684,7 +735,6 @@ """ Patch.__init__(self, **kwargs) self._path = path - __init__.__doc__ = cbook.dedent(__init__.__doc__) % artist.kwdocd def get_path(self): return self._path @@ -696,6 +746,7 @@ def __str__(self): return "Poly((%g, %g) ...)" % tuple(self._path.vertices[0]) + @docstring.dedent_interpd def __init__(self, xy, closed=True, **kwargs): """ *xy* is a numpy array with shape Nx2. @@ -717,8 +768,6 @@ self._path = Path(xy) self.set_closed(closed) - __init__.__doc__ = cbook.dedent(__init__.__doc__) % artist.kwdocd - def get_path(self): return self._path @@ -757,6 +806,7 @@ def __str__(self): return "Wedge(%g,%g)"%(self.theta1,self.theta2) + @docstring.dedent_interpd def __init__(self, center, r, theta1, theta2, width=None, **kwargs): """ Draw a wedge centered at *x*, *y* center with radius *r* that @@ -802,7 +852,6 @@ v += np.asarray(center) self._path = Path(v,c) self._patch_transform = transforms.IdentityTransform() - __init__.__doc__ = cbook.dedent(__init__.__doc__) % artist.kwdocd def get_path(self): return self._path @@ -822,6 +871,7 @@ [ 1.0, 0.0 ], [ 0.8, 0.3], [ 0.8, 0.1 ], [ 0.0, 0.1] ] ) + @docstring.dedent_interpd def __init__( self, x, y, dx, dy, width=1.0, **kwargs ): """ Draws an arrow, starting at (*x*, *y*), direction and length @@ -840,7 +890,6 @@ trans3 = transforms.Affine2D().translate(x, y) trans = trans1 + trans2 + trans3 self._patch_transform = trans.frozen() - __init__.__doc__ = cbook.dedent(__init__.__doc__) % artist.kwdocd def get_path(self): return self._path @@ -856,6 +905,7 @@ def __str__(self): return "FancyArrow()" + @docstring.dedent_interpd def __init__(self, x, y, dx, dy, width=0.001, length_includes_head=False, \ head_width=None, head_length=None, shape='full', overhang=0, \ head_starts_at_zero=False,**kwargs): @@ -928,7 +978,6 @@ verts = np.dot(coords, M) + (x+dx, y+dy) Polygon.__init__(self, map(tuple, verts), **kwargs) - __init__.__doc__ = cbook.dedent(__init__.__doc__) % artist.kwdocd class YAArrow(Patch): """ @@ -940,6 +989,7 @@ def __str__(self): return "YAArrow()" + @docstring.dedent_interpd def __init__(self, figure, xytip, xybase, width=4, frac=0.1, headwidth=12, **kwargs): """ Constructor arguments: @@ -974,7 +1024,6 @@ self.frac = frac self.headwidth = headwidth Patch.__init__(self, **kwargs) - __init__.__doc__ = cbook.dedent(__init__.__doc__) % artist.kwdocd def get_path(self): # Since this is dpi dependent, we need to recompute the path @@ -1038,6 +1087,7 @@ def __str__(self): return "CirclePolygon(%d,%d)"%self.center + @docstring.dedent_interpd def __init__(self, xy, radius=5, resolution=20, # the number of vertices **kwargs): @@ -1056,7 +1106,6 @@ radius, orientation=0, **kwargs) - __init__.__doc__ = cbook.dedent(__init__.__doc__) % artist.kwdocd class Ellipse(Patch): @@ -1066,16 +1115,17 @@ def __str__(self): return "Ellipse(%s,%s;%sx%s)"%(self.center[0],self.center[1],self.width,self.height) + @docstring.dedent_interpd def __init__(self, xy, width, height, angle=0.0, **kwargs): """ *xy* center of ellipse *width* - length of horizontal axis + total length (diameter) of horizontal axis *height* - length of vertical axis + total length (diameter) of vertical axis *angle* rotation in degrees (anti-clockwise) @@ -1091,7 +1141,6 @@ self._path = Path.unit_circle() # Note: This cannot be calculated until this is added to an Axes self._patch_transform = transforms.IdentityTransform() - __init__.__doc__ = cbook.dedent(__init__.__doc__) % artist.kwdocd def _recompute_transform(self): """NOTE: This cannot be called until after this has been added @@ -1131,6 +1180,7 @@ def __str__(self): return "Circle((%g,%g),r=%g)"%(self.center[0],self.center[1],self.radius) + @docstring.dedent_interpd def __init__(self, xy, radius=5, **kwargs): """ Create true circle at center *xy* = (*x*, *y*) with given @@ -1149,7 +1199,6 @@ self.radius = radius Ellipse.__init__(self, xy, radius*2, radius*2, **kwargs) - __init__.__doc__ = cbook.dedent(__init__.__doc__) % artist.kwdocd def set_radius(self, radius): """ @@ -1179,6 +1228,7 @@ def __str__(self): return "Arc(%s,%s;%sx%s)"%(self.center[0],self.center[1],self.width,self.height) + @docstring.dedent_interpd def __init__(self, xy, width, height, angle=0.0, theta1=0.0, theta2=360.0, **kwargs): """ The following args are supported: @@ -1216,7 +1266,9 @@ self.theta1 = theta1 self.theta2 = theta2 - __init__.__doc__ = cbook.dedent(__init__.__doc__) % artist.kwdocd + + self._path = Path.arc(self.theta1, self.theta2) + @allow_rasterization def draw(self, renderer): @@ -1277,7 +1329,7 @@ inv_error = (1.0 / 1.89818e-6) * 0.5 if width < inv_error and height < inv_error: - self._path = Path.arc(self.theta1, self.theta2) + #self._path = Path.arc(self.theta1, self.theta2) return Patch.draw(self, renderer) def iter_circle_intersect_on_line(x0, y0, x1, y1): @@ -1359,15 +1411,22 @@ last_theta = theta1 theta1_rad = theta1 * DEG2RAD inside = box_path.contains_point((np.cos(theta1_rad), np.sin(theta1_rad))) + + # save original path + path_original = self._path for theta in thetas: if inside: - self._path = Path.arc(last_theta, theta, 8) + _path = Path.arc(last_theta, theta, 8) Patch.draw(self, renderer) inside = False else: inside = True last_theta = theta + # restore original path + self._path = path_original + + def bbox_artist(artist, renderer, props=None, fill=True): """ This is a debug function to draw a rectangle around the bounding @@ -1991,9 +2050,11 @@ _style_list["roundtooth"] = Roundtooth - __doc__ = cbook.dedent(__doc__) % \ - {"AvailableBoxstyles": _pprint_styles(_style_list)} + if __doc__: # __doc__ could be None if -OO optimization is enabled + __doc__ = cbook.dedent(__doc__) % \ + {"AvailableBoxstyles": _pprint_styles(_style_list)} +docstring.interpd.update(AvailableBoxstyles=_pprint_styles(BoxStyle._style_list)) class FancyBboxPatch(Patch): """ @@ -2011,6 +2072,7 @@ return self.__class__.__name__ \ + "FancyBboxPatch(%g,%g;%gx%g)" % (self._x, self._y, self._width, self._height) + @docstring.dedent_interpd def __init__(self, xy, width, height, boxstyle="round", bbox_transmuter=None, @@ -2058,13 +2120,7 @@ self._mutation_aspect=mutation_aspect - kwdoc = dict() - kwdoc["AvailableBoxstyles"]=_pprint_styles(BoxStyle._style_list) - kwdoc.update(artist.kwdocd) - __init__.__doc__ = cbook.dedent(__init__.__doc__) % kwdoc - del kwdoc - - + @docstring.dedent_interpd def set_boxstyle(self, boxstyle=None, **kw): """ Set the box style. @@ -2096,12 +2152,6 @@ self._bbox_transmuter = BoxStyle(boxstyle, **kw) - kwdoc = dict() - kwdoc["AvailableBoxstyles"]=_pprint_styles(BoxStyle._style_list) - kwdoc.update(artist.kwdocd) - set_boxstyle.__doc__ = cbook.dedent(set_boxstyle.__doc__) % kwdoc - del kwdoc - def set_mutation_scale(self, scale): """ Set the mutation scale. @@ -2686,9 +2736,9 @@ _style_list["bar"] = Bar - - __doc__ = cbook.dedent(__doc__) % \ - {"AvailableConnectorstyles": _pprint_styles(_style_list)} + if __doc__: + __doc__ = cbook.dedent(__doc__) % \ + {"AvailableConnectorstyles": _pprint_styles(_style_list)} @@ -2849,29 +2899,12 @@ super(ArrowStyle._Curve, self).__init__() - def _get_pad_projected(self, x0, y0, x1, y1, linewidth): - # when no arrow head is drawn - - dx, dy = x0 - x1, y0 - y1 - cp_distance = math.sqrt(dx**2 + dy**2) - - # padx_projected, pady_projected : amount of pad to account - # projection of the wedge - padx_projected = (.5*linewidth) - pady_projected = (.5*linewidth) - - # apply pad for projected edge - ddx = padx_projected * dx / cp_distance - ddy = pady_projected * dy / cp_distance - - return ddx, ddy - def _get_arrow_wedge(self, x0, y0, x1, y1, head_dist, cos_t, sin_t, linewidth ): """ Return the paths for arrow heads. Since arrow lines are - drawn with capstyle=projected, The arrow is goes beyond the + drawn with capstyle=projected, The arrow goes beyond the desired point. This method also returns the amount of the path to be shrinked so that it does not overshoot. """ @@ -2882,14 +2915,13 @@ dx, dy = x0 - x1, y0 - y1 cp_distance = math.sqrt(dx**2 + dy**2) - # padx_projected, pady_projected : amount of pad for account - # the overshooting of the projection of the wedge - padx_projected = (.5*linewidth / cos_t) - pady_projected = (.5*linewidth / sin_t) + # pad_projected : amount of pad to account the + # overshooting of the projection of the wedge + pad_projected = (.5*linewidth / sin_t) # apply pad for projected edge - ddx = padx_projected * dx / cp_distance - ddy = pady_projected * dy / cp_distance + ddx = pad_projected * dx / cp_distance + ddy = pad_projected * dy / cp_distance # offset for arrow wedge dx, dy = dx / cp_distance * head_dist, dy / cp_distance * head_dist @@ -2898,7 +2930,7 @@ dx2, dy2 = cos_t * dx - sin_t * dy, sin_t * dx + cos_t * dy vertices_arrow = [(x1+ddx+dx1, y1+ddy+dy1), - (x1+ddx, y1++ddy), + (x1+ddx, y1+ddy), (x1+ddx+dx2, y1+ddy+dy2)] codes_arrow = [Path.MOVETO, Path.LINETO, @@ -3199,6 +3231,63 @@ return p, False + class BracketAB(_Bracket): + """ + An arrow with a bracket(]) at both ends. + """ + + def __init__(self, + widthA=1., lengthA=0.2, angleA=None, + widthB=1., lengthB=0.2, angleB=None): + """ + *widthA* + width of the bracket + + *lengthA* + length of the bracket + + *angleA* + angle between the bracket and the line + + *widthB* + width of the bracket + + *lengthB* + length of the bracket + + *angleB* + angle between the bracket and the line + """ + + super(ArrowStyle.BracketAB, self).__init__(True, True, \ + widthA=widthA, lengthA=lengthA, angleA=angleA, + widthB=widthB, lengthB=lengthB, angleB=angleB) + + _style_list["]-["] = BracketAB + + + class BracketA(_Bracket): + """ + An arrow with a bracket(]) at its end. + """ + + def __init__(self, widthA=1., lengthA=0.2, angleA=None): + """ + *widthA* + width of the bracket + + *lengthA* + length of the bracket + + *angleA* + angle between the bracket and the line + """ + + super(ArrowStyle.BracketA, self).__init__(None, True, + widthA=widthA, lengthA=lengthA, angleA=angleA ) + + _style_list["]-"] = BracketA + class BracketB(_Bracket): """ @@ -3218,12 +3307,46 @@ """ super(ArrowStyle.BracketB, self).__init__(None, True, - widthB=widthB, lengthB=lengthB, angleB=None ) + widthB=widthB, lengthB=lengthB, angleB=angleB ) - #_style_list["-["] = BracketB _style_list["-["] = BracketB + class BarAB(_Bracket): + """ + An arrow with a bracket(]) at both ends. + """ + + def __init__(self, + widthA=1., angleA=None, + widthB=1., angleB=None): + """ + *widthA* + width of the bracket + + *lengthA* + length of the bracket + + *angleA* + angle between the bracket and the line + + *widthB* + width of the bracket + + *lengthB* + length of the bracket + + *angleB* + angle between the bracket and the line + """ + + super(ArrowStyle.BarAB, self).__init__(True, True, \ + widthA=widthA, lengthA=0, angleA=angleA, + widthB=widthB, lengthB=0, angleB=angleB) + + _style_list["|-|"] = BarAB + + class Simple(_Base): """ A simple arrow. Only works with a quadratic bezier curve. @@ -3442,11 +3565,16 @@ _style_list["wedge"] = Wedge - __doc__ = cbook.dedent(__doc__) % \ - {"AvailableArrowstyles": _pprint_styles(_style_list)} + if __doc__: + __doc__ = cbook.dedent(__doc__) % \ + {"AvailableArrowstyles": _pprint_styles(_style_list)} +docstring.interpd.update( + AvailableArrowstyles = _pprint_styles(ArrowStyle._style_list), + AvailableConnectorstyles = _pprint_styles(ConnectionStyle._style_list), +) class FancyArrowPatch(Patch): """ @@ -3455,9 +3583,18 @@ def __str__(self): - return self.__class__.__name__ \ - + "FancyArrowPatch(%g,%g,%g,%g,%g,%g)" % tuple(self._q_bezier) + + if self._posA_posB is not None: + (x1, y1), (x2, y2) = self._posA_posB + return self.__class__.__name__ \ + + "(%g,%g->%g,%g)" % (x1, y1, x2, y2) + else: + return self.__class__.__name__ \ + + "(%s)" % (str(self._path_original),) + + + @docstring.dedent_interpd def __init__(self, posA=None, posB=None, path=None, arrowstyle="simple", @@ -3470,6 +3607,7 @@ shrinkB=2., mutation_scale=1., mutation_aspect=None, + dpi_cor=1., **kwargs): """ If *posA* and *posB* is given, a path connecting two point are @@ -3537,16 +3675,26 @@ self._mutation_scale=mutation_scale self._mutation_aspect=mutation_aspect + self.set_dpi_cor(dpi_cor) #self._draw_in_display_coordinate = True - kwdoc = dict() - kwdoc["AvailableArrowstyles"]=_pprint_styles(ArrowStyle._style_list) - kwdoc["AvailableConnectorstyles"]=_pprint_styles(ConnectionStyle._style_list) - - kwdoc.update(artist.kwdocd) - __init__.__doc__ = cbook.dedent(__init__.__doc__) % kwdoc - del kwdoc + def set_dpi_cor(self, dpi_cor): + """ + dpi_cor is currently used for linewidth-related things and + shink factor. Mutation scale is not affected by this. + """ + + self._dpi_cor = dpi_cor + + def get_dpi_cor(self): + """ + dpi_cor is currently used for linewidth-related things and + shink factor. Mutation scale is not affected by this. + """ + + return self._dpi_cor + def set_positions(self, posA, posB): """ set the begin end end positions of the connecting path. Use current vlaue if None. @@ -3667,8 +3815,8 @@ def get_path(self): """ return the path of the arrow in the data coordinate. Use - get_path_in_displaycoord() medthod to retrieve the arrow path - in the disaply coord. + get_path_in_displaycoord() method to retrieve the arrow path + in the disaply coord. """ _path, fillable = self.get_path_in_displaycoord() @@ -3683,14 +3831,16 @@ Return the mutated path of the arrow in the display coord """ + dpi_cor = self.get_dpi_cor() + if self._posA_posB is not None: posA = self.get_transform().transform_point(self._posA_posB[0]) posB = self.get_transform().transform_point(self._posA_posB[1]) _path = self.get_connectionstyle()(posA, posB, patchA=self.patchA, patchB=self.patchB, - shrinkA=self.shrinkA, - shrinkB=self.shrinkB + shrinkA=self.shrinkA*dpi_cor, + shrinkB=self.shrinkB*dpi_cor ) else: _path = self.get_transform().transform_path(self._path_original) @@ -3699,12 +3849,12 @@ _path, fillable = self.get_arrowstyle()(_path, self.get_mutation_scale(), - self.get_linewidth(), + self.get_linewidth()*dpi_cor, self.get_mutation_aspect() ) #if not fillable: - # self.fill = False + # self._fill = False return _path, fillable @@ -3712,35 +3862,39 @@ def draw(self, renderer): if not self.get_visible(): return - #renderer.open_group('patch') + + renderer.open_group('patch', self.get_gid()) gc = renderer.new_gc() + gc.set_foreground(self._edgecolor, isRGB=True) - if cbook.is_string_like(self._edgecolor) and self._edgecolor.lower()=='none': - gc.set_linewidth(0) - else: - gc.set_foreground(self._edgecolor) - gc.set_linewidth(self._linewidth) - gc.set_linestyle(self._linestyle) + lw = self._linewidth + if self._edgecolor[3] == 0: + lw = 0 + gc.set_linewidth(lw) + gc.set_linestyle(self._linestyle) gc.set_antialiased(self._antialiased) self._set_gc_clip(gc) gc.set_capstyle('round') + gc.set_snap(self.get_snap()) - if (not self.fill or self._facecolor is None or - (cbook.is_string_like(self._facecolor) and self._facecolor.lower()=='none')): - rgbFace = None - gc.set_alpha(1.0) - else: - r, g, b, a = colors.colorConverter.to_rgba(self._facecolor, self._alpha) - rgbFace = (r, g, b) - gc.set_alpha(a) - + rgbFace = self._facecolor + if rgbFace[3] == 0: + rgbFace = None # (some?) renderers expect this as no-fill signal + + gc.set_alpha(self._edgecolor[3]) + if self._edgecolor[3] == 0: + gc.set_alpha(self._facecolor[3]) if self._hatch: gc.set_hatch(self._hatch ) - + # FIXME : dpi_cor is for the dpi-dependecy of the + # linewidth. There could be room for improvement. + # + #dpi_cor = renderer.points_to_pixels(1.) + self.set_dpi_cor(renderer.points_to_pixels(1.)) path, fillable = self.get_path_in_displaycoord() if not cbook.iterable(fillable): @@ -3750,13 +3904,20 @@ affine = transforms.IdentityTransform() - renderer.open_group('patch', self.get_gid()) - for p, f in zip(path, fillable): - if f: - renderer.draw_path(gc, p, affine, rgbFace) - else: - renderer.draw_path(gc, p, affine, None) + if self.get_path_effects(): + for path_effect in self.get_path_effects(): + for p, f in zip(path, fillable): + if f: + path_effect.draw_path(renderer, gc, p, affine, rgbFace) + else: + path_effect.draw_path(renderer, gc, p, affine, None) + else: + for p, f in zip(path, fillable): + if f: + renderer.draw_path(gc, p, affine, rgbFace) + else: + renderer.draw_path(gc, p, affine, None) gc.restore() @@ -3772,6 +3933,7 @@ return "ConnectionPatch((%g,%g),(%g,%g))" % \ (self.xy1[0],self.xy1[1],self.xy2[0],self.xy2[1]) + @docstring.dedent_interpd def __init__(self, xyA, xyB, coordsA, coordsB=None, axesA=None, axesB=None, arrowstyle="-", @@ -3785,6 +3947,7 @@ mutation_scale=10., mutation_aspect=None, clip_on=False, + dpi_cor=1., **kwargs): """ Connect point *xyA* in *coordsA* with point *xyB* in *coordsB* @@ -3858,13 +4021,12 @@ mutation_scale=mutation_scale, mutation_aspect=mutation_aspect, clip_on=clip_on, + dpi_cor=dpi_cor, **kwargs) # if True, draw annotation only if self.xy is inside the axes self._annotation_clip = None - __init__.__doc__ = cbook.dedent(__init__.__doc__) % artist.kwdocd - def _get_xy(self, x, y, s, axes=None): """ @@ -3991,6 +4153,8 @@ Return the mutated path of the arrow in the display coord """ + dpi_cor = self.get_dpi_cor() + x, y = self.xy1 posA = self._get_xy(x, y, self.coords1, self.axesA) @@ -4000,15 +4164,15 @@ _path = self.get_connectionstyle()(posA, posB, patchA=self.patchA, patchB=self.patchB, - shrinkA=self.shrinkA, - shrinkB=self.shrinkB + shrinkA=self.shrinkA*dpi_cor, + shrinkB=self.shrinkB*dpi_cor ) _path, fillable = self.get_arrowstyle()(_path, self.get_mutation_scale(), - self.get_linewidth(), + self.get_linewidth()*dpi_cor, self.get_mutation_aspect() ) diff -Nru matplotlib-0.99.3/lib/matplotlib/patheffects.py matplotlib-1.0.1/lib/matplotlib/patheffects.py --- matplotlib-0.99.3/lib/matplotlib/patheffects.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/patheffects.py 2010-08-25 16:53:11.000000000 +0000 @@ -0,0 +1,216 @@ +""" +Defines classes for path effects. The path effects are supported in +:class:`~matplotlib.text.Text` and :class:`~matplotlib.patches.Patch` +matplotlib.text.Text. +""" + +from matplotlib.backend_bases import RendererBase +from matplotlib.backends.backend_mixed import MixedModeRenderer +import matplotlib.transforms as transforms + + + +class _Base(object): + """ + A base class for PathEffect. Derived must override draw_path method. + """ + + def __init__(self): + """ + initializtion. + """ + super(_Base, self).__init__() + + + def _update_gc(self, gc, new_gc_dict): + new_gc_dict = new_gc_dict.copy() + + dashes = new_gc_dict.pop("dashes", None) + if dashes: + gc.set_dashes(**dashes) + + for k, v in new_gc_dict.iteritems(): + set_method = getattr(gc, 'set_'+k, None) + if set_method is None or not callable(set_method): + raise AttributeError('Unknown property %s'%k) + set_method(v) + + return gc + + + def draw_path(self, renderer, gc, tpath, affine, rgbFace): + """ + Derived should override this method. The argument is same + as *draw_path* method of :class:`matplotlib.backend_bases.RendererBase` + except the first argument is a renderer. The base definition is :: + + def draw_path(self, renderer, gc, tpath, affine, rgbFace): + renderer.draw_path(gc, tpath, affine, rgbFace) + + """ + renderer.draw_path(gc, tpath, affine, rgbFace) + + def draw_tex(self, renderer, gc, x, y, s, prop, angle, ismath='TeX!'): + self._draw_text_as_path(renderer, gc, x, y, s, prop, angle, ismath="TeX") + + def draw_text(self, renderer, gc, x, y, s, prop, angle, ismath=False): + self._draw_text_as_path(renderer, gc, x, y, s, prop, angle, ismath) + + def _draw_text_as_path(self, renderer, gc, x, y, s, prop, angle, ismath): + + if isinstance(renderer, MixedModeRenderer): + renderer = renderer._renderer + + path, transform = RendererBase._get_text_path_transform(renderer, + x, y, s, + prop, angle, + ismath) + color = gc.get_rgb()[:3] + + gc.set_linewidth(0.0) + self.draw_path(renderer, gc, path, transform, rgbFace=color) + + +# def draw_path_collection(self, renderer, +# gc, master_transform, paths, all_transforms, +# offsets, offsetTrans, facecolors, edgecolors, +# linewidths, linestyles, antialiaseds, urls): +# path_ids = [] +# for path, transform in renderer._iter_collection_raw_paths( +# master_transform, paths, all_transforms): +# path_ids.append((path, transform)) + +# for xo, yo, path_id, gc0, rgbFace in renderer._iter_collection( +# gc, path_ids, offsets, offsetTrans, facecolors, edgecolors, +# linewidths, linestyles, antialiaseds, urls): +# path, transform = path_id +# transform = transforms.Affine2D(transform.get_matrix()).translate(xo, yo) +# self.draw_path(renderer, gc0, path, transform, rgbFace) + + +class Normal(_Base): + """ + path effect with no effect + """ + pass + +class Stroke(_Base): + """ + stroke the path with updated gc. + """ + + def __init__(self, **kwargs): + """ + The path will be stroked with its gc updated with the given + keyword arguments, i.e., the keyword arguments should be valid + gc parameter values. + """ + super(Stroke, self).__init__() + self._gc = kwargs + + def draw_path(self, renderer, gc, tpath, affine, rgbFace): + """ + draw the path with update gc. + """ + # Do not modify the input! Use copy instead. + + gc0 = renderer.new_gc() + gc0.copy_properties(gc) + + gc0 = self._update_gc(gc0, self._gc) + renderer.draw_path(gc0, tpath, affine, None) + gc0.restore() + + +class withStroke(Stroke): + + """ + Same as Stroke, but add a stroke with the original gc at the end. + """ + + def draw_path(self, renderer, gc, tpath, affine, rgbFace): + + Stroke.draw_path(self, renderer, gc, tpath, affine, rgbFace) + renderer.draw_path(gc, tpath, affine, rgbFace) + + +import matplotlib.transforms as mtransforms + +class SimplePatchShadow(_Base): + """ + simple shadow + """ + + def __init__(self, offset_xy=(2,-2), + shadow_rgbFace=None, patch_alpha=0.7, + **kwargs): + """ + """ + super(_Base, self).__init__() + self._offset_xy = offset_xy + self._shadow_rgbFace = shadow_rgbFace + self._patch_alpha = patch_alpha + + self._gc = kwargs + self._offset_tran = mtransforms.Affine2D() + + def draw_path(self, renderer, gc, tpath, affine, rgbFace): + """ + """ + # Do not modify the input! Use copy instead. + + offset_x = renderer.points_to_pixels(self._offset_xy[0]) + offset_y = renderer.points_to_pixels(self._offset_xy[1]) + + affine0 = affine + self._offset_tran.clear().translate(offset_x, offset_y) + + gc0 = renderer.new_gc() + gc0.copy_properties(gc) + + if self._shadow_rgbFace is None: + r,g,b = rgbFace[:3] + rho = 0.3 + r = rho*r + g = rho*g + b = rho*b + + shadow_rgbFace = (r,g,b) + else: + shadow_rgbFace = self._shadow_rgbFace + + gc0.set_foreground("none") + gc0.set_alpha(1.-self._patch_alpha) + gc0.set_linewidth(0) + + gc0 = self._update_gc(gc0, self._gc) + renderer.draw_path(gc0, tpath, affine0, shadow_rgbFace) + gc0.restore() + + +class withSimplePatchShadow(SimplePatchShadow): + """ + simple shadow + """ + + def draw_path(self, renderer, gc, tpath, affine, rgbFace): + + SimplePatchShadow.draw_path(self, renderer, gc, tpath, affine, rgbFace) + + gc1 = renderer.new_gc() + gc1.copy_properties(gc) + gc1.set_alpha(gc1.get_alpha()*self._patch_alpha) + renderer.draw_path(gc1, tpath, affine, rgbFace) + gc1.restore() + + +if __name__ == '__main__': + clf() + imshow([[1,2],[2,3]]) + #eff = PathEffects.Thicken() + txt = annotate("test", (1., 1.), (0., 0), + arrowprops=dict(arrowstyle="->", connectionstyle="angle3", lw=2), + size=12, ha="center") + txt.set_path_effects([withStroke(linewidth=3, foreground="w")]) + #txt.arrow_patch.set_path_effects([PathEffects.withStroke(width=3, color="w")]) + txt.arrow_patch.set_path_effects([Stroke(linewidth=5, foreground="w"), + Normal()]) diff -Nru matplotlib-0.99.3/lib/matplotlib/path.py matplotlib-1.0.1/lib/matplotlib/path.py --- matplotlib-0.99.3/lib/matplotlib/path.py 2009-08-22 21:06:12.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/path.py 2010-08-25 16:53:11.000000000 +0000 @@ -115,6 +115,8 @@ codes = np.asarray(codes, self.code_type) assert codes.ndim == 1 assert len(codes) == len(vertices) + if len(codes): + assert codes[0] == self.MOVETO assert vertices.ndim == 2 assert vertices.shape[1] == 2 @@ -186,7 +188,8 @@ return len(self.vertices) def iter_segments(self, transform=None, remove_nans=True, clip=None, - quantize=False, simplify=None, curves=True): + snap=False, stroke_width=1.0, simplify=None, + curves=True): """ Iterates over all of the curve segments in the path. Each iteration returns a 2-tuple (*vertices*, *code*), where @@ -205,8 +208,12 @@ *clip*: if not None, must be a four-tuple (x1, y1, x2, y2) defining a rectangle in which to clip the path. - *quantize*: if None, auto-quantize. If True, force quantize, - and if False, don't quantize. + *snap*: if None, auto-snap to pixels, to reduce + fuzziness of rectilinear lines. If True, force snapping, and + if False, don't snap. + + *stroke_width*: the width of the stroke being drawn. Needed + as a hint for the snapping algorithm. *simplify*: if True, perform simplification, to remove vertices that do not affect the appearance of the path. If @@ -230,7 +237,7 @@ STOP = self.STOP vertices, codes = cleanup_path(self, transform, remove_nans, clip, - quantize, simplify, curves) + snap, stroke_width, simplify, curves) len_vertices = len(vertices) i = 0 @@ -290,9 +297,13 @@ control points appropriately. """ from transforms import Bbox + path = self if transform is not None: transform = transform.frozen() - return Bbox(get_path_extents(self, transform)) + if not transform.is_affine: + path = self.transformed(transform) + transform = None + return Bbox(get_path_extents(path, transform)) def intersects_path(self, other, filled=True): """ @@ -373,7 +384,8 @@ """ if cls._unit_rectangle is None: cls._unit_rectangle = \ - cls([[0.0, 0.0], [1.0, 0.0], [1.0, 1.0], [0.0, 1.0], [0.0, 0.0]]) + cls([[0.0, 0.0], [1.0, 0.0], [1.0, 1.0], [0.0, 1.0], [0.0, 0.0]], + [cls.MOVETO, cls.LINETO, cls.LINETO, cls.LINETO, cls.CLOSEPOLY]) return cls._unit_rectangle _unit_regular_polygons = WeakValueDictionary() @@ -396,8 +408,13 @@ # "points-up" theta += np.pi / 2.0 verts = np.concatenate((np.cos(theta), np.sin(theta)), 1) - path = cls(verts) - cls._unit_regular_polygons[numVertices] = path + codes = np.empty((numVertices + 1,)) + codes[0] = cls.MOVETO + codes[1:-1] = cls.LINETO + codes[-1] = cls.CLOSEPOLY + path = cls(verts, codes) + if numVertices <= 16: + cls._unit_regular_polygons[numVertices] = path return path _unit_regular_stars = WeakValueDictionary() @@ -422,8 +439,13 @@ r = np.ones(ns2 + 1) r[1::2] = innerCircle verts = np.vstack((r*np.cos(theta), r*np.sin(theta))).transpose() - path = cls(verts) - cls._unit_regular_polygons[(numVertices, innerCircle)] = path + codes = np.empty((ns2 + 1,)) + codes[0] = cls.MOVETO + codes[1:-1] = cls.LINETO + codes[-1] = cls.CLOSEPOLY + path = cls(verts, codes) + if numVertices <= 16: + cls._unit_regular_polygons[(numVertices, innerCircle)] = path return path @classmethod @@ -498,6 +520,54 @@ cls._unit_circle = cls(vertices, codes) return cls._unit_circle + _unit_circle_righthalf = None + + @classmethod + def unit_circle_righthalf(cls): + """ + (staticmethod) Returns a :class:`Path` of the right half + of a unit circle. The circle is approximated using cubic Bezier + curves. This uses 4 splines around the circle using the approach + presented here: + + Lancaster, Don. `Approximating a Circle or an Ellipse Using Four + Bezier Cubic Splines `_. + """ + if cls._unit_circle_righthalf is None: + MAGIC = 0.2652031 + SQRTHALF = np.sqrt(0.5) + MAGIC45 = np.sqrt((MAGIC*MAGIC) / 2.0) + + vertices = np.array( + [[0.0, -1.0], + + [MAGIC, -1.0], + [SQRTHALF-MAGIC45, -SQRTHALF-MAGIC45], + [SQRTHALF, -SQRTHALF], + + [SQRTHALF+MAGIC45, -SQRTHALF+MAGIC45], + [1.0, -MAGIC], + [1.0, 0.0], + + [1.0, MAGIC], + [SQRTHALF+MAGIC45, SQRTHALF-MAGIC45], + [SQRTHALF, SQRTHALF], + + [SQRTHALF-MAGIC45, SQRTHALF+MAGIC45], + [MAGIC, 1.0], + [0.0, 1.0], + + [0.0, -1.0]], + + np.float_) + + codes = cls.CURVE4 * np.ones(14) + codes[0] = cls.MOVETO + codes[-1] = cls.CLOSEPOLY + + cls._unit_circle_righthalf = cls(vertices, codes) + return cls._unit_circle_righthalf + @classmethod def arc(cls, theta1, theta2, n=None, is_wedge=False): """ diff -Nru matplotlib-0.99.3/lib/matplotlib/projections/geo.py matplotlib-1.0.1/lib/matplotlib/projections/geo.py --- matplotlib-0.99.3/lib/matplotlib/projections/geo.py 2009-07-31 15:14:39.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/projections/geo.py 2010-12-13 15:27:29.000000000 +0000 @@ -5,7 +5,6 @@ import matplotlib rcParams = matplotlib.rcParams -from matplotlib.artist import kwdocd from matplotlib.axes import Axes from matplotlib import cbook from matplotlib.patches import Circle @@ -56,6 +55,9 @@ self.yaxis.set_minor_locator(NullLocator()) self.xaxis.set_ticks_position('none') self.yaxis.set_ticks_position('none') + self.yaxis.set_tick_params(label1On=True) + # Why do we need to turn on yaxis tick labels, but + # xaxis tick labels are already on? self.grid(rcParams['axes.grid']) @@ -344,7 +346,7 @@ cos_latitude = np.cos(latitude) sqrt2 = np.sqrt(2.0) - alpha = 1.0 + cos_latitude * np.cos(half_long) + alpha = np.sqrt(1.0 + cos_latitude * np.cos(half_long)) x = (2.0 * sqrt2) * (cos_latitude * np.sin(half_long)) / alpha y = (sqrt2 * np.sin(latitude)) / alpha return np.concatenate((x, y), 1) diff -Nru matplotlib-0.99.3/lib/matplotlib/projections/polar.py matplotlib-1.0.1/lib/matplotlib/projections/polar.py --- matplotlib-0.99.3/lib/matplotlib/projections/polar.py 2010-03-09 14:20:20.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/projections/polar.py 2010-12-13 15:27:29.000000000 +0000 @@ -1,19 +1,20 @@ import math import warnings -import numpy as npy +import numpy as np import matplotlib rcParams = matplotlib.rcParams -from matplotlib.artist import kwdocd from matplotlib.axes import Axes import matplotlib.axis as maxis from matplotlib import cbook +from matplotlib import docstring from matplotlib.patches import Circle from matplotlib.path import Path from matplotlib.ticker import Formatter, Locator, FormatStrFormatter from matplotlib.transforms import Affine2D, Affine2DBase, Bbox, \ - BboxTransformTo, IdentityTransform, Transform, TransformWrapper + BboxTransformTo, IdentityTransform, Transform, TransformWrapper, \ + ScaledTranslation, blended_transform_factory, BboxTransformToMaxOnly import matplotlib.spines as mspines class PolarAxes(Axes): @@ -35,14 +36,31 @@ output_dims = 2 is_separable = False + def __init__(self, axis=None): + Transform.__init__(self) + self._axis = axis + def transform(self, tr): - xy = npy.zeros(tr.shape, npy.float_) - t = tr[:, 0:1] - r = tr[:, 1:2] - x = xy[:, 0:1] - y = xy[:, 1:2] - x[:] = r * npy.cos(t) - y[:] = r * npy.sin(t) + xy = np.empty(tr.shape, np.float_) + if self._axis is not None: + rmin = self._axis.viewLim.ymin + else: + rmin = 0 + + t = tr[:, 0:1] + r = tr[:, 1:2] + x = xy[:, 0:1] + y = xy[:, 1:2] + + if rmin != 0: + r = r - rmin + mask = r < 0 + x[:] = np.where(mask, np.nan, r * np.cos(t)) + y[:] = np.where(mask, np.nan, r * np.sin(t)) + else: + x[:] = r * np.cos(t) + y[:] = r * np.sin(t) + return xy transform.__doc__ = Transform.transform.__doc__ @@ -61,7 +79,7 @@ transform_path_non_affine.__doc__ = Transform.transform_path_non_affine.__doc__ def inverted(self): - return PolarAxes.InvertedPolarTransform() + return PolarAxes.InvertedPolarTransform(self._axis) inverted.__doc__ = Transform.inverted.__doc__ class PolarAffine(Affine2DBase): @@ -70,10 +88,10 @@ that maximum radius rests on the edge of the axes circle. """ def __init__(self, scale_transform, limits): - u""" + """ *limits* is the view limit of the data. The only part of its bounds that is used is ymax (for the radius maximum). - The theta range is always fixed to (0, 2\u03c0). + The theta range is always fixed to (0, 2pi). """ Affine2DBase.__init__(self) self._scale_transform = scale_transform @@ -84,9 +102,9 @@ def get_matrix(self): if self._invalid: limits_scaled = self._limits.transformed(self._scale_transform) - ymax = limits_scaled.ymax + yscale = limits_scaled.ymax - limits_scaled.ymin affine = Affine2D() \ - .scale(0.5 / ymax) \ + .scale(0.5 / yscale) \ .translate(0.5, 0.5) self._mtx = affine.get_matrix() self._inverted = None @@ -103,13 +121,19 @@ output_dims = 2 is_separable = False + def __init__(self, axis=None): + Transform.__init__(self) + self._axis = axis + def transform(self, xy): x = xy[:, 0:1] y = xy[:, 1:] - r = npy.sqrt(x*x + y*y) - theta = npy.arccos(x / r) - theta = npy.where(y < 0, 2 * npy.pi - theta, theta) - return npy.concatenate((theta, r), 1) + r = np.sqrt(x*x + y*y) + if self._axis is not None: + r += self._axis.viewLim.ymin + theta = np.arccos(x / r) + theta = np.where(y < 0, 2 * np.pi - theta, theta) + return np.concatenate((theta, r), 1) transform.__doc__ = Transform.transform.__doc__ def inverted(self): @@ -117,22 +141,21 @@ inverted.__doc__ = Transform.inverted.__doc__ class ThetaFormatter(Formatter): - u""" - Used to format the *theta* tick labels. Converts the - native unit of radians into degrees and adds a degree symbol - (\u00b0). + """ + Used to format the *theta* tick labels. Converts the native + unit of radians into degrees and adds a degree symbol. """ def __call__(self, x, pos=None): # \u00b0 : degree symbol if rcParams['text.usetex'] and not rcParams['text.latex.unicode']: - return r"$%0.0f^\circ$" % ((x / npy.pi) * 180.0) + return r"$%0.0f^\circ$" % ((x / np.pi) * 180.0) else: # we use unicode, rather than mathtext with \circ, so # that it will work correctly with any arbitrary font # (assuming it has a degree sign), whereas $5\circ$ # will only work correctly with one of the supported # math fonts (Computer Modern and STIX) - return u"%0.0f\u00b0" % ((x / npy.pi) * 180.0) + return u"%0.0f\u00b0" % ((x / np.pi) * 180.0) class RadialLocator(Locator): """ @@ -196,13 +219,16 @@ self.title.set_y(1.05) self.xaxis.set_major_formatter(self.ThetaFormatter()) - angles = npy.arange(0.0, 360.0, 45.0) + angles = np.arange(0.0, 360.0, 45.0) self.set_thetagrids(angles) self.yaxis.set_major_locator(self.RadialLocator(self.yaxis.get_major_locator())) self.grid(rcParams['polaraxes.grid']) self.xaxis.set_ticks_position('none') self.yaxis.set_ticks_position('none') + self.yaxis.set_tick_params(label1On=True) + # Why do we need to turn on yaxis tick labels, but + # xaxis tick labels are already on? def _init_axis(self): "move this out of __init__ because non-separable axes don't use it" @@ -221,8 +247,12 @@ # It is assumed that this part will have non-linear components self.transScale = TransformWrapper(IdentityTransform()) - # A (possibly non-linear) projection on the (already scaled) data - self.transProjection = self.PolarTransform() + # A (possibly non-linear) projection on the (already scaled) + # data. This one is aware of rmin + self.transProjection = self.PolarTransform(self) + + # This one is not aware of rmin + self.transPureProjection = self.PolarTransform() # An affine transformation on the data, generally to limit the # range of the axes @@ -237,7 +267,7 @@ # equivalent to transData, except it always puts r == 1.0 at # the edge of the axis circle. self._xaxis_transform = ( - self.transProjection + + self.transPureProjection + self.PolarAffine(IdentityTransform(), Bbox.unit()) + self.transAxes) # The theta labels are moved from radius == 0.0 to radius == 1.1 @@ -254,16 +284,22 @@ # axis so the gridlines from 0.0 to 1.0, now go from 0.0 to # 2pi. self._yaxis_transform = ( - Affine2D().scale(npy.pi * 2.0, 1.0) + + Affine2D().scale(np.pi * 2.0, 1.0) + self.transData) # The r-axis labels are put at an angle and padded in the r-direction - self._r_label1_position = Affine2D().translate(22.5, self._rpad) + self._r_label1_position = ScaledTranslation( + 22.5, self._rpad, + blended_transform_factory( + Affine2D(), BboxTransformToMaxOnly(self.viewLim))) self._yaxis_text1_transform = ( self._r_label1_position + Affine2D().scale(1.0 / 360.0, 1.0) + self._yaxis_transform ) - self._r_label2_position = Affine2D().translate(22.5, self._rpad) + self._r_label2_position = ScaledTranslation( + 22.5, -self._rpad, + blended_transform_factory( + Affine2D(), BboxTransformToMaxOnly(self.viewLim))) self._yaxis_text2_transform = ( self._r_label2_position + Affine2D().scale(1.0 / 360.0, 1.0) + @@ -298,17 +334,24 @@ (0.5, 0.5), 0.5)} def set_rmax(self, rmax): - self.viewLim.y0 = 0 self.viewLim.y1 = rmax - angle = self._r_label1_position.to_values()[4] - self._r_label1_position.clear().translate( - angle, rmax * self._rpad) - self._r_label2_position.clear().translate( - angle, -rmax * self._rpad) def get_rmax(self): return self.viewLim.ymax + def set_rmin(self, rmin): + self.viewLim.y0 = rmin + + def get_rmin(self): + return self.viewLim.ymin + + def set_rlim(self, *args, **kwargs): + if 'rmin' in kwargs: + kwargs['ymin'] = kwargs.pop('rmin') + if 'rmax' in kwargs: + kwargs['ymax'] = kwargs.pop('rmax') + return self.set_ylim(*args, **kwargs) + def set_yscale(self, *args, **kwargs): Axes.set_yscale(self, *args, **kwargs) self.yaxis.set_major_locator( @@ -317,6 +360,7 @@ set_rscale = Axes.set_yscale set_rticks = Axes.set_yticks + @docstring.dedent_interpd def set_thetagrids(self, angles, labels=None, frac=None, fmt=None, **kwargs): """ @@ -343,8 +387,8 @@ ACCEPTS: sequence of floats """ - angles = npy.asarray(angles, npy.float_) - self.set_xticks(angles * (npy.pi / 180.0)) + angles = np.asarray(angles, np.float_) + self.set_xticks(angles * (np.pi / 180.0)) if labels is not None: self.set_xticklabels(labels) elif fmt is not None: @@ -355,8 +399,8 @@ for t in self.xaxis.get_ticklabels(): t.update(kwargs) return self.xaxis.get_ticklines(), self.xaxis.get_ticklabels() - set_thetagrids.__doc__ = cbook.dedent(set_thetagrids.__doc__) % kwdocd + @docstring.dedent_interpd def set_rgrids(self, radii, labels=None, angle=None, rpad=None, fmt=None, **kwargs): """ @@ -383,7 +427,7 @@ ACCEPTS: sequence of floats """ - radii = npy.asarray(radii) + radii = np.asarray(radii) rmin = radii.min() if rmin <= 0: raise ValueError('radial grids must be strictly positive') @@ -397,22 +441,21 @@ angle = self._r_label1_position.to_values()[4] if rpad is not None: self._rpad = rpad - rmax = self.get_rmax() - self._r_label1_position.clear().translate(angle, self._rpad * rmax) - self._r_label2_position.clear().translate(angle, -self._rpad * rmax) + self._r_label1_position._t = (angle, self._rpad) + self._r_label1_position.invalidate() + self._r_label2_position._t = (angle, -self._rpad) + self._r_label2_position.invalidate() for t in self.yaxis.get_ticklabels(): t.update(kwargs) return self.yaxis.get_gridlines(), self.yaxis.get_ticklabels() - set_rgrids.__doc__ = cbook.dedent(set_rgrids.__doc__) % kwdocd - def set_xscale(self, scale, *args, **kwargs): if scale != 'linear': raise NotImplementedError("You can not set the xscale on a polar plot.") def set_xlim(self, *args, **kargs): # The xlim is fixed, no matter what you do - self.viewLim.intervalx = (0.0, npy.pi * 2.0) + self.viewLim.intervalx = (0.0, np.pi * 2.0) def format_coord(self, theta, r): """ @@ -441,10 +484,10 @@ return False def start_pan(self, x, y, button): - angle = self._r_label1_position.to_values()[4] / 180.0 * npy.pi + angle = self._r_label1_position.to_values()[4] / 180.0 * np.pi mode = '' if button == 1: - epsilon = npy.pi / 45.0 + epsilon = np.pi / 45.0 t, r = self.transData.inverted().transform_point((x, y)) if t >= angle - epsilon and t <= angle + epsilon: mode = 'drag_r_labels' @@ -478,13 +521,13 @@ dt = abs(dt1) * sign(dt0) * -1.0 else: dt = dt0 * -1.0 - dt = (dt / npy.pi) * 180.0 + dt = (dt / np.pi) * 180.0 - rpad = self._r_label1_position.to_values()[5] - self._r_label1_position.clear().translate( - p.r_label_angle - dt, rpad) - self._r_label2_position.clear().translate( - p.r_label_angle - dt, -rpad) + rpad = self._rpad + self._r_label1_position._t = (p.r_label_angle - dt, rpad) + self._r_label1_position.invalidate() + self._r_label2_position._t = (p.r_label_angle - dt, -rpad) + self._r_label2_position.invalidate() elif p.mode == 'zoom': startt, startr = p.trans_inverse.transform_point((p.x, p.y)) @@ -500,26 +543,26 @@ # cubic bezier curves. # def transform_path(self, path): -# twopi = 2.0 * npy.pi -# halfpi = 0.5 * npy.pi +# twopi = 2.0 * np.pi +# halfpi = 0.5 * np.pi # vertices = path.vertices # t0 = vertices[0:-1, 0] # t1 = vertices[1: , 0] -# td = npy.where(t1 > t0, t1 - t0, twopi - (t0 - t1)) +# td = np.where(t1 > t0, t1 - t0, twopi - (t0 - t1)) # maxtd = td.max() -# interpolate = npy.ceil(maxtd / halfpi) +# interpolate = np.ceil(maxtd / halfpi) # if interpolate > 1.0: # vertices = self.interpolate(vertices, interpolate) # vertices = self.transform(vertices) -# result = npy.zeros((len(vertices) * 3 - 2, 2), npy.float_) -# codes = mpath.Path.CURVE4 * npy.ones((len(vertices) * 3 - 2, ), mpath.Path.code_type) +# result = np.zeros((len(vertices) * 3 - 2, 2), np.float_) +# codes = mpath.Path.CURVE4 * np.ones((len(vertices) * 3 - 2, ), mpath.Path.code_type) # result[0] = vertices[0] # codes[0] = mpath.Path.MOVETO -# kappa = 4.0 * ((npy.sqrt(2.0) - 1.0) / 3.0) +# kappa = 4.0 * ((np.sqrt(2.0) - 1.0) / 3.0) # kappa = 0.5 # p0 = vertices[0:-1] @@ -557,36 +600,36 @@ # return mpath.Path(result, codes) -# twopi = 2.0 * npy.pi -# halfpi = 0.5 * npy.pi +# twopi = 2.0 * np.pi +# halfpi = 0.5 * np.pi # vertices = path.vertices # t0 = vertices[0:-1, 0] # t1 = vertices[1: , 0] -# td = npy.where(t1 > t0, t1 - t0, twopi - (t0 - t1)) +# td = np.where(t1 > t0, t1 - t0, twopi - (t0 - t1)) # maxtd = td.max() -# interpolate = npy.ceil(maxtd / halfpi) +# interpolate = np.ceil(maxtd / halfpi) # print "interpolate", interpolate # if interpolate > 1.0: # vertices = self.interpolate(vertices, interpolate) -# result = npy.zeros((len(vertices) * 3 - 2, 2), npy.float_) -# codes = mpath.Path.CURVE4 * npy.ones((len(vertices) * 3 - 2, ), mpath.Path.code_type) +# result = np.zeros((len(vertices) * 3 - 2, 2), np.float_) +# codes = mpath.Path.CURVE4 * np.ones((len(vertices) * 3 - 2, ), mpath.Path.code_type) # result[0] = vertices[0] # codes[0] = mpath.Path.MOVETO -# kappa = 4.0 * ((npy.sqrt(2.0) - 1.0) / 3.0) -# tkappa = npy.arctan(kappa) -# hyp_kappa = npy.sqrt(kappa*kappa + 1.0) +# kappa = 4.0 * ((np.sqrt(2.0) - 1.0) / 3.0) +# tkappa = np.arctan(kappa) +# hyp_kappa = np.sqrt(kappa*kappa + 1.0) # t0 = vertices[0:-1, 0] # t1 = vertices[1: , 0] # r0 = vertices[0:-1, 1] # r1 = vertices[1: , 1] -# td = npy.where(t1 > t0, t1 - t0, twopi - (t0 - t1)) -# td_scaled = td / (npy.pi * 0.5) +# td = np.where(t1 > t0, t1 - t0, twopi - (t0 - t1)) +# td_scaled = td / (np.pi * 0.5) # rd = r1 - r0 # r0kappa = r0 * kappa * td_scaled # r1kappa = r1 * kappa * td_scaled @@ -594,11 +637,11 @@ # result[1::3, 0] = t0 + (tkappa * td_scaled) # result[1::3, 1] = r0*hyp_kappa -# # result[1::3, 1] = r0 / npy.cos(tkappa * td_scaled) # npy.sqrt(r0*r0 + ravg_kappa*ravg_kappa) +# # result[1::3, 1] = r0 / np.cos(tkappa * td_scaled) # np.sqrt(r0*r0 + ravg_kappa*ravg_kappa) # result[2::3, 0] = t1 - (tkappa * td_scaled) # result[2::3, 1] = r1*hyp_kappa -# # result[2::3, 1] = r1 / npy.cos(tkappa * td_scaled) # npy.sqrt(r1*r1 + ravg_kappa*ravg_kappa) +# # result[2::3, 1] = r1 / np.cos(tkappa * td_scaled) # np.sqrt(r1*r1 + ravg_kappa*ravg_kappa) # result[3::3, 0] = t1 # result[3::3, 1] = r1 diff -Nru matplotlib-0.99.3/lib/matplotlib/_pylab_helpers.py matplotlib-1.0.1/lib/matplotlib/_pylab_helpers.py --- matplotlib-0.99.3/lib/matplotlib/_pylab_helpers.py 2009-07-31 15:14:40.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/_pylab_helpers.py 2010-07-07 01:41:52.000000000 +0000 @@ -4,8 +4,12 @@ import sys, gc +import atexit +import traceback + + def error_msg(msg): - print >>sys.stderr, msgs + print >>sys.stderr, msg class Gcf(object): """ @@ -34,10 +38,10 @@ If figure manager *num* exists, make it the active figure and return the manager; otherwise return *None*. """ - figManager = Gcf.figs.get(num, None) - if figManager is not None: - Gcf.set_active(figManager) - return figManager + manager = Gcf.figs.get(num, None) + if manager is not None: + Gcf.set_active(manager) + return manager @staticmethod def destroy(num): @@ -48,22 +52,36 @@ window "destroy" and "delete" events. """ if not Gcf.has_fignum(num): return - figManager = Gcf.figs[num] + manager = Gcf.figs[num] + manager.canvas.mpl_disconnect(manager._cidgcf) # There must be a good reason for the following careful # rebuilding of the activeQue; what is it? oldQue = Gcf._activeQue[:] Gcf._activeQue = [] for f in oldQue: - if f != figManager: + if f != manager: Gcf._activeQue.append(f) del Gcf.figs[num] #print len(Gcf.figs.keys()), len(Gcf._activeQue) - figManager.destroy() + manager.destroy() gc.collect() @staticmethod + def destroy_fig(fig): + "*fig* is a Figure instance" + for manager in Gcf.figs.values(): + if manager.canvas.figure == fig: + Gcf.destroy(manager.num) + + @staticmethod + def destroy_all(): + for manager in Gcf.figs.values(): + Gcf.destroy(manager.num) + + + @staticmethod def has_fignum(num): """ Return *True* if figure *num* exists. @@ -105,3 +123,7 @@ Gcf._activeQue.append(manager) Gcf.figs[manager.num] = manager +atexit.register(Gcf.destroy_all) + + + diff -Nru matplotlib-0.99.3/lib/matplotlib/pylab.py matplotlib-1.0.1/lib/matplotlib/pylab.py --- matplotlib-0.99.3/lib/matplotlib/pylab.py 2009-08-22 21:06:12.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/pylab.py 2010-08-03 14:22:42.000000000 +0000 @@ -3,7 +3,9 @@ plotting library. The following plotting commands are provided; the majority have -Matlab(TM) analogs and similar argument. +MATLAB |reg| [*]_ analogs and similar arguments. + +.. |reg| unicode:: 0xAE _Plotting commands acorr - plot the autocorrelation function @@ -15,6 +17,7 @@ axhspan - draw a horizontal bar across axes axvspan - draw a vertical bar across axes axis - Set or return the current axis limits + autoscale - turn axis autoscaling on or off, and apply it bar - make a bar chart barh - a horizontal bar chart broken_barh - a set of horizontal bars with gaps @@ -54,8 +57,10 @@ imshow - plot image data ishold - return the hold state of the current axes legend - make an axes legend + locator_params - adjust parameters used in locating axis ticks loglog - a log log plot matshow - display a matrix in a new figure preserving aspect + margins - set margins used in autoscaling pcolor - make a pseudocolor plot pcolormesh - make a pseudocolor plot using a quadrilateral mesh pie - make a pie chart @@ -84,7 +89,13 @@ table - add a table to the plot text - add some text at location x,y to the current axes thetagrids - customize the radial theta grids and labels for polar + tick_params - control the appearance of ticks and tick labels + ticklabel_format - control the format of tick labels title - add a title to the current axes + tricontour - make a contour plot on a triangular grid + tricontourf - make a filled contour plot on a triangular grid + tripcolor - make a pseudocolor plot on a triangular grid + triplot - plot a triangular grid xcorr - plot the autocorrelation function of x and y xlim - set/get the xlimits ylim - set/get the ylimits @@ -197,6 +208,9 @@ __end +.. [*] MATLAB is a registered trademark of The MathWorks, Inc. + + """ import sys, warnings @@ -228,10 +242,12 @@ from matplotlib.mlab import window_hanning, window_none, detrend, demean, \ detrend_mean, detrend_none, detrend_linear, entropy, normpdf, levypdf, \ - find, longest_contiguous_ones, longest_ones, prepca, prctile, prctile_rank, \ - center_matrix, rk4, bivariate_normal, get_xyz_where, get_sparse_matrix, dist, \ + find, longest_contiguous_ones, longest_ones, prepca, \ + prctile, prctile_rank, \ + center_matrix, rk4, bivariate_normal, get_xyz_where, \ + get_sparse_matrix, dist, \ dist_point_to_segment, segments_intersect, fftsurr, liaupunov, movavg, \ - save, load, exp_safe, \ + exp_safe, \ amap, rms_flat, l1norm, l2norm, norm_flat, frange, identity, \ base_repr, binary_repr, log2, ispower2, \ rec_append_fields, rec_drop_fields, rec_join, csv2rec, rec2csv, isvector @@ -251,8 +267,8 @@ import numpy as np import numpy.ma as ma -def load(*args, **kwargs): - raise NotImplementedError(load.__doc__) +def load(*args, **kwargs): + raise NotImplementedError(load.__doc__) load.__doc__ = """\ pylab no longer provides a load function, though the old pylab function is still available as matplotlib.mlab.load (you can refer @@ -264,8 +280,8 @@ """ -def save(*args, **kwargs): - raise NotImplementedError(save.__doc__) +def save(*args, **kwargs): + raise NotImplementedError(save.__doc__) save.__doc__ = """\ pylab no longer provides a save function, though the old pylab function is still available as matplotlib.mlab.save (you can still @@ -273,3 +289,6 @@ files, we recommend numpy.savetxt. For saving numpy arrays, we recommend numpy.save, and its analog numpy.load, which are available in pylab as np.save and np.load.""" + +# don't let numpy's datetime hide stdlib +import datetime diff -Nru matplotlib-0.99.3/lib/matplotlib/pyplot.py matplotlib-1.0.1/lib/matplotlib/pyplot.py --- matplotlib-0.99.3/lib/matplotlib/pyplot.py 2010-03-09 14:20:20.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/pyplot.py 2010-08-03 14:22:42.000000000 +0000 @@ -1,8 +1,25 @@ +""" +Provides a MATLAB-like plotting framework. + +:mod:`~matplotlib.pylab` combines pyplot with numpy into a single namespace. +This is convenient for interactive work, but for programming it +is recommended that the namespaces be kept separate, e.g.:: + + import numpy as np + import matplotlib.pyplot as plt + + x = np.arange(0, 5, 0.1); + y = np.sin(x) + plt.plot(x, y) + +""" + import sys import matplotlib from matplotlib import _pylab_helpers, interactive from matplotlib.cbook import dedent, silent_list, is_string_like, is_numlike +from matplotlib import docstring from matplotlib.figure import Figure, figaspect from matplotlib.backend_bases import FigureCanvasBase from matplotlib.image import imread as _imread @@ -11,7 +28,7 @@ from matplotlib.rcsetup import interactive_bk as _interactive_bk from matplotlib.artist import getp, get, Artist from matplotlib.artist import setp as _setp -from matplotlib.axes import Axes +from matplotlib.axes import Axes, Subplot, _string_to_bool from matplotlib.projections import PolarAxes from matplotlib import mlab # for csv2rec, detrend_none, window_hanning from matplotlib.scale import get_scale_docs, get_scale_names @@ -77,13 +94,11 @@ from matplotlib.backends import pylab_setup new_figure_manager, draw_if_interactive, show = pylab_setup() - - +@docstring.copy_dedent(Artist.findobj) def findobj(o=None, match=None): if o is None: o = gcf() return o.findobj(match) -findobj.__doc__ = Artist.findobj.__doc__ def switch_backend(newbackend): """ @@ -119,19 +134,19 @@ 'Turn interactive mode on.' matplotlib.interactive(True) +@docstring.copy_dedent(matplotlib.rc) def rc(*args, **kwargs): matplotlib.rc(*args, **kwargs) -if matplotlib.rc.__doc__ is not None: - rc.__doc__ = dedent(matplotlib.rc.__doc__) +@docstring.copy_dedent(matplotlib.rcdefaults) def rcdefaults(): matplotlib.rcdefaults() draw_if_interactive() -if matplotlib.rcdefaults.__doc__ is not None: - rcdefaults.__doc__ = dedent(matplotlib.rcdefaults.__doc__) -# The current "image" (ScalarMappable) is tracked here on a -# per-pylab-session basis: +# The current "image" (ScalarMappable) is retrieved or set +# only via the pyplot interface using the following two +# functions: + def gci(): """ Get the current :class:`~matplotlib.cm.ScalarMappable` instance @@ -143,30 +158,31 @@ :func:`~matplotlib.pyplot.pcolor` and :func:`~matplotlib.pyplot.scatter` create :class:`~matplotlib.collections.Collection` instances. + The current image is an attribute of the current axes, or the + nearest earlier axes in the current figure that contains an + image. """ - return gci._current -gci._current = None - + return gcf()._gci() def sci(im): """ Set the current image (target of colormap commands like :func:`~matplotlib.pyplot.jet`, :func:`~matplotlib.pyplot.hot` or - :func:`~matplotlib.pyplot.clim`). + :func:`~matplotlib.pyplot.clim`). The current image is an + attribute of the current axes. """ - gci._current = im + gca()._sci(im) ## Any Artist ## # (getp is simply imported) +@docstring.copy(_setp) def setp(*args, **kwargs): ret = _setp(*args, **kwargs) draw_if_interactive() return ret -if _setp.__doc__ is not None: - setp.__doc__ = _setp.__doc__ @@ -197,7 +213,7 @@ If *num* is an integer, and ``figure(num)`` already exists, make it active and return a reference to it. If ``figure(num)`` does not exist - it will be created. Numbering starts at 1, matlab style:: + it will be created. Numbering starts at 1, MATLAB style:: figure(1) @@ -290,17 +306,13 @@ figManager = _pylab_helpers.Gcf.get_active() return figManager -# note we check for __doc__ is not None since py2exe optimize removes -# the docstrings +@docstring.copy_dedent(FigureCanvasBase.mpl_connect) def connect(s, func): return get_current_fig_manager().canvas.mpl_connect(s, func) -if FigureCanvasBase.mpl_connect.__doc__ is not None: - connect.__doc__ = dedent(FigureCanvasBase.mpl_connect.__doc__) +@docstring.copy_dedent(FigureCanvasBase.mpl_disconnect) def disconnect(cid): return get_current_fig_manager().canvas.mpl_disconnect(cid) -if FigureCanvasBase.mpl_disconnect.__doc__ is not None: - disconnect.__doc__ = dedent(FigureCanvasBase.mpl_disconnect.__doc__) def close(*args): """ @@ -319,21 +331,15 @@ figManager = _pylab_helpers.Gcf.get_active() if figManager is None: return else: - figManager.canvas.mpl_disconnect(figManager._cidgcf) _pylab_helpers.Gcf.destroy(figManager.num) elif len(args)==1: arg = args[0] if arg=='all': - for manager in _pylab_helpers.Gcf.get_all_fig_managers(): - manager.canvas.mpl_disconnect(manager._cidgcf) - _pylab_helpers.Gcf.destroy(manager.num) + _pylab_helpers.Gcf.destroy_all() elif isinstance(arg, int): _pylab_helpers.Gcf.destroy(arg) elif isinstance(arg, Figure): - for manager in _pylab_helpers.Gcf.get_all_fig_managers(): - if manager.canvas.figure==arg: - manager.canvas.mpl_disconnect(manager._cidgcf) - _pylab_helpers.Gcf.destroy(manager.num) + _pylab_helpers.Gcf.destroy_fig(arg) else: raise TypeError('Unrecognized argument type %s to close'%type(arg)) else: @@ -351,12 +357,12 @@ 'redraw the current figure' get_current_fig_manager().canvas.draw() +@docstring.copy_dedent(Figure.savefig) def savefig(*args, **kwargs): fig = gcf() return fig.savefig(*args, **kwargs) -if Figure.savefig.__doc__ is not None: - savefig.__doc__ = dedent(Figure.savefig.__doc__) +@docstring.copy_dedent(Figure.ginput) def ginput(*args, **kwargs): """ Blocking call to interact with the figure. @@ -367,9 +373,8 @@ If *timeout* is negative, does not timeout. """ return gcf().ginput(*args, **kwargs) -if Figure.ginput.__doc__ is not None: - ginput.__doc__ = dedent(Figure.ginput.__doc__) +@docstring.copy_dedent(Figure.waitforbuttonpress) def waitforbuttonpress(*args, **kwargs): """ Blocking call to interact with the figure. @@ -381,36 +386,31 @@ If *timeout* is negative, does not timeout. """ return gcf().waitforbuttonpress(*args, **kwargs) -if Figure.waitforbuttonpress.__doc__ is not None: - waitforbuttonpress.__doc__ = dedent(Figure.waitforbuttonpress.__doc__) # Putting things in figures +@docstring.copy_dedent(Figure.text) def figtext(*args, **kwargs): ret = gcf().text(*args, **kwargs) draw_if_interactive() return ret -if Figure.text.__doc__ is not None: - figtext.__doc__ = dedent(Figure.text.__doc__) +@docstring.copy_dedent(Figure.suptitle) def suptitle(*args, **kwargs): ret = gcf().suptitle(*args, **kwargs) draw_if_interactive() return ret -if Figure.suptitle.__doc__ is not None: - suptitle.__doc__ = dedent(Figure.suptitle.__doc__) +@docstring.Appender("Addition kwargs: hold = [True|False] overrides default hold state", "\n") +@docstring.copy_dedent(Figure.figimage) def figimage(*args, **kwargs): # allow callers to override the hold state by passing hold=True|False ret = gcf().figimage(*args, **kwargs) draw_if_interactive() - gci._current = ret + #sci(ret) # JDH figimage should not set current image -- it is not mappable, etc return ret -if Figure.figimage.__doc__ is not None: - figimage.__doc__ = dedent(Figure.figimage.__doc__) + """ -Addition kwargs: hold = [True|False] overrides default hold state""" def figlegend(handles, labels, loc, **kwargs): """ @@ -558,7 +558,18 @@ draw_if_interactive() return ret - +def sca(ax): + """ + Set the current Axes instance to *ax*. The current Figure + is updated to the parent of *ax*. + """ + managers = _pylab_helpers.Gcf.get_all_fig_managers() + for m in managers: + if ax in m.canvas.figure.axes: + _pylab_helpers.Gcf.set_active(m) + m.canvas.figure.sca(ax) + return + raise ValueError("Axes instance argument was not found in a figure.") def gca(**kwargs): @@ -657,6 +668,148 @@ return a +def subplots(nrows=1, ncols=1, sharex=False, sharey=False, squeeze=True, + subplot_kw=None, **fig_kw): + """Create a figure with a set of subplots already made. + + This utility wrapper makes it convenient to create common layouts of + subplots, including the enclosing figure object, in a single call. + + Keyword arguments: + + nrows : int + Number of rows of the subplot grid. Defaults to 1. + + ncols : int + Number of columns of the subplot grid. Defaults to 1. + + sharex : bool + If True, the X axis will be shared amongst all subplots. + + sharex : bool + If True, the Y axis will be shared amongst all subplots. + + squeeze : bool + + If True, extra dimensions are squeezed out from the returned axis object: + - if only one subplot is constructed (nrows=ncols=1), the resulting + single Axis object is returned as a scalar. + - for Nx1 or 1xN subplots, the returned object is a 1-d numpy object + array of Axis objects are returned as numpy 1-d arrays. + - for NxM subplots with N>1 and M>1 are returned as a 2d array. + + If False, no squeezing at all is done: the returned axis object is always + a 2-d array contaning Axis instances, even if it ends up being 1x1. + + subplot_kw : dict + Dict with keywords passed to the add_subplot() call used to create each + subplots. + + fig_kw : dict + Dict with keywords passed to the figure() call. Note that all keywords + not recognized above will be automatically included here. + + Returns: + + fig, ax : tuple + - fig is the Matplotlib Figure object + - ax can be either a single axis object or an array of axis objects if + more than one supblot was created. The dimensions of the resulting array + can be controlled with the squeeze keyword, see above. + + **Examples:** + + x = np.linspace(0, 2*np.pi, 400) + y = np.sin(x**2) + + # Just a figure and one subplot + f, ax = plt.subplots() + ax.plot(x, y) + ax.set_title('Simple plot') + + # Two subplots, unpack the output array immediately + f, (ax1, ax2) = plt.subplots(1, 2, sharey=True) + ax1.plot(x, y) + ax1.set_title('Sharing Y axis') + ax2.scatter(x, y) + + # Four polar axes + plt.subplots(2, 2, subplot_kw=dict(polar=True)) + """ + + if subplot_kw is None: + subplot_kw = {} + + fig = figure(**fig_kw) + + # Create empty object array to hold all axes. It's easiest to make it 1-d + # so we can just append subplots upon creation, and then + nplots = nrows*ncols + axarr = np.empty(nplots, dtype=object) + + # Create first subplot separately, so we can share it if requested + ax0 = fig.add_subplot(nrows, ncols, 1, **subplot_kw) + if sharex: + subplot_kw['sharex'] = ax0 + if sharey: + subplot_kw['sharey'] = ax0 + axarr[0] = ax0 + + # Note off-by-one counting because add_subplot uses the MATLAB 1-based + # convention. + for i in range(1, nplots): + axarr[i] = fig.add_subplot(nrows, ncols, i+1, **subplot_kw) + + if squeeze: + # Reshape the array to have the final desired dimension (nrow,ncol), + # though discarding unneeded dimensions that equal 1. If we only have + # one subplot, just return it instead of a 1-element array. + if nplots==1: + return fig, axarr[0] + else: + return fig, axarr.reshape(nrows, ncols).squeeze() + else: + # returned axis array will be always 2-d, even if nrows=ncols=1 + return fig, axarr.reshape(nrows, ncols) + + +from gridspec import GridSpec +def subplot2grid(shape, loc, rowspan=1, colspan=1, **kwargs): + """ + + It creates a subplot in a grid of *shape*, at location of *loc*, + spanning *rowspan*, *colspan* cells in each direction. + The index for loc is 0-based. :: + + subplot2grid(shape, loc, rowspan=1, colspan=1) + + is identical to :: + + gridspec=GridSpec(shape[0], shape[2]) + subplotspec=gridspec.new_subplotspec(loc, rowspan, colspan) + subplot(subplotspec) + + + """ + + fig = gcf() + s1, s2 = shape + subplotspec = GridSpec(s1, s2).new_subplotspec(loc, + rowspan=rowspan, + colspan=colspan) + a = fig.add_subplot(subplotspec, **kwargs) + bbox = a.bbox + byebye = [] + for other in fig.axes: + if other==a: continue + if bbox.fully_overlaps(other.bbox): + byebye.append(other) + for ax in byebye: delaxes(ax) + + draw_if_interactive() + return a + + def twinx(ax=None): """ Make a second axes overlay *ax* (or the current axes if *ax* is @@ -742,10 +895,12 @@ def box(on=None): """ Turn the axes box on or off according to *on*. + *on* may be a boolean or a string, 'on' or 'off'. If *on* is *None*, toggle state. """ ax = gca() + on = _string_to_bool(on) if on is None: on = not ax.get_frame_on() ax.set_frame_on(on) @@ -758,7 +913,7 @@ Default font override is:: override = {'fontsize': 'medium', - 'verticalalignment': 'bottom', + 'verticalalignment': 'baseline', 'horizontalalignment': 'center'} .. seealso:: @@ -807,7 +962,7 @@ changes *x* and *y* axis limits such that all data is shown. If all data is already shown, it will move it to the center of the figure without modifying (*xmax* - *xmin*) or (*ymax* - - *ymin*). Note this is slightly different than in matlab. + *ymin*). Note this is slightly different than in MATLAB. >>> axis('image') @@ -930,6 +1085,7 @@ return ret +@docstring.dedent_interpd def xscale(*args, **kwargs): """ call signature:: @@ -946,10 +1102,8 @@ ret = ax.set_xscale(*args, **kwargs) draw_if_interactive() return ret -xscale.__doc__ = dedent(xscale.__doc__) % { - 'scale': ' | '.join([repr(_x) for _x in get_scale_names()]), - 'scale_docs': get_scale_docs()} +@docstring.dedent_interpd def yscale(*args, **kwargs): """ call signature:: @@ -966,9 +1120,6 @@ ret = ax.set_yscale(*args, **kwargs) draw_if_interactive() return ret -yscale.__doc__ = dedent(yscale.__doc__) % { - 'scale': ' | '.join([repr(_x) for _x in get_scale_names()]), - 'scale_docs': get_scale_docs()} def xticks(*args, **kwargs): """ @@ -1415,15 +1566,13 @@ draw_if_interactive() +@docstring.copy_dedent(_imread) def imread(*args, **kwargs): return _imread(*args, **kwargs) -if _imread.__doc__ is not None: - imread.__doc__ = dedent(_imread.__doc__) +@docstring.copy_dedent(_imsave) def imsave(*args, **kwargs): return _imsave(*args, **kwargs) -if _imsave.__doc__ is not None: - imsave.__doc__ = dedent(_imsave.__doc__) def matshow(A, fignum=None, **kw): """ @@ -1458,7 +1607,7 @@ ax = fig.add_axes([0.15, 0.09, 0.775, 0.775]) im = ax.matshow(A, **kw) - gci._current = im + sci(im) draw_if_interactive() return im @@ -1607,16 +1756,39 @@ draw_if_interactive() -# This is added to docstrings of autogenerated plotting functions -__docstring_addendum = """ +def autogen_docstring(base): + """Autogenerated wrappers will get their docstring from a base function + with an addendum.""" + msg = "\n\nAdditional kwargs: hold = [True|False] overrides default hold state" + addendum = docstring.Appender(msg, '\n\n') + return lambda func: addendum(docstring.copy_dedent(base)(func)) -Additional kwargs: hold = [True|False] overrides default hold state""" -## Plotting part 2: autogenerated wrappers for axes methods ## +# This function cannot be generated by boilerplate.py because it may +# return an image or a line. +@autogen_docstring(Axes.spy) +def spy(Z, precision=0, marker=None, markersize=None, aspect='equal', hold=None, **kwargs): + ax = gca() + # allow callers to override the hold state by passing hold=True|False + washold = ax.ishold() + + if hold is not None: + ax.hold(hold) + try: + ret = ax.spy(Z, precision, marker, markersize, aspect, **kwargs) + draw_if_interactive() + finally: + ax.hold(washold) + if isinstance(ret, cm.ScalarMappable): + sci(ret) + return ret +## Plotting part 2: autogenerated wrappers for axes methods ## + # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.acorr) def acorr(x, hold=None, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -1631,11 +1803,10 @@ ax.hold(washold) return ret -if Axes.acorr.__doc__ is not None: - acorr.__doc__ = dedent(Axes.acorr.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.arrow) def arrow(x, y, dx, dy, hold=None, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -1650,11 +1821,10 @@ ax.hold(washold) return ret -if Axes.arrow.__doc__ is not None: - arrow.__doc__ = dedent(Axes.arrow.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.axhline) def axhline(y=0, xmin=0, xmax=1, hold=None, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -1669,11 +1839,10 @@ ax.hold(washold) return ret -if Axes.axhline.__doc__ is not None: - axhline.__doc__ = dedent(Axes.axhline.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.axhspan) def axhspan(ymin, ymax, xmin=0, xmax=1, hold=None, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -1688,11 +1857,10 @@ ax.hold(washold) return ret -if Axes.axhspan.__doc__ is not None: - axhspan.__doc__ = dedent(Axes.axhspan.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.axvline) def axvline(x=0, ymin=0, ymax=1, hold=None, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -1707,11 +1875,10 @@ ax.hold(washold) return ret -if Axes.axvline.__doc__ is not None: - axvline.__doc__ = dedent(Axes.axvline.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.axvspan) def axvspan(xmin, xmax, ymin=0, ymax=1, hold=None, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -1726,12 +1893,11 @@ ax.hold(washold) return ret -if Axes.axvspan.__doc__ is not None: - axvspan.__doc__ = dedent(Axes.axvspan.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost -def bar(left, height, width=0.80000000000000004, bottom=None, color=None, edgecolor=None, linewidth=None, yerr=None, xerr=None, ecolor=None, capsize=3, align='edge', orientation='vertical', log=False, hold=None, **kwargs): +@autogen_docstring(Axes.bar) +def bar(left, height, width=0.80000000000000004, bottom=None, hold=None, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False washold = ax.ishold() @@ -1739,17 +1905,16 @@ if hold is not None: ax.hold(hold) try: - ret = ax.bar(left, height, width, bottom, color, edgecolor, linewidth, yerr, xerr, ecolor, capsize, align, orientation, log, **kwargs) + ret = ax.bar(left, height, width, bottom, **kwargs) draw_if_interactive() finally: ax.hold(washold) return ret -if Axes.bar.__doc__ is not None: - bar.__doc__ = dedent(Axes.bar.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.barh) def barh(bottom, width, height=0.80000000000000004, left=None, hold=None, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -1764,11 +1929,10 @@ ax.hold(washold) return ret -if Axes.barh.__doc__ is not None: - barh.__doc__ = dedent(Axes.barh.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.broken_barh) def broken_barh(xranges, yrange, hold=None, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -1783,12 +1947,11 @@ ax.hold(washold) return ret -if Axes.broken_barh.__doc__ is not None: - broken_barh.__doc__ = dedent(Axes.broken_barh.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost -def boxplot(x, notch=0, sym='b+', vert=1, whis=1.5, positions=None, widths=None, hold=None): +@autogen_docstring(Axes.boxplot) +def boxplot(x, notch=0, sym='b+', vert=1, whis=1.5, positions=None, widths=None, patch_artist=False, bootstrap=None, hold=None): ax = gca() # allow callers to override the hold state by passing hold=True|False washold = ax.ishold() @@ -1796,17 +1959,16 @@ if hold is not None: ax.hold(hold) try: - ret = ax.boxplot(x, notch, sym, vert, whis, positions, widths) + ret = ax.boxplot(x, notch, sym, vert, whis, positions, widths, patch_artist, bootstrap) draw_if_interactive() finally: ax.hold(washold) return ret -if Axes.boxplot.__doc__ is not None: - boxplot.__doc__ = dedent(Axes.boxplot.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.cohere) def cohere(x, y, NFFT=256, Fs=2, Fc=0, detrend=mlab.detrend_none, window=mlab.window_hanning, noverlap=0, pad_to=None, sides='default', scale_by_freq=None, hold=None, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -1821,11 +1983,10 @@ ax.hold(washold) return ret -if Axes.cohere.__doc__ is not None: - cohere.__doc__ = dedent(Axes.cohere.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.clabel) def clabel(CS, *args, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -1840,11 +2001,10 @@ ax.hold(washold) return ret -if Axes.clabel.__doc__ is not None: - clabel.__doc__ = dedent(Axes.clabel.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.contour) def contour(*args, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -1857,13 +2017,12 @@ draw_if_interactive() finally: ax.hold(washold) - if ret._A is not None: gci._current = ret + if ret._A is not None: sci(ret) return ret -if Axes.contour.__doc__ is not None: - contour.__doc__ = dedent(Axes.contour.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.contourf) def contourf(*args, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -1876,13 +2035,12 @@ draw_if_interactive() finally: ax.hold(washold) - if ret._A is not None: gci._current = ret + if ret._A is not None: sci(ret) return ret -if Axes.contourf.__doc__ is not None: - contourf.__doc__ = dedent(Axes.contourf.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.csd) def csd(x, y, NFFT=256, Fs=2, Fc=0, detrend=mlab.detrend_none, window=mlab.window_hanning, noverlap=0, pad_to=None, sides='default', scale_by_freq=None, hold=None, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -1897,11 +2055,10 @@ ax.hold(washold) return ret -if Axes.csd.__doc__ is not None: - csd.__doc__ = dedent(Axes.csd.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.errorbar) def errorbar(x, y, yerr=None, xerr=None, fmt='-', ecolor=None, elinewidth=None, capsize=3, barsabove=False, lolims=False, uplims=False, xlolims=False, xuplims=False, hold=None, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -1916,11 +2073,10 @@ ax.hold(washold) return ret -if Axes.errorbar.__doc__ is not None: - errorbar.__doc__ = dedent(Axes.errorbar.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.fill) def fill(*args, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -1935,12 +2091,11 @@ ax.hold(washold) return ret -if Axes.fill.__doc__ is not None: - fill.__doc__ = dedent(Axes.fill.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost -def fill_between(x, y1, y2=0, where=None, hold=None, **kwargs): +@autogen_docstring(Axes.fill_between) +def fill_between(x, y1, y2=0, where=None, interpolate=False, hold=None, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False washold = ax.ishold() @@ -1948,17 +2103,16 @@ if hold is not None: ax.hold(hold) try: - ret = ax.fill_between(x, y1, y2, where, **kwargs) + ret = ax.fill_between(x, y1, y2, where, interpolate, **kwargs) draw_if_interactive() finally: ax.hold(washold) return ret -if Axes.fill_between.__doc__ is not None: - fill_between.__doc__ = dedent(Axes.fill_between.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.fill_betweenx) def fill_betweenx(y, x1, x2=0, where=None, hold=None, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -1973,12 +2127,11 @@ ax.hold(washold) return ret -if Axes.fill_betweenx.__doc__ is not None: - fill_betweenx.__doc__ = dedent(Axes.fill_betweenx.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost -def hexbin(x, y, C=None, gridsize=100, bins=None, xscale='linear', yscale='linear', extent=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=1.0, linewidths=None, edgecolors='none', reduce_C_function=np.mean, mincnt=None, marginals=False, hold=None, **kwargs): +@autogen_docstring(Axes.hexbin) +def hexbin(x, y, C=None, gridsize=100, bins=None, xscale='linear', yscale='linear', extent=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, edgecolors='none', reduce_C_function=np.mean, mincnt=None, marginals=False, hold=None, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False washold = ax.ishold() @@ -1990,14 +2143,13 @@ draw_if_interactive() finally: ax.hold(washold) - gci._current = ret + sci(ret) return ret -if Axes.hexbin.__doc__ is not None: - hexbin.__doc__ = dedent(Axes.hexbin.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost -def hist(x, bins=10, range=None, normed=False, weights=None, cumulative=False, bottom=None, histtype='bar', align='mid', orientation='vertical', rwidth=None, log=False, hold=None, **kwargs): +@autogen_docstring(Axes.hist) +def hist(x, bins=10, range=None, normed=False, weights=None, cumulative=False, bottom=None, histtype='bar', align='mid', orientation='vertical', rwidth=None, log=False, color=None, label=None, hold=None, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False washold = ax.ishold() @@ -2005,17 +2157,16 @@ if hold is not None: ax.hold(hold) try: - ret = ax.hist(x, bins, range, normed, weights, cumulative, bottom, histtype, align, orientation, rwidth, log, **kwargs) + ret = ax.hist(x, bins, range, normed, weights, cumulative, bottom, histtype, align, orientation, rwidth, log, color, label, **kwargs) draw_if_interactive() finally: ax.hold(washold) return ret -if Axes.hist.__doc__ is not None: - hist.__doc__ = dedent(Axes.hist.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.hlines) def hlines(y, xmin, xmax, colors='k', linestyles='solid', label='', hold=None, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -2030,12 +2181,11 @@ ax.hold(washold) return ret -if Axes.hlines.__doc__ is not None: - hlines.__doc__ = dedent(Axes.hlines.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost -def imshow(X, cmap=None, norm=None, aspect=None, interpolation=None, alpha=1.0, vmin=None, vmax=None, origin=None, extent=None, shape=None, filternorm=1, filterrad=4.0, imlim=None, resample=None, url=None, hold=None, **kwargs): +@autogen_docstring(Axes.imshow) +def imshow(X, cmap=None, norm=None, aspect=None, interpolation=None, alpha=None, vmin=None, vmax=None, origin=None, extent=None, shape=None, filternorm=1, filterrad=4.0, imlim=None, resample=None, url=None, hold=None, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False washold = ax.ishold() @@ -2047,13 +2197,12 @@ draw_if_interactive() finally: ax.hold(washold) - gci._current = ret + sci(ret) return ret -if Axes.imshow.__doc__ is not None: - imshow.__doc__ = dedent(Axes.imshow.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.loglog) def loglog(*args, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -2068,11 +2217,10 @@ ax.hold(washold) return ret -if Axes.loglog.__doc__ is not None: - loglog.__doc__ = dedent(Axes.loglog.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.pcolor) def pcolor(*args, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -2085,13 +2233,12 @@ draw_if_interactive() finally: ax.hold(washold) - gci._current = ret + sci(ret) return ret -if Axes.pcolor.__doc__ is not None: - pcolor.__doc__ = dedent(Axes.pcolor.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.pcolormesh) def pcolormesh(*args, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -2104,13 +2251,12 @@ draw_if_interactive() finally: ax.hold(washold) - gci._current = ret + sci(ret) return ret -if Axes.pcolormesh.__doc__ is not None: - pcolormesh.__doc__ = dedent(Axes.pcolormesh.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.pie) def pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.59999999999999998, shadow=False, labeldistance=1.1000000000000001, hold=None): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -2125,11 +2271,10 @@ ax.hold(washold) return ret -if Axes.pie.__doc__ is not None: - pie.__doc__ = dedent(Axes.pie.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.plot) def plot(*args, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -2144,11 +2289,10 @@ ax.hold(washold) return ret -if Axes.plot.__doc__ is not None: - plot.__doc__ = dedent(Axes.plot.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.plot_date) def plot_date(x, y, fmt='bo', tz=None, xdate=True, ydate=False, hold=None, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -2163,11 +2307,10 @@ ax.hold(washold) return ret -if Axes.plot_date.__doc__ is not None: - plot_date.__doc__ = dedent(Axes.plot_date.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.psd) def psd(x, NFFT=256, Fs=2, Fc=0, detrend=mlab.detrend_none, window=mlab.window_hanning, noverlap=0, pad_to=None, sides='default', scale_by_freq=None, hold=None, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -2182,11 +2325,10 @@ ax.hold(washold) return ret -if Axes.psd.__doc__ is not None: - psd.__doc__ = dedent(Axes.psd.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.quiver) def quiver(*args, **kw): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -2199,13 +2341,12 @@ draw_if_interactive() finally: ax.hold(washold) - gci._current = ret + sci(ret) return ret -if Axes.quiver.__doc__ is not None: - quiver.__doc__ = dedent(Axes.quiver.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.quiverkey) def quiverkey(*args, **kw): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -2220,12 +2361,11 @@ ax.hold(washold) return ret -if Axes.quiverkey.__doc__ is not None: - quiverkey.__doc__ = dedent(Axes.quiverkey.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost -def scatter(x, y, s=20, c='b', marker='o', cmap=None, norm=None, vmin=None, vmax=None, alpha=1.0, linewidths=None, faceted=True, verts=None, hold=None, **kwargs): +@autogen_docstring(Axes.scatter) +def scatter(x, y, s=20, c='b', marker='o', cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, faceted=True, verts=None, hold=None, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False washold = ax.ishold() @@ -2237,13 +2377,12 @@ draw_if_interactive() finally: ax.hold(washold) - gci._current = ret + sci(ret) return ret -if Axes.scatter.__doc__ is not None: - scatter.__doc__ = dedent(Axes.scatter.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.semilogx) def semilogx(*args, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -2258,11 +2397,10 @@ ax.hold(washold) return ret -if Axes.semilogx.__doc__ is not None: - semilogx.__doc__ = dedent(Axes.semilogx.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.semilogy) def semilogy(*args, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -2277,11 +2415,10 @@ ax.hold(washold) return ret -if Axes.semilogy.__doc__ is not None: - semilogy.__doc__ = dedent(Axes.semilogy.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.specgram) def specgram(x, NFFT=256, Fs=2, Fc=0, detrend=mlab.detrend_none, window=mlab.window_hanning, noverlap=128, cmap=None, xextent=None, pad_to=None, sides='default', scale_by_freq=None, hold=None, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -2294,14 +2431,13 @@ draw_if_interactive() finally: ax.hold(washold) - gci._current = ret[-1] + sci(ret[-1]) return ret -if Axes.specgram.__doc__ is not None: - specgram.__doc__ = dedent(Axes.specgram.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost -def spy(Z, precision=0, marker=None, markersize=None, aspect='equal', hold=None, **kwargs): +@autogen_docstring(Axes.stem) +def stem(x, y, linefmt='b-', markerfmt='bo', basefmt='r-', hold=None): ax = gca() # allow callers to override the hold state by passing hold=True|False washold = ax.ishold() @@ -2309,37 +2445,71 @@ if hold is not None: ax.hold(hold) try: - ret = ax.spy(Z, precision, marker, markersize, aspect, **kwargs) + ret = ax.stem(x, y, linefmt, markerfmt, basefmt) draw_if_interactive() finally: ax.hold(washold) - gci._current = ret + return ret -if Axes.spy.__doc__ is not None: - spy.__doc__ = dedent(Axes.spy.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost -def stem(x, y, linefmt='b-', markerfmt='bo', basefmt='r-', hold=None): +@autogen_docstring(Axes.step) +def step(x, y, *args, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False washold = ax.ishold() + hold = kwargs.pop('hold', None) + if hold is not None: + ax.hold(hold) + try: + ret = ax.step(x, y, *args, **kwargs) + draw_if_interactive() + finally: + ax.hold(washold) + return ret + +# This function was autogenerated by boilerplate.py. Do not edit as +# changes will be lost +@autogen_docstring(Axes.tricontour) +def tricontour(*args, **kwargs): + ax = gca() + # allow callers to override the hold state by passing hold=True|False + washold = ax.ishold() + hold = kwargs.pop('hold', None) if hold is not None: ax.hold(hold) try: - ret = ax.stem(x, y, linefmt, markerfmt, basefmt) + ret = ax.tricontour(*args, **kwargs) draw_if_interactive() finally: ax.hold(washold) + if ret._A is not None: sci(ret) + return ret +# This function was autogenerated by boilerplate.py. Do not edit as +# changes will be lost +@autogen_docstring(Axes.tricontourf) +def tricontourf(*args, **kwargs): + ax = gca() + # allow callers to override the hold state by passing hold=True|False + washold = ax.ishold() + hold = kwargs.pop('hold', None) + if hold is not None: + ax.hold(hold) + try: + ret = ax.tricontourf(*args, **kwargs) + draw_if_interactive() + finally: + ax.hold(washold) + if ret._A is not None: sci(ret) return ret -if Axes.stem.__doc__ is not None: - stem.__doc__ = dedent(Axes.stem.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost -def step(x, y, *args, **kwargs): +@autogen_docstring(Axes.tripcolor) +def tripcolor(*args, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False washold = ax.ishold() @@ -2347,17 +2517,34 @@ if hold is not None: ax.hold(hold) try: - ret = ax.step(x, y, *args, **kwargs) + ret = ax.tripcolor(*args, **kwargs) + draw_if_interactive() + finally: + ax.hold(washold) + sci(ret) + return ret + +# This function was autogenerated by boilerplate.py. Do not edit as +# changes will be lost +@autogen_docstring(Axes.triplot) +def triplot(*args, **kwargs): + ax = gca() + # allow callers to override the hold state by passing hold=True|False + washold = ax.ishold() + hold = kwargs.pop('hold', None) + if hold is not None: + ax.hold(hold) + try: + ret = ax.triplot(*args, **kwargs) draw_if_interactive() finally: ax.hold(washold) return ret -if Axes.step.__doc__ is not None: - step.__doc__ = dedent(Axes.step.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.vlines) def vlines(x, ymin, ymax, colors='k', linestyles='solid', label='', hold=None, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -2372,11 +2559,10 @@ ax.hold(washold) return ret -if Axes.vlines.__doc__ is not None: - vlines.__doc__ = dedent(Axes.vlines.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.xcorr) def xcorr(x, y, normed=True, detrend=mlab.detrend_none, usevlines=True, maxlags=10, hold=None, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -2391,11 +2577,10 @@ ax.hold(washold) return ret -if Axes.xcorr.__doc__ is not None: - xcorr.__doc__ = dedent(Axes.xcorr.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.barbs) def barbs(*args, **kw): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -2410,62 +2595,94 @@ ax.hold(washold) return ret -if Axes.barbs.__doc__ is not None: - barbs.__doc__ = dedent(Axes.barbs.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@docstring.copy_dedent(Axes.cla) def cla(): ret = gca().cla() draw_if_interactive() return ret -if Axes.cla.__doc__ is not None: - cla.__doc__ = dedent(Axes.cla.__doc__) # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost -def grid(b=None, **kwargs): - ret = gca().grid(b, **kwargs) +@docstring.copy_dedent(Axes.grid) +def grid(b=None, which='major', **kwargs): + ret = gca().grid(b, which, **kwargs) draw_if_interactive() return ret -if Axes.grid.__doc__ is not None: - grid.__doc__ = dedent(Axes.grid.__doc__) # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@docstring.copy_dedent(Axes.legend) def legend(*args, **kwargs): ret = gca().legend(*args, **kwargs) draw_if_interactive() return ret -if Axes.legend.__doc__ is not None: - legend.__doc__ = dedent(Axes.legend.__doc__) # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@docstring.copy_dedent(Axes.table) def table(**kwargs): ret = gca().table(**kwargs) draw_if_interactive() return ret -if Axes.table.__doc__ is not None: - table.__doc__ = dedent(Axes.table.__doc__) # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@docstring.copy_dedent(Axes.text) def text(x, y, s, fontdict=None, withdash=False, **kwargs): ret = gca().text(x, y, s, fontdict, withdash, **kwargs) draw_if_interactive() return ret -if Axes.text.__doc__ is not None: - text.__doc__ = dedent(Axes.text.__doc__) # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@docstring.copy_dedent(Axes.annotate) def annotate(*args, **kwargs): ret = gca().annotate(*args, **kwargs) draw_if_interactive() return ret -if Axes.annotate.__doc__ is not None: - annotate.__doc__ = dedent(Axes.annotate.__doc__) + +# This function was autogenerated by boilerplate.py. Do not edit as +# changes will be lost +@docstring.copy_dedent(Axes.ticklabel_format) +def ticklabel_format(**kwargs): + ret = gca().ticklabel_format(**kwargs) + draw_if_interactive() + return ret + +# This function was autogenerated by boilerplate.py. Do not edit as +# changes will be lost +@docstring.copy_dedent(Axes.locator_params) +def locator_params(axis='both', tight=None, **kwargs): + ret = gca().locator_params(axis, tight, **kwargs) + draw_if_interactive() + return ret + +# This function was autogenerated by boilerplate.py. Do not edit as +# changes will be lost +@docstring.copy_dedent(Axes.tick_params) +def tick_params(axis='both', **kwargs): + ret = gca().tick_params(axis, **kwargs) + draw_if_interactive() + return ret + +# This function was autogenerated by boilerplate.py. Do not edit as +# changes will be lost +@docstring.copy_dedent(Axes.margins) +def margins(*args, **kw): + ret = gca().margins(*args, **kw) + draw_if_interactive() + return ret + +# This function was autogenerated by boilerplate.py. Do not edit as +# changes will be lost +@docstring.copy_dedent(Axes.autoscale) +def autoscale(enable=True, axis='both', tight=None): + ret = gca().autoscale(enable, axis, tight) + draw_if_interactive() + return ret # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost @@ -2690,3 +2907,5 @@ if im is not None: im.set_cmap(cm.spectral) draw_if_interactive() + + diff -Nru matplotlib-0.99.3/lib/matplotlib/quiver.py matplotlib-1.0.1/lib/matplotlib/quiver.py --- matplotlib-0.99.3/lib/matplotlib/quiver.py 2010-03-09 14:20:20.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/quiver.py 2010-07-07 01:41:52.000000000 +0000 @@ -22,6 +22,7 @@ import matplotlib.text as mtext import matplotlib.artist as martist from matplotlib.artist import allow_rasterization +from matplotlib import docstring import matplotlib.font_manager as font_manager from matplotlib.cbook import delete_masked_points from matplotlib.patches import CirclePolygon @@ -63,7 +64,7 @@ Keyword arguments: - *units*: ['width' | 'height' | 'dots' | 'inches' | 'x' | 'y' ] + *units*: ['width' | 'height' | 'dots' | 'inches' | 'x' | 'y' | 'xy'] arrow units; the arrow dimensions *except for length* are in multiples of this unit. @@ -71,7 +72,7 @@ * 'dots' or 'inches': pixels or inches, based on the figure dpi - * 'x' or 'y': *X* or *Y* data units + * 'x', 'y', or 'xy': *X*, *Y*, or sqrt(X^2+Y^2) data units The arrows scale differently depending on the units. For 'x' or 'y', the arrows get larger as one zooms in; for other @@ -80,6 +81,7 @@ height of the axes, respectively, when the the window is resized; for 'dots' or 'inches', resizing does not change the arrows. + *angles*: ['uv' | 'xy' | array] With the default 'uv', the arrow aspect ratio is 1, so that if *U*==*V* the angle of the arrow on the plot is 45 degrees @@ -89,10 +91,20 @@ of values in degrees, CCW from the *x*-axis. *scale*: [ None | float ] - data units per arrow unit, e.g. m/s per plot width; a smaller + data units per arrow length unit, e.g. m/s per plot width; a smaller scale parameter makes the arrow longer. If *None*, a simple autoscaling algorithm is used, based on the average vector length - and the number of vectors. + and the number of vectors. The arrow length unit is given by + the *scale_units* parameter + + *scale_units*: None, or any of the *units* options. For example, + if *scale_units* is 'inches', *scale* is 2.0, and (u,v) = (1,0), + then the vector will be 0.5 inches long. If *scale_units* is + 'width', then the vector will be half the width of the axes. + If *scale_units* is 'x' then the vector will be 0.5 x-axis + units. To plot vectors in the x-y plane, with u and v having + the same units as x and y, use + "angles='xy', scale_units='xy', scale=1". *width*: shaft width in arrow units; default depends on choice of units, @@ -139,7 +151,7 @@ keyword arguments: %(PolyCollection)s -""" % martist.kwdocd +""" % docstring.interpd.params _quiverkey_doc = """ Add a key to a quiver plot. @@ -368,7 +380,14 @@ should be no performance penalty from putting the calculations in the draw() method. """ + + @docstring.Substitution(_quiver_doc) def __init__(self, ax, *args, **kw): + """ + The constructor takes one required argument, an Axes + instance, followed by the args and kwargs described + by the following pylab interface documentation: + %s""" self.ax = ax X, Y, U, V, C = _parse_args(*args) self.X = X @@ -382,6 +401,7 @@ self.minshaft = kw.pop('minshaft', 1) self.minlength = kw.pop('minlength', 1) self.units = kw.pop('units', 'width') + self.scale_units = kw.pop('scale_units', None) self.angles = kw.pop('angles', 'uv') self.width = kw.pop('width', None) self.color = kw.pop('color', 'k') @@ -409,14 +429,9 @@ self.ax.figure.callbacks.connect('dpi_changed', on_dpi_change) - __init__.__doc__ = """ - The constructor takes one required argument, an Axes - instance, followed by the args and kwargs described - by the following pylab interface documentation: - %s""" % _quiver_doc - def _init(self): - """initialization delayed until first draw; + """ + Initialization delayed until first draw; allow time for axes setup. """ # It seems that there are not enough event notifications @@ -427,14 +442,15 @@ sx, sy = trans.inverted().transform_point( (ax.bbox.width, ax.bbox.height)) self.span = sx - sn = max(8, min(25, math.sqrt(self.N))) if self.width is None: + sn = max(8, min(25, math.sqrt(self.N))) self.width = 0.06 * self.span / sn @allow_rasterization def draw(self, renderer): self._init() - if self._new_UV or self.angles == 'xy': + if (self._new_UV or self.angles == 'xy' + or self.scale_units in ['x','y', 'xy']): verts = self._make_verts(self.U, self.V) self.set_verts(verts, closed=False) self._new_UV = False @@ -458,42 +474,78 @@ self.set_array(C) self._new_UV = True - def _set_transform(self): + def _dots_per_unit(self, units): + """ + Return a scale factor for converting from units to pixels + """ ax = self.ax - if self.units in ('x', 'y'): - if self.units == 'x': + if units in ('x', 'y', 'xy'): + if units == 'x': dx0 = ax.viewLim.width dx1 = ax.bbox.width - else: + elif units == 'y': dx0 = ax.viewLim.height dx1 = ax.bbox.height + else: # 'xy' is assumed + dxx0 = ax.viewLim.width + dxx1 = ax.bbox.width + dyy0 = ax.viewLim.height + dyy1 = ax.bbox.height + dx1 = np.sqrt(dxx1*dxx1+dyy1*dyy1) + dx0 = np.sqrt(dxx0*dxx0+dyy0*dyy0) dx = dx1/dx0 else: - if self.units == 'width': + if units == 'width': dx = ax.bbox.width - elif self.units == 'height': + elif units == 'height': dx = ax.bbox.height - elif self.units == 'dots': + elif units == 'dots': dx = 1.0 - elif self.units == 'inches': + elif units == 'inches': dx = ax.figure.dpi else: raise ValueError('unrecognized units') + return dx + + def _set_transform(self): + """ + Sets the PolygonCollection transform to go + from arrow width units to pixels. + """ + dx = self._dots_per_unit(self.units) + self._trans_scale = dx # pixels per arrow width unit trans = transforms.Affine2D().scale(dx) self.set_transform(trans) return trans - def _angles(self, U, V, eps=0.001): + def _angles_lengths(self, U, V, eps=1): xy = self.ax.transData.transform(self.XY) uv = np.hstack((U[:,np.newaxis], V[:,np.newaxis])) xyp = self.ax.transData.transform(self.XY + eps * uv) dxy = xyp - xy - ang = np.arctan2(dxy[:,1], dxy[:,0]) - return ang + angles = np.arctan2(dxy[:,1], dxy[:,0]) + lengths = np.absolute(dxy[:,0] + dxy[:,1]*1j) / eps + return angles, lengths + + def _make_verts(self, U, V): uv = (U+V*1j) - a = np.absolute(uv) + if self.angles == 'xy' and self.scale_units == 'xy': + # Here eps is 1 so that if we get U, V by diffing + # the X, Y arrays, the vectors will connect the + # points, regardless of the axis scaling (including log). + angles, lengths = self._angles_lengths(U, V, eps=1) + elif self.angles == 'xy' or self.scale_units == 'xy': + # Calculate eps based on the extents of the plot + # so that we don't end up with roundoff error from + # adding a small number to a large. + angles, lengths = self._angles_lengths(U, V, + eps=np.abs(self.ax.dataLim.extents).max() * 0.001) + if self.scale_units == 'xy': + a = lengths + else: + a = np.absolute(uv) if self.scale is None: sn = max(10, math.sqrt(self.N)) if self.Umask is not ma.nomask: @@ -501,11 +553,24 @@ else: amean = a.mean() scale = 1.8 * amean * sn / self.span # crude auto-scaling - self.scale = scale - length = a/(self.scale*self.width) + # scale is typical arrow length as a multiple + # of the arrow width + if self.scale_units is None: + if self.scale is None: + self.scale = scale + widthu_per_lenu = 1.0 + else: + if self.scale_units == 'xy': + dx = 1 + else: + dx = self._dots_per_unit(self.scale_units) + widthu_per_lenu = dx/self._trans_scale + if self.scale is None: + self.scale = scale * widthu_per_lenu + length = a * (widthu_per_lenu / (self.scale * self.width)) X, Y = self._h_arrows(length) if self.angles == 'xy': - theta = self._angles(U, V) + theta = angles elif self.angles == 'uv': theta = np.angle(uv) else: @@ -718,7 +783,9 @@ arguments: %(PolyCollection)s -""" % martist.kwdocd +""" % docstring.interpd.params + +docstring.interpd.update(barbs_doc=_barbs_doc) class Barbs(collections.PolyCollection): ''' @@ -737,7 +804,13 @@ #This may be an abuse of polygons here to render what is essentially maybe #1 triangle and a series of lines. It works fine as far as I can tell #however. + @docstring.interpd def __init__(self, ax, *args, **kw): + """ + The constructor takes one required argument, an Axes + instance, followed by the args and kwargs described + by the following pylab interface documentation: + %(barbs_doc)s""" self._pivot = kw.pop('pivot', 'tip') self._length = kw.pop('length', 7) barbcolor = kw.pop('barbcolor', None) @@ -779,12 +852,6 @@ self.set_UVC(u, v, c) - __init__.__doc__ = """ - The constructor takes one required argument, an Axes - instance, followed by the args and kwargs described - by the following pylab interface documentation: - %s""" % _barbs_doc - def _find_tails(self, mag, rounding=True, half=5, full=10, flag=50): ''' Find how many of each of the tail pieces is necessary. Flag diff -Nru matplotlib-0.99.3/lib/matplotlib/rcsetup.py matplotlib-1.0.1/lib/matplotlib/rcsetup.py --- matplotlib-0.99.3/lib/matplotlib/rcsetup.py 2009-07-31 15:14:41.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/rcsetup.py 2010-11-09 13:28:22.000000000 +0000 @@ -207,6 +207,14 @@ raise ValueError('%s does not look like a color arg%s'%(s, msg)) +def validate_colorlist(s): + 'return a list of colorspecs' + if type(s) is str: + return [validate_color(c.strip()) for c in s.split(',')] + else: + assert type(s) in [list, tuple] + return [validate_color(c) for c in s] + def validate_stringlist(s): 'return a list' if type(s) is str: @@ -289,6 +297,11 @@ warnings.warn("Deprecated negative_linestyle specification; use 'solid' or 'dashed'") return (0, dashes) # (offset, (solid, blank)) +def validate_tkpythoninspect(s): + # Introduced 2010/07/05 + warnings.warn("tk.pythoninspect is obsolete, and has no effect") + return validate_bool(s) + validate_legend_loc = ValidateInStrings('legend_loc',[ 'best', 'upper right', @@ -334,8 +347,8 @@ defaultParams = { 'backend' : ['Agg', validate_backend], # agg is certainly present 'backend_fallback' : [True, validate_bool], # agg is certainly present - 'numerix' : ['obsolete', validate_numerix], - 'maskedarray' : ['obsolete', validate_maskedarray], #to be removed + #'numerix' : ['obsolete', validate_numerix], + #'maskedarray' : ['obsolete', validate_maskedarray], #to be removed 'toolbar' : ['toolbar2', validate_toolbar], 'datapath' : [None, validate_path_exists], # handled by _get_data_path_cached 'units' : [False, validate_bool], @@ -372,7 +385,7 @@ 'font.variant' : ['normal', str], # 'font.stretch' : ['normal', str], # 'font.weight' : ['normal', str], # - 'font.size' : [12.0, validate_float], # + 'font.size' : [12, validate_float], # Base font size in points 'font.serif' : [['Bitstream Vera Serif', 'DejaVu Serif', 'New Century Schoolbook', 'Century Schoolbook L', 'Utopia', 'ITC Bookman', 'Bookman', @@ -399,11 +412,15 @@ 'text.latex.preamble' : [[''], validate_stringlist], 'text.latex.preview' : [False, validate_bool], 'text.dvipnghack' : [None, validate_bool_maybe_none], - 'text.fontstyle' : ['normal', str], - 'text.fontangle' : ['normal', str], - 'text.fontvariant' : ['normal', str], - 'text.fontweight' : ['normal', str], - 'text.fontsize' : ['medium', validate_fontsize], + 'text.hinting' : [True, validate_bool], + + # The following are deprecated and replaced by, e.g., 'font.style' + #'text.fontstyle' : ['normal', str], + #'text.fontangle' : ['normal', str], + #'text.fontvariant' : ['normal', str], + #'text.fontweight' : ['normal', str], + #'text.fontsize' : ['medium', validate_fontsize], + 'mathtext.cal' : ['cursive', validate_font_properties], 'mathtext.rm' : ['serif', validate_font_properties], @@ -439,6 +456,9 @@ # of the axis range is smaller than the # first or larger than the second 'axes.unicode_minus' : [True, validate_bool], + 'axes.color_cycle' : [['b','g','r','c','m','y','k'], + validate_colorlist], # cycle of plot + # line colors 'polaraxes.grid' : [True, validate_bool], # display polar grid or not 'axes3d.grid' : [True, validate_bool], # display 3d grid @@ -466,9 +486,6 @@ 'legend.shadow' : [False, validate_bool], - - - # tick properties 'xtick.major.size' : [4, validate_float], # major xtick size in points 'xtick.minor.size' : [2, validate_float], # minor xtick size in points @@ -510,10 +527,11 @@ 'savefig.facecolor' : ['w', validate_color], # facecolor; white 'savefig.edgecolor' : ['w', validate_color], # edgecolor; white 'savefig.orientation' : ['portrait', validate_orientation], # edgecolor; white + 'savefig.extension' : ['auto', str], # what to add to extensionless filenames 'cairo.format' : ['png', validate_cairo_format], 'tk.window_focus' : [False, validate_bool], # Maintain shell focus for TkAgg - 'tk.pythoninspect' : [False, validate_bool], # Set PYTHONINSPECT + 'tk.pythoninspect' : [False, validate_tkpythoninspect], # obsolete 'ps.papersize' : ['letter', validate_ps_papersize], # Set the papersize/type 'ps.useafm' : [False, validate_bool], # Set PYTHONINSPECT 'ps.usedistiller' : [False, validate_ps_distiller], # use ghostscript or xpdf to distill ps output @@ -533,9 +551,27 @@ 'path.simplify' : [True, validate_bool], 'path.simplify_threshold' : [1.0 / 9.0, ValidateInterval(0.0, 1.0)], - 'agg.path.chunksize' : [0, validate_int] # 0 to disable chunking; - # recommend about 20000 to - # enable. Experimental. + 'path.snap' : [True, validate_bool], + 'agg.path.chunksize' : [0, validate_int], # 0 to disable chunking; + # recommend about 20000 to + # enable. Experimental. + # key-mappings + 'keymap.fullscreen' : ['f', validate_stringlist], + 'keymap.home' : [['h', 'r', 'home'], validate_stringlist], + 'keymap.back' : [['left', 'c', 'backspace'], validate_stringlist], + 'keymap.forward' : [['right', 'v'], validate_stringlist], + 'keymap.pan' : ['p', validate_stringlist], + 'keymap.zoom' : ['o', validate_stringlist], + 'keymap.save' : ['s', validate_stringlist], + 'keymap.grid' : ['g', validate_stringlist], + 'keymap.yscale' : ['l', validate_stringlist], + 'keymap.xscale' : [['k', 'L'], validate_stringlist], + 'keymap.all_axes' : ['a', validate_stringlist], + + # sample data + 'examples.download' : [True, validate_bool], + 'examples.directory' : ['', str], + } if __name__ == '__main__': diff -Nru matplotlib-0.99.3/lib/matplotlib/scale.py matplotlib-1.0.1/lib/matplotlib/scale.py --- matplotlib-0.99.3/lib/matplotlib/scale.py 2009-07-31 15:14:41.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/scale.py 2010-07-07 01:41:52.000000000 +0000 @@ -7,6 +7,7 @@ from ticker import NullFormatter, ScalarFormatter, LogFormatterMathtext, Formatter from ticker import NullLocator, LogLocator, AutoLocator, SymmetricalLogLocator, FixedLocator from transforms import Transform, IdentityTransform +from matplotlib import docstring class ScaleBase(object): """ @@ -460,3 +461,8 @@ docs.append(class_docs) docs.append("") return "\n".join(docs) + +docstring.interpd.update( + scale = ' | '.join([repr(x) for x in get_scale_names()]), + scale_docs = get_scale_docs().strip(), + ) diff -Nru matplotlib-0.99.3/lib/matplotlib/sphinxext/ipython_console_highlighting.py matplotlib-1.0.1/lib/matplotlib/sphinxext/ipython_console_highlighting.py --- matplotlib-0.99.3/lib/matplotlib/sphinxext/ipython_console_highlighting.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/sphinxext/ipython_console_highlighting.py 2010-07-07 01:41:49.000000000 +0000 @@ -0,0 +1,114 @@ +"""reST directive for syntax-highlighting ipython interactive sessions. + +XXX - See what improvements can be made based on the new (as of Sept 2009) +'pycon' lexer for the python console. At the very least it will give better +highlighted tracebacks. +""" + +#----------------------------------------------------------------------------- +# Needed modules + +# Standard library +import re + +# Third party +from pygments.lexer import Lexer, do_insertions +from pygments.lexers.agile import (PythonConsoleLexer, PythonLexer, + PythonTracebackLexer) +from pygments.token import Comment, Generic + +from sphinx import highlighting + +#----------------------------------------------------------------------------- +# Global constants +line_re = re.compile('.*?\n') + +#----------------------------------------------------------------------------- +# Code begins - classes and functions + +class IPythonConsoleLexer(Lexer): + """ + For IPython console output or doctests, such as: + + .. sourcecode:: ipython + + In [1]: a = 'foo' + + In [2]: a + Out[2]: 'foo' + + In [3]: print a + foo + + In [4]: 1 / 0 + + Notes: + + - Tracebacks are not currently supported. + + - It assumes the default IPython prompts, not customized ones. + """ + + name = 'IPython console session' + aliases = ['ipython'] + mimetypes = ['text/x-ipython-console'] + input_prompt = re.compile("(In \[[0-9]+\]: )|( \.\.\.+:)") + output_prompt = re.compile("(Out\[[0-9]+\]: )|( \.\.\.+:)") + continue_prompt = re.compile(" \.\.\.+:") + tb_start = re.compile("\-+") + + def get_tokens_unprocessed(self, text): + pylexer = PythonLexer(**self.options) + tblexer = PythonTracebackLexer(**self.options) + + curcode = '' + insertions = [] + for match in line_re.finditer(text): + line = match.group() + input_prompt = self.input_prompt.match(line) + continue_prompt = self.continue_prompt.match(line.rstrip()) + output_prompt = self.output_prompt.match(line) + if line.startswith("#"): + insertions.append((len(curcode), + [(0, Comment, line)])) + elif input_prompt is not None: + insertions.append((len(curcode), + [(0, Generic.Prompt, input_prompt.group())])) + curcode += line[input_prompt.end():] + elif continue_prompt is not None: + insertions.append((len(curcode), + [(0, Generic.Prompt, continue_prompt.group())])) + curcode += line[continue_prompt.end():] + elif output_prompt is not None: + # Use the 'error' token for output. We should probably make + # our own token, but error is typicaly in a bright color like + # red, so it works fine for our output prompts. + insertions.append((len(curcode), + [(0, Generic.Error, output_prompt.group())])) + curcode += line[output_prompt.end():] + else: + if curcode: + for item in do_insertions(insertions, + pylexer.get_tokens_unprocessed(curcode)): + yield item + curcode = '' + insertions = [] + yield match.start(), Generic.Output, line + if curcode: + for item in do_insertions(insertions, + pylexer.get_tokens_unprocessed(curcode)): + yield item + + +def setup(app): + """Setup as a sphinx extension.""" + + # This is only a lexer, so adding it below to pygments appears sufficient. + # But if somebody knows that the right API usage should be to do that via + # sphinx, by all means fix it here. At least having this setup.py + # suppresses the sphinx warning we'd get without it. + pass + +#----------------------------------------------------------------------------- +# Register the extension as a valid pygments lexer +highlighting.lexers['ipython'] = IPythonConsoleLexer() diff -Nru matplotlib-0.99.3/lib/matplotlib/sphinxext/ipython_directive.py matplotlib-1.0.1/lib/matplotlib/sphinxext/ipython_directive.py --- matplotlib-0.99.3/lib/matplotlib/sphinxext/ipython_directive.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/sphinxext/ipython_directive.py 2010-12-13 15:27:11.000000000 +0000 @@ -0,0 +1,567 @@ +import sys, os, shutil, imp, warnings, cStringIO, re + +import IPython +from IPython.Shell import MatplotlibShell + +try: + from hashlib import md5 +except ImportError: + from md5 import md5 + +from docutils.parsers.rst import directives +import sphinx + + +sphinx_version = sphinx.__version__.split(".") +# The split is necessary for sphinx beta versions where the string is +# '6b1' +sphinx_version = tuple([int(re.split('[a-z]', x)[0]) + for x in sphinx_version[:2]]) + + + +COMMENT, INPUT, OUTPUT = range(3) +rgxin = re.compile('In \[(\d+)\]:\s?(.*)\s*') +rgxout = re.compile('Out\[(\d+)\]:\s?(.*)\s*') +fmtin = 'In [%d]:' +fmtout = 'Out[%d]:' + +def block_parser(part): + """ + part is a string of ipython text, comprised of at most one + input, one ouput, comments, and blank lines. The block parser + parses the text into a list of:: + + blocks = [ (TOKEN0, data0), (TOKEN1, data1), ...] + where TOKEN is one of [COMMENT | INPUT | OUTPUT ] and + data is, depending on the type of token:: + + COMMENT : the comment string + + INPUT: the (DECORATOR, INPUT_LINE, REST) where + DECORATOR: the input decorator (or None) + INPUT_LINE: the input as string (possibly multi-line) + REST : any stdout generated by the input line (not OUTPUT) + + + OUTPUT: the output string, possibly multi-line + + """ + + block = [] + lines = part.split('\n') + #print 'PARSE', lines + N = len(lines) + i = 0 + decorator = None + while 1: + + if i==N: + # nothing left to parse -- the last line + break + + line = lines[i] + i += 1 + line_stripped = line.strip() + if line_stripped.startswith('#'): + block.append((COMMENT, line)) + continue + + + if line_stripped.startswith('@'): + # we're assuming at most one decorator -- may need to + # rethink + decorator = line_stripped + continue + + # does this look like an input line? + matchin = rgxin.match(line) + if matchin: + lineno, inputline = int(matchin.group(1)), matchin.group(2) + + # the ....: continuation string + continuation = ' %s:'%''.join(['.']*(len(str(lineno))+2)) + Nc = len(continuation) + # input lines can continue on for more than one line, if + # we have a '\' line continuation char or a function call + # echo line 'print'. The input line can only be + # terminated by the end of the block or an output line, so + # we parse out the rest of the input line if it is + # multiline as well as any echo text + + rest = [] + while i2: + if debug: + print '\n'.join(lines) + else: + #print 'INSERTING %d lines'%len(lines) + state_machine.insert_input( + lines, state_machine.input_lines.source(0)) + + return [] + +ipython_directive.DEBUG = False + +def setup(app): + setup.app = app + options = { + 'suppress': directives.flag, + 'doctest': directives.flag, + 'verbatim': directives.flag, + } + + + app.add_directive('ipython', ipython_directive, True, (0, 2, 0), **options) + + +def test(): + + examples = [ + r""" +In [9]: pwd +Out[9]: '/home/jdhunter/py4science/book' + +In [10]: cd bookdata/ +/home/jdhunter/py4science/book/bookdata + +In [2]: from pylab import * + +In [2]: ion() + +In [3]: im = imread('stinkbug.png') + +@savefig mystinkbug.png width=4in +In [4]: imshow(im) +Out[4]: + +""", + r""" + +In [1]: x = 'hello world' + +# string methods can be +# used to alter the string +@doctest +In [2]: x.upper() +Out[2]: 'HELLO WORLD' + +@verbatim +In [3]: x.st +x.startswith x.strip +""", + r""" + +In [130]: url = 'http://ichart.finance.yahoo.com/table.csv?s=CROX\ + .....: &d=9&e=22&f=2009&g=d&a=1&br=8&c=2006&ignore=.csv' + +In [131]: print url.split('&') +--------> print(url.split('&')) +['http://ichart.finance.yahoo.com/table.csv?s=CROX', 'd=9', 'e=22', 'f=2009', 'g=d', 'a=1', 'b=8', 'c=2006', 'ignore=.csv'] + +In [60]: import urllib + +""", + r"""\ + +In [133]: import numpy.random + +@suppress +In [134]: numpy.random.seed(2358) + +@doctest +In [135]: np.random.rand(10,2) +Out[135]: +array([[ 0.64524308, 0.59943846], + [ 0.47102322, 0.8715456 ], + [ 0.29370834, 0.74776844], + [ 0.99539577, 0.1313423 ], + [ 0.16250302, 0.21103583], + [ 0.81626524, 0.1312433 ], + [ 0.67338089, 0.72302393], + [ 0.7566368 , 0.07033696], + [ 0.22591016, 0.77731835], + [ 0.0072729 , 0.34273127]]) + +""", + + r""" +In [106]: print x +--------> print(x) +jdh + +In [109]: for i in range(10): + .....: print i + .....: + .....: +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 + + +""", + + r""" + +In [144]: from pylab import * + +In [145]: ion() + +# use a semicolon to suppress the output +@savefig test_hist.png width=4in +In [151]: hist(np.random.randn(10000), 100); + + +@savefig test_plot.png width=4in +In [151]: plot(np.random.randn(10000), 'o'); + """, + + r""" +# use a semicolon to suppress the output +In [151]: plt.clf() + +@savefig plot_simple.png width=4in +In [151]: plot([1,2,3]) + +@savefig hist_simple.png width=4in +In [151]: hist(np.random.randn(10000), 100); + +""", + r""" +# update the current fig +In [151]: ylabel('number') + +In [152]: title('normal distribution') + + +@savefig hist_with_text.png +In [153]: grid(True) + + """, + + + r""" + +In [239]: 1/2 +@verbatim +Out[239]: 0 + +In [240]: 1.0/2.0 +Out[240]: 0.5 +""", + + r""" +@verbatim +In [6]: pwd +Out[6]: '/home/jdhunter/mypy' +""", + + r""" +@verbatim +In [151]: myfile.upper? +Type: builtin_function_or_method +Base Class: +String Form: +Namespace: Interactive +Docstring: + S.upper() -> string + Return a copy of the string S converted to uppercase. + """ + ] + + + + ipython_directive.DEBUG = True + #options = dict(suppress=True) + options = dict() + for example in examples: + content = example.split('\n') + ipython_directive('debug', arguments=None, options=options, + content=content, lineno=0, + content_offset=None, block_text=None, + state=None, state_machine=None, + ) + + +if __name__=='__main__': + test() diff -Nru matplotlib-0.99.3/lib/matplotlib/sphinxext/plot_directive.py matplotlib-1.0.1/lib/matplotlib/sphinxext/plot_directive.py --- matplotlib-0.99.3/lib/matplotlib/sphinxext/plot_directive.py 2010-03-09 14:20:20.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/sphinxext/plot_directive.py 2011-01-06 13:48:13.000000000 +0000 @@ -1,27 +1,78 @@ """A special directive for including a matplotlib plot. -Given a path to a .py file, it includes the source code inline, then: +The source code for the plot may be included in one of two ways: -- On HTML, will include a .png with a link to a high-res .png. + 1. A path to a source file as the argument to the directive:: -- On LaTeX, will include a .pdf + .. plot:: path/to/plot.py -This directive supports all of the options of the `image` directive, -except for `target` (since plot will add its own target). + When a path to a source file is given, the content of the + directive may optionally contain a caption for the plot:: -Additionally, if the :include-source: option is provided, the literal -source will be included inline, as well as a link to the source. + .. plot:: path/to/plot.py + + This is the caption for the plot + + Additionally, one my specify the name of a function to call (with + no arguments) immediately after importing the module:: + + .. plot:: path/to/plot.py plot_function1 + + 2. Included as inline content to the directive:: + + .. plot:: + + import matplotlib.pyplot as plt + import matplotlib.image as mpimg + import numpy as np + img = mpimg.imread('_static/stinkbug.png') + imgplot = plt.imshow(img) + +In HTML output, `plot` will include a .png file with a link to a high-res +.png and .pdf. In LaTeX output, it will include a .pdf. + +To customize the size of the plot, this directive supports all of the +options of the `image` directive, except for `target` (since plot will +add its own target). These include `alt`, `height`, `width`, `scale`, +`align` and `class`. + +Additionally, if the `:include-source:` option is provided, the +literal source will be displayed inline in the text, (as well as a +link to the source in HTML). If this source file is in a non-UTF8 or +non-ASCII encoding, the encoding must be specified using the +`:encoding:` option. + +If the `:context:` option is plotted, the code will be run in the +context of all previous plot directives for which the context option +was specified. This only applies to inline code plot directives, not +those run from files. + +If the ``:nofigs:`` option is specified, the code block will be run, +but no figures will be inserted. This is usually useful with the +``:context:`` option. The set of file formats to generate can be specified with the -plot_formats configuration variable. +`plot_formats` configuration variable. + + +Error handling: + +Any errors generated during the running of the code are emitted as warnings +using the Python `warnings` module, using a custom category called +`PlotWarning`. To turn the warnings into fatal errors that stop the +documentation build, after adjusting your `sys.path` in your `conf.py` Sphinx +configuration file, use:: + + import plot_directive + warnings.simplefilter('error', plot_directive.PlotWarning) """ -import sys, os, glob, shutil, hashlib, imp, warnings, cStringIO -import re +import sys, os, shutil, imp, warnings, cStringIO, re try: from hashlib import md5 except ImportError: from md5 import md5 + from docutils.parsers.rst import directives try: # docutils 0.4 @@ -30,7 +81,6 @@ # docutils 0.5 from docutils.parsers.rst.directives.images import Image align = Image.align -from docutils import nodes import sphinx sphinx_version = sphinx.__version__.split(".") @@ -45,12 +95,29 @@ import matplotlib.pyplot as plt import matplotlib.image as image from matplotlib import _pylab_helpers +from matplotlib.sphinxext import only_directives + + +class PlotWarning(Warning): + """Warning category for all warnings generated by this directive. -import only_directives + By printing our warnings with this category, it becomes possible to turn + them into errors by using in your conf.py:: + + warnings.simplefilter('error', plot_directive.PlotWarning) + + This way, you can ensure that your docs only build if all your examples + actually run successfully. + """ + pass + +# os.path.relpath is new in Python 2.6 if hasattr(os.path, 'relpath'): relpath = os.path.relpath else: + # This code is snagged from Python 2.6 + def relpath(target, base=os.curdir): """ Return a relative path to the target from either the current dir or an optional base dir. @@ -66,18 +133,21 @@ base_list = (os.path.abspath(base)).split(os.sep) target_list = (os.path.abspath(target)).split(os.sep) - # On the windows platform the target may be on a completely different drive from the base. + # On the windows platform the target may be on a completely + # different drive from the base. if os.name in ['nt','dos','os2'] and base_list[0] <> target_list[0]: raise OSError, 'Target is on a different drive to base. Target: '+target_list[0].upper()+', base: '+base_list[0].upper() - # Starting from the filepath root, work out how much of the filepath is - # shared by base and target. + # Starting from the filepath root, work out how much of the + # filepath is shared by base and target. for i in range(min(len(base_list), len(target_list))): if base_list[i] <> target_list[i]: break else: - # If we broke out of the loop, i is pointing to the first differing path elements. - # If we didn't break out of the loop, i is pointing to identical path elements. - # Increment i so that in all cases it points to the first differing path elements. + # If we broke out of the loop, i is pointing to the first + # differing path elements. If we didn't break out of the + # loop, i is pointing to identical path elements. + # Increment i so that in all cases it points to the first + # differing path elements. i+=1 rel_list = [os.pardir] * (len(base_list)-i) + target_list[i:] @@ -86,30 +156,22 @@ else: return "" -def write_char(s): - sys.stdout.write(s) - sys.stdout.flush() - -options = {'alt': directives.unchanged, - 'height': directives.length_or_unitless, - 'width': directives.length_or_percentage_or_unitless, - 'scale': directives.nonnegative_int, - 'align': align, - 'class': directives.class_option, - 'include-source': directives.flag, - 'encoding': directives.encoding} - template = """ .. htmlonly:: - [%(links)s] + %(links)s - .. image:: %(prefix)s%(tmpdir)s/%(outname)s.png - %(options)s + .. figure:: %(prefix)s%(tmpdir)s/%(outname)s.png +%(options)s + +%(caption)s .. latexonly:: - .. image:: %(prefix)s%(tmpdir)s/%(outname)s.pdf - %(options)s + .. figure:: %(prefix)s%(tmpdir)s/%(outname)s.pdf +%(options)s + +%(caption)s + """ exception_template = """ @@ -121,60 +183,113 @@ """ +template_content_indent = ' ' + +# the context of the plot for all directives specified with the +# :context: option +plot_context = dict() + def out_of_date(original, derived): """ Returns True if derivative is out-of-date wrt original, both of which are full file paths. """ - return (not os.path.exists(derived)) - # or os.stat(derived).st_mtime < os.stat(original).st_mtime) + return (not os.path.exists(derived) or + (os.path.exists(original) and + os.stat(derived).st_mtime < os.stat(original).st_mtime)) -def runfile(fullpath): +def run_code(plot_path, function_name, plot_code, context=False): """ - Import a Python module from a path. + Import a Python module from a path, and run the function given by + name, if function_name is not None. """ + # Change the working directory to the directory of the example, so - # it can get at its data files, if any. - pwd = os.getcwd() - path, fname = os.path.split(fullpath) - sys.path.insert(0, os.path.abspath(path)) - stdout = sys.stdout - sys.stdout = cStringIO.StringIO() - os.chdir(path) - try: - fd = open(fname) - module = imp.load_module("__main__", fd, fname, ('py', 'r', imp.PY_SOURCE)) - finally: - del sys.path[0] - os.chdir(pwd) - sys.stdout = stdout - return module + # it can get at its data files, if any. Add its path to sys.path + # so it can import any helper modules sitting beside it. -def makefig(fullpath, code, outdir): + if plot_code is not None: + exec_code = 'import numpy as np; import matplotlib.pyplot as plt\n%s'%plot_code + #print 'CONTEXT', context, plot_context, exec_code + if context: + exec(exec_code, None, plot_context) + else: + exec(exec_code) + + else: + pwd = os.getcwd() + path, fname = os.path.split(plot_path) + sys.path.insert(0, os.path.abspath(path)) + stdout = sys.stdout + sys.stdout = cStringIO.StringIO() + os.chdir(path) + fd = None + try: + fd = open(fname) + module = imp.load_module( + "__plot__", fd, fname, ('py', 'r', imp.PY_SOURCE)) + finally: + del sys.path[0] + os.chdir(pwd) + sys.stdout = stdout + if fd is not None: + fd.close() + + if function_name is not None: + getattr(module, function_name)() + +def run_savefig(plot_path, basename, tmpdir, destdir, formats): """ - run a pyplot script and save the low and high res PNGs and a PDF in _static + Once a plot script has been imported, this function runs savefig + on all of the figures in all of the desired formats. """ - formats = [('png', 80), ('hires.png', 200), ('pdf', 50)] + fig_managers = _pylab_helpers.Gcf.get_all_fig_managers() + for i, figman in enumerate(fig_managers): + for j, (format, dpi) in enumerate(formats): + if len(fig_managers) == 1: + outname = basename + else: + outname = "%s_%02d" % (basename, i) + outname = outname + "." + format + outpath = os.path.join(tmpdir, outname) + try: + figman.canvas.figure.savefig(outpath, dpi=dpi) + except: + s = cbook.exception_to_str("Exception saving plot %s" % plot_path) + warnings.warn(s, PlotWarning) + return 0 + if j > 0: + shutil.copyfile(outpath, os.path.join(destdir, outname)) - fullpath = str(fullpath) # todo, why is unicode breaking this - basedir, fname = os.path.split(fullpath) + return len(fig_managers) + + +def clear_state(): + plt.close('all') + matplotlib.rc_file_defaults() + +def render_figures(plot_path, function_name, plot_code, tmpdir, destdir, + formats, context=False): + """ + Run a pyplot script and save the low and high res PNGs and a PDF + in outdir. + """ + plot_path = str(plot_path) # todo, why is unicode breaking this + basedir, fname = os.path.split(plot_path) basename, ext = os.path.splitext(fname) - if str(basename) == "None": - import pdb - pdb.set_trace() + all_exists = True # Look for single-figure output files first for format, dpi in formats: - outname = os.path.join(outdir, '%s.%s' % (basename, format)) - if out_of_date(fullpath, outname): + outname = os.path.join(tmpdir, '%s.%s' % (basename, format)) + if out_of_date(plot_path, outname): all_exists = False break - if all_exists: - write_char('.' * len(formats)) + if not context and all_exists: return 1 # Then look for multi-figure output files, assuming @@ -183,8 +298,9 @@ while True: all_exists = True for format, dpi in formats: - outname = os.path.join(outdir, '%s_%02d.%s' % (basename, i, format)) - if out_of_date(fullpath, outname): + outname = os.path.join( + tmpdir, '%s_%02d.%s' % (basename, i, format)) + if out_of_date(plot_path, outname): all_exists = False break if all_exists: @@ -192,70 +308,49 @@ else: break - if i != 0: - write_char('.' * i * len(formats)) + if not context and i != 0: return i # We didn't find the files, so build them - plt.close('all') # we need to clear between runs - matplotlib.rcdefaults() - # Set a figure size that doesn't overflow typical browser windows - matplotlib.rcParams['figure.figsize'] = (5.5, 4.5) + if not context: + clear_state() + try: + run_code(plot_path, function_name, plot_code, context=context) + except: + s = cbook.exception_to_str("Exception running plot %s" % plot_path) + warnings.warn(s, PlotWarning) + return 0 - if code is not None: - exec(code) - else: - try: - runfile(fullpath) - except: - s = cbook.exception_to_str("Exception running plot %s" % fullpath) - warnings.warn(s) - return 0 + if not all_exists: + num_figs = run_savefig(plot_path, basename, tmpdir, destdir, formats) - fig_managers = _pylab_helpers.Gcf.get_all_fig_managers() - for i, figman in enumerate(fig_managers): - for format, dpi in formats: - if len(fig_managers) == 1: - outname = basename - else: - outname = "%s_%02d" % (basename, i) - outpath = os.path.join(outdir, '%s.%s' % (outname, format)) - try: - figman.canvas.figure.savefig(outpath, dpi=dpi) - except: - s = cbook.exception_to_str("Exception running plot %s" % fullpath) - warnings.warn(s) - return 0 + if '__plot__' in sys.modules: + del sys.modules['__plot__'] - write_char('*') + return num_figs + else: + return 1 - return len(fig_managers) -def plot_directive(name, arguments, options, content, lineno, - content_offset, block_text, state, state_machine): - """ - Handle the plot directive. - """ +def _plot_directive(plot_path, basedir, function_name, plot_code, caption, + options, state_machine): + context = options.has_key('context') + if context: + # remove for figure directive + del options['context'] + + nofigs = options.has_key('nofigs') + if nofigs: + # remove for figure directive + del options['nofigs'] + formats = setup.config.plot_formats if type(formats) == str: formats = eval(formats) - # The user may provide a filename *or* Python code content, but not both - if len(arguments) == 1: - reference = directives.uri(arguments[0]) - basedir, fname = os.path.split(reference) - basename, ext = os.path.splitext(fname) - basedir = relpath(basedir, setup.app.builder.srcdir) - if len(content): - raise ValueError("plot directive may not specify both a filename and inline content") - content = None - else: - basedir = "inline" - content = '\n'.join(content) - # Since we don't have a filename, use a hash based on the content - reference = basename = md5(content).hexdigest()[-10:] - fname = None + fname = os.path.basename(plot_path) + basename, ext = os.path.splitext(fname) # Get the directory of the rst file, and determine the relative # path from the resulting html file to the plot_directive links @@ -273,8 +368,8 @@ # Prior to Sphinx 0.6, absolute image paths were treated as # relative to the root of the filesystem. 0.6 and after, they are - # treated as relative to the root of the documentation tree. We need - # to support both methods here. + # treated as relative to the root of the documentation tree. We + # need to support both methods here. tmpdir = os.path.join('build', outdir) tmpdir = os.path.abspath(tmpdir) if sphinx_version < (0, 6): @@ -290,52 +385,69 @@ if not os.path.exists(destdir): cbook.mkdirs(destdir) + # Properly indent the caption + caption = '\n'.join(template_content_indent + line.strip() + for line in caption.split('\n')) + # Generate the figures, and return the number of them - num_figs = makefig(reference, content, tmpdir) + num_figs = render_figures(plot_path, function_name, plot_code, tmpdir, + destdir, formats, context=context) + + # Now start generating the lines of output + lines = [] + + if plot_code is None: + shutil.copyfile(plot_path, os.path.join(destdir, fname)) if options.has_key('include-source'): - if content is None: - lines = [ - '.. include:: %s' % os.path.join(setup.app.builder.srcdir, reference), - ' :literal:'] + if plot_code is None: + if sphinx_version > (1,): + include_prefix = '/' + else: + include_prefix = setup.app.builder.srcdir + + lines.extend( + ['.. include:: %s' % os.path.join(include_prefix, plot_path), + ' :literal:']) if options.has_key('encoding'): lines.append(' :encoding: %s' % options['encoding']) del options['encoding'] else: - lines = ['::', ''] + [' %s'%row.rstrip() for row in content.split('\n')] + lines.extend(['::', '']) + lines.extend([' %s' % row.rstrip() + for row in plot_code.split('\n')]) lines.append('') del options['include-source'] else: lines = [] - if num_figs > 0: - options = [' :%s: %s' % (key, val) for key, val in - options.items()] - options = "\n".join(options) - if fname is not None: - shutil.copyfile(reference, os.path.join(destdir, fname)) + if not nofigs: + if num_figs > 0: + options = ['%s:%s: %s' % (template_content_indent, key, val) + for key, val in options.items()] + options = "\n".join(options) + + for i in range(num_figs): + if num_figs == 1: + outname = basename + else: + outname = "%s_%02d" % (basename, i) + + # Copy the linked-to files to the destination within the build tree, + # and add a link for them + links = [] + if plot_code is None: + links.append('`source code <%(linkdir)s/%(basename)s.py>`__') + for format, dpi in formats[1:]: + links.append('`%s <%s/%s.%s>`__' % (format, linkdir, outname, format)) + if len(links): + links = '[%s]' % (', '.join(links) % locals()) + else: + links = '' - for i in range(num_figs): - if num_figs == 1: - outname = basename - else: - outname = "%s_%02d" % (basename, i) - - # Copy the linked-to files to the destination within the build tree, - # and add a link for them - links = [] - if fname is not None: - links.append('`source code <%(linkdir)s/%(basename)s.py>`__') - for format in formats[1:]: - shutil.copyfile(os.path.join(tmpdir, outname + "." + format), - os.path.join(destdir, outname + "." + format)) - links.append('`%s <%s/%s.%s>`__' % (format, linkdir, outname, format)) - links = ', '.join(links) % locals() - - # Output the resulting reST - lines.extend((template % locals()).split('\n')) - else: - lines.extend((exception_template % locals()).split('\n')) + lines.extend((template % locals()).split('\n')) + else: + lines.extend((exception_template % locals()).split('\n')) if len(lines): state_machine.insert_input( @@ -343,6 +455,41 @@ return [] +def plot_directive(name, arguments, options, content, lineno, + content_offset, block_text, state, state_machine): + """ + Handle the arguments to the plot directive. The real work happens + in _plot_directive. + """ + # The user may provide a filename *or* Python code content, but not both + if len(arguments): + plot_path = directives.uri(arguments[0]) + basedir = relpath(os.path.dirname(plot_path), setup.app.builder.srcdir) + + # If there is content, it will be passed as a caption. + + # Indent to match expansion below. XXX - The number of spaces matches + # that of the 'options' expansion further down. This should be moved + # to common code to prevent them from diverging accidentally. + caption = '\n'.join(content) + + # If the optional function name is provided, use it + if len(arguments) == 2: + function_name = arguments[1] + else: + function_name = None + + return _plot_directive(plot_path, basedir, function_name, None, caption, + options, state_machine) + else: + plot_code = '\n'.join(content) + + # Since we don't have a filename, use a hash based on the content + plot_path = md5(plot_code).hexdigest()[-10:] + + return _plot_directive(plot_path, 'inline', None, plot_code, '', options, + state_machine) + def mark_plot_labels(app, document): """ To make plots referenceable, we need to move the reference from @@ -378,10 +525,21 @@ setup.config = app.config setup.confdir = app.confdir - app.add_directive('plot', plot_directive, True, (0, 1, 0), **options) + options = {'alt': directives.unchanged, + 'height': directives.length_or_unitless, + 'width': directives.length_or_percentage_or_unitless, + 'scale': directives.nonnegative_int, + 'align': align, + 'class': directives.class_option, + 'include-source': directives.flag, + 'context': directives.flag, + 'nofigs': directives.flag, + 'encoding': directives.encoding } + + app.add_directive('plot', plot_directive, True, (0, 2, 0), **options) app.add_config_value( 'plot_formats', - ['png', 'hires.png', 'pdf'], + [('png', 80), ('hires.png', 200), ('pdf', 50)], True) app.connect('doctree-read', mark_plot_labels) diff -Nru matplotlib-0.99.3/lib/matplotlib/spines.py matplotlib-1.0.1/lib/matplotlib/spines.py --- matplotlib-0.99.3/lib/matplotlib/spines.py 2009-09-21 18:56:19.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/spines.py 2010-07-07 01:41:52.000000000 +0000 @@ -5,11 +5,13 @@ import matplotlib.artist as martist from matplotlib.artist import allow_rasterization +from matplotlib import docstring import matplotlib.transforms as mtransforms import matplotlib.lines as mlines import matplotlib.patches as mpatches import matplotlib.path as mpath import matplotlib.cbook as cbook +import numpy as np import warnings class Spine(mpatches.Patch): @@ -34,6 +36,7 @@ def __str__(self): return "Spine" + @docstring.dedent_interpd def __init__(self,axes,spine_type,path,**kwargs): """ - *axes* : the Axes instance containing the spine @@ -53,7 +56,10 @@ self.axis = None self.set_zorder(2.5) - self.set_transform(self.axes.transAxes) # default transform + self.set_transform(self.axes.transData) # default transform + + self._bounds = None # default bounds + self._smart_bounds = False # Defer initial position determination. (Not much support for # non-rectangular axes is currently implemented, and this lets @@ -72,7 +78,20 @@ # Behavior copied from mpatches.Ellipse: # Note: This cannot be calculated until this is added to an Axes self._patch_transform = mtransforms.IdentityTransform() - __init__.__doc__ = cbook.dedent(__init__.__doc__) % martist.kwdocd + + def set_smart_bounds(self,value): + """set the spine and associated axis to have smart bounds""" + self._smart_bounds = value + + # also set the axis if possible + if self.spine_type in ('left','right'): + self.axes.yaxis.set_smart_bounds(value) + elif self.spine_type in ('top','bottom'): + self.axes.xaxis.set_smart_bounds(value) + + def get_smart_bounds(self): + """get whether the spine has smart bounds""" + return self._smart_bounds def set_patch_circle(self,center,radius): """set the spine to be circular""" @@ -81,6 +100,7 @@ self._width = radius*2 self._height = radius*2 self._angle = 0 + self.set_transform(self.axes.transAxes) # circle drawn on axes transform def set_patch_line(self): """set the spine to be linear""" @@ -136,6 +156,114 @@ if self.axis is not None: self.axis.cla() + def is_frame_like(self): + """return True if directly on axes frame + + This is useful for determining if a spine is the edge of an + old style MPL plot. If so, this function will return True. + """ + self._ensure_position_is_set() + position = self._position + if cbook.is_string_like(position): + if position=='center': + position = ('axes',0.5) + elif position=='zero': + position = ('data',0) + assert len(position)==2, "position should be 2-tuple" + position_type, amount = position + if position_type=='outward' and amount == 0: + return True + else: + return False + + def _adjust_location(self): + """automatically set spine bounds to the view interval""" + + if self.spine_type == 'circle': + return + + if self._bounds is None: + if self.spine_type in ('left','right'): + low,high = self.axes.viewLim.intervaly + elif self.spine_type in ('top','bottom'): + low,high = self.axes.viewLim.intervalx + else: + raise ValueError('unknown spine spine_type: %s'%self.spine_type) + + if self._smart_bounds: + # attempt to set bounds in sophisticated way + if low > high: + # handle inverted limits + low,high=high,low + + viewlim_low = low + viewlim_high = high + + del low, high + + if self.spine_type in ('left','right'): + datalim_low,datalim_high = self.axes.dataLim.intervaly + ticks = self.axes.get_yticks() + elif self.spine_type in ('top','bottom'): + datalim_low,datalim_high = self.axes.dataLim.intervalx + ticks = self.axes.get_xticks() + # handle inverted limits + ticks = list(ticks) + ticks.sort() + ticks = np.array(ticks) + if datalim_low > datalim_high: + datalim_low, datalim_high = datalim_high, datalim_low + + if datalim_low < viewlim_low: + # Data extends past view. Clip line to view. + low = viewlim_low + else: + # Data ends before view ends. + cond = (ticks <= datalim_low) & (ticks >= viewlim_low) + tickvals = ticks[cond] + if len(tickvals): + # A tick is less than or equal to lowest data point. + low = tickvals[-1] + else: + # No tick is available + low = datalim_low + low = max(low,viewlim_low) + + if datalim_high > viewlim_high: + # Data extends past view. Clip line to view. + high = viewlim_high + else: + # Data ends before view ends. + cond = (ticks >= datalim_high) & (ticks <= viewlim_high) + tickvals = ticks[cond] + if len(tickvals): + # A tick is greater than or equal to highest data point. + high = tickvals[0] + else: + # No tick is available + high = datalim_high + high = min(high,viewlim_high) + + else: + low,high = self._bounds + + v1 = self._path.vertices[:] # copy + assert v1.shape == (2,2), 'unexpected vertices shape' + if self.spine_type in ['left','right']: + v1[0,1] = low + v1[1,1] = high + elif self.spine_type in ['bottom','top']: + v1[0,0] = low + v1[1,0] = high + else: + raise ValueError('unable to set bounds for spine "%s"'%spine_type) + self._path.vertices = v1 # replace + + @allow_rasterization + def draw(self, renderer): + self._adjust_location() + return super( Spine, self).draw(renderer) + def _calc_offset_transform(self): """calculate the offset transform performed by the spine""" self._ensure_position_is_set() @@ -228,9 +356,9 @@ t = self.get_spine_transform() if self.spine_type in ['left','right']: t2 = mtransforms.blended_transform_factory(t, - self.axes.transAxes) + self.axes.transData) elif self.spine_type in ['bottom','top']: - t2 = mtransforms.blended_transform_factory(self.axes.transAxes, + t2 = mtransforms.blended_transform_factory(self.axes.transData, t) self.set_transform(t2) @@ -249,14 +377,12 @@ if what == 'data': # special case data based spine locations + data_xform = self.axes.transScale + \ + (how+self.axes.transLimits + self.axes.transAxes) if self.spine_type in ['left','right']: - data_xform = self.axes.transScale + \ - (how+self.axes.transLimits + self.axes.transAxes) result = mtransforms.blended_transform_factory( data_xform,self.axes.transData) elif self.spine_type in ['top','bottom']: - data_xform = self.axes.transScale + \ - (how+self.axes.transLimits + self.axes.transAxes) result = mtransforms.blended_transform_factory( self.axes.transData,data_xform) else: @@ -279,19 +405,31 @@ else: raise ValueError("unknown spine_transform type: %s"%what) + def set_bounds( self, low, high ): + """Set the bounds of the spine.""" + if self.spine_type == 'circle': + raise ValueError( + 'set_bounds() method incompatible with circular spines') + self._bounds = (low, high) + + def get_bounds( self ): + """Get the bounds of the spine.""" + return self._bounds + @classmethod def linear_spine(cls, axes, spine_type, **kwargs): """ (staticmethod) Returns a linear :class:`Spine`. """ + # all values of 13 get replaced upon call to set_bounds() if spine_type=='left': - path = mpath.Path([(0.0, 0.0), (0.0, 1.0)]) + path = mpath.Path([(0.0, 13), (0.0, 13)]) elif spine_type=='right': - path = mpath.Path([(1.0, 0.0), (1.0, 1.0)]) + path = mpath.Path([(1.0, 13), (1.0, 13)]) elif spine_type=='bottom': - path = mpath.Path([(0.0, 0.0), (1.0, 0.0)]) + path = mpath.Path([(13, 0.0), (13, 0.0)]) elif spine_type=='top': - path = mpath.Path([(0.0, 1.0), (1.0, 1.0)]) + path = mpath.Path([(13, 1.0), (13, 1.0)]) else: raise ValueError('unable to make path for spine "%s"'%spine_type) result = cls(axes,spine_type,path,**kwargs) diff -Nru matplotlib-0.99.3/lib/matplotlib/table.py matplotlib-1.0.1/lib/matplotlib/table.py --- matplotlib-0.99.3/lib/matplotlib/table.py 2009-07-31 15:14:41.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/table.py 2010-07-07 01:41:52.000000000 +0000 @@ -26,6 +26,7 @@ from artist import Artist, allow_rasterization from patches import Rectangle from cbook import is_string_like +from matplotlib import docstring from text import Text from transforms import Bbox @@ -539,4 +540,4 @@ return table -artist.kwdocd['Table'] = artist.kwdoc(Table) +docstring.interpd.update(Table=artist.kwdoc(Table)) diff -Nru matplotlib-0.99.3/lib/matplotlib/testing/compare.py matplotlib-1.0.1/lib/matplotlib/testing/compare.py --- matplotlib-0.99.3/lib/matplotlib/testing/compare.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/testing/compare.py 2010-07-07 01:41:51.000000000 +0000 @@ -0,0 +1,257 @@ +#======================================================================= +""" A set of utilities for comparing results. +""" +#======================================================================= + +import matplotlib +from matplotlib.testing.noseclasses import ImageComparisonFailure +import math +import operator +import os +import numpy as np +import shutil +import subprocess +import sys + +#======================================================================= + +__all__ = [ + 'compare_float', + 'compare_images', + 'comparable_formats', + ] + +#----------------------------------------------------------------------- +def compare_float( expected, actual, relTol = None, absTol = None ): + """Fail if the floating point values are not close enough, with + the givem message. + + You can specify a relative tolerance, absolute tolerance, or both. + """ + if relTol is None and absTol is None: + exMsg = "You haven't specified a 'relTol' relative tolerance " + exMsg += "or a 'absTol' absolute tolerance function argument. " + exMsg += "You must specify one." + raise ValueError, exMsg + + msg = "" + + if absTol is not None: + absDiff = abs( expected - actual ) + if absTol < absDiff: + expectedStr = str( expected ) + actualStr = str( actual ) + absDiffStr = str( absDiff ) + absTolStr = str( absTol ) + + msg += "\n" + msg += " Expected: " + expectedStr + "\n" + msg += " Actual: " + actualStr + "\n" + msg += " Abs Diff: " + absDiffStr + "\n" + msg += " Abs Tol: " + absTolStr + "\n" + + if relTol is not None: + # The relative difference of the two values. If the expected value is + # zero, then return the absolute value of the difference. + relDiff = abs( expected - actual ) + if expected: + relDiff = relDiff / abs( expected ) + + if relTol < relDiff: + + # The relative difference is a ratio, so it's always unitless. + relDiffStr = str( relDiff ) + relTolStr = str( relTol ) + + expectedStr = str( expected ) + actualStr = str( actual ) + + msg += "\n" + msg += " Expected: " + expectedStr + "\n" + msg += " Actual: " + actualStr + "\n" + msg += " Rel Diff: " + relDiffStr + "\n" + msg += " Rel Tol: " + relTolStr + "\n" + + if msg: + return msg + else: + return None + +#----------------------------------------------------------------------- +# A dictionary that maps filename extensions to functions that map +# parameters old and new to a list that can be passed to Popen to +# convert files with that extension to png format. +converter = { } + +if matplotlib.checkdep_ghostscript() is not None: + # FIXME: make checkdep_ghostscript return the command + if sys.platform == 'win32': + gs = 'gswin32c' + else: + gs = 'gs' + cmd = lambda old, new: \ + [gs, '-q', '-sDEVICE=png16m', '-dNOPAUSE', '-dBATCH', + '-sOutputFile=' + new, old] + converter['pdf'] = cmd + converter['eps'] = cmd + +if matplotlib.checkdep_inkscape() is not None: + cmd = lambda old, new: \ + ['inkscape', old, '--export-png=' + new] + converter['svg'] = cmd + +def comparable_formats(): + '''Returns the list of file formats that compare_images can compare + on this system.''' + return ['png'] + converter.keys() + +def convert(filename): + ''' + Convert the named file into a png file. + Returns the name of the created file. + ''' + base, extension = filename.rsplit('.', 1) + if extension not in converter: + raise ImageComparisonFailure, "Don't know how to convert %s files to png" % extension + newname = base + '_' + extension + '.png' + if not os.path.exists(filename): + raise IOError, "'%s' does not exist" % filename + cmd = converter[extension](filename, newname) + pipe = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + stdout, stderr = pipe.communicate() + errcode = pipe.wait() + if not os.path.exists(newname) or errcode: + msg = "Conversion command failed:\n%s\n" % ' '.join(cmd) + if stdout: + msg += "Standard output:\n%s\n" % stdout + if stderr: + msg += "Standard error:\n%s\n" % stderr + raise IOError, msg + return newname + +verifiers = { } + +def verify(filename): + """ + Verify the file through some sort of verification tool. + """ + if not os.path.exists(filename): + raise IOError, "'%s' does not exist" % filename + base, extension = filename.rsplit('.', 1) + verifier = verifiers.get(extension, None) + if verifier is not None: + cmd = verifier(filename) + pipe = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + stdout, stderr = pipe.communicate() + errcode = pipe.wait() + if errcode != 0: + msg = "File verification command failed:\n%s\n" % ' '.join(cmd) + if stdout: + msg += "Standard output:\n%s\n" % stdout + if stderr: + msg += "Standard error:\n%s\n" % stderr + raise IOError, msg + +# Turning this off, because it seems to cause multiprocessing issues +if matplotlib.checkdep_xmllint() and False: + verifiers['svg'] = lambda filename: [ + 'xmllint', '--valid', '--nowarning', '--noout', filename] + +def compare_images( expected, actual, tol, in_decorator=False ): + '''Compare two image files - not the greatest, but fast and good enough. + + = EXAMPLE + + # img1 = "./baseline/plot.png" + # img2 = "./output/plot.png" + # + # compare_images( img1, img2, 0.001 ): + + = INPUT VARIABLES + - expected The filename of the expected image. + - actual The filename of the actual image. + - tol The tolerance (a unitless float). This is used to + determine the 'fuzziness' to use when comparing images. + - in_decorator If called from image_comparison decorator, this should be + True. (default=False) + ''' + + try: + from PIL import Image, ImageOps, ImageFilter + except ImportError, e: + msg = "Image Comparison requires the Python Imaging Library to " \ + "be installed. To run tests without using PIL, then use " \ + "the '--without-tag=PIL' command-line option.\n" \ + "Importing PIL failed with the following error:\n%s" % e + if in_decorator: + raise NotImplementedError, e + else: + return msg + + verify(actual) + + # Convert the image to png + extension = expected.split('.')[-1] + if extension != 'png': + actual, expected = convert(actual), convert(expected) + + # open the image files and remove the alpha channel (if it exists) + expectedImage = Image.open( expected ).convert("RGB") + actualImage = Image.open( actual ).convert("RGB") + + # normalize the images + expectedImage = ImageOps.autocontrast( expectedImage, 2 ) + actualImage = ImageOps.autocontrast( actualImage, 2 ) + + # compare the resulting image histogram functions + h1 = expectedImage.histogram() + h2 = actualImage.histogram() + rms = math.sqrt( reduce(operator.add, map(lambda a,b: (a-b)**2, h1, h2)) / len(h1) ) + + diff_image = os.path.join(os.path.dirname(actual), + 'failed-diff-'+os.path.basename(actual)) + expected_copy = 'expected-'+os.path.basename(actual) + + if ( (rms / 10000.0) <= tol ): + if os.path.exists(diff_image): + os.unlink(diff_image) + if os.path.exists(expected_copy): + os.unlink(expected_copy) + return None + + save_diff_image( expected, actual, diff_image ) + + if in_decorator: + shutil.copyfile( expected, expected_copy ) + results = dict( + rms = rms, + expected = str(expected), + actual = str(actual), + diff = str(diff_image), + ) + return results + else: + # expected_copy is only for in_decorator case + if os.path.exists(expected_copy): + os.unlink(expected_copy) + # old-style call from mplTest directory + msg = " Error: Image files did not match.\n" \ + " RMS Value: " + str( rms / 10000.0 ) + "\n" \ + " Expected:\n " + str( expected ) + "\n" \ + " Actual:\n " + str( actual ) + "\n" \ + " Difference:\n " + str( diff_image ) + "\n" \ + " Tolerance: " + str( tol ) + "\n" + return msg + +def save_diff_image( expected, actual, output ): + from PIL import Image + expectedImage = np.array(Image.open( expected ).convert("RGB")).astype(np.float) + actualImage = np.array(Image.open( actual ).convert("RGB")).astype(np.float) + assert expectedImage.ndim==expectedImage.ndim + assert expectedImage.shape==expectedImage.shape + absDiffImage = abs(expectedImage-actualImage) + # expand differences in luminance domain + absDiffImage *= 10 + save_image_np = np.clip(absDiffImage,0,255).astype(np.uint8) + save_image = Image.fromarray(save_image_np) + save_image.save(output) diff -Nru matplotlib-0.99.3/lib/matplotlib/testing/decorators.py matplotlib-1.0.1/lib/matplotlib/testing/decorators.py --- matplotlib-0.99.3/lib/matplotlib/testing/decorators.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/testing/decorators.py 2010-07-07 01:41:51.000000000 +0000 @@ -0,0 +1,159 @@ +from matplotlib.testing.noseclasses import KnownFailureTest, \ + KnownFailureDidNotFailTest, ImageComparisonFailure +import os, sys, shutil +import nose +import matplotlib +import matplotlib.tests +import numpy as np +from matplotlib.testing.compare import comparable_formats, compare_images + +def knownfailureif(fail_condition, msg=None, known_exception_class=None ): + """ + + Assume a will fail if *fail_condition* is True. *fail_condition* + may also be False or the string 'indeterminate'. + + *msg* is the error message displayed for the test. + + If *known_exception_class* is not None, the failure is only known + if the exception is an instance of this class. (Default = None) + + """ + # based on numpy.testing.dec.knownfailureif + if msg is None: + msg = 'Test known to fail' + def known_fail_decorator(f): + # Local import to avoid a hard nose dependency and only incur the + # import time overhead at actual test-time. + import nose + def failer(*args, **kwargs): + try: + # Always run the test (to generate images). + result = f(*args, **kwargs) + except Exception, err: + if fail_condition: + if known_exception_class is not None: + if not isinstance(err,known_exception_class): + # This is not the expected exception + raise + # (Keep the next ultra-long comment so in shows in console.) + raise KnownFailureTest(msg) # An error here when running nose means that you don't have the matplotlib.testing.noseclasses:KnownFailure plugin in use. + else: + raise + if fail_condition and fail_condition != 'indeterminate': + raise KnownFailureDidNotFailTest(msg) + return result + return nose.tools.make_decorator(f)(failer) + return known_fail_decorator + +def image_comparison(baseline_images=None,extensions=None,tol=1e-3): + """ + call signature:: + + image_comparison(baseline_images=['my_figure'], extensions=None) + + Compare images generated by the test with those specified in + *baseline_images*, which must correspond else an + ImageComparisonFailure exception will be raised. + + Keyword arguments: + + *baseline_images*: list + A list of strings specifying the names of the images generated + by calls to :meth:`matplotlib.figure.savefig`. + + *extensions*: [ None | list ] + + If *None*, default to all supported extensions. + + Otherwise, a list of extensions to test. For example ['png','pdf']. + """ + + if baseline_images is None: + raise ValueError('baseline_images must be specified') + + if extensions is None: + # default extensions to test + extensions = ['png', 'pdf', 'svg'] + + # The multiple layers of defs are required because of how + # parameterized decorators work, and because we want to turn the + # single test_foo function to a generator that generates a + # separate test case for each file format. + def compare_images_decorator(func): + baseline_dir, result_dir = _image_directories(func) + + def compare_images_generator(): + for extension in extensions: + orig_expected_fnames = [os.path.join(baseline_dir,fname) + '.' + extension for fname in baseline_images] + expected_fnames = [os.path.join(result_dir,'expected-'+fname) + '.' + extension for fname in baseline_images] + for src,dst in zip( orig_expected_fnames, expected_fnames ): + shutil.copyfile(src,dst) + actual_fnames = [os.path.join(result_dir, fname) + '.' + extension for fname in baseline_images] + have_baseline_images = [os.path.exists(expected) for expected in expected_fnames] + have_baseline_image = np.all(have_baseline_images) + is_comparable = extension in comparable_formats() + if not is_comparable: + fail_msg = 'Cannot compare %s files on this system' % extension + elif not have_baseline_image: + fail_msg = 'Do not have baseline images %s' % expected_fnames + else: + fail_msg = 'No failure expected' + will_fail = not (is_comparable and have_baseline_image) + @knownfailureif(will_fail, fail_msg, + known_exception_class=ImageComparisonFailure ) + def decorated_compare_images(): + # set the default format of savefig + matplotlib.rc('savefig', extension=extension) + # change to the result directory for the duration of the test + old_dir = os.getcwd() + os.chdir(result_dir) + try: + result = func() # actually call the test function + finally: + os.chdir(old_dir) + for actual,expected in zip(actual_fnames,expected_fnames): + if not os.path.exists(expected): + raise ImageComparisonFailure( + 'image does not exist: %s'%expected) + + # compare the images + err = compare_images( expected, actual, tol, + in_decorator=True ) + if err: + raise ImageComparisonFailure( + 'images not close: %(actual)s vs. %(expected)s ' + '(RMS %(rms).3f)'%err) + return result + yield (decorated_compare_images,) + return nose.tools.make_decorator(func)(compare_images_generator) + return compare_images_decorator + +def _image_directories(func): + """ + Compute the baseline and result image directories for testing *func*. + Create the result directory if it doesn't exist. + """ + module_name = func.__module__ + if module_name=='__main__': + # FIXME: this won't work for nested packages in matplotlib.tests + import warnings + warnings.warn('test module run as script. guessing baseline image locations') + script_name = sys.argv[0] + basedir = os.path.abspath(os.path.dirname(script_name)) + subdir = os.path.splitext(os.path.split(script_name)[1])[0] + else: + mods = module_name.split('.') + assert mods.pop(0)=='matplotlib' + assert mods.pop(0)=='tests' + subdir = os.path.join(*mods) + basedir = os.path.dirname(matplotlib.tests.__file__) + + baseline_dir = os.path.join(basedir,'baseline_images',subdir) + result_dir = os.path.abspath(os.path.join('result_images',subdir)) + + if not os.path.exists(result_dir): + os.makedirs(result_dir) + + return baseline_dir, result_dir + diff -Nru matplotlib-0.99.3/lib/matplotlib/testing/jpl_units/Duration.py matplotlib-1.0.1/lib/matplotlib/testing/jpl_units/Duration.py --- matplotlib-0.99.3/lib/matplotlib/testing/jpl_units/Duration.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/testing/jpl_units/Duration.py 2010-07-07 01:41:51.000000000 +0000 @@ -0,0 +1,203 @@ +#=========================================================================== +# +# Duration +# +#=========================================================================== + +"""Duration module.""" + +#=========================================================================== +# Place all imports after here. +# +# +# Place all imports before here. +#=========================================================================== + +#=========================================================================== +class Duration: + """Class Duration in development. + """ + allowed = [ "ET", "UTC" ] + + #----------------------------------------------------------------------- + def __init__( self, frame, seconds ): + """Create a new Duration object. + + = ERROR CONDITIONS + - If the input frame is not in the allowed list, an error is thrown. + + = INPUT VARIABLES + - frame The frame of the duration. Must be 'ET' or 'UTC' + - seconds The number of seconds in the Duration. + """ + if frame not in self.allowed: + msg = "Input frame '%s' is not one of the supported frames of %s" \ + % ( frame, str( self.allowed ) ) + raise ValueError( msg ) + + self._frame = frame + self._seconds = seconds + + #----------------------------------------------------------------------- + def frame( self ): + """Return the frame the duration is in.""" + return self._frame + + #----------------------------------------------------------------------- + def __abs__( self ): + """Return the absolute value of the duration.""" + return Duration( self._frame, abs( self._seconds ) ) + + #----------------------------------------------------------------------- + def __neg__( self ): + """Return the negative value of this Duration.""" + return Duration( self._frame, -self._seconds ) + + #----------------------------------------------------------------------- + def seconds( self ): + """Return the number of seconds in the Duration.""" + return self._seconds + + #----------------------------------------------------------------------- + def __nonzero__( self ): + """Compare two Durations. + + = INPUT VARIABLES + - rhs The Duration to compare against. + + = RETURN VALUE + - Returns -1 if self < rhs, 0 if self == rhs, +1 if self > rhs. + """ + return self._seconds != 0 + + #----------------------------------------------------------------------- + def __cmp__( self, rhs ): + """Compare two Durations. + + = ERROR CONDITIONS + - If the input rhs is not in the same frame, an error is thrown. + + = INPUT VARIABLES + - rhs The Duration to compare against. + + = RETURN VALUE + - Returns -1 if self < rhs, 0 if self == rhs, +1 if self > rhs. + """ + self.checkSameFrame( rhs, "compare" ) + return cmp( self._seconds, rhs._seconds ) + + #----------------------------------------------------------------------- + def __add__( self, rhs ): + """Add two Durations. + + = ERROR CONDITIONS + - If the input rhs is not in the same frame, an error is thrown. + + = INPUT VARIABLES + - rhs The Duration to add. + + = RETURN VALUE + - Returns the sum of ourselves and the input Duration. + """ + # Delay-load due to circular dependencies. + import matplotlib.testing.jpl_units as U + + if isinstance( rhs, U.Epoch ): + return rhs + self + + self.checkSameFrame( rhs, "add" ) + return Duration( self._frame, self._seconds + rhs._seconds ) + + #----------------------------------------------------------------------- + def __sub__( self, rhs ): + """Subtract two Durations. + + = ERROR CONDITIONS + - If the input rhs is not in the same frame, an error is thrown. + + = INPUT VARIABLES + - rhs The Duration to subtract. + + = RETURN VALUE + - Returns the difference of ourselves and the input Duration. + """ + self.checkSameFrame( rhs, "sub" ) + return Duration( self._frame, self._seconds - rhs._seconds ) + + #----------------------------------------------------------------------- + def __mul__( self, rhs ): + """Scale a UnitDbl by a value. + + = INPUT VARIABLES + - rhs The scalar to multiply by. + + = RETURN VALUE + - Returns the scaled Duration. + """ + return Duration( self._frame, self._seconds * float( rhs ) ) + + #----------------------------------------------------------------------- + def __rmul__( self, lhs ): + """Scale a Duration by a value. + + = INPUT VARIABLES + - lhs The scalar to multiply by. + + = RETURN VALUE + - Returns the scaled Duration. + """ + return Duration( self._frame, self._seconds * float( lhs ) ) + + #----------------------------------------------------------------------- + def __div__( self, rhs ): + """Divide a Duration by a value. + + = INPUT VARIABLES + - rhs The scalar to divide by. + + = RETURN VALUE + - Returns the scaled Duration. + """ + return Duration( self._frame, self._seconds / float( rhs ) ) + + #----------------------------------------------------------------------- + def __rdiv__( self, rhs ): + """Divide a Duration by a value. + + = INPUT VARIABLES + - rhs The scalar to divide by. + + = RETURN VALUE + - Returns the scaled Duration. + """ + return Duration( self._frame, float( rhs ) / self._seconds ) + + #----------------------------------------------------------------------- + def __str__( self ): + """Print the Duration.""" + return "%g %s" % ( self._seconds, self._frame ) + + #----------------------------------------------------------------------- + def __repr__( self ): + """Print the Duration.""" + return "Duration( '%s', %g )" % ( self._frame, self._seconds ) + + #----------------------------------------------------------------------- + def checkSameFrame( self, rhs, func ): + """Check to see if frames are the same. + + = ERROR CONDITIONS + - If the frame of the rhs Duration is not the same as our frame, + an error is thrown. + + = INPUT VARIABLES + - rhs The Duration to check for the same frame + - func The name of the function doing the check. + """ + if self._frame != rhs._frame: + msg = "Cannot %s Duration's with different frames.\n" \ + "LHS: %s\n" \ + "RHS: %s" % ( func, self._frame, rhs._frame ) + raise ValueError( msg ) + +#=========================================================================== diff -Nru matplotlib-0.99.3/lib/matplotlib/testing/jpl_units/EpochConverter.py matplotlib-1.0.1/lib/matplotlib/testing/jpl_units/EpochConverter.py --- matplotlib-0.99.3/lib/matplotlib/testing/jpl_units/EpochConverter.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/testing/jpl_units/EpochConverter.py 2010-07-07 01:41:51.000000000 +0000 @@ -0,0 +1,160 @@ +#=========================================================================== +# +# EpochConverter +# +#=========================================================================== + +"""EpochConverter module containing class EpochConverter.""" + +#=========================================================================== +# Place all imports after here. +# +import matplotlib.units as units +import matplotlib.dates as date_ticker +from matplotlib.cbook import iterable +# +# Place all imports before here. +#=========================================================================== + +__all__ = [ 'EpochConverter' ] + +#=========================================================================== +class EpochConverter( units.ConversionInterface ): + """: A matplotlib converter class. Provides matplotlib conversion + functionality for Monte Epoch and Duration classes. + """ + + # julian date reference for "Jan 1, 0001" minus 1 day because + # matplotlib really wants "Jan 0, 0001" + jdRef = 1721425.5 - 1 + + #------------------------------------------------------------------------ + @staticmethod + def axisinfo( unit, axis ): + """: Returns information on how to handle an axis that has Epoch data. + + = INPUT VARIABLES + - unit The units to use for a axis with Epoch data. + + = RETURN VALUE + - Returns a matplotlib AxisInfo data structure that contains + minor/major formatters, major/minor locators, and default + label information. + """ + + majloc = date_ticker.AutoDateLocator() + majfmt = date_ticker.AutoDateFormatter( majloc ) + + return units.AxisInfo( majloc = majloc, + majfmt = majfmt, + label = unit ) + + #------------------------------------------------------------------------ + @staticmethod + def float2epoch( value, unit ): + """: Convert a matplotlib floating-point date into an Epoch of the + specified units. + + = INPUT VARIABLES + - value The matplotlib floating-point date. + - unit The unit system to use for the Epoch. + + = RETURN VALUE + - Returns the value converted to an Epoch in the sepcified time system. + """ + # Delay-load due to circular dependencies. + import matplotlib.testing.jpl_units as U + + secPastRef = value * 86400.0 * U.UnitDbl( 1.0, 'sec' ) + return U.Epoch( unit, secPastRef, EpochConverter.jdRef ) + + #------------------------------------------------------------------------ + @staticmethod + def epoch2float( value, unit ): + """: Convert an Epoch value to a float suitible for plotting as a + python datetime object. + + = INPUT VARIABLES + - value An Epoch or list of Epochs that need to be converted. + - unit The units to use for an axis with Epoch data. + + = RETURN VALUE + - Returns the value parameter converted to floats. + """ + return value.julianDate( unit ) - EpochConverter.jdRef + + #------------------------------------------------------------------------ + @staticmethod + def duration2float( value ): + """: Convert a Duration value to a float suitible for plotting as a + python datetime object. + + = INPUT VARIABLES + - value A Duration or list of Durations that need to be converted. + + = RETURN VALUE + - Returns the value parameter converted to floats. + """ + return value.days() + + #------------------------------------------------------------------------ + @staticmethod + def convert( value, unit, axis ): + """: Convert value using unit to a float. If value is a sequence, return + the converted sequence. + + = INPUT VARIABLES + - value The value or list of values that need to be converted. + - unit The units to use for an axis with Epoch data. + + = RETURN VALUE + - Returns the value parameter converted to floats. + """ + # Delay-load due to circular dependencies. + import matplotlib.testing.jpl_units as U + + isNotEpoch = True + isDuration = False + + if ( iterable(value) and not isinstance(value, str) ): + if ( len(value) == 0 ): + return [] + else: + return [ EpochConverter.convert( x, unit, axis ) for x in value ] + + if ( isinstance(value, U.Epoch) ): + isNotEpoch = False + elif ( isinstance(value, U.Duration) ): + isDuration = True + + if ( isNotEpoch and not isDuration and + units.ConversionInterface.is_numlike( value ) ): + return value + + if ( unit == None ): + unit = EpochConverter.default_units( value, axis ) + + if ( isDuration ): + return EpochConverter.duration2float( value ) + else: + return EpochConverter.epoch2float( value, unit ) + + #------------------------------------------------------------------------ + @staticmethod + def default_units( value, axis ): + """: Return the default unit for value, or None. + + = INPUT VARIABLES + - value The value or list of values that need units. + + = RETURN VALUE + - Returns the default units to use for value. + """ + frame = None + if ( iterable(value) and not isinstance(value, str) ): + return EpochConverter.default_units( value[0], axis ) + else: + frame = value.frame() + + return frame + diff -Nru matplotlib-0.99.3/lib/matplotlib/testing/jpl_units/Epoch.py matplotlib-1.0.1/lib/matplotlib/testing/jpl_units/Epoch.py --- matplotlib-0.99.3/lib/matplotlib/testing/jpl_units/Epoch.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/testing/jpl_units/Epoch.py 2010-07-07 01:41:51.000000000 +0000 @@ -0,0 +1,232 @@ +#=========================================================================== +# +# Epoch +# +#=========================================================================== + +"""Epoch module.""" + +#=========================================================================== +# Place all imports after here. +# +import math +import datetime as DT +from matplotlib.dates import date2num +# +# Place all imports before here. +#=========================================================================== + +#=========================================================================== +class Epoch: + # Frame conversion offsets in seconds + # t(TO) = t(FROM) + allowed[ FROM ][ TO ] + allowed = { + "ET" : { + "UTC" : +64.1839, + }, + "UTC" : { + "ET" : -64.1839, + }, + } + + #----------------------------------------------------------------------- + def __init__( self, frame, sec=None, jd=None, daynum=None, dt=None ): + """Create a new Epoch object. + + Build an epoch 1 of 2 ways: + + Using seconds past a Julian date: + # Epoch( 'ET', sec=1e8, jd=2451545 ) + + or using a matplotlib day number + # Epoch( 'ET', daynum=730119.5 ) + + + = ERROR CONDITIONS + - If the input units are not in the allowed list, an error is thrown. + + = INPUT VARIABLES + - frame The frame of the epoch. Must be 'ET' or 'UTC' + - sec The number of seconds past the input JD. + - jd The Julian date of the epoch. + - daynum The matplotlib day number of the epoch. + - dt A python datetime instance. + """ + if ( ( sec is None and jd is not None ) or + ( sec is not None and jd is None ) or + ( daynum is not None and ( sec is not None or jd is not None ) ) or + ( daynum is None and dt is None and ( sec is None or jd is None ) ) or + ( daynum is not None and dt is not None ) or + ( dt is not None and ( sec is not None or jd is not None ) ) or + ( (dt is not None) and not isinstance(dt, DT.datetime) ) ): + msg = "Invalid inputs. Must enter sec and jd together, " \ + "daynum by itself, or dt (must be a python datetime).\n" \ + "Sec = %s\nJD = %s\ndnum= %s\ndt = %s" \ + % ( str( sec ), str( jd ), str( daynum ), str( dt ) ) + raise ValueError( msg ) + + if frame not in self.allowed: + msg = "Input frame '%s' is not one of the supported frames of %s" \ + % ( frame, str( self.allowed.keys() ) ) + raise ValueError( msg ) + + self._frame = frame + + if dt is not None: + daynum = date2num( dt ) + + if daynum is not None: + # 1-JAN-0001 in JD = 1721425.5 + jd = float( daynum ) + 1721425.5 + self._jd = math.floor( jd ) + self._seconds = ( jd - self._jd ) * 86400.0 + + else: + self._seconds = float( sec ) + self._jd = float( jd ) + + # Resolve seconds down to [ 0, 86400 ) + deltaDays = int( math.floor( self._seconds / 86400.0 ) ) + self._jd += deltaDays + self._seconds -= deltaDays * 86400.0 + + #----------------------------------------------------------------------- + def convert( self, frame ): + if self._frame == frame: + return self + + offset = self.allowed[ self._frame ][ frame ] + + return Epoch( frame, self._seconds + offset, self._jd ) + + #----------------------------------------------------------------------- + def frame( self ): + return self._frame + + #----------------------------------------------------------------------- + def julianDate( self, frame ): + t = self + if frame != self._frame: + t = self.convert( frame ) + + return t._jd + t._seconds / 86400.0 + + #----------------------------------------------------------------------- + def secondsPast( self, frame, jd ): + t = self + if frame != self._frame: + t = self.convert( frame ) + + delta = t._jd - jd + return t._seconds + delta * 86400 + + #----------------------------------------------------------------------- + def __cmp__( self, rhs ): + """Compare two Epoch's. + + = INPUT VARIABLES + - rhs The Epoch to compare against. + + = RETURN VALUE + - Returns -1 if self < rhs, 0 if self == rhs, +1 if self > rhs. + """ + t = self + if self._frame != rhs._frame: + t = self.convert( rhs._frame ) + + if t._jd != rhs._jd: + return cmp( t._jd, rhs._jd ) + + return cmp( t._seconds, rhs._seconds ) + + #----------------------------------------------------------------------- + def __add__( self, rhs ): + """Add a duration to an Epoch. + + = INPUT VARIABLES + - rhs The Epoch to subtract. + + = RETURN VALUE + - Returns the difference of ourselves and the input Epoch. + """ + t = self + if self._frame != rhs.frame(): + t = self.convert( rhs._frame ) + + sec = t._seconds + rhs.seconds() + + return Epoch( t._frame, sec, t._jd ) + + #----------------------------------------------------------------------- + def __sub__( self, rhs ): + """Subtract two Epoch's or a Duration from an Epoch. + + Valid: + Duration = Epoch - Epoch + Epoch = Epoch - Duration + + = INPUT VARIABLES + - rhs The Epoch to subtract. + + = RETURN VALUE + - Returns either the duration between to Epoch's or the a new + Epoch that is the result of subtracting a duration from an epoch. + """ + # Delay-load due to circular dependencies. + import matplotlib.testing.jpl_units as U + + # Handle Epoch - Duration + if isinstance( rhs, U.Duration ): + return self + -rhs + + t = self + if self._frame != rhs._frame: + t = self.convert( rhs._frame ) + + days = t._jd - rhs._jd + sec = t._seconds - rhs._seconds + + return U.Duration( rhs._frame, days*86400 + sec ) + + #----------------------------------------------------------------------- + def __str__( self ): + """Print the Epoch.""" + return "%22.15e %s" % ( self.julianDate( self._frame ), self._frame ) + + #----------------------------------------------------------------------- + def __repr__( self ): + """Print the Epoch.""" + return str( self ) + + #----------------------------------------------------------------------- + def range( start, stop, step ): + """Generate a range of Epoch objects. + + Similar to the Python range() method. Returns the range [ + start, stop ) at the requested step. Each element will be a + Epoch object. + + = INPUT VARIABLES + - start The starting value of the range. + - stop The stop value of the range. + - step Step to use. + + = RETURN VALUE + - Returns a list contianing the requested Epoch values. + """ + elems = [] + + i = 0 + while True: + d = start + i * step + if d >= stop: + break + + elems.append( d ) + i += 1 + + return elems + + range = staticmethod( range ) + +#=========================================================================== diff -Nru matplotlib-0.99.3/lib/matplotlib/testing/jpl_units/__init__.py matplotlib-1.0.1/lib/matplotlib/testing/jpl_units/__init__.py --- matplotlib-0.99.3/lib/matplotlib/testing/jpl_units/__init__.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/testing/jpl_units/__init__.py 2010-07-07 01:41:51.000000000 +0000 @@ -0,0 +1,82 @@ +#======================================================================= +""" +This is a sample set of units for use with testing unit conversion +of matplotlib routines. These are used because they use very strict +enforcement of unitized data which will test the entire spectrum of how +unitized data might be used (it is not always meaningful to convert to +a float without specific units given). + +UnitDbl is essentially a unitized floating point number. It has a +minimal set of supported units (enough for testing purposes). All +of the mathematical operation are provided to fully test any behaviour +that might occur with unitized data. Remeber that unitized data has +rules as to how it can be applied to one another (a value of distance +cannot be added to a value of time). Thus we need to guard against any +accidental "default" conversion that will strip away the meaning of the +data and render it neutered. + +Epoch is different than a UnitDbl of time. Time is something that can be +measured where an Epoch is a specific moment in time. Epochs are typically +referenced as an offset from some predetermined epoch. + +A difference of two epochs is a Duration. The distinction between a +Duration and a UnitDbl of time is made because an Epoch can have different +frames (or units). In the case of our test Epoch class the two allowed +frames are 'UTC' and 'ET' (Note that these are rough estimates provided for +testing purposes and should not be used in production code where accuracy +of time frames is desired). As such a Duration also has a frame of +reference and therefore needs to be called out as different that a simple +measurement of time since a delta-t in one frame may not be the same in another. +""" + +#======================================================================= +from Duration import Duration +from Epoch import Epoch +from UnitDbl import UnitDbl + +from StrConverter import StrConverter +from EpochConverter import EpochConverter +from UnitDblConverter import UnitDblConverter + +from UnitDblFormatter import UnitDblFormatter + +#======================================================================= + +__version__ = "1.0" + +__all__ = [ + 'register', + 'Duration', + 'Epoch', + 'UnitDbl', + 'UnitDblFormatter', + ] + +#======================================================================= +def register(): + """Register the unit conversion classes with matplotlib.""" + import matplotlib.units as mplU + + mplU.registry[ str ] = StrConverter() + mplU.registry[ Epoch ] = EpochConverter() + mplU.registry[ UnitDbl ] = UnitDblConverter() + +#======================================================================= +# Some default unit instances + +# Distances +m = UnitDbl( 1.0, "m" ) +km = UnitDbl( 1.0, "km" ) +mile = UnitDbl( 1.0, "mile" ) + +# Angles +deg = UnitDbl( 1.0, "deg" ) +rad = UnitDbl( 1.0, "rad" ) + +# Time +sec = UnitDbl( 1.0, "sec" ) +min = UnitDbl( 1.0, "min" ) +hr = UnitDbl( 1.0, "hour" ) +day = UnitDbl( 24.0, "hour" ) +sec = UnitDbl( 1.0, "sec" ) + diff -Nru matplotlib-0.99.3/lib/matplotlib/testing/jpl_units/StrConverter.py matplotlib-1.0.1/lib/matplotlib/testing/jpl_units/StrConverter.py --- matplotlib-0.99.3/lib/matplotlib/testing/jpl_units/StrConverter.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/testing/jpl_units/StrConverter.py 2010-07-07 01:41:51.000000000 +0000 @@ -0,0 +1,158 @@ +#=========================================================================== +# +# StrConverter +# +#=========================================================================== + +"""StrConverter module containing class StrConverter.""" + +#=========================================================================== +# Place all imports after here. +# +import matplotlib.units as units +from matplotlib.cbook import iterable + +# Place all imports before here. +#=========================================================================== + +__all__ = [ 'StrConverter' ] + +#=========================================================================== +class StrConverter( units.ConversionInterface ): + """: A matplotlib converter class. Provides matplotlib conversion + functionality for string data values. + + Valid units for string are: + - 'indexed' : Values are indexed as they are specified for plotting. + - 'sorted' : Values are sorted alphanumerically. + - 'inverted' : Values are inverted so that the first value is on top. + - 'sorted-inverted' : A combination of 'sorted' and 'inverted' + """ + + #------------------------------------------------------------------------ + @staticmethod + def axisinfo( unit, axis ): + """: Returns information on how to handle an axis that has string data. + + = INPUT VARIABLES + - axis The axis using this converter. + - unit The units to use for a axis with string data. + + = RETURN VALUE + - Returns a matplotlib AxisInfo data structure that contains + minor/major formatters, major/minor locators, and default + label information. + """ + + return None + + #------------------------------------------------------------------------ + @staticmethod + def convert( value, unit, axis ): + """: Convert value using unit to a float. If value is a sequence, return + the converted sequence. + + = INPUT VARIABLES + - axis The axis using this converter. + - value The value or list of values that need to be converted. + - unit The units to use for a axis with Epoch data. + + = RETURN VALUE + - Returns the value parameter converted to floats. + """ + + if ( units.ConversionInterface.is_numlike( value ) ): + return value + + if ( value == [] ): + return [] + + # we delay loading to make matplotlib happy + ax = axis.axes + if axis is ax.get_xaxis(): + isXAxis = True + else: + isXAxis = False + + axis.get_major_ticks() + ticks = axis.get_ticklocs() + labels = axis.get_ticklabels() + + labels = [ l.get_text() for l in labels if l.get_text() ] + + if ( not labels ): + ticks = [] + labels = [] + + + if ( not iterable( value ) ): + value = [ value ] + + newValues = [] + for v in value: + if ( (v not in labels) and (v not in newValues) ): + newValues.append( v ) + + for v in newValues: + if ( labels ): + labels.append( v ) + else: + labels = [ v ] + + #DISABLED: This is disabled because matplotlib bar plots do not + #DISABLED: recalculate the unit conversion of the data values + #DISABLED: this is due to design and is not really a bug. + #DISABLED: If this gets changed, then we can activate the following + #DISABLED: block of code. Note that this works for line plots. + #DISABLED if ( unit ): + #DISABLED if ( unit.find( "sorted" ) > -1 ): + #DISABLED labels.sort() + #DISABLED if ( unit.find( "inverted" ) > -1 ): + #DISABLED labels = labels[ ::-1 ] + + # add padding (so they do not appear on the axes themselves) + labels = [ '' ] + labels + [ '' ] + ticks = range( len(labels) ) + ticks[0] = 0.5 + ticks[-1] = ticks[-1] - 0.5 + + axis.set_ticks( ticks ) + axis.set_ticklabels( labels ) + # we have to do the following lines to make ax.autoscale_view work + loc = axis.get_major_locator() + loc.set_bounds( ticks[0], ticks[-1] ) + + if ( isXAxis ): + ax.set_xlim( ticks[0], ticks[-1] ) + else: + ax.set_ylim( ticks[0], ticks[-1] ) + + result = [] + for v in value: + # If v is not in labels then something went wrong with adding new + # labels to the list of old labels. + errmsg = "This is due to a logic error in the StrConverter class. " + errmsg += "Please report this error and its message in bugzilla." + assert ( v in labels ), errmsg + result.append( ticks[ labels.index(v) ] ) + + ax.viewLim.ignore(-1) + return result + + #------------------------------------------------------------------------ + @staticmethod + def default_units( value, axis ): + """: Return the default unit for value, or None. + + = INPUT VARIABLES + - axis The axis using this converter. + - value The value or list of values that need units. + + = RETURN VALUE + - Returns the default units to use for value. + Return the default unit for value, or None. + """ + + # The default behavior for string indexing. + return "indexed" + diff -Nru matplotlib-0.99.3/lib/matplotlib/testing/jpl_units/UnitDblConverter.py matplotlib-1.0.1/lib/matplotlib/testing/jpl_units/UnitDblConverter.py --- matplotlib-0.99.3/lib/matplotlib/testing/jpl_units/UnitDblConverter.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/testing/jpl_units/UnitDblConverter.py 2010-07-07 01:41:51.000000000 +0000 @@ -0,0 +1,159 @@ +#=========================================================================== +# +# UnitDblConverter +# +#=========================================================================== + +"""UnitDblConverter module containing class UnitDblConverter.""" + +#=========================================================================== +# Place all imports after here. +# +import numpy as np +import matplotlib.units as units +import matplotlib.ticker as ticker +import matplotlib.projections.polar as polar +from matplotlib.cbook import iterable +# +# Place all imports before here. +#=========================================================================== + +__all__ = [ 'UnitDblConverter' ] + +#=========================================================================== + +# A special function for use with the matplotlib FuncFormatter class +# for formatting axes with radian units. +# This was copied from matplotlib example code. +def rad_fn(x, pos = None ): + """Radian function formatter.""" + n = int((x / np.pi) * 2.0 + 0.25) + if n == 0: + return str(x) + elif n == 1: + return r'$\pi/2$' + elif n == 2: + return r'$\pi$' + elif n % 2 == 0: + return r'$%s\pi$' % (n/2,) + else: + return r'$%s\pi/2$' % (n,) + +#=========================================================================== +class UnitDblConverter( units.ConversionInterface ): + """: A matplotlib converter class. Provides matplotlib conversion + functionality for the Monte UnitDbl class. + """ + + # default for plotting + defaults = { + "distance" : 'km', + "angle" : 'deg', + "time" : 'sec', + } + + #------------------------------------------------------------------------ + @staticmethod + def axisinfo( unit, axis ): + """: Returns information on how to handle an axis that has Epoch data. + + = INPUT VARIABLES + - unit The units to use for a axis with Epoch data. + + = RETURN VALUE + - Returns a matplotlib AxisInfo data structure that contains + minor/major formatters, major/minor locators, and default + label information. + """ + # Delay-load due to circular dependencies. + import matplotlib.testing.jpl_units as U + + # Check to see if the value used for units is a string unit value + # or an actual instance of a UnitDbl so that we can use the unit + # value for the default axis label value. + if ( unit ): + if ( isinstance( unit, str ) ): + label = unit + else: + label = unit.label() + else: + label = None + + if ( label == "rad" ): + # If the axis units are in radians, then use a special function for + # applying format control. + majfmt = ticker.FuncFormatter( rad_fn ) + elif ( label == "deg" ) and isinstance( axis.axes, polar.PolarAxes ): + # If we want degrees for a polar plot, use the PolarPlotFormatter + majfmt = polar.PolarAxes.ThetaFormatter() + else: + majfmt = U.UnitDblFormatter( useOffset = False ) + + return units.AxisInfo( majfmt = majfmt, label = label ) + + #------------------------------------------------------------------------ + @staticmethod + def convert( value, unit, axis ): + """: Convert value using unit to a float. If value is a sequence, return + the converted sequence. + + = INPUT VARIABLES + - value The value or list of values that need to be converted. + - unit The units to use for a axis with Epoch data. + + = RETURN VALUE + - Returns the value parameter converted to floats. + """ + # Delay-load due to circular dependencies. + import matplotlib.testing.jpl_units as U + + isNotUnitDbl = True + + if ( iterable(value) and not isinstance(value, str) ): + if ( len(value) == 0 ): + return [] + else: + return [ UnitDblConverter.convert( x, unit, axis ) for x in value ] + + # We need to check to see if the incoming value is actually a UnitDbl and + # set a flag. If we get an empty list, then just return an empty list. + if ( isinstance(value, U.UnitDbl) ): + isNotUnitDbl = False + + # If the incoming value behaves like a number, but is not a UnitDbl, + # then just return it because we don't know how to convert it + # (or it is already converted) + if ( isNotUnitDbl and units.ConversionInterface.is_numlike( value ) ): + return value + + # If no units were specified, then get the default units to use. + if ( unit == None ): + unit = UnitDblConverter.default_units( value, axis ) + + # Convert the incoming UnitDbl value/values to float/floats + if isinstance( axis.axes, polar.PolarAxes ) and (value.type() == "angle"): + # Guarantee that units are radians for polar plots. + return value.convert( "rad" ) + + return value.convert( unit ) + + #------------------------------------------------------------------------ + @staticmethod + def default_units( value, axis ): + """: Return the default unit for value, or None. + + = INPUT VARIABLES + - value The value or list of values that need units. + + = RETURN VALUE + - Returns the default units to use for value. + Return the default unit for value, or None. + """ + + # Determine the default units based on the user preferences set for + # default units when printing a UnitDbl. + if ( iterable(value) and not isinstance(value, str) ): + return UnitDblConverter.default_units( value[0], axis ) + else: + return UnitDblConverter.defaults[ value.type() ] + diff -Nru matplotlib-0.99.3/lib/matplotlib/testing/jpl_units/UnitDblFormatter.py matplotlib-1.0.1/lib/matplotlib/testing/jpl_units/UnitDblFormatter.py --- matplotlib-0.99.3/lib/matplotlib/testing/jpl_units/UnitDblFormatter.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/testing/jpl_units/UnitDblFormatter.py 2010-07-07 01:41:51.000000000 +0000 @@ -0,0 +1,41 @@ +#=========================================================================== +# +# UnitDblFormatter +# +#=========================================================================== + +"""UnitDblFormatter module containing class UnitDblFormatter.""" + +#=========================================================================== +# Place all imports after here. +# +import matplotlib.ticker as ticker +# +# Place all imports before here. +#=========================================================================== + +__all__ = [ 'UnitDblFormatter' ] + +#=========================================================================== +class UnitDblFormatter( ticker.ScalarFormatter ): + """The formatter for UnitDbl data types. This allows for formatting + with the unit string. + """ + def __init__( self, *args, **kwargs ): + 'The arguments are identical to matplotlib.ticker.ScalarFormatter.' + ticker.ScalarFormatter.__init__( self, *args, **kwargs ) + + def __call__( self, x, pos = None ): + 'Return the format for tick val x at position pos' + if len(self.locs) == 0: + return '' + else: + return str(x) + + def format_data_short( self, value ): + "Return the value formatted in 'short' format." + return str(value) + + def format_data( self, value ): + "Return the value formatted into a string." + return str(value) diff -Nru matplotlib-0.99.3/lib/matplotlib/testing/jpl_units/UnitDbl.py matplotlib-1.0.1/lib/matplotlib/testing/jpl_units/UnitDbl.py --- matplotlib-0.99.3/lib/matplotlib/testing/jpl_units/UnitDbl.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/testing/jpl_units/UnitDbl.py 2010-07-07 01:41:51.000000000 +0000 @@ -0,0 +1,287 @@ +#=========================================================================== +# +# UnitDbl +# +#=========================================================================== + +"""UnitDbl module.""" + +#=========================================================================== +# Place all imports after here. +# + +# +# Place all imports before here. +#=========================================================================== + + +#=========================================================================== +class UnitDbl: + """Class UnitDbl in development. + """ + #----------------------------------------------------------------------- + # Unit conversion table. Small subset of the full one but enough + # to test the required functions. First field is a scale factor to + # convert the input units to the units of the second field. Only + # units in this table are allowed. + allowed = { + "m" : ( 0.001, "km" ), + "km" : ( 1, "km" ), + "mile" : ( 1.609344, "km" ), + + "rad" : ( 1, "rad" ), + "deg" : ( 1.745329251994330e-02, "rad" ), + + "sec" : ( 1, "sec" ), + "min" : ( 60.0, "sec" ), + "hour" : ( 3600, "sec" ), + } + + _types = { + "km" : "distance", + "rad" : "angle", + "sec" : "time", + } + + #----------------------------------------------------------------------- + def __init__( self, value, units ): + """Create a new UnitDbl object. + + Units are internally converted to km, rad, and sec. The only + valid inputs for units are [ m, km, mile, rad, deg, sec, min, hour ]. + + The field UnitDbl.value will contain the converted value. Use + the convert() method to get a specific type of units back. + + = ERROR CONDITIONS + - If the input units are not in the allowed list, an error is thrown. + + = INPUT VARIABLES + - value The numeric value of the UnitDbl. + - units The string name of the units the value is in. + """ + self.checkUnits( units ) + + data = self.allowed[ units ] + self._value = float( value * data[0] ) + self._units = data[1] + + #----------------------------------------------------------------------- + def convert( self, units ): + """Convert the UnitDbl to a specific set of units. + + = ERROR CONDITIONS + - If the input units are not in the allowed list, an error is thrown. + + = INPUT VARIABLES + - units The string name of the units to convert to. + + = RETURN VALUE + - Returns the value of the UnitDbl in the requested units as a floating + point number. + """ + if self._units == units: + return self._value + + self.checkUnits( units ) + + data = self.allowed[ units ] + if self._units != data[1]: + msg = "Error trying to convert to different units.\n" \ + " Invalid conversion requested.\n" \ + " UnitDbl: %s\n" \ + " Units: %s\n" % ( str( self ), units ) + raise ValueError( msg ) + + return self._value / data[0] + + #----------------------------------------------------------------------- + def __abs__( self ): + """Return the absolute value of this UnitDbl.""" + return UnitDbl( abs( self._value ), self._units ) + + #----------------------------------------------------------------------- + def __neg__( self ): + """Return the negative value of this UnitDbl.""" + return UnitDbl( -self._value, self._units ) + + #----------------------------------------------------------------------- + def __nonzero__( self ): + """Test a UnitDbl for a non-zero value. + + = RETURN VALUE + - Returns true if the value is non-zero. + """ + return self._value.__nonzero__() + + #----------------------------------------------------------------------- + def __cmp__( self, rhs ): + """Compare two UnitDbl's. + + = ERROR CONDITIONS + - If the input rhs units are not the same as our units, + an error is thrown. + + = INPUT VARIABLES + - rhs The UnitDbl to compare against. + + = RETURN VALUE + - Returns -1 if self < rhs, 0 if self == rhs, +1 if self > rhs. + """ + self.checkSameUnits( rhs, "compare" ) + return cmp( self._value, rhs._value ) + + #----------------------------------------------------------------------- + def __add__( self, rhs ): + """Add two UnitDbl's. + + = ERROR CONDITIONS + - If the input rhs units are not the same as our units, + an error is thrown. + + = INPUT VARIABLES + - rhs The UnitDbl to add. + + = RETURN VALUE + - Returns the sum of ourselves and the input UnitDbl. + """ + self.checkSameUnits( rhs, "add" ) + return UnitDbl( self._value + rhs._value, self._units ) + + #----------------------------------------------------------------------- + def __sub__( self, rhs ): + """Subtract two UnitDbl's. + + = ERROR CONDITIONS + - If the input rhs units are not the same as our units, + an error is thrown. + + = INPUT VARIABLES + - rhs The UnitDbl to subtract. + + = RETURN VALUE + - Returns the difference of ourselves and the input UnitDbl. + """ + self.checkSameUnits( rhs, "subtract" ) + return UnitDbl( self._value - rhs._value, self._units ) + + #----------------------------------------------------------------------- + def __mul__( self, rhs ): + """Scale a UnitDbl by a value. + + = INPUT VARIABLES + - rhs The scalar to multiply by. + + = RETURN VALUE + - Returns the scaled UnitDbl. + """ + return UnitDbl( self._value * rhs, self._units ) + + #----------------------------------------------------------------------- + def __rmul__( self, lhs ): + """Scale a UnitDbl by a value. + + = INPUT VARIABLES + - lhs The scalar to multiply by. + + = RETURN VALUE + - Returns the scaled UnitDbl. + """ + return UnitDbl( self._value * lhs, self._units ) + + #----------------------------------------------------------------------- + def __div__( self, rhs ): + """Divide a UnitDbl by a value. + + = INPUT VARIABLES + - rhs The scalar to divide by. + + = RETURN VALUE + - Returns the scaled UnitDbl. + """ + return UnitDbl( self._value / rhs, self._units ) + + #----------------------------------------------------------------------- + def __str__( self ): + """Print the UnitDbl.""" + return "%g *%s" % ( self._value, self._units ) + + #----------------------------------------------------------------------- + def __repr__( self ): + """Print the UnitDbl.""" + return "UnitDbl( %g, '%s' )" % ( self._value, self._units ) + + #----------------------------------------------------------------------- + def type( self ): + """Return the type of UnitDbl data.""" + return self._types[ self._units ] + + #----------------------------------------------------------------------- + def range( start, stop, step=None ): + """Generate a range of UnitDbl objects. + + Similar to the Python range() method. Returns the range [ + start, stop ) at the requested step. Each element will be a + UnitDbl object. + + = INPUT VARIABLES + - start The starting value of the range. + - stop The stop value of the range. + - step Optional step to use. If set to None, then a UnitDbl of + value 1 w/ the units of the start is used. + + = RETURN VALUE + - Returns a list contianing the requested UnitDbl values. + """ + if step is None: + step = UnitDbl( 1, start._units ) + + elems = [] + + i = 0 + while True: + d = start + i * step + if d >= stop: + break + + elems.append( d ) + i += 1 + + return elems + + range = staticmethod( range ) + + #----------------------------------------------------------------------- + def checkUnits( self, units ): + """Check to see if some units are valid. + + = ERROR CONDITIONS + - If the input units are not in the allowed list, an error is thrown. + + = INPUT VARIABLES + - units The string name of the units to check. + """ + if units not in self.allowed.keys(): + msg = "Input units '%s' are not one of the supported types of %s" \ + % ( units, str( self.allowed.keys() ) ) + raise ValueError( msg ) + + #----------------------------------------------------------------------- + def checkSameUnits( self, rhs, func ): + """Check to see if units are the same. + + = ERROR CONDITIONS + - If the units of the rhs UnitDbl are not the same as our units, + an error is thrown. + + = INPUT VARIABLES + - rhs The UnitDbl to check for the same units + - func The name of the function doing the check. + """ + if self._units != rhs._units: + msg = "Cannot %s units of different types.\n" \ + "LHS: %s\n" \ + "RHS: %s" % ( func, self._units, rhs._units ) + raise ValueError( msg ) + +#=========================================================================== diff -Nru matplotlib-0.99.3/lib/matplotlib/testing/noseclasses.py matplotlib-1.0.1/lib/matplotlib/testing/noseclasses.py --- matplotlib-0.99.3/lib/matplotlib/testing/noseclasses.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/testing/noseclasses.py 2010-07-07 01:41:51.000000000 +0000 @@ -0,0 +1,55 @@ +import os +from nose.plugins.errorclass import ErrorClass, ErrorClassPlugin + +class KnownFailureTest(Exception): + '''Raise this exception to mark a test as a known failing test.''' + pass + +class KnownFailureDidNotFailTest(Exception): + '''Raise this exception to mark a test should have failed but did not.''' + pass + +class ImageComparisonFailure(Exception): + '''Raise this exception to mark a test as a comparison between two images.''' + +class KnownFailure(ErrorClassPlugin): + '''Plugin that installs a KNOWNFAIL error class for the + KnownFailureClass exception. When KnownFailureTest is raised, + the exception will be logged in the knownfail attribute of the + result, 'K' or 'KNOWNFAIL' (verbose) will be output, and the + exception will not be counted as an error or failure. + + This is based on numpy.testing.noseclasses.KnownFailure. + ''' + enabled = True + knownfail = ErrorClass(KnownFailureTest, + label='KNOWNFAIL', + isfailure=False) + + def options(self, parser, env=os.environ): + env_opt = 'NOSE_WITHOUT_KNOWNFAIL' + parser.add_option('--no-knownfail', action='store_true', + dest='noKnownFail', default=env.get(env_opt, False), + help='Disable special handling of KnownFailureTest ' + 'exceptions') + + def configure(self, options, conf): + if not self.can_configure: + return + self.conf = conf + disable = getattr(options, 'noKnownFail', False) + if disable: + self.enabled = False + + def addError( self, test, err, *zero_nine_capt_args ): + # Fixme (Really weird): if I don't leave empty method here, + # nose gets confused and KnownFails become testing errors when + # using the MplNosePlugin and MplTestCase. + + # The *zero_nine_capt_args captures an extra argument. There + # seems to be a bug in + # nose.testing.manager.ZeroNinePlugin.addError() in which a + # 3rd positional argument ("capt") is passed to the plugin's + # addError() method, even if one is not explicitly using the + # ZeroNinePlugin. + pass Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/axhspan_epoch.pdf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/axhspan_epoch.pdf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/axhspan_epoch.png and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/axhspan_epoch.png differ diff -Nru matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/axhspan_epoch.svg matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/axhspan_epoch.svg --- matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/axhspan_epoch.svg 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/axhspan_epoch.svg 2010-07-07 01:41:50.000000000 +0000 @@ -0,0 +1,322 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/axvspan_epoch.pdf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/axvspan_epoch.pdf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/axvspan_epoch.png and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/axvspan_epoch.png differ diff -Nru matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/axvspan_epoch.svg matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/axvspan_epoch.svg --- matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/axvspan_epoch.svg 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/axvspan_epoch.svg 2010-07-07 01:41:50.000000000 +0000 @@ -0,0 +1,318 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/const_xy.pdf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/const_xy.pdf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/const_xy.png and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/const_xy.png differ diff -Nru matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/const_xy.svg matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/const_xy.svg --- matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/const_xy.svg 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/const_xy.svg 2010-07-07 01:41:50.000000000 +0000 @@ -0,0 +1,872 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/fill_between_interpolate.pdf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/fill_between_interpolate.pdf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/fill_between_interpolate.png and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/fill_between_interpolate.png differ diff -Nru matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/fill_between_interpolate.svg matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/fill_between_interpolate.svg --- matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/fill_between_interpolate.svg 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/fill_between_interpolate.svg 2010-07-07 01:41:50.000000000 +0000 @@ -0,0 +1,763 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/fill_units.pdf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/fill_units.pdf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/fill_units.png and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/fill_units.png differ diff -Nru matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/fill_units.svg matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/fill_units.svg --- matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/fill_units.svg 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/fill_units.svg 2010-07-07 01:41:50.000000000 +0000 @@ -0,0 +1,1600 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_001.pdf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_001.pdf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_001.png and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_001.png differ diff -Nru matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_001.svg matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_001.svg --- matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_001.svg 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_001.svg 2010-07-07 01:41:50.000000000 +0000 @@ -0,0 +1,266 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_002.pdf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_002.pdf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_002.png and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_002.png differ diff -Nru matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_002.svg matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_002.svg --- matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_002.svg 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_002.svg 2010-07-07 01:41:50.000000000 +0000 @@ -0,0 +1,407 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_003.pdf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_003.pdf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_003.png and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_003.png differ diff -Nru matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_003.svg matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_003.svg --- matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_003.svg 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_003.svg 2010-07-07 01:41:50.000000000 +0000 @@ -0,0 +1,407 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_004.pdf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_004.pdf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_004.png and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_004.png differ diff -Nru matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_004.svg matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_004.svg --- matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_004.svg 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_004.svg 2010-07-07 01:41:50.000000000 +0000 @@ -0,0 +1,371 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_005.pdf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_005.pdf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_005.png and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_005.png differ diff -Nru matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_005.svg matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_005.svg --- matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_005.svg 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_005.svg 2010-07-07 01:41:50.000000000 +0000 @@ -0,0 +1,373 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/hexbin_extent.pdf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/hexbin_extent.pdf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/hexbin_extent.png and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/hexbin_extent.png differ diff -Nru matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/hexbin_extent.svg matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/hexbin_extent.svg --- matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/hexbin_extent.svg 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/hexbin_extent.svg 2010-11-09 13:28:22.000000000 +0000 @@ -0,0 +1,34927 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/imshow_clip.pdf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/imshow_clip.pdf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/imshow_clip.png and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/imshow_clip.png differ diff -Nru matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/imshow_clip.svg matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/imshow_clip.svg --- matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/imshow_clip.svg 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/imshow_clip.svg 2010-08-03 14:22:40.000000000 +0000 @@ -0,0 +1,1353 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/imshow.pdf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/imshow.pdf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/imshow.png and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/imshow.png differ diff -Nru matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/imshow.svg matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/imshow.svg --- matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/imshow.svg 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/imshow.svg 2010-08-03 14:22:41.000000000 +0000 @@ -0,0 +1,1191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/nonfinite_limits.pdf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/nonfinite_limits.pdf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/nonfinite_limits.png and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/nonfinite_limits.png differ diff -Nru matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/nonfinite_limits.svg matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/nonfinite_limits.svg --- matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/nonfinite_limits.svg 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/nonfinite_limits.svg 2010-07-07 01:41:50.000000000 +0000 @@ -0,0 +1,284 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/offset_points.pdf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/offset_points.pdf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/offset_points.png and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/offset_points.png differ diff -Nru matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/offset_points.svg matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/offset_points.svg --- matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/offset_points.svg 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/offset_points.svg 2010-07-07 01:41:50.000000000 +0000 @@ -0,0 +1,343 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/pcolormesh.pdf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/pcolormesh.pdf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/pcolormesh.png and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/pcolormesh.png differ diff -Nru matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/pcolormesh.svg matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/pcolormesh.svg --- matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/pcolormesh.svg 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/pcolormesh.svg 2010-08-03 14:22:41.000000000 +0000 @@ -0,0 +1,1624 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/polar_axes.pdf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/polar_axes.pdf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/polar_axes.png and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/polar_axes.png differ diff -Nru matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/polar_axes.svg matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/polar_axes.svg --- matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/polar_axes.svg 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/polar_axes.svg 2010-07-07 01:41:50.000000000 +0000 @@ -0,0 +1,622 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/polar_coords.pdf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/polar_coords.pdf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/polar_coords.png and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/polar_coords.png differ diff -Nru matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/polar_coords.svg matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/polar_coords.svg --- matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/polar_coords.svg 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/polar_coords.svg 2010-07-07 01:41:50.000000000 +0000 @@ -0,0 +1,347 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/polar_rmin.pdf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/polar_rmin.pdf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/polar_rmin.png and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/polar_rmin.png differ diff -Nru matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/polar_rmin.svg matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/polar_rmin.svg --- matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/polar_rmin.svg 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/polar_rmin.svg 2010-08-25 16:53:11.000000000 +0000 @@ -0,0 +1,706 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/polar_units.pdf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/polar_units.pdf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/polar_units.png and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/polar_units.png differ diff -Nru matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/polar_units.svg matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/polar_units.svg --- matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/polar_units.svg 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/polar_units.svg 2010-07-07 01:41:50.000000000 +0000 @@ -0,0 +1,481 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/polar_wrap_180.pdf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/polar_wrap_180.pdf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/polar_wrap_180.png and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/polar_wrap_180.png differ diff -Nru matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/polar_wrap_180.svg matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/polar_wrap_180.svg --- matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/polar_wrap_180.svg 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/polar_wrap_180.svg 2010-07-07 01:41:50.000000000 +0000 @@ -0,0 +1,425 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/polar_wrap_360.pdf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/polar_wrap_360.pdf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/polar_wrap_360.png and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/polar_wrap_360.png differ diff -Nru matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/polar_wrap_360.svg matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/polar_wrap_360.svg --- matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/polar_wrap_360.svg 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/polar_wrap_360.svg 2010-07-07 01:41:50.000000000 +0000 @@ -0,0 +1,430 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/polycollection_joinstyle.pdf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/polycollection_joinstyle.pdf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/polycollection_joinstyle.png and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/polycollection_joinstyle.png differ diff -Nru matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/polycollection_joinstyle.svg matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/polycollection_joinstyle.svg --- matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/polycollection_joinstyle.svg 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/polycollection_joinstyle.svg 2010-07-07 01:41:50.000000000 +0000 @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/shaped_data.pdf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/shaped_data.pdf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/shaped_data.png and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/shaped_data.png differ diff -Nru matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/shaped_data.svg matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/shaped_data.svg --- matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/shaped_data.svg 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/shaped_data.svg 2010-07-07 01:41:50.000000000 +0000 @@ -0,0 +1,1072 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/single_date.pdf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/single_date.pdf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/single_date.png and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/single_date.png differ diff -Nru matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/single_date.svg matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/single_date.svg --- matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/single_date.svg 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/single_date.svg 2010-07-07 01:41:50.000000000 +0000 @@ -0,0 +1,685 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/single_point.pdf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/single_point.pdf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/single_point.png and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/single_point.png differ diff -Nru matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/single_point.svg matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/single_point.svg --- matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/single_point.svg 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/single_point.svg 2010-07-07 01:41:50.000000000 +0000 @@ -0,0 +1,562 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/symlog.pdf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/symlog.pdf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/symlog.png and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/symlog.png differ diff -Nru matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/symlog.svg matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/symlog.svg --- matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_axes/symlog.svg 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_axes/symlog.svg 2010-11-04 18:28:10.000000000 +0000 @@ -0,0 +1,518 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_dates/date_axhline.pdf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_dates/date_axhline.pdf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_dates/date_axhline.png and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_dates/date_axhline.png differ diff -Nru matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_dates/date_axhline.svg matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_dates/date_axhline.svg --- matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_dates/date_axhline.svg 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_dates/date_axhline.svg 2010-07-07 01:41:51.000000000 +0000 @@ -0,0 +1,362 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_dates/date_axhspan.pdf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_dates/date_axhspan.pdf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_dates/date_axhspan.png and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_dates/date_axhspan.png differ diff -Nru matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_dates/date_axhspan.svg matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_dates/date_axhspan.svg --- matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_dates/date_axhspan.svg 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_dates/date_axhspan.svg 2010-07-07 01:41:51.000000000 +0000 @@ -0,0 +1,305 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_dates/date_axvline.pdf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_dates/date_axvline.pdf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_dates/date_axvline.png and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_dates/date_axvline.png differ diff -Nru matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_dates/date_axvline.svg matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_dates/date_axvline.svg --- matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_dates/date_axvline.svg 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_dates/date_axvline.svg 2010-07-07 01:41:51.000000000 +0000 @@ -0,0 +1,297 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_dates/date_axvspan.pdf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_dates/date_axvspan.pdf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_dates/date_axvspan.png and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_dates/date_axvspan.png differ diff -Nru matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_dates/date_axvspan.svg matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_dates/date_axvspan.svg --- matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_dates/date_axvspan.svg 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_dates/date_axvspan.svg 2010-07-07 01:41:51.000000000 +0000 @@ -0,0 +1,394 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_dates/date_empty.pdf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_dates/date_empty.pdf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_dates/date_empty.png and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_dates/date_empty.png differ diff -Nru matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_dates/date_empty.svg matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_dates/date_empty.svg --- matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_dates/date_empty.svg 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_dates/date_empty.svg 2010-07-07 01:41:51.000000000 +0000 @@ -0,0 +1,340 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_dates/DateFormatter_fractionalSeconds.pdf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_dates/DateFormatter_fractionalSeconds.pdf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_dates/DateFormatter_fractionalSeconds.png and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_dates/DateFormatter_fractionalSeconds.png differ diff -Nru matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_dates/DateFormatter_fractionalSeconds.svg matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_dates/DateFormatter_fractionalSeconds.svg --- matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_dates/DateFormatter_fractionalSeconds.svg 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_dates/DateFormatter_fractionalSeconds.svg 2010-07-07 01:41:51.000000000 +0000 @@ -0,0 +1,183 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_dates/RRuleLocator_bounds.pdf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_dates/RRuleLocator_bounds.pdf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_dates/RRuleLocator_bounds.png and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_dates/RRuleLocator_bounds.png differ diff -Nru matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_dates/RRuleLocator_bounds.svg matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_dates/RRuleLocator_bounds.svg --- matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_dates/RRuleLocator_bounds.svg 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_dates/RRuleLocator_bounds.svg 2010-07-07 01:41:51.000000000 +0000 @@ -0,0 +1,335 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_image/figimage-0.png and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_image/figimage-0.png differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_image/figimage-1.png and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_image/figimage-1.png differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_image/image_clip.pdf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_image/image_clip.pdf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_image/image_clip.png and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_image/image_clip.png differ diff -Nru matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_image/image_clip.svg matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_image/image_clip.svg --- matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_image/image_clip.svg 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_image/image_clip.svg 2010-08-03 14:22:41.000000000 +0000 @@ -0,0 +1,671 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_image/image_interps.pdf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_image/image_interps.pdf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_image/image_interps.png and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_image/image_interps.png differ diff -Nru matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_image/image_interps.svg matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_image/image_interps.svg --- matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_image/image_interps.svg 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_image/image_interps.svg 2010-08-03 14:22:41.000000000 +0000 @@ -0,0 +1,1008 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_image/imshow.pdf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_image/imshow.pdf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_image/imshow.png and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_image/imshow.png differ diff -Nru matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_image/imshow.svg matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_image/imshow.svg --- matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_image/imshow.svg 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_image/imshow.svg 2010-08-03 14:22:41.000000000 +0000 @@ -0,0 +1,395 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext.pdf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext.pdf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext.png and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext.png differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stix.pdf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stix.pdf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stix.png and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stix.png differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stixsans.pdf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stixsans.pdf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stixsans.png and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stixsans.png differ diff -Nru matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stixsans.svg matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stixsans.svg --- matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stixsans.svg 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stixsans.svg 2010-07-07 01:41:51.000000000 +0000 @@ -0,0 +1,1311 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stix.svg matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stix.svg --- matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stix.svg 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stix.svg 2010-07-07 01:41:51.000000000 +0000 @@ -0,0 +1,1312 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext.svg matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext.svg --- matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext.svg 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext.svg 2010-07-07 01:41:51.000000000 +0000 @@ -0,0 +1,1313 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_simplification/clipper_edge.pdf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_simplification/clipper_edge.pdf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_simplification/clipper_edge.png and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_simplification/clipper_edge.png differ diff -Nru matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_simplification/clipper_edge.svg matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_simplification/clipper_edge.svg --- matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_simplification/clipper_edge.svg 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_simplification/clipper_edge.svg 2010-07-07 01:41:51.000000000 +0000 @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_simplification/clipping_diamond.pdf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_simplification/clipping_diamond.pdf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_simplification/clipping_diamond.png and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_simplification/clipping_diamond.png differ diff -Nru matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_simplification/clipping_diamond.svg matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_simplification/clipping_diamond.svg --- matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_simplification/clipping_diamond.svg 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_simplification/clipping_diamond.svg 2010-07-07 01:41:51.000000000 +0000 @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_simplification/clipping.pdf matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_simplification/clipping.pdf --- matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_simplification/clipping.pdf 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_simplification/clipping.pdf 2010-07-07 01:41:51.000000000 +0000 @@ -0,0 +1,67 @@ +%PDF-1.4 +%¬Ü «º +1 0 obj +<< /Type /Catalog /Pages 3 0 R >> +endobj +2 0 obj +<< /CreationDate (D:20090927212543+03'00') +/Producer (matplotlib pdf backend) +/Creator (matplotlib 1.0.svn, http://matplotlib.sf.net) >> +endobj +9 0 obj +<< /XObject 8 0 R /Pattern 6 0 R +/ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /ExtGState 5 0 R +/Shading 7 0 R /Font 4 0 R >> +endobj +11 0 obj +<< /Contents 10 0 R /Type /Page /Resources 9 0 R /Parent 3 0 R +/MediaBox [ 0 0 576 432 ] >> +endobj +10 0 obj +<< /Filter /FlateDecode /Length 12 0 R >> +stream +xœmQKNÅ0 Üû>“lÙTb,8 ¡ 6ïú¸éÓ£}eÙO2c‡ñ‘ñ#Ï .è52Î#šJf凇ä]2› J6HÖ;Üȶb¾Úµ¬’´K7 +¼Ã÷­2‹•nN?oøŠ_iæ2ÄŸ'à^H;«z ¯Ã"w!—†âJnEYÜe•ænT<Šßlƒ4£jê=4à‚’ž¬´c5gF~2vªÒà$d\Iî„ÐK¥~/äÌ;!˜OPz|§ëÔc­ÛÆ–ã*“´Ûó¹ùÿwŸ‘0üô‘em +endstream +endobj +12 0 obj +229 +endobj +4 0 obj +<< >> +endobj +5 0 obj +<< >> +endobj +6 0 obj +<< >> +endobj +7 0 obj +<< >> +endobj +8 0 obj +<< >> +endobj +3 0 obj +<< /Count 1 /Kids [ 11 0 R ] /Type /Pages >> +endobj +xref +0 13 +0000000000 65535 f +0000000016 00000 n +0000000065 00000 n +0000000898 00000 n +0000000793 00000 n +0000000814 00000 n +0000000835 00000 n +0000000856 00000 n +0000000877 00000 n +0000000217 00000 n +0000000468 00000 n +0000000360 00000 n +0000000773 00000 n +trailer +<< /Info 2 0 R /Root 1 0 R /Size 13 >> +startxref +958 +%%EOF Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_simplification/clipping.png and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_simplification/clipping.png differ diff -Nru matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_simplification/clipping.svg matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_simplification/clipping.svg --- matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_simplification/clipping.svg 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_simplification/clipping.svg 2010-07-07 01:41:51.000000000 +0000 @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_simplification/fft_peaks.pdf matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_simplification/fft_peaks.pdf --- matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_simplification/fft_peaks.pdf 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_simplification/fft_peaks.pdf 2010-09-23 19:54:49.000000000 +0000 @@ -0,0 +1,67 @@ +%PDF-1.4 +%¬Ü «º +1 0 obj +<< /Type /Catalog /Pages 2 0 R >> +endobj +8 0 obj +<< /XObject 7 0 R /Pattern 5 0 R +/ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /ExtGState 4 0 R +/Shading 6 0 R /Font 3 0 R >> +endobj +10 0 obj +<< /Contents 9 0 R /Type /Page /Resources 8 0 R /Parent 2 0 R +/MediaBox [ 0 0 576 432 ] >> +endobj +9 0 obj +<< /Filter /FlateDecode /Length 11 0 R >> +stream +xœm’KnÜ0 †÷:O ˆor›M€ìÚ,r‚¶A1)lrýP²gÆ™ŽC¢?¾ý#ümO€ð§ÞÇ6`À¨[§u +SÝÆ~¾¶‡òù,û±9ÕÇNÓ£Ëfœvƒ#z”UNçëkûÝÞá%bÓM´|ü‚øW ÌģΟ—ìc>d(UÆ­#S¥SÇ­\ª×}ÖTQW˜Ši"œÚYA”‹’ŠÎ,¹‡ù0-hÙu¤+»…Ÿ±Z5v—ò°Ä˘”1ûÕ#*ßâvS¦Ìô۸ƩQ“zG¬5]Ç­U 3S¶Hh÷!Çm„ñH¬b°ãJ~˜:ƒxnSk' ³‘掠3†FK=G«^æº{q ´¦4×éìR«;¸G"(å0$r¦áêÈûÀqùíʦ±³'Ùêeå Š[Ünp{n?va-Mmb|û®Òr:Høx_éßÀUçõ¹}á8ªë +endstream +endobj +11 0 obj +356 +endobj +3 0 obj +<< >> +endobj +4 0 obj +<< >> +endobj +5 0 obj +<< >> +endobj +6 0 obj +<< >> +endobj +7 0 obj +<< >> +endobj +2 0 obj +<< /Count 1 /Kids [ 10 0 R ] /Type /Pages >> +endobj +12 0 obj +<< /CreationDate (D:20100908114845-04'00') +/Producer (matplotlib pdf backend r8292) +/Creator (matplotlib 1.0.0, http://matplotlib.sf.net) >> +endobj +xref +0 13 +0000000000 65535 f +0000000016 00000 n +0000000871 00000 n +0000000766 00000 n +0000000787 00000 n +0000000808 00000 n +0000000829 00000 n +0000000850 00000 n +0000000065 00000 n +0000000315 00000 n +0000000208 00000 n +0000000746 00000 n +0000000931 00000 n +trailer +<< /Info 12 0 R /Root 1 0 R /Size 13 >> +startxref +1088 +%%EOF Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_simplification/fft_peaks.png and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_simplification/fft_peaks.png differ diff -Nru matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_simplification/fft_peaks.svg matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_simplification/fft_peaks.svg --- matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_simplification/fft_peaks.svg 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_simplification/fft_peaks.svg 2010-09-23 19:54:49.000000000 +0000 @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_simplification/hatch_simplify.pdf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_simplification/hatch_simplify.pdf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_simplification/hatch_simplify.png and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_simplification/hatch_simplify.png differ diff -Nru matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_simplification/hatch_simplify.svg matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_simplification/hatch_simplify.svg --- matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_simplification/hatch_simplify.svg 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_simplification/hatch_simplify.svg 2010-07-07 01:41:51.000000000 +0000 @@ -0,0 +1,237 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_simplification/overflow.pdf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_simplification/overflow.pdf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_simplification/overflow.png and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_simplification/overflow.png differ diff -Nru matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_simplification/overflow.svg matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_simplification/overflow.svg --- matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_simplification/overflow.svg 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_simplification/overflow.svg 2010-07-07 01:41:51.000000000 +0000 @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_simplification/para_equal_perp.pdf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_simplification/para_equal_perp.pdf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_simplification/para_equal_perp.png and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_simplification/para_equal_perp.png differ diff -Nru matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_simplification/para_equal_perp.svg matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_simplification/para_equal_perp.svg --- matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_simplification/para_equal_perp.svg 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_simplification/para_equal_perp.svg 2010-09-23 19:54:49.000000000 +0000 @@ -0,0 +1,296 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_simplification/simplify_curve.pdf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_simplification/simplify_curve.pdf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_simplification/simplify_curve.png and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_simplification/simplify_curve.png differ diff -Nru matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_simplification/simplify_curve.svg matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_simplification/simplify_curve.svg --- matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_simplification/simplify_curve.svg 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_simplification/simplify_curve.svg 2010-07-07 01:41:51.000000000 +0000 @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_spines/spines_axes_positions.pdf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_spines/spines_axes_positions.pdf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_spines/spines_axes_positions.png and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_spines/spines_axes_positions.png differ diff -Nru matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_spines/spines_axes_positions.svg matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_spines/spines_axes_positions.svg --- matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_spines/spines_axes_positions.svg 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_spines/spines_axes_positions.svg 2010-07-07 01:41:51.000000000 +0000 @@ -0,0 +1,332 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_text/font_styles.pdf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_text/font_styles.pdf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_text/font_styles.png and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_text/font_styles.png differ diff -Nru matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_text/font_styles.svg matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_text/font_styles.svg --- matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_text/font_styles.svg 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_text/font_styles.svg 2010-07-07 01:41:51.000000000 +0000 @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_text/multiline.pdf and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_text/multiline.pdf differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_text/multiline.png and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_text/multiline.png differ diff -Nru matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_text/multiline.svg matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_text/multiline.svg --- matplotlib-0.99.3/lib/matplotlib/tests/baseline_images/test_text/multiline.svg 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tests/baseline_images/test_text/multiline.svg 2010-07-07 01:41:51.000000000 +0000 @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru matplotlib-0.99.3/lib/matplotlib/tests/__init__.py matplotlib-1.0.1/lib/matplotlib/tests/__init__.py --- matplotlib-0.99.3/lib/matplotlib/tests/__init__.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tests/__init__.py 2010-07-07 01:41:51.000000000 +0000 @@ -0,0 +1,13 @@ +from matplotlib import rcParams, rcdefaults, use + +_multiprocess_can_split_ = True + +def setup(): + use('Agg', warn=False) # use Agg backend for these tests + + # These settings *must* be hardcoded for running the comparison + # tests and are not necessarily the default values as specified in + # rcsetup.py + rcdefaults() # Start with all defaults + rcParams['font.family'] = 'Bitstream Vera Sans' + rcParams['text.hinting'] = False diff -Nru matplotlib-0.99.3/lib/matplotlib/tests/test_agg.py matplotlib-1.0.1/lib/matplotlib/tests/test_agg.py --- matplotlib-0.99.3/lib/matplotlib/tests/test_agg.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tests/test_agg.py 2010-07-07 01:41:51.000000000 +0000 @@ -0,0 +1,64 @@ +import os + +def report_memory(i): + pid = os.getpid() + a2 = os.popen('ps -p %d -o rss,sz' % pid).readlines() + print i, ' ', a2[1], + return int(a2[1].split()[0]) + +# This test is disabled -- it uses old API. -ADS 2009-09-07 +## def test_memleak(): +## """Test agg backend for memory leaks.""" +## from matplotlib.ft2font import FT2Font +## from numpy.random import rand +## from matplotlib.backend_bases import GraphicsContextBase +## from matplotlib.backends._backend_agg import RendererAgg + +## fontname = '/usr/local/share/matplotlib/Vera.ttf' + +## N = 200 +## for i in range( N ): +## gc = GraphicsContextBase() +## gc.set_clip_rectangle( [20, 20, 20, 20] ) +## o = RendererAgg( 400, 400, 72 ) + +## for j in range( 50 ): +## xs = [ 400*int(rand()) for k in range(8) ] +## ys = [ 400*int(rand()) for k in range(8) ] +## rgb = (1, 0, 0) +## pnts = zip( xs, ys ) +## o.draw_polygon( gc, rgb, pnts ) +## o.draw_polygon( gc, None, pnts ) + +## for j in range( 50 ): +## x = [ 400*int(rand()) for k in range(4) ] +## y = [ 400*int(rand()) for k in range(4) ] +## o.draw_lines( gc, x, y ) + +## for j in range( 50 ): +## args = [ 400*int(rand()) for k in range(4) ] +## rgb = (1, 0, 0) +## o.draw_rectangle( gc, rgb, *args ) + +## if 1: # add text +## font = FT2Font( fontname ) +## font.clear() +## font.set_text( 'hi mom', 60 ) +## font.set_size( 12, 72 ) +## o.draw_text_image( font.get_image(), 30, 40, gc ) + +## fname = "agg_memleak_%05d.png" +## o.write_png( fname % i ) +## val = report_memory( i ) +## if i==1: start = val + +## end = val +## avgMem = (end - start) / float(N) +## print 'Average memory consumed per loop: %1.4f\n' % (avgMem) + +## #TODO: Verify the expected mem usage and approximate tolerance that should be used +## #self.checkClose( 0.32, avgMem, absTol = 0.1 ) + +## # w/o text and w/o write_png: Average memory consumed per loop: 0.02 +## # w/o text and w/ write_png : Average memory consumed per loop: 0.3400 +## # w/ text and w/ write_png : Average memory consumed per loop: 0.32 diff -Nru matplotlib-0.99.3/lib/matplotlib/tests/test_axes.py matplotlib-1.0.1/lib/matplotlib/tests/test_axes.py --- matplotlib-0.99.3/lib/matplotlib/tests/test_axes.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tests/test_axes.py 2010-08-03 14:22:41.000000000 +0000 @@ -0,0 +1,509 @@ +import numpy as np +from numpy import ma +import matplotlib +from matplotlib.testing.decorators import image_comparison, knownfailureif +import matplotlib.pyplot as plt + + +@image_comparison(baseline_images=['formatter_ticker_001', + 'formatter_ticker_002', + 'formatter_ticker_003', + 'formatter_ticker_004', + 'formatter_ticker_005', + ]) +def test_formatter_ticker(): + import matplotlib.testing.jpl_units as units + units.register() + + # This essentially test to see if user specified labels get overwritten + # by the auto labeler functionality of the axes. + xdata = [ x*units.sec for x in range(10) ] + ydata1 = [ (1.5*y - 0.5)*units.km for y in range(10) ] + ydata2 = [ (1.75*y - 1.0)*units.km for y in range(10) ] + + fig = plt.figure() + ax = plt.subplot( 111 ) + ax.set_xlabel( "x-label 001" ) + fig.savefig( 'formatter_ticker_001' ) + + ax.plot( xdata, ydata1, color='blue', xunits="sec" ) + fig.savefig( 'formatter_ticker_002' ) + + ax.set_xlabel( "x-label 003" ) + fig.savefig( 'formatter_ticker_003' ) + + ax.plot( xdata, ydata2, color='green', xunits="hour" ) + ax.set_xlabel( "x-label 004" ) + fig.savefig( 'formatter_ticker_004' ) + + # See SF bug 2846058 + # https://sourceforge.net/tracker/?func=detail&aid=2846058&group_id=80706&atid=560720 + ax.set_xlabel( "x-label 005" ) + ax.autoscale_view() + fig.savefig( 'formatter_ticker_005' ) + +@image_comparison(baseline_images=['offset_points']) +def test_basic_annotate(): + # Setup some data + t = np.arange( 0.0, 5.0, 0.01 ) + s = np.cos( 2.0*np.pi * t ) + + # Offset Points + + fig = plt.figure() + ax = fig.add_subplot( 111, autoscale_on=False, xlim=(-1,5), ylim=(-3,5) ) + line, = ax.plot( t, s, lw=3, color='purple' ) + + ax.annotate( 'local max', xy=(3, 1), xycoords='data', + xytext=(3, 3), textcoords='offset points' ) + + fig.savefig( 'offset_points' ) + +@image_comparison(baseline_images=['polar_axes']) +def test_polar_annotations(): + # you can specify the xypoint and the xytext in different + # positions and coordinate systems, and optionally turn on a + # connecting line and mark the point with a marker. Annotations + # work on polar axes too. In the example below, the xy point is + # in native coordinates (xycoords defaults to 'data'). For a + # polar axes, this is in (theta, radius) space. The text in this + # example is placed in the fractional figure coordinate system. + # Text keyword args like horizontal and vertical alignment are + # respected + + # Setup some data + r = np.arange(0.0, 1.0, 0.001 ) + theta = 2.0 * 2.0 * np.pi * r + + fig = plt.figure() + ax = fig.add_subplot( 111, polar=True ) + line, = ax.plot( theta, r, color='#ee8d18', lw=3 ) + + ind = 800 + thisr, thistheta = r[ind], theta[ind] + ax.plot([thistheta], [thisr], 'o') + ax.annotate('a polar annotation', + xy=(thistheta, thisr), # theta, radius + xytext=(0.05, 0.05), # fraction, fraction + textcoords='figure fraction', + arrowprops=dict(facecolor='black', shrink=0.05), + horizontalalignment='left', + verticalalignment='baseline', + ) + + fig.savefig( 'polar_axes' ) + + #-------------------------------------------------------------------- +@image_comparison(baseline_images=['polar_coords']) +def test_polar_coord_annotations(): + # You can also use polar notation on a catesian axes. Here the + # native coordinate system ('data') is cartesian, so you need to + # specify the xycoords and textcoords as 'polar' if you want to + # use (theta, radius) + from matplotlib.patches import Ellipse + el = Ellipse((0,0), 10, 20, facecolor='r', alpha=0.5) + + fig = plt.figure() + ax = fig.add_subplot( 111, aspect='equal' ) + + ax.add_artist( el ) + el.set_clip_box( ax.bbox ) + + ax.annotate('the top', + xy=(np.pi/2., 10.), # theta, radius + xytext=(np.pi/3, 20.), # theta, radius + xycoords='polar', + textcoords='polar', + arrowprops=dict(facecolor='black', shrink=0.05), + horizontalalignment='left', + verticalalignment='baseline', + clip_on=True, # clip to the axes bounding box + ) + + ax.set_xlim( -20, 20 ) + ax.set_ylim( -20, 20 ) + fig.savefig( 'polar_coords' ) + +@image_comparison(baseline_images=['fill_units']) +def test_fill_units(): + from datetime import datetime + import matplotlib.testing.jpl_units as units + units.register() + + # generate some data + t = units.Epoch( "ET", dt=datetime(2009, 4, 27) ) + value = 10.0 * units.deg + day = units.Duration( "ET", 24.0 * 60.0 * 60.0 ) + + fig = plt.figure() + + # Top-Left + ax1 = fig.add_subplot( 221 ) + ax1.plot( [t], [value], yunits='deg', color='red' ) + ax1.fill( [733525.0, 733525.0, 733526.0, 733526.0], + [0.0, 0.0, 90.0, 0.0], 'b' ) + + # Top-Right + ax2 = fig.add_subplot( 222 ) + ax2.plot( [t], [value], yunits='deg', color='red' ) + ax2.fill( [t, t, t+day, t+day], + [0.0, 0.0, 90.0, 0.0], 'b' ) + + # Bottom-Left + ax3 = fig.add_subplot( 223 ) + ax3.plot( [t], [value], yunits='deg', color='red' ) + ax3.fill( [733525.0, 733525.0, 733526.0, 733526.0], + [0*units.deg, 0*units.deg, 90*units.deg, 0*units.deg], 'b' ) + + # Bottom-Right + ax4 = fig.add_subplot( 224 ) + ax4.plot( [t], [value], yunits='deg', color='red' ) + ax4.fill( [t, t, t+day, t+day], + [0*units.deg, 0*units.deg, 90*units.deg, 0*units.deg], + facecolor="blue" ) + + fig.autofmt_xdate() + fig.savefig( 'fill_units' ) + +@image_comparison(baseline_images=['single_point']) +def test_single_point(): + fig = plt.figure() + plt.subplot( 211 ) + plt.plot( [0], [0], 'o' ) + + plt.subplot( 212 ) + plt.plot( [1], [1], 'o' ) + + fig.savefig( 'single_point' ) + +@image_comparison(baseline_images=['single_date']) +def test_single_date(): + time1=[ 721964.0 ] + data1=[ -65.54 ] + + fig = plt.figure() + plt.subplot( 211 ) + plt.plot_date( time1, data1, 'o', color='r' ) + + plt.subplot( 212 ) + plt.plot( time1, data1, 'o', color='r' ) + + fig.savefig( 'single_date' ) + +@image_comparison(baseline_images=['shaped_data']) +def test_shaped_data(): + xdata = np.array([[ 0.53295185, 0.23052951, 0.19057629, 0.66724975, 0.96577916, + 0.73136095, 0.60823287, 0.017921 , 0.29744742, 0.27164665], + [ 0.2798012 , 0.25814229, 0.02818193, 0.12966456, 0.57446277, + 0.58167607, 0.71028245, 0.69112737, 0.89923072, 0.99072476], + [ 0.81218578, 0.80464528, 0.76071809, 0.85616314, 0.12757994, + 0.94324936, 0.73078663, 0.09658102, 0.60703967, 0.77664978], + [ 0.28332265, 0.81479711, 0.86985333, 0.43797066, 0.32540082, + 0.43819229, 0.92230363, 0.49414252, 0.68168256, 0.05922372], + [ 0.10721335, 0.93904142, 0.79163075, 0.73232848, 0.90283839, + 0.68408046, 0.25502302, 0.95976614, 0.59214115, 0.13663711], + [ 0.28087456, 0.33127607, 0.15530412, 0.76558121, 0.83389773, + 0.03735974, 0.98717738, 0.71432229, 0.54881366, 0.86893953], + [ 0.77995937, 0.995556 , 0.29688434, 0.15646162, 0.051848 , + 0.37161935, 0.12998491, 0.09377296, 0.36882507, 0.36583435], + [ 0.37851836, 0.05315792, 0.63144617, 0.25003433, 0.69586032, + 0.11393988, 0.92362096, 0.88045438, 0.93530252, 0.68275072], + [ 0.86486596, 0.83236675, 0.82960664, 0.5779663 , 0.25724233, + 0.84841095, 0.90862812, 0.64414887, 0.3565272 , 0.71026066], + [ 0.01383268, 0.3406093 , 0.76084285, 0.70800694, 0.87634056, + 0.08213693, 0.54655021, 0.98123181, 0.44080053, 0.86815815]]) + + y1 = np.arange( 10 ) + y1.shape = 1, 10 + + y2 = np.arange( 10 ) + y2.shape = 10, 1 + + fig = plt.figure() + plt.subplot( 411 ) + plt.plot( y1 ) + plt.subplot( 412 ) + plt.plot( y2 ) + + plt.subplot( 413 ) + from nose.tools import assert_raises + assert_raises(ValueError,plt.plot, (y1,y2)) + + plt.subplot( 414 ) + plt.plot( xdata[:,1], xdata[1,:], 'o' ) + + fig.savefig( 'shaped_data' ) + +@image_comparison(baseline_images=['const_xy']) +def test_const_xy(): + fig = plt.figure() + + plt.subplot( 311 ) + plt.plot( np.arange(10), np.ones( (10,) ) ) + + plt.subplot( 312 ) + plt.plot( np.ones( (10,) ), np.arange(10) ) + + plt.subplot( 313 ) + plt.plot( np.ones( (10,) ), np.ones( (10,) ), 'o' ) + + fig.savefig( 'const_xy' ) + +@image_comparison(baseline_images=['polar_wrap_180', + 'polar_wrap_360', + ]) +def test_polar_wrap(): + D2R = np.pi / 180.0 + + fig = plt.figure() + + #NOTE: resolution=1 really should be the default + plt.subplot( 111, polar=True, resolution=1 ) + plt.polar( [179*D2R, -179*D2R], [0.2, 0.1], "b.-" ) + plt.polar( [179*D2R, 181*D2R], [0.2, 0.1], "g.-" ) + plt.rgrids( [0.05, 0.1, 0.15, 0.2, 0.25, 0.3] ) + + fig.savefig( 'polar_wrap_180' ) + + fig = plt.figure() + + #NOTE: resolution=1 really should be the default + plt.subplot( 111, polar=True, resolution=1 ) + plt.polar( [2*D2R, -2*D2R], [0.2, 0.1], "b.-" ) + plt.polar( [2*D2R, 358*D2R], [0.2, 0.1], "g.-" ) + plt.polar( [358*D2R, 2*D2R], [0.2, 0.1], "r.-" ) + plt.rgrids( [0.05, 0.1, 0.15, 0.2, 0.25, 0.3] ) + + fig.savefig( 'polar_wrap_360' ) + +@image_comparison(baseline_images=['polar_units']) +def test_polar_units(): + import matplotlib.testing.jpl_units as units + units.register() + + pi = np.pi + deg = units.UnitDbl( 1.0, "deg" ) + + x1 = [ pi/6.0, pi/4.0, pi/3.0, pi/2.0 ] + x2 = [ 30.0*deg, 45.0*deg, 60.0*deg, 90.0*deg ] + + y1 = [ 1.0, 2.0, 3.0, 4.0] + y2 = [ 4.0, 3.0, 2.0, 1.0 ] + + fig = plt.figure() + + plt.polar( x2, y1, color = "blue" ) + + # polar( x2, y1, color = "red", xunits="rad" ) + # polar( x2, y2, color = "green" ) + + fig.savefig( 'polar_units' ) + +@image_comparison(baseline_images=['polar_rmin']) +def test_polar_rmin(): + r = np.arange(0, 3.0, 0.01) + theta = 2*np.pi*r + + fig = plt.figure() + ax = fig.add_axes([0.1, 0.1, 0.8, 0.8], polar=True) + ax.plot(theta, r) + ax.set_rmax(2.0) + ax.set_rmin(0.5) + + fig.savefig('polar_rmin') + +@image_comparison(baseline_images=['axvspan_epoch']) +def test_axvspan_epoch(): + from datetime import datetime + import matplotlib.testing.jpl_units as units + units.register() + + # generate some data + t0 = units.Epoch( "ET", dt=datetime(2009, 1, 20) ) + tf = units.Epoch( "ET", dt=datetime(2009, 1, 21) ) + + dt = units.Duration( "ET", units.day.convert( "sec" ) ) + + fig = plt.figure() + + plt.axvspan( t0, tf, facecolor="blue", alpha=0.25 ) + + ax = plt.gca() + ax.set_xlim( t0 - 5.0*dt, tf + 5.0*dt ) + + fig.savefig( 'axvspan_epoch' ) + +@image_comparison(baseline_images=['axhspan_epoch']) +def test_axhspan_epoch(): + from datetime import datetime + import matplotlib.testing.jpl_units as units + units.register() + + # generate some data + t0 = units.Epoch( "ET", dt=datetime(2009, 1, 20) ) + tf = units.Epoch( "ET", dt=datetime(2009, 1, 21) ) + + dt = units.Duration( "ET", units.day.convert( "sec" ) ) + + fig = plt.figure() + + plt.axhspan( t0, tf, facecolor="blue", alpha=0.25 ) + + ax = plt.gca() + ax.set_ylim( t0 - 5.0*dt, tf + 5.0*dt ) + + fig.savefig( 'axhspan_epoch' ) + + +@image_comparison(baseline_images=['hexbin_extent']) +def test_hexbin_extent(): + # this test exposes sf bug 2856228 + fig = plt.figure() + + ax = fig.add_subplot(111) + data = np.arange(2000.)/2000. + data.shape = 2, 1000 + x, y = data + + ax.hexbin(x, y, extent=[.1, .3, .6, .7]) + fig.savefig('hexbin_extent') + +@image_comparison(baseline_images=['nonfinite_limits']) +def test_nonfinite_limits(): + x = np.arange(0., np.e, 0.01) + y = np.log(x) + x[len(x)/2] = np.nan + fig = plt.figure() + ax = fig.add_subplot(111) + ax.plot(x, y) + fig.savefig('nonfinite_limits') + +@image_comparison(baseline_images=['imshow']) +def test_imshow(): + #Create a NxN image + N=100 + (x,y) = np.indices((N,N)) + x -= N/2 + y -= N/2 + r = np.sqrt(x**2+y**2-x*y) + + #Create a contour plot at N/4 and extract both the clip path and transform + fig = plt.figure() + ax = fig.add_subplot(111) + + ax.imshow(r) + fig.savefig('imshow') + +@image_comparison(baseline_images=['imshow_clip'], tol=1e-2) +def test_imshow_clip(): + # As originally reported by Gellule Xg + + #Create a NxN image + N=100 + (x,y) = np.indices((N,N)) + x -= N/2 + y -= N/2 + r = np.sqrt(x**2+y**2-x*y) + + #Create a contour plot at N/4 and extract both the clip path and transform + fig = plt.figure() + ax = fig.add_subplot(111) + + c = ax.contour(r,[N/4]) + x = c.collections[0] + clipPath = x.get_paths()[0] + clipTransform = x.get_transform() + + from matplotlib.transforms import TransformedPath + clip_path = TransformedPath(clipPath, clipTransform) + + #Plot the image clipped by the contour + ax.imshow(r, clip_path=clip_path) + fig.savefig('imshow_clip') + +@image_comparison(baseline_images=['polycollection_joinstyle']) +def test_polycollection_joinstyle(): + # Bug #2890979 reported by Matthew West + + from matplotlib import collections as mcoll + + fig = plt.figure() + ax = fig.add_subplot(111) + verts = np.array([[1,1], [1,2], [2,2], [2,1]]) + c = mcoll.PolyCollection([verts], linewidths = 40) + ax.add_collection(c) + ax.set_xbound(0, 3) + ax.set_ybound(0, 3) + ax.set_xticks([]) + ax.set_yticks([]) + + fig.savefig('polycollection_joinstyle') + +@image_comparison(baseline_images=['fill_between_interpolate'], tol=1e-2) +def test_fill_between_interpolate(): + x = np.arange(0.0, 2, 0.02) + y1 = np.sin(2*np.pi*x) + y2 = 1.2*np.sin(4*np.pi*x) + + fig = plt.figure() + ax = fig.add_subplot(211) + ax.plot(x, y1, x, y2, color='black') + ax.fill_between(x, y1, y2, where=y2>=y1, facecolor='green', interpolate=True) + ax.fill_between(x, y1, y2, where=y2<=y1, facecolor='red', interpolate=True) + + # Test support for masked arrays. + y2 = np.ma.masked_greater(y2, 1.0) + ax1 = fig.add_subplot(212, sharex=ax) + ax1.plot(x, y1, x, y2, color='black') + ax1.fill_between(x, y1, y2, where=y2>=y1, facecolor='green', interpolate=True) + ax1.fill_between(x, y1, y2, where=y2<=y1, facecolor='red', interpolate=True) + + fig.savefig('fill_between_interpolate') + +@image_comparison(baseline_images=['symlog']) +def test_symlog(): + x = np.array([0,1,2,4,6,9,12,24]) + y = np.array([1000000, 500000, 100000, 100, 5, 0, 0, 0]) + + fig = plt.figure() + ax = fig.add_subplot(111) + ax.plot(x, y) + ax.set_yscale('symlog') + ax.set_xscale=('linear') + ax.set_ylim(-1,10000000) + + fig.savefig('symlog') + +@image_comparison(baseline_images=['pcolormesh']) +def test_pcolormesh(): + n = 12 + x = np.linspace(-1.5,1.5,n) + y = np.linspace(-1.5,1.5,n*2) + X,Y = np.meshgrid(x,y); + Qx = np.cos(Y) - np.cos(X) + Qz = np.sin(Y) + np.sin(X) + Qx = (Qx + 1.1) + Z = np.sqrt(X**2 + Y**2)/5; + Z = (Z - Z.min()) / (Z.max() - Z.min()) + + # The color array can include masked values: + Zm = ma.masked_where(np.fabs(Qz) < 0.5*np.amax(Qz), Z) + + fig = plt.figure() + ax = fig.add_subplot(121) + ax.pcolormesh(Qx,Qz,Z, lw=0.5, edgecolors='k') + ax.set_title('lw=0.5') + ax.set_xticks([]) + ax.set_yticks([]) + + ax = fig.add_subplot(122) + ax.pcolormesh(Qx,Qz,Z, lw=3, edgecolors='k') + ax.set_title('lw=3') + ax.set_xticks([]) + ax.set_yticks([]) + + fig.savefig('pcolormesh') + +if __name__=='__main__': + import nose + nose.runmodule(argv=['-s','--with-doctest'], exit=False) diff -Nru matplotlib-0.99.3/lib/matplotlib/tests/test_backend_svg.py matplotlib-1.0.1/lib/matplotlib/tests/test_backend_svg.py --- matplotlib-0.99.3/lib/matplotlib/tests/test_backend_svg.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tests/test_backend_svg.py 2010-07-07 01:41:51.000000000 +0000 @@ -0,0 +1,29 @@ +import matplotlib.pyplot as plt +import numpy as np +import cStringIO as StringIO +import xml.parsers.expat +from matplotlib.testing.decorators import knownfailureif + +def test_visibility(): + # This is SF 2856495. See + # https://sourceforge.net/tracker/?func=detail&aid=2856495&group_id=80706&atid=560720 + fig=plt.figure() + ax=fig.add_subplot(1,1,1) + + x = np.linspace(0,4*np.pi,50) + y = np.sin(x) + yerr = np.ones_like(y) + + a,b,c=ax.errorbar(x,y,yerr=yerr,fmt='ko') + for artist in b: + artist.set_visible(False) + + fd = StringIO.StringIO() + fig.savefig(fd,format='svg') + + fd.seek(0) + buf = fd.read() + fd.close() + + parser = xml.parsers.expat.ParserCreate() + parser.Parse(buf) # this will raise ExpatError if the svg is invalid diff -Nru matplotlib-0.99.3/lib/matplotlib/tests/test_basic.py matplotlib-1.0.1/lib/matplotlib/tests/test_basic.py --- matplotlib-0.99.3/lib/matplotlib/tests/test_basic.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tests/test_basic.py 2010-07-07 01:41:51.000000000 +0000 @@ -0,0 +1,9 @@ +from nose.tools import assert_equal +from matplotlib.testing.decorators import knownfailureif + +def test_simple(): + assert_equal(1+1,2) + +@knownfailureif(True) +def test_simple_knownfail(): + assert_equal(1+1,3) diff -Nru matplotlib-0.99.3/lib/matplotlib/tests/test_cbook.py matplotlib-1.0.1/lib/matplotlib/tests/test_cbook.py --- matplotlib-0.99.3/lib/matplotlib/tests/test_cbook.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tests/test_cbook.py 2010-07-07 01:41:51.000000000 +0000 @@ -0,0 +1,14 @@ +import numpy as np +import matplotlib.cbook as cbook +from nose.tools import assert_equal + +def test_is_string_like(): + y = np.arange( 10 ) + assert_equal( cbook.is_string_like( y ), False ) + y.shape = 10, 1 + assert_equal( cbook.is_string_like( y ), False ) + y.shape = 1, 10 + assert_equal( cbook.is_string_like( y ), False ) + + assert cbook.is_string_like( "hello world" ) + assert_equal( cbook.is_string_like(10), False ) diff -Nru matplotlib-0.99.3/lib/matplotlib/tests/test_dates.py matplotlib-1.0.1/lib/matplotlib/tests/test_dates.py --- matplotlib-0.99.3/lib/matplotlib/tests/test_dates.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tests/test_dates.py 2010-07-07 01:41:51.000000000 +0000 @@ -0,0 +1,164 @@ +import datetime +import numpy as np +from matplotlib.testing.decorators import image_comparison, knownfailureif +import matplotlib.pyplot as plt +from nose.tools import assert_raises + +@image_comparison(baseline_images=['date_empty']) +def test_date_empty(): + # make sure mpl does the right thing when told to plot dates even + # if no date data has been presented, cf + # http://sourceforge.net/tracker/?func=detail&aid=2850075&group_id=80706&atid=560720 + fig = plt.figure() + ax = fig.add_subplot(1,1,1) + ax.xaxis_date() + fig.savefig('date_empty') + +@image_comparison(baseline_images=['date_axhspan']) +def test_date_axhspan(): + # test ax hspan with date inputs + t0 = datetime.datetime(2009, 1, 20) + tf = datetime.datetime(2009, 1, 21) + fig = plt.figure() + ax = fig.add_subplot(1,1,1) + ax.axhspan( t0, tf, facecolor="blue", alpha=0.25 ) + ax.set_ylim(t0-datetime.timedelta(days=5), + tf+datetime.timedelta(days=5)) + fig.subplots_adjust(left=0.25) + fig.savefig('date_axhspan') + +@image_comparison(baseline_images=['date_axvspan']) +def test_date_axvspan(): + # test ax hspan with date inputs + t0 = datetime.datetime(2000, 1, 20) + tf = datetime.datetime(2010, 1, 21) + fig = plt.figure() + ax = fig.add_subplot(1,1,1) + ax.axvspan( t0, tf, facecolor="blue", alpha=0.25 ) + ax.set_xlim(t0-datetime.timedelta(days=720), + tf+datetime.timedelta(days=720)) + fig.autofmt_xdate() + fig.savefig('date_axvspan') + + +@image_comparison(baseline_images=['date_axhline']) +def test_date_axhline(): + # test ax hline with date inputs + t0 = datetime.datetime(2009, 1, 20) + tf = datetime.datetime(2009, 1, 31) + fig = plt.figure() + ax = fig.add_subplot(1,1,1) + ax.axhline( t0, color="blue", lw=3) + ax.set_ylim(t0-datetime.timedelta(days=5), + tf+datetime.timedelta(days=5)) + fig.subplots_adjust(left=0.25) + fig.savefig('date_axhline') + +@image_comparison(baseline_images=['date_axvline']) +def test_date_axvline(): + # test ax hline with date inputs + t0 = datetime.datetime(2000, 1, 20) + tf = datetime.datetime(2000, 1, 21) + fig = plt.figure() + ax = fig.add_subplot(1,1,1) + ax.axvline( t0, color="red", lw=3) + ax.set_xlim(t0-datetime.timedelta(days=5), + tf+datetime.timedelta(days=5)) + fig.autofmt_xdate() + fig.savefig('date_axvline') + +def test_too_many_date_ticks(): + # Attempt to test SF 2715172, see + # https://sourceforge.net/tracker/?func=detail&aid=2715172&group_id=80706&atid=560720 + # setting equal datetimes triggers and expander call in + # transforms.nonsingular which results in too many ticks in the + # DayLocator. This should trigger a Locator.MAXTICKS RuntimeError + t0 = datetime.datetime(2000, 1, 20) + tf = datetime.datetime(2000, 1, 20) + fig = plt.figure() + ax = fig.add_subplot(1,1,1) + ax.set_xlim((t0,tf), auto=True) + ax.plot([],[]) + from matplotlib.dates import DayLocator, DateFormatter, HourLocator + ax.xaxis.set_major_locator(DayLocator()) + assert_raises(RuntimeError, fig.savefig, 'junk.png') + +@image_comparison(baseline_images=['RRuleLocator_bounds']) +def test_RRuleLocator(): + import pylab + import matplotlib.dates as mpldates + import matplotlib.testing.jpl_units as units + from datetime import datetime + import dateutil + units.register() + + # This will cause the RRuleLocator to go out of bounds when it tries + # to add padding to the limits, so we make sure it caps at the correct + # boundary values. + t0 = datetime( 1000, 1, 1 ) + tf = datetime( 6000, 1, 1 ) + + fig = pylab.figure() + ax = pylab.subplot( 111 ) + ax.set_autoscale_on( True ) + ax.plot( [t0, tf], [0.0, 1.0], marker='o' ) + + rrule = mpldates.rrulewrapper( dateutil.rrule.YEARLY, interval=500 ) + locator = mpldates.RRuleLocator( rrule ) + ax.xaxis.set_major_locator( locator ) + ax.xaxis.set_major_formatter( mpldates.AutoDateFormatter(locator) ) + + ax.autoscale_view() + fig.autofmt_xdate() + + fig.savefig( 'RRuleLocator_bounds' ) + +@image_comparison(baseline_images=['DateFormatter_fractionalSeconds']) +def test_DateFormatter(): + import pylab + from datetime import datetime + import matplotlib.testing.jpl_units as units + units.register() + + # Lets make sure that DateFormatter will allow us to have tick marks + # at intervals of fractional seconds. + + t0 = datetime( 2001, 1, 1, 0, 0, 0 ) + tf = datetime( 2001, 1, 1, 0, 0, 1 ) + + fig = pylab.figure() + ax = pylab.subplot( 111 ) + ax.set_autoscale_on( True ) + ax.plot( [t0, tf], [0.0, 1.0], marker='o' ) + + # rrule = mpldates.rrulewrapper( dateutil.rrule.YEARLY, interval=500 ) + # locator = mpldates.RRuleLocator( rrule ) + # ax.xaxis.set_major_locator( locator ) + # ax.xaxis.set_major_formatter( mpldates.AutoDateFormatter(locator) ) + + ax.autoscale_view() + fig.autofmt_xdate() + + fig.savefig( 'DateFormatter_fractionalSeconds' ) + +#@image_comparison(baseline_images=['empty_date_bug']) +@knownfailureif(True) +def test_empty_date_with_year_formatter(): + # exposes sf bug 2861426: https://sourceforge.net/tracker/?func=detail&aid=2861426&group_id=80706&atid=560720 + + # update: I am no loner believe this is a bug, as I commented on + # the tracker. The question is now: what to do with this test + + import matplotlib.dates as dates + + fig = plt.figure() + ax = fig.add_subplot(111) + + yearFmt = dates.DateFormatter('%Y') + ax.xaxis.set_major_formatter(yearFmt) + + fig.savefig('empty_date_bug') + +if __name__=='__main__': + import nose + nose.runmodule(argv=['-s','--with-doctest'], exit=False) diff -Nru matplotlib-0.99.3/lib/matplotlib/tests/test_image.py matplotlib-1.0.1/lib/matplotlib/tests/test_image.py --- matplotlib-0.99.3/lib/matplotlib/tests/test_image.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tests/test_image.py 2010-08-03 14:22:41.000000000 +0000 @@ -0,0 +1,128 @@ +import numpy as np + +from matplotlib.testing.decorators import image_comparison, knownfailureif +import matplotlib.pyplot as plt +from nose.tools import assert_raises +from numpy.testing import assert_array_equal + +import cStringIO +import os + +@image_comparison(baseline_images=['image_interps']) +def test_image_interps(): + 'make the basic nearest, bilinear and bicubic interps' + X = np.arange(100) + X = X.reshape(5, 20) + + fig = plt.figure() + ax1 = fig.add_subplot(311) + ax1.imshow(X, interpolation='nearest') + ax1.set_title('three interpolations') + ax1.set_ylabel('nearest') + + ax2 = fig.add_subplot(312) + ax2.imshow(X, interpolation='bilinear') + ax2.set_ylabel('bilinear') + + ax3 = fig.add_subplot(313) + ax3.imshow(X, interpolation='bicubic') + ax3.set_ylabel('bicubic') + + fig.savefig('image_interps') + +@image_comparison(baseline_images=['figimage-0', 'figimage-1'], extensions=['png'], tol=1.5e-3) +def test_figimage(): + 'test the figimage method' + + for suppressComposite in False, True: + fig = plt.figure(figsize=(2,2), dpi=100) + fig.suppressComposite = suppressComposite + x,y = np.ix_(np.arange(100.0)/100.0, np.arange(100.0)/100.0) + z = np.sin(x**2 + y**2 - x*y) + c = np.sin(20*x**2 + 50*y**2) + img = z + c/5 + + fig.figimage(img, xo=0, yo=0, origin='lower') + fig.figimage(img[::-1,:], xo=0, yo=100, origin='lower') + fig.figimage(img[:,::-1], xo=100, yo=0, origin='lower') + fig.figimage(img[::-1,::-1], xo=100, yo=100, origin='lower') + + fig.savefig('figimage-%d' % int(suppressComposite), dpi=100) + +def test_image_python_io(): + fig = plt.figure() + ax = fig.add_subplot(111) + ax.plot([1,2,3]) + buffer = cStringIO.StringIO() + fig.savefig(buffer) + buffer.seek(0) + plt.imread(buffer) + +# def test_image_unicode_io(): +# fig = plt.figure() +# ax = fig.add_subplot(111) +# ax.plot([1,2,3]) +# fname = u"\u0a3a\u0a3a.png" +# fig.savefig(fname) +# plt.imread(fname) +# os.remove(fname) + +def test_imsave(): + # The goal here is that the user can specify an output logical DPI + # for the image, but this will not actually add any extra pixels + # to the image, it will merely be used for metadata purposes. + + # So we do the traditional case (dpi == 1), and the new case (dpi + # == 100) and read the resulting PNG files back in and make sure + # the data is 100% identical. + from numpy import random + random.seed(1) + data = random.rand(256, 128) + + buff_dpi1 = cStringIO.StringIO() + plt.imsave(buff_dpi1, data, dpi=1) + + buff_dpi100 = cStringIO.StringIO() + plt.imsave(buff_dpi100, data, dpi=100) + + buff_dpi1.seek(0) + arr_dpi1 = plt.imread(buff_dpi1) + + buff_dpi100.seek(0) + arr_dpi100 = plt.imread(buff_dpi100) + + assert arr_dpi1.shape == (256, 128, 4) + assert arr_dpi100.shape == (256, 128, 4) + + assert_array_equal(arr_dpi1, arr_dpi100) + +@image_comparison(baseline_images=['image_clip']) +def test_image_clip(): + from math import pi + + fig = plt.figure() + ax = fig.add_subplot(111, projection='hammer') + + d = [[1,2],[3,4]] + + im = ax.imshow(d, extent=(-pi,pi,-pi/2,pi/2)) + + fig.savefig('image_clip') + +@image_comparison(baseline_images=['imshow']) +def test_imshow(): + import numpy as np + import matplotlib.pyplot as plt + + fig = plt.figure() + arr = np.arange(100).reshape((10, 10)) + ax = fig.add_subplot(111) + ax.imshow(arr, interpolation="bilinear", extent=(1,2,1,2)) + ax.set_xlim(0,3) + ax.set_ylim(0,3) + + fig.savefig('imshow') + +if __name__=='__main__': + import nose + nose.runmodule(argv=['-s','--with-doctest'], exit=False) diff -Nru matplotlib-0.99.3/lib/matplotlib/tests/test_mathtext.py matplotlib-1.0.1/lib/matplotlib/tests/test_mathtext.py --- matplotlib-0.99.3/lib/matplotlib/tests/test_mathtext.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tests/test_mathtext.py 2010-07-07 01:41:51.000000000 +0000 @@ -0,0 +1,117 @@ +import numpy as np +import matplotlib +from matplotlib.testing.decorators import image_comparison, knownfailureif +import matplotlib.pyplot as plt + +math_tests = [ + r'$a+b+\dots+\dot{s}+\ldots$', + r'$x \doteq y$', + r'\$100.00 $\alpha \_$', + r'$\frac{\$100.00}{y}$', + r'$x y$', + r'$x+y\ x=y\ x1}f\left(t\right) d\pi \left(t\right)$', + # mathtex doesn't support array + # 'mmltt23' : r'$\left(\begin{array}{cc}\hfill \left(\begin{array}{cc}\hfill a\hfill & \hfill b\hfill \\ \hfill c\hfill & \hfill d\hfill \end{array}\right)\hfill & \hfill \left(\begin{array}{cc}\hfill e\hfill & \hfill f\hfill \\ \hfill g\hfill & \hfill h\hfill \end{array}\right)\hfill \\ \hfill 0\hfill & \hfill \left(\begin{array}{cc}\hfill i\hfill & \hfill j\hfill \\ \hfill k\hfill & \hfill l\hfill \end{array}\right)\hfill \end{array}\right)$', + # mathtex doesn't support array + # 'mmltt24' : u'$det|\\begin{array}{ccccc}\\hfill {c}_{0}\\hfill & \\hfill {c}_{1}\\hfill & \\hfill {c}_{2}\\hfill & \\hfill \\dots \\hfill & \\hfill {c}_{n}\\hfill \\\\ \\hfill {c}_{1}\\hfill & \\hfill {c}_{2}\\hfill & \\hfill {c}_{3}\\hfill & \\hfill \\dots \\hfill & \\hfill {c}_{n+1}\\hfill \\\\ \\hfill {c}_{2}\\hfill & \\hfill {c}_{3}\\hfill & \\hfill {c}_{4}\\hfill & \\hfill \\dots \\hfill & \\hfill {c}_{n+2}\\hfill \\\\ \\hfill \\u22ee\\hfill & \\hfill \\u22ee\\hfill & \\hfill \\u22ee\\hfill & \\hfill \\hfill & \\hfill \\u22ee\\hfill \\\\ \\hfill {c}_{n}\\hfill & \\hfill {c}_{n+1}\\hfill & \\hfill {c}_{n+2}\\hfill & \\hfill \\dots \\hfill & \\hfill {c}_{2n}\\hfill \\end{array}|>0$', + r'${y}_{{x}_{2}}$', + r'${x}_{92}^{31415}+\pi $', + r'${x}_{{y}_{b}^{a}}^{{z}_{c}^{d}}$', + r'${y}_{3}^{\prime \prime \prime }$', + r"$\left( \xi \left( 1 - \xi \right) \right)$" # Bug 2969451 +] + +def _run_all_tests(): + fig = plt.figure(figsize=(5, len(math_tests) / 2.0)) + for i, test in enumerate(math_tests): + fig.text(0, float(len(math_tests) - i - 1) / len(math_tests), test) + return fig + +@image_comparison(baseline_images=['mathtext']) +def test_mathtext(): + fig = _run_all_tests() + fig.savefig('mathtext') + +@image_comparison(baseline_images=['mathtext_stix']) +def test_mathtext_stix(): + matplotlib.rcParams['mathtext.fontset'] = 'stix' + + fig = _run_all_tests() + fig.savefig('mathtext_stix') + + matplotlib.rcParams['mathtext.fontset'] = 'cm' + +@image_comparison(baseline_images=['mathtext_stixsans']) +def test_mathtext_stixsans(): + matplotlib.rcParams['mathtext.fontset'] = 'stixsans' + + fig = _run_all_tests() + fig.savefig('mathtext_stixsans') + + matplotlib.rcParams['mathtext.fontset'] = 'cm' + + diff -Nru matplotlib-0.99.3/lib/matplotlib/tests/test_mlab.py matplotlib-1.0.1/lib/matplotlib/tests/test_mlab.py --- matplotlib-0.99.3/lib/matplotlib/tests/test_mlab.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tests/test_mlab.py 2010-07-07 01:41:51.000000000 +0000 @@ -0,0 +1,57 @@ +import numpy as np +import matplotlib.mlab as mlab +import tempfile +from nose.tools import raises + +def test_colinear_pca(): + a = mlab.PCA._get_colinear() + pca = mlab.PCA(a) + + assert(np.allclose(pca.fracs[2:], 0.)) + assert(np.allclose(pca.Y[:,2:], 0.)) + +def test_recarray_csv_roundtrip(): + expected = np.recarray((99,), + [('x',np.float),('y',np.float),('t',np.float)]) + expected['x'][0] = 1 + expected['y'][1] = 2 + expected['t'][2] = 3 + fd = tempfile.TemporaryFile(suffix='csv') + mlab.rec2csv(expected,fd) + fd.seek(0) + actual = mlab.csv2rec(fd) + fd.close() + assert np.allclose( expected['x'], actual['x'] ) + assert np.allclose( expected['y'], actual['y'] ) + assert np.allclose( expected['t'], actual['t'] ) + +@raises(ValueError) +def test_rec2csv_bad_shape(): + bad = np.recarray((99,4),[('x',np.float),('y',np.float)]) + fd = tempfile.TemporaryFile(suffix='csv') + + # the bad recarray should trigger a ValueError for having ndim > 1. + mlab.rec2csv(bad,fd) + +def test_prctile(): + # test odd lengths + x=[1,2,3] + assert mlab.prctile(x,50)==np.median(x) + + # test even lengths + x=[1,2,3,4] + assert mlab.prctile(x,50)==np.median(x) + + # derived from email sent by jason-sage to MPL-user on 20090914 + ob1=[1,1,2,2,1,2,4,3,2,2,2,3,4,5,6,7,8,9,7,6,4,5,5] + p = [0, 75, 100] + expected = [1, 5.5, 9] + + # test vectorized + actual = mlab.prctile(ob1,p) + assert np.allclose( expected, actual ) + + # test scalar + for pi, expectedi in zip(p,expected): + actuali = mlab.prctile(ob1,pi) + assert np.allclose( expectedi, actuali ) diff -Nru matplotlib-0.99.3/lib/matplotlib/tests/test_simplification.py matplotlib-1.0.1/lib/matplotlib/tests/test_simplification.py --- matplotlib-0.99.3/lib/matplotlib/tests/test_simplification.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tests/test_simplification.py 2010-09-23 19:54:49.000000000 +0000 @@ -0,0 +1,226 @@ +import numpy as np +import matplotlib +from matplotlib.testing.decorators import image_comparison, knownfailureif +import matplotlib.pyplot as plt + +from pylab import * +import numpy as np +from matplotlib import patches, path, transforms + +from nose.tools import raises +import cStringIO + +nan = np.nan +Path = path.Path + +# NOTE: All of these tests assume that path.simplify is set to True +# (the default) + +@image_comparison(baseline_images=['clipping']) +def test_clipping(): + t = np.arange(0.0, 2.0, 0.01) + s = np.sin(2*pi*t) + + fig = plt.figure() + ax = fig.add_subplot(111) + ax.plot(t, s, linewidth=1.0) + ax.set_ylim((-0.20, -0.28)) + ax.set_xticks([]) + ax.set_yticks([]) + fig.savefig('clipping') + +@image_comparison(baseline_images=['overflow'], tol=1e-2) +def test_overflow(): + x = np.array([1.0,2.0,3.0,2.0e5]) + y = np.arange(len(x)) + + fig = plt.figure() + ax = fig.add_subplot(111) + ax.plot(x,y) + ax.set_xlim(xmin=2,xmax=6) + ax.set_xticks([]) + ax.set_yticks([]) + + fig.savefig('overflow') + +@image_comparison(baseline_images=['clipping_diamond']) +def test_diamond(): + x = np.array([0.0, 1.0, 0.0, -1.0, 0.0]) + y = np.array([1.0, 0.0, -1.0, 0.0, 1.0]) + + fig = plt.figure() + ax = fig.add_subplot(111) + ax.plot(x, y) + ax.set_xlim(xmin=-0.6, xmax=0.6) + ax.set_ylim(ymin=-0.6, ymax=0.6) + ax.set_xticks([]) + ax.set_yticks([]) + + fig.savefig('clipping_diamond') + +def test_noise(): + np.random.seed(0) + x = np.random.uniform(size=(5000,)) * 50 + + fig = plt.figure() + ax = fig.add_subplot(111) + p1 = ax.plot(x, solid_joinstyle='round', linewidth=2.0) + ax.set_xticks([]) + ax.set_yticks([]) + + path = p1[0].get_path() + transform = p1[0].get_transform() + path = transform.transform_path(path) + simplified = list(path.iter_segments(simplify=(800, 600))) + + print len(simplified) + + assert len(simplified) == 3884 + +def test_sine_plus_noise(): + np.random.seed(0) + x = np.sin(np.linspace(0, np.pi * 2.0, 1000)) + np.random.uniform(size=(1000,)) * 0.01 + + fig = plt.figure() + ax = fig.add_subplot(111) + p1 = ax.plot(x, solid_joinstyle='round', linewidth=2.0) + ax.set_xticks([]) + ax.set_yticks([]) + + path = p1[0].get_path() + transform = p1[0].get_transform() + path = transform.transform_path(path) + simplified = list(path.iter_segments(simplify=(800, 600))) + + print len(simplified) + + assert len(simplified) == 876 + +@image_comparison(baseline_images=['simplify_curve']) +def test_simplify_curve(): + pp1 = patches.PathPatch( + Path([(0, 0), (1, 0), (1, 1), (nan, 1), (0, 0), (2, 0), (2, 2), (0, 0)], + [Path.MOVETO, Path.CURVE3, Path.CURVE3, Path.CURVE3, Path.CURVE3, Path.CURVE3, Path.CURVE3, Path.CLOSEPOLY]), + fc="none") + + fig = plt.figure() + ax = fig.add_subplot(111) + ax.add_patch(pp1) + ax.set_xticks([]) + ax.set_yticks([]) + ax.set_xlim((0, 2)) + ax.set_ylim((0, 2)) + + fig.savefig('simplify_curve') + +@image_comparison(baseline_images=['hatch_simplify']) +def test_hatch(): + fig = plt.figure() + ax = fig.add_subplot(111) + ax.add_patch(Rectangle((0, 0), 1, 1, fill=False, hatch="/")) + ax.set_xlim((0.45, 0.55)) + ax.set_ylim((0.45, 0.55)) + + fig.savefig('hatch_simplify') + +@image_comparison(baseline_images=['fft_peaks']) +def test_fft_peaks(): + fig = plt.figure() + t = arange(65536) + ax = fig.add_subplot(111) + p1 = ax.plot(abs(fft(sin(2*pi*.01*t)*blackman(len(t))))) + ax.set_xticks([]) + ax.set_yticks([]) + + fig.savefig('fft_peaks') + + path = p1[0].get_path() + transform = p1[0].get_transform() + path = transform.transform_path(path) + simplified = list(path.iter_segments(simplify=(800, 600))) + + print len(simplified) + + assert len(simplified) == 20 + +def test_start_with_moveto(): + # Should be entirely clipped away to a single MOVETO + data = """ +ZwAAAAku+v9UAQAA+Tj6/z8CAADpQ/r/KAMAANlO+v8QBAAAyVn6//UEAAC6ZPr/2gUAAKpv+v+8 +BgAAm3r6/50HAACLhfr/ewgAAHyQ+v9ZCQAAbZv6/zQKAABepvr/DgsAAE+x+v/lCwAAQLz6/7wM +AAAxx/r/kA0AACPS+v9jDgAAFN36/zQPAAAF6Pr/AxAAAPfy+v/QEAAA6f36/5wRAADbCPv/ZhIA +AMwT+/8uEwAAvh77//UTAACwKfv/uRQAAKM0+/98FQAAlT/7/z0WAACHSvv//RYAAHlV+/+7FwAA +bGD7/3cYAABea/v/MRkAAFF2+//pGQAARIH7/6AaAAA3jPv/VRsAACmX+/8JHAAAHKL7/7ocAAAP +rfv/ah0AAAO4+/8YHgAA9sL7/8QeAADpzfv/bx8AANzY+/8YIAAA0OP7/78gAADD7vv/ZCEAALf5 ++/8IIgAAqwT8/6kiAACeD/z/SiMAAJIa/P/oIwAAhiX8/4QkAAB6MPz/HyUAAG47/P+4JQAAYkb8 +/1AmAABWUfz/5SYAAEpc/P95JwAAPmf8/wsoAAAzcvz/nCgAACd9/P8qKQAAHIj8/7cpAAAQk/z/ +QyoAAAWe/P/MKgAA+aj8/1QrAADus/z/2isAAOO+/P9eLAAA2Mn8/+AsAADM1Pz/YS0AAMHf/P/g +LQAAtur8/10uAACr9fz/2C4AAKEA/f9SLwAAlgv9/8ovAACLFv3/QDAAAIAh/f+1MAAAdSz9/ycx +AABrN/3/mDEAAGBC/f8IMgAAVk39/3UyAABLWP3/4TIAAEFj/f9LMwAANm79/7MzAAAsef3/GjQA +ACKE/f9+NAAAF4/9/+E0AAANmv3/QzUAAAOl/f+iNQAA+a/9/wA2AADvuv3/XDYAAOXF/f+2NgAA +29D9/w83AADR2/3/ZjcAAMfm/f+7NwAAvfH9/w44AACz/P3/XzgAAKkH/v+vOAAAnxL+//04AACW +Hf7/SjkAAIwo/v+UOQAAgjP+/905AAB5Pv7/JDoAAG9J/v9pOgAAZVT+/606AABcX/7/7zoAAFJq +/v8vOwAASXX+/207AAA/gP7/qjsAADaL/v/lOwAALZb+/x48AAAjof7/VTwAABqs/v+LPAAAELf+ +/788AAAHwv7/8TwAAP7M/v8hPQAA9df+/1A9AADr4v7/fT0AAOLt/v+oPQAA2fj+/9E9AADQA/// ++T0AAMYO//8fPgAAvRn//0M+AAC0JP//ZT4AAKsv//+GPgAAojr//6U+AACZRf//wj4AAJBQ///d +PgAAh1v///c+AAB+Zv//Dz8AAHRx//8lPwAAa3z//zk/AABih///TD8AAFmS//9dPwAAUJ3//2w/ +AABHqP//ej8AAD6z//+FPwAANb7//48/AAAsyf//lz8AACPU//+ePwAAGt///6M/AAAR6v//pj8A +AAj1//+nPwAA/////w==""" + + verts = np.fromstring(data.decode('base64'), dtype=' 0 and dollar_count % 2 == 0) + + if rcParams['text.usetex']: + return s, 'TeX' + + if even_dollars: + return s, True + else: + return s.replace(r'\$', '$'), False + + def text_get_vertices_codes(self, prop, s, usetex): + """ + convert the string *s* to vertices and codes using the + provided font property *prop*. Mostly copied from + backend_svg.py. + """ + + if usetex: + verts, codes = text_to_path.get_text_path(prop, s, usetex=True) + else: + clean_line, ismath = self.is_math_text(s) + verts, codes = text_to_path.get_text_path(prop, clean_line, ismath=ismath) + + return verts, codes + + + + diff -Nru matplotlib-0.99.3/lib/matplotlib/text.py matplotlib-1.0.1/lib/matplotlib/text.py --- matplotlib-0.99.3/lib/matplotlib/text.py 2010-03-09 14:20:20.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/text.py 2011-01-05 15:59:56.000000000 +0000 @@ -11,15 +11,25 @@ import matplotlib.artist as artist from matplotlib.artist import Artist from matplotlib.cbook import is_string_like, maxdict +from matplotlib import docstring from matplotlib.font_manager import FontProperties from matplotlib.patches import bbox_artist, YAArrow, FancyBboxPatch, \ FancyArrowPatch, Rectangle import matplotlib.transforms as mtransforms -from matplotlib.transforms import Affine2D, Bbox +from matplotlib.transforms import Affine2D, Bbox, Transform ,\ + BboxBase, BboxTransformTo from matplotlib.lines import Line2D +from matplotlib.artist import allow_rasterization + import matplotlib.nxutils as nxutils +from matplotlib.path import Path +import matplotlib.font_manager as font_manager +from matplotlib.ft2font import FT2Font + +from matplotlib.backend_bases import RendererBase + def _process_text_args(override, fontdict=None, **kwargs): "Return an override dict. See :func:`~pyplot.text' docstring for info" @@ -47,11 +57,11 @@ # these are not available for the object inspector until after the # class is build so we define an initial set here for the init # function and they will be overridden after object defn -artist.kwdocd['Text'] = """ +docstring.interpd.update(Text = """ ========================== ========================================================================= Property Value ========================== ========================================================================= - alpha float + alpha float or None animated [True | False] backgroundcolor any matplotlib color bbox rectangle prop dict plus key 'pad' which is a pad in points @@ -82,7 +92,7 @@ y float zorder any number ========================== ========================================================================= - """ + """) @@ -133,19 +143,23 @@ Handle storing and drawing of text in window or data coordinates. """ zorder = 3 + + cached = maxdict(50) + def __str__(self): return "Text(%g,%g,%s)"%(self._y,self._y,repr(self._text)) def __init__(self, x=0, y=0, text='', color=None, # defaults to rc params - verticalalignment='bottom', + verticalalignment='baseline', horizontalalignment='left', multialignment=None, fontproperties=None, # defaults to FontProperties() rotation=None, linespacing=None, rotation_mode=None, + path_effects=None, **kwargs ): """ @@ -157,13 +171,13 @@ """ Artist.__init__(self) - self.cached = maxdict(5) self._x, self._y = x, y if color is None: color = rcParams['text.color'] if fontproperties is None: fontproperties=FontProperties() elif is_string_like(fontproperties): fontproperties=FontProperties(fontproperties) + self.set_path_effects(path_effects) self.set_text(text) self.set_color(color) self._verticalalignment = verticalalignment @@ -266,22 +280,36 @@ whs = np.zeros((len(lines), 2)) horizLayout = np.zeros((len(lines), 4)) + if self.get_path_effects(): + from matplotlib.backends.backend_mixed import MixedModeRenderer + if isinstance(renderer, MixedModeRenderer): + def get_text_width_height_descent(*kl, **kwargs): + return RendererBase.get_text_width_height_descent(renderer._renderer, + *kl, **kwargs) + else: + def get_text_width_height_descent(*kl, **kwargs): + return RendererBase.get_text_width_height_descent(renderer, + *kl, **kwargs) + else: + get_text_width_height_descent = renderer.get_text_width_height_descent + # Find full vertical extent of font, # including ascenders and descenders: - tmp, lp_h, lp_bl = renderer.get_text_width_height_descent( - 'lp', self._fontproperties, ismath=False) + tmp, lp_h, lp_bl = get_text_width_height_descent('lp', + self._fontproperties, + ismath=False) offsety = lp_h * self._linespacing - baseline = None + baseline = 0 for i, line in enumerate(lines): clean_line, ismath = self.is_math_text(line) if clean_line: - w, h, d = renderer.get_text_width_height_descent( - clean_line, self._fontproperties, ismath=ismath) + w, h, d = get_text_width_height_descent(clean_line, + self._fontproperties, + ismath=ismath) else: w, h, d = 0, 0, 0 - if baseline is None: - baseline = h - d + whs[i] = w, h # For general multiline text, we will have a fixed spacing @@ -298,9 +326,11 @@ horizLayout[i] = thisx, thisy-(d + d_yoffset), \ w, h + baseline = (h - d) - thisy thisy -= offsety + d_yoffset width = max(width, w) + ymin = horizLayout[-1][1] ymax = horizLayout[0][1] + horizLayout[0][3] height = ymax-ymin @@ -382,6 +412,13 @@ self.cached[key] = ret return ret + def set_path_effects(self, path_effects): + self._path_effects = path_effects + + def get_path_effects(self): + return self._path_effects + + def set_bbox(self, rectprops): """ Draw a bounding box around self. rectprops are any settable @@ -433,11 +470,6 @@ be updated before actually drawing the bbox. """ - # For arrow_patch, use textbox as patchA by default. - - if not isinstance(self.arrow_patch, FancyArrowPatch): - return - if self._bbox_patch: trans = self.get_transform() @@ -460,31 +492,6 @@ self._bbox_patch.set_mutation_scale(fontsize_in_pixel) #self._bbox_patch.draw(renderer) - else: - props = self._bbox - if props is None: props = {} - props = props.copy() # don't want to alter the pad externally - pad = props.pop('pad', 4) - pad = renderer.points_to_pixels(pad) - if self.get_text() == "": - self.arrow_patch.set_patchA(None) - return - - bbox = self.get_window_extent(renderer) - l,b,w,h = bbox.bounds - l-=pad/2. - b-=pad/2. - w+=pad - h+=pad - r = Rectangle(xy=(l,b), - width=w, - height=h, - ) - r.set_transform(mtransforms.IdentityTransform()) - r.set_clip_on( False ) - r.update(props) - - self.arrow_patch.set_patchA(r) def _draw_bbox(self, renderer, posx, posy): @@ -504,6 +511,7 @@ self._bbox_patch.draw(renderer) + @allow_rasterization def draw(self, renderer): """ Draws the :class:`Text` object to the given *renderer*. @@ -535,8 +543,7 @@ gc.set_foreground(self.get_color()) gc.set_alpha(self.get_alpha()) gc.set_url(self._url) - if self.get_clip_on(): - gc.set_clip_rectangle(self.clipbox) + self._set_gc_clip(gc) if self._bbox: bbox_artist(self, renderer, self._bbox) @@ -546,26 +553,42 @@ if rcParams['text.usetex']: for line, wh, x, y in info: + if not np.isfinite(x) or not np.isfinite(y): + continue + x = x + posx y = y + posy if renderer.flipy(): y = canvash-y clean_line, ismath = self.is_math_text(line) - renderer.draw_tex(gc, x, y, clean_line, - self._fontproperties, angle) - return + if self.get_path_effects(): + for path_effect in self.get_path_effects(): + path_effect.draw_tex(renderer, gc, x, y, clean_line, + self._fontproperties, angle) + else: + renderer.draw_tex(gc, x, y, clean_line, + self._fontproperties, angle) + else: + for line, wh, x, y in info: + if not np.isfinite(x) or not np.isfinite(y): + continue - for line, wh, x, y in info: - x = x + posx - y = y + posy - if renderer.flipy(): - y = canvash-y - clean_line, ismath = self.is_math_text(line) + x = x + posx + y = y + posy + if renderer.flipy(): + y = canvash-y + clean_line, ismath = self.is_math_text(line) - renderer.draw_text(gc, x, y, clean_line, - self._fontproperties, angle, - ismath=ismath) + if self.get_path_effects(): + for path_effect in self.get_path_effects(): + path_effect.draw_text(renderer, gc, x, y, clean_line, + self._fontproperties, angle, + ismath=ismath) + else: + renderer.draw_text(gc, x, y, clean_line, + self._fontproperties, angle, + ismath=ismath) gc.restore() renderer.close_group('text') @@ -947,19 +970,23 @@ """ self._text = '%s' % (s,) - def is_math_text(self, s): + @staticmethod + def is_math_text(s): """ - Returns True if the given string *s* contains any mathtext. + Returns a cleaned string and a boolean flag. + The flag indicates if the given string *s* contains any mathtext, + determined by counting unescaped dollar signs. If no mathtext + is present, the cleaned string has its dollar signs unescaped. + If usetex is on, the flag always has the value "TeX". """ # Did we find an even number of non-escaped dollar signs? # If so, treat is as math text. - dollar_count = s.count(r'$') - s.count(r'\$') - even_dollars = (dollar_count > 0 and dollar_count % 2 == 0) - if rcParams['text.usetex']: + if s == ' ': + s = r'\ ' return s, 'TeX' - if even_dollars: + if cbook.is_math_text(s): return s, True else: return s.replace(r'\$', '$'), False @@ -979,8 +1006,8 @@ 'alias for set_fontproperties' self.set_fontproperties(fp) -artist.kwdocd['Text'] = artist.kwdoc(Text) -Text.__init__.im_func.__doc__ = cbook.dedent(Text.__init__.__doc__) % artist.kwdocd +docstring.interpd.update(Text = artist.kwdoc(Text)) +docstring.dedent_interpd(Text.__init__.im_func) class TextWithDash(Text): @@ -1342,9 +1369,306 @@ Text.set_figure(self, fig) self.dashline.set_figure(fig) -artist.kwdocd['TextWithDash'] = artist.kwdoc(TextWithDash) +docstring.interpd.update(TextWithDash=artist.kwdoc(TextWithDash)) + + +class OffsetFrom(object): + def __init__(self, artist, ref_coord, unit="points"): + self._artist = artist + self._ref_coord= ref_coord + self.set_unit(unit) + + def set_unit(self, unit): + assert unit in ["points", "pixels"] + self._unit = unit + + def get_unit(self): + return self._unit + + def _get_scale(self, renderer): + unit = self.get_unit() + if unit == "pixels": + return 1. + else: + return renderer.points_to_pixels(1.) + + def __call__(self, renderer): + if isinstance(self._artist, Artist): + bbox = self._artist.get_window_extent(renderer) + l, b, w, h = bbox.bounds + xf, yf = self._ref_coord + x, y = l+w*xf, b+h*yf + elif isinstance(self._artist, BboxBase): + l, b, w, h = self._artist.bounds + xf, yf = self._ref_coord + x, y = l+w*xf, b+h*yf + elif isinstance(self._artist, Transform): + x, y = self._artist.transform_point(self._ref_coord) + else: + raise RuntimeError("unknown type") + + sc = self._get_scale(renderer) + tr = Affine2D().scale(sc, sc).translate(x, y) + + return tr + +class _AnnotationBase(object): + def __init__(self, + xy, xytext=None, + xycoords='data', textcoords=None, + annotation_clip=None): + if xytext is None: + xytext = xy + if textcoords is None: + textcoords = xycoords + # we'll draw ourself after the artist we annotate by default + x,y = self.xytext = xytext + + self.xy = xy + self.xycoords = xycoords + self.textcoords = textcoords + self.set_annotation_clip(annotation_clip) + + self._draggable = None + + def _get_xy(self, renderer, x, y, s): + if isinstance(s, tuple): + s1, s2 = s + else: + s1, s2 = s, s + + if s1 == 'data': + x = float(self.convert_xunits(x)) + if s2 == 'data': + y = float(self.convert_yunits(y)) + + + if s in ['axes points', 'axes pixel', 'figure points', 'figure pixel']: + return self._get_xy_legacy(renderer, x, y, s) + + tr = self._get_xy_transform(renderer, s) + x1, y1 = tr.transform_point((x, y)) + return x1, y1 + + def _get_xy_transform(self, renderer, s): + + if isinstance(s, tuple): + s1, s2 = s + from matplotlib.transforms import blended_transform_factory + tr1 = self._get_xy_transform(renderer, s1) + tr2 = self._get_xy_transform(renderer, s2) + tr = blended_transform_factory(tr1, tr2) + return tr + + if callable(s): + tr = s(renderer) + if isinstance(tr, BboxBase): + return BboxTransformTo(tr) + elif isinstance(tr, Transform): + return tr + else: + raise RuntimeError("unknown return type ...") + if isinstance(s, Artist): + bbox = s.get_window_extent(renderer) + return BboxTransformTo(bbox) + elif isinstance(s, BboxBase): + return BboxTransformTo(s) + elif isinstance(s, Transform): + return s + elif not is_string_like(s): + raise RuntimeError("unknown coordinate type : %s" % (s,)) + + if s=='data': + return self.axes.transData + elif s=='polar': + from matplotlib.projections import PolarAxes + tr = PolarAxes.PolarTransform() + trans = tr + self.axes.transData + return trans + + s_ = s.split() + if len(s_) != 2: + raise ValueError("%s is not a recognized coodinate" % s) + + bbox0, xy0 = None, None + + bbox_name, unit = s_ + # if unit is offset-like + if bbox_name == "figure": + bbox0 = self.figure.bbox + elif bbox_name == "axes": + bbox0 = self.axes.bbox + # elif bbox_name == "bbox": + # if bbox is None: + # raise RuntimeError("bbox is specified as a coordinate but never set") + # bbox0 = self._get_bbox(renderer, bbox) + + if bbox0 is not None: + xy0 = bbox0.bounds[:2] + elif bbox_name == "offset": + xy0 = self._get_ref_xy(renderer) + + if xy0 is not None: + # reference x, y in display coordinate + ref_x, ref_y = xy0 + from matplotlib.transforms import Affine2D + if unit == "points": + dpi = self.figure.get_dpi() + tr = Affine2D().scale(dpi/72., dpi/72.) + elif unit == "pixels": + tr = Affine2D() + elif unit == "fontsize": + fontsize = self.get_size() + dpi = self.figure.get_dpi() + tr = Affine2D().scale(fontsize*dpi/72., fontsize*dpi/72.) + elif unit == "fraction": + w, h = bbox0.bounds[2:] + tr = Affine2D().scale(w, h) + else: + raise ValueError("%s is not a recognized coodinate" % s) + + return tr.translate(ref_x, ref_y) + + else: + raise ValueError("%s is not a recognized coodinate" % s) + + + def _get_ref_xy(self, renderer): + """ + return x, y (in display coordinate) that is to be used for a reference + of any offset coordinate + """ + + if isinstance(self.xycoords, tuple): + s1, s2 = self.xycoords + if (is_string_like(s1) and s1.split()[0] == "offset") \ + or (is_string_like(s2) and s2.split()[0] == "offset"): + raise ValueError("xycoords should not be an offset coordinate") + x, y = self.xy + x1, y1 = self._get_xy(renderer, x, y, s1) + x2, y2 = self._get_xy(renderer, x, y, s2) + return x1, y2 + elif is_string_like(self.xycoords) and self.xycoords.split()[0] == "offset": + raise ValueError("xycoords should not be an offset coordinate") + else: + x, y = self.xy + return self._get_xy(renderer, x, y, self.xycoords) + #raise RuntimeError("must be defined by the derived class") + + + # def _get_bbox(self, renderer): + # if hasattr(bbox, "bounds"): + # return bbox + # elif hasattr(bbox, "get_window_extent"): + # bbox = bbox.get_window_extent() + # return bbox + # else: + # raise ValueError("A bbox instance is expected but got %s" % str(bbox)) + + + + def _get_xy_legacy(self, renderer, x, y, s): + """ + only used when s in ['axes points', 'axes pixel', 'figure points', 'figure pixel']. + """ + s_ = s.split() + bbox0, xy0 = None, None + bbox_name, unit = s_ + + if bbox_name == "figure": + bbox0 = self.figure.bbox + elif bbox_name == "axes": + bbox0 = self.axes.bbox + + if unit == "points": + sc = self.figure.get_dpi()/72. + elif unit == "pixels": + sc = 1 + + l,b,r,t = bbox0.extents + if x<0: + x = r + x*sc + else: + x = l + x*sc + if y<0: + y = t + y*sc + else: + y = b + y*sc + + return x, y + + + def set_annotation_clip(self, b): + """ + set *annotation_clip* attribute. + + * True : the annotation will only be drawn when self.xy is inside the axes. + * False : the annotation will always be drawn regardless of its position. + * None : the self.xy will be checked only if *xycoords* is "data" + """ + self._annotation_clip = b + + def get_annotation_clip(self): + """ + Return *annotation_clip* attribute. + See :meth:`set_annotation_clip` for the meaning of return values. + """ + return self._annotation_clip + + def _get_position_xy(self, renderer): + "Return the pixel position of the the annotated point." + x, y = self.xy + return self._get_xy(renderer, x, y, self.xycoords) + + def _check_xy(self, renderer, xy_pixel): + """ + given the xy pixel coordinate, check if the annotation need to + be drawn. + """ + + b = self.get_annotation_clip() + + if b or (b is None and self.xycoords == "data"): + # check if self.xy is inside the axes. + if not self.axes.contains_point(xy_pixel): + return False + + return True + + + def draggable(self, state=None, use_blit=False): + """ + Set the draggable state -- if state is + + * None : toggle the current state -class Annotation(Text): + * True : turn draggable on + + * False : turn draggable off + + If draggable is on, you can drag the annotation on the canvas with + the mouse. The DraggableAnnotation helper instance is returned if + draggable is on. + """ + from matplotlib.offsetbox import DraggableAnnotation + is_draggable = self._draggable is not None + + # if state is None we'll toggle + if state is None: + state = not is_draggable + + if state: + if self._draggable is None: + self._draggable = DraggableAnnotation(self, use_blit) + else: + if self._draggable is not None: + self._draggable.disconnect() + self._draggable = None + + return self._draggable + + +class Annotation(Text, _AnnotationBase): """ A :class:`~matplotlib.text.Text` class to make annotating things in the figure, such as :class:`~matplotlib.figure.Figure`, @@ -1353,11 +1677,13 @@ """ def __str__(self): return "Annotation(%g,%g,%s)"%(self.xy[0],self.xy[1],repr(self._text)) + @docstring.dedent_interpd def __init__(self, s, xy, xytext=None, xycoords='data', textcoords=None, arrowprops=None, + annotation_clip=None, **kwargs): """ Annotate the *x*, *y* point *xy* with text *s* at *x*, *y* @@ -1441,6 +1767,11 @@ # 5 points below the top border xy=(10,-5), xycoords='axes points' + You may use an instance of + :class:`~matplotlib.transforms.Transform` or + :class:`~matplotlib.artist.Artist`. See + :ref:`plotting-guide-annotation` for more details. + The *annotation_clip* attribute contols the visibility of the annotation when it goes outside the axes area. If True, the @@ -1454,16 +1785,14 @@ %(Text)s """ - if xytext is None: - xytext = xy - if textcoords is None: - textcoords = xycoords - # we'll draw ourself after the artist we annotate by default - x,y = self.xytext = xytext + + _AnnotationBase.__init__(self, + xy, xytext=xytext, + xycoords=xycoords, textcoords=textcoords, + annotation_clip=annotation_clip) + + x,y = self.xytext Text.__init__(self, x, y, s, **kwargs) - self.xy = xy - self.xycoords = xycoords - self.textcoords = textcoords self.arrowprops = arrowprops @@ -1477,10 +1806,6 @@ else: self.arrow_patch = None - # if True, draw annotation only if self.xy is inside the axes - self._annotation_clip = None - - __init__.__doc__ = cbook.dedent(__init__.__doc__) % artist.kwdocd def contains(self,event): t,tinfo = Text.contains(self,event) @@ -1501,118 +1826,6 @@ self.arrow_patch.set_figure(fig) Artist.set_figure(self, fig) - def _get_xy(self, x, y, s): - if s=='data': - trans = self.axes.transData - x = float(self.convert_xunits(x)) - y = float(self.convert_yunits(y)) - return trans.transform_point((x, y)) - elif s=='offset points': - # convert the data point - dx, dy = self.xy - - # prevent recursion - if self.xycoords == 'offset points': - return self._get_xy(dx, dy, 'data') - - dx, dy = self._get_xy(dx, dy, self.xycoords) - - # convert the offset - dpi = self.figure.get_dpi() - x *= dpi/72. - y *= dpi/72. - - # add the offset to the data point - x += dx - y += dy - - return x, y - elif s=='polar': - theta, r = x, y - x = r*np.cos(theta) - y = r*np.sin(theta) - trans = self.axes.transData - return trans.transform_point((x,y)) - elif s=='figure points': - #points from the lower left corner of the figure - dpi = self.figure.dpi - l,b,w,h = self.figure.bbox.bounds - r = l+w - t = b+h - - x *= dpi/72. - y *= dpi/72. - if x<0: - x = r + x - if y<0: - y = t + y - return x,y - elif s=='figure pixels': - #pixels from the lower left corner of the figure - l,b,w,h = self.figure.bbox.bounds - r = l+w - t = b+h - if x<0: - x = r + x - if y<0: - y = t + y - return x, y - elif s=='figure fraction': - #(0,0) is lower left, (1,1) is upper right of figure - trans = self.figure.transFigure - return trans.transform_point((x,y)) - elif s=='axes points': - #points from the lower left corner of the axes - dpi = self.figure.dpi - l,b,w,h = self.axes.bbox.bounds - r = l+w - t = b+h - if x<0: - x = r + x*dpi/72. - else: - x = l + x*dpi/72. - if y<0: - y = t + y*dpi/72. - else: - y = b + y*dpi/72. - return x, y - elif s=='axes pixels': - #pixels from the lower left corner of the axes - - l,b,w,h = self.axes.bbox.bounds - r = l+w - t = b+h - if x<0: - x = r + x - else: - x = l + x - if y<0: - y = t + y - else: - y = b + y - return x, y - elif s=='axes fraction': - #(0,0) is lower left, (1,1) is upper right of axes - trans = self.axes.transAxes - return trans.transform_point((x, y)) - - def set_annotation_clip(self, b): - """ - set *annotation_clip* attribute. - - * True : the annotation will only be drawn when self.xy is inside the axes. - * False : the annotation will always be drawn regardless of its position. - * None : the self.xy will be checked only if *xycoords* is "data" - """ - self._annotation_clip = b - - def get_annotation_clip(self): - """ - Return *annotation_clip* attribute. - See :meth:`set_annotation_clip` for the meaning of return values. - """ - return self._annotation_clip - def update_positions(self, renderer): "Update the pixel positions of the annotated point and the text." @@ -1620,17 +1833,12 @@ self._update_position_xytext(renderer, xy_pixel) - def _get_position_xy(self, renderer): - "Return the pixel position of the the annotated point." - x, y = self.xy - return self._get_xy(x, y, self.xycoords) - - def _update_position_xytext(self, renderer, xy_pixel): "Update the pixel positions of the annotation text and the arrow patch." x, y = self.xytext - self._x, self._y = self._get_xy(x, y, self.textcoords) + self._x, self._y = self._get_xy(renderer, x, y, + self.textcoords) x, y = xy_pixel @@ -1673,12 +1881,37 @@ mutation_scale = renderer.points_to_pixels(mutation_scale) self.arrow_patch.set_mutation_scale(mutation_scale) - if self._bbox_patch: - patchA = d.pop("patchA", self._bbox_patch) - self.arrow_patch.set_patchA(patchA) + if "patchA" in d: + self.arrow_patch.set_patchA(d.pop("patchA")) else: - patchA = d.pop("patchA", self._bbox) - self.arrow_patch.set_patchA(patchA) + if self._bbox_patch: + self.arrow_patch.set_patchA(self._bbox_patch) + else: + patchA = d.pop("patchA", None) + props = self._bbox + if props is None: props = {} + props = props.copy() # don't want to alter the pad externally + pad = props.pop('pad', 4) + pad = renderer.points_to_pixels(pad) + if self.get_text() == "": + self.arrow_patch.set_patchA(None) + return + + bbox = self.get_window_extent(renderer) + l,b,w,h = bbox.bounds + l-=pad/2. + b-=pad/2. + w+=pad + h+=pad + r = Rectangle(xy=(l,b), + width=w, + height=h, + ) + r.set_transform(mtransforms.IdentityTransform()) + r.set_clip_on( False ) + r.update(props) + + self.arrow_patch.set_patchA(r) else: @@ -1710,21 +1943,34 @@ self.arrow.set_clip_box(self.get_clip_box()) - def _check_xy(self, renderer, xy_pixel): + def update_bbox_position_size(self, renderer): """ - given the xy pixel coordinate, check if the annotation need to - be drawn. + Update the location and the size of the bbox. This method + should be used when the position and size of the bbox needs to + be updated before actually drawing the bbox. """ - b = self.get_annotation_clip() - if b or (b is None and self.xycoords == "data"): - # check if self.xy is inside the axes. - if not self.axes.contains_point(xy_pixel): - return False + # For arrow_patch, use textbox as patchA by default. - return True + if not isinstance(self.arrow_patch, FancyArrowPatch): + return + if self._bbox_patch: + posx, posy = self._x, self._y + x_box, y_box, w_box, h_box = _get_textbox(self, renderer) + self._bbox_patch.set_bounds(0., 0., + w_box, h_box) + theta = self.get_rotation()/180.*math.pi + tr = mtransforms.Affine2D().rotate(theta) + tr = tr.translate(posx+x_box, posy+y_box) + self._bbox_patch.set_transform(tr) + fontsize_in_pixel = renderer.points_to_pixels(self.get_size()) + self._bbox_patch.set_mutation_scale(fontsize_in_pixel) + + + + @allow_rasterization def draw(self, renderer): """ Draw the :class:`Annotation` object to the given *renderer*. @@ -1735,14 +1981,13 @@ if not self.get_visible(): return xy_pixel = self._get_position_xy(renderer) - if not self._check_xy(renderer, xy_pixel): return self._update_position_xytext(renderer, xy_pixel) - self.update_bbox_position_size(renderer) + if self.arrow is not None: if self.arrow.figure is None and self.figure is not None: self.arrow.figure = self.figure @@ -1756,5 +2001,10 @@ Text.draw(self, renderer) -artist.kwdocd['Annotation'] = Annotation.__init__.__doc__ + + +docstring.interpd.update(Annotation=Annotation.__init__.__doc__) + + +from matplotlib.textpath import TextPath diff -Nru matplotlib-0.99.3/lib/matplotlib/ticker.py matplotlib-1.0.1/lib/matplotlib/ticker.py --- matplotlib-0.99.3/lib/matplotlib/ticker.py 2010-05-30 20:31:09.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/ticker.py 2011-01-05 18:50:52.000000000 +0000 @@ -118,6 +118,7 @@ from __future__ import division +import decimal import math import numpy as np from matplotlib import rcParams @@ -146,6 +147,7 @@ def set_data_interval(self, vmin, vmax): self.dataLim.intervalx = vmin, vmax + def set_axis(self, axis): self.axis = axis @@ -213,6 +215,7 @@ def __init__(self, labels): self.labels = labels self.n = len(labels) + def __call__(self, x, pos=None): 'Return the format for tick val x at position pos; pos=None indicated unspecified' i = int(x+0.5) @@ -315,22 +318,36 @@ Tick location is a plain old number. If useOffset==True and the data range is much smaller than the data average, then an offset will be determined such that the tick labels are meaningful. Scientific notation is used for - data < 1e-3 or data >= 1e4. + data < 10^-n or data >= 10^m, where n and m are the power limits set using + set_powerlimits((n,m)). The defaults for these are controlled by the + axes.formatter.limits rc parameter. + """ def __init__(self, useOffset=True, useMathText=False): # useOffset allows plotting small data ranges with large offsets: # for example: [1+1e-9,1+2e-9,1+3e-9] # useMathText will render the offset and scientific notation in mathtext - self._useOffset = useOffset + self.set_useOffset(useOffset) self._usetex = rcParams['text.usetex'] self._useMathText = useMathText - self.offset = 0 self.orderOfMagnitude = 0 self.format = '' self._scientific = True self._powerlimits = rcParams['axes.formatter.limits'] + def get_useOffset(self): + return self._useOffset + + def set_useOffset(self, val): + if val in [True, False]: + self.offset = 0 + self._useOffset = val + else: + self._useOffset = False + self.offset = val + + useOffset = property(fget=get_useOffset, fset=set_useOffset) def fix_minus(self, s): 'use a unicode minus rather than hyphen' @@ -407,7 +424,8 @@ if len(self.locs) > 0: vmin, vmax = self.axis.get_view_interval() d = abs(vmax-vmin) - if self._useOffset: self._set_offset(d) + if self._useOffset: + self._set_offset(d) self._set_orderOfMagnitude(d) self._set_format() @@ -506,61 +524,53 @@ is ``False`` """ self._base = base+0.0 - self.labelOnlyBase=labelOnlyBase + self.labelOnlyBase = labelOnlyBase self.decadeOnly = True - def base(self,base): + def base(self, base): 'change the *base* for labeling - warning: should always match the base used for :class:`LogLocator`' - self._base=base + self._base = base - def label_minor(self,labelOnlyBase): + def label_minor(self, labelOnlyBase): 'switch on/off minor ticks labeling' - self.labelOnlyBase=labelOnlyBase + self.labelOnlyBase = labelOnlyBase def __call__(self, x, pos=None): 'Return the format for tick val *x* at position *pos*' vmin, vmax = self.axis.get_view_interval() d = abs(vmax - vmin) - b=self._base + b = self._base if x == 0.0: return '0' sign = np.sign(x) # only label the decades fx = math.log(abs(x))/math.log(b) - isDecade = self.is_decade(fx) + isDecade = is_decade(fx) if not isDecade and self.labelOnlyBase: s = '' elif x>10000: s= '%1.0e'%x elif x<1: s = '%1.0e'%x - else : s = self.pprint_val(x,d) + else : s = self.pprint_val(x, d) if sign == -1: s = '-%s' % s return self.fix_minus(s) - def format_data(self,value): + def format_data(self, value): + b = self.labelOnlyBase self.labelOnlyBase = False value = cbook.strip_math(self.__call__(value)) - self.labelOnlyBase = True + self.labelOnlyBase = b return value def format_data_short(self,value): 'return a short formatted string representation of a number' return '%-12g'%value - def is_decade(self, x): - n = self.nearest_long(x) - return abs(x-n)<1e-10 - - def nearest_long(self, x): - if x==0: return 0L - elif x>0: return long(x+0.5) - else: return long(x-0.5) - def pprint_val(self, x, d): #if the number is not too big and it's an int, format it as an #int - if abs(x)<1e4 and x==int(x): return '%d' % x + if abs(x) < 1e4 and x == int(x): return '%d' % x if d < 1e-2: fmt = '%1.3e' elif d < 1e-1: fmt = '%1.3f' @@ -571,7 +581,7 @@ s = fmt % x #print d, x, fmt, s tup = s.split('e') - if len(tup)==2: + if len(tup) == 2: mantissa = tup[0].rstrip('0').rstrip('.') sign = tup[1][0].replace('+', '') exponent = tup[1][1:].lstrip('0') @@ -598,7 +608,7 @@ sign = np.sign(x) # only label the decades fx = math.log(abs(x))/math.log(b) - isDecade = self.is_decade(fx) + isDecade = is_close_to_int(fx) if not isDecade and self.labelOnlyBase: s = '' #if 0: pass elif fx>10000: s= '%1.0e'%fx @@ -620,14 +630,17 @@ def __call__(self, x, pos=None): 'Return the format for tick val *x* at position *pos*' b = self._base + usetex = rcParams['text.usetex'] + # only label the decades if x == 0: - return '$0$' + if usetex: + return '$0$' + else: + return '$\mathdefault{0}$' sign = np.sign(x) fx = math.log(abs(x))/math.log(b) - isDecade = self.is_decade(fx) - - usetex = rcParams['text.usetex'] + isDecade = is_close_to_int(fx) if sign == -1: sign_string = '-' @@ -642,12 +655,98 @@ s = '$\mathdefault{%s%d^{%.2f}}$'% (sign_string, b, fx) else: if usetex: - s = r'$%s%d^{%d}$'% (sign_string, b, self.nearest_long(fx)) + s = r'$%s%d^{%d}$'% (sign_string, b, nearest_long(fx)) else: - s = r'$\mathdefault{%s%d^{%d}}$'% (sign_string, b, self.nearest_long(fx)) + s = r'$\mathdefault{%s%d^{%d}}$'% (sign_string, b, + nearest_long(fx)) return s +class EngFormatter(Formatter): + """ + Formats axis values using engineering prefixes to represent powers of 1000, + plus a specified unit, eg. 10 MHz instead of 1e7. + """ + + # The SI engineering prefixes + ENG_PREFIXES = { + -24: "y", + -21: "z", + -18: "a", + -15: "f", + -12: "p", + -9: "n", + -6: u"\u03bc", # Greek letter mu + -3: "m", + 0: "", + 3: "k", + 6: "M", + 9: "G", + 12: "T", + 15: "P", + 18: "E", + 21: "Z", + 24: "Y" + } + + def __init__(self, unit="", places=None): + self.unit = unit + self.places = places + + def __call__(self, x, pos=None): + s = "%s%s" % (self.format_eng(x), self.unit) + return self.fix_minus(s) + + def format_eng(self, num): + """ Formats a number in engineering notation, appending a letter + representing the power of 1000 of the original number. Some examples: + + >>> format_eng(0) for self.places = 0 + '0' + + >>> format_eng(1000000) for self.places = 1 + '1.0 M' + + >>> format_eng("-1e-6") for self.places = 2 + u'-1.00 \u03bc' + + @param num: the value to represent + @type num: either a numeric value or a string that can be converted to + a numeric value (as per decimal.Decimal constructor) + + @return: engineering formatted string + """ + + dnum = decimal.Decimal(str(num)) + + sign = 1 + + if dnum < 0: + sign = -1 + dnum = -dnum + + if dnum != 0: + pow10 = decimal.Decimal(int(math.floor(dnum.log10()/3)*3)) + else: + pow10 = decimal.Decimal(0) + + pow10 = pow10.min(max(self.ENG_PREFIXES.keys())) + pow10 = pow10.max(min(self.ENG_PREFIXES.keys())) + + prefix = self.ENG_PREFIXES[int(pow10)] + + mant = sign*dnum/(10**pow10) + + if self.places is None: + format_str = u"%g %s" + elif self.places == 0: + format_str = u"%i %s" + elif self.places > 0: + format_str = (u"%%.%if %%s" % self.places) + + formatted = format_str % (mant, prefix) + + return formatted.strip() class Locator(TickHelper): """ @@ -658,10 +757,24 @@ limits """ + # some automatic tick locators can generate so many ticks they + # kill the machine when you try and render them, see eg sf bug + # report + # https://sourceforge.net/tracker/index.php?func=detail&aid=2715172&group_id=80706&atid=560720. + # This parameter is set to cause locators to raise an error if too + # many ticks are generated + MAXTICKS = 1000 def __call__(self): 'Return the locations of the ticks' raise NotImplementedError('Derived must override') + def raise_if_exceeds(self, locs): + 'raise a RuntimeError if Locator attempts to create more than MAXTICKS locs' + if len(locs)>=self.MAXTICKS: + raise RuntimeError('Locator attempting to generate %d ticks from %s to %s: exceeds Locator.MAXTICKS'%(len(locs), locs[0], locs[-1])) + + return locs + def view_limits(self, vmin, vmax): """ select a scale for the range from vmin to vmax @@ -721,7 +834,8 @@ def __call__(self): 'Return the locations of the ticks' dmin, dmax = self.axis.get_data_interval() - return np.arange(dmin + self.offset, dmax+1, self._base) + return self.raise_if_exceeds( + np.arange(dmin + self.offset, dmax+1, self._base)) class FixedLocator(Locator): @@ -751,7 +865,7 @@ ticks1 = self.locs[i::step] if np.absolute(ticks1).min() < np.absolute(ticks).min(): ticks = ticks1 - return ticks + return self.raise_if_exceeds(ticks) @@ -805,7 +919,7 @@ if self.numticks==0: return [] ticklocs = np.linspace(vmin, vmax, self.numticks) - return ticklocs + return self.raise_if_exceeds(ticklocs) def _set_numticks(self): @@ -893,7 +1007,7 @@ base = self._base.get_base() n = (vmax - vmin + 0.001*base)//base locs = vmin + np.arange(n+1) * base - return locs + return self.raise_if_exceeds(locs) def view_limits(self, dmin, dmax): """ @@ -932,37 +1046,79 @@ """ Select no more than N intervals at nice locations. """ - - def __init__(self, nbins = 10, steps = None, - trim = True, - integer=False, - symmetric=False, - prune=None): + default_params = dict(nbins = 10, + steps = None, + trim = True, + integer=False, + symmetric=False, + prune=None) + def __init__(self, *args, **kwargs): """ Keyword args: + + *nbins* + Maximum number of intervals; one less than max number of ticks. + + *steps* + Sequence of nice numbers starting with 1 and ending with 10; + e.g., [1, 2, 4, 5, 10] + + *integer* + If True, ticks will take only integer values. + + *symmetric* + If True, autoscaling will result in a range symmetric + about zero. + *prune* + ['lower' | 'upper' | 'both' | None] Remove edge ticks -- useful for stacked or ganged plots where the upper tick of one axes overlaps with the lower - tick of the axes above it. One of 'lower' | 'upper' | - 'both' | None. If prune=='lower', the smallest tick will + tick of the axes above it. + If prune=='lower', the smallest tick will be removed. If prune=='upper', the largest tick will be removed. If prune=='both', the largest and smallest ticks will be removed. If prune==None, no ticks will be removed. """ - self._nbins = int(nbins) - self._trim = trim - self._integer = integer - self._symmetric = symmetric - self._prune = prune - if steps is None: - self._steps = [1, 1.5, 2, 2.5, 3, 4, 5, 6, 8, 10] - else: - if int(steps[-1]) != 10: - steps = list(steps) - steps.append(10) - self._steps = steps - if integer: + # I left "trim" out; it defaults to True, and it is not + # clear that there is any use case for False, so we may + # want to remove that kwarg. EF 2010/04/18 + if args: + kwargs['nbins'] = args[0] + if len(args) > 1: + raise ValueError( + "Keywords are required for all arguments except 'nbins'") + self.set_params(**self.default_params) + self.set_params(**kwargs) + + def set_params(self, **kwargs): + if 'nbins' in kwargs: + self._nbins = int(kwargs['nbins']) + if 'trim' in kwargs: + self._trim = kwargs['trim'] + if 'integer' in kwargs: + self._integer = kwargs['integer'] + if 'symmetric' in kwargs: + self._symmetric = kwargs['symmetric'] + if 'prune' in kwargs: + prune = kwargs['prune'] + if prune is not None and prune not in ['upper', 'lower', 'both']: + raise ValueError( + "prune must be 'upper', 'lower', 'both', or None") + self._prune = prune + if 'steps' in kwargs: + steps = kwargs['steps'] + if steps is None: + self._steps = [1, 1.5, 2, 2.5, 3, 4, 5, 6, 8, 10] + else: + if int(steps[-1]) != 10: + steps = list(steps) + steps.append(10) + self._steps = steps + if 'integer' in kwargs: + self._integer = kwargs['integer'] + if self._integer: self._steps = [n for n in self._steps if divmod(n,1)[1] < 0.001] def bin_boundaries(self, vmin, vmax): @@ -1003,7 +1159,7 @@ locs = locs[:-1] elif prune=='both': locs = locs[1:-1] - return locs + return self.raise_if_exceeds(locs) def view_limits(self, dmin, dmax): if self._symmetric: @@ -1016,35 +1172,53 @@ def decade_down(x, base=10): 'floor x to the nearest lower decade' - + if x == 0.0: + return -base lx = math.floor(math.log(x)/math.log(base)) return base**lx def decade_up(x, base=10): 'ceil x to the nearest higher decade' + if x == 0.0: + return base lx = math.ceil(math.log(x)/math.log(base)) return base**lx -def is_decade(x,base=10): - lx = math.log(x)/math.log(base) - return lx==int(lx) +def nearest_long(x): + if x == 0: return 0L + elif x > 0: return long(x+0.5) + else: return long(x-0.5) + +def is_decade(x, base=10): + if not np.isfinite(x): + return False + if x == 0.0: + return True + lx = math.log(abs(x))/math.log(base) + return is_close_to_int(lx) + +def is_close_to_int(x): + if not np.isfinite(x): + return False + return abs(x - nearest_long(x)) < 1e-10 class LogLocator(Locator): """ Determine the tick locations for log axes """ - def __init__(self, base=10.0, subs=[1.0]): + def __init__(self, base=10.0, subs=[1.0], numdecs=4): """ place ticks on the location= base**i*subs[j] """ self.base(base) self.subs(subs) self.numticks = 15 + self.numdecs = numdecs def base(self,base): """ - set the base of the log scaling (major tick every base**i, i interger) + set the base of the log scaling (major tick every base**i, i integer) """ self._base=base+0.0 @@ -1065,9 +1239,18 @@ b=self._base vmin, vmax = self.axis.get_view_interval() + + # dummy axis has no axes attribute + if hasattr(self.axis, 'axes') and self.axis.axes.name == 'polar': + vmax = math.ceil(math.log(vmax) / math.log(b)) + decades = np.arange(vmax - self.numdecs, vmax) + ticklocs = b ** decades + + return ticklocs + if vmin <= 0.0: vmin = self.axis.get_minpos() - if vmin <= 0.0: + if vmin <= 0.0 or not np.isfinite(vmin): raise ValueError( "Data has no positive values, and therefore can not be log-scaled.") @@ -1099,17 +1282,23 @@ else: ticklocs = b**decades - return np.array(ticklocs) + return self.raise_if_exceeds(np.array(ticklocs)) def view_limits(self, vmin, vmax): 'Try to choose the view limits intelligently' + b = self._base if vmax vmax: vmin,vmax = vmax,vmin + locs = locs[(vmin < locs) & (locs < vmax)] + + # don't create minor ticks on top of existing major ticks + diff = 0.5 * abs(locs[1] - locs[0]) + locs = [l for l in locs if (np.abs(l - majorlocs) > diff).all()] - return locs[(vmin < locs) & (locs < vmax)] + return self.raise_if_exceeds(np.array(locs)) class OldAutoLocator(Locator): @@ -1249,7 +1441,7 @@ def __call__(self): 'Return the locations of the ticks' self.refresh() - return self._locator() + return self.raise_if_exceeds(self._locator()) def refresh(self): 'refresh internal information based on current lim' diff -Nru matplotlib-0.99.3/lib/matplotlib/tight_bbox.py matplotlib-1.0.1/lib/matplotlib/tight_bbox.py --- matplotlib-0.99.3/lib/matplotlib/tight_bbox.py 2009-07-31 15:14:40.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tight_bbox.py 2010-07-07 01:41:52.000000000 +0000 @@ -6,6 +6,7 @@ from matplotlib.transforms import Bbox, TransformedBbox, Affine2D + def adjust_bbox(fig, format, bbox_inches): """ Temporarily adjust the figure so that only the specified area @@ -46,11 +47,9 @@ fig.transFigure.invalidate() fig.patch.set_bounds(0, 0, 1, 1) - if format in ["png", "raw", "rgba"]: - adjust_bbox_png(fig, bbox_inches) - return restore_bbox - elif format in ["pdf", "eps", "svg", "svgz"]: - adjust_bbox_pdf(fig, bbox_inches) + adjust_bbox_handler = _adjust_bbox_handler_d.get(format) + if adjust_bbox_handler is not None: + adjust_bbox_handler(fig, bbox_inches) return restore_bbox else: warnings.warn("bbox_inches option for %s backend is not implemented yet." % (format)) @@ -125,3 +124,8 @@ return bbox_inches, r +_adjust_bbox_handler_d = {} +for format in ["png", "raw", "rgba"]: + _adjust_bbox_handler_d[format] = adjust_bbox_png +for format in ["pdf", "eps", "svg", "svgz"]: + _adjust_bbox_handler_d[format] = adjust_bbox_pdf diff -Nru matplotlib-0.99.3/lib/matplotlib/transforms.py matplotlib-1.0.1/lib/matplotlib/transforms.py --- matplotlib-0.99.3/lib/matplotlib/transforms.py 2010-03-09 14:20:20.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/transforms.py 2010-08-25 16:53:11.000000000 +0000 @@ -711,7 +711,10 @@ self._points = np.asarray(points, np.float_) self._minpos = np.array([0.0000001, 0.0000001]) self._ignore = True - + # it is helpful in some contexts to know if the bbox is a + # default or has been mutated; we store the orig points to + # support the mutated methods + self._points_orig = self._points.copy() if DEBUG: ___init__ = __init__ def __init__(self, points): @@ -939,6 +942,21 @@ self._points = other.get_points() self.invalidate() + def mutated(self): + 'return whether the bbox has changed since init' + return self.mutatedx() or self.mutatedy() + + def mutatedx(self): + 'return whether the x-limits have changed since init' + return (self._points[0,0]!=self._points_orig[0,0] or + self._points[1,0]!=self._points_orig[1,0]) + def mutatedy(self): + 'return whether the y-limits have changed since init' + return (self._points[0,1]!=self._points_orig[0,1] or + self._points[1,1]!=self._points_orig[1,1]) + + + class TransformedBbox(BboxBase): """ @@ -1048,7 +1066,7 @@ """ Used by C/C++ -based backends to get at the array matrix data. """ - return self.frozen().__array__() + raise NotImplementedError def transform(self, values): """ @@ -2089,6 +2107,31 @@ get_matrix.__doc__ = Affine2DBase.get_matrix.__doc__ +class BboxTransformToMaxOnly(BboxTransformTo): + """ + :class:`BboxTransformTo` is a transformation that linearly + transforms points from the unit bounding box to a given + :class:`Bbox` with a fixed upper left of (0, 0). + """ + def __repr__(self): + return "BboxTransformToMaxOnly(%s)" % (self._boxout) + __str__ = __repr__ + + def get_matrix(self): + if self._invalid: + xmax, ymax = self._boxout.max + if DEBUG and (xmax == 0 or ymax == 0): + raise ValueError("Transforming to a singular bounding box.") + self._mtx = np.array([[xmax, 0.0, 0.0], + [ 0.0, ymax, 0.0], + [ 0.0, 0.0, 1.0]], + np.float_) + self._inverted = None + self._invalid = 0 + return self._mtx + get_matrix.__doc__ = Affine2DBase.get_matrix.__doc__ + + class BboxTransformFrom(Affine2DBase): """ :class:`BboxTransformFrom` linearly transforms points from a given @@ -2248,6 +2291,7 @@ else: vmin -= expander*abs(vmin) vmax += expander*abs(vmax) + if swapped and not increasing: vmin, vmax = vmax, vmin return vmin, vmax diff -Nru matplotlib-0.99.3/lib/matplotlib/tri/__init__.py matplotlib-1.0.1/lib/matplotlib/tri/__init__.py --- matplotlib-0.99.3/lib/matplotlib/tri/__init__.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tri/__init__.py 2010-07-07 01:41:49.000000000 +0000 @@ -0,0 +1,8 @@ +""" +Unstructured triangular grid functions. +""" + +from triangulation import * +from tricontour import * +from tripcolor import * +from triplot import * diff -Nru matplotlib-0.99.3/lib/matplotlib/tri/triangulation.py matplotlib-1.0.1/lib/matplotlib/tri/triangulation.py --- matplotlib-0.99.3/lib/matplotlib/tri/triangulation.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tri/triangulation.py 2010-07-07 01:41:49.000000000 +0000 @@ -0,0 +1,219 @@ +import matplotlib.delaunay as delaunay +import matplotlib._tri as _tri +import numpy as np + +class Triangulation(object): + """ + An unstructured triangular grid consisting of npoints points and + ntri triangles. The triangles can either be specified by the user + or automatically generated using a Delaunay triangulation. + + Read-only attributes: + + *x*: array of shape (npoints). + x-coordinates of grid points. + + *y*: array of shape (npoints). + y-coordinates of grid points. + + *triangles*: integer array of shape (ntri,3). + For each triangle, the indices of the three points that make + up the triangle, ordered in an anticlockwise manner. + + *mask*: optional boolean array of shape (ntri). + Which triangles are masked out. + + *edges*: integer array of shape (?,2). + All edges of non-masked triangles. Each edge is the start + point index and end point index. Each edge (start,end and + end,start) appears only once. + + *neighbors*: integer array of shape (ntri,3). + For each triangle, the indices of the three triangles that + share the same edges, or -1 if there is no such neighboring + triangle. neighbors[i,j] is the triangle that is the neighbor + to the edge from point index triangles[i,j] to point index + triangles[i,(j+1)%3]. + """ + def __init__(self, x, y, triangles=None, mask=None): + """ + Create a Triangulation object. + + The first two arguments must be: + + *x*, *y*: arrays of shape (npoints). + Point coordinates. + + Optional arguments (args or keyword args): + + *triangles*: integer array of shape (ntri,3). + For each triangle, the indices of the three points that make + up the triangle. If the points are ordered in a clockwise + manner, they are converted to anticlockwise. + + If not specified, matplotlib.delaunay is used to create a + Delaunay triangulation of the points. + + *mask*: optional boolean array of shape (ntri). + Which triangles are masked out. + """ + self.x = np.asarray(x, dtype=np.float64) + self.y = np.asarray(y, dtype=np.float64) + if self.x.shape != self.y.shape or len(self.x.shape) != 1: + raise ValueError("x and y must be equal-length 1-D arrays") + + self.mask = None + self._edges = None + self._neighbors = None + + if triangles is None: + # No triangulation specified, so use matplotlib.delaunay. + dt = delaunay.Triangulation(self.x, self.y) + self.triangles = np.asarray(dt.triangle_nodes, dtype=np.int32) + if mask is None: + self._edges = np.asarray(dt.edge_db, dtype=np.int32) + # Delaunay triangle_neighbors uses different edge indexing, + # so convert. + neighbors = np.asarray(dt.triangle_neighbors, dtype=np.int32) + self._neighbors = np.roll(neighbors, 1, axis=1) + else: + # Triangulation specified. + self.triangles = np.asarray(triangles, dtype=np.int32) + if self.triangles.ndim != 2 or self.triangles.shape[1] != 3: + raise ValueError('triangles must be a (?,3) array') + if self.triangles.max() >= len(self.x): + raise ValueError('triangles max element is out of bounds') + if self.triangles.min() < 0: + raise ValueError('triangles min element is out of bounds') + + if mask is not None: + self.mask = np.asarray(mask, dtype=np.bool) + if len(self.mask.shape) != 1 or \ + self.mask.shape[0] != self.triangles.shape[0]: + raise ValueError('mask array must have same length as ' + 'triangles array') + + # Underlying C++ object is not created until first needed. + self._cpp_triangulation = None + + @property + def edges(self): + if self._edges is None: + self._edges = self.get_cpp_triangulation().get_edges() + return self._edges + + def get_cpp_triangulation(self): + """ + Return the underlying C++ Triangulation object, creating it + if necessary. + """ + if self._cpp_triangulation is None: + self._cpp_triangulation = _tri.Triangulation( + self.x, self.y, self.triangles, self.mask, self._edges, + self._neighbors) + return self._cpp_triangulation + + def get_masked_triangles(self): + """ + Return an array of triangles that are not masked. + """ + if self.mask is not None: + return self.triangles.compress(1-self.mask, axis=0) + else: + return self.triangles + + @staticmethod + def get_from_args_and_kwargs(*args, **kwargs): + """ + Return a Triangulation object from the args and kwargs, and + the remaining args and kwargs with the consumed values removed. + + There are two alternatives: either the first argument is a + Triangulation object, in which case it is returned, or the args + and kwargs are sufficient to create a new Triangulation to + return. In the latter case, see Triangulation.__init__ for + the possible args and kwargs. + """ + if isinstance(args[0], Triangulation): + triangulation = args[0] + args = args[1:] + else: + x = args[0] + y = args[1] + args = args[2:] # Consumed first two args. + ignore_remaining_args = True + + # Check triangles in kwargs then args. + triangles = kwargs.pop('triangles', None) + from_args = False + if triangles is None and len(args) > 0: + triangles = args[0] + from_args = True + + if triangles is not None: + try: + triangles = np.asarray(triangles, dtype=np.int32) + except ValueError: + triangles = None + + if triangles is not None and (triangles.ndim != 2 or + triangles.shape[1] != 3): + triangles = None + + if triangles is not None and from_args: + args = args[1:] # Consumed first item in args. + ignore_remaining_args = False + + # Check for mask in kwargs then args. + mask = kwargs.pop('mask', None) + from_args = False + if mask is None and not ignore_remaining_args and len(args) > 0: + mask = args[0] + from_args = True + + if mask is not None: + try: + mask = np.asarray(mask, dtype=np.bool) + except ValueError: + mask = None + + if mask is not None and mask.ndim != 1: + mask = None + + if mask is not None and triangles is not None and \ + len(mask) != triangles.shape[0]: + mask = None + + if mask is not None and from_args: + args = args[1:] # Consumed first item in args. + + triangulation = Triangulation(x, y, triangles, mask) + return triangulation, args, kwargs + + @property + def neighbors(self): + if self._neighbors is None: + self._neighbors = self._get_cpp_triangulation().get_neighbors() + return self._neighbors + + def set_mask(self, mask): + """ + Set or clear the mask array. This is either None, or a boolean + array of shape (ntri). + """ + if mask is None: + self.mask = None + else: + self.mask = np.asarray(mask, dtype=np.bool) + if len(self.mask.shape) != 1 or \ + self.mask.shape[0] != self.triangles.shape[0]: + raise ValueError('mask array must have same length as ' + 'triangles array') + + # Set mask in C++ Triangulation. + if self._cpp_triangulation is not None: + self._cpp_triangulation.set_mask(self.mask) + + # Clear derived fields so they are recalculated when needed. + self._edges = None + self._neighbors = None diff -Nru matplotlib-0.99.3/lib/matplotlib/tri/tricontour.py matplotlib-1.0.1/lib/matplotlib/tri/tricontour.py --- matplotlib-0.99.3/lib/matplotlib/tri/tricontour.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tri/tricontour.py 2010-08-03 14:22:40.000000000 +0000 @@ -0,0 +1,289 @@ +from matplotlib.contour import ContourSet +from matplotlib.tri.triangulation import Triangulation +import matplotlib._tri as _tri +import numpy as np + + +class TriContourSet(ContourSet): + """ + Create and store a set of contour lines or filled regions for + a triangular grid. + + User-callable method: clabel + + Useful attributes: + ax: + the axes object in which the contours are drawn + collections: + a silent_list of LineCollections or PolyCollections + levels: + contour levels + layers: + same as levels for line contours; half-way between + levels for filled contours. See _process_colors method. + """ + def __init__(self, ax, *args, **kwargs): + """ + Draw triangular grid contour lines or filled regions, + depending on whether keyword arg 'filled' is False + (default) or True. + + The first argument of the initializer must be an axes + object. The remaining arguments and keyword arguments + are described in TriContourSet.tricontour_doc. + """ + ContourSet.__init__(self, ax, *args, **kwargs) + + def _process_args(self, *args, **kwargs): + """ + Process args and kwargs. + """ + if isinstance(args[0], TriContourSet): + C = args[0].cppContourGenerator + if self.levels is None: + self.levels = args[0].levels + else: + tri, z = self._contour_args(args, kwargs) + C = _tri.TriContourGenerator(tri.get_cpp_triangulation(), z) + x0 = tri.x.min() + x1 = tri.x.max() + y0 = tri.y.min() + y1 = tri.y.max() + self.ax.update_datalim([(x0,y0), (x1,y1)]) + self.ax.autoscale_view() + + self.cppContourGenerator = C + + def _get_allsegs_and_allkinds(self): + """ + Create and return allsegs and allkinds by calling underlying C code. + """ + allsegs = [] + if self.filled: + lowers, uppers = self._get_lowers_and_uppers() + allkinds = [] + for lower, upper in zip(lowers, uppers): + segs, kinds = self.cppContourGenerator.create_filled_contour( + lower, upper) + allsegs.append([segs]) + allkinds.append([kinds]) + else: + allkinds = None + for level in self.levels: + segs = self.cppContourGenerator.create_contour(level) + allsegs.append(segs) + return allsegs, allkinds + + def _contour_args(self, args, kwargs): + if self.filled: fn = 'contourf' + else: fn = 'contour' + tri, args, kwargs = \ + Triangulation.get_from_args_and_kwargs(*args, **kwargs) + z = np.asarray(args[0]) + if z.shape != tri.x.shape: + raise ValueError('z array must have same length as triangulation x' + 'and y arrays') + self.zmax = z.max() + self.zmin = z.min() + if self.logscale and self.zmin <= 0: + raise ValueError('Cannot %s log of negative values.' % fn) + self._contour_level_args(z, args[1:]) + return (tri, z) + + tricontour_doc = """ + :func:`~matplotlib.pyplot.tricontour` and + :func:`~matplotlib.pyplot.tricontourf` draw contour lines and + filled contours, respectively, on an unstructured triangular + grid. Except as noted, function + signatures and return values are the same for both versions. + + The triangulation can be specified in one of two ways; either:: + + tricontour(triangulation, ...) + + where triangulation is a :class:`~matplotlib.tri.Triangulation` + object, or + + :: + + tricontour(x, y, ...) + tricontour(x, y, triangles, ...) + tricontour(x, y, triangles=triangles, ...) + tricontour(x, y, mask, ...) + tricontour(x, y, mask=mask, ...) + tricontour(x, y, triangles, mask, ...) + tricontour(x, y, triangles, mask=mask, ...) + + in which case a Triangulation object will be created. See + :class:`~matplotlib.tri.Triangulation` for a explanation of + these possibilities. + + The remaining arguments may be:: + + tricontour(..., Z) + + where *Z* is the array of values to contour, one per point + in the triangulation. The level values are chosen + automatically. + + :: + + tricontour(..., Z, N) + + contour *N* automatically-chosen levels. + + :: + + tricontour(..., Z, V) + + draw contour lines at the values specified in sequence *V* + + :: + + tricontourf(..., Z, V) + + fill the (len(*V*)-1) regions between the values in *V* + + :: + + tricontour(Z, **kwargs) + + Use keyword args to control colors, linewidth, origin, cmap ... see + below for more details. + + ``C = tricontour(...)`` returns a + :class:`~matplotlib.contour.TriContourSet` object. + + Optional keyword arguments: + + *colors*: [ None | string | (mpl_colors) ] + If *None*, the colormap specified by cmap will be used. + + If a string, like 'r' or 'red', all levels will be plotted in this + color. + + If a tuple of matplotlib color args (string, float, rgb, etc), + different levels will be plotted in different colors in the order + specified. + + *alpha*: float + The alpha blending value + + *cmap*: [ None | Colormap ] + A cm :class:`~matplotlib.cm.Colormap` instance or + *None*. If *cmap* is *None* and *colors* is *None*, a + default Colormap is used. + + *norm*: [ None | Normalize ] + A :class:`matplotlib.colors.Normalize` instance for + scaling data values to colors. If *norm* is *None* and + *colors* is *None*, the default linear scaling is used. + + *levels* [level0, level1, ..., leveln] + A list of floating point numbers indicating the level + curves to draw; eg to draw just the zero contour pass + ``levels=[0]`` + + *origin*: [ None | 'upper' | 'lower' | 'image' ] + If *None*, the first value of *Z* will correspond to the + lower left corner, location (0,0). If 'image', the rc + value for ``image.origin`` will be used. + + This keyword is not active if *X* and *Y* are specified in + the call to contour. + + *extent*: [ None | (x0,x1,y0,y1) ] + + If *origin* is not *None*, then *extent* is interpreted as + in :func:`matplotlib.pyplot.imshow`: it gives the outer + pixel boundaries. In this case, the position of Z[0,0] + is the center of the pixel, not a corner. If *origin* is + *None*, then (*x0*, *y0*) is the position of Z[0,0], and + (*x1*, *y1*) is the position of Z[-1,-1]. + + This keyword is not active if *X* and *Y* are specified in + the call to contour. + + *locator*: [ None | ticker.Locator subclass ] + If *locator* is None, the default + :class:`~matplotlib.ticker.MaxNLocator` is used. The + locator is used to determine the contour levels if they + are not given explicitly via the *V* argument. + + *extend*: [ 'neither' | 'both' | 'min' | 'max' ] + Unless this is 'neither', contour levels are automatically + added to one or both ends of the range so that all data + are included. These added ranges are then mapped to the + special colormap values which default to the ends of the + colormap range, but can be set via + :meth:`matplotlib.colors.Colormap.set_under` and + :meth:`matplotlib.colors.Colormap.set_over` methods. + + *xunits*, *yunits*: [ None | registered units ] + Override axis units by specifying an instance of a + :class:`matplotlib.units.ConversionInterface`. + + + tricontour-only keyword arguments: + + *linewidths*: [ None | number | tuple of numbers ] + If *linewidths* is *None*, the default width in + ``lines.linewidth`` in ``matplotlibrc`` is used. + + If a number, all levels will be plotted with this linewidth. + + If a tuple, different levels will be plotted with different + linewidths in the order specified + + *linestyles*: [None | 'solid' | 'dashed' | 'dashdot' | 'dotted' ] + If *linestyles* is *None*, the 'solid' is used. + + *linestyles* can also be an iterable of the above strings + specifying a set of linestyles to be used. If this + iterable is shorter than the number of contour levels + it will be repeated as necessary. + + If contour is using a monochrome colormap and the contour + level is less than 0, then the linestyle specified + in ``contour.negative_linestyle`` in ``matplotlibrc`` + will be used. + + tricontourf-only keyword arguments: + + *antialiased*: [ True | False ] + enable antialiasing + + *nchunk*: [ 0 | integer ] + If 0, no subdivision of the domain. Specify a positive integer to + divide the domain into subdomains of roughly *nchunk* by *nchunk* + points. This may never actually be advantageous, so this option may + be removed. Chunking introduces artifacts at the chunk boundaries + unless *antialiased* is *False*. + + Note: tricontourf fills intervals that are closed at the top; that + is, for boundaries *z1* and *z2*, the filled region is:: + + z1 < z <= z2 + + There is one exception: if the lowest boundary coincides with + the minimum value of the *z* array, then that minimum value + will be included in the lowest interval. + + **Examples:** + + .. plot:: mpl_examples/pylab_examples/tricontour_demo.py + """ + + +def tricontour(ax, *args, **kwargs): + if not ax._hold: ax.cla() + kwargs['filled'] = False + return TriContourSet(ax, *args, **kwargs) +tricontour.__doc__ = TriContourSet.tricontour_doc + + +def tricontourf(ax, *args, **kwargs): + if not ax._hold: ax.cla() + kwargs['filled'] = True + return TriContourSet(ax, *args, **kwargs) +tricontourf.__doc__ = TriContourSet.tricontour_doc diff -Nru matplotlib-0.99.3/lib/matplotlib/tri/_tri.cpp matplotlib-1.0.1/lib/matplotlib/tri/_tri.cpp --- matplotlib-0.99.3/lib/matplotlib/tri/_tri.cpp 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tri/_tri.cpp 2010-09-23 19:54:48.000000000 +0000 @@ -0,0 +1,1113 @@ +#include "_tri.h" +#include "src/mplutils.h" + +#include +#include +#include + +#define MOVETO 1 +#define LINETO 2 + + + +TriEdge::TriEdge() + : tri(-1), edge(-1) +{} + +TriEdge::TriEdge(int tri_, int edge_) + : tri(tri_), edge(edge_) +{} + +bool TriEdge::operator<(const TriEdge& other) const +{ + if (tri != other.tri) + return tri < other.tri; + else + return edge < other.edge; +} + +bool TriEdge::operator==(const TriEdge& other) const +{ + return tri == other.tri && edge == other.edge; +} + +bool TriEdge::operator!=(const TriEdge& other) const +{ + return !operator==(other); +} + +std::ostream& operator<<(std::ostream& os, const TriEdge& tri_edge) +{ + return os << tri_edge.tri << ' ' << tri_edge.edge; +} + + + +XY::XY() +{} + +XY::XY(const double& x_, const double& y_) + : x(x_), y(y_) +{} + +double XY::angle() const +{ + return atan2(y, x); +} + +double XY::cross_z(const XY& other) const +{ + return x*other.y - y*other.x; +} + +bool XY::operator==(const XY& other) const +{ + return x == other.x && y == other.y; +} + +bool XY::operator!=(const XY& other) const +{ + return x != other.x || y != other.y; +} + +bool XY::operator<(const XY& other) const +{ + if (y == other.y) + return x < other.x; + else + return y < other.y; +} + +XY XY::operator*(const double& multiplier) const +{ + return XY(x*multiplier, y*multiplier); +} + +XY XY::operator+(const XY& other) const +{ + return XY(x + other.x, y + other.y); +} + +XY XY::operator-(const XY& other) const +{ + return XY(x - other.x, y - other.y); +} + +std::ostream& operator<<(std::ostream& os, const XY& xy) +{ + return os << '(' << xy.x << ' ' << xy.y << ')'; +} + + + +BoundingBox::BoundingBox() + : empty(true) +{} + +void BoundingBox::add(const XY& point) +{ + if (empty) { + empty = false; + lower = upper = point; + } else { + if (point.x < lower.x) lower.x = point.x; + else if (point.x > upper.x) upper.x = point.x; + + if (point.y < lower.y) lower.y = point.y; + else if (point.y > upper.y) upper.y = point.y; + } +} + +bool BoundingBox::contains_x(const double& x) const +{ + return !empty && x >= lower.x && x <= upper.x; +} + +std::ostream& operator<<(std::ostream& os, const BoundingBox& box) +{ + if (box.empty) + return os << ""; + else + return os << box.lower << " -> " << box.upper; +} + + + +ContourLine::ContourLine() + : std::vector() +{} + +void ContourLine::insert_unique(iterator pos, const XY& point) +{ + if (empty() || pos == end() || point != *pos) + std::vector::insert(pos, point); +} + +void ContourLine::push_back(const XY& point) +{ + if (empty() || point != back()) + std::vector::push_back(point); +} + +void ContourLine::write() const +{ + std::cout << "ContourLine of " << size() << " points:"; + for (const_iterator it = begin(); it != end(); ++it) + std::cout << ' ' << *it; + std::cout << std::endl; +} + + + +void write_contour(const Contour& contour) +{ + std::cout << "Contour of " << contour.size() << " lines." << std::endl; + for (Contour::const_iterator it = contour.begin(); it != contour.end(); ++it) + it->write(); +} + + + + +Triangulation::Triangulation(PyArrayObject* x, + PyArrayObject* y, + PyArrayObject* triangles, + PyArrayObject* mask, + PyArrayObject* edges, + PyArrayObject* neighbors) + : _npoints(PyArray_DIM(x,0)), + _ntri(PyArray_DIM(triangles,0)), + _x(x), + _y(y), + _triangles(triangles), + _mask(mask), + _edges(edges), + _neighbors(neighbors) +{ + _VERBOSE("Triangulation::Triangulation"); + correct_triangles(); +} + +Triangulation::~Triangulation() +{ + _VERBOSE("Triangulation::~Triangulation"); + Py_XDECREF(_x); + Py_XDECREF(_y); + Py_XDECREF(_triangles); + Py_XDECREF(_mask); + Py_XDECREF(_edges); + Py_XDECREF(_neighbors); +} + +void Triangulation::calculate_boundaries() +{ + _VERBOSE("Triangulation::calculate_boundaries"); + + get_neighbors(); // Ensure _neighbors has been created. + + // Create set of all boundary TriEdges, which are those which do not + // have a neighbor triangle. + typedef std::set BoundaryEdges; + BoundaryEdges boundary_edges; + for (int tri = 0; tri < _ntri; ++tri) { + if (!is_masked(tri)) { + for (int edge = 0; edge < 3; ++edge) { + if (get_neighbor(tri, edge) == -1) { + boundary_edges.insert(TriEdge(tri, edge)); + } + } + } + } + + // Take any boundary edge and follow the boundary until return to start + // point, removing edges from boundary_edges as they are used. At the same + // time, initialise the _tri_edge_to_boundary_map. + while (!boundary_edges.empty()) { + // Start of new boundary. + BoundaryEdges::iterator it = boundary_edges.begin(); + int tri = it->tri; + int edge = it->edge; + _boundaries.push_back(Boundary()); + Boundary& boundary = _boundaries.back(); + + while (true) { + boundary.push_back(TriEdge(tri, edge)); + boundary_edges.erase(it); + _tri_edge_to_boundary_map[TriEdge(tri, edge)] = + BoundaryEdge(_boundaries.size()-1, boundary.size()-1); + + // Move to next edge of current triangle. + edge = (edge+1) % 3; + + // Find start point index of boundary edge. + int point = get_triangle_point(tri, edge); + + // Find next TriEdge by traversing neighbors until find one + // without a neighbor. + while (get_neighbor(tri, edge) != -1) { + tri = get_neighbor(tri, edge); + edge = get_edge_in_triangle(tri, point); + } + + if (TriEdge(tri,edge) == boundary.front()) + break; // Reached beginning of this boundary, so finished it. + else + it = boundary_edges.find(TriEdge(tri, edge)); + } + } +} + +void Triangulation::calculate_edges() +{ + _VERBOSE("Triangulation::calculate_edges"); + Py_XDECREF(_edges); + + // Create set of all edges, storing them with start point index less than + // end point index. + typedef std::set EdgeSet; + EdgeSet edge_set; + for (int tri = 0; tri < _ntri; ++tri) { + if (!is_masked(tri)) { + for (int edge = 0; edge < 3; edge++) { + int start = get_triangle_point(tri, edge); + int end = get_triangle_point(tri, (edge+1)%3); + edge_set.insert(start > end ? Edge(start,end) : Edge(end,start)); + } + } + } + + // Convert to python _edges array. + npy_intp dims[2] = {edge_set.size(), 2}; + _edges = (PyArrayObject*)PyArray_SimpleNew(2, dims, PyArray_INT); + int* edges_ptr = (int*)PyArray_DATA(_edges); + for (EdgeSet::const_iterator it = edge_set.begin(); it != edge_set.end(); ++it) { + *edges_ptr++ = it->start; + *edges_ptr++ = it->end; + } +} + +void Triangulation::calculate_neighbors() +{ + _VERBOSE("Triangulation::calculate_neighbors"); + Py_XDECREF(_neighbors); + + // Create _neighbors array with shape (ntri,3) and initialise all to -1. + npy_intp dims[2] = {_ntri,3}; + _neighbors = (PyArrayObject*)PyArray_SimpleNew(2, dims, PyArray_INT); + int* neighbors_ptr = (int*)PyArray_DATA(_neighbors); + std::fill(neighbors_ptr, neighbors_ptr + 3*_ntri, -1); + + // For each triangle edge (start to end point), find corresponding neighbor + // edge from end to start point. Do this by traversing all edges and + // storing them in a map from edge to TriEdge. If corresponding neighbor + // edge is already in the map, don't need to store new edge as neighbor + // already found. + typedef std::map EdgeToTriEdgeMap; + EdgeToTriEdgeMap edge_to_tri_edge_map; + for (int tri = 0; tri < _ntri; ++tri) { + if (!is_masked(tri)) { + for (int edge = 0; edge < 3; ++edge) { + int start = get_triangle_point(tri, edge); + int end = get_triangle_point(tri, (edge+1)%3); + EdgeToTriEdgeMap::iterator it = + edge_to_tri_edge_map.find(Edge(end,start)); + if (it == edge_to_tri_edge_map.end()) { + // No neighbor edge exists in the edge_to_tri_edge_map, so + // add this edge to it. + edge_to_tri_edge_map[Edge(start,end)] = TriEdge(tri,edge); + } else { + // Neighbor edge found, set the two elements of _neighbors + // and remove edge from edge_to_tri_edge_map. + neighbors_ptr[3*tri + edge] = it->second.tri; + neighbors_ptr[3*it->second.tri + it->second.edge] = tri; + edge_to_tri_edge_map.erase(it); + } + } + } + } + + // Note that remaining edges in the edge_to_tri_edge_map correspond to + // boundary edges, but the boundaries are calculated separately elsewhere. +} + +void Triangulation::correct_triangles() +{ + int* triangles_ptr = (int*)PyArray_DATA(_triangles); + int* neighbors_ptr = _neighbors != 0 ? (int*)PyArray_DATA(_neighbors) : 0; + for (int tri = 0; tri < _ntri; ++tri) { + XY point0 = get_point_coords(*triangles_ptr++); + XY point1 = get_point_coords(*triangles_ptr++); + XY point2 = get_point_coords(*triangles_ptr++); + if ( (point1 - point0).cross_z(point2 - point0) < 0.0) { + // Triangle points are clockwise, so change them to anticlockwise. + std::swap(*(triangles_ptr-2), *(triangles_ptr-1)); + if (neighbors_ptr) + std::swap(*(neighbors_ptr+3*tri+1), *(neighbors_ptr+3*tri+2)); + } + } +} + +const Triangulation::Boundaries& Triangulation::get_boundaries() const +{ + _VERBOSE("Triangulation::get_boundaries"); + if (_boundaries.empty()) + const_cast(this)->calculate_boundaries(); + return _boundaries; +} + +void Triangulation::get_boundary_edge(const TriEdge& triEdge, + int& boundary, + int& edge) const +{ + get_boundaries(); // Ensure _tri_edge_to_boundary_map has been created. + TriEdgeToBoundaryMap::const_iterator it = + _tri_edge_to_boundary_map.find(triEdge); + assert(it != _tri_edge_to_boundary_map.end() && + "TriEdge is not on a boundary"); + boundary = it->second.boundary; + edge = it->second.edge; +} + +int Triangulation::get_edge_in_triangle(int tri, int point) const +{ + assert(tri >= 0 && tri < _ntri && "Triangle index out of bounds"); + assert(point >= 0 && point < _npoints && "Point index out of bounds."); + const int* triangles_ptr = get_triangles_ptr() + 3*tri; + for (int edge = 0; edge < 3; ++edge) { + if (*triangles_ptr++ == point) return edge; + } + return -1; // point is not in triangle. +} + +Py::Object Triangulation::get_edges() +{ + _VERBOSE("Triangulation::get_edges"); + if (_edges == 0) + calculate_edges(); + return Py::asObject(Py::new_reference_to((PyObject*)_edges)); +} + +int Triangulation::get_neighbor(int tri, int edge) const +{ + assert(tri >= 0 && tri < _ntri && "Triangle index out of bounds"); + assert(edge >= 0 && edge < 3 && "Edge index out of bounds"); + return get_neighbors_ptr()[3*tri + edge]; +} + +TriEdge Triangulation::get_neighbor_edge(int tri, int edge) const +{ + int neighbor_tri = get_neighbor(tri, edge); + if (neighbor_tri == -1) + return TriEdge(-1,-1); + else + return TriEdge(neighbor_tri, + get_edge_in_triangle(neighbor_tri, + get_triangle_point(tri, + (edge+1)%3))); +} + +Py::Object Triangulation::get_neighbors() +{ + _VERBOSE("Triangulation::get_neighbors"); + if (_neighbors == 0) calculate_neighbors(); + return Py::asObject(Py::new_reference_to((PyObject*)_neighbors)); +} + +const int* Triangulation::get_neighbors_ptr() const +{ + if (_neighbors == 0) + const_cast(this)->calculate_neighbors(); + return (const int*)PyArray_DATA(_neighbors); +} + +int Triangulation::get_npoints() const +{ + return _npoints; +} + +int Triangulation::get_ntri() const +{ + return _ntri; +} + +XY Triangulation::get_point_coords(int point) const +{ + assert(point >= 0 && point < _npoints && "Point index out of bounds."); + return XY( ((const double*)PyArray_DATA(_x))[point], + ((const double*)PyArray_DATA(_y))[point] ); +} + +int Triangulation::get_triangle_point(int tri, int edge) const +{ + assert(tri >= 0 && tri < _ntri && "Triangle index out of bounds"); + assert(edge >= 0 && edge < 3 && "Edge index out of bounds"); + return get_triangles_ptr()[3*tri + edge]; +} + +int Triangulation::get_triangle_point(const TriEdge& tri_edge) const +{ + return get_triangle_point(tri_edge.tri, tri_edge.edge); +} + +const int* Triangulation::get_triangles_ptr() const +{ + return (const int*)PyArray_DATA(_triangles); +} + +void Triangulation::init_type() +{ + _VERBOSE("Triangulation::init_type"); + + behaviors().name("Triangulation"); + behaviors().doc("Triangulation"); + + add_noargs_method("get_edges", &Triangulation::get_edges, + "get_edges()"); + add_noargs_method("get_neighbors", &Triangulation::get_neighbors, + "get_neighbors()"); + add_varargs_method("set_mask", &Triangulation::set_mask, + "set_mask(mask)"); +} + +bool Triangulation::is_masked(int tri) const +{ + assert(tri >= 0 && tri < _ntri && "Triangle index out of bounds."); + return _mask && *((bool*)PyArray_DATA(_mask) + tri); +} + +Py::Object Triangulation::set_mask(const Py::Tuple &args) +{ + _VERBOSE("Triangulation::set_mask"); + args.verify_length(1); + + Py_XDECREF(_mask); + _mask = 0; + if (args[0] != Py::None()) + { + _mask = (PyArrayObject*)PyArray_ContiguousFromObject( + args[0].ptr(), PyArray_BOOL, 1, 1); + if (_mask == 0 || PyArray_DIM(_mask,0) != PyArray_DIM(_triangles,0)) { + Py_XDECREF(_mask); + throw Py::ValueError( + "mask must be a 1D array with the same length as the triangles array"); + } + } + + // Clear derived fields so they are recalculated when needed. + Py_XDECREF(_edges); + _edges = 0; + Py_XDECREF(_neighbors); + _neighbors = 0; + _boundaries.clear(); + + return Py::None(); +} + +void Triangulation::write_boundaries() const +{ + const Boundaries& bs = get_boundaries(); + std::cout << "Number of boundaries: " << bs.size() << std::endl; + for (Boundaries::const_iterator it = bs.begin(); it != bs.end(); ++it) { + const Boundary& b = *it; + std::cout << " Boundary of " << b.size() << " points: "; + for (Boundary::const_iterator itb = b.begin(); itb != b.end(); ++itb) { + std::cout << *itb << ", "; + } + std::cout << std::endl; + } +} + + + + +TriContourGenerator::TriContourGenerator(Py::Object triangulation, + PyArrayObject* z) + : _triangulation(triangulation), + _z(z), + _interior_visited(2*get_triangulation().get_ntri()), + _boundaries_visited(0), + _boundaries_used(0) +{ + _VERBOSE("TriContourGenerator::TriContourGenerator"); +} + +TriContourGenerator::~TriContourGenerator() +{ + _VERBOSE("TriContourGenerator::~TriContourGenerator"); + Py_XDECREF(_z); +} + +void TriContourGenerator::clear_visited_flags(bool include_boundaries) +{ + // Clear _interiorVisited. + std::fill(_interior_visited.begin(), _interior_visited.end(), false); + + if (include_boundaries) { + if (_boundaries_visited.empty()) { + const Boundaries& boundaries = get_boundaries(); + + // Initialise _boundaries_visited. + _boundaries_visited.reserve(boundaries.size()); + for (Boundaries::const_iterator it = boundaries.begin(); + it != boundaries.end(); ++it) + _boundaries_visited.push_back(BoundaryVisited(it->size())); + + // Initialise _boundaries_used. + _boundaries_used = BoundariesUsed(boundaries.size()); + } + + // Clear _boundaries_visited. + for (BoundariesVisited::iterator it = _boundaries_visited.begin(); + it != _boundaries_visited.end(); ++it) + std::fill(it->begin(), it->end(), false); + + // Clear _boundaries_used. + std::fill(_boundaries_used.begin(), _boundaries_used.end(), false); + } +} + +Py::Object TriContourGenerator::contour_to_segs(const Contour& contour) +{ + Py::List segs(contour.size()); + for (Contour::size_type i = 0; i < contour.size(); ++i) { + const ContourLine& line = contour[i]; + npy_intp dims[2] = {line.size(),2}; + PyArrayObject* py_line = (PyArrayObject*)PyArray_SimpleNew( + 2, dims, PyArray_DOUBLE); + double* p = (double*)PyArray_DATA(py_line); + for (ContourLine::const_iterator it = line.begin(); it != line.end(); ++it) { + *p++ = it->x; + *p++ = it->y; + } + segs[i] = Py::asObject((PyObject*)py_line); + } + return segs; +} + +Py::Object TriContourGenerator::contour_to_segs_and_kinds(const Contour& contour) +{ + Contour::const_iterator line; + ContourLine::const_iterator point; + + // Find total number of points in all contour lines. + int n_points = 0; + for (line = contour.begin(); line != contour.end(); ++line) + n_points += line->size(); + + // Create segs array for point coordinates. + npy_intp segs_dims[2] = {n_points, 2}; + PyArrayObject* segs = (PyArrayObject*)PyArray_SimpleNew( + 2, segs_dims, PyArray_DOUBLE); + double* segs_ptr = (double*)PyArray_DATA(segs); + + // Create kinds array for code types. + npy_intp kinds_dims[1] = {n_points}; + PyArrayObject* kinds = (PyArrayObject*)PyArray_SimpleNew( + 1, kinds_dims, PyArray_UBYTE); + unsigned char* kinds_ptr = (unsigned char*)PyArray_DATA(kinds); + + for (line = contour.begin(); line != contour.end(); ++line) { + for (point = line->begin(); point != line->end(); point++) { + *segs_ptr++ = point->x; + *segs_ptr++ = point->y; + *kinds_ptr++ = (point == line->begin() ? MOVETO : LINETO); + } + } + + Py::Tuple result(2); + result[0] = Py::asObject((PyObject*)segs); + result[1] = Py::asObject((PyObject*)kinds); + return result; +} + +Py::Object TriContourGenerator::create_contour(const Py::Tuple &args) +{ + _VERBOSE("TriContourGenerator::create_contour"); + args.verify_length(1); + + double level = (Py::Float)args[0]; + + clear_visited_flags(false); + Contour contour; + + find_boundary_lines(contour, level); + find_interior_lines(contour, level, false, false); + + return contour_to_segs(contour); +} + +Py::Object TriContourGenerator::create_filled_contour(const Py::Tuple &args) +{ + _VERBOSE("TriContourGenerator::create_filled_contour"); + args.verify_length(2); + + double lower_level = (Py::Float)args[0]; + double upper_level = (Py::Float)args[1]; + + clear_visited_flags(true); + Contour contour; + + find_boundary_lines_filled(contour, lower_level, upper_level); + find_interior_lines(contour, lower_level, false, true); + find_interior_lines(contour, upper_level, true, true); + + return contour_to_segs_and_kinds(contour); +} + +XY TriContourGenerator::edge_interp(int tri, int edge, const double& level) +{ + return interp(get_triangulation().get_triangle_point(tri, edge), + get_triangulation().get_triangle_point(tri, (edge+1)%3), + level); +} + +void TriContourGenerator::find_boundary_lines(Contour& contour, + const double& level) +{ + // Traverse boundaries to find starting points for all contour lines that + // intersect the boundaries. For each starting point found, follow the + // line to its end before continuing. + const Triangulation& triang = get_triangulation(); + const Boundaries& boundaries = get_boundaries(); + for (Boundaries::const_iterator it = boundaries.begin(); + it != boundaries.end(); ++it) { + const Boundary& boundary = *it; + bool startAbove, endAbove = false; + for (Boundary::const_iterator itb = boundary.begin(); + itb != boundary.end(); ++itb) { + if (itb == boundary.begin()) + startAbove = get_z(triang.get_triangle_point(*itb)) >= level; + else + startAbove = endAbove; + endAbove = get_z(triang.get_triangle_point(itb->tri, + (itb->edge+1)%3)) >= level; + if (startAbove && !endAbove) { + // This boundary edge is the start point for a contour line, + // so follow the line. + contour.push_back(ContourLine()); + ContourLine& contour_line = contour.back(); + TriEdge tri_edge = *itb; + follow_interior(contour_line, tri_edge, true, level, false); + } + } + } +} + +void TriContourGenerator::find_boundary_lines_filled(Contour& contour, + const double& lower_level, + const double& upper_level) +{ + // Traverse boundaries to find starting points for all contour lines that + // intersect the boundaries. For each starting point found, follow the + // line to its end before continuing. + const Triangulation& triang = get_triangulation(); + const Boundaries& boundaries = get_boundaries(); + for (Boundaries::size_type i = 0; i < boundaries.size(); ++i) { + const Boundary& boundary = boundaries[i]; + for (Boundary::size_type j = 0; j < boundary.size(); ++j) { + if (!_boundaries_visited[i][j]) { + // z values of start and end of this boundary edge. + double z_start = get_z(triang.get_triangle_point(boundary[j])); + double z_end = get_z(triang.get_triangle_point( + boundary[j].tri, (boundary[j].edge+1)%3)); + + // Does this boundary edge's z increase through upper level + // and/or decrease through lower level? + bool incr_upper = (z_start < upper_level && z_end >= upper_level); + bool decr_lower = (z_start >= lower_level && z_end < lower_level); + + if (decr_lower || incr_upper) { + // Start point for contour line, so follow it. + contour.push_back(ContourLine()); + ContourLine& contour_line = contour.back(); + TriEdge start_tri_edge = boundary[j]; + TriEdge tri_edge = start_tri_edge; + + // Traverse interior and boundaries until return to start. + bool on_upper = incr_upper; + do { + follow_interior(contour_line, tri_edge, true, + on_upper ? upper_level : lower_level, on_upper); + on_upper = follow_boundary(contour_line, tri_edge, + lower_level, upper_level, on_upper); + } while (tri_edge != start_tri_edge); + + // Filled contour lines must not have same first and last + // points. + if (contour_line.size() > 1 && + contour_line.front() == contour_line.back()) + contour_line.pop_back(); + } + } + } + } + + // Add full boundaries that lie between the lower and upper levels. These + // are boundaries that have not been touched by an internal contour line + // which are stored in _boundaries_used. + for (Boundaries::size_type i = 0; i < boundaries.size(); ++i) { + if (!_boundaries_used[i]) { + const Boundary& boundary = boundaries[i]; + double z = get_z(triang.get_triangle_point(boundary[0])); + if (z >= lower_level && z < upper_level) { + contour.push_back(ContourLine()); + ContourLine& contour_line = contour.back(); + for (Boundary::size_type j = 0; j < boundary.size(); ++j) + contour_line.push_back(triang.get_point_coords( + triang.get_triangle_point(boundary[j]))); + } + } + } +} + +void TriContourGenerator::find_interior_lines(Contour& contour, + const double& level, + bool on_upper, + bool filled) +{ + const Triangulation& triang = get_triangulation(); + int ntri = triang.get_ntri(); + for (int tri = 0; tri < ntri; ++tri) { + int visited_index = (on_upper ? tri+ntri : tri); + + if (_interior_visited[visited_index] || triang.is_masked(tri)) + continue; // Triangle has already been visited or is masked. + + _interior_visited[visited_index] = true; + + // Determine edge via which to leave this triangle. + int edge = get_exit_edge(tri, level, on_upper); + assert(edge >= -1 && edge < 3 && "Invalid exit edge"); + if (edge == -1) + continue; // Contour does not pass through this triangle. + + // Found start of new contour line loop. + contour.push_back(ContourLine()); + ContourLine& contour_line = contour.back(); + TriEdge tri_edge = triang.get_neighbor_edge(tri, edge); + follow_interior(contour_line, tri_edge, false, level, on_upper); + + if (!filled) + // Non-filled contour lines must be closed. + contour_line.push_back(contour_line.front()); + else if (contour_line.size() > 1 && + contour_line.front() == contour_line.back()) + // Filled contour lines must not have same first and last points. + contour_line.pop_back(); + } +} + +bool TriContourGenerator::follow_boundary(ContourLine& contour_line, + TriEdge& tri_edge, + const double& lower_level, + const double& upper_level, + bool on_upper) +{ + const Triangulation& triang = get_triangulation(); + const Boundaries& boundaries = get_boundaries(); + + // Have TriEdge to start at, need equivalent boundary edge. + int boundary, edge; + triang.get_boundary_edge(tri_edge, boundary, edge); + _boundaries_used[boundary] = true; + + bool stop = false; + bool first_edge = true; + double z_start, z_end = 0; + while (!stop) + { + assert(!_boundaries_visited[boundary][edge] && "Boundary already visited"); + _boundaries_visited[boundary][edge] = true; + + // z values of start and end points of boundary edge. + if (first_edge) + z_start = get_z(triang.get_triangle_point(tri_edge)); + else + z_start = z_end; + z_end = get_z(triang.get_triangle_point(tri_edge.tri, + (tri_edge.edge+1)%3)); + + if (z_end > z_start) { // z increasing. + if (!(!on_upper && first_edge) && + z_end >= lower_level && z_start < lower_level) { + stop = true; + on_upper = false; + } else if (z_end >= upper_level && z_start < upper_level) { + stop = true; + on_upper = true; + } + } else { // z decreasing. + if (!(on_upper && first_edge) && + z_start >= upper_level && z_end < upper_level) { + stop = true; + on_upper = true; + } else if (z_start >= lower_level && z_end < lower_level) { + stop = true; + on_upper = false; + } + } + + first_edge = false; + + if (!stop) { + // Move to next boundary edge, adding point to contour line. + edge = (edge+1) % (int)boundaries[boundary].size(); + tri_edge = boundaries[boundary][edge]; + contour_line.push_back(triang.get_point_coords( + triang.get_triangle_point(tri_edge))); + } + } + + return on_upper; +} + +void TriContourGenerator::follow_interior(ContourLine& contour_line, + TriEdge& tri_edge, + bool end_on_boundary, + const double& level, + bool on_upper) +{ + int& tri = tri_edge.tri; + int& edge = tri_edge.edge; + + // Initial point. + contour_line.push_back(edge_interp(tri, edge, level)); + + while (true) { + int visited_index = tri; + if (on_upper) + visited_index += get_triangulation().get_ntri(); + + // Check for end not on boundary. + if (!end_on_boundary && _interior_visited[visited_index]) + break; // Reached start point, so return. + + // Determine edge by which to leave this triangle. + edge = get_exit_edge(tri, level, on_upper); + assert(edge >= 0 && edge < 3 && "Invalid exit edge"); + + _interior_visited[visited_index] = true; + + // Append new point to point set. + assert(edge >= 0 && edge < 3 && "Invalid triangle edge"); + contour_line.push_back(edge_interp(tri, edge, level)); + + // Move to next triangle. + TriEdge next_tri_edge = get_triangulation().get_neighbor_edge(tri,edge); + + // Check if ending on a boundary. + if (end_on_boundary && next_tri_edge.tri == -1) + break; + + tri_edge = next_tri_edge; + assert(tri_edge.tri != -1 && "Invalid triangle for internal loop"); + } +} + +const TriContourGenerator::Boundaries& TriContourGenerator::get_boundaries() const +{ + return get_triangulation().get_boundaries(); +} + +int TriContourGenerator::get_exit_edge(int tri, + const double& level, + bool on_upper) const +{ + assert(tri >= 0 && tri < get_triangulation().get_ntri() && + "Triangle index out of bounds."); + + unsigned int config = + (get_z(get_triangulation().get_triangle_point(tri, 0)) >= level) | + (get_z(get_triangulation().get_triangle_point(tri, 1)) >= level) << 1 | + (get_z(get_triangulation().get_triangle_point(tri, 2)) >= level) << 2; + + if (on_upper) config = 7-config; + + switch (config) { + case 0: return -1; + case 1: return 2; + case 2: return 0; + case 3: return 2; + case 4: return 1; + case 5: return 1; + case 6: return 0; + case 7: return -1; + default: assert(0 && "Invalid config value"); return -1; + } +} + +const Triangulation& TriContourGenerator::get_triangulation() const +{ + return *(Triangulation*)_triangulation.ptr(); +} + +const double& TriContourGenerator::get_z(int point) const +{ + assert(point >= 0 && point < get_triangulation().get_npoints() && + "Point index out of bounds."); + return ((const double*)PyArray_DATA(_z))[point]; +} + +void TriContourGenerator::init_type() +{ + _VERBOSE("TriContourGenerator::init_type"); + + behaviors().name("TriContourGenerator"); + behaviors().doc("TriContourGenerator"); + + add_varargs_method("create_contour", + &TriContourGenerator::create_contour, + "create_contour(level)"); + add_varargs_method("create_filled_contour", + &TriContourGenerator::create_filled_contour, + "create_filled_contour(lower_level, upper_level)"); +} + +XY TriContourGenerator::interp(int point1, + int point2, + const double& level) const +{ + assert(point1 >= 0 && point1 < get_triangulation().get_npoints() && + "Point index 1 out of bounds."); + assert(point2 >= 0 && point2 < get_triangulation().get_npoints() && + "Point index 2 out of bounds."); + assert(point1 != point2 && "Identical points"); + double fraction = (get_z(point2) - level) / (get_z(point2) - get_z(point1)); + return get_triangulation().get_point_coords(point1)*fraction + + get_triangulation().get_point_coords(point2)*(1.0 - fraction); +} + + + + + +#if defined(_MSC_VER) +DL_EXPORT(void) +#elif defined(__cplusplus) +extern "C" void +#else +void +#endif +init_tri() +{ + static TriModule* triModule = NULL; + triModule = new TriModule(); + import_array(); +} + +TriModule::TriModule() + : Py::ExtensionModule("tri") +{ + Triangulation::init_type(); + TriContourGenerator::init_type(); + + add_varargs_method("Triangulation", &TriModule::new_triangulation, + "Create and return new C++ Triangulation object"); + add_varargs_method("TriContourGenerator", &TriModule::new_tricontourgenerator, + "Create and return new C++ TriContourGenerator object"); + + initialize("Module for unstructured triangular grids"); +} + +Py::Object TriModule::new_triangulation(const Py::Tuple &args) +{ + _VERBOSE("TriModule::new_triangulation"); + args.verify_length(6); + + // x and y. + PyArrayObject* x = (PyArrayObject*)PyArray_ContiguousFromObject( + args[0].ptr(), PyArray_DOUBLE, 1, 1); + PyArrayObject* y = (PyArrayObject*)PyArray_ContiguousFromObject( + args[1].ptr(), PyArray_DOUBLE, 1, 1); + if (x == 0 || y == 0 || PyArray_DIM(x,0) != PyArray_DIM(y,0)) { + Py_XDECREF(x); + Py_XDECREF(y); + throw Py::ValueError("x and y must be 1D arrays of the same length"); + } + + // triangles. + PyArrayObject* triangles = (PyArrayObject*)PyArray_ContiguousFromObject( + args[2].ptr(), PyArray_INT, 2, 2); + if (triangles == 0 || PyArray_DIM(triangles,1) != 3) { + Py_XDECREF(x); + Py_XDECREF(y); + Py_XDECREF(triangles); + throw Py::ValueError("triangles must be a 2D array of shape (?,3)"); + } + + // Optional mask. + PyArrayObject* mask = 0; + if (args[3].ptr() != 0 && args[3] != Py::None()) + { + mask = (PyArrayObject*)PyArray_ContiguousFromObject( + args[3].ptr(), PyArray_BOOL, 1, 1); + if (mask == 0 || PyArray_DIM(mask,0) != PyArray_DIM(triangles,0)) { + Py_XDECREF(x); + Py_XDECREF(y); + Py_XDECREF(triangles); + Py_XDECREF(mask); + throw Py::ValueError( + "mask must be a 1D array with the same length as the triangles array"); + } + } + + // Optional edges. + PyArrayObject* edges = 0; + if (args[4].ptr() != 0 && args[4] != Py::None()) + { + edges = (PyArrayObject*)PyArray_ContiguousFromObject( + args[4].ptr(), PyArray_INT, 2, 2); + if (edges == 0 || PyArray_DIM(edges,1) != 2) { + Py_XDECREF(x); + Py_XDECREF(y); + Py_XDECREF(triangles); + Py_XDECREF(mask); + Py_XDECREF(edges); + throw Py::ValueError("edges must be a 2D array with shape (?,2)"); + } + } + + // Optional neighbors. + PyArrayObject* neighbors = 0; + if (args[5].ptr() != 0 && args[5] != Py::None()) + { + neighbors = (PyArrayObject*)PyArray_ContiguousFromObject( + args[5].ptr(), PyArray_INT, 2, 2); + if (neighbors == 0 || + PyArray_DIM(neighbors,0) != PyArray_DIM(triangles,0) || + PyArray_DIM(neighbors,1) != PyArray_DIM(triangles,1)) { + Py_XDECREF(x); + Py_XDECREF(y); + Py_XDECREF(triangles); + Py_XDECREF(mask); + Py_XDECREF(edges); + Py_XDECREF(neighbors); + throw Py::ValueError( + "neighbors must be a 2D array with the same shape as the triangles array"); + } + } + + return Py::asObject(new Triangulation(x, y, triangles, mask, edges, neighbors)); +} + +Py::Object TriModule::new_tricontourgenerator(const Py::Tuple &args) +{ + _VERBOSE("TriModule::new_tricontourgenerator"); + args.verify_length(2); + + Py::Object tri = args[0]; + if (!Triangulation::check(tri)) + throw Py::ValueError("Expecting a C++ Triangulation object"); + + PyArrayObject* z = (PyArrayObject*)PyArray_ContiguousFromObject( + args[1].ptr(), PyArray_DOUBLE, 1, 1); + if (z == 0 || + PyArray_DIM(z,0) != ((Triangulation*)tri.ptr())->get_npoints()) { + Py_XDECREF(z); + throw Py::ValueError( + "z must be a 1D array with the same length as the x and y arrays"); + } + + return Py::asObject(new TriContourGenerator(tri, z)); +} + diff -Nru matplotlib-0.99.3/lib/matplotlib/tri/_tri.h matplotlib-1.0.1/lib/matplotlib/tri/_tri.h --- matplotlib-0.99.3/lib/matplotlib/tri/_tri.h 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tri/_tri.h 2010-07-07 01:41:49.000000000 +0000 @@ -0,0 +1,473 @@ +/* + * Unstructured triangular grid functions, particularly contouring. + * + * There are two main classes: Triangulation and TriContourGenerator. + * + * Triangulation + * ------------- + * Triangulation is an unstructured triangular grid with npoints and ntri + * triangles. It consists of point x and y coordinates, and information about + * the triangulation stored in an integer array of shape (ntri,3) called + * triangles. Each triangle is represented by three point indices (in the + * range 0 to npoints-1) that comprise the triangle, ordered anticlockwise. + * There is an optional mask of length ntri which can be used to mask out + * triangles and has the same result as removing those triangles from the + * 'triangles' array. + * + * A particular edge of a triangulation is termed a TriEdge, which is a + * triangle index and an edge index in the range 0 to 2. TriEdge(tri,edge) + * refers to the edge that starts at point index triangles(tri,edge) and ends + * at point index triangles(tri,(edge+1)%3). + * + * Various derived fields are calculated when they are first needed. The + * triangle connectivity is stored in a neighbors array of shape (ntri,3) such + * that neighbors(tri,edge) is the index of the triangle that adjoins the + * TriEdge(tri,edge), or -1 if there is no such neighbor. + * + * A triangulation has one or more boundaries, each of which is a 1D array of + * the TriEdges that comprise the boundary, in order following the boundary + * with non-masked triangles on the left. + * + * TriContourGenerator + * ------------------- + * A TriContourGenerator generates contours for a particular Triangulation. + * The process followed is different for non-filled and filled contours, with + * one and two contour levels respectively. In both cases boundary contour + * lines are found first, then interior lines. + * + * Boundary lines start and end on a boundary. They are found by traversing + * the triangulation boundary edges until a suitable start point is found, and + * then the contour line is followed across the interior of the triangulation + * until it ends on another boundary edge. For a non-filled contour this + * completes a line, whereas a filled contour continues by following the + * boundary around until either another boundary start point is found or the + * start of the contour line is reached. Filled contour generation stores + * boolean flags to indicate which boundary edges have already been traversed + * so that they are not dealt with twice. Similar flags are used to indicate + * which triangles have been used when following interior lines. + * + * Interior lines do not intersect any boundaries. They are found by + * traversing all triangles that have not yet been visited until a suitable + * starting point is found, and then the contour line is followed across the + * interior of the triangulation until it returns to the start point. For + * filled contours this process is repeated for both lower and upper contour + * levels, and the direction of traversal is reversed for upper contours. + * + * Working out in which direction a contour line leaves a triangle uses the + * a lookup table. A triangle has three points, each of which has a z-value + * which is either less than the contour level or not. Hence there are 8 + * configurations to deal with, 2 of which do not have a contour line (all + * points below or above (including the same as) the contour level) and 6 that + * do. See the function get_exit_edge for details. + */ +#ifndef _TRI_H +#define _TRI_H + +#include "CXX/Extensions.hxx" +#include "CXX/Objects.hxx" +#include "numpy/arrayobject.h" + +#include +#include + + + +/* An edge of a triangle consisting of an triangle index in the range 0 to + * ntri-1 and an edge index in the range 0 to 2. Edge i goes from the + * triangle's point i to point (i+1)%3. */ +struct TriEdge +{ + TriEdge(); + TriEdge(int tri_, int edge_); + bool operator<(const TriEdge& other) const; + bool operator==(const TriEdge& other) const; + bool operator!=(const TriEdge& other) const; + friend std::ostream& operator<<(std::ostream& os, const TriEdge& tri_edge); + + int tri, edge; +}; + +// 2D point with x,y coordinates. +struct XY +{ + XY(); + XY(const double& x_, const double& y_); + double angle() const; // Angle in radians with respect to x-axis. + double cross_z(const XY& other) const; // z-component of cross product. + bool operator==(const XY& other) const; + bool operator!=(const XY& other) const; + bool operator<(const XY& other) const; + XY operator*(const double& multiplier) const; + XY operator+(const XY& other) const; + XY operator-(const XY& other) const; + friend std::ostream& operator<<(std::ostream& os, const XY& xy); + + double x, y; +}; + +// 2D bounding box, which may be empty. +class BoundingBox +{ +public: + BoundingBox(); + void add(const XY& point); + bool contains_x(const double& x) const; + friend std::ostream& operator<<(std::ostream& os, const BoundingBox& box); + + // Consider these member variables read-only. + bool empty; + XY lower, upper; +}; + +/* A single line of a contour, which may be a closed line loop or an open line + * strip. Identical adjacent points are avoided using insert_unique() and + * push_back(), and a closed line loop should also not have identical first and + * last points. */ +class ContourLine : public std::vector +{ +public: + ContourLine(); + void insert_unique(iterator pos, const XY& point); + void push_back(const XY& point); + void write() const; +}; + +// A Contour is a collection of zero or more ContourLines. +typedef std::vector Contour; + +// Debug contour writing function. +void write_contour(const Contour& contour); + + + + +/* Triangulation with npoints points and ntri triangles. Derived fields are + * calculated when they are first needed. */ +class Triangulation : public Py::PythonExtension +{ +public: + /* A single boundary is a vector of the TriEdges that make up that boundary + * following it around with unmasked triangles on the left. */ + typedef std::vector Boundary; + typedef std::vector Boundaries; + + /* Constructor with optional mask, edges and neighbors. The latter two + * are calculated when first needed. + * x: double array of shape (npoints) of points' x-coordinates. + * y: double array of shape (npoints) of points' y-coordinates. + * triangles: int array of shape (ntri,3) of triangle point indices. + * Those ordered clockwise are changed to be anticlockwise. + * mask: Optional bool array of shape (ntri) indicating which triangles + * are masked. + * edges: Optional int array of shape (?,2) of start and end point + * indices, each edge (start,end and end,start) appearing only + * once. + * neighbors: Optional int array of shape (ntri,3) indicating which + * triangles are the neighbors of which TriEdges, or -1 if + * there is no such neighbor. */ + Triangulation(PyArrayObject* x, + PyArrayObject* y, + PyArrayObject* triangles, + PyArrayObject* mask, + PyArrayObject* edges, + PyArrayObject* neighbors); + + virtual ~Triangulation(); + + // Return the boundaries collection, creating it if necessary. + const Boundaries& get_boundaries() const; + + // Return which boundary and boundary edge the specified TriEdge is. + void get_boundary_edge(const TriEdge& triEdge, + int& boundary, + int& edge) const; + + // Return the edges array, creating it if necessary. + Py::Object get_edges(); + + /* Return the triangle index of the neighbor of the specified triangle + * edge. */ + int get_neighbor(int tri, int edge) const; + + /* Return the TriEdge that is the neighbor of the specified triangle edge, + * or TriEdge(-1,-1) if there is no such neighbor. */ + TriEdge get_neighbor_edge(int tri, int edge) const; + + // Return the neighbors array, creating it if necessary. + Py::Object get_neighbors(); + + // Return the number of points in this triangulation. + int get_npoints() const; + + // Return the number of triangles in this triangulation. + int get_ntri() const; + + /* Return the index of the point that is at the start of the specified + * triangle edge. */ + int get_triangle_point(int tri, int edge) const; + int get_triangle_point(const TriEdge& tri_edge) const; + + // Return the coordinates of the specified point index. + XY get_point_coords(int point) const; + + // CXX initialisation function. + static void init_type(); + + // Indicates if the specified triangle is masked or not. + bool is_masked(int tri) const; + + /* Set or clear the mask array. Clears various derived fields so they are + * recalculated when next needed. + * args[0]: mask, either Py::None or boolean array of shape (ntri). */ + Py::Object set_mask(const Py::Tuple &args); + + // Debug function to write boundaries. + void write_boundaries() const; + +private: + // An edge of a triangulation, composed of start and end point indices. + struct Edge + { + Edge() : start(-1), end(-1) {} + Edge(int start_, int end_) : start(start_), end(end_) {} + bool operator<(const Edge& other) const { + return start != other.start ? start < other.start : end < other.end; + } + int start, end; + }; + + /* An edge of a boundary of a triangulation, composed of a boundary index + * and an edge index within that boundary. Used to index into the + * boundaries collection to obtain the corresponding TriEdge. */ + struct BoundaryEdge + { + BoundaryEdge() : boundary(-1), edge(-1) {} + BoundaryEdge(int boundary_, int edge_) + : boundary(boundary_), edge(edge_) {} + int boundary, edge; + }; + + /* Calculate the boundaries collection. Should normally be accessed via + * get_boundaries(), which will call this function if necessary. */ + void calculate_boundaries(); + + /* Calculate the edges array. Should normally be accessed via + * get_edges(), which will call this function if necessary. */ + void calculate_edges(); + + /* Calculate the neighbors array. Should normally be accessed via + * get_neighbors(), which will call this function if necessary. */ + void calculate_neighbors(); + + /* Correct each triangle so that the vertices are ordered in an + * anticlockwise manner. */ + void correct_triangles(); + + /* Determine which edge index (0,1 or 2) the specified point index is in + * the specified triangle, or -1 if the point is not in the triangle. */ + int get_edge_in_triangle(int tri, int point) const; + + // Return pointer to contents of neighbors array. + const int* get_neighbors_ptr() const; + + // Return pointer to contents of triangles array. + const int* get_triangles_ptr() const; + + + + int _npoints, _ntri; + + // Variables shared with python, always set. + PyArrayObject* _x; // double array (npoints). + PyArrayObject* _y; // double array (npoints). + PyArrayObject* _triangles; // int array (ntri,3) of triangle point indices, + // ordered anticlockwise. + + // Variables shared with python, may be zero. + PyArrayObject* _mask; // bool array (ntri). + + // Derived variables shared with python, may be zero. If zero, are + // recalculated when needed. + PyArrayObject* _edges; // int array (?,2) of start & end point indices. + PyArrayObject* _neighbors; // int array (ntri,3), neighbor triangle indices + // or -1 if no neighbor. + + // Variables internal to C++ only. + Boundaries _boundaries; + + // Map used to look up BoundaryEdges from TriEdges. Normally accessed via + // get_boundary_edge(). + typedef std::map TriEdgeToBoundaryMap; + TriEdgeToBoundaryMap _tri_edge_to_boundary_map; +}; + + + + +// Contour generator for a triangulation. +class TriContourGenerator : public Py::PythonExtension +{ +public: + /* Constructor. + * triangulation: Triangulation to generate contours for. + * z: Double array of shape (npoints) of z-values at triangulation + * points. */ + TriContourGenerator(Py::Object triangulation, + PyArrayObject* z); + + virtual ~TriContourGenerator(); + + /* Create and return a non-filled contour. + * level: Contour level. + * Returns python list [segs0, segs1, ...] where + * segs0: double array of shape (?,2) of point coordinates of first + * contour line, etc. */ + Py::Object create_contour(const Py::Tuple &args); + + /* Create and return a filled contour. + * lower_level: Lower contour level. + * upper_level: Upper contour level. + * Returns python tuple (segs, kinds) where + * segs: double array of shape (n_points,2) of all point coordinates, + * kinds: ubyte array of shape (n_points) of all point code types. */ + Py::Object create_filled_contour(const Py::Tuple &args); + + // CXX initialisation function. + static void init_type(); + +private: + typedef Triangulation::Boundary Boundary; + typedef Triangulation::Boundaries Boundaries; + + /* Clear visited flags. + * include_boundaries: Whether to clear boundary flags or not, which are + * only used for filled contours. */ + void clear_visited_flags(bool include_boundaries); + + /* Convert a non-filled Contour from C++ to Python. + * Returns python list [segs0, segs1, ...] where + * segs0: double array of shape (?,2) of point coordinates of first + * contour line, etc. */ + Py::Object contour_to_segs(const Contour& contour); + + /* Convert a filled Contour from C++ to Python. + * Returns python tuple (segs, kinds) where + * segs: double array of shape (n_points,2) of all point coordinates, + * kinds: ubyte array of shape (n_points) of all point code types. */ + Py::Object contour_to_segs_and_kinds(const Contour& contour); + + /* Return the point on the specified TriEdge that intersects the specified + * level. */ + XY edge_interp(int tri, int edge, const double& level); + + /* Find and follow non-filled contour lines that start and end on a + * boundary of the Triangulation. + * contour: Contour to add new lines to. + * level: Contour level. */ + void find_boundary_lines(Contour& contour, + const double& level); + + /* Find and follow filled contour lines at either of the specified contour + * levels that start and end of a boundary of the Triangulation. + * contour: Contour to add new lines to. + * lower_level: Lower contour level. + * upper_level: Upper contour level. */ + void find_boundary_lines_filled(Contour& contour, + const double& lower_level, + const double& upper_level); + + /* Find and follow lines at the specified contour level that are + * completely in the interior of the Triangulation and hence do not + * intersect any boundary. + * contour: Contour to add new lines to. + * level: Contour level. + * on_upper: Whether on upper or lower contour level. + * filled: Whether contours are filled or not. */ + void find_interior_lines(Contour& contour, + const double& level, + bool on_upper, + bool filled); + + /* Follow contour line around boundary of the Triangulation from the + * specified TriEdge to its end which can be on either the lower or upper + * levels. Only used for filled contours. + * contour_line: Contour line to append new points to. + * tri_edge: On entry, TriEdge to start from. On exit, TriEdge that is + * finished on. + * lower_level: Lower contour level. + * upper_level: Upper contour level. + * on_upper: Whether starts on upper level or not. + * Return true if finishes on upper level, false if lower. */ + bool follow_boundary(ContourLine& contour_line, + TriEdge& tri_edge, + const double& lower_level, + const double& upper_level, + bool on_upper); + + /* Follow contour line across interior of Triangulation. + * contour_line: Contour line to append new points to. + * tri_edge: On entry, TriEdge to start from. On exit, TriEdge that is + * finished on. + * end_on_boundary: Whether this line ends on a boundary, or loops back + * upon itself. + * level: Contour level to follow. + * on_upper: Whether following upper or lower contour level. */ + void follow_interior(ContourLine& contour_line, + TriEdge& tri_edge, + bool end_on_boundary, + const double& level, + bool on_upper); + + // Return the Triangulation boundaries. + const Boundaries& get_boundaries() const; + + /* Return the edge by which the a level leaves a particular triangle, + * which is 0, 1 or 2 if the contour passes through the triangle or -1 + * otherwise. + * tri: Triangle index. + * level: Contour level to follow. + * on_upper: Whether following upper or lower contour level. */ + int get_exit_edge(int tri, const double& level, bool on_upper) const; + + // Return the Triangulation object. + const Triangulation& get_triangulation() const; + + // Return the z-value at the specified point index. + const double& get_z(int point) const; + + /* Return the point at which the a level intersects the line connecting the + * two specified point indices. */ + XY interp(int point1, int point2, const double& level) const; + + + + // Variables shared with python, always set. + Py::Object _triangulation; + PyArrayObject* _z; // double array (npoints). + + // Variables internal to C++ only. + typedef std::vector InteriorVisited; // Size 2*ntri + typedef std::vector BoundaryVisited; + typedef std::vector BoundariesVisited; + typedef std::vector BoundariesUsed; + + InteriorVisited _interior_visited; + BoundariesVisited _boundaries_visited; // Only used for filled contours. + BoundariesUsed _boundaries_used; // Only used for filled contours. +}; + + + + +// The extension module. +class TriModule : public Py::ExtensionModule +{ +public: + TriModule(); + +private: + Py::Object new_triangulation(const Py::Tuple &args); + Py::Object new_tricontourgenerator(const Py::Tuple &args); +}; + +#endif diff -Nru matplotlib-0.99.3/lib/matplotlib/tri/tripcolor.py matplotlib-1.0.1/lib/matplotlib/tri/tripcolor.py --- matplotlib-0.99.3/lib/matplotlib/tri/tripcolor.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tri/tripcolor.py 2010-07-07 01:41:49.000000000 +0000 @@ -0,0 +1,100 @@ +from matplotlib.collections import PolyCollection +from matplotlib.colors import Normalize +from matplotlib.tri.triangulation import Triangulation +import numpy as np + +def tripcolor(ax, *args, **kwargs): + """ + Create a pseudocolor plot of an unstructured triangular grid to + the :class:`~matplotlib.axes.Axes`. + + The triangulation can be specified in one of two ways; either:: + + tripcolor(triangulation, ...) + + where triangulation is a :class:`~matplotlib.tri.Triangulation` + object, or + + :: + + tripcolor(x, y, ...) + tripcolor(x, y, triangles, ...) + tripcolor(x, y, triangles=triangles, ...) + tripcolor(x, y, mask, ...) + tripcolor(x, y, mask=mask, ...) + tripcolor(x, y, triangles, mask, ...) + tripcolor(x, y, triangles, mask=mask, ...) + + in which case a Triangulation object will be created. See + :class:`~matplotlib.tri.Triangulation` for a explanation of these + possibilities. + + The next argument must be *C*, the array of color values, one per + point in the triangulation. The colors used for each triangle + are from the mean C of the triangle's three points. + + The remaining kwargs are the same as for + :meth:`~matplotlib.axes.Axes.pcolor`. + + **Example:** + + .. plot:: mpl_examples/pylab_examples/tripcolor_demo.py + """ + if not ax._hold: ax.cla() + + alpha = kwargs.pop('alpha', 1.0) + norm = kwargs.pop('norm', None) + cmap = kwargs.pop('cmap', None) + vmin = kwargs.pop('vmin', None) + vmax = kwargs.pop('vmax', None) + shading = kwargs.pop('shading', 'flat') + + tri, args, kwargs = Triangulation.get_from_args_and_kwargs(*args, **kwargs) + x = tri.x + y = tri.y + triangles = tri.get_masked_triangles() + + # Vertices of triangles. + verts = np.concatenate((x[triangles][...,np.newaxis], + y[triangles][...,np.newaxis]), axis=2) + + C = np.asarray(args[0]) + if C.shape != x.shape: + raise ValueError('C array must have same length as triangulation x and' + ' y arrays') + + # Color values, one per triangle, mean of the 3 vertex color values. + C = C[triangles].mean(axis=1) + + if shading == 'faceted': + edgecolors = (0,0,0,1), + linewidths = (0.25,) + else: + edgecolors = 'face' + linewidths = (1.0,) + kwargs.setdefault('edgecolors', edgecolors) + kwargs.setdefault('antialiaseds', (0,)) + kwargs.setdefault('linewidths', linewidths) + + collection = PolyCollection(verts, **kwargs) + + collection.set_alpha(alpha) + collection.set_array(C) + if norm is not None: assert(isinstance(norm, Normalize)) + collection.set_cmap(cmap) + collection.set_norm(norm) + if vmin is not None or vmax is not None: + collection.set_clim(vmin, vmax) + else: + collection.autoscale_None() + ax.grid(False) + + minx = tri.x.min() + maxx = tri.x.max() + miny = tri.y.min() + maxy = tri.y.max() + corners = (minx, miny), (maxx, maxy) + ax.update_datalim( corners) + ax.autoscale_view() + ax.add_collection(collection) + return collection diff -Nru matplotlib-0.99.3/lib/matplotlib/tri/triplot.py matplotlib-1.0.1/lib/matplotlib/tri/triplot.py --- matplotlib-0.99.3/lib/matplotlib/tri/triplot.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/tri/triplot.py 2011-01-05 15:59:56.000000000 +0000 @@ -0,0 +1,79 @@ +from matplotlib.cbook import ls_mapper +from matplotlib.patches import PathPatch +from matplotlib.path import Path +from matplotlib.tri.triangulation import Triangulation +import numpy as np + +def triplot(ax, *args, **kwargs): + """ + Draw a unstructured triangular grid as lines and/or markers to + the :class:`~matplotlib.axes.Axes`. + + The triangulation to plot can be specified in one of two ways; + either:: + + triplot(triangulation, ...) + + where triangulation is a :class:`~matplotlib.tri.Triangulation` + object, or + + :: + + triplot(x, y, ...) + triplot(x, y, triangles, ...) + triplot(x, y, triangles=triangles, ...) + triplot(x, y, mask, ...) + triplot(x, y, mask=mask, ...) + triplot(x, y, triangles, mask, ...) + triplot(x, y, triangles, mask=mask, ...) + + in which case a Triangulation object will be created. See + :class:`~matplotlib.tri.Triangulation` for a explanation of these + possibilities. + + The remaining args and kwargs are the same as for + :meth:`~matplotlib.axes.Axes.plot`. + + **Example:** + + .. plot:: mpl_examples/pylab_examples/triplot_demo.py + """ + import matplotlib.axes + + tri, args, kwargs = Triangulation.get_from_args_and_kwargs(*args, **kwargs) + + x = tri.x + y = tri.y + edges = tri.edges + + # If draw both lines and markers at the same time, e.g. + # ax.plot(x[edges].T, y[edges].T, *args, **kwargs) + # then the markers are drawn more than once which is incorrect if alpha<1. + # Hence draw lines and markers separately. + + # Decode plot format string, e.g. 'ro-' + fmt = '' + if len(args) > 0: + fmt = args[0] + linestyle, marker, color = matplotlib.axes._process_plot_format(fmt) + + # Draw lines without markers, if lines are required. + if linestyle is not None and linestyle is not 'None': + kw = kwargs.copy() + kw.pop('marker', None) # Ignore marker if set. + kw['linestyle'] = ls_mapper[linestyle] + kw['edgecolor'] = color + kw['facecolor'] = None + + vertices = np.column_stack((x[edges].flatten(), y[edges].flatten())) + codes = ([Path.MOVETO] + [Path.LINETO])*len(edges) + + path = Path(vertices, codes) + pathpatch = PathPatch(path, **kw) + + ax.add_patch(pathpatch) + + # Draw markers without lines. + # Should avoid drawing markers for points that are not in any triangle? + kwargs['linestyle'] = '' + ax.plot(x, y, *args, **kwargs) diff -Nru matplotlib-0.99.3/lib/matplotlib/units.py matplotlib-1.0.1/lib/matplotlib/units.py --- matplotlib-0.99.3/lib/matplotlib/units.py 2009-07-31 15:14:41.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/units.py 2010-07-07 01:41:52.000000000 +0000 @@ -46,14 +46,15 @@ from matplotlib.cbook import iterable, is_numlike, is_string_like class AxisInfo: - 'information to support default axis labeling and tick labeling' + 'information to support default axis labeling and tick labeling, and default limits' def __init__(self, majloc=None, minloc=None, - majfmt=None, minfmt=None, label=None): + majfmt=None, minfmt=None, label=None, + default_limits=None): """ majloc and minloc: TickLocators for the major and minor ticks majfmt and minfmt: TickFormatters for the major and minor ticks label: the default axis label - + default_limits: the default min, max of the axis if no data is present If any of the above are None, the axis will simply use the default """ self.majloc = majloc @@ -61,6 +62,7 @@ self.majfmt = majfmt self.minfmt = minfmt self.label = label + self.default_limits = default_limits class ConversionInterface: @@ -126,18 +128,14 @@ if classx is not None: converter = self.get(classx) - # Check explicity for strings here because they would otherwise - # lead to an infinite recursion, because a single character will - # pass the iterable() check. - if converter is None and iterable(x) and not is_string_like(x): - # if this is anything but an object array, we'll assume - # there are no custom units - if isinstance(x, np.ndarray) and x.dtype != np.object: - return None - + if converter is None and iterable(x): for thisx in x: - converter = self.get_converter( thisx ) - return converter + # Make sure that recursing might actually lead to a solution, if + # we are just going to re-examine another item of the same kind, + # then do not look at it. + if classx and classx != getattr(thisx, '__class__', None): + converter = self.get_converter( thisx ) + return converter #DISABLED self._cached[idx] = converter return converter diff -Nru matplotlib-0.99.3/lib/matplotlib/widgets.py matplotlib-1.0.1/lib/matplotlib/widgets.py --- matplotlib-0.99.3/lib/matplotlib/widgets.py 2009-07-31 15:14:41.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/widgets.py 2010-07-07 01:41:52.000000000 +0000 @@ -106,6 +106,7 @@ ax.figure.canvas.mpl_connect('button_press_event', self._click) + ax.figure.canvas.mpl_connect('button_release_event', self._release) ax.figure.canvas.mpl_connect('motion_notify_event', self._motion) ax.set_navigate(False) ax.set_axis_bgcolor(color) @@ -117,8 +118,21 @@ self._lastcolor = color def _click(self, event): - if event.inaxes != self.ax: return - if not self.eventson: return + if event.inaxes != self.ax: + return + if not self.eventson: + return + if event.canvas.mouse_grabber != self.ax: + event.canvas.grab_mouse(self.ax) + + def _release(self, event): + if event.canvas.mouse_grabber != self.ax: + return + event.canvas.release_mouse(self.ax) + if not self.eventson: + return + if event.inaxes != self.ax: + return for cid, func in self.observers.items(): func(event) @@ -209,6 +223,7 @@ ax.set_navigate(False) ax.figure.canvas.mpl_connect('button_press_event', self._update) + ax.figure.canvas.mpl_connect('button_release_event', self._update) if dragging: ax.figure.canvas.mpl_connect('motion_notify_event', self._update) self.label = ax.text(-0.02, 0.5, label, transform=ax.transAxes, @@ -227,14 +242,35 @@ self.closedmax = closedmax self.slidermin = slidermin self.slidermax = slidermax + self.drag_active = False def _update(self, event): 'update the slider position' - if event.button !=1: return - if event.inaxes != self.ax: return + if event.button != 1: + return + + if event.name == 'button_press_event' and event.inaxes == self.ax: + self.drag_active = True + event.canvas.grab_mouse(self.ax) + + if not self.drag_active: + return + + elif ((event.name == 'button_release_event') + or (event.name == 'button_press_event' and event.inaxes != self.ax)): + self.drag_active = False + event.canvas.release_mouse(self.ax) + return + val = event.xdata - if not self.closedmin and val<=self.valmin: return - if not self.closedmax and val>=self.valmax: return + if val <= self.valmin: + if not self.closedmin: + return + val = self.valmin + elif val >= self.valmax: + if not self.closedmax: + return + val = self.valmax if self.slidermin is not None: if val<=self.slidermin.val: return @@ -669,6 +705,8 @@ self.vertOn = True self.useblit = useblit + if useblit: + lineprops['animated'] = True self.lineh = ax.axhline(ax.get_ybound()[0], visible=False, **lineprops) self.linev = ax.axvline(ax.get_xbound()[0], visible=False, **lineprops) @@ -741,10 +779,14 @@ """ def __init__(self, canvas, axes, useblit=True, **lineprops): + self.canvas = canvas self.axes = axes xmin, xmax = axes[-1].get_xlim() xmid = 0.5*(xmin+xmax) + if useblit: + lineprops['animated'] = True + self.lines = [ax.axvline(xmid, visible=False, **lineprops) for ax in axes] self.visible = True @@ -1011,7 +1053,8 @@ """ def __init__(self, ax, onselect, drawtype='box', minspanx=None, minspany=None, useblit=False, - lineprops=None, rectprops=None, spancoords='data'): + lineprops=None, rectprops=None, spancoords='data', + button=None): """ Create a selector in ax. When a selection is made, clear @@ -1041,6 +1084,15 @@ spancoords is one of 'data' or 'pixels'. If 'data', minspanx and minspanx will be interpreted in the same coordinates as the x and ya axis, if 'pixels', they are in pixels + + button is a list of integers indicating which mouse buttons should + be used for rectangle selection. You can also specify a single + integer if only a single button is desired. Default is None, which + does not limit which button can be used. + Note, typically: + 1 = left mouse button + 2 = center mouse button (scroll wheel) + 3 = right mouse button """ self.ax = ax self.visible = True @@ -1078,6 +1130,11 @@ self.minspanx = minspanx self.minspany = minspany + if button is None or isinstance(button, list): + self.validButtons = button + elif isinstance(button, int): + self.validButtons = [button] + assert(spancoords in ('data', 'pixels')) self.spancoords = spancoords @@ -1103,6 +1160,12 @@ if not self.canvas.widgetlock.available(self): return True + # Only do rectangle selection if event was triggered + # with a desired button + if self.validButtons is not None: + if not event.button in self.validButtons: + return True + # If no button was pressed yet ignore the event if it was out # of the axes if self.eventpress == None: diff -Nru matplotlib-0.99.3/lib/matplotlib/windowing.py matplotlib-1.0.1/lib/matplotlib/windowing.py --- matplotlib-0.99.3/lib/matplotlib/windowing.py 2009-07-31 15:14:41.000000000 +0000 +++ matplotlib-1.0.1/lib/matplotlib/windowing.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -from matplotlib import rcParams - -try: - if not rcParams['tk.window_focus']: - raise ImportError - from _windowing import GetForegroundWindow, SetForegroundWindow -except ImportError: - def GetForegroundWindow(): - return 0 - def SetForegroundWindow(hwnd): - pass - -class FocusManager: - def __init__(self): - self._shellWindow = GetForegroundWindow() - - def __del__(self): - SetForegroundWindow(self._shellWindow) diff -Nru matplotlib-0.99.3/lib/mpl_examples/animation/animation_blit_gtk2.py matplotlib-1.0.1/lib/mpl_examples/animation/animation_blit_gtk2.py --- matplotlib-0.99.3/lib/mpl_examples/animation/animation_blit_gtk2.py 2009-07-31 15:14:44.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/animation/animation_blit_gtk2.py 2011-01-05 15:59:56.000000000 +0000 @@ -20,9 +20,9 @@ class UpdateLine(object): def get_bg_bbox(self): - + return self.ax.bbox.padded(-3) - + def __init__(self, canvas, ax): self.cnt = 0 self.canvas = canvas @@ -31,7 +31,7 @@ self.prev_time = time.time() self.start_time = self.prev_time self.prev_pixel_offset = 0. - + self.x0 = 0 self.phases = np.random.random_sample((20,)) * np.pi * 2 @@ -70,7 +70,7 @@ # restore the clean slate background self.canvas.restore_region(self.background1) - # restore subregion (x1+dx, y1, x2, y2) of the second bg + # restore subregion (x1+dx, y1, x2, y2) of the second bg # in a offset position (x1-dx, y1) x1, y1, x2, y2 = self.background2.get_extents() self.canvas.restore_region(self.background2, @@ -82,18 +82,18 @@ def on_draw(self, *args): self.save_bg() return False - + def update_line(self, *args): if self.background1 is None: return True - + cur_time = time.time() pixel_offset = int((cur_time - self.start_time)*100.) dx_pixel = pixel_offset - self.prev_pixel_offset self.prev_pixel_offset = pixel_offset dx_data = self.get_dx_data(dx_pixel) #cur_time - self.prev_time) - + x0 = self.x0 self.x0 += dx_data self.prev_time = cur_time @@ -109,7 +109,7 @@ self.line.set_color(self.color_cycle.next()) - # now plot line segment within [x0, x0+dx_data], + # now plot line segment within [x0, x0+dx_data], # Note that we're only plotting a line between [x0, x0+dx_data]. xx = np.array([x0, self.x0]) self.line.set_xdata(xx) diff -Nru matplotlib-0.99.3/lib/mpl_examples/animation/animation_blit_gtk.py matplotlib-1.0.1/lib/mpl_examples/animation/animation_blit_gtk.py --- matplotlib-0.99.3/lib/mpl_examples/animation/animation_blit_gtk.py 2009-07-31 15:14:44.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/animation/animation_blit_gtk.py 2011-01-05 15:59:56.000000000 +0000 @@ -29,15 +29,28 @@ # for profiling tstart = time.time() +def on_draw(event): + background = canvas.copy_from_bbox(ax.bbox) + if on_draw.background is None: + gobject.idle_add(update_line) + + on_draw.background = background + +on_draw.background = None + +fig.canvas.mpl_connect('draw_event', on_draw) + def update_line(*args): - print 'you are here', update_line.cnt - if update_line.background is None: - update_line.background = canvas.copy_from_bbox(ax.bbox) + if on_draw.background is None: + return True + + print 'frame', update_line.cnt # restore the clean slate background - canvas.restore_region(update_line.background) + canvas.restore_region(on_draw.background) # update the data line.set_ydata(np.sin(x+update_line.cnt/10.0)) + # just draw the animated artist ax.draw_artist(line) @@ -54,14 +67,6 @@ return True update_line.cnt = 0 -update_line.background = None - - -def start_anim(event): - gobject.idle_add(update_line) - canvas.mpl_disconnect(start_anim.cid) - -start_anim.cid = canvas.mpl_connect('draw_event', start_anim) diff -Nru matplotlib-0.99.3/lib/mpl_examples/animation/draggable_legend.py matplotlib-1.0.1/lib/mpl_examples/animation/draggable_legend.py --- matplotlib-0.99.3/lib/mpl_examples/animation/draggable_legend.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/animation/draggable_legend.py 2010-07-07 01:41:53.000000000 +0000 @@ -0,0 +1,43 @@ +import matplotlib.pyplot as plt + + +ax = plt.subplot(111) +ax.plot([1,2,3], label="test") + +l = ax.legend() +d1 = l.draggable() + +xy = 1, 2 +txt = ax.annotate("Test", xy, xytext=(-30, 30), + textcoords="offset points", + bbox=dict(boxstyle="round",fc=(0.2, 1, 1)), + arrowprops=dict(arrowstyle="->")) +d2 = txt.draggable() + + +from matplotlib._png import read_png +from matplotlib.cbook import get_sample_data + +from matplotlib.offsetbox import OffsetImage, AnnotationBbox + +fn = get_sample_data("lena.png", asfileobj=False) +arr_lena = read_png(fn) + +imagebox = OffsetImage(arr_lena, zoom=0.2) + +ab = AnnotationBbox(imagebox, xy, + xybox=(120., -80.), + xycoords='data', + boxcoords="offset points", + pad=0.5, + arrowprops=dict(arrowstyle="->", + connectionstyle="angle,angleA=0,angleB=90,rad=3") + ) + + +ax.add_artist(ab) + +d3 = ab.draggable(use_blit=True) + + +plt.show() diff -Nru matplotlib-0.99.3/lib/mpl_examples/animation/dynamic_image_gtkagg.py matplotlib-1.0.1/lib/mpl_examples/animation/dynamic_image_gtkagg.py --- matplotlib-0.99.3/lib/mpl_examples/animation/dynamic_image_gtkagg.py 2009-07-31 15:14:44.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/animation/dynamic_image_gtkagg.py 2010-07-07 01:41:53.000000000 +0000 @@ -9,7 +9,6 @@ import matplotlib matplotlib.use('GTKAgg') -from matplotlib import rcParams from pylab import * diff -Nru matplotlib-0.99.3/lib/mpl_examples/animation/movie_demo.py matplotlib-1.0.1/lib/mpl_examples/animation/movie_demo.py --- matplotlib-0.99.3/lib/mpl_examples/animation/movie_demo.py 2009-07-31 15:14:44.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/animation/movie_demo.py 2010-07-07 01:41:53.000000000 +0000 @@ -87,7 +87,7 @@ for i in range(len(y)) : # - # The next four lines are just like Matlab. + # The next four lines are just like MATLAB. # plt.plot(x,y[i],'b.') plt.axis((x[0],x[-1],-0.25,1)) diff -Nru matplotlib-0.99.3/lib/mpl_examples/animation/strip_chart_demo.py matplotlib-1.0.1/lib/mpl_examples/animation/strip_chart_demo.py --- matplotlib-0.99.3/lib/mpl_examples/animation/strip_chart_demo.py 2009-07-31 15:14:44.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/animation/strip_chart_demo.py 2010-07-07 01:41:53.000000000 +0000 @@ -9,7 +9,7 @@ different GUI that supports animation (GTKAgg, TkAgg, WXAgg) and use your toolkits idle/timer functions. """ -import gobject, gtk +import gobject import matplotlib matplotlib.use('GTKAgg') import numpy as np diff -Nru matplotlib-0.99.3/lib/mpl_examples/api/artist_demo.py matplotlib-1.0.1/lib/mpl_examples/api/artist_demo.py --- matplotlib-0.99.3/lib/mpl_examples/api/artist_demo.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/api/artist_demo.py 2010-09-23 19:54:50.000000000 +0000 @@ -0,0 +1,119 @@ +""" +Show examples of matplotlib artists +http://matplotlib.sourceforge.net/api/artist_api.html + +Several examples of standard matplotlib graphics primitives (artists) +are drawn using matplotlib API. Full list of artists and the +documentation is available at +http://matplotlib.sourceforge.net/api/artist_api.html + +Copyright (c) 2010, Bartosz Telenczuk + +License: This work is licensed under the BSD. A copy should be +included with this source code, and is also available at +http://www.opensource.org/licenses/bsd-license.php +""" + + +import numpy as np +import matplotlib.pyplot as plt +import matplotlib +from matplotlib.collections import PatchCollection +import matplotlib.path as mpath +import matplotlib.patches as mpatches +import matplotlib.lines as mlines + +font = "sans-serif" +fig = plt.figure(figsize=(5,5)) +ax = plt.axes([0,0,1,1]) + +# create 3x3 grid to plot the artists +pos = np.mgrid[0.2:0.8:3j, 0.2:0.8:3j].reshape(2, -1) + +patches = [] + +# add a circle +art = mpatches.Circle(pos[:,0], 0.1,ec="none") +patches.append(art) +plt.text(pos[0,0], pos[1,0]-0.15, "Circle", ha="center", + family=font, size=14) + +# add a rectangle +art = mpatches.Rectangle(pos[:,1] - np.array([0.025, 0.05]), 0.05, 0.1, + ec="none") +patches.append(art) +plt.text(pos[0,1], pos[1,1]-0.15, "Rectangle", ha="center", + family=font, size=14) + +# add a wedge +wedge = mpatches.Wedge(pos[:,2], 0.1, 30, 270, ec="none") +patches.append(wedge) +plt.text(pos[0,2], pos[1,2]-0.15, "Wedge", ha="center", + family=font, size=14) + +# add a Polygon +polygon = mpatches.RegularPolygon(pos[:,3], 5, 0.1) +patches.append(polygon) +plt.text(pos[0,3], pos[1,3]-0.15, "Polygon", ha="center", + family=font, size=14) + +#add an ellipse +ellipse = mpatches.Ellipse(pos[:,4], 0.2, 0.1) +patches.append(ellipse) +plt.text(pos[0,4], pos[1,4]-0.15, "Ellipse", ha="center", + family=font, size=14) + +#add an arrow +arrow = mpatches.Arrow(pos[0,5]-0.05, pos[1,5]-0.05, 0.1, 0.1, width=0.1) +patches.append(arrow) +plt.text(pos[0,5], pos[1,5]-0.15, "Arrow", ha="center", + family=font, size=14) + +# add a path patch +Path = mpath.Path +verts = np.array([ + (0.158, -0.257), + (0.035, -0.11), + (-0.175, 0.20), + (0.0375, 0.20), + (0.085, 0.115), + (0.22, 0.32), + (0.3, 0.005), + (0.20, -0.05), + (0.158, -0.257), + ]) +verts = verts-verts.mean(0) +codes = [Path.MOVETO, + Path.CURVE4, Path.CURVE4, Path.CURVE4, Path.LINETO, + Path.CURVE4, Path.CURVE4, Path.CURVE4, Path.CLOSEPOLY] + +path = mpath.Path(verts/2.5+pos[:,6], codes) +patch = mpatches.PathPatch(path) +patches.append(patch) +plt.text(pos[0,6], pos[1,6]-0.15, "PathPatch", ha="center", + family=font, size=14) + +# add a fancy box +fancybox = mpatches.FancyBboxPatch( + pos[:,7]-np.array([0.025, 0.05]), 0.05, 0.1, + boxstyle=mpatches.BoxStyle("Round", pad=0.02)) +patches.append(fancybox) +plt.text(pos[0,7], pos[1,7]-0.15, "FancyBoxPatch", ha="center", + family=font, size=14) + +# add a line +x,y = np.array([[-0.06, 0.0, 0.1], [0.05,-0.05, 0.05]]) +line = mlines.Line2D(x+pos[0,8], y+pos[1,8], lw=5., + alpha=0.4) +plt.text(pos[0,8], pos[1,8]-0.15, "Line2D", ha="center", + family=font, size=14) + +colors = 100*np.random.rand(len(patches)) +collection = PatchCollection(patches, cmap=matplotlib.cm.jet, alpha=0.4) +collection.set_array(np.array(colors)) +ax.add_collection(collection) +ax.add_line(line) +ax.set_xticks([]) +ax.set_yticks([]) + +plt.show() diff -Nru matplotlib-0.99.3/lib/mpl_examples/api/color_cycle.py matplotlib-1.0.1/lib/mpl_examples/api/color_cycle.py --- matplotlib-0.99.3/lib/mpl_examples/api/color_cycle.py 2009-07-31 15:14:49.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/api/color_cycle.py 2010-07-07 01:41:55.000000000 +0000 @@ -13,7 +13,7 @@ mpl.rc('lines', linewidth=4) fig = plt.figure() -mpl.axes.set_default_color_cycle(['r', 'g', 'b', 'c']) +mpl.rcParams['axes.color_cycle'] = ['r', 'g', 'b', 'c'] ax = fig.add_subplot(2,1,1) ax.plot(yy) ax.set_title('Changed default color cycle to rgbc') diff -Nru matplotlib-0.99.3/lib/mpl_examples/api/compound_path.py matplotlib-1.0.1/lib/mpl_examples/api/compound_path.py --- matplotlib-0.99.3/lib/mpl_examples/api/compound_path.py 2009-07-31 15:14:49.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/api/compound_path.py 2010-07-07 01:41:55.000000000 +0000 @@ -21,7 +21,7 @@ vertices = np.array(vertices, float) path = Path(vertices, codes) -pathpatch = PathPatch(path, facecolor='red', edgecolor='green') +pathpatch = PathPatch(path, facecolor='None', edgecolor='green') fig = plt.figure() ax = fig.add_subplot(111) diff -Nru matplotlib-0.99.3/lib/mpl_examples/api/date_demo.py matplotlib-1.0.1/lib/mpl_examples/api/date_demo.py --- matplotlib-0.99.3/lib/mpl_examples/api/date_demo.py 2009-07-31 15:14:49.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/api/date_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -17,6 +17,7 @@ import matplotlib.pyplot as plt import matplotlib.dates as mdates import matplotlib.mlab as mlab +import matplotlib.cbook as cbook years = mdates.YearLocator() # every year months = mdates.MonthLocator() # every month @@ -26,7 +27,7 @@ # open, close, volume, adj_close from the mpl-data/example directory. # The record array stores python datetime.date as an object array in # the date column -datafile = matplotlib.get_example_data('goog.npy') +datafile = cbook.get_sample_data('goog.npy') r = np.load(datafile).view(np.recarray) fig = plt.figure() diff -Nru matplotlib-0.99.3/lib/mpl_examples/api/date_index_formatter.py matplotlib-1.0.1/lib/mpl_examples/api/date_index_formatter.py --- matplotlib-0.99.3/lib/mpl_examples/api/date_index_formatter.py 2009-07-31 15:14:49.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/api/date_index_formatter.py 2010-07-07 01:41:55.000000000 +0000 @@ -6,9 +6,13 @@ import numpy as np import matplotlib.pyplot as plt import matplotlib.mlab as mlab +import matplotlib.cbook as cbook import matplotlib.ticker as ticker -r = mlab.csv2rec('../data/aapl.csv') +datafile = cbook.get_sample_data('aapl.csv', asfileobj=False) +print 'loading', datafile +r = mlab.csv2rec(datafile) + r.sort() r = r[-30:] # get the last 30 days diff -Nru matplotlib-0.99.3/lib/mpl_examples/api/demo_affine_image.py matplotlib-1.0.1/lib/mpl_examples/api/demo_affine_image.py --- matplotlib-0.99.3/lib/mpl_examples/api/demo_affine_image.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/api/demo_affine_image.py 2010-07-07 01:41:55.000000000 +0000 @@ -0,0 +1,66 @@ +#!/usr/bin/env python + + +""" +For the backends that supports draw_image with optional affine +transform (e.g., agg, ps backend), the image of the output should +have its boundary matches the red rectangles. +""" + +import numpy as np +import matplotlib.cm as cm +import matplotlib.mlab as mlab +import matplotlib.pyplot as plt +import matplotlib.transforms as mtransforms + +def get_image(): + delta = 0.25 + x = y = np.arange(-3.0, 3.0, delta) + X, Y = np.meshgrid(x, y) + Z1 = mlab.bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0) + Z2 = mlab.bivariate_normal(X, Y, 1.5, 0.5, 1, 1) + Z = Z2-Z1 # difference of Gaussians + return Z + +def imshow_affine(ax, z, *kl, **kwargs): + im = ax.imshow(z, *kl, **kwargs) + x1, x2, y1, y2 = im.get_extent() + im._image_skew_coordinate = (x2, y1) + return im + + +if 1: + + # image rotation + + ax1 = plt.subplot(121) + Z = get_image() + im1 = imshow_affine(ax1, Z, interpolation='nearest', cmap=cm.jet, + origin='lower', + extent=[-2, 4, -3, 2], clip_on=True) + + trans_data2 = mtransforms.Affine2D().rotate_deg(30) + ax1.transData + im1.set_transform(trans_data2) + + # display intended extent of the image + x1, x2, y1, y2 = im1.get_extent() + x3, y3 = x2, y1 + + ax1.plot([x1, x2, x2, x1, x1], [y1, y1, y2, y2, y1], "r--", lw=3, + transform=trans_data2) + + ax1.set_xlim(-3, 5) + ax1.set_ylim(-4, 4) + + + # image skew + + ax2 = plt.subplot(122) + im2 = ax2.imshow(Z, interpolation='nearest', cmap=cm.jet, + origin='lower', + extent=[-2, 4, -3, 2], clip_on=True) + im2._image_skew_coordinate = (3, -2) + + + plt.show() + #plt.savefig("demo_affine_image") diff -Nru matplotlib-0.99.3/lib/mpl_examples/api/engineering_formatter.py matplotlib-1.0.1/lib/mpl_examples/api/engineering_formatter.py --- matplotlib-0.99.3/lib/mpl_examples/api/engineering_formatter.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/api/engineering_formatter.py 2010-07-07 01:41:55.000000000 +0000 @@ -0,0 +1,19 @@ +''' +Demo to show use of the engineering Formatter. +''' + +import matplotlib.pyplot as plt +import numpy as np + +from matplotlib.ticker import EngFormatter + +ax = plt.subplot(111) +ax.set_xscale('log') +formatter = EngFormatter(unit='Hz', places=1) +ax.xaxis.set_major_formatter(formatter) + +xs = np.logspace(1, 9, 100) +ys = (0.8 + 0.4 * np.random.uniform(size=100)) * np.log10(xs)**2 +ax.plot(xs, ys) + +plt.show() diff -Nru matplotlib-0.99.3/lib/mpl_examples/api/font_file.py matplotlib-1.0.1/lib/mpl_examples/api/font_file.py --- matplotlib-0.99.3/lib/mpl_examples/api/font_file.py 2009-07-31 15:14:49.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/api/font_file.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,19 +1,40 @@ -# -*- noplot -*- -""" -Although it is usually not a good idea to explicitly point to a single -ttf file for a font instance, you can do so using the -font_manager.FontProperties fname argument (for a more flexible -solution, see the font_fmaily_rc.py and fonts_demo.py examples). -""" -import matplotlib.font_manager as fm - -import matplotlib.pyplot as plt - -fig = plt.figure() -ax = fig.add_subplot(111) -ax.plot([1,2,3]) - -prop = fm.FontProperties(fname='/Library/Fonts/Tahoma.ttf') -ax.set_title('this is a special font', fontproperties=prop) -plt.show() - +# -*- noplot -*- +""" +Although it is usually not a good idea to explicitly point to a single +ttf file for a font instance, you can do so using the +font_manager.FontProperties fname argument (for a more flexible +solution, see the font_fmaily_rc.py and fonts_demo.py examples). +""" +import sys +import os +import matplotlib.font_manager as fm + +import matplotlib.pyplot as plt + +fig = plt.figure() +ax = fig.add_subplot(111) +ax.plot([1,2,3]) + +if sys.platform == 'win32': + fpath = 'C:\\Windows\\Fonts\\Tahoma.ttf' +elif sys.platform == 'linux2': + fonts = ['/usr/share/fonts/truetype/freefont/FreeSansBoldOblique.ttf', + '/usr/share/fonts/truetype/ttf-liberation/LiberationSans-BoldItalic.ttf', + '/usr/share/fonts/truetype/msttcorefonts/Comic_Sans_MS.ttf', + ] + for fpath in fonts: + if os.path.exists(fpath): + break +else: + fpath = '/Library/Fonts/Tahoma.ttf' + +if os.path.exists(fpath): + prop = fm.FontProperties(fname=fpath) + fname = os.path.split(fpath)[1] + ax.set_title('this is a special font: %s' % fname, fontproperties=prop) +else: + ax.set_title('Demo fails--cannot find a demo font') +ax.set_xlabel('This is the default font') + +plt.show() + diff -Nru matplotlib-0.99.3/lib/mpl_examples/api/hinton_demo.py matplotlib-1.0.1/lib/mpl_examples/api/hinton_demo.py --- matplotlib-0.99.3/lib/mpl_examples/api/hinton_demo.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/api/hinton_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -0,0 +1,60 @@ +#Initial idea from David Warde-Farley on the SciPy Cookbook +import numpy as np +import matplotlib.pyplot as plt +from matplotlib.patches import Rectangle +from matplotlib.ticker import NullLocator +#from matplotlib.collections import RegularPolyCollection +#from matplotlib.colors import BoundaryNorm, ListedColormap + +def hinton(W, maxWeight=None, ax=None): + """ + Draws a Hinton diagram for visualizing a weight matrix. + """ + if not ax: + fig = plt.figure() + ax = fig.add_subplot(1, 1, 1) + + if not maxWeight: + maxWeight = 2**np.ceil(np.log(np.abs(W).max())/np.log(2)) + + ax.patch.set_facecolor('gray') + ax.set_aspect('equal', 'box') + ax.xaxis.set_major_locator(NullLocator()) + ax.yaxis.set_major_locator(NullLocator()) + + for (x,y),w in np.ndenumerate(W): + if w > 0: color = 'white' + else: color = 'black' + size = np.sqrt(np.abs(w)) + rect = Rectangle([x - size / 2, y - size / 2], size, size, + facecolor=color, edgecolor=color) + ax.add_patch(rect) + ax.autoscale_view() + + # Reverse the yaxis limits + ax.set_ylim(*ax.get_ylim()[::-1]) + +## Potential way using polygon collections that just has an issue with +## easily getting the squares scaled by the data. + +# height,width = W.shape +# x = np.arange(width) +# y = np.arange(height) +# X,Y = np.meshgrid(x, y) +# xy = np.array([X.flatten(),Y.flatten()]).T +# scaled_data = W.flatten() / maxWeight +# cmap = ListedColormap(['black', 'white']) +# norm = BoundaryNorm([-1., 0., 1.], cmap.N) + +# rect_col = RegularPolyCollection(4, rotation=np.pi/4, +# sizes=np.abs(scaled_data) * 72 / ax.figure.get_dpi(), offsets=xy, +# transOffset=ax.transData, norm=norm, cmap=cmap, edgecolor='none') +# ax.add_collection(rect_col) +# rect_col.set_array(scaled_data) +# ax.autoscale_view() + +if __name__ == '__main__': + hinton(np.random.rand(20, 20) - 0.5) + plt.title('Hinton Example') + plt.show() + diff -Nru matplotlib-0.99.3/lib/mpl_examples/api/sankey_demo.py matplotlib-1.0.1/lib/mpl_examples/api/sankey_demo.py --- matplotlib-0.99.3/lib/mpl_examples/api/sankey_demo.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/api/sankey_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -0,0 +1,188 @@ +#!/usr/bin/env python + +__author__ = "Yannick Copin " +__version__ = "Time-stamp: <10/02/2010 16:49 ycopin@lyopc548.in2p3.fr>" + +import numpy as N + +def sankey(ax, + outputs=[100.], outlabels=None, + inputs=[100.], inlabels='', + dx=40, dy=10, outangle=45, w=3, inangle=30, offset=2, **kwargs): + """Draw a Sankey diagram. + + outputs: array of outputs, should sum up to 100% + outlabels: output labels (same length as outputs), + or None (use default labels) or '' (no labels) + inputs and inlabels: similar for inputs + dx: horizontal elongation + dy: vertical elongation + outangle: output arrow angle [deg] + w: output arrow shoulder + inangle: input dip angle + offset: text offset + **kwargs: propagated to Patch (e.g. fill=False) + + Return (patch,[intexts,outtexts]).""" + + import matplotlib.patches as mpatches + from matplotlib.path import Path + + outs = N.absolute(outputs) + outsigns = N.sign(outputs) + outsigns[-1] = 0 # Last output + + ins = N.absolute(inputs) + insigns = N.sign(inputs) + insigns[0] = 0 # First input + + assert sum(outs)==100, "Outputs don't sum up to 100%" + assert sum(ins)==100, "Inputs don't sum up to 100%" + + def add_output(path, loss, sign=1): + h = (loss/2+w)*N.tan(outangle/180.*N.pi) # Arrow tip height + move,(x,y) = path[-1] # Use last point as reference + if sign==0: # Final loss (horizontal) + path.extend([(Path.LINETO,[x+dx,y]), + (Path.LINETO,[x+dx,y+w]), + (Path.LINETO,[x+dx+h,y-loss/2]), # Tip + (Path.LINETO,[x+dx,y-loss-w]), + (Path.LINETO,[x+dx,y-loss])]) + outtips.append((sign,path[-3][1])) + else: # Intermediate loss (vertical) + path.extend([(Path.CURVE4,[x+dx/2,y]), + (Path.CURVE4,[x+dx,y]), + (Path.CURVE4,[x+dx,y+sign*dy]), + (Path.LINETO,[x+dx-w,y+sign*dy]), + (Path.LINETO,[x+dx+loss/2,y+sign*(dy+h)]), # Tip + (Path.LINETO,[x+dx+loss+w,y+sign*dy]), + (Path.LINETO,[x+dx+loss,y+sign*dy]), + (Path.CURVE3,[x+dx+loss,y-sign*loss]), + (Path.CURVE3,[x+dx/2+loss,y-sign*loss])]) + outtips.append((sign,path[-5][1])) + + def add_input(path, gain, sign=1): + h = (gain/2)*N.tan(inangle/180.*N.pi) # Dip depth + move,(x,y) = path[-1] # Use last point as reference + if sign==0: # First gain (horizontal) + path.extend([(Path.LINETO,[x-dx,y]), + (Path.LINETO,[x-dx+h,y+gain/2]), # Dip + (Path.LINETO,[x-dx,y+gain])]) + xd,yd = path[-2][1] # Dip position + indips.append((sign,[xd-h,yd])) + else: # Intermediate gain (vertical) + path.extend([(Path.CURVE4,[x-dx/2,y]), + (Path.CURVE4,[x-dx,y]), + (Path.CURVE4,[x-dx,y+sign*dy]), + (Path.LINETO,[x-dx-gain/2,y+sign*(dy-h)]), # Dip + (Path.LINETO,[x-dx-gain,y+sign*dy]), + (Path.CURVE3,[x-dx-gain,y-sign*gain]), + (Path.CURVE3,[x-dx/2-gain,y-sign*gain])]) + xd,yd = path[-4][1] # Dip position + indips.append((sign,[xd,yd+sign*h])) + + outtips = [] # Output arrow tip dir. and positions + urpath = [(Path.MOVETO,[0,100])] # 1st point of upper right path + lrpath = [(Path.LINETO,[0,0])] # 1st point of lower right path + for loss,sign in zip(outs,outsigns): + add_output(sign>=0 and urpath or lrpath, loss, sign=sign) + + indips = [] # Input arrow tip dir. and positions + llpath = [(Path.LINETO,[0,0])] # 1st point of lower left path + ulpath = [(Path.MOVETO,[0,100])] # 1st point of upper left path + for gain,sign in zip(ins,insigns)[::-1]: + add_input(sign<=0 and llpath or ulpath, gain, sign=sign) + + def revert(path): + """A path is not just revertable by path[::-1] because of Bezier + curves.""" + rpath = [] + nextmove = Path.LINETO + for move,pos in path[::-1]: + rpath.append((nextmove,pos)) + nextmove = move + return rpath + + # Concatenate subpathes in correct order + path = urpath + revert(lrpath) + llpath + revert(ulpath) + + codes,verts = zip(*path) + verts = N.array(verts) + + # Path patch + path = Path(verts,codes) + patch = mpatches.PathPatch(path, **kwargs) + ax.add_patch(patch) + + if False: # DEBUG + print "urpath", urpath + print "lrpath", revert(lrpath) + print "llpath", llpath + print "ulpath", revert(ulpath) + + xs,ys = zip(*verts) + ax.plot(xs,ys,'go-') + + # Labels + + def set_labels(labels,values): + """Set or check labels according to values.""" + if labels=='': # No labels + return labels + elif labels is None: # Default labels + return [ '%2d%%' % val for val in values ] + else: + assert len(labels)==len(values) + return labels + + def put_labels(labels,positions,output=True): + """Put labels to positions.""" + texts = [] + lbls = output and labels or labels[::-1] + for i,label in enumerate(lbls): + s,(x,y) = positions[i] # Label direction and position + if s==0: + t = ax.text(x+offset,y,label, + ha=output and 'left' or 'right', va='center') + elif s>0: + t = ax.text(x,y+offset,label, ha='center', va='bottom') + else: + t = ax.text(x,y-offset,label, ha='center', va='top') + texts.append(t) + return texts + + outlabels = set_labels(outlabels, outs) + outtexts = put_labels(outlabels, outtips, output=True) + + inlabels = set_labels(inlabels, ins) + intexts = put_labels(inlabels, indips, output=False) + + # Axes management + ax.set_xlim(verts[:,0].min()-dx, verts[:,0].max()+dx) + ax.set_ylim(verts[:,1].min()-dy, verts[:,1].max()+dy) + ax.set_aspect('equal', adjustable='datalim') + + return patch,[intexts,outtexts] + +if __name__=='__main__': + + import matplotlib.pyplot as P + + outputs = [10.,-20.,5.,15.,-10.,40.] + outlabels = ['First','Second','Third','Fourth','Fifth','Hurray!'] + outlabels = [ s+'\n%d%%' % abs(l) for l,s in zip(outputs,outlabels) ] + + inputs = [60.,-25.,15.] + + fig = P.figure() + ax = fig.add_subplot(1,1,1, xticks=[],yticks=[], + title="Sankey diagram" + ) + + patch,(intexts,outtexts) = sankey(ax, outputs=outputs, outlabels=outlabels, + inputs=inputs, inlabels=None, + fc='g', alpha=0.2) + outtexts[1].set_color('r') + outtexts[-1].set_fontweight('bold') + + P.show() diff -Nru matplotlib-0.99.3/lib/mpl_examples/api/span_regions.py matplotlib-1.0.1/lib/mpl_examples/api/span_regions.py --- matplotlib-0.99.3/lib/mpl_examples/api/span_regions.py 2009-07-31 15:14:49.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/api/span_regions.py 2010-07-07 01:41:55.000000000 +0000 @@ -21,11 +21,11 @@ ax.axhline(0, color='black', lw=2) collection = collections.BrokenBarHCollection.span_where( - t, ymin=0, ymax=1, where=s1>0, facecolor='green', alpha=0.5) + t, ymin=0, ymax=1, where=s1>0, facecolor='green', alpha=0.5) ax.add_collection(collection) collection = collections.BrokenBarHCollection.span_where( - t, ymin=-1, ymax=0, where=s1<0, facecolor='red', alpha=0.5) + t, ymin=-1, ymax=0, where=s1<0, facecolor='red', alpha=0.5) ax.add_collection(collection) diff -Nru matplotlib-0.99.3/lib/mpl_examples/api/watermark_image.py matplotlib-1.0.1/lib/mpl_examples/api/watermark_image.py --- matplotlib-0.99.3/lib/mpl_examples/api/watermark_image.py 2009-07-31 15:14:49.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/api/watermark_image.py 2010-07-07 01:41:55.000000000 +0000 @@ -3,12 +3,13 @@ """ import numpy as np import matplotlib -matplotlib.use('Agg') - +import matplotlib.cbook as cbook import matplotlib.image as image import matplotlib.pyplot as plt -im = image.imread('../data/logo2.png') +datafile = cbook.get_sample_data('logo2.png', asfileobj=False) +print 'loading', datafile +im = image.imread(datafile) im[:,:,-1] = 0.5 # set the alpha channel fig = plt.figure() diff -Nru matplotlib-0.99.3/lib/mpl_examples/axes_grid/demo_axes_divider.py matplotlib-1.0.1/lib/mpl_examples/axes_grid/demo_axes_divider.py --- matplotlib-0.99.3/lib/mpl_examples/axes_grid/demo_axes_divider.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/axes_grid/demo_axes_divider.py 2010-07-07 01:41:54.000000000 +0000 @@ -1,6 +1,13 @@ import matplotlib.pyplot as plt -from demo_image import get_demo_image -#import mpl_toolkits.imaging.axes_grid as imaging + +def get_demo_image(): + import numpy as np + from matplotlib.cbook import get_sample_data + f = get_sample_data("axes_grid/bivariate_normal.npy", asfileobj=False) + z = np.load(f) + # z is a numpy array of 15x15 + return z, (-3,4,-4,3) + def demo_simple_image(ax): Z, extent = get_demo_image() @@ -12,7 +19,7 @@ def demo_locatable_axes_hard(fig1): - from mpl_toolkits.axes_grid \ + from mpl_toolkits.axes_grid1 \ import SubplotDivider, LocatableAxes, Size divider = SubplotDivider(fig1, 2, 2, 2, aspect=True) @@ -50,7 +57,7 @@ def demo_locatable_axes_easy(ax): - from mpl_toolkits.axes_grid import make_axes_locatable + from mpl_toolkits.axes_grid1 import make_axes_locatable divider = make_axes_locatable(ax) @@ -69,7 +76,7 @@ def demo_images_side_by_sied(ax): - from mpl_toolkits.axes_grid import make_axes_locatable + from mpl_toolkits.axes_grid1 import make_axes_locatable divider = make_axes_locatable(ax) @@ -119,6 +126,4 @@ plt.show() - -if __name__ == "__main__": - demo() +demo() diff -Nru matplotlib-0.99.3/lib/mpl_examples/axes_grid/demo_axes_grid2.py matplotlib-1.0.1/lib/mpl_examples/axes_grid/demo_axes_grid2.py --- matplotlib-0.99.3/lib/mpl_examples/axes_grid/demo_axes_grid2.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/axes_grid/demo_axes_grid2.py 2010-07-07 01:41:54.000000000 +0000 @@ -0,0 +1,113 @@ +import matplotlib.pyplot as plt +from mpl_toolkits.axes_grid1 import ImageGrid +import numpy as np + +def get_demo_image(): + from matplotlib.cbook import get_sample_data + f = get_sample_data("axes_grid/bivariate_normal.npy", asfileobj=False) + z = np.load(f) + # z is a numpy array of 15x15 + return z, (-3,4,-4,3) + + +def add_inner_title(ax, title, loc, size=None, **kwargs): + from matplotlib.offsetbox import AnchoredText + from matplotlib.patheffects import withStroke + if size is None: + size = dict(size=plt.rcParams['legend.fontsize']) + at = AnchoredText(title, loc=loc, prop=size, + pad=0., borderpad=0.5, + frameon=False, **kwargs) + ax.add_artist(at) + at.txt._text.set_path_effects([withStroke(foreground="w", linewidth=3)]) + return at + +if 1: + F = plt.figure(1, (6, 6)) + F.clf() + + # prepare images + Z, extent = get_demo_image() + ZS = [Z[i::3,:] for i in range(3)] + extent = extent[0], extent[1]/3., extent[2], extent[3] + + # demo 1 : colorbar at each axes + + grid = ImageGrid(F, 211, # similar to subplot(111) + nrows_ncols = (1, 3), + direction="row", + axes_pad = 0.05, + add_all=True, + label_mode = "1", + share_all = True, + cbar_location="top", + cbar_mode="each", + cbar_size="7%", + cbar_pad="1%", + ) + + + for ax, z in zip(grid, ZS): + im = ax.imshow(z, origin="lower", extent=extent, interpolation="nearest") + ax.cax.colorbar(im) + + for ax, im_title in zip(grid, ["Image 1", "Image 2", "Image 3"]): + t = add_inner_title(ax, im_title, loc=3) + t.patch.set_alpha(0.5) + + for ax, z in zip(grid, ZS): + ax.cax.toggle_label(True) + #axis = ax.cax.axis[ax.cax.orientation] + #axis.label.set_text("counts s$^{-1}$") + #axis.label.set_size(10) + #axis.major_ticklabels.set_size(6) + + # changing the colorbar ticks + grid[1].cax.set_xticks([-1, 0, 1]) + grid[2].cax.set_xticks([-1, 0, 1]) + + grid[0].set_xticks([-2, 0]) + grid[0].set_yticks([-2, 0, 2]) + + + # demo 2 : shared colorbar + + grid2 = ImageGrid(F, 212, + nrows_ncols = (1, 3), + direction="row", + axes_pad = 0.05, + add_all=True, + label_mode = "1", + share_all = True, + cbar_location="right", + cbar_mode="single", + cbar_size="10%", + cbar_pad=0.05, + ) + + grid2[0].set_xlabel("X") + grid2[0].set_ylabel("Y") + + vmax, vmin = np.max(ZS), np.min(ZS) + import matplotlib.colors + norm = matplotlib.colors.normalize(vmax=vmax, vmin=vmin) + + for ax, z in zip(grid2, ZS): + im = ax.imshow(z, norm=norm, + origin="lower", extent=extent, + interpolation="nearest") + + # With cbar_mode="single", cax attribute of all axes are identical. + ax.cax.colorbar(im) + ax.cax.toggle_label(True) + + for ax, im_title in zip(grid2, ["(a)", "(b)", "(c)"]): + t = add_inner_title(ax, im_title, loc=2) + t.patch.set_ec("none") + t.patch.set_alpha(0.5) + + grid2[0].set_xticks([-2, 0]) + grid2[0].set_yticks([-2, 0, 2]) + + plt.draw() + plt.show() diff -Nru matplotlib-0.99.3/lib/mpl_examples/axes_grid/demo_axes_grid.py matplotlib-1.0.1/lib/mpl_examples/axes_grid/demo_axes_grid.py --- matplotlib-0.99.3/lib/mpl_examples/axes_grid/demo_axes_grid.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/axes_grid/demo_axes_grid.py 2010-07-07 01:41:54.000000000 +0000 @@ -1,7 +1,13 @@ import matplotlib.pyplot as plt -from demo_image import get_demo_image -from mpl_toolkits.axes_grid import AxesGrid +from mpl_toolkits.axes_grid1 import AxesGrid +def get_demo_image(): + import numpy as np + from matplotlib.cbook import get_sample_data + f = get_sample_data("axes_grid/bivariate_normal.npy", asfileobj=False) + z = np.load(f) + # z is a numpy array of 15x15 + return z, (-3,4,-4,3) def demo_simple_grid(fig): """ @@ -32,15 +38,19 @@ axes_pad = 0.0, share_all=True, label_mode = "L", + cbar_location = "top", cbar_mode="single", ) Z, extent = get_demo_image() for i in range(4): im = grid[i].imshow(Z, extent=extent, interpolation="nearest") - plt.colorbar(im, cax = grid.cbar_axes[0]) + #plt.colorbar(im, cax = grid.cbar_axes[0]) grid.cbar_axes[0].colorbar(im) + for cax in grid.cbar_axes: + cax.toggle_label(False) + # This affects all axes as share_all = True. grid.axes_llc.set_xticks([-2, 0, 2]) grid.axes_llc.set_yticks([-2, 0, 2]) @@ -66,14 +76,16 @@ im = grid[i].imshow(Z, extent=extent, interpolation="nearest") grid.cbar_axes[i].colorbar(im) + for cax in grid.cbar_axes: + cax.toggle_label(False) + # This affects all axes because we set share_all = True. grid.axes_llc.set_xticks([-2, 0, 2]) grid.axes_llc.set_yticks([-2, 0, 2]) -if __name__ == "__main__": - +if 1: F = plt.figure(1, (5.5, 2.5)) F.subplots_adjust(left=0.05, right=0.98) diff -Nru matplotlib-0.99.3/lib/mpl_examples/axes_grid/demo_axes_rgb.py matplotlib-1.0.1/lib/mpl_examples/axes_grid/demo_axes_rgb.py --- matplotlib-0.99.3/lib/mpl_examples/axes_grid/demo_axes_rgb.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/axes_grid/demo_axes_rgb.py 2010-07-07 01:41:54.000000000 +0000 @@ -1,8 +1,16 @@ import numpy as np import matplotlib.pyplot as plt -from demo_axes_divider import get_demo_image -from mpl_toolkits.axes_grid.axes_rgb import make_rgb_axes, RGBAxes +from mpl_toolkits.axes_grid1.axes_rgb import make_rgb_axes, RGBAxes + +def get_demo_image(): + from matplotlib.cbook import get_sample_data + f = get_sample_data("axes_grid/bivariate_normal.npy", asfileobj=False) + z = np.load(f) + # z is a numpy array of 15x15 + return z, (-3,4,-4,3) + + def get_rgb(): Z, extent = get_demo_image() @@ -67,16 +75,16 @@ ax.RGB.set_ylim(0.9, 10.6) for ax1 in [ax.RGB, ax.R, ax.G, ax.B]: - for axisline in ax1._axislines.values(): - axisline.line.set_color("w") - axisline.major_ticks.set_mec("w") + for sp1 in ax1.spines.values(): + sp1.set_color("w") + for tick in ax1.xaxis.get_major_ticks() + ax1.yaxis.get_major_ticks(): + tick.tick1line.set_mec("w") + tick.tick2line.set_mec("w") return ax -if __name__ == "__main__": - demo_rgb() - ax = demo_rgb2() +demo_rgb() +ax = demo_rgb2() - plt.draw() - plt.show() +plt.show() diff -Nru matplotlib-0.99.3/lib/mpl_examples/axes_grid/demo_axisline_style.py matplotlib-1.0.1/lib/mpl_examples/axes_grid/demo_axisline_style.py --- matplotlib-0.99.3/lib/mpl_examples/axes_grid/demo_axisline_style.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/axes_grid/demo_axisline_style.py 2010-07-07 01:41:54.000000000 +0000 @@ -0,0 +1,21 @@ + +from mpl_toolkits.axes_grid.axislines import SubplotZero +import matplotlib.pyplot as plt +import numpy as np + +if 1: + fig = plt.figure(1) + ax = SubplotZero(fig, 111) + fig.add_subplot(ax) + + for direction in ["xzero", "yzero"]: + ax.axis[direction].set_axisline_style("-|>") + ax.axis[direction].set_visible(True) + + for direction in ["left", "right", "bottom", "top"]: + ax.axis[direction].set_visible(False) + + x = np.linspace(-0.5, 1., 100) + ax.plot(x, np.sin(x*np.pi)) + + plt.show() diff -Nru matplotlib-0.99.3/lib/mpl_examples/axes_grid/demo_colorbar_with_inset_locator.py matplotlib-1.0.1/lib/mpl_examples/axes_grid/demo_colorbar_with_inset_locator.py --- matplotlib-0.99.3/lib/mpl_examples/axes_grid/demo_colorbar_with_inset_locator.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/axes_grid/demo_colorbar_with_inset_locator.py 2010-07-07 01:41:54.000000000 +0000 @@ -0,0 +1,39 @@ +import matplotlib.pyplot as plt + +from mpl_toolkits.axes_grid1.inset_locator import inset_axes + +fig = plt.figure(1, [6, 3]) + +# first subplot +ax1 = fig.add_subplot(121) + +axins1 = inset_axes(ax1, + width="50%", # width = 10% of parent_bbox width + height="5%", # height : 50% + loc=1) + +im1=ax1.imshow([[1,2],[2, 3]]) +plt.colorbar(im1, cax=axins1, orientation="horizontal", ticks=[1,2,3]) +axins1.xaxis.set_ticks_position("bottom") + +# first subplot +ax = fig.add_subplot(122) + +axins = inset_axes(ax, + width="5%", # width = 10% of parent_bbox width + height="50%", # height : 50% + loc=3, + bbox_to_anchor=(1.05, 0., 1, 1), + bbox_transform=ax.transAxes, + borderpad=0, + ) + +# Controlling the placement of the inset axes is basically same as that +# of the legend. you may want to play with the borderpad value and +# the bbox_to_anchor coordinate. + +im=ax.imshow([[1,2],[2, 3]]) +plt.colorbar(im, cax=axins, ticks=[1,2,3]) + +plt.draw() +plt.show() diff -Nru matplotlib-0.99.3/lib/mpl_examples/axes_grid/demo_curvelinear_grid2.py matplotlib-1.0.1/lib/mpl_examples/axes_grid/demo_curvelinear_grid2.py --- matplotlib-0.99.3/lib/mpl_examples/axes_grid/demo_curvelinear_grid2.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/axes_grid/demo_curvelinear_grid2.py 2010-07-07 01:41:54.000000000 +0000 @@ -0,0 +1,63 @@ +import numpy as np +#from matplotlib.path import Path + +import matplotlib.pyplot as plt + +from mpl_toolkits.axes_grid.grid_helper_curvelinear import GridHelperCurveLinear +from mpl_toolkits.axes_grid.axislines import Subplot + +import mpl_toolkits.axes_grid.angle_helper as angle_helper + +def curvelinear_test1(fig): + """ + grid for custom transform. + """ + + def tr(x, y): + sgn = np.sign(x) + x, y = np.abs(np.asarray(x)), np.asarray(y) + return sgn*x**.5, y + + def inv_tr(x,y): + sgn = np.sign(x) + x, y = np.asarray(x), np.asarray(y) + return sgn*x**2, y + + extreme_finder = angle_helper.ExtremeFinderCycle(20, 20, + lon_cycle = None, + lat_cycle = None, + lon_minmax = None, #(0, np.inf), + lat_minmax = None, + ) + + grid_helper = GridHelperCurveLinear((tr, inv_tr), + extreme_finder=extreme_finder) + + ax1 = Subplot(fig, 111, grid_helper=grid_helper) + # ax1 will have a ticks and gridlines defined by the given + # transform (+ transData of the Axes). Note that the transform of + # the Axes itself (i.e., transData) is not affected by the given + # transform. + + fig.add_subplot(ax1) + + ax1.imshow(np.arange(25).reshape(5,5), + vmax = 50, cmap=plt.cm.gray_r, + interpolation="nearest", + origin="lower") + + # tick density + grid_helper.grid_finder.grid_locator1._nbins = 6 + grid_helper.grid_finder.grid_locator2._nbins = 6 + + + +if 1: + fig = plt.figure(1, figsize=(7, 4)) + fig.clf() + + curvelinear_test1(fig) + plt.show() + + + diff -Nru matplotlib-0.99.3/lib/mpl_examples/axes_grid/demo_curvelinear_grid.py matplotlib-1.0.1/lib/mpl_examples/axes_grid/demo_curvelinear_grid.py --- matplotlib-0.99.3/lib/mpl_examples/axes_grid/demo_curvelinear_grid.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/axes_grid/demo_curvelinear_grid.py 2010-07-07 01:41:54.000000000 +0000 @@ -4,10 +4,10 @@ import matplotlib.pyplot as plt import matplotlib.cbook as cbook -from mpl_toolkits.axes_grid.grid_helper_curvelinear import GridHelperCurveLinear -from mpl_toolkits.axes_grid.axislines import Subplot +from mpl_toolkits.axisartist.grid_helper_curvelinear import GridHelperCurveLinear +from mpl_toolkits.axisartist import Subplot -from mpl_toolkits.axes_grid.parasite_axes import SubplotHost, \ +from mpl_toolkits.axisartist import SubplotHost, \ ParasiteAxesAuxTrans @@ -42,11 +42,13 @@ ax1.set_xlim(0, 10.) ax1.set_ylim(0, 10.) + ax1.axis["t"]=ax1.new_floating_axis(0, 3.) + ax1.axis["t2"]=ax1.new_floating_axis(1, 7.) ax1.grid(True) -import mpl_toolkits.axes_grid.angle_helper as angle_helper +import mpl_toolkits.axisartist.angle_helper as angle_helper from matplotlib.projections import PolarAxes from matplotlib.transforms import Affine2D diff -Nru matplotlib-0.99.3/lib/mpl_examples/axes_grid/demo_fixed_size_axes.py matplotlib-1.0.1/lib/mpl_examples/axes_grid/demo_fixed_size_axes.py --- matplotlib-0.99.3/lib/mpl_examples/axes_grid/demo_fixed_size_axes.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/axes_grid/demo_fixed_size_axes.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,57 +0,0 @@ -import matplotlib.pyplot as plt - -from mpl_toolkits.axes_grid \ - import Divider, LocatableAxes, Size - -def demo_fixed_size_axes(): - - fig1 = plt.figure(1, (6, 6)) - - # The first items are for padding and the second items are for the axes. - # sizes are in inch. - h = [Size.Fixed(1.0), Size.Fixed(4.5)] - v = [Size.Fixed(0.7), Size.Fixed(5.)] - - divider = Divider(fig1, (0.0, 0.0, 1., 1.), h, v, aspect=False) - # the width and height of the rectangle is ignored. - - ax = LocatableAxes(fig1, divider.get_position()) - ax.set_axes_locator(divider.new_locator(nx=1, ny=1)) - - fig1.add_axes(ax) - - ax.plot([1,2,3]) - - - - -def demo_fixed_pad_axes(): - - fig = plt.figure(2, (6, 6)) - - # The first & third items are for padding and the second items are for the axes. - # sizes are in inch. - h = [Size.Fixed(1.0), Size.Scaled(1.), Size.Fixed(.2),] - v = [Size.Fixed(0.7), Size.Scaled(1.), Size.Fixed(.5),] - - divider = Divider(fig, (0.0, 0.0, 1., 1.), h, v, aspect=False) - # the width and height of the rectangle is ignored. - - ax = LocatableAxes(fig, divider.get_position()) - ax.set_axes_locator(divider.new_locator(nx=1, ny=1)) - - fig.add_axes(ax) - - ax.plot([1,2,3]) - - - - - - -if __name__ == "__main__": - demo_fixed_size_axes() - demo_fixed_pad_axes() - - plt.draw() - plt.show() diff -Nru matplotlib-0.99.3/lib/mpl_examples/axes_grid/demo_floating_axes.py matplotlib-1.0.1/lib/mpl_examples/axes_grid/demo_floating_axes.py --- matplotlib-0.99.3/lib/mpl_examples/axes_grid/demo_floating_axes.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/axes_grid/demo_floating_axes.py 2010-07-07 01:41:54.000000000 +0000 @@ -0,0 +1,154 @@ +from matplotlib.transforms import Affine2D + +import mpl_toolkits.axisartist.floating_axes as floating_axes + +import numpy as np +import mpl_toolkits.axisartist.angle_helper as angle_helper +from matplotlib.projections import PolarAxes +from mpl_toolkits.axisartist.grid_finder import FixedLocator, MaxNLocator, \ + DictFormatter + +def setup_axes1(fig, rect): + """ + A simple one. + """ + tr = Affine2D().scale(2, 1).rotate_deg(30) + + grid_helper = floating_axes.GridHelperCurveLinear(tr, extremes=(0, 4, 0, 4)) + + ax1 = floating_axes.FloatingSubplot(fig, rect, grid_helper=grid_helper) + fig.add_subplot(ax1) + + grid_helper.grid_finder.grid_locator1._nbins = 4 + grid_helper.grid_finder.grid_locator2._nbins = 4 + + return ax1 + + +def setup_axes2(fig, rect): + """ + With custom locator and formatter. + Note that the extreme values are swapped. + """ + + #tr_scale = Affine2D().scale(np.pi/180., 1.) + + tr = PolarAxes.PolarTransform() + + pi = np.pi + angle_ticks = [(0, r"$0$"), + (.25*pi, r"$\frac{1}{4}\pi$"), + (.5*pi, r"$\frac{1}{2}\pi$")] + grid_locator1 = FixedLocator([v for v, s in angle_ticks]) + tick_formatter1 = DictFormatter(dict(angle_ticks)) + + grid_locator2 = MaxNLocator(2) + + grid_helper = floating_axes.GridHelperCurveLinear(tr, + extremes=(.5*pi, 0, 2, 1), + grid_locator1=grid_locator1, + grid_locator2=grid_locator2, + tick_formatter1=tick_formatter1, + tick_formatter2=None, + ) + + ax1 = floating_axes.FloatingSubplot(fig, rect, grid_helper=grid_helper) + fig.add_subplot(ax1) + + # create a parasite axes whose transData in RA, cz + aux_ax = ax1.get_aux_axes(tr) + + aux_ax.patch = ax1.patch # for aux_ax to have a clip path as in ax + ax1.patch.zorder=0.9 # but this has a side effect that the patch is + # drawn twice, and possibly over some other + # artists. So, we decrease the zorder a bit to + # prevent this. + + return ax1, aux_ax + + +def setup_axes3(fig, rect): + """ + Sometimes, things like axis_direction need to be adjusted. + """ + + # rotate a bit for better orientation + tr_rotate = Affine2D().translate(-95, 0) + + # scale degree to radians + tr_scale = Affine2D().scale(np.pi/180., 1.) + + tr = tr_rotate + tr_scale + PolarAxes.PolarTransform() + + grid_locator1 = angle_helper.LocatorHMS(4) + tick_formatter1 = angle_helper.FormatterHMS() + + grid_locator2 = MaxNLocator(3) + + ra0, ra1 = 8.*15, 14.*15 + cz0, cz1 = 0, 14000 + grid_helper = floating_axes.GridHelperCurveLinear(tr, + extremes=(ra0, ra1, cz0, cz1), + grid_locator1=grid_locator1, + grid_locator2=grid_locator2, + tick_formatter1=tick_formatter1, + tick_formatter2=None, + ) + + ax1 = floating_axes.FloatingSubplot(fig, rect, grid_helper=grid_helper) + fig.add_subplot(ax1) + + # adjust axis + ax1.axis["left"].set_axis_direction("bottom") + ax1.axis["right"].set_axis_direction("top") + + ax1.axis["bottom"].set_visible(False) + ax1.axis["top"].set_axis_direction("bottom") + ax1.axis["top"].toggle(ticklabels=True, label=True) + ax1.axis["top"].major_ticklabels.set_axis_direction("top") + ax1.axis["top"].label.set_axis_direction("top") + + ax1.axis["left"].label.set_text(r"cz [km$^{-1}$]") + ax1.axis["top"].label.set_text(r"$\alpha_{1950}$") + + + # create a parasite axes whose transData in RA, cz + aux_ax = ax1.get_aux_axes(tr) + + aux_ax.patch = ax1.patch # for aux_ax to have a clip path as in ax + ax1.patch.zorder=0.9 # but this has a side effect that the patch is + # drawn twice, and possibly over some other + # artists. So, we decrease the zorder a bit to + # prevent this. + + return ax1, aux_ax + + + +if 1: + import matplotlib.pyplot as plt + fig = plt.figure(1, figsize=(8, 4)) + fig.subplots_adjust(wspace=0.3, left=0.05, right=0.95) + + ax1 = setup_axes1(fig, 131) + + #theta = np.random.rand(10) #*.5*np.pi + #radius = np.random.rand(10) #+1. + #aux_ax1.scatter(theta, radius) + + + ax2, aux_ax2 = setup_axes2(fig, 132) + + theta = np.random.rand(10)*.5*np.pi + radius = np.random.rand(10)+1. + aux_ax2.scatter(theta, radius) + + + ax3, aux_ax3 = setup_axes3(fig, 133) + + theta = (8 + np.random.rand(10)*(14-8))*15. # indegree + radius = np.random.rand(10)*14000. + aux_ax3.scatter(theta, radius) + + plt.show() + diff -Nru matplotlib-0.99.3/lib/mpl_examples/axes_grid/demo_floating_axis.py matplotlib-1.0.1/lib/mpl_examples/axes_grid/demo_floating_axis.py --- matplotlib-0.99.3/lib/mpl_examples/axes_grid/demo_floating_axis.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/axes_grid/demo_floating_axis.py 2010-07-07 01:41:54.000000000 +0000 @@ -9,13 +9,13 @@ """ global ax1 import numpy as np - import mpl_toolkits.axes_grid.angle_helper as angle_helper + import mpl_toolkits.axisartist.angle_helper as angle_helper from matplotlib.projections import PolarAxes from matplotlib.transforms import Affine2D - from mpl_toolkits.axes_grid.parasite_axes import SubplotHost + from mpl_toolkits.axisartist import SubplotHost - from mpl_toolkits.axes_grid.grid_helper_curvelinear import GridHelperCurveLinear + from mpl_toolkits.axisartist import GridHelperCurveLinear # see demo_curvelinear_grid.py for details tr = Affine2D().scale(np.pi/180., 1.) + PolarAxes.PolarTransform() @@ -60,14 +60,12 @@ ax1.grid(True) -if __name__ == "__main__": - import matplotlib.pyplot as plt - fig = plt.figure(1, figsize=(5, 5)) - fig.clf() +import matplotlib.pyplot as plt +fig = plt.figure(1, figsize=(5, 5)) +fig.clf() - curvelinear_test2(fig) +curvelinear_test2(fig) - plt.draw() - plt.show() +plt.show() diff -Nru matplotlib-0.99.3/lib/mpl_examples/axes_grid/demo_image.py matplotlib-1.0.1/lib/mpl_examples/axes_grid/demo_image.py --- matplotlib-0.99.3/lib/mpl_examples/axes_grid/demo_image.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/axes_grid/demo_image.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -import numpy as np - -def get_demo_image(): - # prepare image - delta = 0.5 - - extent = (-3,4,-4,3) - x = np.arange(-3.0, 4.001, delta) - y = np.arange(-4.0, 3.001, delta) - X, Y = np.meshgrid(x, y) - import matplotlib.mlab as mlab - Z1 = mlab.bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0) - Z2 = mlab.bivariate_normal(X, Y, 1.5, 0.5, 1, 1) - Z = (Z1 - Z2) * 10 - - return Z, extent - diff -Nru matplotlib-0.99.3/lib/mpl_examples/axes_grid/demo_parasite_axes2.py matplotlib-1.0.1/lib/mpl_examples/axes_grid/demo_parasite_axes2.py --- matplotlib-0.99.3/lib/mpl_examples/axes_grid/demo_parasite_axes2.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/axes_grid/demo_parasite_axes2.py 2010-07-07 01:41:54.000000000 +0000 @@ -1,32 +1,24 @@ -from mpl_toolkits.axes_grid.parasite_axes import SubplotHost +from mpl_toolkits.axes_grid1 import host_subplot +import mpl_toolkits.axisartist as AA import matplotlib.pyplot as plt if 1: - fig = plt.figure(1) - host = SubplotHost(fig, 111) - - host.set_ylabel("Density") - host.set_xlabel("Distance") + host = host_subplot(111, axes_class=AA.Axes) + plt.subplots_adjust(right=0.75) par1 = host.twinx() par2 = host.twinx() - par1.set_ylabel("Temperature") - - par2.axis["right"].set_visible(False) + offset = 60 + new_fixed_axis = par2.get_grid_helper().new_fixed_axis + par2.axis["right"] = new_fixed_axis(loc="right", + axes=par2, + offset=(offset, 0)) + + par2.axis["right"].toggle(all=True) - offset = 60, 0 - new_axisline = par2.get_grid_helper().new_fixed_axis - par2.axis["right2"] = new_axisline(loc="right", - axes=par2, - offset=offset) - par2.axis["right2"].label.set_visible(True) - par2.axis["right2"].set_label("Velocity") - - fig.add_axes(host) - plt.subplots_adjust(right=0.75) host.set_xlim(0, 2) host.set_ylim(0, 2) @@ -34,6 +26,7 @@ host.set_xlabel("Distance") host.set_ylabel("Density") par1.set_ylabel("Temperature") + par2.set_ylabel("Velocity") p1, = host.plot([0, 1, 2], [0, 1, 2], label="Density") p2, = par1.plot([0, 1, 2], [0, 3, 2], label="Temperature") @@ -46,7 +39,7 @@ host.axis["left"].label.set_color(p1.get_color()) par1.axis["right"].label.set_color(p2.get_color()) - par2.axis["right2"].label.set_color(p3.get_color()) + par2.axis["right"].label.set_color(p3.get_color()) plt.draw() plt.show() diff -Nru matplotlib-0.99.3/lib/mpl_examples/axes_grid/demo_parasite_axes.py matplotlib-1.0.1/lib/mpl_examples/axes_grid/demo_parasite_axes.py --- matplotlib-0.99.3/lib/mpl_examples/axes_grid/demo_parasite_axes.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/axes_grid/demo_parasite_axes.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,54 +0,0 @@ -from mpl_toolkits.axes_grid.parasite_axes import HostAxes, ParasiteAxes -import matplotlib.pyplot as plt - -if __name__ == "__main__": - fig = plt.figure(1) - - host = HostAxes(fig, [0.15, 0.1, 0.65, 0.8]) - par1 = ParasiteAxes(host, sharex=host) - par2 = ParasiteAxes(host, sharex=host) - host.parasites.append(par1) - host.parasites.append(par2) - - host.set_ylabel("Density") - host.set_xlabel("Distance") - - host.axis["right"].set_visible(False) - par1.axis["right"].set_visible(True) - par1.set_ylabel("Temperature") - - par1.axis["right"].major_ticklabels.set_visible(True) - par1.axis["right"].label.set_visible(True) - - par2.set_ylabel("Velocity") - offset = (60, 0) - new_axisline = par2._grid_helper.new_fixed_axis - par2.axis["right2"] = new_axisline(loc="right", - axes=par2, - offset=offset) - - - fig.add_axes(host) - - host.set_xlim(0, 2) - host.set_ylim(0, 2) - - host.set_xlabel("Distance") - host.set_ylabel("Density") - par1.set_ylabel("Temperature") - - p1, = host.plot([0, 1, 2], [0, 1, 2], label="Density") - p2, = par1.plot([0, 1, 2], [0, 3, 2], label="Temperature") - p3, = par2.plot([0, 1, 2], [50, 30, 15], label="Velocity") - - par1.set_ylim(0, 4) - par2.set_ylim(1, 65) - - host.legend() - - host.axis["left"].label.set_color(p1.get_color()) - par1.axis["right"].label.set_color(p2.get_color()) - par2.axis["right2"].label.set_color(p3.get_color()) - - plt.draw() - plt.show() diff -Nru matplotlib-0.99.3/lib/mpl_examples/axes_grid/inset_locator_demo2.py matplotlib-1.0.1/lib/mpl_examples/axes_grid/inset_locator_demo2.py --- matplotlib-0.99.3/lib/mpl_examples/axes_grid/inset_locator_demo2.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/axes_grid/inset_locator_demo2.py 2010-07-07 01:41:54.000000000 +0000 @@ -1,11 +1,17 @@ import matplotlib.pyplot as plt -from mpl_toolkits.axes_grid.inset_locator import zoomed_inset_axes -from mpl_toolkits.axes_grid.inset_locator import mark_inset +from mpl_toolkits.axes_grid1.inset_locator import zoomed_inset_axes +from mpl_toolkits.axes_grid1.inset_locator import mark_inset import numpy as np -from demo_image import get_demo_image +def get_demo_image(): + from matplotlib.cbook import get_sample_data + import numpy as np + f = get_sample_data("axes_grid/bivariate_normal.npy", asfileobj=False) + z = np.load(f) + # z is a numpy array of 15x15 + return z, (-3,4,-4,3) fig = plt.figure(1, [5,4]) diff -Nru matplotlib-0.99.3/lib/mpl_examples/axes_grid/inset_locator_demo.py matplotlib-1.0.1/lib/mpl_examples/axes_grid/inset_locator_demo.py --- matplotlib-0.99.3/lib/mpl_examples/axes_grid/inset_locator_demo.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/axes_grid/inset_locator_demo.py 2010-07-07 01:41:54.000000000 +0000 @@ -1,7 +1,7 @@ import matplotlib.pyplot as plt -from mpl_toolkits.axes_grid.inset_locator import inset_axes, zoomed_inset_axes -from mpl_toolkits.axes_grid.anchored_artists import AnchoredSizeBar +from mpl_toolkits.axes_grid1.inset_locator import inset_axes, zoomed_inset_axes +from mpl_toolkits.axes_grid1.anchored_artists import AnchoredSizeBar def add_sizebar(ax, size): diff -Nru matplotlib-0.99.3/lib/mpl_examples/axes_grid/parasite_simple2.py matplotlib-1.0.1/lib/mpl_examples/axes_grid/parasite_simple2.py --- matplotlib-0.99.3/lib/mpl_examples/axes_grid/parasite_simple2.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/axes_grid/parasite_simple2.py 2010-07-07 01:41:54.000000000 +0000 @@ -1,6 +1,6 @@ import matplotlib.transforms as mtransforms import matplotlib.pyplot as plt -from mpl_toolkits.axes_grid.parasite_axes import SubplotHost +from mpl_toolkits.axes_grid1.parasite_axes import SubplotHost obs = [["01_S1", 3.88, 0.14, 1970, 63], ["01_S4", 5.6, 0.82, 1622, 150], diff -Nru matplotlib-0.99.3/lib/mpl_examples/axes_grid/parasite_simple.py matplotlib-1.0.1/lib/mpl_examples/axes_grid/parasite_simple.py --- matplotlib-0.99.3/lib/mpl_examples/axes_grid/parasite_simple.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/axes_grid/parasite_simple.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,24 +0,0 @@ -from mpl_toolkits.axes_grid.parasite_axes import SubplotHost -import matplotlib.pyplot as plt - -fig = plt.figure(1) - -host = SubplotHost(fig, 111) -fig.add_subplot(host) - -par = host.twinx() - -host.set_xlabel("Distance") -host.set_ylabel("Density") -par.set_ylabel("Temperature") - -p1, = host.plot([0, 1, 2], [0, 1, 2], label="Density") -p2, = par.plot([0, 1, 2], [0, 3, 2], label="Temperature") - -host.axis["left"].label.set_color(p1.get_color()) -par.axis["right"].label.set_color(p2.get_color()) - -host.legend() - -plt.show() - diff -Nru matplotlib-0.99.3/lib/mpl_examples/axes_grid/scatter_hist.py matplotlib-1.0.1/lib/mpl_examples/axes_grid/scatter_hist.py --- matplotlib-0.99.3/lib/mpl_examples/axes_grid/scatter_hist.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/axes_grid/scatter_hist.py 2010-07-07 01:41:54.000000000 +0000 @@ -8,30 +8,24 @@ fig = plt.figure(1, figsize=(5.5,5.5)) -from mpl_toolkits.axes_grid import make_axes_locatable +from mpl_toolkits.axes_grid1 import make_axes_locatable +# the scatter plot: axScatter = plt.subplot(111) -divider = make_axes_locatable(axScatter) - -# create a new axes with a height of 1.2 inch above the axScatter -axHistx = divider.new_vertical(1.2, pad=0.1, sharex=axScatter) - -# create a new axes with a width of 1.2 inch on the right side of the -# axScatter -axHisty = divider.new_horizontal(1.2, pad=0.1, sharey=axScatter) - -fig.add_axes(axHistx) -fig.add_axes(axHisty) +axScatter.scatter(x, y) +axScatter.set_aspect(1.) +# create new axes on the right and on the top of the current axes +# The first argument of the new_vertical(new_horizontal) method is +# the height (width) of the axes to be created in inches. +divider = make_axes_locatable(axScatter) +axHistx = divider.append_axes("top", 1.2, pad=0.1, sharex=axScatter) +axHisty = divider.append_axes("right", 1.2, pad=0.1, sharey=axScatter) # make some labels invisible plt.setp(axHistx.get_xticklabels() + axHisty.get_yticklabels(), visible=False) -# the scatter plot: -axScatter.scatter(x, y) -axScatter.set_aspect(1.) - # now determine nice limits by hand: binwidth = 0.25 xymax = np.max( [np.max(np.fabs(x)), np.max(np.fabs(y))] ) @@ -57,4 +51,3 @@ plt.draw() plt.show() -#plt.savefig("a.pdf") diff -Nru matplotlib-0.99.3/lib/mpl_examples/axes_grid/simple_anchored_artists.py matplotlib-1.0.1/lib/mpl_examples/axes_grid/simple_anchored_artists.py --- matplotlib-0.99.3/lib/mpl_examples/axes_grid/simple_anchored_artists.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/axes_grid/simple_anchored_artists.py 2010-07-07 01:41:54.000000000 +0000 @@ -2,7 +2,7 @@ def draw_text(ax): - from mpl_toolkits.axes_grid.anchored_artists import AnchoredText + from mpl_toolkits.axes_grid1.anchored_artists import AnchoredText at = AnchoredText("Figure 1a", loc=2, prop=dict(size=8), frameon=True, ) @@ -18,7 +18,7 @@ ax.add_artist(at2) def draw_circle(ax): # circle in the canvas coordinate - from mpl_toolkits.axes_grid.anchored_artists import AnchoredDrawingArea + from mpl_toolkits.axes_grid1.anchored_artists import AnchoredDrawingArea from matplotlib.patches import Circle ada = AnchoredDrawingArea(20, 20, 0, 0, loc=1, pad=0., frameon=False) @@ -27,7 +27,7 @@ ax.add_artist(ada) def draw_ellipse(ax): - from mpl_toolkits.axes_grid.anchored_artists import AnchoredEllipse + from mpl_toolkits.axes_grid1.anchored_artists import AnchoredEllipse # draw an ellipse of width=0.1, height=0.15 in the data coordinate ae = AnchoredEllipse(ax.transData, width=0.1, height=0.15, angle=0., loc=3, pad=0.5, borderpad=0.4, frameon=True) @@ -35,7 +35,7 @@ ax.add_artist(ae) def draw_sizebar(ax): - from mpl_toolkits.axes_grid.anchored_artists import AnchoredSizeBar + from mpl_toolkits.axes_grid1.anchored_artists import AnchoredSizeBar # draw a horizontal bar with length of 0.1 in Data coordinate # (ax.transData) with a label underneath. asb = AnchoredSizeBar(ax.transData, diff -Nru matplotlib-0.99.3/lib/mpl_examples/axes_grid/simple_axes_divider1.py matplotlib-1.0.1/lib/mpl_examples/axes_grid/simple_axes_divider1.py --- matplotlib-0.99.3/lib/mpl_examples/axes_grid/simple_axes_divider1.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/axes_grid/simple_axes_divider1.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,30 +0,0 @@ -from mpl_toolkits.axes_grid import Size, Divider -import matplotlib.pyplot as plt - - -fig1 = plt.figure(1, (6, 6)) - -# fixed size in inch -horiz = [Size.Fixed(1.), Size.Fixed(.5), Size.Fixed(1.5), - Size.Fixed(.5)] -vert = [Size.Fixed(1.5), Size.Fixed(.5), Size.Fixed(1.)] - -rect = (0.1, 0.1, 0.8, 0.8) -# divide the axes rectangle into grid whose size is specified by horiz * vert -divider = Divider(fig1, rect, horiz, vert, aspect=False) - -# the rect parameter will be ignore as we will set axes_locator -ax1 = fig1.add_axes(rect, label="1") -ax2 = fig1.add_axes(rect, label="2") -ax3 = fig1.add_axes(rect, label="3") -ax4 = fig1.add_axes(rect, label="4") - -ax1.set_axes_locator(divider.new_locator(nx=0, ny=0)) -ax2.set_axes_locator(divider.new_locator(nx=0, ny=2)) -ax3.set_axes_locator(divider.new_locator(nx=2, ny=2)) -ax4.set_axes_locator(divider.new_locator(nx=2, nx1=4, ny=0)) - - - -plt.draw() -plt.show() diff -Nru matplotlib-0.99.3/lib/mpl_examples/axes_grid/simple_axes_divider2.py matplotlib-1.0.1/lib/mpl_examples/axes_grid/simple_axes_divider2.py --- matplotlib-0.99.3/lib/mpl_examples/axes_grid/simple_axes_divider2.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/axes_grid/simple_axes_divider2.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,29 +0,0 @@ -import mpl_toolkits.axes_grid.axes_size as Size -from mpl_toolkits.axes_grid import Divider -import matplotlib.pyplot as plt - -fig1 = plt.figure(1, (5.5, 4.)) - -# the rect parameter will be ignore as we will set axes_locator -rect = (0.1, 0.1, 0.8, 0.8) -ax = [fig1.add_axes(rect, label="%d"%i) for i in range(4)] - -horiz = [Size.Scaled(1.5), Size.Fixed(.5), Size.Scaled(1.), - Size.Scaled(.5)] - -vert = [Size.Scaled(1.), Size.Fixed(.5), Size.Scaled(1.5)] - -# divide the axes rectangle into grid whose size is specified by horiz * vert -divider = Divider(fig1, rect, horiz, vert, aspect=False) - -ax[0].set_axes_locator(divider.new_locator(nx=0, ny=0)) -ax[1].set_axes_locator(divider.new_locator(nx=0, ny=2)) -ax[2].set_axes_locator(divider.new_locator(nx=2, ny=2)) -ax[3].set_axes_locator(divider.new_locator(nx=2, nx1=4, ny=0)) - -for ax1 in ax: - plt.setp(ax1.get_xticklabels()+ax1.get_yticklabels(), - visible=False) - -plt.draw() -plt.show() diff -Nru matplotlib-0.99.3/lib/mpl_examples/axes_grid/simple_axes_divider3.py matplotlib-1.0.1/lib/mpl_examples/axes_grid/simple_axes_divider3.py --- matplotlib-0.99.3/lib/mpl_examples/axes_grid/simple_axes_divider3.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/axes_grid/simple_axes_divider3.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,38 +0,0 @@ -import mpl_toolkits.axes_grid.axes_size as Size -from mpl_toolkits.axes_grid import Divider -import matplotlib.pyplot as plt - - -fig1 = plt.figure(1, (5.5, 4)) - -# the rect parameter will be ignore as we will set axes_locator -rect = (0.1, 0.1, 0.8, 0.8) -ax = [fig1.add_axes(rect, label="%d"%i) for i in range(4)] - - -horiz = [Size.AxesX(ax[0]), Size.Fixed(.5), Size.AxesX(ax[1])] -vert = [Size.AxesY(ax[0]), Size.Fixed(.5), Size.AxesY(ax[2])] - -# divide the axes rectangle into grid whose size is specified by horiz * vert -divider = Divider(fig1, rect, horiz, vert, aspect=False) - - -ax[0].set_axes_locator(divider.new_locator(nx=0, ny=0)) -ax[1].set_axes_locator(divider.new_locator(nx=2, ny=0)) -ax[2].set_axes_locator(divider.new_locator(nx=0, ny=2)) -ax[3].set_axes_locator(divider.new_locator(nx=2, ny=2)) - -ax[0].set_xlim(0, 2) -ax[1].set_xlim(0, 1) - -ax[0].set_ylim(0, 1) -ax[2].set_ylim(0, 2) - -divider.set_aspect(1.) - -for ax1 in ax: - plt.setp(ax1.get_xticklabels()+ax1.get_yticklabels(), - visible=False) - -plt.draw() -plt.show() diff -Nru matplotlib-0.99.3/lib/mpl_examples/axes_grid/simple_axesgrid2.py matplotlib-1.0.1/lib/mpl_examples/axes_grid/simple_axesgrid2.py --- matplotlib-0.99.3/lib/mpl_examples/axes_grid/simple_axesgrid2.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/axes_grid/simple_axesgrid2.py 2010-07-07 01:41:54.000000000 +0000 @@ -1,9 +1,16 @@ import matplotlib.pyplot as plt -from mpl_toolkits.axes_grid import AxesGrid -from demo_image import get_demo_image +from mpl_toolkits.axes_grid1 import ImageGrid + +def get_demo_image(): + import numpy as np + from matplotlib.cbook import get_sample_data + f = get_sample_data("axes_grid/bivariate_normal.npy", asfileobj=False) + z = np.load(f) + # z is a numpy array of 15x15 + return z, (-3,4,-4,3) F = plt.figure(1, (5.5, 3.5)) -grid = AxesGrid(F, 111, # similar to subplot(111) +grid = ImageGrid(F, 111, # similar to subplot(111) nrows_ncols = (1, 3), axes_pad = 0.1, add_all=True, diff -Nru matplotlib-0.99.3/lib/mpl_examples/axes_grid/simple_axesgrid.py matplotlib-1.0.1/lib/mpl_examples/axes_grid/simple_axesgrid.py --- matplotlib-0.99.3/lib/mpl_examples/axes_grid/simple_axesgrid.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/axes_grid/simple_axesgrid.py 2010-07-07 01:41:54.000000000 +0000 @@ -1,12 +1,12 @@ import matplotlib.pyplot as plt -from mpl_toolkits.axes_grid import AxesGrid +from mpl_toolkits.axes_grid1 import ImageGrid import numpy as np im = np.arange(100) im.shape = 10, 10 fig = plt.figure(1, (4., 4.)) -grid = AxesGrid(fig, 111, # similar to subplot(111) +grid = ImageGrid(fig, 111, # similar to subplot(111) nrows_ncols = (2, 2), # creates 2x2 grid of axes axes_pad=0.1, # pad between axes in inch. ) diff -Nru matplotlib-0.99.3/lib/mpl_examples/axes_grid/simple_axisline2.py matplotlib-1.0.1/lib/mpl_examples/axes_grid/simple_axisline2.py --- matplotlib-0.99.3/lib/mpl_examples/axes_grid/simple_axisline2.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/axes_grid/simple_axisline2.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,24 +0,0 @@ -import matplotlib.pyplot as plt -from mpl_toolkits.axes_grid.axislines import SubplotZero -import numpy as np - -fig = plt.figure(1, (4,3)) - -# a subplot with two additiona axis, "xzero" and "yzero". "xzero" is -# y=0 line, and "yzero" is x=0 line. -ax = SubplotZero(fig, 1, 1, 1) -fig.add_subplot(ax) - -# make xzero axis (horizontal axis line through y=0) visible. -ax.axis["xzero"].set_visible(True) -ax.axis["xzero"].label.set_text("Axis Zero") - -# make other axis (bottom, top, right) invisible. -for n in ["bottom", "top", "right"]: - ax.axis[n].set_visible(False) - -xx = np.arange(0, 2*np.pi, 0.01) -ax.plot(xx, np.sin(xx)) - -plt.show() - diff -Nru matplotlib-0.99.3/lib/mpl_examples/axes_grid/simple_axisline3.py matplotlib-1.0.1/lib/mpl_examples/axes_grid/simple_axisline3.py --- matplotlib-0.99.3/lib/mpl_examples/axes_grid/simple_axisline3.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/axes_grid/simple_axisline3.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,13 +0,0 @@ -import matplotlib.pyplot as plt -from mpl_toolkits.axes_grid.axislines import Subplot - -fig = plt.figure(1, (3,3)) - -ax = Subplot(fig, 111) -fig.add_subplot(ax) - -ax.axis["right"].set_visible(False) -ax.axis["top"].set_visible(False) - -plt.show() - diff -Nru matplotlib-0.99.3/lib/mpl_examples/axes_grid/simple_axisline4.py matplotlib-1.0.1/lib/mpl_examples/axes_grid/simple_axisline4.py --- matplotlib-0.99.3/lib/mpl_examples/axes_grid/simple_axisline4.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/axes_grid/simple_axisline4.py 2010-07-07 01:41:54.000000000 +0000 @@ -1,18 +1,15 @@ import matplotlib.pyplot as plt -from mpl_toolkits.axes_grid.parasite_axes import SubplotHost +from mpl_toolkits.axes_grid1 import host_subplot +import mpl_toolkits.axisartist as AA import numpy as np -fig = plt.figure(1, (4,3)) - -ax = SubplotHost(fig, 111) -fig.add_subplot(ax) - +ax = host_subplot(111, axes_class=AA.Axes) xx = np.arange(0, 2*np.pi, 0.01) ax.plot(xx, np.sin(xx)) ax2 = ax.twin() # ax2 is responsible for "top" axis and "right" axis ax2.set_xticks([0., .5*np.pi, np.pi, 1.5*np.pi, 2*np.pi]) -ax2.set_xticklabels(["0", r"$\frac{1}{2}\pi$", +ax2.set_xticklabels(["$0$", r"$\frac{1}{2}\pi$", r"$\pi$", r"$\frac{3}{2}\pi$", r"$2\pi$"]) ax2.axis["right"].major_ticklabels.set_visible(False) diff -Nru matplotlib-0.99.3/lib/mpl_examples/axes_grid/simple_axisline.py matplotlib-1.0.1/lib/mpl_examples/axes_grid/simple_axisline.py --- matplotlib-0.99.3/lib/mpl_examples/axes_grid/simple_axisline.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/axes_grid/simple_axisline.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,39 +0,0 @@ -import matplotlib.pyplot as plt - -from mpl_toolkits.axes_grid.axislines import SubplotZero - -if 1: - - fig = plt.figure(1) - fig.subplots_adjust(right=0.85) - ax = SubplotZero(fig, 1, 1, 1) - fig.add_subplot(ax) - - # make right and top axis invisible - ax.axis["right"].set_visible(False) - ax.axis["top"].set_visible(False) - - # make xzero axis (horizontal axis line through y=0) visible. - ax.axis["xzero"].set_visible(True) - ax.axis["xzero"].label.set_text("Axis Zero") - - ax.set_ylim(-2, 4) - ax.set_xlabel("Label X") - ax.set_ylabel("Label Y") - # or - #ax.axis["bottom"].label.set_text("Label X") - #ax.axis["left"].label.set_text("Label Y") - - # make new (right-side) yaxis, but wth some offset - offset = (20, 0) - new_axisline = ax.get_grid_helper().new_fixed_axis - - ax.axis["right2"] = new_axisline(loc="right", - offset=offset, - axes=ax) - ax.axis["right2"].label.set_text("Label Y2") - - ax.plot([-2,3,2]) - plt.draw() - plt.show() - diff -Nru matplotlib-0.99.3/lib/mpl_examples/axes_grid/simple_rgb.py matplotlib-1.0.1/lib/mpl_examples/axes_grid/simple_rgb.py --- matplotlib-0.99.3/lib/mpl_examples/axes_grid/simple_rgb.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/axes_grid/simple_rgb.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -import matplotlib.pyplot as plt - -from demo_image import get_demo_image -from mpl_toolkits.axes_grid.axes_rgb import RGBAxes - -def get_rgb(): - Z, extent = get_demo_image() - - Z[Z<0] = 0. - Z = Z/Z.max() - - R = Z[:13,:13] - G = Z[2:,2:] - B = Z[:13,2:] - - return R, G, B - - -fig = plt.figure(1) -ax = RGBAxes(fig, [0.1, 0.1, 0.8, 0.8]) - -r, g, b = get_rgb() -kwargs = dict(origin="lower", interpolation="nearest") -ax.imshow_rgb(r, g, b, **kwargs) - -ax.RGB.set_xlim(0., 9.5) -ax.RGB.set_ylim(0.9, 10.6) - - -plt.draw() -plt.show() diff -Nru matplotlib-0.99.3/lib/mpl_examples/data/aapl.csv matplotlib-1.0.1/lib/mpl_examples/data/aapl.csv --- matplotlib-0.99.3/lib/mpl_examples/data/aapl.csv 2009-07-31 15:14:50.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/data/aapl.csv 1970-01-01 00:00:00.000000000 +0000 @@ -1,6082 +0,0 @@ -Date,Open,High,Low,Close,Volume,Adj Close -2008-10-14,116.26,116.40,103.14,104.08,70749800,104.08 -2008-10-13,104.55,110.53,101.02,110.26,54967000,110.26 -2008-10-10,85.70,100.00,85.00,96.80,79260700,96.80 -2008-10-09,93.35,95.80,86.60,88.74,57763700,88.74 -2008-10-08,85.91,96.33,85.68,89.79,78847900,89.79 -2008-10-07,100.48,101.50,88.95,89.16,67099000,89.16 -2008-10-06,91.96,98.78,87.54,98.14,75264900,98.14 -2008-10-03,104.00,106.50,94.65,97.07,81942800,97.07 -2008-10-02,108.01,108.79,100.00,100.10,57477300,100.10 -2008-10-01,111.92,112.36,107.39,109.12,46303000,109.12 -2008-09-30,108.25,115.00,106.30,113.66,58095800,113.66 -2008-09-29,119.62,119.68,100.59,105.26,93581400,105.26 -2008-09-26,124.91,129.80,123.00,128.24,40208700,128.24 -2008-09-25,129.80,134.79,128.52,131.93,35865600,131.93 -2008-09-24,127.27,130.95,125.15,128.71,37393400,128.71 -2008-09-23,131.85,135.80,126.66,126.84,45727300,126.84 -2008-09-22,139.94,140.25,130.66,131.05,30577300,131.05 -2008-09-19,142.60,144.20,136.31,140.91,51102700,140.91 -2008-09-18,130.57,135.43,120.68,134.09,59819300,134.09 -2008-09-17,138.49,138.51,127.83,127.83,42847200,127.83 -2008-09-16,133.86,142.50,132.15,139.88,42804800,139.88 -2008-09-15,142.03,147.69,140.36,140.36,32852600,140.36 -2008-09-12,150.91,150.91,146.50,148.94,28322400,148.94 -2008-09-11,148.18,152.99,146.00,152.65,34666800,152.65 -2008-09-10,152.32,154.99,148.80,151.61,34755100,151.61 -2008-09-09,156.86,159.96,149.79,151.68,44442500,151.68 -2008-09-08,164.57,164.89,151.46,157.92,37356400,157.92 -2008-09-05,158.59,162.40,157.65,160.18,28083800,160.18 -2008-09-04,165.86,167.91,160.81,161.22,26549500,161.22 -2008-09-03,166.84,168.68,164.00,166.96,26244100,166.96 -2008-09-02,172.40,173.50,165.00,166.19,27884400,166.19 -2008-08-29,172.96,173.50,169.04,169.53,21403200,169.53 -2008-08-28,175.28,176.25,172.75,173.74,15394500,173.74 -2008-08-27,173.31,175.76,172.19,174.67,17045900,174.67 -2008-08-26,172.76,174.88,172.61,173.64,15912500,173.64 -2008-08-25,176.15,176.23,171.66,172.55,17300900,172.55 -2008-08-22,175.82,177.50,175.57,176.79,15700400,176.79 -2008-08-21,174.47,175.45,171.89,174.29,19276600,174.29 -2008-08-20,174.77,176.94,173.61,175.84,18105400,175.84 -2008-08-19,174.54,177.07,171.81,173.53,21997000,173.53 -2008-08-18,175.57,177.81,173.82,175.39,19691200,175.39 -2008-08-15,179.04,179.75,175.05,175.74,25294700,175.74 -2008-08-14,178.33,180.45,177.84,179.32,25393200,179.32 -2008-08-13,177.98,180.00,175.90,179.30,30083800,179.30 -2008-08-12,173.52,179.29,173.51,176.73,29867100,176.73 -2008-08-11,170.07,176.50,169.67,173.56,31821100,173.56 -2008-08-08,163.86,169.65,163.75,169.55,25499900,169.55 -2008-08-07,162.71,166.15,161.50,163.57,24013300,163.57 -2008-08-06,159.97,167.40,158.00,164.19,28264600,164.19 -2008-08-05,155.42,160.80,154.82,160.64,24584700,160.64 -2008-08-04,156.60,157.90,152.91,153.23,21161700,153.23 -2008-08-01,159.90,159.99,155.75,156.66,19451400,156.66 -2008-07-31,157.54,162.20,156.98,158.95,22767800,158.95 -2008-07-30,157.78,160.49,156.08,159.88,25899400,159.88 -2008-07-29,155.41,159.45,153.65,157.08,24431100,157.08 -2008-07-28,162.34,162.47,154.02,154.40,27882600,154.40 -2008-07-25,160.40,163.00,158.65,162.12,22629900,162.12 -2008-07-24,164.32,165.26,158.45,159.03,29986400,159.03 -2008-07-23,164.99,168.37,161.56,166.26,37920300,166.26 -2008-07-22,149.00,162.76,146.53,162.02,67128300,162.02 -2008-07-21,166.90,167.50,161.12,166.29,48588200,166.29 -2008-07-18,168.52,169.65,165.00,165.15,31014800,165.15 -2008-07-17,174.10,174.98,171.39,171.81,27054500,171.81 -2008-07-16,170.20,172.93,168.60,172.81,26706800,172.81 -2008-07-15,172.48,173.74,166.39,169.64,37144400,169.64 -2008-07-14,179.24,179.30,173.08,173.88,31644800,173.88 -2008-07-11,175.47,177.11,171.00,172.58,33214700,172.58 -2008-07-10,174.92,177.34,171.37,176.63,30024600,176.63 -2008-07-09,180.20,180.91,174.14,174.25,31992000,174.25 -2008-07-08,175.40,179.70,172.74,179.55,31726800,179.55 -2008-07-07,173.16,177.13,171.90,175.16,29299700,175.16 -2008-07-03,169.59,172.17,165.75,170.12,18691500,170.12 -2008-07-02,175.20,177.45,168.18,168.18,29911400,168.18 -2008-07-01,164.23,174.72,164.00,174.68,39688600,174.68 -2008-06-30,170.19,172.00,166.62,167.44,24435600,167.44 -2008-06-27,166.51,170.57,164.15,170.09,37223200,170.09 -2008-06-26,174.07,174.84,168.01,168.26,31057500,168.26 -2008-06-25,174.61,178.83,173.88,177.39,23016100,177.39 -2008-06-24,172.37,175.78,171.63,173.25,22212400,173.25 -2008-06-23,174.74,175.88,171.56,173.16,23063600,173.16 -2008-06-20,179.35,181.00,175.00,175.27,31727400,175.27 -2008-06-19,178.55,182.34,176.80,180.90,28283900,180.90 -2008-06-18,181.12,182.20,177.35,178.75,28981000,178.75 -2008-06-17,178.10,181.99,177.41,181.43,32130600,181.43 -2008-06-16,171.30,177.90,169.07,176.84,37561800,176.84 -2008-06-13,171.64,174.16,165.31,172.37,48069900,172.37 -2008-06-12,181.49,182.60,171.20,173.26,46726200,173.26 -2008-06-11,184.34,186.00,179.59,180.81,34341100,180.81 -2008-06-10,180.51,186.78,179.02,185.64,40728600,185.64 -2008-06-09,184.79,184.94,175.75,181.61,67442600,181.61 -2008-06-06,188.00,189.95,185.55,185.64,34438700,185.64 -2008-06-05,186.34,189.84,185.70,189.43,26980200,189.43 -2008-06-04,184.02,187.09,183.23,185.19,25963700,185.19 -2008-06-03,186.86,188.20,182.34,185.37,26804300,185.37 -2008-06-02,188.60,189.65,184.53,186.10,24280000,186.10 -2008-05-30,187.45,189.54,187.38,188.75,21792300,188.75 -2008-05-29,186.76,188.20,185.50,186.69,23113800,186.69 -2008-05-28,187.41,187.95,183.72,187.01,26570700,187.01 -2008-05-27,182.75,186.43,181.84,186.43,28210900,186.43 -2008-05-23,180.77,181.99,177.80,181.17,32389900,181.17 -2008-05-22,179.26,181.33,172.00,177.05,43097700,177.05 -2008-05-21,185.67,187.95,176.25,178.19,41344900,178.19 -2008-05-20,181.82,186.16,180.12,185.90,34637500,185.90 -2008-05-19,187.86,188.69,181.30,183.60,33779300,183.60 -2008-05-16,190.11,190.30,187.00,187.62,27348900,187.62 -2008-05-15,186.81,189.90,184.20,189.73,31186000,189.73 -2008-05-14,191.23,192.24,185.57,186.26,32743700,186.26 -2008-05-13,188.61,191.45,187.86,189.96,29401300,189.96 -2008-05-12,185.21,188.87,182.85,188.16,29234400,188.16 -2008-05-09,183.16,184.25,181.37,183.45,24038300,183.45 -2008-05-08,183.77,186.50,183.07,185.06,32110200,185.06 -2008-05-07,186.05,188.20,180.54,182.59,41326200,182.59 -2008-05-06,184.66,187.12,182.18,186.66,32816800,186.66 -2008-05-05,181.92,185.31,181.05,184.73,30519900,184.73 -2008-05-02,180.19,181.92,178.55,180.94,35931500,180.94 -2008-05-01,174.96,180.00,174.86,180.00,32270600,180.00 -2008-04-30,176.19,180.00,172.92,173.95,40697300,173.95 -2008-04-29,171.11,175.66,170.25,175.05,32981300,175.05 -2008-04-28,169.75,173.75,169.13,172.24,28114800,172.24 -2008-04-25,170.70,171.10,166.42,169.73,35445500,169.73 -2008-04-24,165.34,169.98,159.19,168.94,60573800,168.94 -2008-04-23,164.05,164.84,161.08,162.89,53721100,162.89 -2008-04-22,167.40,168.00,158.09,160.20,51413300,160.20 -2008-04-21,162.21,168.50,161.76,168.16,37112600,168.16 -2008-04-18,159.12,162.26,158.38,161.04,36670200,161.04 -2008-04-17,154.17,156.00,153.35,154.49,25152400,154.49 -2008-04-16,151.72,154.10,150.62,153.70,28420500,153.70 -2008-04-15,149.40,149.72,145.72,148.38,24929900,148.38 -2008-04-14,146.77,149.25,144.54,147.78,30181700,147.78 -2008-04-11,152.72,153.30,146.40,147.14,43217000,147.14 -2008-04-10,151.13,155.42,150.60,154.55,34134400,154.55 -2008-04-09,153.31,153.89,150.46,151.44,31192800,151.44 -2008-04-08,153.55,156.45,152.32,152.84,36224800,152.84 -2008-04-07,156.13,159.69,155.11,155.89,41368800,155.89 -2008-04-04,152.19,154.71,150.75,153.08,30514900,153.08 -2008-04-03,147.06,153.63,147.00,151.61,37556000,151.61 -2008-04-02,148.78,151.20,145.85,147.49,37320300,147.49 -2008-04-01,146.30,149.66,143.61,149.53,36877400,149.53 -2008-03-31,143.27,145.71,142.52,143.50,27430900,143.50 -2008-03-28,141.80,144.65,141.60,143.01,25521800,143.01 -2008-03-27,144.95,145.31,139.99,140.25,35708200,140.25 -2008-03-26,140.87,145.74,140.64,145.06,42217300,145.06 -2008-03-25,139.96,143.10,137.33,140.98,37585400,140.98 -2008-03-24,134.01,140.85,133.64,139.53,38104300,139.53 -2008-03-20,131.12,133.29,129.18,133.27,32456700,133.27 -2008-03-19,133.12,134.29,129.67,129.67,36090600,129.67 -2008-03-18,129.18,133.00,128.67,132.82,43040000,132.82 -2008-03-17,122.55,128.59,122.55,126.73,38307100,126.73 -2008-03-14,129.88,130.30,124.20,126.61,41308600,126.61 -2008-03-13,124.10,129.50,123.00,127.94,45075100,127.94 -2008-03-12,127.04,128.68,125.17,126.03,37843900,126.03 -2008-03-11,124.10,127.48,122.00,127.35,41569400,127.35 -2008-03-10,121.98,123.46,119.37,119.69,35699600,119.69 -2008-03-07,120.41,122.98,119.05,122.25,43945100,122.25 -2008-03-06,124.61,127.50,120.81,120.93,52632100,120.93 -2008-03-05,123.58,125.14,122.25,124.49,43637000,124.49 -2008-03-04,121.99,124.88,120.40,124.62,63763700,124.62 -2008-03-03,124.44,125.98,118.00,121.73,56894400,121.73 -2008-02-29,129.29,130.21,124.80,125.02,44838600,125.02 -2008-02-28,127.20,132.20,125.77,129.91,57794800,129.91 -2008-02-27,118.23,123.05,118.09,122.96,52683500,122.96 -2008-02-26,117.64,121.09,115.44,119.15,53746000,119.15 -2008-02-25,118.59,120.17,116.66,119.74,44884800,119.74 -2008-02-22,122.48,122.51,115.87,119.46,54638500,119.46 -2008-02-21,126.05,126.47,120.86,121.54,33504100,121.54 -2008-02-20,122.20,124.60,121.68,123.82,34551400,123.82 -2008-02-19,125.99,126.75,121.44,122.18,35894500,122.18 -2008-02-15,126.27,127.08,124.06,124.63,32189300,124.63 -2008-02-14,129.40,130.80,127.01,127.46,34074900,127.46 -2008-02-13,126.68,129.78,125.63,129.40,34590500,129.40 -2008-02-12,130.70,131.00,123.62,124.86,43785000,124.86 -2008-02-11,128.01,129.98,127.20,129.45,42908300,129.45 -2008-02-08,122.08,125.70,121.60,125.48,48427600,125.48 -2008-02-07,119.97,124.78,117.27,121.24,74404700,121.24 -2008-02-06,130.83,131.92,121.77,122.00,56188300,122.00 -2008-02-05,130.43,134.00,128.90,129.36,40751500,129.36 -2008-02-04,134.21,135.90,131.42,131.65,32115500,131.65 -2008-02-01,136.24,136.59,132.18,133.75,36098000,133.75 -2008-01-31,129.45,136.65,129.40,135.36,48059800,135.36 -2008-01-30,131.37,135.45,130.00,132.18,44394700,132.18 -2008-01-29,131.15,132.79,129.05,131.54,39285100,131.54 -2008-01-28,128.16,133.20,126.45,130.01,52673000,130.01 -2008-01-25,138.99,139.09,129.61,130.01,55526400,130.01 -2008-01-24,139.99,140.70,132.01,135.60,71638100,135.60 -2008-01-23,136.19,140.00,126.14,139.07,120463200,139.07 -2008-01-22,148.06,159.98,146.00,155.64,86955500,155.64 -2008-01-18,161.71,165.75,159.61,161.36,61583700,161.36 -2008-01-17,161.51,165.36,158.42,160.89,62780700,160.89 -2008-01-16,165.23,169.01,156.70,159.64,79065900,159.64 -2008-01-15,177.72,179.22,164.66,169.04,83688500,169.04 -2008-01-14,177.52,179.42,175.17,178.78,39301800,178.78 -2008-01-11,176.00,177.85,170.00,172.69,44010200,172.69 -2008-01-10,177.58,181.00,175.41,178.02,52963400,178.02 -2008-01-09,171.30,179.50,168.30,179.40,64781500,179.40 -2008-01-08,180.14,182.46,170.80,171.25,54422000,171.25 -2008-01-07,181.25,183.60,170.23,177.64,74006900,177.64 -2008-01-04,191.45,193.00,178.89,180.05,51994000,180.05 -2008-01-03,195.41,197.39,192.69,194.93,30073800,194.93 -2008-01-02,199.27,200.26,192.55,194.84,38542100,194.84 -2007-12-31,199.50,200.50,197.75,198.08,19261900,198.08 -2007-12-28,200.59,201.56,196.88,199.83,24987400,199.83 -2007-12-27,198.95,202.96,197.80,198.57,28411700,198.57 -2007-12-26,199.01,200.96,196.82,198.95,25133300,198.95 -2007-12-24,195.03,199.33,194.79,198.80,17150100,198.80 -2007-12-21,190.12,193.91,189.89,193.91,35498600,193.91 -2007-12-20,185.43,187.83,183.33,187.21,27644900,187.21 -2007-12-19,182.98,184.64,180.90,183.12,29552800,183.12 -2007-12-18,186.52,187.33,178.60,182.98,43664400,182.98 -2007-12-17,190.72,192.65,182.98,184.40,36596200,184.40 -2007-12-14,190.37,193.20,189.54,190.39,24082600,190.39 -2007-12-13,190.19,192.12,187.82,191.83,30879200,191.83 -2007-12-12,193.44,194.48,185.76,190.86,43773600,190.86 -2007-12-11,194.75,196.83,187.39,188.54,39675900,188.54 -2007-12-10,193.59,195.66,192.69,194.21,25799200,194.21 -2007-12-07,190.54,194.99,188.04,194.30,38073800,194.30 -2007-12-06,186.19,190.10,186.12,189.95,32136100,189.95 -2007-12-05,182.89,186.00,182.41,185.50,31871500,185.50 -2007-12-04,177.15,180.90,176.99,179.81,27635700,179.81 -2007-12-03,181.86,184.14,177.70,178.86,34338200,178.86 -2007-11-30,187.34,187.70,179.70,182.22,42421500,182.22 -2007-11-29,179.43,185.17,179.15,184.29,37533100,184.29 -2007-11-28,176.82,180.60,175.35,180.22,41104000,180.22 -2007-11-27,175.22,175.79,170.01,174.81,47036800,174.81 -2007-11-26,173.59,177.27,172.35,172.54,46634100,172.54 -2007-11-23,172.00,172.05,169.75,171.54,16634200,171.54 -2007-11-21,165.84,172.35,164.67,168.46,43493200,168.46 -2007-11-20,165.67,171.79,163.53,168.85,55130100,168.85 -2007-11-19,166.10,168.20,162.10,163.95,41196800,163.95 -2007-11-16,165.30,167.02,159.33,166.39,49391300,166.39 -2007-11-15,166.39,169.59,160.30,164.30,53095600,164.30 -2007-11-14,177.16,177.57,163.74,166.11,51695400,166.11 -2007-11-13,160.85,170.98,153.76,169.96,62034100,169.96 -2007-11-12,165.28,167.70,150.63,153.76,63057700,153.76 -2007-11-09,171.15,175.12,165.21,165.37,54458700,165.37 -2007-11-08,186.67,186.90,167.77,175.47,67458500,175.47 -2007-11-07,190.61,192.68,186.13,186.30,35473400,186.30 -2007-11-06,187.05,192.00,185.27,191.79,34097400,191.79 -2007-11-05,185.29,188.96,184.24,186.18,28720600,186.18 -2007-11-02,189.21,189.44,183.49,187.87,35789800,187.87 -2007-11-01,188.60,190.10,180.00,187.44,28751300,187.44 -2007-10-31,187.63,190.12,184.95,189.95,29761100,189.95 -2007-10-30,186.18,189.37,184.73,187.00,33550500,187.00 -2007-10-29,185.45,186.59,184.70,185.09,19305500,185.09 -2007-10-26,185.29,185.37,182.88,184.70,25219800,184.70 -2007-10-25,184.87,185.90,181.66,182.78,34771500,182.78 -2007-10-24,185.81,187.21,179.24,185.93,46017200,185.93 -2007-10-23,188.56,188.60,182.76,186.16,64113000,186.16 -2007-10-22,170.35,174.90,169.96,174.36,58910700,174.36 -2007-10-19,174.24,174.63,170.00,170.42,46135000,170.42 -2007-10-18,171.50,174.19,171.05,173.50,29417000,173.50 -2007-10-17,172.69,173.04,169.18,172.75,40271900,172.75 -2007-10-16,165.54,170.18,165.15,169.58,38136800,169.58 -2007-10-15,167.98,169.57,163.50,166.98,38497500,166.98 -2007-10-12,163.01,167.28,161.80,167.25,35292000,167.25 -2007-10-11,169.49,171.88,153.21,162.23,58714000,162.23 -2007-10-10,167.55,167.88,165.60,166.79,23842500,166.79 -2007-10-09,170.20,171.11,166.68,167.86,39438800,167.86 -2007-10-08,163.49,167.91,162.97,167.91,29854600,167.91 -2007-10-05,158.37,161.58,157.70,161.45,33695400,161.45 -2007-10-04,158.00,158.08,153.50,156.24,23462800,156.24 -2007-10-03,157.78,159.18,157.01,157.92,24732800,157.92 -2007-10-02,156.55,158.59,155.89,158.45,28288200,158.45 -2007-10-01,154.63,157.41,152.93,156.34,29895300,156.34 -2007-09-28,153.44,154.60,152.75,153.47,21967900,153.47 -2007-09-27,153.77,154.52,152.32,154.50,23507100,154.50 -2007-09-26,154.47,155.00,151.25,152.77,34831000,152.77 -2007-09-25,146.84,153.22,146.82,153.18,42591100,153.18 -2007-09-24,146.73,149.85,146.65,148.28,37577200,148.28 -2007-09-21,141.14,144.65,140.31,144.15,40674300,144.15 -2007-09-20,140.15,141.79,139.32,140.31,24708600,140.31 -2007-09-19,143.02,143.16,139.40,140.77,36674300,140.77 -2007-09-18,139.06,142.85,137.83,140.92,38003200,140.92 -2007-09-17,138.99,140.59,137.60,138.41,28334700,138.41 -2007-09-14,136.57,138.98,136.20,138.81,21690000,138.81 -2007-09-13,138.83,139.00,136.65,137.20,23434400,137.20 -2007-09-12,135.99,139.40,135.75,136.85,36527500,136.85 -2007-09-11,137.90,138.30,133.75,135.49,34710200,135.49 -2007-09-10,136.99,138.04,133.95,136.71,53137100,136.71 -2007-09-07,132.01,132.30,130.00,131.77,51092000,131.77 -2007-09-06,135.56,137.57,132.71,135.01,67902200,135.01 -2007-09-05,144.97,145.84,136.10,136.76,83150800,136.76 -2007-09-04,139.94,145.73,139.84,144.16,47030100,144.16 -2007-08-31,139.49,139.65,137.41,138.48,31317400,138.48 -2007-08-30,132.67,138.25,132.30,136.25,51270800,136.25 -2007-08-29,129.88,134.18,129.54,134.08,41673600,134.08 -2007-08-28,130.99,132.41,126.63,126.82,42120200,126.82 -2007-08-27,133.39,134.66,132.10,132.25,25265700,132.25 -2007-08-24,130.53,135.37,129.81,135.30,32565500,135.30 -2007-08-23,133.09,133.34,129.76,131.07,30958500,131.07 -2007-08-22,131.22,132.75,130.33,132.51,37920200,132.51 -2007-08-21,122.21,128.96,121.00,127.57,46537400,127.57 -2007-08-20,123.96,124.50,120.50,122.22,28689900,122.22 -2007-08-17,122.01,123.50,119.82,122.06,42680800,122.06 -2007-08-16,117.01,118.50,111.62,117.05,66667500,117.05 -2007-08-15,122.74,124.86,119.65,119.90,35459000,119.90 -2007-08-14,128.29,128.30,123.71,124.03,26393100,124.03 -2007-08-13,128.32,129.35,126.50,127.79,26889700,127.79 -2007-08-10,123.12,127.75,120.30,125.00,50383900,125.00 -2007-08-09,131.11,133.00,125.09,126.39,40192700,126.39 -2007-08-08,136.76,136.86,132.00,134.01,28860600,134.01 -2007-08-07,134.94,137.24,132.63,135.03,33926300,135.03 -2007-08-06,132.90,135.27,128.30,135.25,33041800,135.25 -2007-08-03,135.26,135.95,131.50,131.85,24256700,131.85 -2007-08-02,136.65,136.96,134.15,136.49,30451600,136.49 -2007-08-01,133.64,135.38,127.77,135.00,62505600,135.00 -2007-07-31,142.97,143.48,131.52,131.76,62942600,131.76 -2007-07-30,144.33,145.45,139.57,141.43,39535300,141.43 -2007-07-27,146.19,148.92,143.78,143.85,41467800,143.85 -2007-07-26,145.91,148.50,136.96,146.00,78093900,146.00 -2007-07-25,137.35,138.36,135.00,137.26,53435100,137.26 -2007-07-24,138.88,141.00,134.15,134.89,64117600,134.89 -2007-07-23,143.31,145.22,140.93,143.70,37017500,143.70 -2007-07-20,141.65,144.18,140.00,143.75,41706200,143.75 -2007-07-19,140.30,140.81,139.65,140.00,26174700,140.00 -2007-07-18,138.19,138.44,136.04,138.12,27030600,138.12 -2007-07-17,138.30,139.60,137.50,138.91,25355700,138.91 -2007-07-16,138.39,139.98,137.50,138.10,33432600,138.10 -2007-07-13,135.03,137.85,134.52,137.73,32414500,137.73 -2007-07-12,133.85,134.24,132.39,134.07,25164600,134.07 -2007-07-11,132.07,133.70,131.31,132.39,29349000,132.39 -2007-07-10,128.88,134.50,128.81,132.35,44821700,132.35 -2007-07-09,132.38,132.90,129.18,130.33,35565000,130.33 -2007-07-06,133.13,133.34,130.40,132.30,31239100,132.30 -2007-07-05,128.80,132.97,128.69,132.75,51894700,132.75 -2007-07-03,122.00,127.40,121.50,127.17,41517200,127.17 -2007-07-02,121.05,122.09,119.30,121.26,35530800,121.26 -2007-06-29,121.97,124.00,121.09,122.04,40637200,122.04 -2007-06-28,122.36,122.49,120.00,120.56,29933700,120.56 -2007-06-27,120.61,122.04,119.26,121.89,34810600,121.89 -2007-06-26,123.98,124.00,118.72,119.65,48035900,119.65 -2007-06-25,124.19,125.09,121.06,122.34,34478700,122.34 -2007-06-22,123.85,124.45,122.38,123.00,22567000,123.00 -2007-06-21,121.70,124.29,120.72,123.90,30965900,123.90 -2007-06-20,123.87,124.66,121.50,121.55,32054000,121.55 -2007-06-19,124.69,125.01,122.91,123.66,33679500,123.66 -2007-06-18,123.28,125.18,122.54,125.09,32521600,125.09 -2007-06-15,120.62,120.67,119.86,120.50,28972100,120.50 -2007-06-14,117.20,119.45,116.42,118.75,34759500,118.75 -2007-06-13,121.15,121.19,115.40,117.50,61476900,117.50 -2007-06-12,119.35,121.71,118.31,120.38,50948800,120.38 -2007-06-11,126.00,126.15,119.54,120.19,66937800,120.19 -2007-06-08,125.82,125.83,122.29,124.49,44345800,124.49 -2007-06-07,124.99,127.61,123.19,124.07,68395700,124.07 -2007-06-06,122.30,124.05,121.95,123.64,39722900,123.64 -2007-06-05,121.41,122.69,120.50,122.67,32885200,122.67 -2007-06-04,118.63,121.73,117.90,121.33,31666900,121.33 -2007-06-01,121.10,121.19,118.29,118.40,31616500,118.40 -2007-05-31,120.07,122.17,119.54,121.19,46323800,121.19 -2007-05-30,114.30,118.88,113.53,118.77,52801600,118.77 -2007-05-29,114.45,114.86,112.69,114.35,23060500,114.35 -2007-05-25,112.00,113.78,111.50,113.62,22605700,113.62 -2007-05-24,112.81,114.46,110.37,110.69,31691500,110.69 -2007-05-23,114.02,115.00,112.59,112.89,32549100,112.89 -2007-05-22,112.49,113.75,112.01,113.54,20443200,113.54 -2007-05-21,110.31,112.45,110.05,111.98,22853300,111.98 -2007-05-18,110.23,110.64,109.77,110.02,22190900,110.02 -2007-05-17,107.15,109.87,107.15,109.44,26260400,109.44 -2007-05-16,108.53,108.83,103.42,107.34,40241700,107.34 -2007-05-15,109.57,110.20,106.48,107.52,34089800,107.52 -2007-05-14,109.62,110.00,108.25,109.36,23283800,109.36 -2007-05-11,107.74,109.13,106.78,108.74,23346300,108.74 -2007-05-10,106.63,108.84,105.92,107.34,42759200,107.34 -2007-05-09,104.91,106.96,104.89,106.88,25634200,106.88 -2007-05-08,103.47,105.15,103.42,105.06,27999900,105.06 -2007-05-07,101.08,104.35,101.01,103.92,30769900,103.92 -2007-05-04,100.80,101.60,100.50,100.81,13642400,100.81 -2007-05-03,100.73,101.45,100.01,100.40,20574200,100.40 -2007-05-02,99.65,100.54,99.47,100.39,18040900,100.39 -2007-05-01,99.59,100.35,98.55,99.47,19018700,99.47 -2007-04-30,100.09,101.00,99.67,99.80,22018200,99.80 -2007-04-27,98.18,99.95,97.69,99.92,24978700,99.92 -2007-04-26,101.58,102.50,98.30,98.84,62063500,98.84 -2007-04-25,94.23,95.40,93.80,95.35,42398000,95.35 -2007-04-24,93.96,96.39,91.30,93.24,37687600,93.24 -2007-04-23,91.59,93.80,91.42,93.51,27867500,93.51 -2007-04-20,90.89,91.18,90.55,90.97,18670700,90.97 -2007-04-19,90.19,91.25,89.83,90.27,15211200,90.27 -2007-04-18,90.16,90.85,89.60,90.40,16573000,90.40 -2007-04-17,92.00,92.30,89.70,90.35,26854300,90.35 -2007-04-16,90.57,91.50,90.25,91.43,21751200,91.43 -2007-04-13,90.90,91.40,90.06,90.24,25712200,90.24 -2007-04-12,92.04,92.31,90.72,92.19,23452700,92.19 -2007-04-11,93.90,93.95,92.33,92.59,19607800,92.59 -2007-04-10,93.67,94.26,93.41,94.25,12588100,94.25 -2007-04-09,95.21,95.30,93.04,93.65,14762200,93.65 -2007-04-05,94.12,94.68,93.52,94.68,12697000,94.68 -2007-04-04,94.94,95.14,94.13,94.27,17028000,94.27 -2007-04-03,94.14,95.23,93.76,94.50,20854800,94.50 -2007-04-02,94.14,94.25,93.02,93.65,17928300,93.65 -2007-03-30,94.28,94.68,92.75,92.91,21448500,92.91 -2007-03-29,94.19,94.19,92.23,93.75,25918700,93.75 -2007-03-28,94.88,95.40,93.15,93.24,33654900,93.24 -2007-03-27,95.71,96.83,95.00,95.46,33287600,95.46 -2007-03-26,93.99,95.90,93.30,95.85,30892400,95.85 -2007-03-23,93.35,94.07,93.30,93.52,16103000,93.52 -2007-03-22,93.73,94.36,93.00,93.96,20053300,93.96 -2007-03-21,91.99,94.00,91.65,93.87,24532000,93.87 -2007-03-20,91.35,91.84,91.06,91.48,17461300,91.48 -2007-03-19,90.24,91.55,89.59,91.13,25462900,91.13 -2007-03-16,89.54,89.99,89.32,89.59,20418000,89.59 -2007-03-15,89.96,90.36,89.31,89.57,19982100,89.57 -2007-03-14,88.60,90.00,87.92,90.00,28449500,90.00 -2007-03-13,89.41,90.60,88.40,88.40,30996100,88.40 -2007-03-12,88.07,89.99,87.99,89.87,26050300,89.87 -2007-03-09,88.80,88.85,87.40,87.97,16137000,87.97 -2007-03-08,88.59,88.72,87.46,88.00,18250400,88.00 -2007-03-07,88.05,88.97,87.45,87.72,22367300,87.72 -2007-03-06,87.80,88.31,87.40,88.19,25828100,88.19 -2007-03-05,85.89,88.65,85.76,86.32,29960700,86.32 -2007-03-02,86.77,87.54,85.21,85.41,30714300,85.41 -2007-03-01,84.03,88.31,83.75,87.06,50554600,87.06 -2007-02-28,83.00,85.60,83.00,84.61,32838400,84.61 -2007-02-27,86.30,87.08,83.41,83.93,40921900,83.93 -2007-02-26,89.84,90.00,87.61,88.51,21994600,88.51 -2007-02-23,89.16,90.34,88.85,89.07,18496200,89.07 -2007-02-22,90.80,90.81,88.53,89.51,29936600,89.51 -2007-02-21,85.98,89.49,85.96,89.20,41261200,89.20 -2007-02-20,84.65,86.16,84.16,85.90,22060800,85.90 -2007-02-16,85.25,85.41,84.66,84.83,14281000,84.83 -2007-02-15,85.44,85.62,84.78,85.21,12987900,85.21 -2007-02-14,84.63,85.64,84.57,85.30,18142200,85.30 -2007-02-13,85.16,85.29,84.30,84.70,20749500,84.70 -2007-02-12,84.43,85.18,83.63,84.88,25859700,84.88 -2007-02-09,85.88,86.20,83.21,83.27,30733600,83.27 -2007-02-08,85.43,86.51,85.41,86.18,24251100,86.18 -2007-02-07,84.48,86.38,83.55,86.15,38100900,86.15 -2007-02-06,84.45,84.47,82.86,84.15,30871200,84.15 -2007-02-05,84.30,85.23,83.94,83.94,20673300,83.94 -2007-02-02,84.12,85.25,83.70,84.75,22197500,84.75 -2007-02-01,86.23,86.27,84.74,84.74,23726500,84.74 -2007-01-31,84.86,86.00,84.35,85.73,30573900,85.73 -2007-01-30,86.43,86.49,85.25,85.55,20641800,85.55 -2007-01-29,86.30,86.65,85.53,85.94,32202300,85.94 -2007-01-26,87.11,87.37,84.99,85.38,35245500,85.38 -2007-01-25,87.11,88.50,86.03,86.25,32356200,86.25 -2007-01-24,86.68,87.15,86.08,86.70,33136200,86.70 -2007-01-23,85.73,87.51,85.51,85.70,43122300,85.70 -2007-01-22,89.14,89.16,85.65,86.79,51929500,86.79 -2007-01-19,88.63,89.65,88.12,88.50,48731200,88.50 -2007-01-18,92.10,92.11,89.05,89.07,84450200,89.07 -2007-01-17,97.56,97.60,94.82,94.95,58795000,94.95 -2007-01-16,95.68,97.25,95.45,97.10,44431300,97.10 -2007-01-12,94.59,95.06,93.23,94.62,46881800,94.62 -2007-01-11,95.94,96.78,95.10,95.80,51437600,95.80 -2007-01-10,94.75,97.80,93.45,97.00,105460000,97.00 -2007-01-09,86.45,92.98,85.15,92.57,119617800,92.57 -2007-01-08,85.96,86.53,85.28,85.47,28468100,85.47 -2007-01-05,85.77,86.20,84.40,85.05,29812200,85.05 -2007-01-04,84.05,85.95,83.82,85.66,30259300,85.66 -2007-01-03,86.29,86.58,81.90,83.80,44225700,83.80 -2006-12-29,83.95,85.40,83.36,84.84,38443900,84.84 -2006-12-28,80.22,81.25,79.65,80.87,39995600,80.87 -2006-12-27,78.15,82.00,76.77,81.52,69134100,81.52 -2006-12-26,82.15,82.57,80.89,81.51,17524600,81.51 -2006-12-22,83.46,84.04,81.60,82.20,21903700,82.20 -2006-12-21,84.70,85.48,82.20,82.90,32271400,82.90 -2006-12-20,86.47,86.67,84.74,84.76,20274700,84.76 -2006-12-19,84.73,86.68,83.62,86.31,32550200,86.31 -2006-12-18,87.63,88.00,84.59,85.47,25770600,85.47 -2006-12-15,89.02,89.22,87.33,87.72,26426400,87.72 -2006-12-14,89.05,90.00,88.26,88.55,29726100,88.55 -2006-12-13,87.95,89.07,87.15,89.05,30609000,89.05 -2006-12-12,88.61,88.84,85.53,86.14,36665000,86.14 -2006-12-11,88.90,89.30,88.05,88.75,17849300,88.75 -2006-12-08,87.23,89.39,87.00,88.26,28009900,88.26 -2006-12-07,90.03,90.50,86.90,87.04,35886700,87.04 -2006-12-06,90.64,91.39,89.67,89.83,22792300,89.83 -2006-12-05,91.65,92.33,90.87,91.27,23672800,91.27 -2006-12-04,91.88,92.05,90.50,91.12,25340600,91.12 -2006-12-01,91.80,92.33,90.10,91.32,28395700,91.32 -2006-11-30,92.21,92.68,91.06,91.66,31088800,91.66 -2006-11-29,93.00,93.15,90.25,91.80,41324400,91.80 -2006-11-28,90.36,91.97,89.91,91.81,37006200,91.81 -2006-11-27,92.51,93.16,89.50,89.54,38387000,89.54 -2006-11-24,89.53,93.08,89.50,91.63,18524200,91.63 -2006-11-22,88.99,90.75,87.85,90.31,23997900,90.31 -2006-11-21,87.42,88.60,87.11,88.60,22238100,88.60 -2006-11-20,85.40,87.00,85.20,86.47,20385500,86.47 -2006-11-17,85.14,85.94,85.00,85.85,16658000,85.85 -2006-11-16,84.87,86.30,84.62,85.61,24783600,85.61 -2006-11-15,85.05,85.90,84.00,84.05,23404400,84.05 -2006-11-14,84.80,85.00,83.90,85.00,21034100,85.00 -2006-11-13,83.22,84.45,82.64,84.35,16095500,84.35 -2006-11-10,83.55,83.60,82.50,83.12,13352300,83.12 -2006-11-09,82.90,84.69,82.12,83.34,32966200,83.34 -2006-11-08,80.02,82.69,79.89,82.45,24675600,82.45 -2006-11-07,80.45,81.00,80.13,80.51,18783300,80.51 -2006-11-06,78.95,80.06,78.43,79.71,15520600,79.71 -2006-11-03,79.36,79.53,77.79,78.29,15424600,78.29 -2006-11-02,78.92,79.32,78.50,78.98,16624400,78.98 -2006-11-01,81.10,81.38,78.36,79.16,21828300,79.16 -2006-10-31,81.45,81.68,80.23,81.08,17909800,81.08 -2006-10-30,79.99,80.90,79.50,80.42,17854200,80.42 -2006-10-27,81.75,82.45,80.01,80.41,21248800,80.41 -2006-10-26,81.90,82.60,81.13,82.19,15455600,82.19 -2006-10-25,81.35,82.00,81.01,81.68,17329100,81.68 -2006-10-24,81.21,81.68,80.20,81.05,16543300,81.05 -2006-10-23,79.99,81.90,79.75,81.46,29732400,81.46 -2006-10-20,78.97,79.99,78.67,79.95,22836200,79.95 -2006-10-19,79.26,79.95,78.16,78.99,54034900,78.99 -2006-10-18,74.75,75.37,73.91,74.53,40496700,74.53 -2006-10-17,75.04,75.27,74.04,74.29,17175900,74.29 -2006-10-16,75.19,75.88,74.79,75.40,18167600,75.40 -2006-10-13,75.63,76.88,74.74,75.02,24435600,75.02 -2006-10-12,73.61,75.39,73.60,75.26,21173400,75.26 -2006-10-11,73.42,73.98,72.60,73.23,20423400,73.23 -2006-10-10,74.54,74.58,73.08,73.81,18985300,73.81 -2006-10-09,73.80,75.08,73.53,74.63,15650800,74.63 -2006-10-06,74.42,75.04,73.81,74.22,16677100,74.22 -2006-10-05,74.53,76.16,74.13,74.83,24424400,74.83 -2006-10-04,74.10,75.46,73.16,75.38,29610100,75.38 -2006-10-03,74.45,74.95,73.19,74.08,28239600,74.08 -2006-10-02,75.10,75.87,74.30,74.86,25451400,74.86 -2006-09-29,77.11,77.52,76.68,76.98,14493300,76.98 -2006-09-28,77.02,77.48,75.95,77.01,25843200,77.01 -2006-09-27,77.17,77.47,75.82,76.41,28941900,76.41 -2006-09-26,76.18,77.78,76.10,77.61,39391000,77.61 -2006-09-25,73.81,75.86,73.72,75.75,30678300,75.75 -2006-09-22,74.30,74.34,72.58,73.00,23754000,73.00 -2006-09-21,75.25,76.06,74.02,74.65,28361600,74.65 -2006-09-20,74.38,75.68,74.22,75.26,29385400,75.26 -2006-09-19,74.10,74.36,72.80,73.77,25358900,73.77 -2006-09-18,73.80,74.86,73.30,73.89,25188500,73.89 -2006-09-15,74.60,74.98,73.29,74.10,35066200,74.10 -2006-09-14,73.72,74.67,73.46,74.17,28633200,74.17 -2006-09-13,72.85,74.32,72.30,74.20,40933500,74.20 -2006-09-12,72.81,73.45,71.45,72.63,60167400,72.63 -2006-09-11,72.43,73.73,71.42,72.50,33897300,72.50 -2006-09-08,73.37,73.57,71.91,72.52,31997200,72.52 -2006-09-07,70.60,73.48,70.25,72.80,45284200,72.80 -2006-09-06,71.08,71.69,69.70,70.03,34789400,70.03 -2006-09-05,68.97,71.50,68.55,71.48,36159200,71.48 -2006-09-01,68.48,68.65,67.82,68.38,14589100,68.38 -2006-08-31,67.28,68.30,66.66,67.85,20524900,67.85 -2006-08-30,67.34,67.82,66.68,66.96,24290800,66.96 -2006-08-29,66.99,67.26,65.12,66.48,33833300,66.48 -2006-08-28,68.50,68.61,66.68,66.98,26362900,66.98 -2006-08-25,67.34,69.05,67.31,68.75,19427100,68.75 -2006-08-24,67.89,68.19,66.27,67.81,23399700,67.81 -2006-08-23,68.00,68.65,66.94,67.31,19152100,67.31 -2006-08-22,66.68,68.32,66.50,67.62,20606000,67.62 -2006-08-21,67.30,67.31,66.15,66.56,18793800,66.56 -2006-08-18,67.71,68.40,67.26,67.91,19155500,67.91 -2006-08-17,68.00,68.66,67.18,67.59,20755300,67.59 -2006-08-16,67.10,68.07,66.33,67.98,27903000,67.98 -2006-08-15,65.34,66.50,64.80,66.45,30762600,66.45 -2006-08-14,64.05,65.22,63.60,63.94,25629300,63.94 -2006-08-11,63.23,64.13,62.58,63.65,27768900,63.65 -2006-08-10,63.25,64.81,62.70,64.07,24920000,64.07 -2006-08-09,65.43,65.60,63.40,63.59,34137100,63.59 -2006-08-08,67.09,67.11,64.51,64.78,35638000,64.78 -2006-08-07,67.72,69.60,66.31,67.21,44482600,67.21 -2006-08-04,67.05,68.61,64.96,68.30,66173800,68.30 -2006-08-03,67.91,70.00,67.81,69.59,30037300,69.59 -2006-08-02,67.65,68.68,67.51,68.16,19670300,68.16 -2006-08-01,67.22,67.93,65.94,67.18,25420200,67.18 -2006-07-31,66.83,68.63,66.28,67.96,31887200,67.96 -2006-07-28,63.94,65.68,63.50,65.59,24696700,65.59 -2006-07-27,64.50,65.02,62.86,63.40,26251600,63.40 -2006-07-26,62.00,64.64,61.68,63.87,32086700,63.87 -2006-07-25,61.78,62.09,60.78,61.93,21038200,61.93 -2006-07-24,61.26,62.10,60.43,61.42,25816300,61.42 -2006-07-21,59.82,61.15,59.64,60.72,31853300,60.72 -2006-07-20,60.96,61.59,59.72,60.50,70433800,60.50 -2006-07-19,52.96,55.08,52.36,54.10,49669400,54.10 -2006-07-18,53.16,53.85,51.85,52.90,35730300,52.90 -2006-07-17,51.73,53.11,51.65,52.37,36590800,52.37 -2006-07-14,52.50,52.89,50.16,50.67,35465600,50.67 -2006-07-13,52.03,54.12,51.41,52.25,44639500,52.25 -2006-07-12,55.17,55.24,52.92,52.96,33118900,52.96 -2006-07-11,55.11,55.99,54.53,55.65,29465100,55.65 -2006-07-10,55.70,56.49,54.50,55.00,18905200,55.00 -2006-07-07,55.48,56.55,54.67,55.40,28548600,55.40 -2006-07-06,57.09,57.40,55.61,55.77,22614600,55.77 -2006-07-05,57.15,57.60,56.56,57.00,18508600,57.00 -2006-07-03,57.52,58.18,57.34,57.95,6956100,57.95 -2006-06-30,57.59,57.75,56.50,57.27,26417700,57.27 -2006-06-29,56.76,59.09,56.39,58.97,31192800,58.97 -2006-06-28,57.29,57.30,55.41,56.02,30382300,56.02 -2006-06-27,59.09,59.22,57.40,57.43,19664700,57.43 -2006-06-26,59.17,59.20,58.37,58.99,16662000,58.99 -2006-06-23,59.72,60.17,58.73,58.83,23578700,58.83 -2006-06-22,58.20,59.75,58.07,59.58,34486900,59.58 -2006-06-21,57.74,58.71,57.30,57.86,30832000,57.86 -2006-06-20,57.61,58.35,57.29,57.47,24034800,57.47 -2006-06-19,57.83,58.18,57.00,57.20,25163400,57.20 -2006-06-16,58.96,59.19,57.52,57.56,29932200,57.56 -2006-06-15,57.30,59.74,56.75,59.38,42513700,59.38 -2006-06-14,58.28,58.78,56.69,57.61,31362000,57.61 -2006-06-13,57.61,59.10,57.36,58.33,38594400,58.33 -2006-06-12,59.40,59.73,56.96,57.00,25635200,57.00 -2006-06-09,61.18,61.56,59.10,59.24,27708500,59.24 -2006-06-08,58.44,60.93,57.15,60.76,49910100,60.76 -2006-06-07,60.10,60.40,58.35,58.56,26803800,58.56 -2006-06-06,60.22,60.63,58.91,59.72,25929900,59.72 -2006-06-05,61.15,61.15,59.97,60.00,21635200,60.00 -2006-06-02,62.99,63.10,60.88,61.66,24492400,61.66 -2006-06-01,59.85,62.28,59.52,62.17,33661000,62.17 -2006-05-31,61.76,61.79,58.69,59.77,45749200,59.77 -2006-05-30,63.29,63.30,61.22,61.22,20121500,61.22 -2006-05-26,64.31,64.56,63.14,63.55,15462500,63.55 -2006-05-25,64.26,64.45,63.29,64.33,16549000,64.33 -2006-05-24,62.99,63.65,61.56,63.34,32715400,63.34 -2006-05-23,64.86,65.19,63.00,63.15,24800500,63.15 -2006-05-22,63.87,63.99,62.77,63.38,25677700,63.38 -2006-05-19,63.26,64.88,62.82,64.51,35209500,64.51 -2006-05-18,65.68,66.26,63.12,63.18,23515800,63.18 -2006-05-17,64.71,65.70,64.07,65.26,26935500,65.26 -2006-05-16,68.10,68.25,64.75,64.98,33455000,64.98 -2006-05-15,67.37,68.38,67.12,67.79,18899200,67.79 -2006-05-12,67.85,68.69,66.86,67.70,22920500,67.70 -2006-05-11,70.79,70.84,67.55,68.15,29024600,68.15 -2006-05-10,71.29,71.33,69.61,70.60,16424600,70.60 -2006-05-09,71.82,72.56,70.62,71.03,18988100,71.03 -2006-05-08,72.99,73.80,71.72,71.89,21244700,71.89 -2006-05-05,71.86,72.25,71.15,71.89,20139700,71.89 -2006-05-04,71.22,72.89,70.46,71.13,30729300,71.13 -2006-05-03,71.83,71.95,70.18,71.14,24535400,71.14 -2006-05-02,70.15,71.98,70.11,71.62,27559400,71.62 -2006-05-01,70.77,71.54,69.16,69.60,26799300,69.60 -2006-04-28,69.38,71.30,69.20,70.39,27144200,70.39 -2006-04-27,67.73,69.86,67.35,69.36,30212400,69.36 -2006-04-26,66.65,68.28,66.40,68.15,25388800,68.15 -2006-04-25,65.96,66.59,65.56,66.17,18895100,66.17 -2006-04-24,66.85,66.92,65.50,65.75,25251000,65.75 -2006-04-21,68.19,68.64,66.47,67.04,28178100,67.04 -2006-04-20,69.51,70.00,66.20,67.63,59535100,67.63 -2006-04-19,66.82,67.00,65.47,65.65,38786900,65.65 -2006-04-18,65.04,66.47,64.79,66.22,28387300,66.22 -2006-04-17,66.51,66.84,64.35,64.81,25783500,64.81 -2006-04-13,66.34,67.44,65.81,66.47,26238500,66.47 -2006-04-12,68.01,68.17,66.30,66.71,26424800,66.71 -2006-04-11,68.99,69.30,67.07,67.99,33547000,67.99 -2006-04-10,70.29,70.93,68.45,68.67,32268400,68.67 -2006-04-07,70.93,71.21,68.47,69.79,55187100,69.79 -2006-04-06,68.30,72.05,68.20,71.24,95134600,71.24 -2006-04-05,64.71,67.21,64.15,67.21,79764600,67.21 -2006-04-04,62.10,62.22,61.05,61.17,33283000,61.17 -2006-04-03,63.67,64.12,62.61,62.65,29135400,62.65 -2006-03-31,63.25,63.61,62.24,62.72,29119900,62.72 -2006-03-30,62.82,63.30,61.53,62.75,49666100,62.75 -2006-03-29,59.13,62.52,57.67,62.33,83815500,62.33 -2006-03-28,59.63,60.14,58.25,58.71,48940100,58.71 -2006-03-27,60.35,61.38,59.40,59.51,39574000,59.51 -2006-03-24,60.25,60.94,59.03,59.96,38285000,59.96 -2006-03-23,61.82,61.90,59.61,60.16,50993800,60.16 -2006-03-22,62.16,63.25,61.27,61.67,48067700,61.67 -2006-03-21,64.29,64.34,61.39,61.81,47991700,61.81 -2006-03-20,65.22,65.46,63.87,63.99,21622900,63.99 -2006-03-17,64.75,65.54,64.11,64.66,29001500,64.66 -2006-03-16,66.85,66.90,64.30,64.31,26772800,64.31 -2006-03-15,67.71,68.04,65.52,66.23,31857000,66.23 -2006-03-14,65.77,67.32,65.50,67.32,22929300,67.32 -2006-03-13,65.05,66.28,64.79,65.68,30756700,65.68 -2006-03-10,64.05,64.49,62.45,63.19,37255100,63.19 -2006-03-09,65.98,66.47,63.81,63.93,28546600,63.93 -2006-03-08,66.29,67.20,65.35,65.66,23330400,65.66 -2006-03-07,65.76,66.90,65.08,66.31,31174200,66.31 -2006-03-06,67.69,67.72,64.94,65.48,32595200,65.48 -2006-03-03,69.40,69.91,67.53,67.72,26345300,67.72 -2006-03-02,68.99,69.99,68.67,69.61,22331200,69.61 -2006-03-01,68.84,69.49,68.02,69.10,27279200,69.10 -2006-02-28,71.58,72.40,68.10,68.49,45249300,68.49 -2006-02-27,71.99,72.12,70.65,70.99,28258600,70.99 -2006-02-24,72.14,72.89,71.20,71.46,19098000,71.46 -2006-02-23,71.79,73.00,71.43,71.75,30604200,71.75 -2006-02-22,69.00,71.67,68.00,71.32,34937100,71.32 -2006-02-21,70.59,70.80,68.68,69.08,27843100,69.08 -2006-02-17,70.30,70.89,69.61,70.29,20571400,70.29 -2006-02-16,69.91,71.01,69.48,70.57,33863400,70.57 -2006-02-15,67.16,69.62,66.75,69.22,41420400,69.22 -2006-02-14,65.10,68.10,65.00,67.64,41462100,67.64 -2006-02-13,66.63,66.75,64.64,64.71,31553500,64.71 -2006-02-10,65.18,67.67,62.90,67.31,62874200,67.31 -2006-02-09,69.10,69.23,64.53,64.95,41063000,64.95 -2006-02-08,68.49,69.08,66.00,68.81,34039800,68.81 -2006-02-07,68.27,69.48,66.68,67.60,49601100,67.60 -2006-02-06,72.02,72.51,66.74,67.30,58991700,67.30 -2006-02-03,72.24,72.79,71.04,71.85,24718700,71.85 -2006-02-02,75.10,75.36,72.05,72.10,25261500,72.10 -2006-02-01,74.95,76.46,74.64,75.42,18613800,75.42 -2006-01-31,75.50,76.34,73.75,75.51,32626500,75.51 -2006-01-30,71.17,76.60,70.87,75.00,49942900,75.00 -2006-01-27,72.95,73.60,71.10,72.03,34066600,72.03 -2006-01-26,74.53,75.43,71.93,72.33,42192400,72.33 -2006-01-25,77.39,77.50,73.25,74.20,45563800,74.20 -2006-01-24,78.76,79.42,75.77,76.04,40794800,76.04 -2006-01-23,76.10,79.56,76.00,77.67,37847500,77.67 -2006-01-20,79.28,80.04,75.83,76.09,40527100,76.09 -2006-01-19,81.25,81.66,78.74,79.04,60566000,79.04 -2006-01-18,83.08,84.05,81.85,82.49,42879900,82.49 -2006-01-17,85.70,86.38,83.87,84.71,29843700,84.71 -2006-01-13,84.99,86.01,84.60,85.59,27725200,85.59 -2006-01-12,84.97,86.40,83.62,84.29,45743200,84.29 -2006-01-11,83.84,84.80,82.59,83.90,53349800,83.90 -2006-01-10,76.25,81.89,75.83,80.86,81423900,80.86 -2006-01-09,76.73,77.20,75.74,76.05,24108600,76.05 -2006-01-06,75.25,76.70,74.55,76.30,25159200,76.30 -2006-01-05,74.83,74.90,73.75,74.38,16050800,74.38 -2006-01-04,75.13,75.98,74.50,74.97,22128700,74.97 -2006-01-03,72.38,74.75,72.25,74.75,28829800,74.75 -2005-12-30,70.91,72.43,70.34,71.89,22295100,71.89 -2005-12-29,73.78,73.82,71.42,71.45,17500900,71.45 -2005-12-28,74.47,74.76,73.32,73.57,14218400,73.57 -2005-12-27,74.00,75.18,73.95,74.23,21092500,74.23 -2005-12-23,74.17,74.26,73.30,73.35,8209200,73.35 -2005-12-22,73.91,74.49,73.60,74.02,13236100,74.02 -2005-12-21,72.60,73.61,72.54,73.50,16990600,73.50 -2005-12-20,71.63,72.38,71.12,72.11,17111000,72.11 -2005-12-19,71.11,72.60,71.04,71.38,18903400,71.38 -2005-12-16,72.14,72.30,71.06,71.11,23970400,71.11 -2005-12-15,72.68,72.86,71.35,72.18,20041500,72.18 -2005-12-14,72.53,73.30,70.27,72.01,51811300,72.01 -2005-12-13,74.85,75.46,74.21,74.98,17636300,74.98 -2005-12-12,74.87,75.35,74.56,74.91,18749800,74.91 -2005-12-09,74.21,74.59,73.35,74.33,19835800,74.33 -2005-12-08,73.20,74.17,72.60,74.08,28231500,74.08 -2005-12-07,74.23,74.46,73.12,73.95,24266600,73.95 -2005-12-06,73.93,74.83,73.35,74.05,30608200,74.05 -2005-12-05,71.95,72.53,71.49,71.82,20845400,71.82 -2005-12-02,72.27,72.74,70.70,72.63,31991500,72.63 -2005-12-01,68.95,71.73,68.81,71.60,29031900,71.60 -2005-11-30,68.43,68.85,67.52,67.82,21274100,67.82 -2005-11-29,69.99,70.30,67.35,68.10,31836900,68.10 -2005-11-28,70.72,71.07,69.07,69.66,36375700,69.66 -2005-11-25,67.66,69.54,67.50,69.34,14107600,69.34 -2005-11-23,66.88,67.98,66.69,67.11,17351900,67.11 -2005-11-22,64.84,66.76,64.52,66.52,19295800,66.52 -2005-11-21,64.82,65.19,63.72,64.96,18275400,64.96 -2005-11-18,65.31,65.43,64.37,64.56,18748700,64.56 -2005-11-17,65.59,65.88,64.25,64.52,24150200,64.52 -2005-11-16,63.15,65.06,63.09,64.95,28018400,64.95 -2005-11-15,61.60,63.08,61.46,62.28,19172900,62.28 -2005-11-14,61.54,61.98,60.91,61.45,13211900,61.45 -2005-11-11,61.54,62.11,61.34,61.54,15194600,61.54 -2005-11-10,60.64,61.20,59.01,61.18,23762300,61.18 -2005-11-09,60.00,61.21,60.00,60.11,19747500,60.11 -2005-11-08,59.95,60.38,59.10,59.90,16920200,59.90 -2005-11-07,60.85,61.67,60.14,60.23,22815400,60.23 -2005-11-04,60.35,61.24,59.62,61.15,31358400,61.15 -2005-11-03,60.26,62.32,60.07,61.85,31585100,61.85 -2005-11-02,57.72,60.00,57.60,59.95,30609300,59.95 -2005-11-01,57.24,58.14,56.87,57.50,26774500,57.50 -2005-10-31,55.20,57.98,54.75,57.59,33601600,57.59 -2005-10-28,56.04,56.43,54.17,54.47,27492400,54.47 -2005-10-27,56.99,57.01,55.41,55.41,14697900,55.41 -2005-10-26,56.28,57.56,55.92,57.03,22556900,57.03 -2005-10-25,56.40,56.85,55.69,56.10,16611700,56.10 -2005-10-24,55.25,56.79,55.09,56.79,21776900,56.79 -2005-10-21,56.84,56.98,55.36,55.66,28454500,55.66 -2005-10-20,54.47,56.50,54.35,56.14,48491500,56.14 -2005-10-19,52.07,54.96,51.21,54.94,36024400,54.94 -2005-10-18,53.25,53.95,52.20,52.21,21771000,52.21 -2005-10-17,53.98,54.23,52.68,53.44,22029800,53.44 -2005-10-14,54.03,54.35,52.79,54.00,36984000,54.00 -2005-10-13,49.44,53.95,49.27,53.74,66627700,53.74 -2005-10-12,48.65,50.30,47.87,49.25,96338800,49.25 -2005-10-11,51.23,51.87,50.40,51.59,43781600,51.59 -2005-10-10,51.76,51.91,50.28,50.37,18125200,50.37 -2005-10-07,51.72,51.93,50.55,51.30,24210100,51.30 -2005-10-06,53.20,53.49,50.87,51.70,27054900,51.70 -2005-10-05,54.33,54.36,52.75,52.78,21813200,52.78 -2005-10-04,54.95,55.35,53.64,53.75,19266400,53.75 -2005-10-03,54.16,54.54,53.68,54.44,18126900,54.44 -2005-09-30,52.33,53.65,51.88,53.61,18986900,53.61 -2005-09-29,51.23,52.59,50.81,52.34,22744500,52.34 -2005-09-28,53.07,53.11,50.59,51.08,40198000,51.08 -2005-09-27,53.92,54.24,53.43,53.44,12203700,53.44 -2005-09-26,54.03,54.56,53.32,53.84,19520100,53.84 -2005-09-23,52.10,53.50,51.84,53.20,19944900,53.20 -2005-09-22,51.88,52.47,51.32,51.90,16561700,51.90 -2005-09-21,52.96,53.05,51.86,52.11,15526700,52.11 -2005-09-20,52.99,53.81,52.92,53.19,29279600,53.19 -2005-09-19,51.05,52.89,51.05,52.64,27990400,52.64 -2005-09-16,50.23,51.21,49.95,51.21,21107300,51.21 -2005-09-15,50.00,50.18,49.33,49.87,14827000,49.87 -2005-09-14,51.06,51.19,49.46,49.61,16943800,49.61 -2005-09-13,51.02,51.29,50.32,50.82,17603000,50.82 -2005-09-12,51.10,51.63,50.58,51.40,16171300,51.40 -2005-09-09,50.07,51.35,49.79,51.31,21987200,51.31 -2005-09-08,49.35,50.12,49.14,49.78,25094300,49.78 -2005-09-07,49.05,49.40,47.92,48.68,34395500,48.68 -2005-09-06,46.70,48.88,46.55,48.80,29236400,48.80 -2005-09-02,46.30,46.80,46.12,46.22,7942100,46.22 -2005-09-01,47.00,47.17,46.09,46.26,12727400,46.26 -2005-08-31,46.86,47.03,46.27,46.89,14391300,46.89 -2005-08-30,45.99,46.79,45.92,46.57,18527200,46.57 -2005-08-29,45.27,46.03,45.26,45.84,9153400,45.84 -2005-08-26,46.12,46.34,45.36,45.74,9323500,45.74 -2005-08-25,46.12,46.49,45.81,46.06,9866200,46.06 -2005-08-24,45.60,47.12,45.59,45.77,20431100,45.77 -2005-08-23,45.85,46.10,45.32,45.74,10557300,45.74 -2005-08-22,46.15,46.75,45.26,45.87,13847600,45.87 -2005-08-19,46.28,46.70,45.77,45.83,13448900,45.83 -2005-08-18,46.91,47.00,45.75,46.30,15805700,46.30 -2005-08-17,46.40,47.44,46.37,47.15,17847300,47.15 -2005-08-16,47.39,47.50,46.21,46.25,19200800,46.25 -2005-08-15,46.48,48.33,46.45,47.68,38811700,47.68 -2005-08-12,43.46,46.22,43.36,46.10,32715600,46.10 -2005-08-11,43.39,44.12,43.25,44.00,9713700,44.00 -2005-08-10,44.00,44.39,43.31,43.38,12890900,43.38 -2005-08-09,42.93,43.89,42.91,43.82,13601400,43.82 -2005-08-08,43.00,43.25,42.61,42.65,6299400,42.65 -2005-08-05,42.49,43.36,42.02,42.99,8640400,42.99 -2005-08-04,42.89,43.00,42.29,42.71,9618000,42.71 -2005-08-03,43.19,43.31,42.77,43.22,9225800,43.22 -2005-08-02,42.89,43.50,42.61,43.19,10602700,43.19 -2005-08-01,42.57,43.08,42.08,42.75,11223200,42.75 -2005-07-29,43.56,44.38,42.26,42.65,20074300,42.65 -2005-07-28,43.85,44.00,43.30,43.80,8975400,43.80 -2005-07-27,43.83,44.07,42.67,43.99,10133900,43.99 -2005-07-26,44.01,44.11,43.36,43.63,9592600,43.63 -2005-07-25,43.99,44.28,43.73,43.81,10522400,43.81 -2005-07-22,43.44,44.00,43.39,44.00,10753800,44.00 -2005-07-21,43.70,44.04,42.90,43.29,14438000,43.29 -2005-07-20,42.86,43.80,42.65,43.63,16192700,43.63 -2005-07-19,41.52,43.23,41.07,43.19,23966500,43.19 -2005-07-18,41.41,42.10,41.37,41.49,20939200,41.49 -2005-07-15,40.97,41.57,40.46,41.55,24560100,41.55 -2005-07-14,40.79,42.01,40.23,40.75,74859300,40.75 -2005-07-13,38.29,38.50,37.90,38.35,24458400,38.35 -2005-07-12,38.23,38.40,37.91,38.24,13822800,38.24 -2005-07-11,38.37,38.65,37.78,38.10,13885300,38.10 -2005-07-08,37.87,38.28,37.47,38.25,10383400,38.25 -2005-07-07,36.81,37.76,36.80,37.63,13704400,37.63 -2005-07-06,37.71,38.16,37.20,37.39,14093800,37.39 -2005-07-05,36.55,38.15,36.50,37.98,16223900,37.98 -2005-07-01,36.83,36.97,36.29,36.50,8928600,36.50 -2005-06-30,36.61,37.16,36.31,36.81,14942500,36.81 -2005-06-29,37.23,37.29,36.12,36.37,16012800,36.37 -2005-06-28,37.49,37.59,37.17,37.31,12510700,37.31 -2005-06-27,36.84,38.10,36.68,37.10,21434700,37.10 -2005-06-24,39.09,39.12,37.68,37.76,14668200,37.76 -2005-06-23,38.83,39.78,38.65,38.89,24080500,38.89 -2005-06-22,38.26,38.60,38.14,38.55,15175900,38.55 -2005-06-21,37.72,38.19,37.38,37.86,13233100,37.86 -2005-06-20,37.85,38.09,37.45,37.61,11561300,37.61 -2005-06-17,38.47,38.54,37.83,38.31,21290200,38.31 -2005-06-16,37.19,38.08,36.82,37.98,19559800,37.98 -2005-06-15,36.87,37.30,36.30,37.13,20119400,37.13 -2005-06-14,35.92,36.15,35.75,36.00,12423100,36.00 -2005-06-13,35.89,36.61,35.82,35.90,15563300,35.90 -2005-06-10,37.40,37.40,35.52,35.81,24247600,35.81 -2005-06-09,37.00,37.94,36.82,37.65,13937700,37.65 -2005-06-08,36.63,37.25,36.57,36.92,14428800,36.92 -2005-06-07,37.60,37.73,36.45,36.54,26616600,36.54 -2005-06-06,38.33,38.63,37.56,37.92,28998800,37.92 -2005-06-03,38.16,38.58,37.77,38.24,34173900,38.24 -2005-06-02,40.05,40.32,39.60,40.04,13356200,40.04 -2005-06-01,39.89,40.76,39.86,40.30,16207600,40.30 -2005-05-31,40.66,40.74,39.58,39.76,14435900,39.76 -2005-05-27,40.64,40.79,40.01,40.56,11286000,40.56 -2005-05-26,39.94,40.94,39.94,40.74,18768600,40.74 -2005-05-25,39.50,39.95,39.32,39.78,14143100,39.78 -2005-05-24,39.45,39.99,39.03,39.70,21195000,39.70 -2005-05-23,37.85,39.90,37.85,39.76,37234800,39.76 -2005-05-20,37.25,37.65,37.19,37.55,16166100,37.55 -2005-05-19,35.78,37.68,35.78,37.55,28327200,37.55 -2005-05-18,35.45,37.56,34.99,35.84,22740100,35.84 -2005-05-17,35.14,35.46,34.54,35.36,21012300,35.36 -2005-05-16,34.56,35.70,34.53,35.55,16939100,35.55 -2005-05-13,34.20,35.23,34.07,34.77,25096900,34.77 -2005-05-12,35.42,35.59,34.00,34.13,34651500,34.13 -2005-05-11,35.20,35.67,33.11,35.61,72927900,35.61 -2005-05-10,36.75,37.25,36.33,36.42,15723700,36.42 -2005-05-09,37.28,37.45,36.75,36.97,12703400,36.97 -2005-05-06,36.89,37.33,36.79,37.24,11651700,37.24 -2005-05-05,37.25,37.27,36.47,36.68,13834500,36.68 -2005-05-04,36.11,37.20,36.10,37.15,16006300,37.15 -2005-05-03,36.40,36.74,36.03,36.21,17740700,36.21 -2005-05-02,36.21,36.65,36.02,36.43,16640000,36.43 -2005-04-29,36.15,36.23,35.22,36.06,23986800,36.06 -2005-04-28,36.29,36.34,35.24,35.54,20539500,35.54 -2005-04-27,35.89,36.36,35.51,35.95,21924600,35.95 -2005-04-26,36.78,37.51,36.12,36.19,28946700,36.19 -2005-04-25,36.49,37.02,36.11,36.98,26659300,36.98 -2005-04-22,36.84,37.00,34.90,35.50,29968900,35.50 -2005-04-21,36.40,37.21,35.90,37.18,27128300,37.18 -2005-04-20,37.66,37.74,35.44,35.51,33754700,35.51 -2005-04-19,36.60,37.44,35.87,37.09,38630100,37.09 -2005-04-18,35.00,36.30,34.00,35.62,47399200,35.62 -2005-04-15,36.62,37.25,35.28,35.35,61717400,35.35 -2005-04-14,38.81,39.56,36.84,37.26,98328300,37.26 -2005-04-13,42.95,42.99,40.39,41.04,48998100,41.04 -2005-04-12,42.49,43.19,42.01,42.66,35037900,42.66 -2005-04-11,44.15,44.25,41.91,41.92,29345100,41.92 -2005-04-08,43.70,44.45,43.54,43.74,23212500,43.74 -2005-04-07,42.33,43.75,42.25,43.56,18106700,43.56 -2005-04-06,42.40,42.81,42.15,42.33,14815200,42.33 -2005-04-05,41.22,42.24,41.09,41.89,19865700,41.89 -2005-04-04,40.99,41.31,40.16,41.09,20714800,41.09 -2005-04-01,42.09,42.18,40.57,40.89,22903000,40.89 -2005-03-31,42.45,42.52,41.59,41.67,22719100,41.67 -2005-03-30,42.07,42.80,41.82,42.80,14105700,42.80 -2005-03-29,42.56,42.83,41.50,41.75,16477000,41.75 -2005-03-28,42.75,42.96,42.47,42.53,9836100,42.53 -2005-03-24,42.91,43.00,42.50,42.50,12596600,42.50 -2005-03-23,42.45,43.40,42.02,42.55,21779400,42.55 -2005-03-22,43.71,43.96,42.68,42.83,19693400,42.83 -2005-03-21,43.29,43.97,42.86,43.70,19326000,43.70 -2005-03-18,43.33,43.44,42.50,42.96,33576800,42.96 -2005-03-17,41.53,42.88,41.32,42.25,28640000,42.25 -2005-03-16,41.21,42.31,40.78,41.18,24921900,41.18 -2005-03-15,40.64,41.14,40.25,40.96,18164600,40.96 -2005-03-14,40.52,40.79,39.52,40.32,21620900,40.32 -2005-03-11,40.21,40.59,39.80,40.27,22601100,40.27 -2005-03-10,39.53,40.26,39.10,39.83,27753900,39.83 -2005-03-09,39.64,40.28,38.83,39.35,47230900,39.35 -2005-03-08,41.90,42.16,40.10,40.53,36480400,40.53 -2005-03-07,42.80,43.25,42.35,42.75,16094000,42.75 -2005-03-04,42.76,43.01,41.85,42.81,27022100,42.81 -2005-03-03,44.37,44.41,41.22,41.79,50416200,41.79 -2005-03-02,44.25,44.89,44.08,44.12,16362900,44.12 -2005-03-01,44.99,45.11,44.16,44.50,16721000,44.50 -2005-02-28,44.68,45.14,43.96,44.86,23271800,44.86 -2005-02-25,89.62,89.91,88.19,88.99,32696800,44.49 -2005-02-24,88.48,89.31,87.73,88.93,54251000,44.47 -2005-02-23,86.72,88.45,85.55,88.23,48042200,44.12 -2005-02-22,86.30,88.30,85.29,85.29,43546200,42.65 -2005-02-18,87.74,87.86,86.25,86.81,41544800,43.40 -2005-02-17,90.65,90.88,87.45,87.81,54231200,43.90 -2005-02-16,88.15,90.20,87.35,90.13,58544400,45.06 -2005-02-15,86.66,89.08,86.00,88.41,82579200,44.21 -2005-02-14,82.73,84.79,82.05,84.63,45409400,42.31 -2005-02-11,79.86,81.76,78.94,81.21,42894800,40.60 -2005-02-10,78.72,79.28,76.66,78.36,39036400,39.18 -2005-02-09,81.04,81.99,78.10,78.74,42552000,39.37 -2005-02-08,79.07,81.38,78.79,80.90,31786400,40.45 -2005-02-07,78.93,79.35,77.50,78.94,18730600,39.47 -2005-02-04,77.87,78.93,77.53,78.84,20127000,39.42 -2005-02-03,79.10,79.43,77.33,77.81,26130400,38.90 -2005-02-02,77.95,79.91,77.69,79.63,36430800,39.81 -2005-02-01,77.05,77.77,76.58,77.53,24228400,38.76 -2005-01-31,74.58,77.89,74.51,76.90,60039200,38.45 -2005-01-28,72.62,73.98,72.44,73.98,28629000,36.99 -2005-01-27,72.16,72.92,71.55,72.64,17722400,36.32 -2005-01-26,72.66,72.75,71.22,72.25,26410600,36.12 -2005-01-25,71.37,72.84,70.94,72.05,34615400,36.03 -2005-01-24,70.98,71.78,70.55,70.76,30058200,35.38 -2005-01-21,71.31,71.60,70.00,70.49,32547600,35.24 -2005-01-20,69.65,71.27,69.47,70.46,32675800,35.23 -2005-01-19,70.49,71.46,69.75,69.88,26853400,34.94 -2005-01-18,69.85,70.70,67.75,70.65,35945000,35.33 -2005-01-14,70.25,71.72,69.19,70.20,63240800,35.10 -2005-01-13,73.71,74.42,69.73,69.80,113025600,34.90 -2005-01-12,65.45,65.90,63.30,65.46,68560800,32.73 -2005-01-11,68.25,69.15,64.14,64.56,93272400,32.28 -2005-01-10,69.83,70.70,67.88,68.96,61618200,34.48 -2005-01-07,65.00,69.63,64.75,69.25,79551800,34.62 -2005-01-06,64.67,64.91,63.33,64.55,25198400,32.28 -2005-01-05,64.46,65.25,64.05,64.50,24301200,32.25 -2005-01-04,63.79,65.47,62.97,63.94,39171800,31.97 -2005-01-03,64.78,65.11,62.60,63.29,24714000,31.65 -2004-12-31,64.89,65.00,64.03,64.40,9949600,32.20 -2004-12-30,64.81,65.03,64.22,64.80,12333600,32.40 -2004-12-29,63.81,64.98,63.57,64.44,16055800,32.22 -2004-12-28,63.30,64.25,62.05,64.18,21848400,32.09 -2004-12-27,64.80,65.15,62.88,63.16,19981800,31.58 -2004-12-23,63.75,64.25,63.60,64.01,8783200,32.01 -2004-12-22,63.66,64.36,63.40,63.75,20208200,31.88 -2004-12-21,63.56,63.77,61.60,63.69,38014800,31.84 -2004-12-20,65.47,66.00,61.76,62.72,41718800,31.36 -2004-12-17,66.84,67.04,64.90,64.99,27982000,32.49 -2004-12-16,66.15,67.50,66.05,66.60,40218400,33.30 -2004-12-15,65.24,65.46,64.66,65.26,14227200,32.63 -2004-12-14,65.40,65.88,65.02,65.29,14847200,32.65 -2004-12-13,65.62,65.90,64.60,64.91,14108600,32.46 -2004-12-10,65.03,66.05,64.70,65.15,27706200,32.58 -2004-12-09,62.81,64.40,62.07,63.99,26482200,32.00 -2004-12-08,63.08,64.43,62.05,63.28,24710800,31.64 -2004-12-07,65.93,66.73,62.56,62.89,37746400,31.44 -2004-12-06,64.25,66.24,62.95,65.78,44568600,32.89 -2004-12-03,64.53,65.00,61.75,62.68,44244600,31.34 -2004-12-02,66.13,66.90,64.66,65.21,35265800,32.60 -2004-12-01,67.79,67.95,66.27,67.79,28591200,33.90 -2004-11-30,68.79,68.79,67.05,67.05,36732800,33.53 -2004-11-29,68.95,69.57,67.41,68.44,61175600,34.22 -2004-11-26,65.35,65.76,64.34,64.55,19648000,32.28 -2004-11-24,61.69,65.20,61.55,64.05,49671000,32.03 -2004-11-23,62.30,62.45,61.05,61.27,32551800,30.64 -2004-11-22,61.80,64.00,57.90,61.35,91721800,30.67 -2004-11-19,55.49,56.91,54.50,55.17,27331400,27.58 -2004-11-18,54.30,55.45,54.29,55.39,16398200,27.69 -2004-11-17,55.19,55.45,54.22,54.90,14205400,27.45 -2004-11-16,55.16,55.20,54.48,54.94,10539400,27.47 -2004-11-15,55.20,55.46,54.34,55.24,13430200,27.62 -2004-11-12,55.01,55.69,54.84,55.50,14132200,27.75 -2004-11-11,54.95,55.43,54.23,55.30,14546400,27.65 -2004-11-10,53.95,55.39,53.91,54.75,18167000,27.38 -2004-11-09,54.23,54.55,53.38,54.05,16991600,27.02 -2004-11-08,54.27,55.45,53.86,54.38,18818600,27.19 -2004-11-05,54.86,55.00,52.04,54.72,43037400,27.36 -2004-11-04,55.03,55.55,54.37,54.45,33165200,27.23 -2004-11-03,54.37,56.11,53.99,55.31,43006200,27.66 -2004-11-02,52.40,54.08,52.40,53.50,26071000,26.75 -2004-11-01,52.50,53.26,52.04,52.45,21501800,26.23 -2004-10-29,51.84,53.20,51.80,52.40,28936400,26.20 -2004-10-28,49.98,52.22,49.50,52.19,30866600,26.09 -2004-10-27,48.51,50.62,48.17,50.30,42624800,25.15 -2004-10-26,47.45,48.05,46.97,47.97,21227200,23.99 -2004-10-25,47.20,47.84,47.07,47.55,14023000,23.77 -2004-10-22,47.54,47.67,47.02,47.41,17252400,23.70 -2004-10-21,47.48,48.13,47.36,47.94,25875200,23.97 -2004-10-20,47.18,47.60,46.65,47.47,21611000,23.74 -2004-10-19,48.10,48.35,47.31,47.42,28642600,23.71 -2004-10-18,44.70,47.75,44.70,47.75,42884000,23.88 -2004-10-15,44.88,45.61,44.19,45.50,36826000,22.75 -2004-10-14,43.19,45.75,42.55,44.98,98872400,22.49 -2004-10-13,38.87,39.76,38.74,39.75,41536000,19.88 -2004-10-12,38.50,38.58,37.65,38.29,16435400,19.15 -2004-10-11,38.80,39.06,38.20,38.59,11566800,19.30 -2004-10-08,39.56,39.77,38.84,39.06,12829600,19.53 -2004-10-07,40.54,40.93,39.46,39.62,15219600,19.81 -2004-10-06,39.50,40.76,39.47,40.64,15939400,20.32 -2004-10-05,38.56,39.67,38.40,39.37,14505800,19.68 -2004-10-04,39.18,39.18,38.75,38.79,20503000,19.40 -2004-10-01,39.12,39.19,38.58,38.67,16621600,19.33 -2004-09-30,39.00,39.27,38.45,38.75,15179000,19.38 -2004-09-29,37.93,38.86,37.82,38.68,9768200,19.34 -2004-09-28,37.46,38.29,37.45,38.04,12613800,19.02 -2004-09-27,36.95,37.98,36.83,37.53,14197000,18.76 -2004-09-24,37.45,38.00,37.15,37.29,13196000,18.65 -2004-09-23,37.04,37.50,36.93,37.27,14193000,18.64 -2004-09-22,38.10,38.14,36.81,36.92,14346000,18.46 -2004-09-21,37.75,38.87,37.46,38.01,13809000,19.00 -2004-09-20,36.88,37.98,36.87,37.71,8750000,18.85 -2004-09-17,36.55,37.38,36.40,37.14,17939600,18.57 -2004-09-16,35.20,36.76,35.08,36.35,17925600,18.17 -2004-09-15,35.36,35.48,34.80,35.20,8309600,17.60 -2004-09-14,35.24,35.55,34.78,35.49,9100800,17.75 -2004-09-13,35.88,36.07,35.32,35.59,10070600,17.80 -2004-09-10,35.66,36.23,35.46,35.87,11714800,17.93 -2004-09-09,36.10,36.30,35.28,35.70,16476400,17.85 -2004-09-08,35.70,36.57,35.68,36.35,12268800,18.17 -2004-09-07,35.40,36.19,35.23,35.76,10784200,17.88 -2004-09-03,35.01,35.92,35.01,35.23,10481000,17.61 -2004-09-02,35.50,35.81,34.83,35.66,14511600,17.83 -2004-09-01,34.30,35.99,34.19,35.86,18418800,17.93 -2004-08-31,34.07,34.95,34.00,34.49,13448600,17.25 -2004-08-30,34.00,34.72,33.96,34.12,7790800,17.06 -2004-08-27,34.68,34.76,34.00,34.35,13886200,17.17 -2004-08-26,33.04,35.18,32.74,34.66,34137800,17.33 -2004-08-25,31.87,33.15,31.73,33.05,18057800,16.52 -2004-08-24,31.26,31.95,31.19,31.95,13362000,15.98 -2004-08-23,30.86,31.27,30.60,31.08,9095000,15.54 -2004-08-20,30.71,30.99,30.49,30.80,11313600,15.40 -2004-08-19,31.51,31.86,30.36,30.71,13890000,15.35 -2004-08-18,30.51,31.85,30.49,31.74,13023400,15.87 -2004-08-17,30.58,31.13,30.35,30.87,11536400,15.44 -2004-08-16,31.00,31.72,30.64,30.78,15559800,15.39 -2004-08-13,30.60,31.28,30.40,30.84,11716000,15.42 -2004-08-12,30.45,30.85,30.28,30.37,8078600,15.19 -2004-08-11,31.10,31.13,30.26,31.01,11514000,15.51 -2004-08-10,30.39,31.54,30.35,31.52,12537000,15.76 -2004-08-09,29.85,30.45,29.81,30.30,10387400,15.15 -2004-08-06,30.90,31.10,29.70,29.78,17581800,14.89 -2004-08-05,31.81,32.30,31.25,31.39,8732200,15.69 -2004-08-04,31.19,32.12,31.17,31.79,9874600,15.90 -2004-08-03,31.45,31.72,31.15,31.29,7558200,15.65 -2004-08-02,31.18,32.20,31.13,31.58,13039000,15.79 -2004-07-30,32.65,33.00,32.00,32.34,8679400,16.17 -2004-07-29,32.47,32.82,32.13,32.64,7934200,16.32 -2004-07-28,32.31,32.41,31.16,32.27,10180400,16.14 -2004-07-27,31.80,32.75,31.57,32.43,15178800,16.22 -2004-07-26,30.85,31.45,30.78,31.26,14069000,15.63 -2004-07-23,31.53,31.75,30.48,30.70,9770400,15.35 -2004-07-22,31.25,31.73,31.06,31.68,11932800,15.84 -2004-07-21,32.42,32.71,31.34,31.62,10759200,15.81 -2004-07-20,31.95,32.20,31.55,32.20,11562400,16.10 -2004-07-19,32.01,32.22,31.66,31.97,19041800,15.98 -2004-07-16,32.80,32.92,32.12,32.20,17442200,16.10 -2004-07-15,32.66,33.63,32.11,32.93,63133000,16.47 -2004-07-14,28.86,29.97,28.74,29.58,29850000,14.79 -2004-07-13,29.25,29.60,29.02,29.22,11292000,14.61 -2004-07-12,30.02,30.04,28.93,29.14,18272200,14.57 -2004-07-09,30.27,30.50,30.03,30.03,7459400,15.02 -2004-07-08,30.13,30.68,29.95,30.14,8335000,15.07 -2004-07-07,30.85,31.36,30.13,30.39,14214000,15.19 -2004-07-06,31.27,31.42,30.80,30.95,12463600,15.48 -2004-07-02,30.48,31.18,29.73,31.08,32524400,15.54 -2004-07-01,32.10,32.48,31.90,32.30,12212200,16.15 -2004-06-30,32.56,32.97,31.89,32.54,13323000,16.27 -2004-06-29,32.07,32.99,31.41,32.50,21091200,16.25 -2004-06-28,34.18,34.19,32.21,32.49,18610600,16.25 -2004-06-25,33.07,33.70,33.00,33.70,11551000,16.85 -2004-06-24,33.51,33.70,32.98,33.18,9018400,16.59 -2004-06-23,33.00,33.83,32.89,33.70,13959600,16.85 -2004-06-22,32.30,33.09,32.29,33.00,12875400,16.50 -2004-06-21,33.12,33.50,32.12,32.33,13936200,16.17 -2004-06-18,32.66,33.41,32.43,32.91,14509000,16.45 -2004-06-17,32.56,33.13,32.21,32.81,19690000,16.41 -2004-06-16,30.66,33.32,30.53,32.74,32487200,16.37 -2004-06-15,30.54,31.14,30.26,30.69,15879800,15.35 -2004-06-14,30.65,30.68,29.50,30.12,8713800,15.06 -2004-06-10,30.20,30.97,30.20,30.74,9199200,15.37 -2004-06-09,30.09,30.71,30.00,30.20,12471600,15.10 -2004-06-08,29.99,30.44,29.83,30.35,14843600,15.18 -2004-06-07,29.04,29.98,28.81,29.81,10567000,14.90 -2004-06-04,28.56,29.25,28.51,28.78,14254000,14.39 -2004-06-03,28.72,28.99,28.29,28.40,8961800,14.20 -2004-06-02,28.03,29.17,27.80,28.92,11382600,14.46 -2004-06-01,27.79,28.20,27.61,28.06,6504800,14.03 -2004-05-28,28.08,28.27,27.80,28.06,5204200,14.03 -2004-05-27,28.46,28.60,27.82,28.17,8427600,14.09 -2004-05-26,28.33,28.78,28.00,28.51,11506000,14.26 -2004-05-25,27.50,28.51,27.29,28.41,11427800,14.20 -2004-05-24,27.29,27.90,27.11,27.34,8414400,13.67 -2004-05-21,26.90,27.20,26.73,27.11,6424800,13.56 -2004-05-20,26.63,27.00,26.47,26.71,7010600,13.35 -2004-05-19,27.40,27.50,26.42,26.47,13414000,13.23 -2004-05-18,26.97,27.29,26.80,27.06,7359400,13.53 -2004-05-17,26.70,27.06,26.36,26.64,10730200,13.32 -2004-05-14,27.25,27.32,26.45,27.06,9207200,13.53 -2004-05-13,27.10,27.72,26.90,27.19,8209000,13.60 -2004-05-12,26.79,27.34,26.24,27.30,8765000,13.65 -2004-05-11,26.40,27.19,26.40,27.14,10899000,13.57 -2004-05-10,26.27,26.60,25.94,26.28,8927800,13.14 -2004-05-07,26.55,27.57,26.55,26.67,14965600,13.34 -2004-05-06,26.40,26.75,25.90,26.58,9412800,13.29 -2004-05-05,26.20,26.75,25.96,26.65,8503800,13.32 -2004-05-04,25.97,26.55,25.50,26.14,9999400,13.07 -2004-05-03,26.00,26.33,25.74,26.07,10629800,13.03 -2004-04-30,26.71,26.96,25.49,25.78,16660800,12.89 -2004-04-29,26.45,27.00,25.98,26.77,16456800,13.39 -2004-04-28,26.82,27.01,26.34,26.45,8256000,13.23 -2004-04-27,27.24,27.44,26.69,26.94,10138000,13.47 -2004-04-26,27.58,27.64,27.00,27.13,8254600,13.56 -2004-04-23,27.70,28.00,27.05,27.70,11279600,13.85 -2004-04-22,27.56,28.18,27.11,27.78,12306600,13.89 -2004-04-21,27.60,28.12,27.37,27.73,11638400,13.86 -2004-04-20,28.21,28.41,27.56,27.73,12661400,13.86 -2004-04-19,28.12,28.75,27.83,28.35,25441200,14.18 -2004-04-16,29.15,29.31,28.50,29.18,14390400,14.59 -2004-04-15,28.82,29.58,28.16,29.30,62908800,14.65 -2004-04-14,26.74,27.07,26.31,26.64,22847600,13.32 -2004-04-13,27.98,28.03,26.84,26.93,15585600,13.47 -2004-04-12,27.50,28.10,27.49,28.04,8233600,14.02 -2004-04-08,27.88,28.00,27.20,27.53,8604200,13.77 -2004-04-07,27.61,27.70,26.92,27.31,9111400,13.65 -2004-04-06,27.71,28.15,27.43,27.83,9214000,13.91 -2004-04-05,27.48,28.37,27.44,28.32,13774000,14.16 -2004-04-02,27.75,27.93,27.23,27.50,9802800,13.75 -2004-04-01,26.89,27.27,26.62,27.11,11369000,13.56 -2004-03-31,27.92,27.98,26.95,27.04,13956200,13.52 -2004-03-30,27.74,27.95,27.34,27.92,12845600,13.96 -2004-03-29,27.37,27.99,27.20,27.91,12526000,13.95 -2004-03-26,27.00,27.36,26.91,27.04,14996200,13.52 -2004-03-25,26.14,26.91,25.89,26.87,20230200,13.44 -2004-03-24,25.27,25.75,25.27,25.50,15293400,12.75 -2004-03-23,25.88,26.00,25.22,25.29,13768400,12.65 -2004-03-22,25.37,26.17,25.25,25.86,14965400,12.93 -2004-03-19,25.56,26.94,25.54,25.86,14592000,12.93 -2004-03-18,25.94,26.06,25.59,25.67,11467200,12.84 -2004-03-17,25.96,26.38,25.78,26.19,14694000,13.10 -2004-03-16,26.55,26.61,25.39,25.82,21622600,12.91 -2004-03-15,27.03,27.35,26.26,26.45,17204200,13.23 -2004-03-12,27.32,27.78,27.17,27.56,11758000,13.78 -2004-03-11,27.27,28.04,27.09,27.15,21280400,13.57 -2004-03-10,27.04,28.14,26.94,27.68,35963000,13.84 -2004-03-09,25.90,27.23,25.75,27.10,22084400,13.55 -2004-03-08,26.62,26.79,25.80,26.00,18674000,13.00 -2004-03-05,24.95,27.49,24.90,26.74,55021400,13.37 -2004-03-04,23.93,25.22,23.91,25.16,23579400,12.58 -2004-03-03,23.60,24.19,23.60,23.92,8040400,11.96 -2004-03-02,24.00,24.10,23.77,23.81,9167400,11.90 -2004-03-01,24.10,24.30,23.87,24.02,11488600,12.01 -2004-02-27,22.96,24.02,22.95,23.92,16744200,11.96 -2004-02-26,22.88,23.18,22.80,23.04,7086000,11.52 -2004-02-25,22.28,22.90,22.21,22.81,9867000,11.40 -2004-02-24,22.14,22.74,22.00,22.36,9252000,11.18 -2004-02-23,22.34,22.46,21.89,22.19,6931400,11.10 -2004-02-20,22.50,22.51,22.21,22.40,9914400,11.20 -2004-02-19,23.33,23.64,22.41,22.47,11538600,11.23 -2004-02-18,23.18,23.44,23.05,23.26,5058400,11.63 -2004-02-17,23.10,23.49,23.10,23.16,6105600,11.58 -2004-02-13,23.85,24.10,22.83,23.00,11285000,11.50 -2004-02-12,23.61,23.99,23.60,23.73,6571000,11.86 -2004-02-11,23.09,23.87,23.05,23.80,12448000,11.90 -2004-02-10,22.62,23.12,22.44,22.98,9119400,11.49 -2004-02-09,22.62,22.86,22.50,22.67,6723600,11.34 -2004-02-06,22.45,22.89,22.40,22.71,6905000,11.35 -2004-02-05,21.82,22.91,21.81,22.42,12601600,11.21 -2004-02-04,22.00,22.09,21.70,21.79,10912600,10.90 -2004-02-03,22.30,22.40,22.00,22.26,6457600,11.13 -2004-02-02,22.46,22.81,22.08,22.32,10265400,11.16 -2004-01-30,22.65,22.87,22.42,22.56,6617800,11.28 -2004-01-29,22.63,22.80,22.19,22.68,7596400,11.34 -2004-01-28,22.84,23.38,22.41,22.52,9835800,11.26 -2004-01-27,23.04,23.25,22.80,23.07,10966800,11.53 -2004-01-26,22.46,23.06,22.43,23.01,9688200,11.51 -2004-01-23,22.42,22.74,22.25,22.56,8113200,11.28 -2004-01-22,22.56,22.83,22.18,22.18,7321600,11.09 -2004-01-21,22.70,22.97,22.43,22.61,8095000,11.31 -2004-01-20,22.67,22.80,22.25,22.73,11283800,11.36 -2004-01-16,22.89,23.04,22.61,22.72,13315000,11.36 -2004-01-15,22.91,23.40,22.50,22.85,36364600,11.43 -2004-01-14,24.40,24.54,23.78,24.20,22144400,12.10 -2004-01-13,24.70,24.84,23.86,24.12,24250600,12.06 -2004-01-12,23.25,24.00,23.10,23.73,17412400,11.86 -2004-01-09,23.23,24.13,22.79,23.00,15266400,11.50 -2004-01-08,22.84,23.73,22.65,23.36,16439400,11.68 -2004-01-07,22.10,22.83,21.93,22.59,20959800,11.30 -2004-01-06,22.25,22.42,21.71,22.09,18191000,11.05 -2004-01-05,21.42,22.39,21.42,22.17,14107800,11.09 -2004-01-02,21.55,21.75,21.18,21.28,5165800,10.64 -2003-12-31,21.35,21.53,21.18,21.37,6230400,10.69 -2003-12-30,21.18,21.50,21.15,21.28,7316200,10.64 -2003-12-29,20.91,21.16,20.86,21.15,8337800,10.57 -2003-12-26,20.35,20.91,20.34,20.78,3703400,10.39 -2003-12-24,19.72,20.59,19.65,20.41,6338400,10.20 -2003-12-23,19.92,19.95,19.60,19.81,11017800,9.90 -2003-12-22,19.65,19.89,19.25,19.85,13466600,9.93 -2003-12-19,20.19,20.42,19.62,19.70,16198600,9.85 -2003-12-18,19.90,20.18,19.90,20.04,11818400,10.02 -2003-12-17,20.08,20.13,19.79,19.88,9795000,9.94 -2003-12-16,20.19,20.49,20.01,20.12,13355600,10.06 -2003-12-15,21.49,21.49,20.07,20.17,13889600,10.09 -2003-12-12,21.32,21.32,20.70,20.89,6881200,10.44 -2003-12-11,20.25,21.34,20.21,21.21,6540600,10.60 -2003-12-10,20.45,20.61,19.96,20.38,9690600,10.19 -2003-12-09,21.17,21.25,20.40,20.45,4826600,10.23 -2003-12-08,20.78,21.08,20.41,21.05,5294200,10.52 -2003-12-05,20.90,21.15,20.73,20.85,6649200,10.43 -2003-12-04,20.94,21.17,20.77,21.15,6355000,10.57 -2003-12-03,21.54,21.84,20.96,21.03,6832000,10.52 -2003-12-02,21.60,21.90,21.41,21.54,7332000,10.77 -2003-12-01,21.04,21.85,21.00,21.71,12912000,10.85 -2003-11-28,20.78,21.07,20.52,20.91,2717800,10.45 -2003-11-26,20.89,21.15,20.25,20.72,8754600,10.36 -2003-11-25,21.23,21.25,20.61,20.68,9594800,10.34 -2003-11-24,20.50,21.27,20.45,21.15,13636600,10.57 -2003-11-21,20.34,20.58,19.85,20.28,8637000,10.14 -2003-11-20,20.10,21.08,20.10,20.38,8556800,10.19 -2003-11-19,20.56,20.65,20.26,20.42,12306600,10.21 -2003-11-18,21.21,21.34,20.35,20.41,9542600,10.20 -2003-11-17,21.35,21.37,20.95,21.13,8152000,10.56 -2003-11-14,22.48,22.61,21.28,21.46,8466000,10.73 -2003-11-13,22.07,22.56,21.92,22.42,7599000,11.21 -2003-11-12,21.48,22.72,21.48,22.33,10714400,11.16 -2003-11-11,21.90,22.02,21.48,21.54,7681200,10.77 -2003-11-10,22.45,22.65,21.84,21.90,8367000,10.95 -2003-11-07,23.19,23.24,22.45,22.50,7505200,11.25 -2003-11-06,22.91,23.15,22.65,23.12,14181200,11.56 -2003-11-05,22.82,23.13,22.47,23.03,11516800,11.52 -2003-11-04,23.07,23.10,22.59,22.91,8901200,11.45 -2003-11-03,22.83,23.30,22.78,23.15,10815800,11.57 -2003-10-31,23.30,23.35,22.78,22.89,7791200,11.44 -2003-10-30,23.99,24.00,22.87,23.09,9305600,11.55 -2003-10-29,23.51,23.90,23.34,23.69,9538600,11.85 -2003-10-28,22.56,23.77,22.40,23.72,8989800,11.86 -2003-10-27,22.75,22.89,22.49,22.60,5786200,11.30 -2003-10-24,22.56,22.85,22.23,22.60,7852000,11.30 -2003-10-23,22.73,23.15,22.59,22.99,5900400,11.49 -2003-10-22,22.94,23.20,22.68,22.76,5771400,11.38 -2003-10-21,23.31,23.40,22.75,23.18,6302200,11.59 -2003-10-20,22.60,23.34,22.38,23.22,9969000,11.61 -2003-10-17,23.38,23.49,22.43,22.75,12850400,11.38 -2003-10-16,23.80,23.84,22.41,23.25,34845800,11.62 -2003-10-15,24.85,25.01,24.58,24.82,21789400,12.41 -2003-10-14,24.32,24.74,24.19,24.55,9836400,12.27 -2003-10-13,23.73,24.41,23.72,24.35,9995200,12.18 -2003-10-10,23.50,23.81,23.37,23.68,6244200,11.84 -2003-10-09,23.30,23.67,22.79,23.45,12419600,11.73 -2003-10-08,23.25,23.54,22.73,23.06,15309600,11.53 -2003-10-07,22.05,23.41,21.91,23.22,14934800,11.61 -2003-10-06,21.67,22.33,21.58,22.29,9583200,11.15 -2003-10-03,20.99,21.86,20.88,21.69,10700000,10.85 -2003-10-02,20.80,20.80,20.28,20.57,7287800,10.28 -2003-10-01,20.71,21.10,20.19,20.79,8432600,10.40 -2003-09-30,21.09,21.22,20.44,20.72,10193800,10.36 -2003-09-29,21.49,21.67,20.65,21.30,13060800,10.65 -2003-09-26,20.30,21.70,20.15,20.69,12401800,10.35 -2003-09-25,21.34,21.37,20.25,20.43,20513600,10.22 -2003-09-24,22.21,22.31,21.08,21.32,10760200,10.66 -2003-09-23,22.02,22.46,21.88,22.43,4730400,11.22 -2003-09-22,22.18,22.50,21.92,22.08,6422200,11.04 -2003-09-19,22.88,23.05,22.43,22.58,7355600,11.29 -2003-09-18,22.10,22.99,21.95,22.88,9032400,11.44 -2003-09-17,22.37,22.38,21.85,22.12,10335600,11.06 -2003-09-16,22.21,22.69,22.20,22.36,9607400,11.18 -2003-09-15,22.81,22.90,22.12,22.21,8101600,11.10 -2003-09-12,22.51,23.14,22.31,23.10,6428200,11.55 -2003-09-11,22.25,22.79,22.10,22.56,7631600,11.28 -2003-09-10,22.25,22.61,22.11,22.18,8031800,11.09 -2003-09-09,22.53,22.67,22.12,22.37,6441800,11.19 -2003-09-08,22.48,22.79,22.47,22.74,5973000,11.37 -2003-09-05,22.73,23.15,22.41,22.50,8576200,11.25 -2003-09-04,23.16,23.25,22.77,22.83,7135000,11.41 -2003-09-03,22.80,23.32,22.76,22.95,9601000,11.48 -2003-09-02,22.66,22.90,22.40,22.85,8647600,11.43 -2003-08-29,22.20,22.85,22.05,22.61,9398400,11.31 -2003-08-28,21.33,22.22,21.33,22.19,11415200,11.10 -2003-08-27,20.91,21.48,20.66,21.48,8060800,10.74 -2003-08-26,20.75,21.07,20.35,21.05,5891400,10.52 -2003-08-25,20.78,20.91,20.49,20.86,4920800,10.43 -2003-08-22,21.81,22.00,20.64,20.88,8938000,10.44 -2003-08-21,21.03,21.71,20.95,21.68,9118800,10.84 -2003-08-20,20.18,21.27,20.14,21.01,9757600,10.51 -2003-08-19,20.37,20.45,20.00,20.32,4774600,10.16 -2003-08-18,19.86,20.41,19.72,20.34,6884800,10.17 -2003-08-15,20.02,20.07,19.66,19.71,4495200,9.85 -2003-08-14,20.21,20.33,19.94,19.97,6885000,9.98 -2003-08-13,19.86,20.34,19.58,20.18,10146400,10.09 -2003-08-12,19.76,19.80,19.46,19.70,5872800,9.85 -2003-08-11,19.82,19.93,19.51,19.66,4901000,9.83 -2003-08-08,20.11,20.13,19.60,19.64,4916400,9.82 -2003-08-07,19.73,20.09,19.42,19.93,6227800,9.97 -2003-08-06,20.06,20.17,19.50,19.63,8766600,9.81 -2003-08-05,21.35,21.40,20.10,20.38,8908600,10.19 -2003-08-04,20.53,21.50,20.28,21.21,8218400,10.60 -2003-08-01,21.00,21.27,20.64,20.73,5343000,10.36 -2003-07-31,20.74,21.35,20.57,21.08,10766600,10.54 -2003-07-30,20.77,20.90,20.17,20.28,6199800,10.14 -2003-07-29,20.99,21.08,20.52,20.72,7040000,10.36 -2003-07-28,21.50,21.50,20.86,20.99,6084200,10.49 -2003-07-25,20.41,21.57,20.40,21.54,7738800,10.77 -2003-07-24,21.04,21.50,20.38,20.51,8187000,10.26 -2003-07-23,20.95,20.96,20.46,20.79,5108400,10.40 -2003-07-22,20.87,20.96,20.50,20.80,7086600,10.40 -2003-07-21,20.69,20.80,20.30,20.61,6564600,10.31 -2003-07-18,20.90,21.18,20.40,20.86,10672800,10.43 -2003-07-17,20.19,20.95,20.13,20.90,26829000,10.45 -2003-07-16,19.97,20.00,19.38,19.87,8961800,9.94 -2003-07-15,20.02,20.24,19.43,19.61,7380200,9.81 -2003-07-14,20.01,20.40,19.87,19.90,6728800,9.95 -2003-07-11,19.66,20.00,19.53,19.85,4887800,9.93 -2003-07-10,19.88,19.94,19.37,19.58,6104800,9.79 -2003-07-09,20.21,20.45,19.89,19.89,7630200,9.94 -2003-07-08,19.52,20.50,19.49,20.40,9169200,10.20 -2003-07-07,19.27,20.18,19.13,19.87,10224000,9.94 -2003-07-03,19.00,19.55,18.98,19.13,4920400,9.56 -2003-07-02,19.03,19.40,19.02,19.27,11617800,9.64 -2003-07-01,18.87,19.18,18.51,19.09,6464000,9.55 -2003-06-30,18.68,19.21,18.59,19.06,7934000,9.53 -2003-06-27,19.30,19.31,18.48,18.73,13064000,9.36 -2003-06-26,18.70,19.32,18.70,19.29,5775200,9.65 -2003-06-25,18.86,19.40,18.71,19.09,11779000,9.55 -2003-06-24,19.47,19.67,18.72,18.78,18370800,9.39 -2003-06-23,19.30,19.69,18.75,19.06,10977200,9.53 -2003-06-20,19.35,19.58,18.90,19.20,12733800,9.60 -2003-06-19,19.36,19.61,18.77,19.14,13626000,9.57 -2003-06-18,18.45,19.48,18.31,19.12,16249400,9.56 -2003-06-17,18.41,18.50,17.99,18.19,6338000,9.10 -2003-06-16,17.60,18.27,17.45,18.27,8518800,9.14 -2003-06-13,17.75,17.95,17.13,17.42,6830200,8.71 -2003-06-12,17.55,17.88,17.45,17.77,9021000,8.89 -2003-06-11,17.15,17.51,16.81,17.45,8039800,8.73 -2003-06-10,16.89,17.29,16.75,17.18,6308800,8.59 -2003-06-09,16.94,17.04,16.63,16.79,9284000,8.40 -2003-06-06,17.74,18.04,17.14,17.15,8621000,8.57 -2003-06-05,17.45,17.74,17.33,17.64,7339200,8.82 -2003-06-04,17.30,17.79,17.14,17.60,9685800,8.80 -2003-06-03,17.44,17.67,17.02,17.31,12887800,8.65 -2003-06-02,18.10,18.29,17.27,17.45,14949600,8.73 -2003-05-30,18.12,18.18,17.53,17.95,13669600,8.98 -2003-05-29,18.29,18.50,17.90,18.10,11920200,9.05 -2003-05-28,18.50,18.66,18.15,18.28,12131400,9.14 -2003-05-27,17.96,18.90,17.91,18.88,10361800,9.44 -2003-05-23,18.21,18.46,17.96,18.32,7382800,9.16 -2003-05-22,17.89,18.40,17.74,18.24,6373600,9.12 -2003-05-21,17.79,18.09,17.67,17.85,10893200,8.93 -2003-05-20,18.10,18.16,17.60,17.79,14865000,8.90 -2003-05-19,18.53,18.65,18.06,18.10,15924600,9.05 -2003-05-16,18.59,19.01,18.28,18.80,12201000,9.40 -2003-05-15,18.60,18.85,18.47,18.73,10178400,9.36 -2003-05-14,18.83,18.84,18.43,18.55,12696000,9.27 -2003-05-13,18.43,18.97,17.95,18.67,15957000,9.34 -2003-05-12,18.15,18.74,18.13,18.56,14977600,9.28 -2003-05-09,18.33,18.40,17.88,18.30,21013800,9.15 -2003-05-08,17.70,18.07,17.29,18.00,24562000,9.00 -2003-05-07,17.33,18.24,17.11,17.65,37656400,8.82 -2003-05-06,16.12,17.90,16.10,17.50,54089000,8.75 -2003-05-05,14.77,16.88,14.75,16.09,55561000,8.05 -2003-05-02,14.46,14.59,14.34,14.45,11470800,7.22 -2003-05-01,14.25,14.39,14.00,14.36,12241400,7.18 -2003-04-30,13.93,14.35,13.85,14.22,16363400,7.11 -2003-04-29,13.98,14.16,13.58,14.06,16365600,7.03 -2003-04-28,13.48,13.96,13.43,13.86,22742800,6.93 -2003-04-25,13.46,13.58,13.23,13.35,7332800,6.68 -2003-04-24,13.52,13.61,13.00,13.44,11611000,6.72 -2003-04-23,13.53,13.63,13.36,13.58,7488600,6.79 -2003-04-22,13.18,13.62,13.09,13.51,10734600,6.76 -2003-04-21,13.13,13.19,12.98,13.14,5440000,6.57 -2003-04-17,13.20,13.25,12.72,13.12,22009200,6.56 -2003-04-16,12.99,13.67,12.92,13.24,36292000,6.62 -2003-04-15,13.59,13.60,13.30,13.39,10856000,6.70 -2003-04-14,13.71,13.75,13.50,13.58,17962800,6.79 -2003-04-11,14.05,14.44,12.93,13.20,49739600,6.60 -2003-04-10,14.20,14.39,14.20,14.37,3825000,7.18 -2003-04-09,14.52,14.62,14.14,14.19,5240200,7.09 -2003-04-08,14.51,14.65,14.36,14.45,4604800,7.22 -2003-04-07,14.85,14.95,14.41,14.49,7030800,7.24 -2003-04-04,14.52,14.67,14.39,14.41,5215000,7.20 -2003-04-03,14.56,14.70,14.35,14.46,5204000,7.23 -2003-04-02,14.36,14.69,14.27,14.60,6120400,7.30 -2003-04-01,14.20,14.31,14.07,14.16,5512200,7.08 -2003-03-31,14.33,14.53,14.04,14.14,9166400,7.07 -2003-03-28,14.40,14.62,14.37,14.57,5189400,7.28 -2003-03-27,14.32,14.70,14.32,14.49,4371200,7.24 -2003-03-26,14.55,14.56,14.30,14.41,6369400,7.20 -2003-03-25,14.41,14.83,14.37,14.55,5989200,7.28 -2003-03-24,14.67,14.80,14.35,14.37,5753600,7.18 -2003-03-21,15.09,15.15,14.82,15.00,10641000,7.50 -2003-03-20,14.93,14.99,14.60,14.91,5827800,7.45 -2003-03-19,15.07,15.15,14.79,14.95,5047000,7.47 -2003-03-18,15.00,15.09,14.82,15.00,8213600,7.50 -2003-03-17,14.89,15.07,14.71,15.01,14282600,7.51 -2003-03-14,14.68,15.01,14.64,14.78,5467800,7.39 -2003-03-13,14.47,14.80,14.17,14.72,11980200,7.36 -2003-03-12,14.17,14.39,14.06,14.22,7948600,7.11 -2003-03-11,14.36,14.49,14.12,14.23,5756800,7.11 -2003-03-10,14.51,14.67,14.30,14.37,4806200,7.18 -2003-03-07,14.47,14.71,14.31,14.53,7178000,7.26 -2003-03-06,14.58,14.60,14.40,14.56,3566400,7.28 -2003-03-05,14.61,14.80,14.52,14.62,4524400,7.31 -2003-03-04,14.74,14.81,14.44,14.56,4514800,7.28 -2003-03-03,15.01,15.16,14.55,14.65,7277200,7.32 -2003-02-28,14.86,15.09,14.77,15.01,6967800,7.51 -2003-02-27,14.57,15.00,14.51,14.86,5512200,7.43 -2003-02-26,14.99,15.02,14.48,14.50,7753400,7.25 -2003-02-25,14.68,15.08,14.58,15.02,6737200,7.51 -2003-02-24,14.86,15.03,13.80,14.74,6437600,7.37 -2003-02-21,14.82,15.06,14.65,15.00,5623000,7.50 -2003-02-20,14.85,14.96,14.71,14.77,8012600,7.39 -2003-02-19,15.07,15.15,14.68,14.85,8584600,7.43 -2003-02-18,14.75,15.30,14.72,15.27,10389200,7.64 -2003-02-14,14.61,14.72,14.35,14.67,8689200,7.34 -2003-02-13,14.41,14.64,14.24,14.54,7446200,7.27 -2003-02-12,14.27,14.60,14.27,14.39,8167400,7.20 -2003-02-11,14.50,14.63,14.20,14.35,5885000,7.18 -2003-02-10,14.26,14.57,14.06,14.35,5996000,7.18 -2003-02-07,14.55,14.60,14.07,14.15,9632200,7.07 -2003-02-06,14.36,14.59,14.22,14.43,6398200,7.22 -2003-02-05,14.71,14.93,14.44,14.45,7914800,7.22 -2003-02-04,14.45,14.65,14.31,14.60,11336200,7.30 -2003-02-03,14.41,14.91,14.35,14.66,9456600,7.33 -2003-01-31,14.19,14.55,14.05,14.36,12186600,7.18 -2003-01-30,14.98,15.07,14.29,14.32,14537800,7.16 -2003-01-29,14.55,15.10,14.30,14.93,13323000,7.47 -2003-01-28,14.24,14.69,14.16,14.58,10223400,7.29 -2003-01-27,13.68,14.50,13.65,14.13,13978800,7.07 -2003-01-24,14.24,14.24,13.56,13.80,10909600,6.90 -2003-01-23,14.05,14.36,13.95,14.17,8152000,7.09 -2003-01-22,13.98,14.15,13.80,13.88,7683600,6.94 -2003-01-21,14.21,14.41,14.00,14.02,9052000,7.01 -2003-01-17,14.56,14.56,14.08,14.10,9527200,7.05 -2003-01-16,14.21,14.76,14.21,14.62,19966800,7.31 -2003-01-15,14.59,14.70,14.26,14.43,13254600,7.22 -2003-01-14,14.69,14.82,14.49,14.61,6673600,7.30 -2003-01-13,14.90,14.90,14.36,14.63,6390800,7.32 -2003-01-10,14.58,14.82,14.49,14.72,6253600,7.36 -2003-01-09,14.62,14.92,14.50,14.68,7687600,7.34 -2003-01-08,14.58,14.71,14.44,14.55,8201600,7.28 -2003-01-07,14.79,15.00,14.47,14.85,12226600,7.43 -2003-01-06,15.03,15.38,14.88,14.90,13947600,7.45 -2003-01-03,14.80,14.93,14.59,14.90,5266200,7.45 -2003-01-02,14.36,14.92,14.35,14.80,6479600,7.40 -2002-12-31,14.00,14.36,13.95,14.33,7168800,7.16 -2002-12-30,14.08,14.15,13.84,14.07,5537200,7.03 -2002-12-27,14.31,14.38,14.01,14.06,2858400,7.03 -2002-12-26,14.42,14.81,14.28,14.40,3050800,7.20 -2002-12-24,14.44,14.47,14.30,14.36,1405000,7.18 -2002-12-23,14.16,14.55,14.12,14.49,4493800,7.24 -2002-12-20,14.29,14.56,13.78,14.14,11360600,7.07 -2002-12-19,14.53,14.92,14.10,14.20,12411400,7.10 -2002-12-18,14.80,14.86,14.50,14.57,5382200,7.28 -2002-12-17,14.85,15.19,14.66,15.08,7952200,7.54 -2002-12-16,14.81,15.10,14.61,14.85,8986600,7.43 -2002-12-13,15.14,15.15,14.65,14.79,5885000,7.39 -2002-12-12,15.51,15.55,15.01,15.19,5333600,7.59 -2002-12-11,15.30,15.49,15.08,15.49,9053600,7.74 -2002-12-10,14.75,15.45,14.73,15.28,11021800,7.64 -2002-12-09,14.94,14.95,14.67,14.75,8431600,7.38 -2002-12-06,14.65,15.19,14.52,14.95,8762800,7.47 -2002-12-05,15.03,15.08,14.53,14.63,8692800,7.32 -2002-12-04,15.18,15.19,14.50,14.97,11634200,7.49 -2002-12-03,15.20,15.34,15.10,15.16,8138200,7.58 -2002-12-02,15.90,16.10,15.01,15.18,14240800,7.59 -2002-11-29,15.79,15.88,15.41,15.50,5122600,7.75 -2002-11-27,15.60,15.86,15.45,15.72,10242800,7.86 -2002-11-26,15.85,15.90,15.27,15.41,8580800,7.70 -2002-11-25,16.03,16.14,15.71,15.97,7122400,7.99 -2002-11-22,16.09,16.30,15.90,16.01,8137800,8.01 -2002-11-21,15.90,16.44,15.75,16.35,14945800,8.18 -2002-11-20,15.30,15.70,15.25,15.53,7455000,7.76 -2002-11-19,15.55,15.75,15.01,15.27,7534000,7.64 -2002-11-18,16.19,16.20,15.52,15.65,5877800,7.82 -2002-11-15,16.23,16.24,15.76,15.95,5749800,7.97 -2002-11-14,15.90,16.41,15.78,16.30,5061200,8.15 -2002-11-13,15.50,16.07,15.28,15.59,8276400,7.80 -2002-11-12,15.32,16.04,15.28,15.64,7992600,7.82 -2002-11-11,15.74,15.89,15.12,15.16,5463400,7.58 -2002-11-08,16.01,16.20,15.52,15.84,6788000,7.92 -2002-11-07,16.94,17.10,15.81,16.00,12006400,8.00 -2002-11-06,17.08,17.32,16.70,17.22,7728200,8.61 -2002-11-05,16.75,16.96,16.35,16.90,7524800,8.45 -2002-11-04,16.50,17.38,16.35,16.89,13457800,8.44 -2002-11-01,15.94,16.50,15.89,16.36,6779600,8.18 -2002-10-31,15.99,16.44,15.92,16.07,10565600,8.03 -2002-10-30,15.49,16.37,15.48,15.98,9667000,7.99 -2002-10-29,15.57,15.88,14.96,15.44,9256400,7.72 -2002-10-28,15.55,15.95,15.25,15.61,12475000,7.80 -2002-10-25,14.69,15.45,14.59,15.42,9966800,7.71 -2002-10-24,15.02,15.21,14.55,14.69,6241000,7.34 -2002-10-23,14.63,14.98,14.50,14.88,7465600,7.44 -2002-10-22,14.47,14.88,14.26,14.70,7791000,7.35 -2002-10-21,14.26,14.63,14.00,14.56,8518600,7.28 -2002-10-18,14.00,14.35,13.93,14.34,10296400,7.17 -2002-10-17,14.21,14.38,13.98,14.11,16760600,7.05 -2002-10-16,14.86,15.13,13.90,14.56,10986600,7.28 -2002-10-15,15.22,15.25,14.78,15.16,14482800,7.58 -2002-10-14,14.55,14.98,14.44,14.77,6943000,7.39 -2002-10-11,14.25,14.78,14.10,14.51,10524200,7.26 -2002-10-10,13.63,14.22,13.58,14.11,11484800,7.05 -2002-10-09,13.54,13.85,13.41,13.59,12738800,6.80 -2002-10-08,13.90,13.96,13.36,13.68,16201600,6.84 -2002-10-07,13.97,14.21,13.76,13.77,8739200,6.89 -2002-10-04,14.36,14.40,13.99,14.03,6815200,7.01 -2002-10-03,14.18,14.60,14.06,14.30,7782000,7.15 -2002-10-02,14.33,14.63,14.10,14.17,8191000,7.09 -2002-10-01,14.59,14.60,14.00,14.51,12229400,7.26 -2002-09-30,14.40,14.57,14.14,14.50,8489200,7.25 -2002-09-27,14.49,14.85,14.48,14.72,7362600,7.36 -2002-09-26,15.10,15.19,14.55,14.70,7451600,7.35 -2002-09-25,14.69,15.17,14.65,14.93,9095800,7.47 -2002-09-24,14.40,14.82,14.40,14.64,8952200,7.32 -2002-09-23,14.76,14.96,14.45,14.85,9418200,7.43 -2002-09-20,14.62,14.94,14.52,14.87,12599600,7.43 -2002-09-19,14.75,14.80,14.48,14.58,7355200,7.29 -2002-09-18,14.69,15.09,14.52,15.02,11737200,7.51 -2002-09-17,14.57,15.03,14.57,14.80,15285600,7.40 -2002-09-16,14.14,14.61,14.12,14.50,10237200,7.25 -2002-09-13,14.13,14.34,14.05,14.17,10105400,7.09 -2002-09-12,14.20,14.51,14.12,14.14,9636800,7.07 -2002-09-11,14.34,14.60,14.15,14.29,7229000,7.14 -2002-09-10,14.41,14.49,14.12,14.33,8909600,7.16 -2002-09-09,14.28,14.53,14.15,14.37,5651600,7.18 -2002-09-06,14.51,14.65,14.23,14.38,6485400,7.19 -2002-09-05,14.22,14.36,14.05,14.18,8077800,7.09 -2002-09-04,14.20,14.78,14.17,14.48,15023600,7.24 -2002-09-03,14.49,14.55,14.05,14.05,9890600,7.03 -2002-08-30,14.73,15.14,14.58,14.75,6911400,7.38 -2002-08-29,14.65,15.08,14.51,14.70,5863200,7.35 -2002-08-28,14.80,15.12,14.65,14.70,8856200,7.35 -2002-08-27,15.71,15.74,14.71,14.85,9365400,7.43 -2002-08-26,15.95,15.95,15.16,15.53,6784600,7.76 -2002-08-23,15.90,15.93,15.45,15.73,5830200,7.86 -2002-08-22,16.20,16.25,15.66,15.97,9225400,7.99 -2002-08-21,16.01,16.24,15.45,16.12,7229600,8.06 -2002-08-20,15.97,16.09,15.53,15.91,6665200,7.95 -2002-08-19,15.78,16.25,15.72,15.98,7734200,7.99 -2002-08-16,15.45,16.10,15.28,15.81,8758000,7.91 -2002-08-15,15.25,15.75,15.01,15.61,11502800,7.80 -2002-08-14,14.67,15.35,14.54,15.17,14253000,7.59 -2002-08-13,14.90,15.21,14.55,14.59,9638200,7.30 -2002-08-12,14.90,15.02,14.69,14.99,6420200,7.49 -2002-08-09,15.25,15.25,14.75,15.00,7347000,7.50 -2002-08-08,14.77,15.38,14.77,15.30,8119600,7.65 -2002-08-07,15.09,15.36,14.35,15.03,11909800,7.51 -2002-08-06,14.21,15.23,14.08,14.74,9716200,7.37 -2002-08-05,14.51,14.70,13.97,13.99,7286600,6.99 -2002-08-02,14.74,15.00,14.25,14.45,6395000,7.22 -2002-08-01,15.11,15.42,14.73,14.80,8177000,7.40 -2002-07-31,15.40,15.42,14.90,15.26,11096400,7.63 -2002-07-30,14.85,15.51,14.56,15.43,12672800,7.72 -2002-07-29,14.48,15.10,14.37,15.02,9820000,7.51 -2002-07-26,14.46,14.53,13.80,14.34,7418000,7.17 -2002-07-25,14.93,14.95,14.01,14.36,17119800,7.18 -2002-07-24,14.33,15.22,14.25,15.20,14521200,7.60 -2002-07-23,14.90,15.13,14.44,14.47,14281800,7.24 -2002-07-22,14.75,15.19,14.61,14.92,15389200,7.46 -2002-07-19,14.70,15.17,14.53,14.96,13757400,7.48 -2002-07-18,15.50,15.56,14.75,14.99,19980800,7.49 -2002-07-17,16.13,16.20,15.19,15.63,43410200,7.82 -2002-07-16,18.15,18.57,17.61,17.86,15956000,8.93 -2002-07-15,17.43,18.60,16.81,18.23,10571200,9.11 -2002-07-12,18.55,18.79,17.26,17.51,15839000,8.76 -2002-07-11,17.26,18.35,16.97,18.30,13345600,9.15 -2002-07-10,17.71,18.17,17.25,17.32,7388600,8.66 -2002-07-09,18.09,18.29,17.46,17.53,8098200,8.77 -2002-07-08,18.52,18.61,17.68,18.01,7543000,9.01 -2002-07-05,17.71,18.75,17.71,18.74,5773200,9.37 -2002-07-03,16.81,17.68,16.75,17.55,7108200,8.77 -2002-07-02,17.03,17.16,16.83,16.94,10899600,8.47 -2002-07-01,17.71,17.88,17.05,17.06,7953200,8.53 -2002-06-28,17.10,17.82,17.00,17.72,9637800,8.86 -2002-06-27,16.79,17.27,16.42,17.06,8987800,8.53 -2002-06-26,16.80,17.29,15.98,16.55,19962600,8.27 -2002-06-25,17.40,17.68,16.86,17.14,10757200,8.57 -2002-06-24,16.77,17.73,16.70,17.27,15426200,8.64 -2002-06-21,16.97,17.49,16.79,16.85,15899200,8.43 -2002-06-20,17.17,17.60,16.85,17.11,14165600,8.56 -2002-06-19,17.37,17.60,16.88,17.12,61052400,8.56 -2002-06-18,20.42,20.59,19.98,20.15,12620000,10.07 -2002-06-17,20.24,20.63,19.85,20.54,11593200,10.27 -2002-06-14,19.24,20.36,18.11,20.10,15175000,10.05 -2002-06-13,20.02,20.05,19.38,19.54,12574400,9.77 -2002-06-12,20.41,20.75,19.94,20.09,18882800,10.05 -2002-06-11,21.64,21.70,20.41,20.46,12482000,10.23 -2002-06-10,21.48,21.84,21.34,21.48,9913400,10.74 -2002-06-07,21.76,21.94,20.93,21.40,21870600,10.70 -2002-06-06,22.96,23.23,22.04,22.16,9285600,11.08 -2002-06-05,22.83,22.83,22.35,22.72,9895800,11.36 -2002-06-04,22.88,23.04,22.18,22.78,12422200,11.39 -2002-06-03,23.39,23.45,22.58,22.91,8396800,11.45 -2002-05-31,24.09,24.25,23.28,23.30,13053400,11.65 -2002-05-30,23.77,24.38,23.51,24.20,7013400,12.10 -2002-05-29,23.92,24.44,23.45,23.98,7921200,11.99 -2002-05-28,23.69,24.20,23.43,23.98,5347000,11.99 -2002-05-24,24.99,24.99,23.96,24.15,5934800,12.07 -2002-05-23,24.45,25.24,24.07,25.18,13192800,12.59 -2002-05-22,23.37,24.37,23.32,24.32,10388400,12.16 -2002-05-21,24.83,25.00,23.40,23.46,10035400,11.73 -2002-05-20,24.57,24.93,24.53,24.74,9639800,12.37 -2002-05-17,25.49,25.78,24.61,25.01,8446200,12.51 -2002-05-16,25.06,25.45,24.75,25.21,8109000,12.60 -2002-05-15,25.37,25.98,24.84,25.28,11993800,12.64 -2002-05-14,24.45,25.68,24.22,25.61,18803800,12.81 -2002-05-13,23.52,24.09,22.94,23.94,9486000,11.97 -2002-05-10,24.29,24.29,22.98,23.32,8407000,11.66 -2002-05-09,24.25,24.35,23.80,24.19,8022000,12.10 -2002-05-08,23.20,24.52,23.04,24.37,15595800,12.19 -2002-05-07,22.94,22.95,22.14,22.47,8669600,11.23 -2002-05-06,23.35,23.50,22.46,22.65,8916600,11.32 -2002-05-03,23.57,24.02,23.43,23.51,8242200,11.76 -2002-05-02,23.81,24.34,23.60,23.69,8548000,11.85 -2002-05-01,24.29,24.29,23.36,23.98,7668000,11.99 -2002-04-30,23.89,24.38,23.75,24.27,10034400,12.14 -2002-04-29,23.16,24.06,23.09,23.96,9724600,11.98 -2002-04-26,24.28,24.37,23.00,23.01,10892200,11.51 -2002-04-25,23.56,24.34,23.55,24.12,6935800,12.06 -2002-04-24,24.30,24.50,23.68,23.77,5016000,11.89 -2002-04-23,24.54,24.78,24.09,24.25,8338200,12.12 -2002-04-22,24.84,24.93,24.23,24.53,9622400,12.27 -2002-04-19,25.49,25.49,24.93,24.98,13407400,12.49 -2002-04-18,25.50,25.52,24.88,25.41,14346800,12.70 -2002-04-17,25.93,26.17,25.38,26.11,14151800,13.06 -2002-04-16,25.15,25.99,25.12,25.74,21949200,12.87 -2002-04-15,25.06,25.15,24.80,25.00,10691800,12.50 -2002-04-12,25.01,25.17,24.57,25.06,11437200,12.53 -2002-04-11,25.03,25.20,24.75,24.86,14544800,12.43 -2002-04-10,24.21,24.95,24.01,24.66,8035000,12.33 -2002-04-09,24.59,25.00,24.01,24.10,6840400,12.05 -2002-04-08,24.16,24.68,23.78,24.56,9339800,12.28 -2002-04-05,24.95,25.19,24.10,24.74,9941000,12.37 -2002-04-04,23.67,25.05,23.67,24.90,12089200,12.45 -2002-04-03,24.05,24.49,23.60,23.75,7661800,11.88 -2002-04-02,24.00,24.30,23.87,24.07,7278400,12.03 -2002-04-01,23.38,24.70,23.28,24.46,7108800,12.23 -2002-03-28,23.70,23.88,23.46,23.67,3873400,11.84 -2002-03-27,23.35,23.72,23.26,23.47,4560800,11.73 -2002-03-26,23.20,23.64,23.00,23.46,9208600,11.73 -2002-03-25,24.07,24.09,23.24,23.35,9386800,11.68 -2002-03-22,24.22,24.56,23.87,24.09,7221200,12.05 -2002-03-21,23.86,24.30,23.26,24.27,22012600,12.14 -2002-03-20,24.66,25.14,24.50,24.92,10511400,12.46 -2002-03-19,24.69,25.30,24.30,24.85,8655200,12.43 -2002-03-18,24.95,25.05,24.32,24.74,10877000,12.37 -2002-03-15,24.46,24.96,24.25,24.95,8603600,12.48 -2002-03-14,24.30,24.60,23.87,24.43,7760600,12.22 -2002-03-13,24.37,24.85,24.15,24.49,7170200,12.24 -2002-03-12,24.51,24.74,24.10,24.72,9073400,12.36 -2002-03-11,24.60,25.14,24.10,25.06,9385200,12.53 -2002-03-08,24.74,25.09,24.30,24.66,9634800,12.33 -2002-03-07,24.06,24.53,23.61,24.38,9223200,12.19 -2002-03-06,23.48,24.34,22.93,24.07,8078800,12.03 -2002-03-05,24.15,24.43,23.40,23.53,9810800,11.77 -2002-03-04,23.26,24.58,22.76,24.29,12437800,12.15 -2002-03-01,21.93,23.50,21.82,23.45,12464000,11.73 -2002-02-28,22.15,22.59,21.35,21.70,16319200,10.85 -2002-02-27,23.94,24.25,20.94,21.96,36791400,10.98 -2002-02-26,23.91,24.37,23.25,23.67,9290400,11.84 -2002-02-25,22.85,24.72,22.36,23.81,15244600,11.90 -2002-02-22,21.66,22.95,21.50,22.74,14517000,11.37 -2002-02-21,22.92,23.00,21.45,21.50,15955400,10.75 -2002-02-20,22.77,23.20,22.35,23.13,10194400,11.56 -2002-02-19,23.76,23.87,22.48,22.62,13937800,11.31 -2002-02-15,24.53,24.98,23.85,23.90,9292400,11.95 -2002-02-14,25.05,25.23,24.38,24.60,9291800,12.30 -2002-02-13,24.73,25.24,24.65,25.01,11174000,12.51 -2002-02-12,24.66,25.04,24.45,24.71,8010000,12.35 -2002-02-11,23.93,25.00,23.74,24.98,14235800,12.49 -2002-02-08,24.40,24.64,23.37,24.03,12690400,12.02 -2002-02-07,24.65,25.29,24.08,24.30,12422600,12.15 -2002-02-06,25.60,25.98,24.15,24.67,21342000,12.34 -2002-02-05,25.09,25.98,25.08,25.45,16317400,12.73 -2002-02-04,24.32,25.52,24.20,25.35,18656200,12.68 -2002-02-01,24.34,24.96,24.34,24.41,14225200,12.20 -2002-01-31,24.16,24.73,24.11,24.72,16730200,12.36 -2002-01-30,23.07,24.14,22.94,24.09,16842000,12.05 -2002-01-29,23.22,23.54,22.85,23.07,8583000,11.53 -2002-01-28,23.40,23.55,22.72,23.27,6658800,11.64 -2002-01-25,22.89,23.42,22.66,23.25,6639800,11.62 -2002-01-24,22.91,23.51,22.90,23.21,12285800,11.60 -2002-01-23,21.80,23.04,21.59,23.02,15831400,11.51 -2002-01-22,22.27,22.37,21.82,21.82,11689800,10.91 -2002-01-18,22.00,22.60,21.96,22.17,12100400,11.09 -2002-01-17,21.96,22.74,21.87,22.48,23592000,11.24 -2002-01-16,21.41,21.41,20.50,20.78,20246200,10.39 -2002-01-15,21.32,21.76,21.21,21.70,10368600,10.85 -2002-01-14,21.01,21.40,20.90,21.15,14857000,10.57 -2002-01-11,21.39,21.84,20.60,21.05,12457200,10.52 -2002-01-10,21.22,21.46,20.25,21.23,16169200,10.61 -2002-01-09,22.80,22.93,21.28,21.65,11708400,10.82 -2002-01-08,22.75,23.05,22.46,22.61,16072800,11.31 -2002-01-07,23.72,24.00,22.75,22.90,15878000,11.45 -2002-01-04,23.34,23.95,22.99,23.69,14642000,11.85 -2002-01-03,23.00,23.75,22.77,23.58,21857400,11.79 -2002-01-02,22.05,23.30,21.96,23.30,18910600,11.65 -2001-12-31,22.51,22.66,21.83,21.90,4920800,10.95 -2001-12-28,21.97,23.00,21.96,22.43,10683000,11.22 -2001-12-27,21.58,22.25,21.58,22.07,6839600,11.03 -2001-12-26,21.35,22.30,21.14,21.49,5228600,10.74 -2001-12-24,20.90,21.45,20.90,21.36,1808200,10.68 -2001-12-21,21.01,21.54,20.80,21.00,9154800,10.50 -2001-12-20,21.40,21.47,20.62,20.67,7888000,10.34 -2001-12-19,20.58,21.68,20.47,21.62,10355600,10.81 -2001-12-18,20.89,21.33,20.22,21.01,8401400,10.51 -2001-12-17,20.40,21.00,20.19,20.62,6204000,10.31 -2001-12-14,20.73,20.83,20.09,20.39,6781600,10.19 -2001-12-13,21.49,21.55,20.50,21.00,7065800,10.50 -2001-12-12,21.87,21.92,21.25,21.49,6873600,10.74 -2001-12-11,22.67,22.85,21.65,21.78,7338400,10.89 -2001-12-10,22.29,22.99,22.23,22.54,6071800,11.27 -2001-12-07,22.46,22.71,22.00,22.54,7268400,11.27 -2001-12-06,23.48,23.50,22.14,22.78,12104800,11.39 -2001-12-05,22.36,24.03,22.17,23.76,20306400,11.88 -2001-12-04,21.05,22.56,20.72,22.40,13586400,11.20 -2001-12-03,21.06,21.28,20.60,21.05,6470200,10.52 -2001-11-30,20.47,21.44,20.25,21.30,10854000,10.65 -2001-11-29,20.60,20.70,20.19,20.42,7241600,10.21 -2001-11-28,20.85,21.21,20.41,20.53,8950400,10.27 -2001-11-27,21.20,21.52,20.50,21.00,9591200,10.50 -2001-11-26,19.94,21.55,19.88,21.37,16453200,10.69 -2001-11-23,19.71,19.95,19.57,19.84,2143000,9.92 -2001-11-21,19.61,19.80,19.26,19.68,7199400,9.84 -2001-11-20,19.82,20.20,19.50,19.53,9878000,9.77 -2001-11-19,19.00,20.05,18.96,20.00,11878200,10.00 -2001-11-16,19.27,19.29,18.40,18.97,8238000,9.48 -2001-11-15,19.45,19.90,19.23,19.45,7608200,9.73 -2001-11-14,19.59,19.90,19.15,19.61,7898200,9.81 -2001-11-13,19.08,19.39,18.71,19.37,8024000,9.69 -2001-11-12,18.66,19.17,17.96,18.75,7196400,9.38 -2001-11-09,18.60,19.25,18.55,18.71,4796200,9.35 -2001-11-08,19.63,19.89,18.57,18.71,12219400,9.35 -2001-11-07,19.46,20.13,19.33,19.59,13678200,9.80 -2001-11-06,18.96,19.62,18.53,19.57,11286400,9.78 -2001-11-05,18.84,19.25,18.61,19.07,8421200,9.53 -2001-11-02,18.52,18.86,18.16,18.57,7043000,9.28 -2001-11-01,17.65,18.78,17.25,18.59,11178400,9.30 -2001-10-31,17.73,18.40,17.44,17.56,9776800,8.78 -2001-10-30,17.38,18.00,17.06,17.60,9884400,8.80 -2001-10-29,18.57,18.67,17.60,17.63,8542200,8.81 -2001-10-26,18.86,19.25,18.62,18.67,9963000,9.34 -2001-10-25,18.44,19.25,18.16,19.19,9105400,9.60 -2001-10-24,18.06,19.09,17.75,18.95,13372400,9.48 -2001-10-23,19.12,19.42,17.87,18.14,24463600,9.07 -2001-10-22,18.21,19.07,18.09,19.02,13997800,9.51 -2001-10-19,17.94,18.40,17.88,18.30,5956800,9.15 -2001-10-18,17.29,18.23,17.29,18.00,21877600,9.00 -2001-10-17,18.34,18.41,16.96,16.99,10197800,8.49 -2001-10-16,18.09,18.20,17.77,18.01,7248200,9.01 -2001-10-15,17.95,18.38,17.95,17.99,11384000,8.99 -2001-10-12,17.31,18.08,16.86,18.01,10279000,9.01 -2001-10-11,16.92,17.74,16.85,17.74,11934400,8.87 -2001-10-10,16.10,16.85,15.95,16.82,10991400,8.41 -2001-10-09,16.05,16.20,15.63,16.00,6215200,8.00 -2001-10-08,15.57,16.35,15.50,16.20,7428000,8.10 -2001-10-05,15.40,16.15,14.99,16.14,12238800,8.07 -2001-10-04,15.35,16.25,14.99,15.88,14325800,7.94 -2001-10-03,14.95,15.36,14.83,14.98,24394400,7.49 -2001-10-02,15.43,15.83,14.88,15.05,8424400,7.53 -2001-10-01,15.49,15.99,15.23,15.54,7436000,7.77 -2001-09-28,15.71,15.91,15.39,15.51,13039600,7.76 -2001-09-27,15.25,15.75,15.20,15.51,11508600,7.76 -2001-09-26,15.81,15.89,14.93,15.15,17635600,7.57 -2001-09-25,16.14,16.22,15.35,15.54,13371600,7.77 -2001-09-24,16.11,16.84,15.95,16.45,10519200,8.23 -2001-09-21,14.80,16.25,14.68,15.73,20375600,7.86 -2001-09-20,16.29,16.95,15.50,15.68,14684800,7.84 -2001-09-19,16.50,17.10,15.60,17.02,13332800,8.51 -2001-09-18,16.90,17.72,16.17,16.28,11682200,8.14 -2001-09-17,16.00,17.07,15.73,16.99,16357400,8.49 -2001-09-10,17.00,17.50,16.92,17.37,11030200,8.69 -2001-09-07,17.50,18.10,17.20,17.28,8636800,8.64 -2001-09-06,18.40,18.93,17.65,17.72,10084600,8.86 -2001-09-05,18.24,18.95,18.12,18.55,12859200,9.27 -2001-09-04,18.50,19.08,18.18,18.25,12436200,9.12 -2001-08-31,17.73,18.60,17.65,18.55,7746600,9.27 -2001-08-30,17.74,18.18,17.28,17.83,13167600,8.91 -2001-08-29,18.44,18.83,17.83,17.83,8570400,8.91 -2001-08-28,18.90,19.14,18.40,18.40,6133400,9.20 -2001-08-27,18.60,19.30,18.16,18.92,6273000,9.46 -2001-08-24,18.00,18.62,17.65,18.57,10369000,9.28 -2001-08-23,18.20,18.34,17.58,17.81,7752800,8.90 -2001-08-22,17.94,18.25,17.61,18.21,6213400,9.10 -2001-08-21,18.14,18.14,17.70,17.92,6632200,8.96 -2001-08-20,18.14,18.23,17.81,18.12,9010800,9.06 -2001-08-17,18.00,18.45,17.99,18.07,7443800,9.03 -2001-08-16,18.27,18.75,17.97,18.65,10289000,9.32 -2001-08-15,18.76,18.94,18.20,18.44,10331400,9.22 -2001-08-14,19.20,19.36,18.67,18.73,8176800,9.36 -2001-08-13,19.10,19.33,18.76,19.09,5285600,9.55 -2001-08-10,19.04,19.32,18.59,19.02,6677200,9.51 -2001-08-09,18.96,19.15,18.72,19.05,7166600,9.52 -2001-08-08,19.26,19.70,18.54,18.90,9863200,9.45 -2001-08-07,19.33,19.67,18.98,19.25,6019600,9.62 -2001-08-06,19.04,19.66,19.00,19.13,3559000,9.56 -2001-08-03,19.89,19.90,19.00,19.50,6644800,9.75 -2001-08-02,19.65,19.87,19.26,19.82,9003200,9.91 -2001-08-01,19.01,19.78,18.95,19.06,10862000,9.53 -2001-07-31,19.27,19.42,18.51,18.79,8393800,9.40 -2001-07-30,19.12,19.36,18.51,18.93,8691400,9.47 -2001-07-27,18.75,19.25,18.50,18.96,11933400,9.48 -2001-07-26,18.48,18.80,17.85,18.59,13183600,9.30 -2001-07-25,19.12,19.30,17.97,18.47,15852800,9.23 -2001-07-24,19.39,19.92,18.73,19.09,12442000,9.55 -2001-07-23,20.09,20.50,19.51,19.54,8620000,9.77 -2001-07-20,19.70,20.06,19.49,19.98,15878000,9.99 -2001-07-19,21.23,21.42,19.75,19.96,30755000,9.98 -2001-07-18,21.78,22.78,20.42,20.79,40607600,10.40 -2001-07-17,23.98,25.22,23.01,25.10,23136800,12.55 -2001-07-16,24.88,25.10,23.91,23.96,9952400,11.98 -2001-07-13,24.13,25.01,23.84,24.85,16240800,12.43 -2001-07-12,23.30,24.81,23.30,24.36,21957200,12.18 -2001-07-11,21.03,22.55,21.00,22.54,16803800,11.27 -2001-07-10,22.95,23.07,20.84,21.14,14116800,10.57 -2001-07-09,22.09,23.00,21.68,22.70,12052400,11.35 -2001-07-06,22.76,22.96,21.72,22.03,10818600,11.02 -2001-07-05,23.60,23.77,23.01,23.19,5439000,11.60 -2001-07-03,23.51,24.18,23.50,23.84,4019400,11.92 -2001-07-02,23.64,24.23,23.14,23.90,8216000,11.95 -2001-06-29,23.66,25.10,23.20,23.25,18406800,11.62 -2001-06-28,23.05,23.91,22.94,23.54,12443200,11.77 -2001-06-27,23.83,24.00,22.50,23.34,13361800,11.67 -2001-06-26,23.34,23.77,23.01,23.75,9742200,11.88 -2001-06-25,22.50,24.00,22.45,23.99,15698200,11.99 -2001-06-22,22.48,23.00,21.76,22.26,10215200,11.13 -2001-06-21,21.55,23.00,21.10,22.49,12190400,11.24 -2001-06-20,20.00,21.85,19.98,21.67,15415000,10.84 -2001-06-19,20.85,21.40,20.01,20.19,11467400,10.10 -2001-06-18,20.41,20.85,20.00,20.33,12354000,10.16 -2001-06-15,20.10,20.75,19.35,20.44,16236600,10.22 -2001-06-14,20.04,20.45,19.77,19.88,10619600,9.94 -2001-06-13,21.42,21.73,20.06,20.47,18267400,10.23 -2001-06-12,19.77,20.69,19.76,20.31,10849800,10.15 -2001-06-11,21.05,21.07,19.95,20.04,10500000,10.02 -2001-06-08,21.65,21.65,20.71,21.32,12236600,10.66 -2001-06-07,20.71,21.70,20.45,21.66,11613600,10.83 -2001-06-06,20.93,20.93,20.33,20.73,7970600,10.36 -2001-06-05,20.80,21.10,20.35,20.94,16849800,10.47 -2001-06-04,21.08,21.11,20.46,20.66,10068600,10.33 -2001-06-01,20.13,21.09,19.98,20.89,16288400,10.44 -2001-05-31,19.80,20.24,19.49,19.95,15817600,9.98 -2001-05-30,20.76,20.76,19.30,19.78,27752800,9.89 -2001-05-29,22.32,22.50,20.81,21.47,18428200,10.73 -2001-05-25,23.20,23.29,22.50,22.76,5669400,11.38 -2001-05-24,23.29,23.30,22.62,23.20,9705600,11.60 -2001-05-23,23.75,23.75,22.86,23.23,10037200,11.61 -2001-05-22,24.00,24.13,23.40,23.50,14747000,11.75 -2001-05-21,23.63,23.91,23.05,23.56,16464200,11.78 -2001-05-18,23.36,23.64,23.12,23.53,5680400,11.77 -2001-05-17,24.23,24.33,23.25,23.55,11861400,11.77 -2001-05-16,23.26,24.50,22.85,24.10,11511800,12.05 -2001-05-15,23.37,25.50,23.04,23.18,8465200,11.59 -2001-05-14,22.89,23.68,22.75,23.29,11043600,11.65 -2001-05-11,23.01,23.49,22.76,22.85,7251600,11.43 -2001-05-10,24.21,24.50,22.95,23.00,10320600,11.50 -2001-05-09,24.14,24.55,23.67,23.98,11603200,11.99 -2001-05-08,25.35,25.45,23.95,24.57,11265600,12.28 -2001-05-07,25.62,25.76,24.84,24.96,9876800,12.48 -2001-05-04,24.24,25.85,23.96,25.75,10037600,12.88 -2001-05-03,25.97,26.25,24.73,24.96,10769400,12.48 -2001-05-02,26.34,26.70,25.76,26.59,13161600,13.30 -2001-05-01,25.41,26.50,25.20,25.93,15259000,12.97 -2001-04-30,26.70,27.12,24.87,25.49,17670600,12.74 -2001-04-27,25.20,26.29,24.75,26.20,16179000,13.10 -2001-04-26,25.17,26.10,24.68,24.69,28560600,12.35 -2001-04-25,24.21,24.86,23.57,24.72,11813600,12.36 -2001-04-24,24.33,24.75,23.51,24.03,13469200,12.02 -2001-04-23,24.34,25.00,24.00,24.25,19340200,12.12 -2001-04-20,24.93,25.63,24.60,25.04,24764400,12.52 -2001-04-19,25.55,25.75,23.60,25.72,66916800,12.86 -2001-04-18,21.57,24.08,21.08,22.79,39315800,11.40 -2001-04-17,21.20,21.21,19.60,20.40,24471400,10.20 -2001-04-16,22.09,22.40,20.86,21.44,10186600,10.72 -2001-04-12,21.42,23.02,21.15,22.42,10676200,11.21 -2001-04-11,22.98,23.00,21.28,21.80,11932000,10.90 -2001-04-10,20.90,22.70,20.78,22.04,16334800,11.02 -2001-04-09,20.69,21.34,20.06,20.54,9520800,10.27 -2001-04-06,20.80,21.04,19.90,20.59,11603200,10.30 -2001-04-05,20.60,22.50,20.00,20.87,15955800,10.44 -2001-04-04,19.76,20.25,18.75,19.50,24481600,9.75 -2001-04-03,21.36,21.40,20.13,20.24,13167400,10.12 -2001-04-02,22.09,22.66,21.40,21.59,12175400,10.80 -2001-03-30,22.55,22.72,21.34,22.07,14298200,11.03 -2001-03-29,21.77,23.45,21.50,22.53,21895200,11.27 -2001-03-28,22.08,22.50,21.50,22.17,20880800,11.09 -2001-03-27,21.94,23.05,21.90,22.87,19422200,11.44 -2001-03-26,23.13,23.75,21.13,21.78,26230400,10.89 -2001-03-23,22.06,23.56,22.00,23.00,33749400,11.50 -2001-03-22,20.37,21.75,20.19,21.62,25839000,10.81 -2001-03-21,19.78,20.87,19.37,20.12,13265400,10.06 -2001-03-20,20.72,20.94,19.69,19.69,17833800,9.85 -2001-03-19,19.75,20.62,19.50,20.56,12722800,10.28 -2001-03-16,19.00,20.31,18.87,19.62,16806600,9.81 -2001-03-15,20.87,21.37,19.69,19.69,18906600,9.85 -2001-03-14,18.50,20.50,18.44,20.44,17065400,10.22 -2001-03-13,18.87,19.56,18.19,19.56,15840600,9.78 -2001-03-12,19.69,19.87,18.12,18.62,13967800,9.31 -2001-03-09,20.62,20.69,20.00,20.25,10685400,10.12 -2001-03-08,20.69,21.12,20.44,20.81,7325600,10.40 -2001-03-07,21.31,21.62,20.75,21.25,14985600,10.62 -2001-03-06,20.72,22.06,20.69,21.50,26144600,10.75 -2001-03-05,19.37,20.50,19.25,20.37,11587600,10.19 -2001-03-02,18.31,20.44,18.25,19.25,14511200,9.62 -2001-03-01,17.81,18.75,17.19,18.75,11803400,9.38 -2001-02-28,19.37,19.44,18.12,18.25,18157600,9.12 -2001-02-27,19.28,19.44,18.69,19.37,12451000,9.69 -2001-02-26,19.06,19.69,18.56,19.50,7380000,9.75 -2001-02-23,18.62,18.87,18.25,18.81,10503800,9.40 -2001-02-22,19.06,19.37,18.00,18.81,15431200,9.40 -2001-02-21,18.25,19.94,18.25,18.87,13947800,9.44 -2001-02-20,19.19,19.44,18.19,18.31,11249600,9.15 -2001-02-16,19.00,19.50,18.75,19.00,9428400,9.50 -2001-02-15,19.69,20.56,19.69,20.06,11123200,10.03 -2001-02-14,19.19,19.62,18.50,19.50,11040000,9.75 -2001-02-13,19.94,20.44,19.00,19.12,8470600,9.56 -2001-02-12,19.06,20.00,18.81,19.69,9795600,9.85 -2001-02-09,20.50,20.81,18.69,19.12,21082600,9.56 -2001-02-08,20.56,21.06,20.19,20.75,21585000,10.38 -2001-02-07,20.66,20.87,19.81,20.75,14071600,10.38 -2001-02-06,20.16,21.39,20.00,21.12,16528400,10.56 -2001-02-05,20.50,20.56,19.75,20.19,10228800,10.10 -2001-02-02,21.12,21.94,20.50,20.62,15263400,10.31 -2001-02-01,20.69,21.50,20.50,21.12,13205400,10.56 -2001-01-31,21.50,22.50,21.44,21.62,26106000,10.81 -2001-01-30,21.56,22.00,20.87,21.75,24734600,10.88 -2001-01-29,19.56,21.75,19.56,21.69,30562800,10.85 -2001-01-26,19.50,19.81,19.06,19.56,17245600,9.78 -2001-01-25,20.56,20.56,19.75,19.94,17495000,9.97 -2001-01-24,20.62,20.69,19.56,20.50,25616200,10.25 -2001-01-23,19.31,20.94,19.06,20.50,31418400,10.25 -2001-01-22,19.06,19.62,18.44,19.25,18551600,9.62 -2001-01-19,19.44,19.56,18.69,19.50,27748200,9.75 -2001-01-18,17.81,18.75,17.62,18.69,43822800,9.35 -2001-01-17,17.56,17.56,16.50,16.81,30037600,8.40 -2001-01-16,17.44,18.25,17.00,17.12,10940000,8.56 -2001-01-12,17.87,18.00,17.06,17.19,15121000,8.60 -2001-01-11,16.25,18.50,16.25,18.00,28707600,9.00 -2001-01-10,16.69,17.00,16.06,16.56,20743400,8.28 -2001-01-09,16.81,17.64,16.56,17.19,21040600,8.60 -2001-01-08,16.94,16.98,15.94,16.56,13350000,8.28 -2001-01-05,16.94,17.37,16.06,16.37,14731000,8.19 -2001-01-04,18.14,18.50,16.81,17.06,26411000,8.53 -2001-01-03,14.50,16.69,14.44,16.37,29181800,8.19 -2001-01-02,14.88,15.25,14.56,14.88,16161800,7.44 -2000-12-29,14.69,15.00,14.50,14.88,22518800,7.44 -2000-12-28,14.38,14.94,14.31,14.81,10910000,7.41 -2000-12-27,14.34,14.81,14.19,14.81,11626000,7.41 -2000-12-26,14.88,15.00,14.25,14.69,7745400,7.34 -2000-12-22,14.13,15.00,14.13,15.00,11369600,7.50 -2000-12-21,14.25,15.00,13.88,14.06,13102600,7.03 -2000-12-20,13.78,14.63,13.63,14.38,20196200,7.19 -2000-12-19,14.38,15.25,14.00,14.00,13367200,7.00 -2000-12-18,14.56,14.63,13.94,14.25,11645000,7.12 -2000-12-15,14.56,14.69,14.00,14.06,18363800,7.03 -2000-12-14,15.03,15.25,14.44,14.44,9406600,7.22 -2000-12-13,15.56,15.56,14.88,15.00,12327200,7.50 -2000-12-12,15.25,16.00,15.00,15.38,13803400,7.69 -2000-12-11,15.19,15.38,14.88,15.19,11884000,7.59 -2000-12-08,14.81,15.31,14.44,15.06,15568200,7.53 -2000-12-07,14.44,14.88,14.00,14.31,14606600,7.16 -2000-12-06,14.63,15.00,14.00,14.31,49092400,7.16 -2000-12-05,16.94,17.44,16.37,17.00,21932200,8.50 -2000-12-04,17.19,17.19,16.44,16.69,13273400,8.35 -2000-12-01,17.00,17.50,16.81,17.06,13783800,8.53 -2000-11-30,16.69,17.00,16.12,16.50,28922200,8.25 -2000-11-29,18.09,18.31,17.25,17.56,17586200,8.78 -2000-11-28,18.69,19.00,17.94,18.03,9618200,9.02 -2000-11-27,19.87,19.94,18.50,18.69,9244000,9.35 -2000-11-24,18.86,19.50,18.81,19.31,5751800,9.65 -2000-11-22,18.81,19.12,18.37,18.50,10029600,9.25 -2000-11-21,19.19,19.50,18.75,18.81,10786200,9.40 -2000-11-20,18.59,19.50,18.25,18.94,14581600,9.47 -2000-11-17,19.19,19.25,18.25,18.50,15943400,9.25 -2000-11-16,19.50,19.81,18.87,19.00,8554000,9.50 -2000-11-15,20.03,20.19,19.25,19.87,10086600,9.94 -2000-11-14,19.94,20.50,19.56,20.25,14611200,10.12 -2000-11-13,18.75,20.00,18.25,19.37,15423200,9.69 -2000-11-10,19.36,19.87,19.06,19.06,15080600,9.53 -2000-11-09,19.87,20.50,19.06,20.19,17035400,10.10 -2000-11-08,21.37,21.44,19.81,20.06,15082800,10.03 -2000-11-07,21.50,21.81,20.81,21.31,10786800,10.65 -2000-11-06,22.44,22.62,20.87,21.44,14060000,10.72 -2000-11-03,23.00,23.00,21.94,22.25,18423400,11.12 -2000-11-02,21.12,22.44,21.06,22.31,21105400,11.15 -2000-11-01,19.44,20.87,19.44,20.50,20553800,10.25 -2000-10-31,19.75,20.25,19.25,19.56,31649000,9.78 -2000-10-30,19.12,19.94,18.75,19.31,22832800,9.65 -2000-10-27,18.87,19.19,17.87,18.56,26594600,9.28 -2000-10-26,18.81,18.87,17.50,18.50,25780600,9.25 -2000-10-25,19.06,19.19,18.44,18.50,23720600,9.25 -2000-10-24,20.69,20.87,18.81,18.87,28736200,9.44 -2000-10-23,20.27,20.56,19.44,20.37,19694000,10.19 -2000-10-20,19.06,20.37,18.94,19.50,28270400,9.75 -2000-10-19,19.16,19.81,18.31,18.94,53818200,9.47 -2000-10-18,19.44,21.06,18.75,20.12,29803800,10.06 -2000-10-17,21.69,21.94,19.69,20.12,21495600,10.06 -2000-10-16,22.31,23.25,21.37,21.50,29298800,10.75 -2000-10-13,20.25,22.12,20.00,22.06,44564000,11.03 -2000-10-12,20.31,20.81,19.50,20.00,42548200,10.00 -2000-10-11,20.12,21.00,19.12,19.62,42801200,9.81 -2000-10-10,21.62,22.44,20.50,20.87,24683400,10.44 -2000-10-09,22.62,22.87,21.12,21.75,21342600,10.88 -2000-10-06,22.69,22.94,21.00,22.19,21881000,11.10 -2000-10-05,23.50,24.50,22.00,22.06,31189400,11.03 -2000-10-04,22.37,23.75,21.87,23.62,52368200,11.81 -2000-10-03,24.94,25.00,22.19,22.31,72795600,11.15 -2000-10-02,26.69,26.75,23.50,24.25,86610600,12.12 -2000-09-29,28.19,29.00,25.37,25.75,265069000,12.88 -2000-09-28,49.31,53.81,48.13,53.50,34988200,26.75 -2000-09-27,51.75,52.75,48.25,48.94,14370000,24.47 -2000-09-26,53.31,54.75,51.38,51.44,10396600,25.72 -2000-09-25,52.75,55.50,52.06,53.50,15564000,26.75 -2000-09-22,50.31,52.44,50.00,52.19,25961200,26.09 -2000-09-21,58.50,59.63,55.25,56.69,18238400,28.34 -2000-09-20,59.41,61.44,58.56,61.05,8121600,30.52 -2000-09-19,59.75,60.50,58.56,59.94,9706200,29.97 -2000-09-18,55.25,60.75,55.06,60.66,15163200,30.33 -2000-09-15,57.75,58.19,54.25,55.23,14095400,27.61 -2000-09-14,58.56,59.63,56.81,56.86,15241800,28.43 -2000-09-13,56.75,59.50,56.75,58.00,10932600,29.00 -2000-09-12,57.34,60.06,57.00,57.75,6722200,28.88 -2000-09-11,58.69,60.38,58.13,58.44,6699000,29.22 -2000-09-08,61.63,61.63,58.50,58.88,6984400,29.44 -2000-09-07,59.13,62.56,58.25,62.00,7770400,31.00 -2000-09-06,61.38,62.38,57.75,58.44,12700400,29.22 -2000-09-05,62.66,64.12,62.25,62.44,10669000,31.22 -2000-09-01,61.31,63.63,61.13,63.44,9181800,31.72 -2000-08-31,58.97,61.50,58.94,60.94,14988800,30.47 -2000-08-30,59.00,60.00,58.70,59.50,10199600,29.75 -2000-08-29,57.88,59.44,57.69,59.19,9546200,29.59 -2000-08-28,57.25,59.00,57.06,58.06,12822600,29.03 -2000-08-25,56.50,57.50,56.38,56.81,11947800,28.41 -2000-08-24,54.67,56.63,53.38,56.11,11109400,28.06 -2000-08-23,51.47,54.75,51.06,54.31,8470400,27.16 -2000-08-22,50.63,52.81,50.38,51.69,9889000,25.84 -2000-08-21,50.25,51.56,49.63,50.50,4803800,25.25 -2000-08-18,51.38,51.81,49.88,50.00,6798800,25.00 -2000-08-17,48.38,52.44,48.31,51.44,9683400,25.72 -2000-08-16,46.88,49.00,46.81,48.50,5137600,24.25 -2000-08-15,47.25,47.94,46.50,46.69,4089000,23.34 -2000-08-14,47.59,47.69,46.31,47.06,5603400,23.53 -2000-08-11,46.84,48.00,45.56,47.69,8503200,23.84 -2000-08-10,48.00,48.44,47.38,47.56,8995400,23.78 -2000-08-09,48.13,48.44,47.25,47.50,13569000,23.75 -2000-08-08,47.94,48.00,46.31,46.75,6315400,23.38 -2000-08-07,47.88,49.06,47.19,47.94,6697200,23.97 -2000-08-04,49.47,51.25,46.31,47.38,9406800,23.69 -2000-08-03,45.56,48.06,44.25,48.00,12150000,24.00 -2000-08-02,49.00,49.94,47.19,47.25,5808800,23.62 -2000-08-01,50.31,51.16,49.25,49.31,4904600,24.66 -2000-07-31,49.16,51.63,48.75,50.81,5550000,25.41 -2000-07-28,52.28,52.50,46.88,48.31,8505400,24.16 -2000-07-27,50.00,53.25,49.88,52.00,10543800,26.00 -2000-07-26,49.84,51.25,49.25,50.06,7526200,25.03 -2000-07-25,50.31,50.63,49.06,50.06,7567200,25.03 -2000-07-24,52.56,52.88,47.50,48.69,14720600,24.34 -2000-07-21,54.36,55.63,52.94,53.56,7013200,26.78 -2000-07-20,55.00,57.06,54.13,55.13,16631800,27.57 -2000-07-19,55.19,56.81,51.75,52.69,16359600,26.34 -2000-07-18,58.50,58.88,56.88,57.25,11378200,28.62 -2000-07-17,58.25,58.81,57.13,58.31,9289000,29.16 -2000-07-14,57.13,59.00,56.88,57.69,6804400,28.84 -2000-07-13,58.50,60.63,54.75,56.50,15925600,28.25 -2000-07-12,58.13,58.94,56.38,58.88,8057600,29.44 -2000-07-11,57.00,59.25,55.44,56.94,12783200,28.47 -2000-07-10,54.09,58.25,53.75,57.13,14211000,28.57 -2000-07-07,52.59,54.81,52.13,54.44,9422600,27.22 -2000-07-06,52.50,52.94,49.63,51.81,11063800,25.91 -2000-07-05,53.25,55.19,50.75,51.63,9478800,25.82 -2000-07-03,52.13,54.31,52.13,53.31,2535000,26.66 -2000-06-30,52.81,54.94,51.69,52.38,11550000,26.19 -2000-06-29,53.06,53.94,51.06,51.25,7281200,25.62 -2000-06-28,53.31,55.38,51.50,54.44,10235000,27.22 -2000-06-27,53.78,55.50,51.63,51.75,7270600,25.88 -2000-06-26,52.50,54.75,52.13,54.13,6631000,27.07 -2000-06-23,53.78,54.63,50.81,51.69,7320400,25.84 -2000-06-22,55.75,57.63,53.56,53.75,16706200,26.88 -2000-06-21,50.50,56.94,50.31,55.63,17500000,27.82 -2000-06-20,98.50,103.94,98.37,101.25,17922000,25.31 -2000-06-19,90.56,97.87,89.81,96.62,14089200,24.16 -2000-06-16,93.50,93.75,89.06,91.19,10842400,22.80 -2000-06-15,91.25,93.37,89.00,92.37,8898800,23.09 -2000-06-14,94.69,96.25,90.12,90.44,9925200,22.61 -2000-06-13,91.19,94.69,88.19,94.50,12570000,23.62 -2000-06-12,96.37,96.44,90.87,91.19,10374400,22.80 -2000-06-09,96.75,97.94,94.37,95.75,9020000,23.94 -2000-06-08,97.62,98.50,93.12,94.81,8540800,23.70 -2000-06-07,93.62,97.00,91.62,96.56,12056800,24.14 -2000-06-06,91.97,96.75,90.31,92.87,18771200,23.22 -2000-06-05,93.31,95.25,89.69,91.31,11582000,22.83 -2000-06-02,93.75,99.75,89.00,92.56,28336400,23.14 -2000-06-01,81.75,89.56,80.37,89.12,32280000,22.28 -2000-05-31,86.87,91.25,83.81,84.00,15483600,21.00 -2000-05-30,87.62,88.12,81.75,87.56,25481200,21.89 -2000-05-26,88.00,89.87,85.25,86.37,6486400,21.59 -2000-05-25,88.50,92.66,86.00,87.27,14530800,21.82 -2000-05-24,86.19,89.75,83.00,87.69,24248000,21.92 -2000-05-23,90.50,93.37,85.62,85.81,18488000,21.45 -2000-05-22,93.75,93.75,86.00,89.94,26995200,22.49 -2000-05-19,99.25,99.25,93.37,94.00,26459200,23.50 -2000-05-18,103.00,104.94,100.62,100.75,13365600,25.19 -2000-05-17,103.62,103.69,100.37,101.37,14227600,25.34 -2000-05-16,104.52,109.06,102.75,105.69,15736400,26.42 -2000-05-15,108.06,108.06,100.12,101.00,24252000,25.25 -2000-05-12,106.00,110.50,104.77,107.62,10962000,26.91 -2000-05-11,101.37,104.25,99.00,102.81,17852400,25.70 -2000-05-10,104.06,105.00,98.75,99.31,19127600,24.83 -2000-05-09,110.31,111.25,104.87,105.44,11685600,26.36 -2000-05-08,112.09,113.69,110.00,110.12,6605600,27.53 -2000-05-05,110.81,114.75,110.72,113.12,10160000,28.28 -2000-05-04,115.12,115.25,110.56,110.69,14284400,27.67 -2000-05-03,118.94,121.25,111.62,115.06,17500000,28.76 -2000-05-02,123.25,126.25,117.50,117.87,8446400,29.47 -2000-05-01,124.87,125.12,121.87,124.31,8100000,31.08 -2000-04-28,127.12,127.50,121.31,124.06,8932400,31.01 -2000-04-27,117.19,127.00,116.58,126.75,11678000,31.69 -2000-04-26,126.62,128.00,120.00,121.31,13117600,30.33 -2000-04-25,122.12,128.75,122.06,128.31,14002400,32.08 -2000-04-24,115.00,120.50,114.75,120.50,15845600,30.12 -2000-04-20,123.69,124.75,117.06,118.87,25806800,29.72 -2000-04-19,126.19,130.25,119.75,121.12,18586400,30.28 -2000-04-18,123.50,126.87,119.37,126.87,13962400,31.72 -2000-04-17,109.50,123.94,109.06,123.87,14642400,30.97 -2000-04-14,109.31,118.00,109.00,111.87,23845600,27.97 -2000-04-13,111.50,120.00,108.50,113.81,18923600,28.45 -2000-04-12,119.00,119.00,104.87,109.25,33618800,27.31 -2000-04-11,123.50,124.87,118.06,119.44,19368000,29.86 -2000-04-10,131.69,132.75,124.75,125.00,7592400,31.25 -2000-04-07,127.25,131.88,125.50,131.75,8668800,32.94 -2000-04-06,130.63,134.50,123.25,125.19,9290800,31.30 -2000-04-05,126.47,132.88,124.00,130.38,16359200,32.60 -2000-04-04,132.63,133.00,116.75,127.31,23596400,31.83 -2000-04-03,135.50,139.50,129.44,133.31,11742400,33.33 -2000-03-31,127.44,137.25,126.00,135.81,14457600,33.95 -2000-03-30,133.56,137.69,125.44,125.75,14800000,31.44 -2000-03-29,139.38,139.44,133.83,135.94,8568800,33.99 -2000-03-28,137.25,142.00,137.13,139.13,7253600,34.78 -2000-03-27,137.63,144.75,136.88,139.56,9976800,34.89 -2000-03-24,142.44,143.94,135.50,138.69,15962000,34.67 -2000-03-23,142.00,150.38,140.00,141.31,20098000,35.33 -2000-03-22,132.78,144.38,131.56,144.19,20288800,36.05 -2000-03-21,122.56,136.75,121.62,134.94,18729200,33.74 -2000-03-20,123.50,126.25,122.37,123.00,7316400,30.75 -2000-03-17,120.12,125.00,119.62,125.00,10902400,31.25 -2000-03-16,117.31,122.00,114.50,121.56,13516800,30.39 -2000-03-15,115.62,120.25,114.12,116.25,15845200,29.06 -2000-03-14,121.22,124.25,114.00,114.25,15321200,28.56 -2000-03-13,122.12,126.50,119.50,121.31,10864400,30.33 -2000-03-10,121.69,127.94,121.00,125.75,8900800,31.44 -2000-03-09,120.87,125.00,118.25,122.25,9884400,30.56 -2000-03-08,122.87,123.94,118.56,122.00,9690800,30.50 -2000-03-07,126.44,127.44,121.12,122.87,9767600,30.72 -2000-03-06,126.00,129.13,125.00,125.69,7520000,31.42 -2000-03-03,124.87,128.23,120.00,128.00,11565200,32.00 -2000-03-02,127.00,127.94,120.69,122.00,11136800,30.50 -2000-03-01,118.56,132.06,118.50,130.31,38478000,32.58 -2000-02-29,113.56,117.25,112.56,114.62,13186800,28.66 -2000-02-28,110.12,115.00,108.37,113.25,11729200,28.31 -2000-02-25,114.81,117.00,110.12,110.37,8908000,27.59 -2000-02-24,117.31,119.12,111.75,115.20,13446400,28.80 -2000-02-23,113.23,119.00,111.00,116.25,16905600,29.06 -2000-02-22,110.12,116.94,106.69,113.81,15083200,28.45 -2000-02-18,114.62,115.37,110.87,111.25,8346800,27.81 -2000-02-17,115.19,115.50,113.12,114.87,10350000,28.72 -2000-02-16,117.75,118.12,112.12,114.12,13525200,28.53 -2000-02-15,115.25,119.94,115.19,119.00,17363600,29.75 -2000-02-14,109.31,115.87,108.62,115.81,13130000,28.95 -2000-02-11,113.62,114.12,108.25,108.75,7592000,27.19 -2000-02-10,112.87,113.87,110.00,113.50,10832400,28.38 -2000-02-09,114.12,117.12,112.44,112.62,10698000,28.16 -2000-02-08,114.00,116.12,111.25,114.87,14613600,28.72 -2000-02-07,108.00,114.25,105.94,114.06,15770800,28.51 -2000-02-04,103.94,110.00,103.62,108.00,15206800,27.00 -2000-02-03,100.31,104.25,100.25,103.31,16977600,25.83 -2000-02-02,100.75,102.12,97.00,98.81,16588800,24.70 -2000-02-01,104.00,105.00,100.00,100.25,11380000,25.06 -2000-01-31,101.00,103.87,94.50,103.75,25071200,25.94 -2000-01-28,108.19,110.87,100.62,101.62,15142000,25.41 -2000-01-27,108.81,113.00,107.00,110.00,12163600,27.50 -2000-01-26,110.00,114.19,109.75,110.19,13131200,27.55 -2000-01-25,105.00,113.12,102.37,112.25,17775200,28.06 -2000-01-24,108.44,112.75,105.12,106.25,15760000,26.56 -2000-01-21,114.25,114.25,110.19,111.31,17729200,27.83 -2000-01-20,115.50,121.50,113.50,113.50,65418800,28.38 -2000-01-19,105.62,108.75,103.37,106.56,21358000,26.64 -2000-01-18,101.00,106.00,100.44,103.94,16421200,25.99 -2000-01-14,100.00,102.25,99.37,100.44,13954400,25.11 -2000-01-13,94.48,98.75,92.50,96.75,36882400,24.19 -2000-01-12,95.00,95.50,86.50,87.19,34870800,21.80 -2000-01-11,95.94,99.37,90.50,92.75,15775200,23.19 -2000-01-10,102.00,102.25,94.75,97.75,18059200,24.44 -2000-01-07,96.50,101.00,95.50,99.50,16463200,24.88 -2000-01-06,106.12,107.00,95.00,95.00,27443200,23.75 -2000-01-05,103.75,110.56,103.00,104.00,27818000,26.00 -2000-01-04,108.25,110.62,101.19,102.50,18310000,25.62 -2000-01-03,104.87,112.50,101.69,111.94,19144400,27.99 -1999-12-31,100.94,102.87,99.50,102.81,5856400,25.70 -1999-12-30,102.19,104.12,99.62,100.31,7419200,25.08 -1999-12-29,96.81,102.19,95.50,100.69,10161200,25.17 -1999-12-28,99.12,99.62,95.00,98.19,8843200,24.55 -1999-12-27,104.37,104.44,99.25,99.31,6022000,24.83 -1999-12-23,101.81,104.25,101.06,103.50,8218800,25.88 -1999-12-22,102.87,104.56,98.75,99.94,11682000,24.99 -1999-12-21,98.19,103.06,97.94,102.50,11000000,25.62 -1999-12-20,99.56,99.62,96.62,98.00,10155200,24.50 -1999-12-17,100.87,102.00,98.50,100.00,17700800,25.00 -1999-12-16,98.00,98.37,94.00,98.31,16568000,24.58 -1999-12-15,93.25,97.25,91.06,97.00,22254400,24.25 -1999-12-14,98.37,99.75,94.75,94.87,15570800,23.72 -1999-12-13,102.39,102.50,98.94,99.00,18931200,24.75 -1999-12-10,105.31,109.25,99.00,103.00,22786800,25.75 -1999-12-09,111.00,111.00,100.87,105.25,30555600,26.31 -1999-12-08,116.25,117.87,109.50,110.06,14730800,27.51 -1999-12-07,116.56,118.00,114.00,117.81,15901200,29.45 -1999-12-06,114.56,117.31,111.44,116.00,16688000,29.00 -1999-12-03,112.19,115.56,111.87,115.00,23151200,28.75 -1999-12-02,103.12,110.62,101.75,110.19,20275600,27.55 -1999-12-01,101.00,104.50,100.06,103.06,22098000,25.76 -1999-11-30,98.12,103.75,97.37,97.87,30132400,24.47 -1999-11-29,94.25,99.75,93.25,94.56,16586800,23.64 -1999-11-26,94.75,95.50,94.12,95.06,4737600,23.76 -1999-11-24,93.00,95.00,91.69,94.69,7683600,23.67 -1999-11-23,91.75,95.25,88.50,92.81,19406400,23.20 -1999-11-22,91.75,91.75,89.25,90.62,7242400,22.66 -1999-11-19,89.50,92.87,88.06,92.44,11162000,23.11 -1999-11-18,91.06,91.12,88.44,89.62,13043600,22.41 -1999-11-17,90.69,94.75,90.00,90.25,13032000,22.56 -1999-11-16,90.00,91.75,88.50,91.19,8370000,22.80 -1999-11-15,89.62,92.87,88.50,89.44,9283600,22.36 -1999-11-12,91.94,92.00,87.37,90.62,9970000,22.66 -1999-11-11,91.59,92.62,89.87,92.25,9660000,23.06 -1999-11-10,88.25,93.25,88.12,91.44,20661200,22.86 -1999-11-09,94.37,94.50,88.00,89.62,28910000,22.41 -1999-11-08,87.75,97.73,86.75,96.37,33962400,24.09 -1999-11-05,84.62,88.37,84.00,88.31,14889200,22.08 -1999-11-04,82.06,85.37,80.62,83.62,13549200,20.91 -1999-11-03,81.62,83.25,81.00,81.50,11736800,20.38 -1999-11-02,78.00,81.69,77.31,80.25,14268800,20.06 -1999-11-01,80.00,80.69,77.37,77.62,9965600,19.41 -1999-10-29,78.81,81.06,78.81,80.12,18680800,20.03 -1999-10-28,77.06,79.00,76.06,77.87,18005200,19.47 -1999-10-27,74.37,76.62,73.44,76.37,15837600,19.09 -1999-10-26,74.94,75.50,73.31,75.06,12924400,18.76 -1999-10-25,74.25,76.12,73.75,74.50,11677600,18.62 -1999-10-22,77.12,77.25,73.37,73.94,14995200,18.49 -1999-10-21,72.56,77.06,72.37,76.12,28347600,19.03 -1999-10-20,70.00,75.25,70.00,75.12,38633600,18.78 -1999-10-19,71.62,75.00,68.44,68.50,36521200,17.12 -1999-10-18,73.87,74.25,71.12,73.25,27733600,18.31 -1999-10-15,71.12,75.81,70.19,74.56,41910000,18.64 -1999-10-14,69.25,73.31,69.00,73.19,67822400,18.30 -1999-10-13,66.62,69.50,63.75,64.03,22752000,16.01 -1999-10-12,67.87,69.62,67.00,67.69,20142000,16.92 -1999-10-11,66.00,68.25,66.00,66.69,9418000,16.67 -1999-10-08,66.19,66.31,63.50,65.56,13689200,16.39 -1999-10-07,68.44,68.62,64.87,66.37,21660800,16.59 -1999-10-06,69.37,69.62,67.00,67.19,28726400,16.80 -1999-10-05,65.62,68.12,64.75,67.94,29100800,16.99 -1999-10-04,62.38,64.87,62.38,64.56,16408800,16.14 -1999-10-01,62.13,62.44,59.50,61.72,21977600,15.43 -1999-09-30,59.56,64.19,59.25,63.31,32449200,15.83 -1999-09-29,60.25,61.25,58.00,59.06,23493600,14.77 -1999-09-28,61.50,62.00,57.44,59.63,50542400,14.91 -1999-09-27,66.37,66.75,61.19,61.31,33877600,15.33 -1999-09-24,63.38,67.02,63.00,64.94,42148800,16.24 -1999-09-23,71.12,71.25,63.00,63.31,40853200,15.83 -1999-09-22,69.75,71.62,69.02,70.31,40132000,17.58 -1999-09-21,73.19,73.25,69.00,69.25,119931200,17.31 -1999-09-20,77.00,80.12,76.87,79.06,16326400,19.76 -1999-09-17,77.31,77.75,76.25,76.94,9915600,19.24 -1999-09-16,76.06,78.06,73.87,76.81,15793600,19.20 -1999-09-15,78.87,79.12,75.25,75.37,12843200,18.84 -1999-09-14,74.72,78.50,74.69,77.81,13883200,19.45 -1999-09-13,77.06,77.06,74.81,75.00,9000000,18.75 -1999-09-10,76.00,77.69,74.69,77.44,16398000,19.36 -1999-09-09,75.50,75.94,73.87,75.56,19093600,18.89 -1999-09-08,76.19,77.69,74.50,74.50,27233600,18.62 -1999-09-07,73.75,77.94,73.50,76.37,35177600,19.09 -1999-09-03,71.94,75.25,70.50,73.50,58403600,18.38 -1999-09-02,67.62,71.44,66.87,70.56,31975200,17.64 -1999-09-01,67.00,68.81,66.00,68.62,28168000,17.16 -1999-08-31,62.59,65.87,62.06,65.25,22675200,16.31 -1999-08-30,65.00,65.00,62.00,62.06,12033200,15.52 -1999-08-27,62.75,65.00,62.69,64.75,15980000,16.19 -1999-08-26,61.13,63.13,61.13,62.13,14449200,15.53 -1999-08-25,60.69,61.50,60.13,61.38,10553600,15.35 -1999-08-24,60.38,60.75,59.94,60.38,17948000,15.10 -1999-08-23,59.38,61.38,59.31,60.75,12709200,15.19 -1999-08-20,59.25,59.38,58.19,59.19,11730800,14.80 -1999-08-19,59.81,60.50,58.56,58.75,19645600,14.69 -1999-08-18,60.06,62.00,59.63,60.13,16743200,15.03 -1999-08-17,60.31,60.38,58.94,60.31,11474400,15.08 -1999-08-16,59.81,60.69,59.50,60.50,9896400,15.12 -1999-08-13,60.63,62.00,59.88,60.06,10668800,15.02 -1999-08-12,59.06,61.38,58.63,60.00,23806400,15.00 -1999-08-11,56.00,59.75,55.94,59.69,30374400,14.92 -1999-08-10,54.00,56.00,53.63,55.38,14879200,13.85 -1999-08-09,54.34,55.19,54.25,54.44,8338000,13.61 -1999-08-06,54.06,55.31,53.50,54.13,15575600,13.53 -1999-08-05,53.50,54.88,52.13,54.75,11541200,13.69 -1999-08-04,55.19,55.88,53.25,53.81,13279200,13.45 -1999-08-03,56.75,57.44,53.63,55.25,13176800,13.81 -1999-08-02,55.63,58.00,55.50,55.75,12958000,13.94 -1999-07-30,54.50,56.13,54.50,55.69,13685600,13.92 -1999-07-29,53.38,55.25,53.13,53.88,9860000,13.47 -1999-07-28,53.88,55.38,53.00,54.38,11762000,13.60 -1999-07-27,52.63,53.94,52.50,53.69,14150800,13.42 -1999-07-26,52.88,53.00,50.88,50.94,12555200,12.73 -1999-07-23,52.81,53.75,52.69,53.31,8192000,13.33 -1999-07-22,53.63,53.88,51.13,52.38,14529200,13.10 -1999-07-21,54.06,55.44,52.88,54.06,25653600,13.52 -1999-07-20,54.56,55.50,52.75,52.88,15804400,13.22 -1999-07-19,53.94,55.81,52.31,54.44,20050000,13.61 -1999-07-16,53.63,54.50,53.00,53.06,14705600,13.27 -1999-07-15,55.88,55.94,51.31,53.25,60433600,13.31 -1999-07-14,54.50,56.63,54.50,55.94,22320000,13.98 -1999-07-13,53.50,54.19,52.88,53.69,10136800,13.42 -1999-07-12,55.50,55.63,54.19,54.50,10862000,13.62 -1999-07-09,54.50,55.63,53.00,55.63,21750000,13.91 -1999-07-08,51.13,55.06,50.88,54.50,58058000,13.62 -1999-07-07,47.38,50.75,47.00,49.88,39264400,12.47 -1999-07-06,45.94,47.63,45.81,47.38,16212000,11.85 -1999-07-02,45.53,46.88,45.19,46.31,4426800,11.58 -1999-07-01,46.31,46.56,45.25,45.31,5334400,11.33 -1999-06-30,45.69,46.94,44.94,46.31,12270800,11.58 -1999-06-29,42.72,45.56,42.63,45.38,13599200,11.35 -1999-06-28,42.44,42.94,42.38,42.56,9938800,10.64 -1999-06-25,42.50,42.69,42.06,42.19,10518800,10.55 -1999-06-24,43.63,43.63,42.25,42.31,15498000,10.58 -1999-06-23,45.06,45.09,43.56,43.69,18994400,10.92 -1999-06-22,46.31,46.94,45.38,45.38,5415600,11.35 -1999-06-21,47.00,47.25,46.00,46.50,4842000,11.62 -1999-06-18,45.38,47.25,45.19,47.13,7448000,11.78 -1999-06-17,47.63,48.00,45.75,46.38,8022400,11.60 -1999-06-16,46.38,48.06,46.38,47.94,8056800,11.98 -1999-06-15,45.19,46.75,45.13,46.06,4666400,11.52 -1999-06-14,46.50,46.63,45.13,45.44,5615600,11.36 -1999-06-11,48.13,48.50,46.25,46.44,6613600,11.61 -1999-06-10,47.88,48.25,47.31,48.13,11325200,12.03 -1999-06-09,47.44,48.50,47.44,48.44,12655200,12.11 -1999-06-08,48.75,48.81,47.56,47.69,11203200,11.92 -1999-06-07,48.13,49.00,47.50,48.94,14949200,12.23 -1999-06-04,47.63,48.19,47.25,48.13,13171200,12.03 -1999-06-03,46.88,48.00,46.81,47.44,17450800,11.86 -1999-06-02,44.50,47.94,44.00,46.56,18614400,11.64 -1999-06-01,45.00,45.31,44.38,44.81,16479200,11.20 -1999-05-28,43.31,44.31,43.13,44.06,7196400,11.02 -1999-05-27,43.19,43.75,42.69,43.50,12042400,10.88 -1999-05-26,41.75,44.38,41.25,44.06,15642000,11.02 -1999-05-25,41.56,42.44,40.94,41.50,13095200,10.38 -1999-05-24,43.63,44.31,41.88,41.94,9340800,10.48 -1999-05-21,43.00,44.31,42.56,43.94,16555200,10.98 -1999-05-20,45.44,45.75,42.50,42.50,14940000,10.62 -1999-05-19,45.50,45.75,43.50,45.19,10660000,11.30 -1999-05-18,44.81,46.00,44.38,45.25,14954400,11.31 -1999-05-17,43.75,44.69,43.00,44.38,7531200,11.10 -1999-05-14,45.13,45.81,44.38,44.38,8102000,11.10 -1999-05-13,46.44,46.81,45.50,46.19,10573600,11.55 -1999-05-12,44.88,46.50,44.13,46.50,14129200,11.62 -1999-05-11,44.88,46.19,43.56,44.75,16388800,11.19 -1999-05-10,46.75,46.94,44.63,45.25,14055600,11.31 -1999-05-07,44.63,45.88,42.75,45.88,15528800,11.47 -1999-05-06,46.56,46.88,44.00,44.50,15486400,11.12 -1999-05-05,46.31,47.00,44.63,47.00,20694400,11.75 -1999-05-04,48.25,48.63,46.19,46.50,28980000,11.62 -1999-05-03,46.06,50.00,45.75,49.56,52535600,12.39 -1999-04-30,44.00,47.13,44.00,46.00,52596400,11.50 -1999-04-29,43.25,44.38,41.78,43.00,28206400,10.75 -1999-04-28,44.63,45.69,43.63,44.06,34122000,11.02 -1999-04-27,43.00,45.81,43.00,45.75,75225200,11.44 -1999-04-26,39.50,41.25,39.25,40.94,33152000,10.23 -1999-04-23,36.25,39.44,36.25,39.19,37402400,9.80 -1999-04-22,35.06,36.63,35.06,36.38,26454400,9.10 -1999-04-21,34.00,34.38,33.50,34.38,12566800,8.60 -1999-04-20,33.88,34.75,33.50,34.06,18725600,8.52 -1999-04-19,35.69,36.00,33.50,33.88,32923200,8.47 -1999-04-16,35.88,36.06,35.25,35.44,17945600,8.86 -1999-04-15,35.38,36.19,34.31,35.75,61960000,8.94 -1999-04-14,35.25,37.06,35.00,35.53,24323600,8.88 -1999-04-13,36.31,36.81,34.50,34.63,14732400,8.66 -1999-04-12,35.00,36.88,34.88,36.25,14145600,9.06 -1999-04-09,36.25,37.25,35.94,36.75,9608000,9.19 -1999-04-08,36.88,37.06,36.00,36.88,10600800,9.22 -1999-04-07,38.06,38.25,36.38,37.13,14723200,9.28 -1999-04-06,36.81,38.31,36.81,38.00,22455200,9.50 -1999-04-05,36.00,37.88,36.00,37.06,16474400,9.27 -1999-04-01,36.06,36.69,35.75,36.06,9381200,9.02 -1999-03-31,36.38,37.13,35.88,35.94,15086400,8.98 -1999-03-30,35.00,36.38,35.00,35.88,19806800,8.97 -1999-03-29,33.50,35.44,33.44,35.38,20337600,8.85 -1999-03-26,33.75,33.81,33.00,33.25,9080000,8.31 -1999-03-25,34.38,34.88,33.38,33.81,14286800,8.45 -1999-03-24,33.25,33.75,32.50,33.69,14297600,8.42 -1999-03-23,34.44,34.44,32.75,33.00,14842000,8.25 -1999-03-22,34.00,35.19,32.94,35.06,21200800,8.77 -1999-03-19,35.94,36.00,32.88,33.50,19161200,8.38 -1999-03-18,34.38,35.63,34.25,35.50,8126800,8.88 -1999-03-17,35.94,36.06,33.94,34.06,13084400,8.52 -1999-03-16,35.00,35.56,34.94,35.50,14302000,8.88 -1999-03-15,33.31,35.00,33.25,34.06,12586800,8.52 -1999-03-12,32.31,33.50,32.31,33.19,9700000,8.30 -1999-03-11,32.25,33.88,32.00,32.19,16936800,8.05 -1999-03-10,34.19,34.19,32.44,32.56,19526800,8.14 -1999-03-09,34.31,34.38,33.50,34.13,11427600,8.53 -1999-03-08,33.25,34.69,33.19,34.38,19682000,8.60 -1999-03-05,34.31,34.31,32.38,33.19,16735600,8.30 -1999-03-04,34.50,34.50,32.38,33.44,13137600,8.36 -1999-03-03,34.75,35.13,33.50,34.19,10497600,8.55 -1999-03-02,34.13,35.31,33.75,34.63,24414400,8.66 -1999-03-01,34.81,34.81,33.63,33.75,17435200,8.44 -1999-02-26,36.50,37.00,34.50,34.81,23847600,8.70 -1999-02-25,37.31,37.69,36.50,36.94,9455600,9.23 -1999-02-24,38.81,39.00,37.38,37.44,7620000,9.36 -1999-02-23,38.56,39.56,37.94,38.44,11521200,9.61 -1999-02-22,37.38,38.88,37.25,38.44,10682000,9.61 -1999-02-19,36.25,37.69,36.19,37.19,12938800,9.30 -1999-02-18,37.56,37.88,35.56,36.00,17876400,9.00 -1999-02-17,38.13,38.69,36.94,37.00,10581200,9.25 -1999-02-16,38.88,38.88,37.88,38.31,10723600,9.58 -1999-02-12,39.13,39.13,37.00,37.69,15339200,9.42 -1999-02-11,38.75,39.75,38.56,39.63,20200000,9.91 -1999-02-10,36.88,38.69,36.00,38.31,20135200,9.58 -1999-02-09,37.94,39.06,37.06,37.19,25042000,9.30 -1999-02-08,36.69,37.94,36.25,37.75,16723600,9.44 -1999-02-05,38.25,38.38,35.50,36.31,27778000,9.08 -1999-02-04,40.19,40.25,37.75,37.88,16565600,9.47 -1999-02-03,39.00,40.56,38.75,40.19,12108000,10.05 -1999-02-02,40.38,40.75,39.00,39.19,10975600,9.80 -1999-02-01,41.69,41.94,40.31,40.94,9962000,10.23 -1999-01-29,41.19,41.56,40.00,41.19,8684400,10.30 -1999-01-28,40.88,41.25,40.31,40.88,12015600,10.22 -1999-01-27,41.00,41.38,39.94,40.13,13053200,10.03 -1999-01-26,39.94,40.88,39.63,40.50,20002400,10.12 -1999-01-25,39.25,39.56,38.81,39.38,13763200,9.85 -1999-01-22,37.69,39.50,37.06,38.75,12365200,9.69 -1999-01-21,40.44,40.56,37.50,38.81,21449200,9.70 -1999-01-20,41.06,42.00,40.50,40.56,27806800,10.14 -1999-01-19,41.94,42.31,40.38,40.88,19116400,10.22 -1999-01-15,41.81,42.13,40.00,41.31,35933600,10.33 -1999-01-14,45.50,46.00,41.06,41.38,61570000,10.35 -1999-01-13,42.88,47.31,42.25,46.50,37434400,11.62 -1999-01-12,46.31,46.63,44.13,46.13,29330000,11.53 -1999-01-11,45.75,46.06,44.88,45.88,20054400,11.47 -1999-01-08,46.56,46.88,44.00,45.00,24246400,11.25 -1999-01-07,42.25,45.06,42.13,45.00,51056800,11.25 -1999-01-06,44.13,44.13,41.00,41.75,48165200,10.44 -1999-01-05,41.94,43.94,41.50,43.31,50362000,10.83 -1999-01-04,42.13,42.25,40.00,41.25,34049200,10.31 -1998-12-31,40.50,41.38,39.50,40.94,9716400,10.23 -1998-12-30,40.13,41.13,40.00,40.06,8498000,10.02 -1998-12-29,41.13,41.50,40.25,40.81,13853200,10.20 -1998-12-28,39.00,41.13,39.00,40.88,25917600,10.22 -1998-12-24,39.88,40.00,39.19,39.25,7155200,9.81 -1998-12-23,38.63,40.50,38.38,39.81,44124400,9.95 -1998-12-22,36.38,38.13,36.00,38.00,41111200,9.50 -1998-12-21,35.38,35.63,34.25,35.06,12769200,8.77 -1998-12-18,33.38,35.38,33.25,35.19,28283200,8.80 -1998-12-17,32.94,33.75,32.75,33.44,11812000,8.36 -1998-12-16,33.75,34.19,32.63,32.81,13375200,8.20 -1998-12-15,32.75,33.63,32.75,33.56,9462000,8.39 -1998-12-14,32.88,33.31,32.25,32.50,17925200,8.12 -1998-12-11,32.25,34.00,32.00,33.75,24644400,8.44 -1998-12-10,32.69,32.94,31.87,32.00,13980800,8.00 -1998-12-09,32.69,32.88,31.62,32.00,21184400,8.00 -1998-12-08,33.94,33.94,32.00,32.06,24295200,8.02 -1998-12-07,33.38,33.75,32.75,33.75,20255600,8.44 -1998-12-04,34.31,34.44,32.00,32.75,25765200,8.19 -1998-12-03,36.31,36.50,33.63,33.69,22380800,8.42 -1998-12-02,34.13,36.88,33.50,36.00,34382400,9.00 -1998-12-01,32.00,34.81,31.62,34.13,30941200,8.53 -1998-11-30,34.56,34.81,31.75,31.94,20060800,7.99 -1998-11-27,35.06,35.13,34.75,35.06,5483600,8.77 -1998-11-25,35.88,36.06,34.94,35.13,10855600,8.78 -1998-11-24,36.13,36.75,35.75,35.94,11430800,8.98 -1998-11-23,35.56,36.81,35.19,36.25,20642000,9.06 -1998-11-20,36.44,36.75,34.75,35.31,14268000,8.83 -1998-11-19,35.50,37.19,35.44,35.75,12385200,8.94 -1998-11-18,35.19,36.00,34.88,35.44,11781200,8.86 -1998-11-17,35.75,35.81,34.75,34.81,7529200,8.70 -1998-11-16,35.94,36.75,35.44,36.00,13740800,9.00 -1998-11-13,34.94,36.06,34.69,35.69,28301200,8.92 -1998-11-12,33.13,34.44,32.88,34.00,21261200,8.50 -1998-11-11,35.75,35.81,32.75,33.56,33895200,8.39 -1998-11-10,36.19,36.25,35.00,35.13,31576800,8.78 -1998-11-09,37.69,38.13,35.50,36.63,23622000,9.16 -1998-11-06,37.88,38.25,37.25,38.06,28496800,9.52 -1998-11-05,38.38,39.38,38.06,38.19,21684400,9.55 -1998-11-04,38.56,39.13,38.13,38.69,22438000,9.67 -1998-11-03,37.38,38.25,37.31,37.81,13247600,9.45 -1998-11-02,37.50,37.75,37.25,37.63,9076400,9.41 -1998-10-30,36.81,37.50,36.25,37.13,11358000,9.28 -1998-10-29,36.44,37.44,35.81,36.44,12321200,9.11 -1998-10-28,35.25,37.00,35.13,36.81,13006400,9.20 -1998-10-27,38.00,38.94,35.06,35.25,19233200,8.81 -1998-10-26,36.06,37.75,35.50,37.44,17013600,9.36 -1998-10-23,36.75,36.88,35.13,35.50,12732400,8.88 -1998-10-22,36.88,37.63,36.25,36.75,11343200,9.19 -1998-10-21,36.75,37.44,35.75,37.13,15390000,9.28 -1998-10-20,37.94,38.19,36.00,36.06,13649200,9.02 -1998-10-19,36.69,38.06,35.88,37.50,17010000,9.38 -1998-10-16,37.13,38.06,36.50,36.69,21998000,9.17 -1998-10-15,36.25,37.25,35.50,36.63,30037600,9.16 -1998-10-14,39.75,41.31,36.81,37.38,81445600,9.35 -1998-10-13,38.06,39.19,36.00,38.75,33646400,9.69 -1998-10-12,37.50,38.44,36.56,37.44,22250000,9.36 -1998-10-09,31.75,35.25,30.75,35.13,23880000,8.78 -1998-10-08,31.00,31.19,28.50,30.81,24623200,7.70 -1998-10-07,32.38,33.31,31.87,31.94,16920000,7.99 -1998-10-06,33.69,34.31,32.50,32.56,14281200,8.14 -1998-10-05,34.00,34.56,31.50,32.19,19726800,8.05 -1998-10-02,35.50,36.25,34.13,35.06,16998800,8.77 -1998-10-01,36.75,38.00,35.38,35.69,13234400,8.92 -1998-09-30,38.75,39.25,38.00,38.13,5976800,9.53 -1998-09-29,39.06,40.00,38.13,39.50,10907600,9.88 -1998-09-28,39.75,40.19,38.00,39.06,14501200,9.77 -1998-09-25,38.19,39.19,37.63,38.75,8172000,9.69 -1998-09-24,37.88,39.56,37.75,38.50,17246800,9.62 -1998-09-23,37.25,38.38,36.56,38.31,10284400,9.58 -1998-09-22,37.13,37.63,36.38,37.00,9218800,9.25 -1998-09-21,35.69,36.94,35.31,36.94,10570800,9.23 -1998-09-18,36.06,36.75,35.56,36.75,10904400,9.19 -1998-09-17,36.06,37.13,35.88,36.00,9627600,9.00 -1998-09-16,38.63,38.75,37.00,37.31,9248800,9.33 -1998-09-15,36.75,38.56,36.50,38.19,15492000,9.55 -1998-09-14,38.25,38.81,37.13,37.19,8837600,9.30 -1998-09-11,38.50,39.63,36.88,37.63,12593600,9.41 -1998-09-10,36.25,38.25,35.75,38.13,18826800,9.53 -1998-09-09,38.06,38.13,37.00,37.38,12683200,9.35 -1998-09-08,38.00,38.25,36.75,38.25,14400000,9.56 -1998-09-04,35.50,36.44,33.75,35.13,13493200,8.78 -1998-09-03,35.00,35.13,34.00,34.63,14653200,8.66 -1998-09-02,35.50,37.38,35.25,35.56,30122400,8.89 -1998-09-01,31.37,35.38,30.62,34.13,31060000,8.53 -1998-08-31,34.75,34.88,31.00,31.19,31012400,7.80 -1998-08-28,37.13,38.50,34.13,34.19,33303200,8.55 -1998-08-27,39.25,39.25,35.63,37.50,39813600,9.38 -1998-08-26,39.88,41.13,39.50,40.38,14538000,10.10 -1998-08-25,42.38,42.38,40.31,40.81,17709200,10.20 -1998-08-24,43.44,43.50,40.13,41.19,21810000,10.30 -1998-08-21,40.00,43.56,39.00,43.00,29054400,10.75 -1998-08-20,41.00,41.13,40.25,40.63,14018000,10.16 -1998-08-19,43.50,43.75,41.00,41.00,17377600,10.25 -1998-08-18,42.44,43.38,42.25,42.56,21642000,10.64 -1998-08-17,41.00,42.81,39.88,41.94,33248800,10.48 -1998-08-14,40.69,40.75,39.50,40.50,16110000,10.12 -1998-08-13,39.94,40.75,39.38,39.44,13976800,9.86 -1998-08-12,39.75,40.94,39.48,40.06,24654400,10.02 -1998-08-11,37.75,41.00,37.38,39.00,62860000,9.75 -1998-08-10,36.31,38.06,36.25,37.94,17455600,9.48 -1998-08-07,37.19,37.38,36.00,36.50,10645600,9.12 -1998-08-06,35.06,36.88,34.88,36.88,15678800,9.22 -1998-08-05,33.75,36.00,33.50,36.00,16226800,9.00 -1998-08-04,35.50,36.00,34.00,34.19,10506800,8.55 -1998-08-03,34.25,35.56,33.25,35.13,10786800,8.78 -1998-07-31,36.63,36.75,34.50,34.63,6550800,8.66 -1998-07-30,35.81,36.75,35.50,36.50,12950000,9.12 -1998-07-29,33.75,35.88,33.69,35.13,16006800,8.78 -1998-07-28,34.06,34.63,33.00,33.63,8054400,8.41 -1998-07-27,34.25,34.88,33.25,34.44,7657600,8.61 -1998-07-24,35.38,35.50,33.81,34.69,9693600,8.67 -1998-07-23,34.81,35.63,34.75,34.94,9040800,8.73 -1998-07-22,34.94,35.63,34.25,35.00,10040800,8.75 -1998-07-21,36.13,37.00,35.56,35.63,11772400,8.91 -1998-07-20,36.56,36.63,35.50,36.25,13727600,9.06 -1998-07-17,37.25,37.25,36.19,36.88,22486400,9.22 -1998-07-16,37.88,38.13,35.75,37.50,91497600,9.38 -1998-07-15,33.69,34.69,33.50,34.44,21253600,8.61 -1998-07-14,33.94,34.00,33.13,33.44,19607600,8.36 -1998-07-13,31.94,34.13,31.87,33.94,25566400,8.48 -1998-07-10,32.19,32.63,31.75,32.06,10806800,8.02 -1998-07-09,32.94,33.63,31.44,31.69,20256400,7.92 -1998-07-08,30.75,32.94,30.69,32.56,33334400,8.14 -1998-07-07,30.37,30.87,30.00,30.50,8637600,7.62 -1998-07-06,29.50,30.37,29.12,30.37,9697600,7.59 -1998-07-02,29.69,30.06,29.00,29.00,10650800,7.25 -1998-07-01,28.87,30.00,28.50,29.94,11228800,7.49 -1998-06-30,28.62,28.81,28.12,28.69,4681200,7.17 -1998-06-29,28.25,28.81,28.06,28.69,5943600,7.17 -1998-06-26,28.50,28.62,27.75,28.19,3973200,7.05 -1998-06-25,28.56,28.81,28.31,28.56,6856400,7.14 -1998-06-24,27.75,28.62,27.31,28.25,9788800,7.06 -1998-06-23,27.44,28.12,27.25,27.81,8258800,6.95 -1998-06-22,27.00,27.56,26.75,27.37,4809200,6.84 -1998-06-19,27.37,27.44,26.75,27.06,4931200,6.76 -1998-06-18,27.75,28.06,27.19,27.31,4288800,6.83 -1998-06-17,28.00,28.56,27.94,28.12,6687600,7.03 -1998-06-16,27.69,28.12,27.31,28.00,4649200,7.00 -1998-06-15,27.25,28.25,27.25,27.50,4881200,6.88 -1998-06-12,27.62,28.25,27.37,28.12,8014400,7.03 -1998-06-11,28.19,28.62,27.81,27.81,6451200,6.95 -1998-06-10,28.00,29.00,27.62,28.06,8202000,7.01 -1998-06-09,27.37,28.50,27.37,28.25,9852400,7.06 -1998-06-08,27.00,27.69,26.81,27.25,4523600,6.81 -1998-06-05,26.87,27.25,26.37,26.87,4406800,6.72 -1998-06-04,26.62,26.87,25.81,26.81,5585600,6.70 -1998-06-03,27.12,27.25,26.19,26.31,5196800,6.58 -1998-06-02,26.44,27.31,26.00,26.87,6405600,6.72 -1998-06-01,26.50,27.62,25.62,26.25,11427600,6.56 -1998-05-29,27.50,27.56,26.44,26.62,7751200,6.66 -1998-05-28,26.75,27.87,26.75,27.44,10672000,6.86 -1998-05-27,25.69,26.81,25.62,26.75,13233200,6.69 -1998-05-26,28.06,28.25,26.62,26.69,11143200,6.67 -1998-05-22,28.75,28.75,27.31,27.87,9522000,6.97 -1998-05-21,29.56,29.69,28.62,28.87,4700000,7.22 -1998-05-20,29.62,29.87,28.75,29.56,6810000,7.39 -1998-05-19,28.94,29.44,28.81,29.37,7815200,7.34 -1998-05-18,29.37,29.56,28.37,28.50,8310800,7.12 -1998-05-15,30.06,30.37,29.25,29.56,9743600,7.39 -1998-05-14,30.37,30.44,29.75,30.06,5815600,7.51 -1998-05-13,30.06,30.81,29.62,30.44,11245600,7.61 -1998-05-12,30.56,30.75,29.94,30.12,9212000,7.53 -1998-05-11,30.87,31.62,30.75,30.94,23768000,7.74 -1998-05-08,30.06,30.50,29.94,30.44,9690000,7.61 -1998-05-07,30.56,30.62,29.87,30.19,19761200,7.55 -1998-05-06,29.87,30.44,29.25,30.31,32056400,7.58 -1998-05-05,29.25,29.87,29.12,29.69,14982400,7.42 -1998-05-04,28.87,29.50,28.87,29.06,20419200,7.26 -1998-05-01,27.50,28.25,26.87,28.00,6582000,7.00 -1998-04-30,27.37,27.62,27.06,27.37,6442000,6.84 -1998-04-29,26.94,27.44,26.75,27.00,6774400,6.75 -1998-04-28,27.87,28.00,26.25,26.94,8487600,6.74 -1998-04-27,26.75,27.75,26.75,27.75,14655600,6.94 -1998-04-24,27.75,28.25,27.50,27.94,7708000,6.99 -1998-04-23,27.44,29.00,27.19,27.69,16983200,6.92 -1998-04-22,28.75,29.00,27.50,27.50,10186400,6.88 -1998-04-21,29.06,29.12,28.50,29.00,12446400,7.25 -1998-04-20,27.62,29.50,27.56,29.00,18498800,7.25 -1998-04-17,28.56,28.62,27.69,27.94,21165200,6.99 -1998-04-16,29.25,29.62,28.19,28.62,65642000,7.16 -1998-04-15,27.19,27.50,26.62,27.44,19928800,6.86 -1998-04-14,26.37,27.25,26.37,26.94,11725200,6.74 -1998-04-13,25.62,26.69,25.00,26.44,10305600,6.61 -1998-04-09,25.06,25.87,25.00,25.62,6083600,6.41 -1998-04-08,25.25,25.37,24.69,25.00,8044400,6.25 -1998-04-07,25.81,26.00,24.87,25.50,10461200,6.38 -1998-04-06,27.00,27.00,26.19,26.25,12422000,6.56 -1998-04-03,27.12,27.25,26.81,27.06,7259200,6.76 -1998-04-02,27.31,27.44,26.94,27.31,6950800,6.83 -1998-04-01,27.44,27.81,27.06,27.50,6693600,6.88 -1998-03-31,27.44,27.81,27.25,27.50,9538800,6.88 -1998-03-30,26.75,27.50,26.75,27.44,8972400,6.86 -1998-03-27,26.62,27.31,26.37,26.94,9133200,6.74 -1998-03-26,26.75,27.00,26.44,26.56,7253600,6.64 -1998-03-25,27.62,27.75,26.37,27.16,13854400,6.79 -1998-03-24,26.37,28.00,26.25,28.00,24152000,7.00 -1998-03-23,25.94,26.25,24.62,26.12,14818800,6.53 -1998-03-20,26.69,26.87,26.00,26.37,7704400,6.59 -1998-03-19,26.87,26.94,26.56,26.75,5736800,6.69 -1998-03-18,26.00,26.94,26.00,26.94,9900000,6.74 -1998-03-17,26.50,26.69,25.87,26.34,14658800,6.59 -1998-03-16,27.12,27.25,26.19,26.69,14375600,6.67 -1998-03-13,27.25,27.25,26.25,27.12,20231200,6.78 -1998-03-12,26.12,27.00,25.56,27.00,26598000,6.75 -1998-03-11,25.12,26.19,24.56,26.12,43374400,6.53 -1998-03-10,23.00,24.50,22.94,24.06,25472400,6.01 -1998-03-09,23.75,24.31,22.50,22.75,20540800,5.69 -1998-03-06,23.87,24.50,23.37,24.44,23803600,6.11 -1998-03-05,23.25,24.25,23.12,24.06,24129200,6.01 -1998-03-04,22.87,24.75,22.87,24.44,29212400,6.11 -1998-03-03,21.87,23.19,21.62,23.12,11937600,5.78 -1998-03-02,23.56,23.56,22.25,22.75,14313600,5.69 -1998-02-27,23.31,23.87,22.56,23.62,18578000,5.91 -1998-02-26,22.31,23.56,21.87,23.50,21263200,5.88 -1998-02-25,21.31,22.75,20.94,22.31,25459200,5.58 -1998-02-24,21.31,21.37,20.75,21.31,16322000,5.33 -1998-02-23,20.12,21.62,20.00,21.25,17060800,5.31 -1998-02-20,20.50,20.56,19.81,20.00,11634400,5.00 -1998-02-19,20.87,20.94,20.00,20.44,14292400,5.11 -1998-02-18,19.56,20.75,19.56,20.56,17677600,5.14 -1998-02-17,19.50,19.75,19.50,19.62,6530800,4.91 -1998-02-13,19.19,19.87,19.00,19.50,7444400,4.88 -1998-02-12,19.12,19.44,19.06,19.37,7297600,4.84 -1998-02-11,19.50,19.50,18.87,19.00,7582000,4.75 -1998-02-10,19.12,19.56,19.06,19.44,15090000,4.86 -1998-02-09,18.37,19.50,18.37,19.19,17682000,4.80 -1998-02-06,18.37,18.69,18.25,18.50,7241200,4.62 -1998-02-05,18.25,18.50,18.00,18.31,8526400,4.58 -1998-02-04,18.06,18.50,18.00,18.25,6100000,4.56 -1998-02-03,17.69,18.62,17.69,18.31,14390000,4.58 -1998-02-02,18.50,18.50,17.37,17.69,22752400,4.42 -1998-01-30,18.31,18.87,18.25,18.31,5802400,4.58 -1998-01-29,18.94,19.12,18.50,18.50,7571200,4.62 -1998-01-28,19.19,19.37,18.62,19.19,5418000,4.80 -1998-01-27,19.19,19.69,19.00,19.12,4013200,4.78 -1998-01-26,19.44,19.56,18.81,19.44,5246800,4.86 -1998-01-23,19.37,19.69,19.25,19.50,8331200,4.88 -1998-01-22,18.69,19.75,18.62,19.25,11785200,4.81 -1998-01-21,18.75,19.06,18.56,18.91,6812000,4.73 -1998-01-20,19.06,19.31,18.62,19.06,8642400,4.76 -1998-01-16,19.44,19.44,18.69,18.81,8820000,4.70 -1998-01-15,19.19,19.75,18.62,19.19,19982000,4.80 -1998-01-14,19.87,19.94,19.25,19.75,21048000,4.94 -1998-01-13,18.62,19.62,18.50,19.50,22758800,4.88 -1998-01-12,17.44,18.62,17.12,18.25,18444400,4.56 -1998-01-09,18.12,19.37,17.50,18.19,31675200,4.55 -1998-01-08,17.44,18.62,16.94,18.19,27645600,4.55 -1998-01-07,18.81,19.00,17.31,17.50,37201200,4.38 -1998-01-06,15.94,20.00,14.75,18.94,64737600,4.74 -1998-01-05,16.50,16.56,15.19,15.88,23282000,3.97 -1998-01-02,13.63,16.25,13.50,16.25,25650800,4.06 -1997-12-31,13.13,13.63,12.94,13.13,14531200,3.28 -1997-12-30,13.00,13.44,12.75,13.19,12250800,3.30 -1997-12-29,13.31,13.44,12.88,13.13,9944400,3.28 -1997-12-26,13.06,13.38,13.00,13.31,3860000,3.33 -1997-12-24,13.00,13.25,13.00,13.13,3502000,3.28 -1997-12-23,13.13,13.31,12.94,12.94,16402000,3.23 -1997-12-22,13.88,14.00,13.19,13.31,5704400,3.33 -1997-12-19,13.56,13.88,13.25,13.69,6812000,3.42 -1997-12-18,14.00,14.00,13.75,13.81,7225200,3.45 -1997-12-17,14.31,14.56,13.94,13.94,9494400,3.48 -1997-12-16,14.00,14.38,14.00,14.31,6646400,3.58 -1997-12-15,14.13,14.25,13.75,13.94,5927600,3.48 -1997-12-12,14.75,14.88,14.00,14.13,5742400,3.53 -1997-12-11,14.44,14.56,13.88,14.56,9185600,3.64 -1997-12-10,15.06,15.06,14.50,14.75,6960000,3.69 -1997-12-09,15.50,15.69,15.00,15.25,8680800,3.81 -1997-12-08,15.56,15.75,15.38,15.56,4776800,3.89 -1997-12-05,15.56,16.00,15.56,15.81,7926400,3.95 -1997-12-04,16.00,16.00,15.63,15.63,7135600,3.91 -1997-12-03,16.06,16.12,15.69,15.75,12258800,3.94 -1997-12-02,17.37,17.50,15.88,15.88,14178800,3.97 -1997-12-01,17.69,17.94,17.25,17.75,3135600,4.44 -1997-11-28,17.62,17.87,17.44,17.75,1495600,4.44 -1997-11-26,17.37,17.69,17.25,17.50,2178800,4.38 -1997-11-25,17.69,17.87,16.87,17.37,7346400,4.34 -1997-11-24,17.56,18.00,17.50,17.62,5630800,4.41 -1997-11-21,18.62,18.69,18.00,18.19,3498800,4.55 -1997-11-20,18.19,18.62,18.12,18.50,4587600,4.62 -1997-11-19,17.87,18.31,17.87,18.25,2843600,4.56 -1997-11-18,18.50,18.50,18.06,18.06,5258000,4.51 -1997-11-17,18.87,18.94,18.33,18.50,7323600,4.62 -1997-11-14,18.25,18.50,18.00,18.44,4835600,4.61 -1997-11-13,18.00,18.06,17.50,18.00,9218000,4.50 -1997-11-12,18.06,18.50,17.56,17.62,7448000,4.41 -1997-11-11,19.00,19.00,18.12,18.37,11893600,4.59 -1997-11-10,21.00,21.50,18.50,18.69,49946800,4.67 -1997-11-07,18.87,20.00,18.75,19.75,28423200,4.94 -1997-11-06,18.87,19.50,18.87,19.00,22060800,4.75 -1997-11-05,18.25,18.62,18.06,18.37,13840000,4.59 -1997-11-04,17.75,18.12,17.50,17.94,6033200,4.49 -1997-11-03,17.56,17.75,17.06,17.37,4512000,4.34 -1997-10-31,17.37,17.37,16.62,17.03,9549200,4.26 -1997-10-30,17.06,17.56,16.50,16.50,6764400,4.12 -1997-10-29,18.44,18.50,17.25,17.50,6355200,4.38 -1997-10-28,16.00,18.50,15.88,18.12,12273200,4.53 -1997-10-27,16.75,18.12,16.75,16.75,11764400,4.19 -1997-10-24,18.12,18.37,16.50,16.56,13880000,4.14 -1997-10-23,18.00,18.19,17.75,17.75,6688000,4.44 -1997-10-22,19.06,19.25,18.50,18.56,5421200,4.64 -1997-10-21,18.87,19.31,18.69,19.06,16982000,4.76 -1997-10-20,20.12,20.19,18.62,18.69,14724400,4.67 -1997-10-17,21.12,21.12,19.87,20.12,15682000,5.03 -1997-10-16,21.12,22.06,20.87,21.50,26422000,5.38 -1997-10-15,22.12,24.75,22.12,23.81,28982000,5.95 -1997-10-14,22.69,22.75,22.19,22.69,5923200,5.67 -1997-10-13,22.75,22.87,22.19,22.69,5679200,5.67 -1997-10-10,21.50,22.75,21.50,22.69,9666800,5.67 -1997-10-09,21.25,22.50,21.19,21.75,6696400,5.44 -1997-10-08,21.75,21.81,21.31,21.50,3891200,5.38 -1997-10-07,21.87,22.00,21.81,21.81,3916400,5.45 -1997-10-06,22.19,22.25,21.69,21.94,3338800,5.49 -1997-10-03,22.00,22.25,21.69,22.12,5813200,5.53 -1997-10-02,21.44,22.00,21.37,21.94,4856400,5.49 -1997-10-01,21.69,21.75,21.37,21.53,4670800,5.38 -1997-09-30,22.00,22.31,21.69,21.69,5032000,5.42 -1997-09-29,21.69,22.25,21.56,22.06,5980000,5.51 -1997-09-26,21.50,21.94,21.12,21.31,7440000,5.33 -1997-09-25,21.31,21.75,21.00,21.12,7988000,5.28 -1997-09-24,21.69,21.75,21.37,21.50,7957600,5.38 -1997-09-23,22.25,22.25,21.69,21.75,7163200,5.44 -1997-09-22,22.12,23.06,22.00,22.81,7176400,5.70 -1997-09-19,22.19,22.19,21.75,21.94,3407600,5.49 -1997-09-18,21.50,22.50,21.50,22.31,6042400,5.58 -1997-09-17,22.00,22.00,21.69,21.81,3109200,5.45 -1997-09-16,22.06,22.14,21.75,21.94,4812400,5.49 -1997-09-15,21.87,22.12,21.50,21.50,3473200,5.38 -1997-09-12,22.19,22.25,21.44,22.06,4071200,5.51 -1997-09-11,22.87,23.00,22.06,22.37,7504400,5.59 -1997-09-10,21.75,23.12,21.69,22.94,9803600,5.74 -1997-09-09,21.31,21.87,21.25,21.81,5702000,5.45 -1997-09-08,22.25,22.25,21.44,21.50,6264400,5.38 -1997-09-05,22.62,22.87,22.00,22.19,4883600,5.55 -1997-09-04,22.56,22.87,22.25,22.50,4385600,5.62 -1997-09-03,22.37,23.25,22.31,22.50,10163200,5.62 -1997-09-02,22.00,22.56,21.94,22.37,6646800,5.59 -1997-08-29,21.81,22.00,21.50,21.75,3937600,5.44 -1997-08-28,22.12,22.50,22.00,22.00,3426400,5.50 -1997-08-27,22.37,22.75,21.87,22.69,6813200,5.67 -1997-08-26,22.62,23.00,22.12,22.25,8100800,5.56 -1997-08-25,23.62,23.69,22.94,23.06,4968800,5.76 -1997-08-22,23.44,24.00,23.37,23.62,8135200,5.91 -1997-08-21,24.50,24.69,23.87,24.00,9271200,6.00 -1997-08-20,24.44,25.12,24.19,24.62,11595200,6.16 -1997-08-19,23.69,24.50,23.31,24.44,10331200,6.11 -1997-08-18,23.31,23.75,22.75,23.62,7791200,5.91 -1997-08-15,23.12,23.44,22.81,23.25,9320000,5.81 -1997-08-14,23.62,24.25,22.69,23.00,15536400,5.75 -1997-08-13,22.25,23.87,20.44,23.62,42923600,5.91 -1997-08-12,24.06,24.25,21.87,22.06,37444400,5.51 -1997-08-11,26.31,26.44,23.50,24.56,55411200,6.14 -1997-08-08,27.81,28.37,26.12,26.81,64809200,6.70 -1997-08-07,28.75,29.56,28.37,29.19,134124400,7.30 -1997-08-06,25.25,27.75,25.00,26.31,149671200,6.58 -1997-08-05,19.94,20.00,19.48,19.75,8840800,4.94 -1997-08-04,19.19,19.81,19.19,19.75,21851200,4.94 -1997-08-01,17.62,19.19,17.56,19.19,17217600,4.80 -1997-07-31,17.37,17.75,17.25,17.50,9434400,4.38 -1997-07-30,16.94,17.69,16.75,17.37,13372400,4.34 -1997-07-29,16.44,16.62,16.37,16.50,2558000,4.12 -1997-07-28,16.44,16.50,16.25,16.44,3962000,4.11 -1997-07-25,15.88,16.56,15.75,16.25,7798000,4.06 -1997-07-24,16.12,16.12,15.63,15.81,4772000,3.95 -1997-07-23,16.75,16.87,16.00,16.12,5049200,4.03 -1997-07-22,16.37,16.69,16.31,16.56,8274400,4.14 -1997-07-21,17.56,17.69,16.00,16.16,12695600,4.04 -1997-07-18,17.87,17.94,17.06,17.34,11353600,4.34 -1997-07-17,17.00,18.12,16.44,17.50,26659200,4.38 -1997-07-16,15.81,16.50,15.63,16.44,15947600,4.11 -1997-07-15,15.75,16.00,15.63,15.94,14953200,3.98 -1997-07-14,15.25,15.63,14.88,15.63,14700800,3.91 -1997-07-11,13.38,15.50,13.31,15.19,26252400,3.80 -1997-07-10,12.88,13.38,12.75,13.25,17606400,3.31 -1997-07-09,13.81,13.88,13.63,13.69,5090000,3.42 -1997-07-08,13.88,14.00,13.69,13.75,3427600,3.44 -1997-07-07,13.94,14.25,13.75,13.81,6860000,3.45 -1997-07-03,13.13,13.88,13.00,13.69,6688000,3.42 -1997-07-02,13.25,13.38,13.00,13.06,8931200,3.27 -1997-07-01,13.94,14.00,13.13,13.19,16104400,3.30 -1997-06-30,14.75,14.75,14.00,14.25,6132400,3.56 -1997-06-27,14.69,14.81,14.63,14.69,5642000,3.67 -1997-06-26,15.13,15.13,14.63,14.69,13643600,3.67 -1997-06-25,15.31,15.38,15.00,15.13,7102000,3.78 -1997-06-24,15.44,15.56,15.25,15.31,3974800,3.83 -1997-06-23,15.50,15.63,15.38,15.38,3574800,3.85 -1997-06-20,15.69,15.75,15.50,15.56,3943600,3.89 -1997-06-19,16.00,16.00,15.69,15.75,4323600,3.94 -1997-06-18,16.12,16.25,15.75,15.94,3936400,3.98 -1997-06-17,15.56,16.50,15.50,16.34,5080800,4.09 -1997-06-16,15.88,15.88,15.38,15.50,4800800,3.88 -1997-06-13,16.06,16.12,15.75,15.81,4737600,3.95 -1997-06-12,16.37,16.37,16.00,16.06,2816400,4.01 -1997-06-11,16.31,16.44,16.25,16.31,3766800,4.08 -1997-06-10,16.75,16.75,16.06,16.25,4969200,4.06 -1997-06-09,16.69,16.94,16.62,16.62,2689200,4.16 -1997-06-06,16.62,16.75,16.50,16.75,1893200,4.19 -1997-06-05,16.62,17.12,16.56,16.69,2323200,4.17 -1997-06-04,16.62,16.75,16.50,16.62,2889200,4.16 -1997-06-03,16.75,16.94,16.62,16.69,2335600,4.17 -1997-06-02,17.00,17.00,16.75,16.94,1488000,4.24 -1997-05-30,16.50,17.00,16.37,16.62,6340800,4.16 -1997-05-29,17.12,17.12,16.62,16.62,3976800,4.16 -1997-05-28,17.37,17.50,17.00,17.00,3130000,4.25 -1997-05-27,16.75,17.37,16.75,17.25,2938000,4.31 -1997-05-23,16.62,17.00,16.62,16.87,2413200,4.22 -1997-05-22,16.75,16.87,16.50,16.62,2753600,4.16 -1997-05-21,17.12,17.12,16.50,16.87,4369200,4.22 -1997-05-20,17.00,17.44,16.75,17.25,3046400,4.31 -1997-05-19,17.50,17.62,17.00,17.00,1881200,4.25 -1997-05-16,17.50,17.62,17.25,17.25,3338800,4.31 -1997-05-15,17.75,18.00,17.50,17.75,3544800,4.44 -1997-05-14,17.87,18.00,17.50,17.69,4846800,4.42 -1997-05-13,17.50,17.87,17.00,17.56,7056800,4.39 -1997-05-12,17.25,17.62,17.00,17.56,5898800,4.39 -1997-05-09,17.00,17.50,17.00,17.06,6732000,4.26 -1997-05-08,16.62,17.12,16.50,17.00,2963200,4.25 -1997-05-07,16.87,17.00,16.37,16.50,4101200,4.12 -1997-05-06,17.00,17.12,16.75,16.87,2974800,4.22 -1997-05-05,17.00,17.12,16.75,17.00,3538800,4.25 -1997-05-02,17.00,17.12,16.75,17.00,3643600,4.25 -1997-05-01,16.87,17.12,16.75,17.00,2596800,4.25 -1997-04-30,17.00,17.25,16.75,17.00,9202000,4.25 -1997-04-29,18.00,18.00,17.50,17.69,1853200,4.42 -1997-04-28,17.75,17.87,17.50,17.62,1687600,4.41 -1997-04-25,17.62,17.87,17.37,17.50,3121200,4.38 -1997-04-24,18.50,18.50,17.75,17.87,2696800,4.47 -1997-04-23,18.37,18.50,18.12,18.12,1960800,4.53 -1997-04-22,18.12,18.50,17.87,18.50,3392000,4.62 -1997-04-21,18.62,18.62,18.00,18.00,3197600,4.50 -1997-04-18,19.12,19.12,18.37,18.37,5058000,4.59 -1997-04-17,18.25,19.12,18.12,19.00,7859200,4.75 -1997-04-16,18.62,19.00,18.37,18.56,3101200,4.64 -1997-04-15,19.12,19.25,18.12,18.44,4869200,4.61 -1997-04-14,18.37,18.87,18.00,18.75,4020000,4.69 -1997-04-11,18.87,18.87,18.12,18.25,2842400,4.56 -1997-04-10,19.00,19.12,18.50,18.87,4188000,4.72 -1997-04-09,19.25,19.25,18.87,19.00,8766400,4.75 -1997-04-08,19.62,19.62,18.62,19.12,6923600,4.78 -1997-04-07,19.75,19.87,19.25,19.50,9136800,4.88 -1997-04-04,19.12,19.62,19.00,19.25,16980800,4.81 -1997-04-03,18.50,19.12,18.25,18.87,19603200,4.72 -1997-04-02,17.87,18.06,17.62,18.00,7957600,4.50 -1997-04-01,17.62,17.81,17.37,17.50,7881200,4.38 -1997-03-31,18.62,19.37,17.25,18.25,34658000,4.56 -1997-03-27,17.50,19.25,17.25,18.62,40695200,4.66 -1997-03-26,16.37,16.87,16.25,16.75,3824400,4.19 -1997-03-25,16.62,16.62,16.08,16.50,4031200,4.12 -1997-03-24,16.50,16.62,16.25,16.50,2556800,4.12 -1997-03-21,17.50,17.50,16.37,16.62,4892400,4.16 -1997-03-20,16.00,17.50,15.88,17.25,11324400,4.31 -1997-03-19,16.37,16.37,15.88,16.12,7457600,4.03 -1997-03-18,16.37,16.50,16.12,16.25,4548800,4.06 -1997-03-17,16.25,16.50,16.00,16.50,6886400,4.12 -1997-03-14,16.37,16.75,16.25,16.56,8245600,4.14 -1997-03-13,16.37,16.37,16.12,16.37,3772000,4.09 -1997-03-12,16.25,16.75,16.12,16.25,2544400,4.06 -1997-03-11,16.62,16.62,16.00,16.37,3539200,4.09 -1997-03-10,16.62,16.75,16.44,16.62,3554800,4.16 -1997-03-07,16.75,16.75,16.37,16.50,2523200,4.12 -1997-03-06,17.00,17.00,16.50,16.62,4172000,4.16 -1997-03-05,16.62,17.00,16.50,17.00,3453600,4.25 -1997-03-04,16.25,16.50,16.00,16.50,3688800,4.12 -1997-03-03,16.50,16.50,16.00,16.12,4670000,4.03 -1997-02-28,16.87,16.87,16.25,16.25,4371200,4.06 -1997-02-27,17.00,17.12,16.75,17.00,3700000,4.25 -1997-02-26,17.00,17.12,16.75,17.12,3687600,4.28 -1997-02-25,17.00,17.37,16.87,16.87,4938000,4.22 -1997-02-24,16.25,16.87,16.25,16.62,4222000,4.16 -1997-02-21,16.87,17.00,16.00,16.37,7549200,4.09 -1997-02-20,17.62,17.62,17.00,17.00,4474800,4.25 -1997-02-19,17.87,17.87,17.12,17.62,8627600,4.41 -1997-02-18,16.62,17.87,16.25,17.87,13171200,4.47 -1997-02-14,16.25,16.37,16.00,16.31,8492000,4.08 -1997-02-13,15.75,16.12,15.50,16.12,7013200,4.03 -1997-02-12,15.75,15.88,15.50,15.75,6303600,3.94 -1997-02-11,15.88,16.00,15.50,15.69,5004400,3.92 -1997-02-10,16.12,16.12,15.63,15.63,6633600,3.91 -1997-02-07,16.50,16.50,15.75,15.81,8403600,3.95 -1997-02-06,15.25,16.12,15.25,16.00,14283600,4.00 -1997-02-05,15.25,15.63,15.25,15.25,14093600,3.81 -1997-02-04,16.25,16.37,15.13,15.38,25458000,3.85 -1997-02-03,16.87,17.00,16.25,16.31,13162000,4.08 -1997-01-31,16.62,16.62,16.50,16.62,7135200,4.16 -1997-01-30,16.75,16.75,16.50,16.75,5018800,4.19 -1997-01-29,16.62,16.75,16.50,16.62,5428000,4.16 -1997-01-28,17.00,17.00,16.50,16.62,7520000,4.16 -1997-01-27,17.12,17.25,16.62,16.62,7646800,4.16 -1997-01-24,17.25,17.25,16.87,16.87,6726800,4.22 -1997-01-23,17.25,17.37,17.12,17.25,6175200,4.31 -1997-01-22,17.37,17.50,17.00,17.19,7356800,4.30 -1997-01-21,17.00,17.25,16.87,17.25,10179200,4.31 -1997-01-20,16.87,17.12,16.75,16.94,10423600,4.24 -1997-01-17,16.75,17.12,16.62,16.75,11619200,4.19 -1997-01-16,17.12,17.12,16.62,16.75,23983600,4.19 -1997-01-15,18.00,18.00,17.12,17.25,15483200,4.31 -1997-01-14,18.37,18.37,17.75,17.87,9143200,4.47 -1997-01-13,18.50,18.50,18.12,18.12,10942000,4.53 -1997-01-10,17.62,18.25,17.62,18.25,12651200,4.56 -1997-01-09,17.75,17.87,17.50,17.75,15970000,4.44 -1997-01-08,18.25,18.37,17.37,17.62,39296400,4.41 -1997-01-07,18.12,18.25,17.50,17.50,34896400,4.38 -1997-01-06,17.62,18.34,17.25,17.87,67246400,4.47 -1997-01-03,21.12,22.25,21.00,21.75,4295600,5.44 -1997-01-02,21.12,21.25,20.75,21.00,5128800,5.25 -1996-12-31,21.37,21.50,20.75,20.87,13719200,5.22 -1996-12-30,23.12,23.25,21.75,21.75,9366800,5.44 -1996-12-27,22.87,23.75,22.87,23.12,4900000,5.78 -1996-12-26,23.25,23.25,22.87,23.00,3049200,5.75 -1996-12-24,23.25,23.37,22.87,23.12,2067600,5.78 -1996-12-23,24.00,24.25,23.25,23.25,11883600,5.81 -1996-12-20,22.50,23.62,21.37,23.50,19535600,5.88 -1996-12-19,23.00,23.25,22.25,22.25,4893600,5.56 -1996-12-18,22.75,23.12,22.62,23.12,7326400,5.78 -1996-12-17,22.37,22.50,22.25,22.50,5625200,5.62 -1996-12-16,23.50,23.50,22.50,22.62,5335600,5.66 -1996-12-13,23.75,23.87,23.25,23.25,3194400,5.81 -1996-12-12,24.12,24.25,23.87,23.87,3122400,5.97 -1996-12-11,23.75,24.25,23.75,24.00,5853600,6.00 -1996-12-10,24.87,25.00,24.25,24.50,6593600,6.12 -1996-12-09,25.25,25.37,24.81,25.00,5680800,6.25 -1996-12-06,24.37,25.37,24.00,25.12,8210800,6.28 -1996-12-05,25.00,25.25,25.00,25.00,5096800,6.25 -1996-12-04,25.12,25.37,24.87,25.00,6823600,6.25 -1996-12-03,25.25,25.50,25.00,25.12,9840800,6.28 -1996-12-02,24.12,25.12,23.87,25.12,6254400,6.28 -1996-11-29,24.50,24.62,24.00,24.12,1527600,6.03 -1996-11-27,24.12,24.62,24.12,24.50,3191200,6.12 -1996-11-26,24.87,25.00,24.00,24.25,4054800,6.06 -1996-11-25,25.37,25.50,25.00,25.00,2830800,6.25 -1996-11-22,24.50,25.25,24.50,25.25,3732400,6.31 -1996-11-21,24.87,25.00,24.37,24.50,2522400,6.12 -1996-11-20,24.87,25.37,24.87,25.00,3683200,6.25 -1996-11-19,24.87,25.12,24.62,24.87,4446400,6.22 -1996-11-18,25.00,25.12,24.50,24.75,5468800,6.19 -1996-11-15,25.87,26.00,25.00,25.00,4684400,6.25 -1996-11-14,25.50,25.75,25.37,25.62,1740800,6.41 -1996-11-13,25.37,25.87,25.00,25.56,3000800,6.39 -1996-11-12,26.12,26.25,25.12,25.25,5120000,6.31 -1996-11-11,26.37,26.37,25.87,26.00,3318800,6.50 -1996-11-08,25.87,26.25,25.75,26.25,6750800,6.56 -1996-11-07,25.37,26.00,25.25,25.87,5548800,6.47 -1996-11-06,25.62,25.75,24.87,25.50,6462000,6.38 -1996-11-05,24.50,25.87,24.50,25.50,13517600,6.38 -1996-11-04,24.37,24.50,23.75,24.37,3270800,6.09 -1996-11-01,23.37,24.25,23.12,24.25,7563200,6.06 -1996-10-31,23.25,23.37,22.25,23.00,6945600,5.75 -1996-10-30,23.50,24.00,22.87,22.87,9192000,5.72 -1996-10-29,24.62,24.75,23.12,23.25,7135200,5.81 -1996-10-28,25.12,25.12,24.50,24.50,4288800,6.12 -1996-10-25,24.87,25.00,24.50,24.50,2775600,6.12 -1996-10-24,25.00,25.00,24.50,24.75,3020800,6.19 -1996-10-23,24.75,25.25,24.37,24.75,5736800,6.19 -1996-10-22,25.62,25.62,24.25,24.87,7651200,6.22 -1996-10-21,26.50,26.62,25.50,25.62,6712000,6.41 -1996-10-18,26.50,26.62,26.00,26.56,13681200,6.64 -1996-10-17,27.50,27.75,26.37,26.37,36679200,6.59 -1996-10-16,25.25,26.12,24.62,25.75,11975200,6.44 -1996-10-15,25.75,25.87,25.00,25.25,12970000,6.31 -1996-10-14,24.50,25.37,24.25,25.25,9649200,6.31 -1996-10-11,24.37,24.62,24.00,24.25,4327600,6.06 -1996-10-10,23.87,24.50,23.75,24.19,9883200,6.05 -1996-10-09,23.37,23.62,22.87,23.00,3044800,5.75 -1996-10-08,23.50,24.25,23.25,23.25,6802000,5.81 -1996-10-07,23.00,23.37,22.87,23.12,3428800,5.78 -1996-10-04,22.87,23.12,22.12,22.81,4770000,5.70 -1996-10-03,23.62,23.75,22.37,22.37,8140000,5.59 -1996-10-02,23.62,24.62,23.12,23.62,9890000,5.91 -1996-10-01,22.00,24.75,22.00,24.62,19269200,6.16 -1996-09-30,22.12,22.37,22.12,22.19,3058000,5.55 -1996-09-27,22.25,22.37,22.12,22.31,2932000,5.58 -1996-09-26,22.37,22.50,22.25,22.37,3693600,5.59 -1996-09-25,22.50,22.62,22.00,22.37,3902400,5.59 -1996-09-24,22.37,22.87,22.37,22.50,5143600,5.62 -1996-09-23,22.87,22.87,22.37,22.37,1653600,5.59 -1996-09-20,23.37,23.50,22.75,22.87,5330800,5.72 -1996-09-19,23.62,23.62,23.37,23.37,4282000,5.84 -1996-09-18,23.00,24.12,22.87,23.50,12631200,5.88 -1996-09-17,22.87,23.12,22.50,23.00,7487600,5.75 -1996-09-16,21.50,23.00,21.37,22.37,8747600,5.59 -1996-09-13,20.37,21.25,20.37,21.00,5967600,5.25 -1996-09-12,21.00,21.12,20.25,20.37,9340000,5.09 -1996-09-11,21.50,21.75,21.00,21.12,5266800,5.28 -1996-09-10,22.12,22.12,21.50,21.50,5562000,5.38 -1996-09-09,22.62,22.75,21.87,22.00,5302400,5.50 -1996-09-06,23.12,23.25,22.62,23.00,8602000,5.75 -1996-09-05,23.50,23.75,22.87,22.87,9999200,5.72 -1996-09-04,23.87,24.62,23.87,24.12,3636400,6.03 -1996-09-03,24.12,24.37,23.87,24.12,2461200,6.03 -1996-08-30,24.75,24.75,24.25,24.25,3784800,6.06 -1996-08-29,24.87,24.87,24.37,24.50,3829200,6.12 -1996-08-28,24.87,25.00,24.50,24.87,5844400,6.22 -1996-08-27,24.12,25.00,24.00,24.86,10339200,6.22 -1996-08-26,23.87,24.12,23.50,24.12,3204400,6.03 -1996-08-23,23.00,24.00,23.00,23.87,7281200,5.97 -1996-08-22,23.00,23.25,22.87,23.25,3138000,5.81 -1996-08-21,23.50,23.62,22.87,23.00,4052400,5.75 -1996-08-20,23.87,23.87,23.37,23.50,7564400,5.88 -1996-08-19,22.37,23.62,22.37,23.62,8084400,5.91 -1996-08-16,22.62,22.62,22.12,22.50,5075600,5.62 -1996-08-15,22.62,22.75,22.25,22.25,3845600,5.56 -1996-08-14,22.62,23.00,22.62,22.75,2570000,5.69 -1996-08-13,22.87,23.12,22.37,22.50,3706400,5.62 -1996-08-12,23.37,23.62,22.37,23.00,5408000,5.75 -1996-08-09,22.25,23.37,22.12,23.12,8243600,5.78 -1996-08-08,22.37,22.37,21.87,22.12,3640000,5.53 -1996-08-07,21.75,22.62,21.62,22.37,8892400,5.59 -1996-08-06,21.00,21.50,20.75,21.50,3354800,5.38 -1996-08-05,21.62,21.87,20.87,21.00,3612000,5.25 -1996-08-02,21.62,22.00,21.25,21.62,4574800,5.41 -1996-08-01,22.00,22.00,21.12,21.25,3942400,5.31 -1996-07-31,21.25,22.00,21.25,22.00,3332400,5.50 -1996-07-30,22.62,22.75,21.25,21.37,6766800,5.34 -1996-07-29,22.00,22.50,21.75,22.25,7005600,5.56 -1996-07-26,21.50,22.00,21.12,22.00,4426800,5.50 -1996-07-25,21.12,21.37,20.75,21.00,4090800,5.25 -1996-07-24,20.00,21.00,19.87,20.81,9448800,5.20 -1996-07-23,20.50,20.62,20.25,20.50,4651200,5.12 -1996-07-22,20.87,20.87,20.00,20.25,5456400,5.06 -1996-07-19,20.87,21.00,20.75,20.75,9510000,5.19 -1996-07-18,21.50,21.75,20.36,20.87,32058800,5.22 -1996-07-17,17.37,17.50,16.62,16.87,8355600,4.22 -1996-07-16,17.37,17.37,16.00,16.87,10334400,4.22 -1996-07-15,18.12,18.12,17.12,17.19,4779200,4.30 -1996-07-12,18.37,18.37,17.25,18.06,9610800,4.51 -1996-07-11,18.75,18.87,17.37,17.87,10420000,4.47 -1996-07-10,19.12,19.50,18.75,18.75,6055200,4.69 -1996-07-09,19.50,19.62,19.00,19.00,6723600,4.75 -1996-07-08,19.62,19.87,19.00,19.12,6762000,4.78 -1996-07-05,19.37,19.75,19.25,19.50,3808800,4.88 -1996-07-03,20.37,20.37,19.37,19.37,10323200,4.84 -1996-07-02,21.37,21.50,21.00,21.00,3189200,5.25 -1996-07-01,21.12,21.50,21.00,21.50,4732400,5.38 -1996-06-28,20.87,21.00,20.62,21.00,4138000,5.25 -1996-06-27,20.00,21.00,19.75,20.62,8202400,5.16 -1996-06-26,20.62,20.75,19.62,19.87,14440800,4.97 -1996-06-25,22.12,22.25,20.37,20.62,8831200,5.16 -1996-06-24,22.62,22.62,22.12,22.25,4398000,5.56 -1996-06-21,22.87,22.87,22.37,22.62,5792000,5.66 -1996-06-20,23.37,23.37,22.50,22.75,5260800,5.69 -1996-06-19,23.12,23.37,22.62,23.12,4803600,5.78 -1996-06-18,23.62,23.75,22.62,22.75,7979200,5.69 -1996-06-17,24.12,24.12,23.62,23.62,4052000,5.91 -1996-06-14,24.75,24.75,23.87,23.94,5186800,5.99 -1996-06-13,24.37,24.92,24.00,24.62,6856800,6.16 -1996-06-12,24.50,24.50,24.00,24.25,5440000,6.06 -1996-06-11,24.25,24.25,24.00,24.00,5481200,6.00 -1996-06-10,24.37,24.50,24.00,24.12,3820800,6.03 -1996-06-07,24.00,24.37,23.50,24.37,9565200,6.09 -1996-06-06,25.00,25.25,24.12,24.25,12938800,6.06 -1996-06-05,25.37,25.50,24.25,25.12,18228000,6.28 -1996-06-04,24.00,24.37,23.87,24.19,27235600,6.05 -1996-06-03,25.87,26.00,24.75,24.75,4481200,6.19 -1996-05-31,25.62,26.62,25.50,26.12,5813600,6.53 -1996-05-30,24.87,25.75,24.75,25.50,3703600,6.38 -1996-05-29,26.25,26.25,24.75,24.87,7840000,6.22 -1996-05-28,26.75,27.25,26.37,26.37,3658800,6.59 -1996-05-24,26.25,26.87,26.12,26.75,4046800,6.69 -1996-05-23,26.12,26.62,25.75,26.25,4447600,6.56 -1996-05-22,27.37,27.37,25.75,26.06,7215600,6.51 -1996-05-21,28.00,28.12,27.12,27.12,4088000,6.78 -1996-05-20,27.87,28.12,27.62,27.94,3028800,6.99 -1996-05-17,28.37,28.37,27.50,27.62,4405600,6.91 -1996-05-16,28.25,28.62,27.87,28.37,4648800,7.09 -1996-05-15,27.87,28.87,27.75,28.50,10442400,7.12 -1996-05-14,27.75,28.00,27.50,27.50,7068000,6.88 -1996-05-13,27.12,27.62,26.62,27.06,6701200,6.76 -1996-05-10,26.25,27.37,26.00,27.25,3966400,6.81 -1996-05-09,26.37,26.50,25.75,26.12,3515600,6.53 -1996-05-08,27.25,27.25,25.62,26.75,6688800,6.69 -1996-05-07,26.37,27.37,26.25,26.87,12641200,6.72 -1996-05-06,24.87,25.87,24.75,25.62,10349200,6.41 -1996-05-03,24.12,24.12,23.50,23.87,3892400,5.97 -1996-05-02,24.50,24.50,23.50,23.75,6728000,5.94 -1996-05-01,24.37,24.75,24.12,24.37,4039200,6.09 -1996-04-30,24.87,24.87,24.12,24.37,4881200,6.09 -1996-04-29,25.00,25.00,24.50,24.75,4324800,6.19 -1996-04-26,25.00,25.12,24.62,24.75,6759200,6.19 -1996-04-25,24.37,24.87,24.12,24.87,6245200,6.22 -1996-04-24,24.62,24.75,24.19,24.25,4596800,6.06 -1996-04-23,25.12,25.25,24.62,24.75,6086400,6.19 -1996-04-22,25.25,25.50,24.87,25.12,3973200,6.28 -1996-04-19,24.62,25.12,24.62,25.06,3655600,6.26 -1996-04-18,25.37,25.39,24.25,24.75,7780800,6.19 -1996-04-17,25.87,26.00,25.12,25.25,3056400,6.31 -1996-04-16,25.87,26.00,25.62,25.87,3634400,6.47 -1996-04-15,25.50,25.75,25.00,25.75,5515600,6.44 -1996-04-12,25.87,25.87,25.37,25.50,2924400,6.38 -1996-04-11,26.12,26.25,25.50,25.75,3526400,6.44 -1996-04-10,26.12,26.50,25.87,26.00,6242400,6.50 -1996-04-09,24.87,26.50,24.37,26.00,8415600,6.50 -1996-04-08,23.87,24.50,23.75,24.37,6046400,6.09 -1996-04-04,24.62,24.62,24.00,24.12,3092000,6.03 -1996-04-03,25.12,25.12,24.33,24.56,2591200,6.14 -1996-04-02,25.62,25.62,24.87,25.00,3635600,6.25 -1996-04-01,25.12,25.87,24.52,25.50,5680000,6.38 -1996-03-29,24.25,24.75,23.75,24.56,5962400,6.14 -1996-03-28,24.75,25.62,24.12,24.19,10572000,6.05 -1996-03-27,23.25,25.25,23.00,25.25,15338800,6.31 -1996-03-26,24.00,24.50,23.62,23.87,5755600,5.97 -1996-03-25,25.50,25.75,24.00,24.00,5887600,6.00 -1996-03-22,25.25,25.37,24.87,25.37,3842400,6.34 -1996-03-21,25.50,25.50,25.00,25.12,3932400,6.28 -1996-03-20,25.75,25.75,25.12,25.25,4154800,6.31 -1996-03-19,26.37,26.50,25.62,25.75,4442400,6.44 -1996-03-18,25.94,26.12,25.75,26.12,3907600,6.53 -1996-03-15,26.00,26.00,25.50,25.87,3632400,6.47 -1996-03-14,25.87,25.87,25.50,25.62,3342400,6.41 -1996-03-13,25.87,26.12,25.62,25.75,3560000,6.44 -1996-03-12,26.00,26.37,25.62,25.81,3453200,6.45 -1996-03-11,26.25,26.37,25.75,25.87,4544800,6.47 -1996-03-08,25.75,26.25,25.00,26.00,5322400,6.50 -1996-03-07,26.25,26.37,25.37,25.81,9292400,6.45 -1996-03-06,26.75,26.87,26.12,26.19,3547600,6.55 -1996-03-05,26.50,26.75,26.25,26.62,4246800,6.66 -1996-03-04,27.25,27.37,26.25,26.25,6708800,6.56 -1996-03-01,27.62,27.62,26.62,26.87,8263200,6.72 -1996-02-29,27.50,27.75,27.25,27.50,4049200,6.88 -1996-02-28,28.87,28.87,27.62,27.75,6728800,6.94 -1996-02-27,29.87,29.87,28.50,28.62,5331200,7.16 -1996-02-26,30.00,30.12,29.50,29.50,4238000,7.38 -1996-02-23,29.87,30.25,29.62,29.87,6205200,7.47 -1996-02-22,30.00,30.12,29.62,29.87,6588000,7.47 -1996-02-21,29.37,29.75,29.12,29.62,7924400,7.41 -1996-02-20,28.00,29.50,28.00,29.00,13473200,7.25 -1996-02-16,28.12,28.37,27.50,27.50,5602400,6.88 -1996-02-15,27.62,28.12,27.37,28.00,4360000,7.00 -1996-02-14,28.25,28.25,27.44,27.62,5843600,6.91 -1996-02-13,28.00,28.87,27.87,28.12,8161200,7.03 -1996-02-12,28.12,28.50,28.00,28.37,6948800,7.09 -1996-02-09,27.87,28.50,27.62,27.75,7360800,6.94 -1996-02-08,27.50,28.12,27.50,27.87,9420800,6.97 -1996-02-07,29.75,29.75,27.75,28.25,12885200,7.06 -1996-02-06,29.25,30.00,29.25,29.62,8101200,7.41 -1996-02-05,29.69,29.75,29.00,29.25,11396400,7.31 -1996-02-02,28.87,29.62,28.75,29.25,19865600,7.31 -1996-02-01,27.50,28.37,27.50,28.37,11902400,7.09 -1996-01-31,27.75,28.00,27.37,27.62,11736800,6.91 -1996-01-30,27.00,28.12,26.86,27.31,22246800,6.83 -1996-01-29,29.00,29.75,28.75,29.12,11900000,7.28 -1996-01-26,30.37,31.25,28.62,30.62,26297600,7.66 -1996-01-25,31.75,32.00,30.12,30.25,15911200,7.56 -1996-01-24,32.13,32.25,31.75,32.25,23438800,8.06 -1996-01-23,33.75,34.00,31.00,31.62,35305200,7.91 -1996-01-22,29.75,31.00,29.25,30.50,17852400,7.62 -1996-01-19,31.00,31.75,29.37,29.87,29623600,7.47 -1996-01-18,32.88,33.38,30.37,31.94,24955200,7.99 -1996-01-17,34.38,34.38,33.75,34.00,8445200,8.50 -1996-01-16,34.38,34.75,33.63,34.56,12606400,8.64 -1996-01-15,33.75,34.50,33.38,34.13,12971200,8.53 -1996-01-12,34.75,34.75,33.25,33.88,14370000,8.47 -1996-01-11,32.63,35.00,32.38,35.00,27041200,8.75 -1996-01-10,32.50,34.75,32.25,34.25,13057600,8.56 -1996-01-09,34.63,34.63,32.75,32.75,8978800,8.19 -1996-01-08,34.50,35.50,34.00,34.63,4341200,8.66 -1996-01-05,31.62,34.25,31.37,34.25,15929200,8.56 -1996-01-04,32.38,32.38,31.37,31.56,10721200,7.89 -1996-01-03,32.00,32.88,31.87,32.13,15368800,8.03 -1996-01-02,32.25,32.25,31.75,32.13,4983200,8.03 -1995-12-29,32.00,32.38,31.62,31.87,10874400,7.97 -1995-12-28,32.13,32.75,31.87,32.00,8933200,8.00 -1995-12-27,32.13,33.38,31.87,32.38,9609200,8.10 -1995-12-26,32.50,32.50,31.75,32.06,4994800,8.02 -1995-12-22,32.63,32.88,32.13,32.25,8392400,8.06 -1995-12-21,32.75,32.75,31.62,32.50,11893200,8.12 -1995-12-20,33.50,33.63,32.50,32.63,13074400,8.16 -1995-12-19,32.75,33.25,32.25,32.75,15403600,8.19 -1995-12-18,35.13,35.25,31.87,32.25,23807600,8.06 -1995-12-15,35.50,36.63,34.38,35.25,25960000,8.81 -1995-12-14,38.88,39.38,38.00,38.25,11928000,9.56 -1995-12-13,38.25,39.00,36.75,38.38,24472400,9.60 -1995-12-12,38.63,38.63,38.00,38.00,6353200,9.50 -1995-12-11,39.50,39.63,38.38,38.63,4003200,9.66 -1995-12-08,38.75,39.38,37.88,39.38,5053200,9.85 -1995-12-07,38.75,38.75,37.88,38.56,5084800,9.64 -1995-12-06,39.75,39.88,38.38,38.75,7195200,9.69 -1995-12-05,38.50,39.88,38.25,39.50,13000000,9.88 -1995-12-04,40.13,40.13,39.00,39.50,17171200,9.88 -1995-12-01,38.00,38.25,37.13,37.63,7300800,9.41 -1995-11-30,38.88,39.00,38.00,38.13,6247600,9.53 -1995-11-29,40.13,40.13,39.00,39.25,3782000,9.81 -1995-11-28,39.38,40.13,39.25,40.00,6305200,10.00 -1995-11-27,40.63,40.63,39.38,39.38,4148800,9.85 -1995-11-24,38.88,40.38,38.75,40.19,3930800,10.05 -1995-11-22,38.63,39.25,38.50,38.63,3533600,9.66 -1995-11-21,38.75,38.75,37.88,38.63,6845200,9.66 -1995-11-20,40.25,40.25,38.50,38.63,5314400,9.63 -1995-11-17,40.00,40.38,39.75,40.13,4607600,10.00 -1995-11-16,40.88,41.50,39.50,39.94,8102000,9.95 -1995-11-15,42.00,42.00,40.13,41.00,8874400,10.22 -1995-11-14,41.00,42.50,41.00,41.50,14560000,10.34 -1995-11-13,40.25,41.25,40.00,40.88,11343200,10.19 -1995-11-10,39.38,40.25,38.88,39.75,7973200,9.91 -1995-11-09,39.75,40.00,38.88,39.38,9295200,9.81 -1995-11-08,39.75,41.00,38.75,38.88,12823600,9.69 -1995-11-07,37.75,40.50,37.50,39.63,26310800,9.88 -1995-11-06,36.50,38.75,36.38,38.13,11143200,9.50 -1995-11-03,36.75,36.88,35.88,36.50,6413200,9.10 -1995-11-02,36.88,36.88,36.25,36.63,5464400,9.13 -1995-11-01,36.63,37.13,35.50,36.63,6913200,9.13 -1995-10-31,35.25,36.63,35.13,36.31,10334400,9.05 -1995-10-30,34.88,35.25,34.63,35.25,6291200,8.79 -1995-10-27,34.88,34.88,34.13,34.75,5523200,8.66 -1995-10-26,34.88,35.00,34.50,34.88,4503600,8.69 -1995-10-25,35.25,35.38,34.75,34.75,4761200,8.66 -1995-10-24,35.50,35.50,34.88,35.13,7638800,8.76 -1995-10-23,35.13,35.13,34.75,35.13,7078000,8.76 -1995-10-20,35.25,35.25,34.63,35.13,13818800,8.76 -1995-10-19,35.88,36.13,34.75,34.75,33761200,8.66 -1995-10-18,37.00,39.56,36.75,37.38,18311200,9.32 -1995-10-17,36.50,36.88,35.88,36.63,6390000,9.13 -1995-10-16,36.25,37.00,35.88,36.13,6515200,9.00 -1995-10-13,35.75,36.88,35.50,36.00,8422000,8.97 -1995-10-12,35.00,35.38,34.75,35.31,5803200,8.80 -1995-10-11,35.25,35.63,34.13,34.88,11893200,8.69 -1995-10-10,34.38,35.00,33.63,34.69,14303600,8.65 -1995-10-09,35.38,35.75,34.38,34.81,13320800,8.68 -1995-10-06,36.75,37.00,35.63,35.69,11058000,8.89 -1995-10-05,36.25,36.63,35.88,36.50,8737600,9.10 -1995-10-04,36.63,37.00,36.00,36.38,9532000,9.07 -1995-10-03,38.13,38.50,37.13,37.63,10368000,9.38 -1995-10-02,37.75,38.50,37.50,37.63,14000000,9.38 -1995-09-29,38.00,38.25,36.88,37.25,10123200,9.28 -1995-09-28,36.50,37.88,36.50,37.75,11843600,9.41 -1995-09-27,37.50,37.50,34.75,36.25,16135600,9.03 -1995-09-26,37.75,37.88,37.13,37.38,8961200,9.32 -1995-09-25,38.25,38.27,37.38,37.52,11267600,9.35 -1995-09-22,36.88,37.25,36.38,37.06,14258000,9.24 -1995-09-21,36.50,37.50,36.38,37.00,12407600,9.22 -1995-09-20,37.25,37.38,36.50,36.63,11500800,9.13 -1995-09-19,36.75,37.13,36.13,36.75,17512400,9.16 -1995-09-18,36.38,36.81,35.88,36.69,22216400,9.14 -1995-09-15,37.38,39.88,35.50,35.88,43286800,8.94 -1995-09-14,41.38,41.63,39.75,40.00,19675600,9.97 -1995-09-13,42.88,43.38,42.00,42.38,11530800,10.56 -1995-09-12,44.50,44.88,42.63,42.94,11658800,10.70 -1995-09-11,44.88,45.50,44.25,44.25,6160800,11.03 -1995-09-08,44.75,44.88,44.50,44.75,6243200,11.15 -1995-09-07,44.00,45.31,43.75,44.75,9373600,11.15 -1995-09-06,43.88,44.17,43.50,43.75,7175600,10.90 -1995-09-05,43.50,43.50,42.75,43.50,6443200,10.84 -1995-09-01,43.00,43.50,42.88,42.94,3532400,10.70 -1995-08-31,43.38,43.50,43.00,43.00,3148000,10.72 -1995-08-30,43.25,43.75,43.13,43.38,5482000,10.81 -1995-08-29,43.00,43.25,42.50,43.13,11325600,10.75 -1995-08-28,44.88,45.00,43.00,43.00,8680000,10.72 -1995-08-25,45.88,45.88,44.63,44.75,4819200,11.15 -1995-08-24,45.63,46.25,45.50,45.75,10285200,11.40 -1995-08-23,44.88,45.88,44.63,45.50,9078000,11.34 -1995-08-22,44.38,45.13,44.13,44.75,7769200,11.15 -1995-08-21,44.88,45.38,44.13,44.13,9721200,11.00 -1995-08-18,44.88,45.13,43.75,44.88,8620000,11.19 -1995-08-17,44.63,45.50,44.13,44.63,8827600,11.12 -1995-08-16,44.00,44.50,43.63,44.50,10457600,11.09 -1995-08-15,43.88,44.13,43.13,44.06,11370800,10.95 -1995-08-14,43.00,43.75,42.88,43.38,5989200,10.78 -1995-08-11,42.88,43.13,41.88,43.06,7407600,10.70 -1995-08-10,43.13,43.25,42.63,42.75,5868000,10.63 -1995-08-09,42.63,43.75,42.50,43.13,13190000,10.72 -1995-08-08,43.63,43.75,42.38,42.50,8388800,10.56 -1995-08-07,44.13,44.63,43.13,43.38,6920000,10.78 -1995-08-04,45.00,45.13,43.75,44.25,6884400,11.00 -1995-08-03,44.13,45.63,43.88,45.00,7640800,11.18 -1995-08-02,43.88,45.00,43.75,44.38,9840800,11.03 -1995-08-01,44.88,44.88,43.50,43.50,7540000,10.81 -1995-07-31,45.50,45.63,44.75,45.00,5673600,11.18 -1995-07-28,46.75,47.25,45.00,45.50,9341200,11.31 -1995-07-27,45.50,47.50,45.50,46.81,11621200,11.63 -1995-07-26,46.25,46.25,45.38,45.38,6125200,11.28 -1995-07-25,46.00,46.38,45.63,45.75,9418000,11.37 -1995-07-24,44.00,45.50,43.75,45.38,7679200,11.28 -1995-07-21,43.00,44.88,43.00,43.75,27082400,10.87 -1995-07-20,46.00,47.38,45.00,47.06,11848800,11.70 -1995-07-19,47.00,48.00,45.00,45.50,18613200,11.31 -1995-07-18,49.00,49.56,47.75,48.13,9102000,11.96 -1995-07-17,48.88,49.75,48.63,49.00,8098000,12.18 -1995-07-14,47.38,49.00,47.00,48.75,9929200,12.12 -1995-07-13,47.38,48.75,47.13,47.63,12596400,11.84 -1995-07-12,47.25,48.00,46.13,47.00,10145200,11.68 -1995-07-11,47.75,48.63,47.06,47.13,7683200,11.71 -1995-07-10,48.63,49.88,48.13,48.63,10640800,12.09 -1995-07-07,46.88,49.25,46.75,48.63,13840000,12.09 -1995-07-06,46.50,47.00,45.75,47.00,6583200,11.68 -1995-07-05,46.88,47.88,46.50,46.50,6325600,11.56 -1995-07-03,46.50,47.13,46.25,46.94,1410800,11.67 -1995-06-30,47.25,47.88,46.13,46.44,5927600,11.54 -1995-06-29,46.38,48.13,46.00,47.25,8320000,11.74 -1995-06-28,46.00,47.50,45.38,46.63,9531200,11.59 -1995-06-27,47.38,48.25,46.38,46.38,7772400,11.53 -1995-06-26,48.25,48.50,47.63,48.13,5465600,11.96 -1995-06-23,48.75,49.00,47.75,48.75,8286800,12.12 -1995-06-22,49.00,49.63,48.63,49.13,16928800,12.21 -1995-06-21,47.63,50.13,46.75,49.38,22378800,12.27 -1995-06-20,46.00,47.75,46.00,47.38,26385200,11.78 -1995-06-19,43.88,45.25,43.50,44.38,16774400,11.03 -1995-06-16,43.88,44.00,43.50,43.88,3200800,10.91 -1995-06-15,43.63,43.75,43.38,43.63,3331200,10.84 -1995-06-14,43.88,43.88,43.38,43.63,4224800,10.84 -1995-06-13,44.50,44.63,43.88,44.00,4508000,10.94 -1995-06-12,44.00,44.50,43.88,44.17,7584400,10.98 -1995-06-09,43.63,43.75,43.13,43.50,6679200,10.81 -1995-06-08,43.38,43.38,42.13,42.94,4874400,10.67 -1995-06-07,44.13,44.13,43.13,43.13,4451200,10.72 -1995-06-06,43.63,44.38,43.50,44.00,11270800,10.94 -1995-06-05,42.38,43.50,42.13,43.50,9103200,10.81 -1995-06-02,41.88,42.38,41.50,42.13,3783200,10.47 -1995-06-01,41.88,42.50,41.75,42.19,6685200,10.49 -1995-05-31,42.13,42.13,41.00,41.56,5707600,10.33 -1995-05-30,42.63,42.88,41.50,42.00,7021200,10.44 -1995-05-26,43.00,43.13,42.25,42.69,4097600,10.61 -1995-05-25,43.25,44.00,43.00,43.38,6536800,10.75 -1995-05-24,43.75,44.25,42.88,43.50,9459200,10.78 -1995-05-23,44.13,44.38,43.50,43.88,9881200,10.88 -1995-05-22,42.50,44.13,42.25,44.13,13282400,10.94 -1995-05-19,42.88,43.75,42.63,42.75,11522000,10.60 -1995-05-18,44.13,44.13,43.25,43.38,13287600,10.75 -1995-05-17,43.75,44.38,43.50,44.00,9419200,10.91 -1995-05-16,43.13,44.38,42.50,43.75,11895600,10.84 -1995-05-15,43.13,43.75,42.50,43.63,14053200,10.81 -1995-05-12,40.88,43.69,40.50,43.63,23153200,10.81 -1995-05-11,41.63,41.63,40.38,41.00,18712400,10.16 -1995-05-10,41.50,41.88,40.75,41.44,9837600,10.27 -1995-05-09,40.63,41.38,40.00,41.25,11540800,10.22 -1995-05-08,39.88,41.00,39.75,40.50,13832000,10.04 -1995-05-05,38.75,39.13,38.13,38.88,7445200,9.64 -1995-05-04,38.25,39.88,38.00,38.50,10846800,9.54 -1995-05-03,38.25,38.63,38.00,38.13,6043600,9.45 -1995-05-02,38.25,38.38,37.50,38.13,4289200,9.45 -1995-05-01,38.25,38.75,38.00,38.25,6375600,9.48 -1995-04-28,38.00,38.38,37.50,38.25,6984400,9.48 -1995-04-27,38.50,38.50,37.75,37.88,5014800,9.39 -1995-04-26,37.63,38.75,37.38,38.25,8246800,9.48 -1995-04-25,39.13,39.38,37.25,37.75,9780000,9.36 -1995-04-24,39.00,39.63,38.50,39.00,9724400,9.67 -1995-04-21,37.25,39.50,37.13,39.13,23812400,9.70 -1995-04-20,37.13,38.50,36.63,37.63,11772400,9.33 -1995-04-19,37.50,37.50,35.63,36.38,9990800,9.02 -1995-04-18,38.50,38.63,37.50,37.50,8263200,9.29 -1995-04-17,38.13,39.38,37.88,38.38,7467600,9.51 -1995-04-13,39.25,39.25,37.88,38.25,6242400,9.48 -1995-04-12,38.25,39.63,37.38,39.00,16973200,9.67 -1995-04-11,36.75,37.88,36.63,37.75,7673200,9.36 -1995-04-10,36.88,37.00,36.13,36.63,4211200,9.08 -1995-04-07,37.00,37.13,36.25,36.75,10562400,9.11 -1995-04-06,37.25,38.00,35.53,36.75,25823600,9.11 -1995-04-05,34.13,34.75,33.75,34.75,9470000,8.61 -1995-04-04,35.75,35.88,33.63,33.88,15300000,8.40 -1995-04-03,35.50,35.75,35.13,35.50,5528000,8.80 -1995-03-31,35.13,35.63,34.75,35.25,6558000,8.74 -1995-03-30,34.63,35.50,34.50,35.38,9767600,8.77 -1995-03-29,34.00,34.88,33.88,34.38,17760000,8.52 -1995-03-28,36.25,36.34,34.13,34.38,24655600,8.52 -1995-03-27,37.63,37.63,36.63,37.19,5111200,9.22 -1995-03-24,37.38,37.88,37.25,37.75,4584400,9.36 -1995-03-23,37.88,38.00,36.98,37.13,6094400,9.20 -1995-03-22,36.25,39.50,36.25,38.06,17130800,9.43 -1995-03-21,35.50,36.75,35.25,36.25,10920800,8.98 -1995-03-20,35.13,35.63,35.00,35.25,6793600,8.74 -1995-03-17,35.50,35.50,34.88,35.13,7713600,8.71 -1995-03-16,35.25,36.00,35.00,35.25,11330000,8.74 -1995-03-15,35.50,36.25,34.88,35.00,26120800,8.67 -1995-03-14,38.25,38.25,34.50,35.00,26015200,8.67 -1995-03-13,39.63,39.63,38.00,38.13,11653200,9.45 -1995-03-10,39.63,40.38,39.38,39.50,4923200,9.79 -1995-03-09,39.88,40.38,39.38,39.75,7038000,9.85 -1995-03-08,38.75,40.13,37.75,39.56,13048800,9.81 -1995-03-07,39.88,39.88,38.25,38.31,5399200,9.50 -1995-03-06,39.75,40.00,39.50,39.75,4751200,9.85 -1995-03-03,39.75,40.69,39.50,40.25,5209200,9.98 -1995-03-02,40.13,40.75,39.75,40.00,9619200,9.91 -1995-03-01,39.75,40.13,39.42,40.00,8025200,9.91 -1995-02-28,38.50,39.88,38.00,39.50,7965200,9.79 -1995-02-27,38.25,39.00,38.11,38.25,9600800,9.48 -1995-02-24,40.13,40.38,38.50,39.00,20334400,9.67 -1995-02-23,41.13,41.88,40.00,40.19,11262000,9.96 -1995-02-22,40.63,41.00,40.13,40.81,10501200,10.12 -1995-02-21,42.63,42.75,40.88,41.00,10776800,10.16 -1995-02-17,42.88,43.00,42.50,42.50,4366400,10.53 -1995-02-16,43.13,43.25,42.63,43.19,7821200,10.70 -1995-02-15,43.25,43.50,42.50,42.56,6604400,10.55 -1995-02-14,43.75,44.13,42.63,42.94,5934400,10.64 -1995-02-13,43.50,44.50,43.25,43.75,10120800,10.84 -1995-02-10,43.63,44.19,43.38,43.75,12542400,10.81 -1995-02-09,42.13,43.88,42.13,43.63,16988800,10.78 -1995-02-08,41.00,42.38,40.88,42.31,14403600,10.46 -1995-02-07,40.38,41.00,40.00,40.81,7200000,10.09 -1995-02-06,40.75,40.75,39.50,40.50,8702000,10.01 -1995-02-03,42.00,42.13,40.38,40.50,11400800,10.01 -1995-02-02,40.13,41.88,40.13,41.63,7288000,10.29 -1995-02-01,40.75,40.75,39.88,40.13,5665200,9.92 -1995-01-31,40.50,40.88,40.00,40.38,7621200,9.98 -1995-01-30,40.13,40.50,39.88,40.13,8255200,9.92 -1995-01-27,39.88,40.38,39.00,39.88,10676400,9.86 -1995-01-26,40.88,41.50,39.25,39.50,8822000,9.76 -1995-01-25,39.50,42.00,39.50,40.98,18482000,10.13 -1995-01-24,42.25,42.38,41.38,41.63,7805600,10.29 -1995-01-23,41.88,42.63,41.00,42.25,14252400,10.44 -1995-01-20,47.00,47.00,42.50,42.63,35731200,10.54 -1995-01-19,45.50,46.00,45.00,45.88,11238800,11.34 -1995-01-18,45.00,45.63,44.75,45.63,4581200,11.28 -1995-01-17,44.50,45.50,44.13,45.00,11806400,11.12 -1995-01-16,44.88,45.25,44.25,44.50,6765600,11.00 -1995-01-13,46.13,46.13,44.38,44.88,12565600,11.09 -1995-01-12,46.13,46.38,44.75,45.38,19721200,11.22 -1995-01-11,43.75,48.06,42.69,46.75,31212400,11.56 -1995-01-10,41.25,44.00,41.25,43.69,21977600,10.80 -1995-01-09,41.63,41.88,41.00,41.20,9805200,10.18 -1995-01-06,41.63,43.13,41.13,42.00,38456800,10.38 -1995-01-05,39.25,39.38,38.75,38.88,2646800,9.61 -1995-01-04,38.63,39.63,38.63,39.38,5682400,9.73 -1995-01-03,38.88,38.88,37.88,38.38,3726400,9.49 -1994-12-30,39.38,39.88,38.75,39.00,2616400,9.64 -1994-12-29,39.25,39.88,39.13,39.50,4341200,9.76 -1994-12-28,39.13,39.25,38.25,39.13,3198000,9.67 -1994-12-27,39.25,39.75,38.88,39.13,2928800,9.67 -1994-12-23,38.50,39.38,38.50,38.88,3372000,9.61 -1994-12-22,38.50,38.88,38.25,38.63,4771200,9.55 -1994-12-21,37.88,38.50,37.50,38.38,5635600,9.49 -1994-12-20,39.13,39.25,38.38,38.50,6263600,9.52 -1994-12-19,37.25,39.38,37.25,39.13,11890000,9.67 -1994-12-16,37.25,37.75,36.75,37.25,6432400,9.21 -1994-12-15,38.00,38.38,36.88,37.13,8133200,9.18 -1994-12-14,36.50,38.13,36.50,37.88,11123600,9.36 -1994-12-13,36.63,36.94,36.25,36.38,4266800,8.99 -1994-12-12,36.38,36.75,35.50,36.50,8004400,9.02 -1994-12-09,35.88,36.38,34.75,36.25,9329200,8.96 -1994-12-08,36.88,37.00,35.75,35.88,6081200,8.87 -1994-12-07,37.50,37.81,36.06,36.63,4916800,9.05 -1994-12-06,37.00,38.38,36.88,37.56,8516400,9.28 -1994-12-05,36.50,37.38,36.13,37.19,6460000,9.19 -1994-12-02,36.50,36.75,35.63,36.56,6170000,9.04 -1994-12-01,37.00,37.63,36.00,36.19,11051200,8.95 -1994-11-30,38.38,39.38,37.00,37.25,11157600,9.21 -1994-11-29,38.00,38.50,37.75,38.25,5163200,9.45 -1994-11-28,37.63,38.25,37.31,37.81,4971200,9.35 -1994-11-25,36.88,37.75,36.75,37.75,3012400,9.33 -1994-11-23,37.00,37.88,36.38,36.88,11723200,9.12 -1994-11-22,37.75,39.13,37.25,37.38,8018800,9.24 -1994-11-21,40.00,40.25,38.00,38.13,7255600,9.42 -1994-11-18,40.00,40.50,39.63,40.00,5257600,9.89 -1994-11-17,40.88,41.00,39.88,40.00,5380000,9.86 -1994-11-16,40.75,41.56,40.63,40.94,6700000,10.09 -1994-11-15,42.50,43.00,41.25,41.38,6001200,10.20 -1994-11-14,41.25,42.75,41.25,42.50,5002000,10.47 -1994-11-11,41.25,41.50,41.00,41.13,2237600,10.14 -1994-11-10,41.75,41.88,41.00,41.31,5476800,10.18 -1994-11-09,42.75,43.00,41.00,41.63,14530000,10.26 -1994-11-08,40.63,42.63,40.25,42.25,12476400,10.41 -1994-11-07,40.38,41.25,40.13,40.75,4058000,10.04 -1994-11-04,41.50,41.63,40.00,40.38,6869200,9.95 -1994-11-03,41.75,42.00,41.00,41.50,3962400,10.23 -1994-11-02,43.13,43.25,41.38,41.38,7819200,10.20 -1994-11-01,42.88,43.48,42.38,43.13,7805600,10.63 -1994-10-31,42.00,43.38,41.50,43.19,12728000,10.64 -1994-10-28,42.38,42.88,41.75,42.13,9762400,10.38 -1994-10-27,43.25,43.75,42.50,42.75,5700800,10.54 -1994-10-26,42.63,43.27,42.63,43.25,7043200,10.66 -1994-10-25,41.63,42.63,41.50,42.63,10771200,10.51 -1994-10-24,42.75,43.13,41.88,42.25,7316800,10.41 -1994-10-21,40.75,42.75,40.75,42.63,11528000,10.51 -1994-10-20,41.25,41.81,40.50,41.00,7808000,10.10 -1994-10-19,41.00,42.13,41.00,41.25,12549200,10.17 -1994-10-18,40.63,41.63,40.50,41.25,16749200,10.17 -1994-10-17,40.88,41.50,38.88,39.75,10866400,9.80 -1994-10-14,41.50,42.00,40.88,41.13,6292000,10.14 -1994-10-13,42.63,42.88,40.63,41.13,18761200,10.14 -1994-10-12,39.63,42.63,39.13,42.13,21340000,10.38 -1994-10-11,41.38,41.88,39.38,39.63,30083600,9.77 -1994-10-10,37.13,39.63,37.00,38.88,18700800,9.58 -1994-10-07,36.13,37.06,35.50,37.00,13022000,9.12 -1994-10-06,37.38,37.48,36.00,36.25,18828800,8.93 -1994-10-05,33.63,38.13,33.38,37.88,25366800,9.33 -1994-10-04,33.25,34.00,33.00,33.75,5822000,8.32 -1994-10-03,33.63,33.75,32.50,33.13,4644400,8.16 -1994-09-30,34.13,34.50,33.63,33.69,2561200,8.30 -1994-09-29,33.75,34.38,33.38,34.13,3921200,8.41 -1994-09-28,34.00,34.38,33.63,33.88,2914800,8.35 -1994-09-27,33.75,34.13,33.38,33.88,3904800,8.35 -1994-09-26,33.88,34.50,33.63,33.94,5072400,8.36 -1994-09-23,33.88,34.50,33.88,33.94,4760000,8.36 -1994-09-22,34.25,34.25,33.63,33.88,5235600,8.35 -1994-09-21,34.50,34.63,33.75,34.13,8402400,8.41 -1994-09-20,35.13,35.38,34.38,34.56,7047600,8.52 -1994-09-19,36.38,36.75,35.50,35.50,6242000,8.75 -1994-09-16,35.88,37.25,35.50,36.38,13008000,8.97 -1994-09-15,35.13,36.13,35.13,36.00,9253200,8.87 -1994-09-14,35.63,35.75,35.00,35.13,3549200,8.66 -1994-09-13,35.75,36.25,35.63,35.81,3723600,8.82 -1994-09-12,35.63,35.75,35.38,35.75,3252400,8.81 -1994-09-09,35.75,36.00,35.38,35.75,5624400,8.81 -1994-09-08,36.00,36.25,35.63,36.13,5691200,8.90 -1994-09-07,35.63,36.63,35.38,36.13,7283200,8.90 -1994-09-06,35.25,35.63,35.00,35.56,3279200,8.76 -1994-09-02,35.25,35.50,35.00,35.38,3628000,8.72 -1994-09-01,35.38,35.75,34.63,35.00,7305200,8.63 -1994-08-31,36.00,37.38,35.75,36.19,12568800,8.92 -1994-08-30,35.25,36.38,35.13,36.25,6515600,8.93 -1994-08-29,35.75,36.13,35.25,35.38,5450800,8.72 -1994-08-26,35.25,36.13,35.25,35.75,7300000,8.81 -1994-08-25,34.25,36.38,34.25,35.06,10688800,8.64 -1994-08-24,34.75,35.00,34.38,34.88,6132400,8.60 -1994-08-23,34.88,35.88,34.75,35.00,7669200,8.63 -1994-08-22,34.75,35.00,34.63,34.88,5445600,8.60 -1994-08-19,34.75,35.00,34.25,34.88,4674800,8.60 -1994-08-18,34.75,35.25,34.50,34.63,7370000,8.53 -1994-08-17,34.88,35.38,34.63,35.00,10232400,8.63 -1994-08-16,34.38,34.75,34.00,34.75,5563200,8.56 -1994-08-15,34.75,35.00,34.25,34.63,4293200,8.53 -1994-08-12,34.38,35.13,33.88,34.75,6425200,8.53 -1994-08-11,34.25,35.13,33.88,34.31,10649200,8.43 -1994-08-10,33.63,34.88,33.25,34.63,9065200,8.50 -1994-08-09,33.50,33.88,33.13,33.63,2811200,8.26 -1994-08-08,33.13,34.00,33.00,33.75,5048800,8.29 -1994-08-05,32.88,33.38,32.88,33.25,3123200,8.17 -1994-08-04,33.13,33.75,33.13,33.25,6620000,8.17 -1994-08-03,32.75,33.25,32.13,33.13,8113600,8.14 -1994-08-02,33.50,33.63,32.38,32.56,9642400,8.00 -1994-08-01,33.63,33.75,32.75,33.38,8204400,8.20 -1994-07-29,31.87,34.00,31.87,33.69,19853600,8.27 -1994-07-28,31.00,32.13,30.87,31.87,8762000,7.83 -1994-07-27,31.25,31.37,30.62,31.06,4788000,7.63 -1994-07-26,31.75,32.00,31.12,31.37,6756400,7.70 -1994-07-25,31.12,31.87,30.75,31.69,15103200,7.78 -1994-07-22,31.62,31.97,30.00,31.00,28098800,7.61 -1994-07-21,26.62,28.50,26.50,28.00,10348800,6.88 -1994-07-20,27.37,27.62,26.37,26.62,7765200,6.54 -1994-07-19,28.62,28.75,27.37,27.69,4176400,6.80 -1994-07-18,28.12,29.00,28.00,28.37,2734800,6.97 -1994-07-15,28.23,28.62,27.50,28.25,3409200,6.94 -1994-07-14,29.62,29.75,28.25,28.62,6459200,7.03 -1994-07-13,28.50,30.25,28.50,29.69,16081200,7.29 -1994-07-12,27.00,28.44,26.37,28.37,8662000,6.97 -1994-07-11,27.12,27.37,26.62,27.00,3801200,6.63 -1994-07-08,26.50,27.62,26.50,27.06,7457600,6.65 -1994-07-07,25.87,27.00,25.50,26.81,6097600,6.58 -1994-07-06,26.25,26.50,26.00,26.12,3499200,6.41 -1994-07-05,25.62,26.75,25.62,26.50,3080800,6.51 -1994-07-01,26.37,26.50,25.37,25.75,6404400,6.32 -1994-06-30,26.25,26.87,26.25,26.50,3652000,6.51 -1994-06-29,26.75,27.12,25.87,26.12,4842400,6.41 -1994-06-28,26.25,27.12,25.62,26.75,6235200,6.57 -1994-06-27,25.25,26.25,24.62,26.25,9153200,6.45 -1994-06-24,25.12,26.12,24.75,25.61,10470000,6.29 -1994-06-23,26.25,26.25,24.87,25.12,7283200,6.17 -1994-06-22,26.25,26.75,26.00,26.25,4081200,6.45 -1994-06-21,26.87,27.25,25.75,26.00,8693200,6.39 -1994-06-20,26.25,27.25,26.00,27.12,7150000,6.66 -1994-06-17,26.00,26.75,25.87,26.50,8027600,6.51 -1994-06-16,27.75,27.75,26.12,26.37,7812400,6.48 -1994-06-15,27.00,28.00,26.87,27.81,5704400,6.83 -1994-06-14,27.25,27.37,26.62,27.06,5531200,6.65 -1994-06-13,26.37,27.19,26.37,27.00,3339200,6.63 -1994-06-10,27.12,27.37,26.37,26.50,5107600,6.51 -1994-06-09,25.62,27.00,25.50,27.00,10485200,6.63 -1994-06-08,27.50,27.62,26.00,26.12,9809200,6.41 -1994-06-07,27.25,27.75,27.25,27.50,5013600,6.75 -1994-06-06,27.50,27.75,27.00,27.37,4513200,6.72 -1994-06-03,27.12,28.00,26.75,27.62,12649200,6.78 -1994-06-02,28.37,28.50,27.12,27.37,13762400,6.72 -1994-06-01,28.50,28.62,27.87,28.25,13786800,6.94 -1994-05-31,29.50,29.50,28.50,29.25,9211200,7.18 -1994-05-27,30.25,30.75,29.50,29.94,3882400,7.35 -1994-05-26,31.50,31.50,30.25,30.50,2613200,7.46 -1994-05-25,30.25,31.75,30.00,31.25,4873200,7.64 -1994-05-24,31.00,31.25,30.25,30.75,4536400,7.52 -1994-05-23,31.00,31.25,30.00,30.50,4286400,7.46 -1994-05-20,31.75,32.25,31.00,31.06,3519200,7.60 -1994-05-19,30.75,32.50,30.50,32.13,9776800,7.86 -1994-05-18,29.75,30.75,29.25,30.62,4436800,7.49 -1994-05-17,29.75,29.75,28.75,29.37,6450800,7.18 -1994-05-16,30.00,30.50,29.50,29.50,4854800,7.22 -1994-05-13,29.75,30.50,29.25,30.00,3323200,7.34 -1994-05-12,30.50,30.75,29.50,29.69,3839200,7.26 -1994-05-11,31.00,31.50,29.75,30.25,5218000,7.40 -1994-05-10,31.75,32.00,31.00,31.00,5246800,7.58 -1994-05-09,32.25,32.50,30.75,31.25,5026400,7.64 -1994-05-06,32.25,32.75,31.25,32.31,6721200,7.90 -1994-05-05,33.25,33.75,32.25,32.88,10307600,8.04 -1994-05-04,31.00,33.25,30.50,33.00,13008800,8.07 -1994-05-03,31.00,31.25,29.50,30.25,4761200,7.40 -1994-05-02,30.00,31.25,30.00,31.00,4401200,7.58 -1994-04-29,30.00,30.50,29.75,30.00,3399200,7.34 -1994-04-28,31.00,31.25,29.75,30.25,3604400,7.40 -1994-04-26,31.50,31.50,31.00,31.25,5879200,7.64 -1994-04-25,29.75,31.00,29.50,31.00,12846800,7.58 -1994-04-22,31.25,32.00,28.50,29.75,24923600,7.28 -1994-04-21,28.50,30.50,27.00,29.62,14674400,7.25 -1994-04-20,29.25,30.00,28.00,28.25,10080800,6.91 -1994-04-19,29.75,30.00,28.50,29.00,5947600,7.09 -1994-04-18,30.50,30.50,29.25,29.62,8238800,7.25 -1994-04-15,31.25,31.50,30.00,30.25,6730800,7.40 -1994-04-14,30.50,31.75,30.00,31.50,7933200,7.71 -1994-04-13,32.25,32.50,31.25,31.75,8330000,7.77 -1994-04-12,33.38,33.38,31.75,32.00,4890800,7.83 -1994-04-11,33.50,33.50,32.50,33.50,3823600,8.19 -1994-04-08,33.75,34.00,33.25,33.50,6336400,8.19 -1994-04-07,33.50,33.75,32.75,33.38,2764800,8.17 -1994-04-06,34.00,34.00,32.75,33.50,4616400,8.19 -1994-04-05,33.75,34.25,33.50,33.50,3505600,8.19 -1994-04-04,32.25,33.25,31.75,33.25,6016800,8.13 -1994-03-31,32.50,33.50,31.50,33.25,7481200,8.13 -1994-03-30,32.50,33.25,31.75,32.50,6079200,7.95 -1994-03-29,33.25,33.75,32.25,32.75,7640000,8.01 -1994-03-28,33.00,34.00,32.75,33.25,10098800,8.13 -1994-03-25,34.75,34.75,32.75,32.75,12291200,8.01 -1994-03-24,35.13,35.25,34.00,34.63,6738800,8.47 -1994-03-23,35.25,35.50,34.25,35.13,7749200,8.59 -1994-03-22,35.25,35.50,34.50,35.00,8690800,8.56 -1994-03-21,36.38,36.50,35.25,35.50,8806400,8.68 -1994-03-18,36.75,36.75,35.75,36.38,8004400,8.90 -1994-03-17,36.75,37.00,36.25,36.50,5590800,8.93 -1994-03-16,37.50,37.75,36.50,36.75,5265200,8.99 -1994-03-15,38.25,38.25,37.25,37.63,7319200,9.20 -1994-03-14,38.50,38.50,37.75,38.13,15783600,9.33 -1994-03-11,37.00,37.75,36.75,37.25,5791200,9.11 -1994-03-10,37.25,37.63,36.75,37.25,5142400,9.11 -1994-03-09,36.63,37.50,36.00,37.50,8896800,9.17 -1994-03-08,38.00,38.00,36.75,37.00,6647600,9.05 -1994-03-07,37.00,38.13,36.75,37.88,11088800,9.27 -1994-03-04,36.00,37.50,35.75,36.75,8113600,8.99 -1994-03-03,35.75,36.25,35.50,35.75,6737600,8.75 -1994-03-02,35.25,36.25,34.75,35.63,10519200,8.72 -1994-03-01,36.75,36.75,35.75,36.25,7570800,8.87 -1994-02-28,36.25,37.00,36.00,36.50,4434800,8.93 -1994-02-25,37.00,37.25,35.50,36.00,8468000,8.81 -1994-02-24,37.00,37.25,36.25,36.63,7081200,8.96 -1994-02-23,37.25,38.25,37.00,37.25,9318800,9.11 -1994-02-22,36.25,37.50,35.75,37.25,7676400,9.11 -1994-02-18,36.50,37.00,36.25,36.25,5326400,8.87 -1994-02-17,37.25,37.88,36.25,37.00,5197600,9.05 -1994-02-16,37.50,37.50,36.75,36.75,4379200,8.99 -1994-02-15,36.75,37.50,36.25,37.13,4654400,9.08 -1994-02-14,37.00,38.00,36.75,37.00,8775200,9.05 -1994-02-11,36.25,37.50,36.25,37.00,5880800,9.05 -1994-02-10,36.25,37.50,36.00,36.50,10802000,8.93 -1994-02-09,35.75,36.50,35.25,36.25,6699200,8.87 -1994-02-08,36.00,36.50,35.25,35.75,10210800,8.75 -1994-02-07,33.50,37.13,33.50,36.50,25925200,8.93 -1994-02-04,33.50,35.00,33.25,33.50,12645200,8.17 -1994-02-03,33.00,33.63,32.50,33.50,4933200,8.17 -1994-02-02,33.25,33.25,32.50,33.00,5247600,8.04 -1994-02-01,33.00,33.50,32.25,33.25,5618000,8.10 -1994-01-31,33.50,33.75,32.75,32.75,8532400,7.98 -1994-01-28,34.25,34.75,33.75,34.00,4891200,8.29 -1994-01-27,33.50,34.25,33.00,34.13,4724800,8.32 -1994-01-26,33.75,34.00,33.25,33.50,5922400,8.17 -1994-01-25,34.75,35.00,33.25,33.88,15818800,8.26 -1994-01-24,33.25,35.25,33.25,35.00,24742000,8.53 -1994-01-21,33.25,33.50,32.25,33.38,35007600,8.14 -1994-01-20,29.50,30.75,29.50,29.87,9582400,7.28 -1994-01-19,29.25,29.75,28.75,29.25,10066400,7.13 -1994-01-18,30.25,30.25,29.00,29.37,12978000,7.16 -1994-01-17,31.00,31.50,30.00,30.37,5206400,7.40 -1994-01-14,30.75,31.75,30.50,31.00,7673200,7.56 -1994-01-13,30.00,30.75,29.75,30.62,19000000,7.46 -1994-01-12,32.25,32.25,30.50,30.50,15684400,7.43 -1994-01-11,33.50,33.75,31.75,31.87,12700000,7.77 -1994-01-10,33.00,33.88,32.75,33.63,7222000,8.20 -1994-01-07,32.00,33.25,31.25,33.13,10688800,8.08 -1994-01-06,33.75,34.00,32.50,32.75,13095200,7.98 -1994-01-05,31.75,33.88,31.75,33.75,21874400,8.23 -1994-01-04,30.25,31.50,30.00,31.50,10198800,7.68 -1994-01-03,29.50,30.00,29.00,29.87,6485200,7.28 -1993-12-31,29.75,30.25,29.25,29.25,5765200,7.13 -1993-12-30,28.50,30.25,28.50,29.75,11253200,7.25 -1993-12-29,29.25,29.25,28.50,28.50,3853200,6.95 -1993-12-28,28.75,29.50,28.50,29.12,5705600,7.10 -1993-12-27,27.75,28.75,27.25,28.50,5730000,6.95 -1993-12-23,27.25,27.25,26.50,27.25,8120000,6.64 -1993-12-22,27.25,28.50,27.00,28.00,6498800,6.82 -1993-12-21,28.50,28.75,27.25,27.50,8973600,6.70 -1993-12-20,29.25,29.75,28.25,28.50,6768800,6.95 -1993-12-17,29.50,29.75,29.12,29.50,5197600,7.19 -1993-12-16,29.50,29.75,29.00,29.37,4532000,7.16 -1993-12-15,29.00,29.75,29.00,29.75,4438000,7.25 -1993-12-14,29.25,29.75,29.00,29.12,10492400,7.10 -1993-12-13,28.25,29.50,27.75,29.50,8729200,7.19 -1993-12-10,30.25,30.50,27.75,28.25,17781200,6.89 -1993-12-09,31.75,32.00,29.75,30.00,6531200,7.31 -1993-12-08,32.00,32.25,31.50,31.87,1422000,7.77 -1993-12-07,32.00,32.25,31.50,32.25,2280800,7.86 -1993-12-06,31.50,32.50,31.25,32.25,5610000,7.86 -1993-12-03,31.75,32.00,31.00,31.50,4314800,7.68 -1993-12-02,31.75,32.00,31.00,31.75,3614400,7.74 -1993-12-01,32.00,32.25,31.25,31.50,3978800,7.68 -1993-11-30,31.75,32.63,31.50,31.50,4036800,7.68 -1993-11-29,32.25,32.50,31.50,31.75,3462000,7.74 -1993-11-26,32.75,33.00,32.25,32.63,1569200,7.95 -1993-11-24,32.75,33.50,32.63,33.00,3246800,8.04 -1993-11-23,32.50,33.00,31.25,33.00,6653600,8.04 -1993-11-22,32.75,33.00,32.25,32.50,5389200,7.92 -1993-11-19,33.00,33.50,32.50,33.00,4409200,8.04 -1993-11-18,33.50,33.75,33.00,33.50,4089200,8.14 -1993-11-17,34.00,35.00,32.75,33.50,10812400,8.14 -1993-11-16,32.00,34.25,31.75,34.00,10838000,8.26 -1993-11-15,31.50,32.75,31.50,32.00,5616800,7.77 -1993-11-12,31.50,32.00,30.50,31.75,5136800,7.71 -1993-11-11,30.75,32.00,30.50,31.37,5090800,7.62 -1993-11-10,30.25,30.75,30.00,30.75,2765600,7.47 -1993-11-09,31.00,31.25,29.75,30.12,6136400,7.32 -1993-11-08,32.00,32.13,30.50,30.75,5966400,7.47 -1993-11-05,31.87,32.25,30.75,31.87,13513200,7.74 -1993-11-04,31.50,32.25,30.75,32.25,6632000,7.83 -1993-11-03,33.00,33.00,31.00,31.62,6320000,7.68 -1993-11-02,31.25,33.00,31.00,32.75,8013600,7.95 -1993-11-01,30.75,31.50,30.25,31.50,3798800,7.65 -1993-10-29,31.00,31.75,30.50,30.75,4892400,7.47 -1993-10-28,31.75,32.25,31.00,31.00,8736800,7.53 -1993-10-27,30.00,32.25,29.75,31.75,16415200,7.71 -1993-10-26,29.75,30.00,29.00,29.75,7960000,7.23 -1993-10-25,30.25,30.50,29.62,30.00,7840800,7.29 -1993-10-22,30.50,31.50,29.75,30.25,14160000,7.35 -1993-10-21,27.50,31.25,27.25,30.25,22417600,7.35 -1993-10-20,28.00,28.25,27.25,27.75,4956400,6.74 -1993-10-19,28.25,28.50,27.25,27.75,7643200,6.74 -1993-10-18,28.00,28.75,27.75,28.37,11900000,6.89 -1993-10-15,27.75,28.50,26.75,28.25,34136400,6.86 -1993-10-14,24.00,24.50,23.50,23.75,5749200,5.77 -1993-10-13,24.25,24.25,23.50,24.00,6322400,5.83 -1993-10-12,24.00,25.00,23.75,24.00,10952400,5.83 -1993-10-11,22.75,24.00,22.75,23.75,5775200,5.77 -1993-10-08,23.25,23.25,22.25,22.62,4989200,5.49 -1993-10-07,23.50,23.75,22.75,23.00,4828000,5.59 -1993-10-06,23.75,24.00,23.37,23.62,6271200,5.74 -1993-10-05,23.00,24.00,23.00,23.50,6306400,5.71 -1993-10-04,22.62,23.00,22.00,22.75,6891200,5.53 -1993-10-01,22.75,23.00,22.50,22.75,12022000,5.53 -1993-09-30,24.00,24.00,23.00,23.37,9828000,5.68 -1993-09-29,24.25,24.87,23.75,23.87,8463600,5.80 -1993-09-28,24.75,25.00,24.25,24.75,3386400,6.01 -1993-09-27,25.00,25.25,24.25,24.75,4043200,6.01 -1993-09-24,25.00,25.25,24.50,25.00,2743200,6.07 -1993-09-23,25.50,25.50,24.50,24.75,4697600,6.01 -1993-09-22,24.25,25.50,24.25,25.50,3960800,6.19 -1993-09-21,24.75,25.25,23.87,24.50,5250000,5.95 -1993-09-20,25.25,25.50,24.75,24.87,3968800,6.04 -1993-09-17,24.37,25.50,24.25,25.25,6157600,6.13 -1993-09-16,24.25,25.00,24.25,24.75,3086800,6.01 -1993-09-15,24.50,25.00,23.50,24.50,9206800,5.95 -1993-09-14,24.25,25.00,24.00,24.25,9880000,5.89 -1993-09-13,26.25,26.50,24.75,25.25,9143600,6.13 -1993-09-10,26.25,26.25,25.37,26.25,4804800,6.38 -1993-09-09,26.75,27.00,26.00,26.00,5352000,6.31 -1993-09-08,26.25,27.00,26.00,26.75,8102000,6.50 -1993-09-07,26.00,27.00,25.75,26.25,5130000,6.38 -1993-09-03,26.00,26.00,25.25,25.75,5830000,6.25 -1993-09-02,26.00,26.25,25.25,25.75,10081200,6.25 -1993-09-01,26.50,26.75,25.75,26.12,8065200,6.34 -1993-08-31,26.50,26.75,26.00,26.50,4570800,6.44 -1993-08-30,26.50,26.50,25.87,26.00,9785600,6.31 -1993-08-27,27.00,27.00,26.25,26.50,6676400,6.44 -1993-08-26,27.25,27.25,26.50,26.87,6296800,6.53 -1993-08-25,28.00,28.25,26.75,27.25,5209200,6.62 -1993-08-24,28.25,28.75,27.75,28.00,3625600,6.80 -1993-08-23,28.00,28.75,27.50,28.37,3265600,6.89 -1993-08-20,27.75,28.00,27.00,28.00,3574400,6.80 -1993-08-19,28.75,28.75,27.50,27.50,5452000,6.68 -1993-08-18,29.00,29.75,28.25,28.50,6751200,6.92 -1993-08-17,27.75,28.50,27.25,28.37,3876800,6.89 -1993-08-16,27.50,28.00,27.25,27.50,3669200,6.68 -1993-08-13,26.50,27.75,26.25,27.37,4978800,6.62 -1993-08-12,27.50,27.75,26.00,26.50,12098800,6.41 -1993-08-11,28.50,28.50,27.00,27.50,5965200,6.65 -1993-08-10,29.50,29.75,28.25,28.50,5465600,6.89 -1993-08-09,29.25,30.25,29.00,29.75,5767600,7.19 -1993-08-06,29.25,30.25,29.25,29.25,4506800,7.07 -1993-08-05,30.75,30.75,29.00,29.50,7498800,7.13 -1993-08-04,29.25,30.50,29.00,30.25,8700000,7.31 -1993-08-03,29.00,29.25,28.75,29.00,6315600,7.01 -1993-08-02,28.25,29.25,28.00,28.50,7728000,6.89 -1993-07-30,27.50,28.25,27.00,27.75,7669200,6.71 -1993-07-29,27.00,27.50,26.75,27.25,4343200,6.59 -1993-07-28,26.25,27.00,26.25,26.87,3300000,6.50 -1993-07-27,26.75,27.50,26.25,26.50,7100800,6.41 -1993-07-26,26.75,27.50,26.00,26.87,5468000,6.50 -1993-07-23,27.00,27.50,26.00,26.25,8365600,6.35 -1993-07-22,26.00,27.00,25.75,26.50,7554400,6.41 -1993-07-21,26.00,26.75,25.50,26.25,16283600,6.35 -1993-07-20,26.25,27.75,25.75,26.87,19017600,6.50 -1993-07-19,28.00,28.75,25.50,25.62,28813200,6.20 -1993-07-16,28.50,29.62,26.50,27.50,75744400,6.65 -1993-07-15,37.25,37.75,35.25,35.75,12091200,8.64 -1993-07-14,36.75,37.50,35.75,37.25,8816800,9.01 -1993-07-13,38.75,38.75,37.00,37.25,5650800,9.01 -1993-07-12,36.75,38.13,36.25,38.00,6215600,9.19 -1993-07-09,37.00,37.25,36.50,36.75,5604400,8.89 -1993-07-08,36.50,37.50,36.25,36.50,4964800,8.83 -1993-07-07,37.50,37.88,36.25,36.50,8124400,8.83 -1993-07-06,38.25,39.00,37.50,37.75,5558800,9.13 -1993-07-02,38.25,38.75,37.75,38.50,6846400,9.31 -1993-07-01,39.00,39.75,38.00,38.00,7809200,9.19 -1993-06-30,38.75,39.75,38.50,39.50,7170000,9.55 -1993-06-29,40.25,40.25,38.50,39.00,10526400,9.43 -1993-06-28,40.50,40.50,38.75,40.13,12645600,9.70 -1993-06-25,40.38,40.75,39.50,40.00,9198000,9.67 -1993-06-24,40.50,41.75,40.00,41.75,7980000,10.10 -1993-06-23,41.75,41.75,40.00,40.50,6462400,9.79 -1993-06-22,40.88,42.00,39.75,41.38,12021200,10.01 -1993-06-21,40.50,40.50,39.50,39.63,9776800,9.58 -1993-06-18,41.63,42.13,39.75,41.00,11138800,9.91 -1993-06-17,42.50,42.50,40.50,41.25,14635600,9.97 -1993-06-16,42.25,43.25,41.50,42.25,12615600,10.22 -1993-06-15,45.25,45.25,41.88,42.00,16018000,10.16 -1993-06-14,44.00,44.75,43.50,44.63,8927600,10.79 -1993-06-11,45.00,45.25,43.38,43.75,8662400,10.58 -1993-06-10,43.50,44.75,42.75,44.50,19783600,10.76 -1993-06-09,45.00,45.63,44.00,44.25,42090000,10.70 -1993-06-08,48.75,50.00,48.00,49.50,22194400,11.97 -1993-06-07,54.50,54.75,50.38,50.75,17239200,12.27 -1993-06-04,55.75,56.25,54.50,54.88,7649200,13.27 -1993-06-03,57.00,57.25,56.00,56.38,5603200,13.63 -1993-06-02,56.75,58.25,56.00,57.00,7160000,13.78 -1993-06-01,56.50,57.75,56.50,57.00,4837600,13.78 -1993-05-28,57.00,57.50,56.25,56.63,6575200,13.69 -1993-05-27,57.75,58.50,57.25,57.50,7049200,13.87 -1993-05-26,56.00,57.75,55.38,57.75,4353600,13.94 -1993-05-25,56.75,57.50,55.75,56.38,6462400,13.60 -1993-05-24,56.75,58.75,56.75,57.63,5373200,13.91 -1993-05-21,58.75,59.13,56.75,57.50,5300000,13.87 -1993-05-20,57.25,59.00,57.25,58.75,10385200,14.18 -1993-05-19,54.75,57.50,54.50,57.25,6176400,13.81 -1993-05-18,55.50,56.25,55.00,55.50,5860000,13.39 -1993-05-17,55.50,56.00,55.00,55.75,2491200,13.45 -1993-05-14,55.25,56.00,55.00,55.50,4212000,13.39 -1993-05-13,53.50,55.75,53.50,55.50,12940800,13.39 -1993-05-12,54.25,54.75,53.00,53.25,3779200,12.85 -1993-05-11,55.00,55.25,54.00,54.50,5665600,13.15 -1993-05-10,55.00,55.88,55.00,55.00,4929200,13.27 -1993-05-07,53.50,54.75,53.50,54.75,2927600,13.21 -1993-05-06,54.50,54.75,53.50,53.75,2536800,12.97 -1993-05-05,53.00,55.50,53.00,54.50,9059200,13.15 -1993-05-04,52.25,54.25,52.00,53.38,6112400,12.88 -1993-05-03,51.25,52.00,51.00,51.88,2332400,12.52 -1993-04-30,50.75,52.50,50.75,51.25,4730000,12.37 -1993-04-29,51.50,51.75,50.13,50.75,2958000,12.25 -1993-04-28,49.75,52.00,49.75,51.38,5846800,12.40 -1993-04-27,48.75,50.25,48.75,50.25,4648800,12.13 -1993-04-26,49.25,49.75,48.50,49.00,3689200,11.82 -1993-04-23,49.75,50.25,48.75,49.25,4808000,11.88 -1993-04-22,49.25,50.50,49.00,50.00,5648800,12.06 -1993-04-21,50.25,50.75,49.25,49.63,7337600,11.98 -1993-04-20,48.75,50.25,48.25,50.00,8580800,12.06 -1993-04-19,48.50,49.50,48.25,48.50,8148000,11.70 -1993-04-16,48.25,48.75,47.38,48.13,24533200,11.61 -1993-04-15,48.25,48.25,46.75,47.25,7816800,11.40 -1993-04-14,48.25,48.75,47.63,48.75,6092400,11.76 -1993-04-13,50.50,51.25,48.25,48.50,5893600,11.70 -1993-04-12,49.50,51.00,49.50,50.00,3324800,12.06 -1993-04-08,50.00,50.50,49.00,49.75,5857600,12.00 -1993-04-07,49.00,50.75,48.50,50.50,5825200,12.19 -1993-04-06,50.00,50.25,48.75,48.75,6020800,11.76 -1993-04-05,50.00,50.50,49.50,50.00,5332000,12.06 -1993-04-02,50.50,51.25,49.50,50.13,9077600,12.10 -1993-04-01,51.25,52.00,51.00,51.75,3878000,12.49 -1993-03-31,52.50,52.75,51.25,51.50,7968800,12.43 -1993-03-30,51.13,52.25,50.25,52.25,9447600,12.61 -1993-03-29,52.25,52.50,50.75,51.00,9362000,12.31 -1993-03-26,54.75,54.75,52.50,53.25,5431200,12.85 -1993-03-25,53.75,54.75,53.50,54.75,6125200,13.21 -1993-03-24,52.75,54.25,52.50,53.75,5126400,12.97 -1993-03-23,53.25,54.00,52.63,52.75,3674400,12.73 -1993-03-22,53.50,53.88,52.75,53.25,5911200,12.85 -1993-03-19,55.00,55.25,53.50,53.75,5516800,12.97 -1993-03-18,55.00,55.63,54.50,54.50,3810800,13.15 -1993-03-17,56.50,57.00,55.00,55.13,6301200,13.30 -1993-03-16,57.25,57.75,56.50,56.50,3626800,13.63 -1993-03-15,56.00,57.25,55.38,57.00,4868800,13.75 -1993-03-12,56.75,56.75,55.50,56.25,4527600,13.57 -1993-03-11,57.00,57.25,56.25,56.88,5167600,13.73 -1993-03-10,56.75,57.25,56.00,56.75,4738800,13.69 -1993-03-09,56.50,57.50,56.50,56.75,5535200,13.69 -1993-03-08,55.00,56.75,55.00,56.50,6322400,13.63 -1993-03-05,54.75,55.75,54.75,55.00,4001200,13.27 -1993-03-04,54.50,55.25,53.50,55.00,6730000,13.27 -1993-03-03,54.00,55.00,53.25,54.63,7261200,13.18 -1993-03-02,53.00,54.50,53.00,54.25,5294400,13.09 -1993-03-01,53.00,53.50,52.75,53.25,4272400,12.85 -1993-02-26,54.25,54.25,52.25,53.00,10538000,12.79 -1993-02-25,53.25,54.75,53.25,54.75,5979200,13.21 -1993-02-24,52.13,53.88,52.13,53.63,10253600,12.94 -1993-02-23,55.00,55.25,54.00,54.25,6937600,13.09 -1993-02-22,55.00,56.00,54.75,55.13,3531200,13.30 -1993-02-19,55.25,55.50,54.75,55.00,6366800,13.27 -1993-02-18,55.00,55.25,53.50,55.00,10006800,13.27 -1993-02-17,53.25,54.00,52.00,53.88,8932400,13.00 -1993-02-16,53.50,53.50,51.50,53.00,14563200,12.79 -1993-02-12,55.00,55.50,53.75,53.88,9855600,13.00 -1993-02-11,55.75,56.25,55.00,55.13,6015200,13.27 -1993-02-10,57.00,57.25,55.00,55.75,9593600,13.42 -1993-02-09,57.00,57.38,56.50,56.88,8525600,13.70 -1993-02-08,57.00,57.50,55.50,56.50,10060000,13.60 -1993-02-05,59.25,59.50,56.25,57.25,13134400,13.78 -1993-02-04,60.00,60.25,59.00,59.50,7453200,14.33 -1993-02-03,61.00,61.00,58.50,60.00,9455200,14.45 -1993-02-02,60.75,61.50,60.25,60.25,6530000,14.51 -1993-02-01,59.25,61.25,59.25,61.25,8608800,14.75 -1993-01-29,60.25,61.25,59.00,59.50,9516800,14.33 -1993-01-28,60.00,60.25,59.25,59.88,6580000,14.42 -1993-01-27,61.00,61.75,58.75,60.25,8101200,14.51 -1993-01-26,60.50,62.00,60.50,60.75,10201200,14.63 -1993-01-25,59.25,60.50,59.25,60.00,7237600,14.45 -1993-01-22,60.25,60.25,59.00,59.50,5252400,14.33 -1993-01-21,59.75,60.25,58.75,60.00,6601200,14.45 -1993-01-20,59.75,60.25,59.50,60.00,5685600,14.45 -1993-01-19,59.75,60.50,59.25,59.75,9802400,14.39 -1993-01-18,59.50,60.00,58.00,59.50,11935600,14.33 -1993-01-15,61.00,62.25,60.00,60.25,32257600,14.51 -1993-01-14,64.00,65.25,63.75,65.00,13145200,15.65 -1993-01-13,61.50,64.00,61.25,63.50,7135600,15.29 -1993-01-12,62.75,63.75,61.50,61.50,12364400,14.81 -1993-01-11,62.00,64.37,61.75,64.12,9785200,15.44 -1993-01-08,60.75,63.00,59.75,62.25,11474400,14.99 -1993-01-07,61.75,62.50,60.63,61.00,9741200,14.69 -1993-01-06,60.75,62.00,60.50,61.75,10055600,14.87 -1993-01-05,58.00,59.25,57.25,59.25,6658800,14.27 -1993-01-04,59.50,60.00,57.75,58.25,4618800,14.03 -1992-12-31,58.75,60.00,58.75,59.75,3302000,14.39 -1992-12-30,59.75,59.75,58.75,58.75,3610800,14.15 -1992-12-29,59.50,60.75,59.50,59.63,4171200,14.36 -1992-12-28,59.25,59.75,59.25,59.50,2536400,14.33 -1992-12-24,60.00,60.00,59.00,59.00,1642400,14.21 -1992-12-23,60.25,60.50,59.25,59.75,4018800,14.39 -1992-12-22,59.75,61.25,59.75,60.63,10009200,14.60 -1992-12-21,58.25,60.00,58.00,59.63,9159200,14.36 -1992-12-18,57.50,59.25,57.25,58.25,8414400,14.03 -1992-12-17,55.25,57.50,55.25,56.88,8370800,13.70 -1992-12-16,56.25,57.00,54.50,55.00,8085200,13.24 -1992-12-15,56.75,57.00,55.50,56.38,6541200,13.57 -1992-12-14,57.50,57.75,56.75,57.25,3962000,13.78 -1992-12-11,57.25,58.25,57.25,57.50,4299200,13.84 -1992-12-10,57.25,57.63,56.50,57.25,5010800,13.78 -1992-12-09,57.75,58.00,57.25,57.63,5700800,13.88 -1992-12-08,57.75,58.75,57.75,58.13,7035600,14.00 -1992-12-07,56.75,57.75,56.75,57.75,5168000,13.90 -1992-12-04,57.25,57.50,56.50,56.88,3432400,13.70 -1992-12-03,56.50,57.63,56.13,57.50,6710800,13.84 -1992-12-02,58.25,58.50,57.00,57.25,3498800,13.78 -1992-12-01,57.25,59.00,56.75,58.25,4652400,14.03 -1992-11-30,56.25,57.50,55.63,57.50,5739200,13.84 -1992-11-27,56.50,57.25,56.25,56.50,1688800,13.57 -1992-11-25,57.00,57.25,56.00,56.50,4208000,13.57 -1992-11-24,57.00,57.50,56.50,57.50,5601200,13.82 -1992-11-23,56.50,57.00,56.25,56.75,5462400,13.63 -1992-11-20,58.50,58.75,57.00,57.50,5572000,13.82 -1992-11-19,57.75,59.50,57.75,58.25,8608000,14.00 -1992-11-18,56.00,58.25,55.50,57.75,10889200,13.88 -1992-11-17,57.25,57.50,54.88,55.25,6045200,13.27 -1992-11-16,56.25,57.75,56.00,57.38,2419200,13.79 -1992-11-13,57.00,57.25,56.00,56.25,3042000,13.51 -1992-11-12,57.00,57.50,56.38,56.88,3844400,13.67 -1992-11-11,56.50,58.25,56.25,56.75,5023600,13.63 -1992-11-10,55.00,56.50,54.75,56.25,4368000,13.51 -1992-11-09,56.00,56.00,54.75,55.25,4052000,13.27 -1992-11-06,54.75,56.50,54.75,55.75,9443200,13.39 -1992-11-05,52.50,55.00,52.50,55.00,10647600,13.21 -1992-11-04,52.00,52.75,52.00,52.50,5086800,12.61 -1992-11-03,52.50,52.50,51.50,52.00,4042000,12.49 -1992-11-02,52.50,52.75,51.75,52.25,6094400,12.55 -1992-10-30,53.50,53.50,52.00,52.50,4657600,12.61 -1992-10-29,52.25,54.00,51.50,53.25,7661200,12.79 -1992-10-28,51.25,52.75,50.75,52.25,7033200,12.55 -1992-10-27,51.50,52.50,51.00,51.50,7575600,12.37 -1992-10-26,48.75,51.50,48.50,51.50,8972000,12.37 -1992-10-23,49.25,49.50,48.25,48.75,3279200,11.71 -1992-10-22,48.50,49.25,48.25,48.75,3026400,11.71 -1992-10-21,49.25,49.50,48.00,48.50,4080800,11.65 -1992-10-20,49.00,50.00,48.50,49.13,10269200,11.80 -1992-10-19,49.00,49.25,48.50,49.00,7002400,11.77 -1992-10-16,46.75,49.50,46.50,49.00,16142000,11.77 -1992-10-15,45.75,46.00,45.25,45.50,2701200,10.93 -1992-10-14,45.25,46.25,45.00,46.00,3429200,11.05 -1992-10-13,44.75,46.00,44.00,45.38,5265600,10.90 -1992-10-12,43.25,44.25,43.25,44.00,2580000,10.57 -1992-10-09,43.50,44.00,43.00,43.38,2108000,10.42 -1992-10-08,44.00,44.25,43.00,43.50,4543200,10.45 -1992-10-07,45.00,45.25,43.50,43.75,4050800,10.51 -1992-10-06,43.75,45.00,42.75,44.75,4058000,10.75 -1992-10-05,43.25,43.75,41.50,43.50,9475600,10.45 -1992-10-02,44.50,44.75,43.00,43.75,4063600,10.51 -1992-10-01,44.75,45.13,44.25,44.25,4396400,10.63 -1992-09-30,45.00,45.50,44.50,45.13,3580800,10.84 -1992-09-29,44.50,45.50,44.00,44.88,5626400,10.78 -1992-09-28,45.00,45.00,43.75,44.75,5351200,10.75 -1992-09-25,46.25,46.50,45.25,45.50,4926400,10.93 -1992-09-24,47.25,47.75,46.25,46.25,4492000,11.11 -1992-09-23,46.00,47.50,45.50,47.50,4443200,11.41 -1992-09-22,46.75,46.75,45.25,45.75,3996800,10.99 -1992-09-21,46.75,47.75,46.25,46.50,3204400,11.17 -1992-09-18,45.75,46.88,45.25,46.50,4133600,11.17 -1992-09-17,47.25,47.25,45.38,46.00,6180000,11.05 -1992-09-16,47.75,48.25,46.50,47.00,6395600,11.29 -1992-09-15,49.25,49.25,47.75,48.25,7806800,11.59 -1992-09-14,49.00,50.00,48.50,49.50,7682400,11.89 -1992-09-11,49.00,49.25,47.50,47.63,6438000,11.44 -1992-09-10,48.00,49.50,47.50,49.25,8165600,11.83 -1992-09-09,48.00,49.25,47.75,49.00,5622400,11.77 -1992-09-08,46.75,48.00,46.50,47.75,2511200,11.47 -1992-09-04,48.25,48.25,46.75,47.25,2268800,11.35 -1992-09-03,49.00,49.25,47.75,47.75,7570000,11.47 -1992-09-02,46.50,48.75,46.50,48.50,6794400,11.65 -1992-09-01,46.25,46.50,45.75,46.50,2172000,11.17 -1992-08-31,45.00,46.25,44.75,46.00,4328800,11.05 -1992-08-28,44.25,45.25,44.00,45.00,2202400,10.81 -1992-08-27,44.75,45.13,44.25,44.50,2974800,10.69 -1992-08-26,44.25,44.50,43.25,44.25,4325600,10.63 -1992-08-25,43.25,44.50,43.25,44.38,4731200,10.66 -1992-08-24,44.25,44.75,43.25,43.25,5454400,10.39 -1992-08-21,44.75,45.25,44.00,44.63,3926400,10.72 -1992-08-20,44.75,45.00,44.25,44.75,3894800,10.75 -1992-08-19,44.63,45.25,44.50,44.50,6096800,10.69 -1992-08-18,44.50,45.25,44.50,44.75,4017600,10.75 -1992-08-17,44.25,44.75,43.75,44.75,4617600,10.75 -1992-08-14,45.00,45.25,44.50,44.75,4872400,10.72 -1992-08-13,44.50,45.50,44.25,44.75,6122000,10.72 -1992-08-12,43.75,44.25,43.25,44.13,4343600,10.57 -1992-08-11,44.50,44.50,43.00,43.50,4339200,10.42 -1992-08-10,43.25,44.50,43.00,44.13,3280800,10.57 -1992-08-07,42.00,43.75,41.50,43.38,7842400,10.39 -1992-08-06,44.25,44.50,42.75,44.00,9220800,10.54 -1992-08-05,45.50,45.50,44.50,44.75,4981200,10.72 -1992-08-04,45.00,45.75,44.75,45.50,4295600,10.90 -1992-08-03,46.75,47.25,45.50,45.75,2452400,10.96 -1992-07-31,47.25,47.50,46.75,46.75,3262000,11.20 -1992-07-30,47.25,47.50,46.75,47.25,4927600,11.32 -1992-07-29,46.63,47.75,46.50,47.25,8976400,11.32 -1992-07-28,45.50,46.50,45.25,46.50,4813600,11.14 -1992-07-27,45.75,46.50,45.25,45.25,88800,10.84 -1992-07-24,44.50,46.25,44.00,45.88,4832000,10.99 -1992-07-23,44.50,44.75,43.75,44.75,6128800,10.72 -1992-07-22,45.25,45.50,44.00,44.25,5798800,10.60 -1992-07-21,45.50,46.25,45.00,45.75,4730800,10.96 -1992-07-20,44.75,45.25,44.00,44.75,6873600,10.72 -1992-07-17,45.00,46.00,44.63,45.00,15135600,10.78 -1992-07-16,47.75,49.00,47.25,48.75,5011200,11.68 -1992-07-15,47.50,49.00,47.25,48.00,6248000,11.50 -1992-07-14,47.00,48.00,47.00,47.50,4510800,11.38 -1992-07-13,45.75,47.13,45.25,47.00,4486800,11.26 -1992-07-10,46.00,46.25,44.88,45.75,5144400,10.96 -1992-07-09,46.00,46.50,45.75,45.88,5922000,10.99 -1992-07-08,44.00,45.75,44.00,45.75,7020000,10.96 -1992-07-07,46.25,46.25,43.50,44.25,7416400,10.60 -1992-07-06,46.50,46.75,45.50,46.25,4378000,11.08 -1992-07-02,49.00,49.00,45.75,46.25,9169200,11.08 -1992-07-01,48.00,49.50,47.75,49.00,5129200,11.74 -1992-06-30,46.75,48.25,46.50,48.00,6919200,11.50 -1992-06-29,45.75,47.13,45.25,46.75,6735200,11.20 -1992-06-26,45.75,46.00,44.50,45.25,3953600,10.84 -1992-06-25,46.50,46.50,45.25,45.63,5745200,10.93 -1992-06-24,45.50,46.00,45.25,46.00,7548000,11.02 -1992-06-23,45.00,45.50,44.50,45.25,11130800,10.84 -1992-06-22,44.00,44.75,42.75,44.25,13930000,10.60 -1992-06-19,46.00,46.00,43.75,44.75,15280000,10.72 -1992-06-18,47.50,49.00,44.75,45.25,15495600,10.84 -1992-06-17,49.00,49.25,47.00,47.50,10880800,11.38 -1992-06-16,51.75,52.00,48.75,49.25,13053200,11.80 -1992-06-15,54.00,54.00,52.50,52.63,6777600,12.61 -1992-06-12,54.50,55.00,54.25,54.63,3450800,13.09 -1992-06-11,53.75,54.25,53.50,53.88,5028800,12.91 -1992-06-10,54.00,54.75,53.50,53.75,4522400,12.88 -1992-06-09,54.25,54.25,53.50,54.00,3626800,12.94 -1992-06-08,55.00,55.00,54.00,54.25,3730000,13.00 -1992-06-05,54.75,55.25,54.25,54.88,4040800,13.15 -1992-06-04,54.25,54.75,53.50,54.50,6453200,13.06 -1992-06-03,56.50,56.50,54.00,54.13,10743200,12.97 -1992-06-02,57.50,57.50,56.25,56.50,5560000,13.54 -1992-06-01,57.25,59.50,56.00,57.50,8869200,13.78 -1992-05-29,59.75,60.63,59.50,59.75,6369200,14.29 -1992-05-28,60.00,60.25,59.00,59.50,4558000,14.23 -1992-05-27,59.25,60.25,59.00,60.25,5516400,14.41 -1992-05-26,59.50,59.75,58.75,59.25,3423200,14.17 -1992-05-22,59.00,59.75,59.00,59.50,1670800,14.23 -1992-05-21,60.25,60.25,58.75,59.13,4938800,14.14 -1992-05-20,59.75,60.25,59.25,60.00,6200800,14.35 -1992-05-19,60.75,60.75,59.00,59.38,4715600,14.20 -1992-05-18,61.50,61.50,60.00,60.38,4616400,14.44 -1992-05-15,61.00,61.25,60.50,60.63,4339200,14.50 -1992-05-14,62.75,63.00,60.25,61.38,5606800,14.68 -1992-05-13,62.50,63.25,62.25,62.75,3482000,15.01 -1992-05-12,62.25,63.00,61.75,62.25,2769200,14.89 -1992-05-11,62.00,62.75,61.50,62.25,3250000,14.89 -1992-05-08,61.50,62.88,61.00,62.00,7105600,14.83 -1992-05-07,61.50,62.25,60.50,60.75,6175600,14.53 -1992-05-06,60.75,62.13,60.50,61.75,6377600,14.77 -1992-05-05,60.50,60.63,59.50,60.50,6449200,14.47 -1992-05-04,59.50,61.25,59.25,60.50,4402000,14.47 -1992-05-01,60.00,60.75,58.25,59.25,4821200,14.17 -1992-04-30,57.25,60.25,56.50,60.13,9303600,14.38 -1992-04-29,54.25,57.00,54.25,57.00,7116800,13.63 -1992-04-28,55.25,55.75,53.00,54.25,6229200,12.97 -1992-04-27,56.00,56.25,55.00,55.75,5014800,13.33 -1992-04-24,57.00,58.25,56.00,56.50,3526800,13.51 -1992-04-23,57.50,58.25,56.00,57.00,6534400,13.63 -1992-04-22,56.25,58.00,56.25,57.63,6129200,13.78 -1992-04-21,57.00,57.25,56.00,56.25,6442400,13.45 -1992-04-20,59.00,59.00,56.00,56.75,7380800,13.57 -1992-04-16,60.25,60.75,58.50,59.00,9260800,14.11 -1992-04-15,58.00,60.88,57.50,60.50,7764400,14.47 -1992-04-14,57.75,59.25,57.25,58.75,5178000,14.05 -1992-04-13,55.50,56.75,55.25,56.50,4402000,13.51 -1992-04-10,57.25,57.50,55.00,55.50,9803600,13.27 -1992-04-09,56.00,58.25,55.25,57.25,6874400,13.69 -1992-04-08,57.00,57.00,54.75,55.88,13123600,13.36 -1992-04-07,61.00,61.25,57.25,57.25,8234400,13.69 -1992-04-06,59.00,61.00,59.00,60.75,3643600,14.53 -1992-04-03,58.75,59.25,58.50,59.00,4181200,14.11 -1992-04-02,59.00,59.50,58.38,58.75,4798800,14.05 -1992-04-01,57.25,59.25,57.25,59.00,5714400,14.11 -1992-03-31,58.25,59.75,58.00,58.25,7613200,13.93 -1992-03-30,61.25,61.25,57.75,58.13,12124400,13.90 -1992-03-27,63.88,64.00,60.50,61.00,9452000,14.59 -1992-03-26,64.75,65.25,63.75,64.00,4412400,15.30 -1992-03-25,65.00,65.00,64.25,64.50,4353200,15.42 -1992-03-24,63.50,65.00,63.25,65.00,7501200,15.54 -1992-03-23,63.00,63.75,63.00,63.00,1804400,15.07 -1992-03-20,63.00,63.25,63.00,63.25,1942400,15.13 -1992-03-19,63.75,63.75,62.75,63.00,4251200,15.07 -1992-03-18,63.25,64.00,63.00,63.75,2902000,15.25 -1992-03-17,63.50,63.75,62.75,62.88,3061200,15.04 -1992-03-16,62.75,63.50,61.75,63.38,2016400,15.16 -1992-03-13,63.25,63.75,62.00,63.13,2843600,15.10 -1992-03-12,63.25,63.75,61.50,62.75,5472400,15.01 -1992-03-11,63.75,64.25,63.00,63.25,4714400,15.13 -1992-03-10,64.00,64.75,63.75,63.75,4394400,15.25 -1992-03-09,63.75,64.25,63.50,63.75,3896800,15.25 -1992-03-06,63.50,64.00,63.00,64.00,4816400,15.30 -1992-03-05,64.50,65.50,63.00,63.50,8462400,15.19 -1992-03-04,66.25,66.75,64.75,65.00,4120800,15.54 -1992-03-03,67.75,68.00,66.25,66.37,3560000,15.87 -1992-03-02,67.75,68.50,67.25,67.25,3203200,16.08 -1992-02-28,68.50,69.00,67.00,67.50,3244400,16.14 -1992-02-27,70.00,70.00,68.00,68.50,4364800,16.38 -1992-02-26,68.25,70.00,68.25,69.87,8193600,16.71 -1992-02-25,66.25,68.50,65.25,68.50,8134400,16.38 -1992-02-24,66.25,66.50,65.75,66.12,6122400,15.81 -1992-02-21,64.75,65.50,64.50,65.00,5421200,15.54 -1992-02-20,62.50,64.75,62.25,64.62,4692400,15.45 -1992-02-19,62.75,63.00,61.75,62.00,3426400,14.83 -1992-02-18,64.25,64.50,62.75,62.75,2442000,15.01 -1992-02-14,63.75,64.25,63.25,64.12,2610800,15.33 -1992-02-13,65.25,65.25,63.75,64.25,2734400,15.34 -1992-02-12,63.75,65.50,63.00,65.25,4931200,15.57 -1992-02-11,63.00,63.75,62.25,62.88,4378800,15.01 -1992-02-10,64.00,64.25,63.00,63.13,3091200,15.07 -1992-02-07,64.25,64.75,62.75,64.00,5285600,15.28 -1992-02-06,65.75,66.00,64.00,64.12,3330000,15.30 -1992-02-05,66.25,66.75,65.12,66.12,5772400,15.78 -1992-02-04,65.75,66.25,65.00,65.75,6896400,15.69 -1992-02-03,64.75,66.25,64.50,65.75,5652000,15.69 -1992-01-31,64.00,65.25,63.50,64.75,5164400,15.46 -1992-01-30,63.50,63.75,62.75,63.75,3128800,15.22 -1992-01-29,64.75,65.75,63.25,63.25,5164400,15.10 -1992-01-28,64.75,65.37,63.00,65.25,6206800,15.57 -1992-01-27,64.75,65.25,64.25,64.50,2992000,15.40 -1992-01-24,64.50,65.75,64.00,64.62,6356400,15.42 -1992-01-23,64.25,64.75,63.00,64.50,4953200,15.40 -1992-01-22,61.50,63.75,61.25,63.50,6560000,15.16 -1992-01-21,64.25,64.25,61.00,61.13,6938000,14.59 -1992-01-20,64.50,65.25,64.00,64.00,7492400,15.28 -1992-01-17,67.75,69.00,64.75,64.75,30308800,15.46 -1992-01-16,63.75,64.25,62.50,62.75,10485200,14.98 -1992-01-15,64.50,65.00,63.00,63.50,11652400,15.16 -1992-01-14,62.25,64.75,62.25,64.50,9789200,15.40 -1992-01-13,62.25,62.75,61.50,62.00,3858800,14.80 -1992-01-10,61.50,62.50,61.00,62.25,7012400,14.86 -1992-01-09,60.50,62.25,60.25,62.25,7450800,14.86 -1992-01-08,58.50,61.25,58.50,60.50,8330800,14.44 -1992-01-07,57.50,59.50,57.50,59.13,5059200,14.11 -1992-01-06,58.75,59.00,57.75,58.00,4080000,13.84 -1992-01-03,60.00,60.25,58.25,59.00,6814400,14.08 -1992-01-02,55.75,59.75,55.50,59.50,8357600,14.20 -1991-12-31,57.38,58.00,56.00,56.38,4802000,13.46 -1991-12-30,55.00,57.25,55.00,56.75,6580800,13.55 -1991-12-27,54.75,55.75,54.50,55.00,6008000,13.13 -1991-12-26,52.75,55.00,52.25,54.88,4805600,13.10 -1991-12-24,52.00,53.75,51.75,52.25,6742400,12.47 -1991-12-23,50.50,51.75,50.00,51.50,3686800,12.29 -1991-12-20,51.25,51.50,50.25,50.25,4588000,11.99 -1991-12-19,51.25,51.75,50.75,50.75,4140800,12.11 -1991-12-18,50.25,52.00,50.00,51.75,6678000,12.35 -1991-12-17,50.50,51.00,50.25,50.50,3502400,12.05 -1991-12-16,50.38,50.75,50.00,50.50,2777600,12.05 -1991-12-13,49.75,50.75,49.75,50.38,3418000,12.03 -1991-12-12,49.38,49.75,49.00,49.38,3297600,11.79 -1991-12-11,49.25,49.75,48.50,49.00,3031200,11.70 -1991-12-10,49.00,49.50,48.50,49.13,4390000,11.73 -1991-12-09,49.00,50.00,48.75,49.13,3502000,11.73 -1991-12-06,49.50,49.75,48.50,48.75,7055200,11.64 -1991-12-05,50.50,51.00,49.25,50.00,3555600,11.93 -1991-12-04,50.75,50.75,50.00,50.50,2897600,12.05 -1991-12-03,52.00,52.00,50.25,50.50,3692400,12.05 -1991-12-02,50.75,52.00,50.00,51.75,4250000,12.35 -1991-11-29,50.50,51.50,50.50,50.75,1227600,12.11 -1991-11-27,51.25,51.50,50.50,51.00,2268800,12.17 -1991-11-26,51.50,52.00,50.00,51.50,4982000,12.29 -1991-11-25,51.00,52.25,51.00,51.25,2802000,12.23 -1991-11-22,51.00,51.75,50.25,51.25,3502400,12.23 -1991-11-21,50.50,51.75,50.50,51.00,3823200,12.17 -1991-11-20,51.25,52.00,50.25,50.50,6005600,12.05 -1991-11-19,51.75,51.75,49.75,51.25,10216400,12.23 -1991-11-18,50.00,52.50,50.00,52.13,8530000,12.44 -1991-11-15,54.50,54.75,49.75,50.00,9186400,11.91 -1991-11-14,54.25,55.25,54.00,54.75,6733600,13.04 -1991-11-13,54.00,54.50,53.50,54.13,6640000,12.89 -1991-11-12,54.25,54.75,53.75,54.50,5972000,12.98 -1991-11-11,53.50,54.50,53.25,53.75,5896800,12.80 -1991-11-08,51.25,53.75,51.00,53.25,13435200,12.68 -1991-11-07,48.50,50.50,48.25,49.75,10618800,11.85 -1991-11-06,49.00,49.25,47.50,48.00,8466400,11.43 -1991-11-05,49.75,50.50,48.75,48.75,7711200,11.61 -1991-11-04,50.75,50.75,48.50,49.75,6983200,11.85 -1991-11-01,51.25,52.00,50.50,51.00,7203600,12.14 -1991-10-31,50.75,51.75,50.00,51.50,8300800,12.26 -1991-10-30,52.00,52.75,49.50,49.75,5302400,11.85 -1991-10-29,51.50,52.00,50.75,51.75,3624400,12.32 -1991-10-28,51.50,51.75,50.75,51.50,2792400,12.26 -1991-10-25,51.75,52.25,50.75,51.25,3832000,12.20 -1991-10-24,53.00,53.25,51.50,52.13,6372400,12.41 -1991-10-23,55.00,55.25,52.75,53.13,6046400,12.65 -1991-10-22,55.50,56.25,54.50,54.50,7456400,12.98 -1991-10-21,55.25,55.88,54.25,54.75,4172000,13.04 -1991-10-18,55.13,55.50,54.50,55.00,15964400,13.10 -1991-10-17,53.00,53.25,51.50,52.38,5423200,12.47 -1991-10-16,52.50,54.00,52.25,53.50,7182000,12.74 -1991-10-15,50.50,52.50,50.00,52.50,10300800,12.50 -1991-10-14,49.00,50.25,48.75,49.88,4015600,11.88 -1991-10-11,48.13,48.88,46.50,48.50,4292000,11.55 -1991-10-10,48.75,49.00,46.75,47.75,5623200,11.37 -1991-10-09,48.25,48.75,47.75,48.00,4752400,11.43 -1991-10-08,48.13,48.50,46.50,48.25,6170000,11.49 -1991-10-07,48.00,48.75,47.50,48.13,2328000,11.46 -1991-10-04,48.00,48.75,47.50,48.25,2854400,11.49 -1991-10-03,50.00,50.00,47.50,47.75,6478000,11.37 -1991-10-02,51.75,51.75,49.50,49.75,643600,11.85 -1991-10-01,49.25,51.25,49.00,50.75,4698800,12.08 -1991-09-30,49.25,49.75,49.00,49.50,2266800,11.79 -1991-09-27,50.00,50.75,48.75,49.00,2245200,11.67 -1991-09-26,50.25,50.25,49.00,50.00,2556800,11.91 -1991-09-25,50.25,50.50,49.25,50.50,1959200,12.02 -1991-09-24,49.50,50.38,48.25,50.25,3805600,11.97 -1991-09-23,50.00,50.75,49.25,49.50,3136800,11.79 -1991-09-20,49.75,51.00,49.50,50.63,6742000,12.06 -1991-09-19,50.25,50.50,49.50,49.75,6374400,11.85 -1991-09-18,48.75,50.50,48.50,50.13,4342000,11.94 -1991-09-17,47.00,49.00,46.75,49.00,4856400,11.67 -1991-09-16,49.25,49.25,46.50,47.25,7365600,11.25 -1991-09-13,50.00,50.25,48.50,48.63,5974400,11.58 -1991-09-12,51.25,51.25,49.75,50.63,4267600,12.06 -1991-09-11,50.75,51.00,49.50,50.50,6378000,12.02 -1991-09-10,52.75,53.38,49.75,50.13,6535600,11.94 -1991-09-09,51.75,53.50,51.50,53.25,4538000,12.68 -1991-09-06,51.00,51.75,50.50,51.50,2848800,12.26 -1991-09-05,51.50,51.75,50.75,51.00,2793600,12.14 -1991-09-04,52.75,52.75,51.38,51.50,4299200,12.26 -1991-09-03,52.75,53.25,52.00,52.50,2443200,12.50 -1991-08-30,53.00,53.25,52.25,53.00,2363200,12.62 -1991-08-29,53.25,53.88,52.50,53.00,4053200,12.62 -1991-08-28,54.00,54.25,53.13,53.25,3843600,12.68 -1991-08-27,53.00,54.00,52.75,54.00,3597600,12.86 -1991-08-26,53.00,53.50,52.50,53.00,3644400,12.62 -1991-08-23,54.00,55.50,52.75,53.00,8601200,12.62 -1991-08-22,54.00,54.75,53.75,54.25,5936400,12.92 -1991-08-21,52.50,54.13,52.00,53.75,7987600,12.80 -1991-08-20,51.50,51.75,50.50,51.00,7123600,12.14 -1991-08-19,49.50,51.63,48.50,50.50,11538000,12.02 -1991-08-16,52.75,54.25,52.25,53.25,5689200,12.65 -1991-08-15,55.00,55.00,53.00,53.25,5219200,12.65 -1991-08-14,54.75,55.00,53.88,54.88,7173200,13.04 -1991-08-13,52.00,54.00,52.00,53.50,10255200,12.71 -1991-08-12,50.75,52.25,50.50,51.75,5096400,12.29 -1991-08-09,50.50,51.00,49.75,50.75,5533600,12.06 -1991-08-08,50.75,51.75,50.00,50.50,6769200,12.00 -1991-08-07,49.50,51.00,49.38,50.38,7578800,11.97 -1991-08-06,48.75,50.25,47.75,49.50,7890800,11.76 -1991-08-05,49.75,49.75,48.25,48.50,3620800,11.52 -1991-08-02,49.75,50.25,49.00,50.00,9767600,11.88 -1991-08-01,46.00,49.25,45.75,49.13,16023600,11.67 -1991-07-31,46.50,46.88,45.00,46.25,3689200,10.99 -1991-07-30,45.50,46.75,45.50,46.50,3281200,11.05 -1991-07-29,45.25,45.50,44.50,45.50,1916800,10.81 -1991-07-26,45.75,45.75,44.75,44.88,2657600,10.66 -1991-07-25,45.25,45.75,45.00,45.25,2366800,10.75 -1991-07-24,45.25,45.75,44.50,45.00,4703200,10.69 -1991-07-23,46.25,46.50,44.50,45.00,4770000,10.69 -1991-07-22,45.75,46.25,45.50,46.00,3882000,10.93 -1991-07-19,45.25,46.25,45.00,46.00,4601200,10.93 -1991-07-18,44.00,45.13,43.00,44.88,14240000,10.66 -1991-07-17,43.50,44.50,42.25,42.50,7474400,10.10 -1991-07-16,45.50,45.75,43.50,43.75,7966400,10.39 -1991-07-15,46.75,46.75,45.50,45.50,4932400,10.81 -1991-07-12,47.25,47.25,46.25,46.75,4753200,11.11 -1991-07-11,47.00,47.25,46.00,46.75,5217600,11.11 -1991-07-10,47.50,48.25,46.75,47.25,5610000,11.23 -1991-07-09,47.25,48.25,46.50,46.88,8091200,11.14 -1991-07-08,45.25,47.25,45.00,46.75,10971200,11.11 -1991-07-05,43.00,46.00,42.75,45.63,11842000,10.84 -1991-07-03,42.25,43.50,41.75,43.13,11087600,10.25 -1991-07-02,42.25,42.75,41.75,42.25,4296800,10.04 -1991-07-01,42.25,43.00,41.75,42.50,6979200,10.10 -1991-06-28,42.25,42.50,40.25,41.50,8102400,9.86 -1991-06-27,42.50,42.75,41.75,42.50,5400000,10.10 -1991-06-26,42.75,43.50,42.25,43.00,8958000,10.22 -1991-06-25,42.00,43.00,41.75,42.38,8151200,10.07 -1991-06-24,41.75,42.25,41.25,41.75,7443600,9.92 -1991-06-21,42.00,42.50,41.75,42.00,7378800,9.98 -1991-06-20,41.25,42.00,40.75,42.00,5158000,9.98 -1991-06-19,41.75,42.25,41.25,41.75,6408000,9.92 -1991-06-18,42.25,43.25,41.50,42.13,8749200,10.01 -1991-06-17,41.00,42.25,41.00,42.00,5966800,9.98 -1991-06-14,42.75,42.75,40.75,41.13,8049200,9.77 -1991-06-13,42.50,43.00,41.75,42.13,7565200,10.01 -1991-06-12,44.00,44.75,41.25,42.38,15580000,10.07 -1991-06-11,45.00,45.50,44.25,44.63,6742400,10.60 -1991-06-10,46.00,47.13,45.75,46.00,5991200,10.93 -1991-06-07,46.25,47.00,45.63,46.13,5463600,10.96 -1991-06-06,48.25,48.25,46.50,46.63,6028000,11.08 -1991-06-05,49.25,49.25,47.75,48.00,4760800,11.40 -1991-06-04,49.50,49.50,48.50,49.13,6593600,11.67 -1991-06-03,47.00,49.50,46.75,49.25,7870800,11.70 -1991-05-31,47.50,47.75,46.25,47.00,7792400,11.17 -1991-05-30,47.00,47.75,46.50,47.63,5663600,11.32 -1991-05-29,46.25,47.75,45.88,47.00,13733600,11.17 -1991-05-28,46.00,46.25,45.25,46.00,6124400,10.93 -1991-05-24,45.50,46.00,45.00,45.88,3484800,10.90 -1991-05-23,46.50,46.75,44.75,45.13,7458800,10.72 -1991-05-22,45.75,46.50,45.50,46.25,8137600,10.99 -1991-05-21,45.25,46.50,44.75,45.25,12500000,10.75 -1991-05-20,47.25,47.50,44.00,44.25,9365200,10.51 -1991-05-17,48.75,48.75,46.50,47.00,16836800,11.14 -1991-05-16,51.00,51.25,48.50,49.00,13652000,11.61 -1991-05-15,51.50,52.00,49.00,50.50,18530800,11.97 -1991-05-14,52.75,53.75,52.50,53.50,7763600,12.68 -1991-05-13,52.25,53.50,51.50,52.75,8763600,12.50 -1991-05-10,51.50,53.25,50.75,51.25,8652000,12.14 -1991-05-09,50.00,51.50,49.75,50.75,8523200,12.03 -1991-05-08,50.75,50.75,49.25,49.75,6332400,11.79 -1991-05-07,51.00,51.25,50.50,50.63,9671200,12.00 -1991-05-06,48.50,50.50,48.25,50.25,7596400,11.91 -1991-05-03,49.00,49.50,48.25,49.00,8717600,11.61 -1991-05-02,47.75,49.75,47.50,49.00,28973600,11.61 -1991-05-01,48.00,49.00,47.00,47.25,66732000,11.20 -1991-04-30,57.75,58.25,54.50,55.00,25413600,13.03 -1991-04-29,58.50,60.25,58.25,58.25,7395200,13.80 -1991-04-26,58.50,59.00,57.75,58.63,4481200,13.89 -1991-04-25,59.75,59.75,58.50,58.50,11276800,13.86 -1991-04-24,61.75,62.00,60.50,60.75,3769200,14.40 -1991-04-23,62.25,63.00,60.25,61.50,8494400,14.57 -1991-04-22,59.50,62.00,58.75,61.50,9190000,14.57 -1991-04-19,61.00,61.50,59.50,59.63,10272400,14.13 -1991-04-18,62.75,63.00,60.75,61.00,8853600,14.46 -1991-04-17,65.00,65.00,62.00,63.25,11533600,14.99 -1991-04-16,63.25,64.50,62.50,64.25,22176800,15.23 -1991-04-15,61.75,64.50,60.00,62.25,60732400,14.75 -1991-04-12,71.50,73.25,69.75,71.75,13140000,17.00 -1991-04-11,67.75,71.37,67.50,71.00,12710800,16.83 -1991-04-10,68.50,69.25,66.75,66.87,7733600,15.85 -1991-04-09,69.75,70.00,68.25,68.75,4280800,16.29 -1991-04-08,69.25,70.00,68.75,70.00,2604400,16.59 -1991-04-05,71.75,71.75,68.75,69.37,5567600,16.44 -1991-04-04,70.00,72.00,69.50,71.50,6024400,16.94 -1991-04-03,72.50,72.75,70.00,70.00,8585200,16.59 -1991-04-02,69.00,72.75,68.50,72.75,10473600,17.24 -1991-04-01,68.00,69.50,67.50,68.50,4218000,16.23 -1991-03-28,69.25,70.00,67.75,68.00,2816800,16.11 -1991-03-27,70.00,70.25,68.50,69.25,6812400,16.41 -1991-03-26,64.75,70.25,64.75,70.00,11935200,16.59 -1991-03-25,63.50,65.00,63.25,64.50,4858800,15.28 -1991-03-22,64.00,64.75,62.25,63.25,12096400,14.99 -1991-03-21,68.25,68.75,63.75,64.75,10600000,15.34 -1991-03-20,69.25,69.50,66.87,67.75,12939200,16.06 -1991-03-19,66.50,70.25,65.75,69.50,15100000,16.47 -1991-03-18,65.75,68.25,65.75,67.75,7645200,16.06 -1991-03-15,65.75,66.50,65.25,66.25,7335600,15.70 -1991-03-14,66.75,67.50,64.50,65.25,8126400,15.46 -1991-03-13,62.75,66.50,62.75,66.25,6253200,15.70 -1991-03-12,63.00,63.75,62.50,62.88,8360000,14.90 -1991-03-11,64.50,64.75,62.25,63.50,6276400,15.05 -1991-03-08,67.75,68.25,65.00,65.00,11522400,15.40 -1991-03-07,63.50,67.50,63.25,67.25,11497600,15.94 -1991-03-06,64.00,65.62,62.88,63.00,18731200,14.93 -1991-03-05,59.00,63.25,59.00,63.13,15769200,14.96 -1991-03-04,58.00,58.75,57.00,58.38,3175600,13.83 -1991-03-01,57.00,59.00,57.00,57.75,4518800,13.69 -1991-02-28,58.25,58.50,56.25,57.25,8120000,13.57 -1991-02-27,58.25,58.50,57.50,58.25,6243200,13.80 -1991-02-26,57.50,58.75,56.50,58.25,8934400,13.80 -1991-02-25,60.25,60.50,57.50,58.00,12848800,13.74 -1991-02-22,59.00,61.75,58.50,59.75,8320800,14.16 -1991-02-21,61.25,62.25,58.75,59.00,6826400,13.98 -1991-02-20,59.50,61.75,59.25,61.00,7646800,14.46 -1991-02-19,57.50,60.25,57.38,60.00,8080800,14.22 -1991-02-15,57.25,58.50,57.25,57.63,13067600,13.66 -1991-02-14,60.00,60.00,56.75,57.13,13493200,13.51 -1991-02-13,60.00,60.25,58.00,60.00,9130800,14.19 -1991-02-12,61.00,61.25,59.38,60.00,8042000,14.19 -1991-02-11,60.00,61.50,59.75,61.38,11546400,14.51 -1991-02-08,57.50,60.25,57.50,59.88,11220000,14.16 -1991-02-07,57.00,58.75,55.75,57.75,18587600,13.66 -1991-02-06,57.75,58.25,56.50,56.88,7965200,13.45 -1991-02-05,55.25,58.00,54.75,57.75,12740000,13.66 -1991-02-04,55.75,56.00,55.00,55.25,9569200,13.07 -1991-02-01,55.50,57.88,55.50,55.75,15897600,13.18 -1991-01-31,55.50,56.00,54.75,55.50,8677600,13.12 -1991-01-30,53.25,55.75,53.25,55.50,12043200,13.12 -1991-01-29,54.25,54.50,52.25,53.75,7708800,12.71 -1991-01-28,53.25,55.25,53.25,54.50,9771200,12.89 -1991-01-25,52.00,53.63,52.00,53.50,8012000,12.65 -1991-01-24,51.50,52.75,51.50,52.13,8374400,12.33 -1991-01-23,51.25,52.25,51.00,51.75,8725600,12.24 -1991-01-22,51.00,52.50,50.50,51.25,15296400,12.12 -1991-01-21,49.75,51.50,49.75,50.75,11595200,12.00 -1991-01-18,48.75,50.75,48.50,50.25,33691200,11.88 -1991-01-17,52.50,52.75,49.00,51.25,21137600,12.12 -1991-01-16,47.00,50.00,46.75,49.75,13968800,11.76 -1991-01-15,46.50,46.75,46.00,46.75,6870000,11.06 -1991-01-14,46.00,46.75,46.00,46.25,7535600,10.94 -1991-01-11,47.00,47.25,46.00,47.00,11003200,11.11 -1991-01-10,45.75,47.25,45.75,47.13,15562400,11.15 -1991-01-09,44.25,46.00,43.75,45.25,16692400,10.70 -1991-01-08,43.75,43.88,42.50,43.25,7816400,10.23 -1991-01-07,43.00,45.25,43.00,43.25,11111200,10.23 -1991-01-04,43.00,44.25,43.00,43.25,5062400,10.23 -1991-01-03,43.50,44.25,43.00,43.00,5365600,10.17 -1991-01-02,42.75,44.00,42.00,43.50,5543600,10.29 -1990-12-31,43.00,43.25,42.75,43.00,1593200,10.17 -1990-12-28,43.25,43.50,42.75,43.00,2285200,10.17 -1990-12-27,43.25,44.00,43.25,43.50,3492000,10.29 -1990-12-26,44.00,44.25,43.00,43.75,3682000,10.35 -1990-12-24,44.75,45.00,44.00,44.00,2106800,10.40 -1990-12-21,44.25,45.25,43.50,45.00,12363200,10.64 -1990-12-20,41.25,44.50,41.25,44.00,14326400,10.40 -1990-12-19,42.50,42.50,41.13,41.88,5036800,9.90 -1990-12-18,41.00,42.50,40.75,42.25,7899200,9.99 -1990-12-17,39.00,40.50,39.00,40.13,4683600,9.49 -1990-12-14,40.25,40.50,39.50,39.88,3126400,9.43 -1990-12-13,39.50,41.00,39.50,40.75,5752000,9.64 -1990-12-12,39.75,40.00,39.00,39.63,8664400,9.37 -1990-12-11,41.25,41.50,40.00,40.00,12438000,9.46 -1990-12-10,42.25,42.50,41.50,41.75,8966400,9.87 -1990-12-07,41.00,42.75,41.00,42.50,11781200,10.05 -1990-12-06,41.25,41.75,40.50,41.25,19013600,9.75 -1990-12-05,38.50,40.25,37.88,40.13,7822000,9.49 -1990-12-04,37.50,38.75,37.50,38.50,5453200,9.10 -1990-12-03,37.25,38.25,37.00,38.13,5922400,9.02 -1990-11-30,36.25,37.25,36.25,36.75,4350800,8.69 -1990-11-29,37.00,37.00,36.25,36.75,4528000,8.69 -1990-11-28,37.75,38.50,36.75,36.75,6250800,8.69 -1990-11-27,37.00,38.25,36.75,37.50,5899200,8.87 -1990-11-26,36.00,37.00,36.00,36.75,2925600,8.69 -1990-11-23,36.25,37.00,36.00,36.38,1911200,8.60 -1990-11-21,35.25,36.25,34.75,36.13,4400800,8.54 -1990-11-20,36.50,36.75,35.25,35.50,5490800,8.39 -1990-11-19,35.50,36.38,35.25,36.38,8017600,8.60 -1990-11-16,35.75,36.00,34.75,35.13,6545200,8.31 -1990-11-15,36.75,37.00,35.50,36.00,5787600,8.48 -1990-11-14,35.75,37.25,35.75,37.00,6819200,8.72 -1990-11-13,36.25,36.50,35.75,36.00,5086400,8.48 -1990-11-12,35.50,36.75,35.25,36.25,5192000,8.54 -1990-11-09,35.00,35.75,34.50,35.50,7102000,8.37 -1990-11-08,33.00,35.00,33.00,34.50,7136400,8.13 -1990-11-07,33.50,33.75,32.63,33.25,7254400,7.84 -1990-11-06,33.50,34.50,33.25,33.50,6620800,7.90 -1990-11-05,32.25,33.50,32.00,33.25,6604400,7.84 -1990-11-02,30.50,32.38,30.50,31.75,5323200,7.48 -1990-11-01,30.50,31.00,29.75,30.50,3258800,7.19 -1990-10-31,30.50,31.87,30.25,30.75,5331200,7.25 -1990-10-30,29.75,30.75,28.87,30.37,3513600,7.16 -1990-10-29,30.25,30.50,29.75,29.87,4415600,7.04 -1990-10-26,29.75,31.25,29.75,30.00,4811200,7.07 -1990-10-25,30.25,31.25,29.62,30.00,5481200,7.07 -1990-10-24,30.75,31.00,30.00,30.50,5079200,7.19 -1990-10-23,31.00,31.50,30.25,31.00,5969200,7.31 -1990-10-22,31.50,31.50,30.50,31.12,9041200,7.33 -1990-10-19,31.25,31.75,30.25,31.37,33363200,7.39 -1990-10-18,26.50,28.75,26.50,28.50,11255600,6.72 -1990-10-17,25.25,26.50,25.00,26.50,11059200,6.25 -1990-10-16,27.50,27.50,24.25,25.00,10913200,5.89 -1990-10-15,28.50,28.75,26.62,27.75,7190000,6.54 -1990-10-12,28.25,28.50,27.00,28.25,8169200,6.66 -1990-10-11,26.75,27.87,25.50,27.75,7376800,6.54 -1990-10-10,27.25,28.00,26.00,26.50,5283600,6.25 -1990-10-09,28.50,29.00,27.75,28.00,4321200,6.60 -1990-10-08,28.75,29.25,28.25,29.12,2218800,6.86 -1990-10-05,27.00,28.75,27.00,28.00,3572000,6.60 -1990-10-04,26.75,28.00,26.25,28.00,7638800,6.60 -1990-10-03,29.75,29.75,26.75,27.00,9591200,6.36 -1990-10-02,31.00,32.00,29.50,29.62,9699200,6.98 -1990-10-01,29.50,31.00,29.25,30.50,5581200,7.19 -1990-09-28,28.50,29.00,27.25,29.00,6291200,6.83 -1990-09-27,30.00,30.50,28.00,28.25,5085600,6.66 -1990-09-26,30.00,30.50,29.75,29.75,3363200,7.01 -1990-09-25,30.50,30.75,29.25,30.00,5642000,7.07 -1990-09-24,31.50,31.50,29.75,30.25,4961200,7.13 -1990-09-21,32.00,32.50,31.00,31.50,5503600,7.42 -1990-09-20,32.25,32.25,31.25,31.62,3607600,7.45 -1990-09-19,33.25,33.75,32.00,32.50,6536800,7.66 -1990-09-18,33.75,33.75,33.00,33.38,4456400,7.87 -1990-09-17,34.00,35.25,33.50,33.75,2782000,7.95 -1990-09-14,33.50,34.25,33.25,34.00,4084400,8.01 -1990-09-13,34.50,34.75,33.00,33.75,3492400,7.95 -1990-09-12,34.50,34.50,33.50,34.00,3600800,8.01 -1990-09-11,36.00,36.13,33.75,34.00,6370800,8.01 -1990-09-10,37.00,37.00,35.75,35.75,2732400,8.43 -1990-09-07,35.50,36.75,35.13,36.38,2098800,8.57 -1990-09-06,35.50,36.00,35.25,35.75,3134800,8.43 -1990-09-05,37.25,37.25,35.75,36.00,2292000,8.48 -1990-09-04,36.50,37.50,36.50,37.00,2974800,8.72 -1990-08-31,36.00,37.25,36.00,37.00,3570000,8.72 -1990-08-30,37.25,37.50,36.00,36.25,4388800,8.54 -1990-08-29,38.00,38.13,36.75,37.25,5407600,8.78 -1990-08-28,37.50,38.38,37.25,38.13,2877600,8.99 -1990-08-27,36.75,38.00,36.25,37.75,4214800,8.90 -1990-08-24,35.25,36.00,34.75,35.50,2634400,8.37 -1990-08-23,34.25,35.00,33.50,34.50,5138800,8.13 -1990-08-22,37.00,37.00,34.88,35.13,4395600,8.28 -1990-08-21,35.75,36.75,35.25,36.25,5769200,8.54 -1990-08-20,36.50,37.50,36.25,36.75,2681200,8.66 -1990-08-17,38.50,38.50,35.75,36.50,8806400,8.58 -1990-08-16,39.00,39.63,38.50,38.50,4438800,9.05 -1990-08-15,40.00,40.25,39.25,39.25,3292000,9.22 -1990-08-14,40.00,40.00,39.25,39.75,3520800,9.34 -1990-08-13,38.00,40.00,37.88,39.88,5584400,9.37 -1990-08-10,38.75,39.25,38.25,38.75,3683600,9.11 -1990-08-09,40.25,40.50,39.25,39.50,3443600,9.28 -1990-08-08,39.50,40.75,39.50,40.13,3674400,9.43 -1990-08-07,40.25,40.63,38.75,39.50,7096400,9.28 -1990-08-06,39.00,40.50,38.50,39.50,6425600,9.28 -1990-08-03,43.50,43.75,39.75,41.25,9609200,9.69 -1990-08-02,41.25,43.75,41.25,43.50,7973600,10.22 -1990-08-01,42.00,42.75,41.50,42.38,3350800,9.96 -1990-07-31,42.50,42.75,41.50,42.00,3444800,9.87 -1990-07-30,40.75,42.50,40.75,42.38,3058800,9.96 -1990-07-27,41.25,41.75,40.50,41.38,2240000,9.72 -1990-07-26,42.25,42.50,41.00,41.38,2885600,9.72 -1990-07-25,42.00,43.25,41.75,42.25,3762400,9.93 -1990-07-24,42.00,42.25,41.00,42.13,6928800,9.90 -1990-07-23,41.00,41.75,40.00,41.50,9655200,9.75 -1990-07-20,42.00,42.50,40.75,41.00,6858000,9.63 -1990-07-19,40.75,42.50,40.00,41.75,20932400,9.81 -1990-07-18,44.50,45.00,43.00,44.63,10309200,10.49 -1990-07-17,45.75,46.00,44.00,44.25,4892000,10.40 -1990-07-16,46.75,47.13,45.25,45.63,6428000,10.72 -1990-07-13,47.50,47.75,46.75,46.75,8254400,10.99 -1990-07-12,46.75,47.50,46.50,47.38,6537600,11.13 -1990-07-11,46.75,47.00,45.75,47.00,8808800,11.04 -1990-07-10,47.00,47.50,46.75,47.00,12923600,11.04 -1990-07-09,45.00,47.00,44.75,46.63,11281200,10.96 -1990-07-06,43.50,45.00,43.25,44.75,7481200,10.52 -1990-07-05,43.75,44.25,43.25,43.50,3859200,10.22 -1990-07-03,43.88,44.50,43.75,44.00,3572400,10.34 -1990-07-02,44.50,44.50,43.75,44.00,4856400,10.34 -1990-06-29,43.00,44.88,42.75,44.75,11622000,10.52 -1990-06-28,42.75,43.25,41.75,43.00,8930000,10.10 -1990-06-27,40.75,42.00,40.25,41.50,3490800,9.75 -1990-06-26,41.75,42.00,40.38,40.63,4558800,9.55 -1990-06-25,41.50,41.75,40.25,41.25,4378000,9.69 -1990-06-22,42.00,42.63,41.25,41.50,10154400,9.75 -1990-06-21,40.00,42.00,40.00,41.88,7455600,9.84 -1990-06-20,39.88,40.25,39.75,40.00,5530000,9.40 -1990-06-19,39.00,39.75,38.38,39.63,5623600,9.31 -1990-06-18,39.25,39.50,39.00,39.25,3988800,9.22 -1990-06-15,39.75,40.00,39.13,39.50,5163600,9.28 -1990-06-14,40.00,40.25,39.25,39.75,5018000,9.34 -1990-06-13,40.38,40.75,39.75,39.75,4963600,9.34 -1990-06-12,39.13,40.50,38.75,40.50,5902000,9.52 -1990-06-11,37.75,39.00,37.75,39.00,5661200,9.16 -1990-06-08,38.50,38.50,37.50,38.25,11926800,8.99 -1990-06-07,39.50,39.75,38.50,39.00,6668800,9.16 -1990-06-06,39.00,39.50,38.75,39.50,7563600,9.28 -1990-06-05,41.00,41.00,39.00,39.50,10702000,9.28 -1990-06-04,40.75,41.00,39.75,40.75,6412400,9.58 -1990-06-01,41.38,42.00,40.75,40.75,5624400,9.58 -1990-05-31,41.50,41.50,41.00,41.25,3682400,9.69 -1990-05-30,41.63,41.75,41.25,41.38,9890000,9.72 -1990-05-29,40.00,41.25,39.25,41.00,8689200,9.63 -1990-05-25,39.50,40.75,39.00,40.00,11562400,9.40 -1990-05-24,42.25,42.25,41.50,42.00,5296400,9.87 -1990-05-23,41.25,42.50,41.25,42.00,7417600,9.87 -1990-05-22,40.13,41.50,40.00,41.38,10772000,9.72 -1990-05-21,39.50,40.00,38.75,39.50,9382400,9.28 -1990-05-18,41.25,41.50,39.50,39.75,9248000,9.31 -1990-05-17,41.75,42.25,41.00,41.50,5488000,9.72 -1990-05-16,41.75,41.75,41.00,41.63,3139200,9.76 -1990-05-15,41.38,42.00,41.00,41.75,5343600,9.78 -1990-05-14,42.75,42.75,41.25,41.75,8088000,9.78 -1990-05-11,41.38,42.75,40.75,42.63,7691200,9.99 -1990-05-10,41.75,41.75,40.50,41.38,6413600,9.70 -1990-05-09,41.63,42.00,41.25,41.88,3491200,9.81 -1990-05-08,41.00,42.00,41.00,41.75,4025600,9.78 -1990-05-07,39.75,41.75,39.75,41.50,4866400,9.72 -1990-05-04,40.00,40.75,39.25,40.00,6063200,9.37 -1990-05-03,39.75,40.25,39.75,40.00,5950800,9.37 -1990-05-02,39.75,40.00,39.25,39.75,4857600,9.31 -1990-05-01,39.75,40.00,39.38,39.63,5845200,9.29 -1990-04-30,39.25,39.75,39.00,39.38,4888800,9.23 -1990-04-27,39.00,39.50,38.75,39.13,4178800,9.17 -1990-04-26,39.00,39.50,38.13,38.88,5098000,9.11 -1990-04-25,38.75,39.00,38.25,38.75,4743200,9.08 -1990-04-24,40.00,40.50,38.50,38.75,10852000,9.08 -1990-04-23,40.25,40.50,39.50,39.75,4597600,9.31 -1990-04-20,40.88,41.50,39.75,40.25,11573600,9.43 -1990-04-19,41.75,43.13,40.00,40.25,17215600,9.43 -1990-04-18,43.25,43.75,42.50,43.25,6925200,10.13 -1990-04-17,43.25,43.50,42.75,43.25,4683600,10.13 -1990-04-16,43.50,44.25,43.25,43.75,8116400,10.25 -1990-04-12,43.00,44.00,42.50,43.25,7566800,10.13 -1990-04-11,41.50,43.00,41.50,42.50,7620000,9.96 -1990-04-10,41.25,42.00,41.00,41.25,4695600,9.67 -1990-04-09,39.75,41.50,39.50,41.13,3771200,9.64 -1990-04-06,40.25,41.25,39.75,39.88,4235600,9.35 -1990-04-05,41.00,41.25,40.00,40.25,3877600,9.43 -1990-04-04,41.50,42.00,40.75,41.25,5363200,9.67 -1990-04-03,40.50,41.75,40.50,41.75,5006400,9.78 -1990-04-02,40.00,40.63,39.50,40.25,5332000,9.43 -1990-03-30,40.00,41.00,40.00,40.25,7986400,9.43 -1990-03-29,41.00,41.50,40.75,41.13,3472000,9.64 -1990-03-28,42.00,42.13,41.00,41.25,3696800,9.67 -1990-03-27,42.00,42.25,41.25,42.00,3033600,9.84 -1990-03-26,42.50,43.38,42.00,42.25,4581200,9.90 -1990-03-23,41.25,43.00,41.00,42.25,8155200,9.90 -1990-03-22,41.75,42.25,40.75,40.75,8292400,9.55 -1990-03-21,41.25,42.25,41.25,41.63,5463200,9.76 -1990-03-20,42.25,43.00,40.75,41.38,13984400,9.70 -1990-03-19,40.50,42.50,40.00,42.38,15433200,9.93 -1990-03-16,40.00,40.75,39.13,40.25,23042400,9.43 -1990-03-15,36.50,38.00,36.50,36.75,4302000,8.61 -1990-03-14,36.75,37.25,36.50,37.00,3654800,8.67 -1990-03-13,36.50,37.25,36.25,36.88,5321200,8.64 -1990-03-12,37.25,37.50,36.25,36.63,5864400,8.58 -1990-03-09,36.75,37.50,36.25,36.88,8248800,8.64 -1990-03-08,35.75,37.00,35.00,36.75,8013600,8.61 -1990-03-07,35.00,36.00,35.00,35.38,7301200,8.29 -1990-03-06,35.00,35.25,34.50,35.25,5578800,8.26 -1990-03-05,33.50,34.75,33.50,34.50,6537600,8.08 -1990-03-02,33.50,34.75,33.25,33.75,3761200,7.91 -1990-03-01,33.50,34.75,33.25,34.25,7283200,8.03 -1990-02-28,33.50,34.00,33.25,34.00,3918800,7.97 -1990-02-27,34.00,34.25,33.50,33.50,2642000,7.85 -1990-02-26,33.00,34.25,33.00,34.00,2844800,7.97 -1990-02-23,32.75,33.50,32.75,33.25,5375600,7.79 -1990-02-22,34.00,34.50,33.00,33.00,6976800,7.73 -1990-02-21,32.75,34.25,32.50,34.00,6283600,7.97 -1990-02-20,33.50,33.75,33.00,33.50,4402400,7.85 -1990-02-16,34.25,34.50,33.75,33.75,4556400,7.91 -1990-02-15,33.75,34.25,33.50,34.25,3509200,8.00 -1990-02-14,34.50,34.75,33.75,34.25,3448000,8.00 -1990-02-13,34.00,35.00,33.75,34.50,3653600,8.06 -1990-02-12,34.25,34.50,33.75,34.00,2695600,7.94 -1990-02-09,33.50,34.50,33.25,34.25,6004400,8.00 -1990-02-08,33.25,33.50,32.25,33.00,6680000,7.71 -1990-02-07,33.00,34.00,32.50,33.25,11180800,7.77 -1990-02-06,34.75,35.00,34.00,34.75,2640000,8.12 -1990-02-05,34.25,35.25,34.00,35.00,3653200,8.18 -1990-02-02,33.25,34.75,33.25,34.25,4248800,8.00 -1990-02-01,34.50,34.63,33.50,33.63,4193200,7.86 -1990-01-31,34.50,34.75,33.00,34.00,5152400,7.94 -1990-01-30,33.25,34.50,33.00,34.00,4180800,7.94 -1990-01-29,33.00,33.50,32.13,33.25,4284800,7.77 -1990-01-26,34.00,34.00,32.25,32.75,6492000,7.65 -1990-01-25,34.25,34.75,34.00,34.13,3996800,7.97 -1990-01-24,32.50,34.25,32.25,34.00,6077600,7.94 -1990-01-23,33.75,34.25,33.00,33.75,5048800,7.88 -1990-01-22,34.00,34.50,33.25,33.25,5200800,7.77 -1990-01-19,33.75,34.50,33.50,34.25,9485600,8.00 -1990-01-18,33.00,33.50,32.25,32.38,9760800,7.56 -1990-01-17,34.75,34.75,33.00,33.25,7050000,7.77 -1990-01-16,33.50,35.00,32.75,34.88,7658000,8.15 -1990-01-15,34.50,35.75,34.25,34.25,5785600,8.00 -1990-01-12,34.25,34.75,33.75,34.50,6150000,8.06 -1990-01-11,36.25,36.25,34.50,34.50,7547600,8.06 -1990-01-10,37.63,37.63,35.75,36.00,7140000,8.41 -1990-01-09,38.00,38.00,37.00,37.63,3096800,8.79 -1990-01-08,37.50,38.00,37.00,38.00,3643200,8.88 -1990-01-05,37.75,38.25,37.00,37.75,4406400,8.82 -1990-01-04,38.25,38.75,37.25,37.63,7928800,8.79 -1990-01-03,38.00,38.00,37.50,37.50,7444400,8.76 -1990-01-02,35.25,37.50,35.00,37.25,6555600,8.70 -1989-12-29,34.75,35.75,34.38,35.25,5445200,8.23 -1989-12-28,35.00,35.25,34.25,34.63,5403200,8.09 -1989-12-27,35.50,35.75,35.00,35.13,9189200,8.21 -1989-12-26,36.75,36.75,35.25,35.50,4849200,8.29 -1989-12-22,36.25,37.25,36.00,36.50,6610800,8.53 -1989-12-21,35.75,36.25,35.50,36.25,10889200,8.47 -1989-12-20,35.75,36.25,35.25,35.75,6377600,8.35 -1989-12-19,34.50,35.50,34.50,35.00,8977600,8.18 -1989-12-18,33.75,35.00,33.75,34.75,10978000,8.12 -1989-12-15,34.75,35.00,32.50,33.75,18520800,7.88 -1989-12-14,35.75,36.13,34.50,34.88,10886400,8.15 -1989-12-13,36.00,36.50,35.50,36.00,13920000,8.41 -1989-12-12,39.25,39.50,35.00,36.00,36634400,8.41 -1989-12-11,41.00,41.50,38.38,39.25,23223200,9.17 -1989-12-08,42.50,43.00,41.25,41.75,9032400,9.75 -1989-12-07,42.25,43.25,42.00,42.75,6378800,9.99 -1989-12-06,45.00,45.25,41.00,42.75,11965600,9.99 -1989-12-05,45.25,45.75,44.50,45.00,4364800,10.51 -1989-12-04,43.75,45.50,43.75,45.25,3498000,10.57 -1989-12-01,44.50,45.00,43.63,44.00,5235200,10.28 -1989-11-30,43.75,44.50,43.50,44.25,2280800,10.34 -1989-11-29,43.50,44.25,42.50,44.00,5475200,10.28 -1989-11-28,43.75,44.25,42.75,44.13,4854400,10.31 -1989-11-27,44.75,45.25,43.75,44.00,3774800,10.28 -1989-11-24,44.75,45.00,44.75,44.75,1014400,10.45 -1989-11-22,45.50,45.75,44.50,44.75,3508000,10.45 -1989-11-21,45.25,46.50,45.25,45.25,5013600,10.57 -1989-11-20,45.00,45.50,44.50,45.25,3870800,10.57 -1989-11-17,44.50,45.25,44.50,44.75,3164400,10.45 -1989-11-16,44.50,44.75,43.75,44.75,3453600,10.43 -1989-11-15,45.00,45.25,44.00,44.25,3499200,10.31 -1989-11-14,46.50,46.75,44.50,44.75,3021200,10.43 -1989-11-13,46.50,47.25,46.50,46.50,2445600,10.83 -1989-11-10,45.75,47.00,45.75,46.75,2336800,10.89 -1989-11-09,45.00,46.00,44.50,46.00,3166400,10.72 -1989-11-08,44.25,45.25,44.25,45.00,5102000,10.49 -1989-11-07,43.25,44.50,43.25,44.00,5406800,10.25 -1989-11-06,43.50,44.00,43.00,43.25,4416400,10.08 -1989-11-03,44.00,44.50,43.25,43.25,6258800,10.08 -1989-11-02,45.00,45.00,43.00,44.00,16170800,10.25 -1989-11-01,46.25,46.75,45.75,46.13,2199200,10.75 -1989-10-31,45.75,46.50,45.50,46.50,3288800,10.83 -1989-10-30,45.50,46.00,45.00,45.75,3121200,10.66 -1989-10-27,45.25,45.75,44.50,45.25,4634400,10.54 -1989-10-26,45.50,46.50,45.00,45.25,6048000,10.54 -1989-10-25,47.75,47.75,46.25,46.50,4263600,10.83 -1989-10-24,46.25,48.50,45.25,47.63,7735600,11.10 -1989-10-23,48.00,48.25,46.25,46.75,4375600,10.89 -1989-10-20,47.75,49.25,47.50,48.00,9350800,11.18 -1989-10-19,48.25,49.50,48.25,48.75,4016800,11.36 -1989-10-18,46.50,48.25,46.00,48.25,5157600,11.24 -1989-10-17,46.00,48.75,45.00,47.25,8935600,11.01 -1989-10-16,44.75,46.75,42.50,46.75,15184400,10.89 -1989-10-13,48.75,49.50,45.00,45.75,7195600,10.66 -1989-10-12,49.00,49.25,48.50,48.75,2969200,11.36 -1989-10-11,48.75,49.25,48.00,48.88,5608800,11.39 -1989-10-10,49.75,50.38,48.50,49.50,10262400,11.53 -1989-10-09,48.00,49.75,47.50,49.50,6997600,11.53 -1989-10-06,46.25,48.25,46.00,48.13,12939200,11.21 -1989-10-05,44.50,46.50,44.25,45.50,8760000,10.60 -1989-10-04,43.75,44.63,43.50,44.25,5687600,10.31 -1989-10-03,44.25,44.50,43.13,43.63,6094400,10.17 -1989-10-02,44.50,44.75,43.75,44.38,4922400,10.34 -1989-09-29,45.25,45.50,44.50,44.50,2500800,10.37 -1989-09-28,45.00,45.75,45.00,45.50,2856800,10.60 -1989-09-27,44.25,45.13,44.00,44.75,3229200,10.43 -1989-09-26,45.00,45.50,44.75,45.25,2762400,10.54 -1989-09-25,44.75,45.75,44.75,45.25,4875600,10.54 -1989-09-22,44.75,45.25,44.25,44.88,2605600,10.46 -1989-09-21,45.00,46.00,44.25,44.75,7186800,10.43 -1989-09-20,44.00,45.00,43.75,44.63,4230800,10.40 -1989-09-19,44.25,44.50,43.00,43.25,2888800,10.08 -1989-09-18,44.50,45.00,44.00,44.00,2264400,10.25 -1989-09-15,45.00,45.25,44.25,45.00,4470800,10.49 -1989-09-14,45.00,45.25,44.50,44.75,4693600,10.43 -1989-09-13,46.25,46.63,45.00,45.00,4616400,10.49 -1989-09-12,45.50,46.75,45.00,46.00,3710800,10.72 -1989-09-11,44.75,46.00,44.50,45.75,3522000,10.66 -1989-09-08,44.75,45.25,44.50,45.00,2013200,10.49 -1989-09-07,44.75,45.50,44.75,44.75,4083200,10.43 -1989-09-06,44.75,44.88,44.00,44.75,3108800,10.43 -1989-09-05,44.50,45.38,44.50,44.75,4112400,10.43 -1989-09-01,44.50,44.75,44.25,44.63,2651200,10.40 -1989-08-31,44.50,45.00,44.25,44.50,2016400,10.37 -1989-08-30,44.00,44.75,44.00,44.50,4161200,10.37 -1989-08-29,44.75,45.00,43.75,44.13,6339200,10.28 -1989-08-28,44.50,45.00,44.00,44.75,2936800,10.43 -1989-08-25,44.00,45.00,44.00,44.75,5766400,10.43 -1989-08-24,43.75,44.50,43.50,44.13,5829200,10.28 -1989-08-23,43.00,44.25,42.50,43.75,6202400,10.19 -1989-08-22,42.00,43.00,42.00,42.88,4013200,9.99 -1989-08-21,42.25,43.25,42.00,42.25,4923600,9.84 -1989-08-18,41.75,42.50,41.50,42.25,3003600,9.82 -1989-08-17,40.25,41.25,40.00,41.00,5495600,9.53 -1989-08-16,41.50,41.75,40.00,40.38,4318800,9.39 -1989-08-15,40.75,41.50,40.75,41.38,5852000,9.62 -1989-08-14,41.50,42.00,40.50,40.75,3690800,9.47 -1989-08-11,44.00,44.00,41.25,41.88,8226800,9.74 -1989-08-10,44.00,44.00,42.75,43.25,5442400,10.05 -1989-08-09,44.00,45.75,43.88,44.00,6975600,10.23 -1989-08-08,43.50,44.75,43.50,44.13,7366400,10.26 -1989-08-07,43.00,44.00,42.63,43.75,6012000,10.17 -1989-08-04,41.25,42.75,41.13,42.75,6564400,9.94 -1989-08-03,40.50,41.50,40.50,41.25,6185600,9.59 -1989-08-02,39.75,40.50,39.50,40.50,3633600,9.41 -1989-08-01,39.75,40.25,39.25,39.88,4996800,9.27 -1989-07-31,39.25,40.00,39.00,39.75,4014800,9.24 -1989-07-28,39.25,39.75,39.00,39.38,4274400,9.15 -1989-07-27,38.25,39.50,38.00,39.25,6193200,9.12 -1989-07-26,38.25,38.50,37.75,38.25,8363600,8.89 -1989-07-25,39.25,39.75,38.00,38.75,7502400,9.01 -1989-07-24,39.75,39.75,39.25,39.25,4154800,9.12 -1989-07-21,39.75,40.00,39.00,40.00,4993600,9.30 -1989-07-20,40.75,41.25,39.75,40.00,8448800,9.30 -1989-07-19,39.50,40.75,39.00,40.50,8543200,9.41 -1989-07-18,40.75,40.75,38.75,39.25,17050800,9.12 -1989-07-17,40.75,41.25,39.75,40.75,4694400,9.47 -1989-07-14,40.75,41.00,39.75,40.75,9206800,9.47 -1989-07-13,40.00,41.00,39.50,40.63,8057600,9.44 -1989-07-12,39.75,40.25,39.50,40.00,4452000,9.30 -1989-07-11,40.75,41.00,39.75,39.75,8729200,9.24 -1989-07-10,41.00,41.25,40.00,40.50,7294400,9.41 -1989-07-07,41.25,42.00,40.50,41.25,3806400,9.59 -1989-07-06,40.75,41.75,40.25,41.25,6218000,9.59 -1989-07-05,40.50,40.75,40.00,40.50,4264400,9.41 -1989-07-03,41.75,41.75,40.75,40.75,1730800,9.47 -1989-06-30,40.50,41.75,39.50,41.25,5885600,9.59 -1989-06-29,41.00,41.25,40.00,40.63,8351200,9.44 -1989-06-28,42.25,42.25,41.00,41.75,9190800,9.70 -1989-06-27,43.75,44.25,42.50,42.63,3788000,9.91 -1989-06-26,44.00,44.00,43.25,43.50,6568800,10.11 -1989-06-23,43.25,44.25,43.25,43.88,4438800,10.20 -1989-06-22,42.50,43.75,42.00,43.25,4911200,10.05 -1989-06-21,43.00,43.50,42.25,42.50,4659200,9.88 -1989-06-20,44.00,44.00,42.25,43.00,4807600,10.00 -1989-06-19,44.50,44.75,43.50,44.00,6551200,10.23 -1989-06-16,44.75,45.50,43.50,44.50,19378000,10.34 -1989-06-15,49.50,49.75,47.50,47.50,5766800,11.04 -1989-06-14,49.00,50.25,48.25,49.63,8983600,11.54 -1989-06-13,47.50,48.75,47.00,48.50,8254400,11.27 -1989-06-12,46.75,47.75,46.25,47.50,2892400,11.04 -1989-06-09,47.25,47.75,46.50,47.00,3378800,10.93 -1989-06-08,48.50,49.00,47.25,47.63,6378800,11.07 -1989-06-07,46.75,48.50,46.75,48.25,6293200,11.22 -1989-06-06,46.75,47.00,46.25,46.75,5189200,10.87 -1989-06-05,48.75,49.00,46.50,47.00,4451200,10.93 -1989-06-02,48.50,49.50,48.50,49.00,4448800,11.39 -1989-06-01,47.75,49.25,47.50,48.75,6416800,11.33 -1989-05-31,47.50,48.13,47.00,47.75,4134400,11.10 -1989-05-30,48.25,49.00,47.38,47.50,4018000,11.04 -1989-05-26,48.25,49.00,48.00,48.50,4028800,11.27 -1989-05-25,47.25,49.00,47.25,48.25,8309200,11.22 -1989-05-24,45.25,47.75,45.25,47.75,10645200,11.10 -1989-05-23,46.00,46.00,45.25,45.50,4803600,10.58 -1989-05-22,45.75,46.25,45.25,46.00,6800000,10.69 -1989-05-19,44.75,46.25,44.75,45.75,11820800,10.61 -1989-05-18,45.25,45.50,44.75,44.75,7558800,10.38 -1989-05-17,45.25,45.50,45.00,45.25,8892400,10.50 -1989-05-16,46.00,46.25,45.00,45.38,8170800,10.53 -1989-05-15,44.75,46.25,44.75,46.00,11372400,10.67 -1989-05-12,44.50,45.00,44.00,45.00,16685600,10.44 -1989-05-11,43.25,44.25,43.00,43.88,10763600,10.18 -1989-05-10,43.00,43.50,42.50,43.25,8380000,10.03 -1989-05-09,42.00,43.00,42.00,42.50,12398800,9.86 -1989-05-08,41.50,42.25,41.50,42.25,7373600,9.80 -1989-05-05,42.50,42.75,41.50,41.50,16464400,9.63 -1989-05-04,40.25,41.25,40.00,41.00,6762000,9.51 -1989-05-03,39.75,40.75,39.75,40.25,7896800,9.34 -1989-05-02,39.00,40.25,39.00,39.88,7719200,9.25 -1989-05-01,38.50,39.25,38.50,39.00,2881200,9.05 -1989-04-28,39.25,39.50,38.50,39.00,3725600,9.05 -1989-04-27,39.50,40.00,39.00,39.38,4988000,9.13 -1989-04-26,40.00,40.25,39.13,39.75,6652000,9.22 -1989-04-25,40.00,40.50,39.75,40.00,4165600,9.28 -1989-04-24,40.00,40.25,39.50,40.13,3977600,9.31 -1989-04-21,40.50,40.88,39.75,40.13,4132000,9.31 -1989-04-20,40.75,41.50,40.25,40.75,6434400,9.45 -1989-04-19,40.00,41.63,39.75,40.88,15215600,9.48 -1989-04-18,39.50,40.50,39.25,40.13,20055200,9.31 -1989-04-17,38.50,39.25,38.00,39.25,5008000,9.10 -1989-04-14,39.00,39.25,38.25,38.75,4408800,8.99 -1989-04-13,38.75,39.50,38.25,38.50,6493200,8.93 -1989-04-12,38.25,39.25,37.88,38.50,13862000,8.93 -1989-04-11,37.50,38.00,37.00,37.75,5252400,8.76 -1989-04-10,37.25,38.00,36.75,37.00,4854400,8.58 -1989-04-07,36.00,37.50,36.00,37.38,12699200,8.67 -1989-04-06,34.75,36.13,34.50,36.00,5598800,8.35 -1989-04-05,34.50,35.25,34.25,35.00,4303200,8.12 -1989-04-04,34.50,34.88,33.88,34.50,4140800,8.00 -1989-04-03,35.50,36.25,34.75,35.00,5949200,8.12 -1989-03-31,35.00,35.75,34.75,35.63,6630800,8.26 -1989-03-30,34.25,35.00,34.00,34.75,3780800,8.06 -1989-03-29,34.00,34.50,34.00,34.25,2666800,7.94 -1989-03-28,34.00,34.50,34.00,34.00,5047600,7.89 -1989-03-27,34.25,34.50,33.50,33.75,5425600,7.83 -1989-03-23,34.00,34.50,33.75,34.38,4250800,7.97 -1989-03-22,34.25,34.75,33.75,33.88,5180800,7.86 -1989-03-21,35.50,35.50,34.75,34.88,4588800,8.09 -1989-03-20,35.00,35.25,34.50,34.88,6480800,8.09 -1989-03-17,34.50,35.75,34.00,34.88,8485200,8.09 -1989-03-16,35.00,35.50,34.50,35.25,6880000,8.18 -1989-03-15,35.25,35.50,34.75,35.00,3225600,8.12 -1989-03-14,35.00,35.50,34.88,35.25,5796800,8.18 -1989-03-13,35.00,35.50,34.75,35.00,4683600,8.12 -1989-03-10,34.50,35.00,34.25,35.00,3684400,8.12 -1989-03-09,35.25,35.75,34.50,34.50,4768800,8.00 -1989-03-08,35.63,36.25,35.25,35.25,7727600,8.18 -1989-03-07,35.50,36.00,35.00,35.75,9327600,8.29 -1989-03-06,35.00,35.88,34.50,35.50,6028800,8.23 -1989-03-03,35.25,35.25,34.00,34.75,13854400,8.06 -1989-03-02,35.75,36.25,34.75,35.00,13440800,8.12 -1989-03-01,36.25,36.50,35.50,36.00,6096400,8.35 -1989-02-28,36.50,36.75,36.00,36.25,6290000,8.41 -1989-02-27,36.00,36.50,35.75,36.50,4151200,8.47 -1989-02-24,37.00,37.00,36.00,36.00,5452000,8.35 -1989-02-23,36.50,37.00,36.25,36.75,3409200,8.52 -1989-02-22,37.25,37.50,36.50,36.75,8529200,8.52 -1989-02-21,36.88,37.75,36.75,37.50,6808800,8.70 -1989-02-17,36.25,37.00,36.25,36.75,4180800,8.52 -1989-02-16,36.25,37.25,36.00,36.38,9138800,8.41 -1989-02-15,35.75,36.25,35.50,36.25,11812400,8.38 -1989-02-14,36.88,37.00,35.25,35.75,31843200,8.27 -1989-02-13,36.75,37.25,36.75,37.00,8422000,8.56 -1989-02-10,38.25,38.25,37.00,37.25,12441200,8.62 -1989-02-09,38.25,39.00,38.00,38.25,5756400,8.85 -1989-02-08,39.00,39.50,38.00,38.25,5612000,8.85 -1989-02-07,38.25,39.25,38.25,39.00,5908800,9.02 -1989-02-06,39.50,39.50,38.25,38.50,4174400,8.91 -1989-02-03,40.00,40.25,39.00,39.25,6406400,9.08 -1989-02-02,39.50,40.25,39.25,39.75,16927600,9.19 -1989-02-01,37.75,39.63,37.38,39.25,17420000,9.08 -1989-01-31,37.25,37.75,36.75,37.75,16442000,8.73 -1989-01-30,37.63,38.00,37.25,37.38,20961200,8.65 -1989-01-27,38.25,39.25,36.25,37.63,75976400,8.70 -1989-01-26,40.75,42.13,40.63,41.75,10203600,9.66 -1989-01-25,41.75,42.00,41.00,41.50,3963200,9.60 -1989-01-24,41.00,41.75,40.75,41.63,7983200,9.63 -1989-01-23,40.75,41.25,40.75,41.00,6452000,9.48 -1989-01-20,40.50,41.50,40.25,41.00,6207600,9.48 -1989-01-19,40.50,41.00,40.00,40.50,9155200,9.37 -1989-01-18,40.75,41.13,39.50,39.75,17440800,9.19 -1989-01-17,43.25,43.50,40.00,40.38,27033600,9.34 -1989-01-16,43.25,44.00,43.00,43.75,6033200,10.12 -1989-01-13,42.75,43.50,42.38,43.25,6928000,10.00 -1989-01-12,42.25,43.00,42.00,42.75,5373200,9.89 -1989-01-11,42.25,42.50,41.25,42.13,5585200,9.74 -1989-01-10,42.50,42.88,41.50,42.63,3695600,9.86 -1989-01-09,43.00,43.13,42.25,43.00,2850800,9.95 -1989-01-06,42.25,43.50,42.25,42.63,7103600,9.86 -1989-01-05,42.00,43.25,41.25,42.25,10985200,9.77 -1989-01-04,40.75,42.13,40.50,42.00,8575200,9.71 -1989-01-03,40.25,40.50,40.00,40.38,3578800,9.34 -1988-12-30,40.50,41.25,40.25,40.25,2938800,9.31 -1988-12-29,40.25,40.75,40.25,40.50,4212000,9.37 -1988-12-28,40.50,40.75,39.75,40.25,1841200,9.31 -1988-12-27,41.00,41.50,40.50,40.50,2155200,9.37 -1988-12-23,41.00,41.38,41.00,41.13,1475600,9.51 -1988-12-22,41.75,42.00,40.75,41.00,3802000,9.48 -1988-12-21,41.00,42.00,41.00,41.75,8642400,9.66 -1988-12-20,41.00,41.50,40.63,41.00,9810800,9.48 -1988-12-19,40.25,41.00,40.00,40.75,8373600,9.43 -1988-12-16,39.50,40.50,39.25,40.13,6572000,9.28 -1988-12-15,40.00,40.50,39.25,39.50,4032000,9.14 -1988-12-14,38.50,40.00,38.50,39.75,6916800,9.19 -1988-12-13,38.50,38.75,38.25,38.75,4386400,8.96 -1988-12-12,39.25,39.50,38.50,38.50,4215600,8.91 -1988-12-09,39.25,39.50,38.75,39.13,1608800,9.05 -1988-12-08,39.25,39.25,38.75,39.13,2125600,9.05 -1988-12-07,39.00,39.50,38.75,39.38,3518800,9.11 -1988-12-06,39.25,39.75,39.00,39.50,3763200,9.14 -1988-12-05,39.50,40.00,38.75,39.50,5534400,9.14 -1988-12-02,38.25,39.88,38.00,39.25,11940000,9.08 -1988-12-01,37.75,39.00,37.50,38.75,7586800,8.96 -1988-11-30,36.75,38.00,36.75,37.63,6013600,8.70 -1988-11-29,36.50,36.75,36.00,36.75,3326400,8.50 -1988-11-28,36.50,36.75,36.00,36.50,4986800,8.44 -1988-11-25,36.25,36.75,36.00,36.50,1727600,8.44 -1988-11-23,35.75,37.00,35.50,36.88,6733200,8.53 -1988-11-22,36.50,36.88,36.00,36.13,5299200,8.36 -1988-11-21,37.50,37.75,36.25,36.63,7928000,8.47 -1988-11-18,38.50,38.50,38.00,38.00,2066400,8.77 -1988-11-17,38.00,38.50,38.00,38.25,2841200,8.82 -1988-11-16,39.00,39.25,37.75,38.00,5280000,8.77 -1988-11-15,39.00,39.25,38.75,39.00,2866800,9.00 -1988-11-14,38.75,39.00,38.25,38.88,3046400,8.97 -1988-11-11,39.00,39.63,38.50,38.50,3882400,8.88 -1988-11-10,39.50,39.75,39.00,39.50,3573200,9.11 -1988-11-09,38.25,39.38,38.00,39.25,7206800,9.05 -1988-11-08,37.50,38.75,37.38,38.50,5540800,8.88 -1988-11-07,37.25,37.75,37.00,37.50,6093600,8.65 -1988-11-04,36.75,38.00,36.75,37.75,5500000,8.71 -1988-11-03,37.25,37.50,36.75,37.13,8670000,8.57 -1988-11-02,38.25,38.25,36.75,37.25,7451200,8.59 -1988-11-01,38.50,38.75,37.75,38.00,5138800,8.77 -1988-10-31,38.75,38.75,37.50,38.63,8695200,8.91 -1988-10-28,39.00,39.50,38.50,38.50,3026800,8.88 -1988-10-27,38.75,39.25,38.25,39.00,5138000,9.00 -1988-10-26,40.00,40.00,38.50,39.25,6751200,9.05 -1988-10-25,40.25,40.25,39.75,39.88,3043600,9.20 -1988-10-24,41.25,41.25,39.63,40.00,4842400,9.23 -1988-10-21,41.25,41.75,40.75,41.00,4422400,9.46 -1988-10-20,40.00,41.63,40.00,41.50,6215200,9.57 -1988-10-19,39.75,40.75,39.50,40.00,9918000,9.23 -1988-10-18,39.00,39.50,38.25,39.38,5100000,9.08 -1988-10-17,38.50,39.00,38.25,38.50,3360800,8.88 -1988-10-14,39.50,39.50,38.13,38.75,5625200,8.94 -1988-10-13,38.50,39.75,38.50,39.00,5892400,9.00 -1988-10-12,38.50,39.00,38.00,38.75,4763600,8.94 -1988-10-11,38.25,39.50,38.25,39.00,6964400,9.00 -1988-10-10,39.50,39.75,37.50,38.50,11880000,8.88 -1988-10-07,39.00,39.75,38.38,39.75,16355200,9.17 -1988-10-06,40.50,40.88,39.25,39.75,6009200,9.17 -1988-10-05,41.25,41.75,40.50,40.88,4400000,9.43 -1988-10-04,42.25,42.75,41.13,41.50,1847600,9.57 -1988-10-03,43.00,43.25,42.00,42.50,3243200,9.80 -1988-09-30,44.00,44.00,43.25,43.25,3338800,9.98 -1988-09-29,43.75,44.25,43.50,44.00,3804400,10.15 -1988-09-28,43.50,44.13,43.25,43.50,3038800,10.04 -1988-09-27,42.50,43.50,42.50,43.38,5832400,10.01 -1988-09-26,43.75,44.00,42.50,42.75,3124400,9.86 -1988-09-23,43.50,44.25,43.50,43.75,3638000,10.09 -1988-09-22,43.00,44.00,42.75,44.00,5203600,10.15 -1988-09-21,41.75,43.00,41.50,42.75,3274800,9.86 -1988-09-20,41.75,42.25,41.38,41.50,3682400,9.57 -1988-09-19,42.00,42.25,41.25,41.75,3296400,9.63 -1988-09-16,41.50,42.75,41.38,42.25,4431200,9.75 -1988-09-15,42.00,42.75,41.50,41.63,5920000,9.60 -1988-09-14,41.75,42.38,41.50,42.00,8520800,9.69 -1988-09-13,40.25,41.25,40.00,41.00,4293600,9.46 -1988-09-12,41.00,41.75,40.13,41.00,5290800,9.46 -1988-09-09,38.75,41.00,37.75,40.50,8393200,9.34 -1988-09-08,38.25,39.50,37.75,38.75,7403200,8.94 -1988-09-07,39.00,39.50,37.75,38.25,6417600,8.82 -1988-09-06,40.00,40.00,38.75,38.88,5125200,8.97 -1988-09-02,39.50,40.00,39.00,39.75,6661200,9.17 -1988-09-01,39.75,39.75,38.50,38.88,8818800,8.97 -1988-08-31,41.00,41.13,39.50,39.88,8493600,9.20 -1988-08-30,40.75,41.00,40.00,40.88,1809200,9.43 -1988-08-29,40.75,41.00,40.50,40.88,2046400,9.43 -1988-08-26,40.00,40.75,40.00,40.25,1453200,9.29 -1988-08-25,40.25,40.50,39.25,40.13,4560000,9.26 -1988-08-24,39.75,40.75,39.50,40.75,4482000,9.40 -1988-08-23,39.75,40.25,39.25,39.50,5843200,9.11 -1988-08-22,40.25,40.75,39.50,39.75,6100000,9.17 -1988-08-19,42.50,42.75,40.50,40.75,8120000,9.40 -1988-08-18,42.00,43.00,41.75,42.50,2648000,9.80 -1988-08-17,42.50,42.75,41.75,42.00,4252400,9.69 -1988-08-16,41.00,43.25,40.75,42.50,4397600,9.80 -1988-08-15,42.25,42.25,40.50,41.25,5971200,9.52 -1988-08-12,43.00,43.00,42.25,42.50,2771200,9.79 -1988-08-11,42.25,43.25,42.00,43.25,3803200,9.96 -1988-08-10,43.75,43.75,41.75,41.88,5300800,9.64 -1988-08-09,44.00,44.25,43.00,43.50,6090800,10.02 -1988-08-08,44.50,44.75,44.00,44.00,1085600,10.13 -1988-08-05,44.50,45.00,44.25,44.25,1881200,10.19 -1988-08-04,44.75,45.25,44.50,44.63,2473200,10.28 -1988-08-03,44.75,44.75,44.00,44.75,3980800,10.30 -1988-08-02,45.00,45.50,44.50,44.63,4338000,10.28 -1988-08-01,44.50,45.75,44.25,45.00,3085600,10.36 -1988-07-29,43.25,44.50,43.00,44.38,5697600,10.22 -1988-07-28,42.50,43.00,42.25,42.63,3326800,9.82 -1988-07-27,42.75,43.25,42.50,42.75,4162400,9.84 -1988-07-26,42.75,43.25,42.25,42.75,3640800,9.84 -1988-07-25,42.75,43.25,42.25,42.75,3794400,9.84 -1988-07-22,43.00,43.25,42.50,42.50,3724800,9.79 -1988-07-21,43.75,44.00,42.75,43.00,5323600,9.90 -1988-07-20,44.75,45.00,44.00,44.25,4293600,10.19 -1988-07-19,45.00,45.50,43.88,44.75,4372400,10.30 -1988-07-18,45.38,46.00,45.25,45.50,4061200,10.48 -1988-07-15,45.00,45.50,44.75,45.00,2968000,10.36 -1988-07-14,44.75,45.25,44.50,45.00,2245200,10.36 -1988-07-13,44.75,45.00,44.25,44.75,4132000,10.30 -1988-07-12,45.00,45.25,44.50,44.75,3605600,10.30 -1988-07-11,45.50,45.50,44.88,45.13,2646400,10.39 -1988-07-08,45.50,46.00,45.00,45.25,3766400,10.42 -1988-07-07,46.50,46.50,45.25,45.88,3778000,10.56 -1988-07-06,47.13,47.50,46.13,46.50,5608800,10.71 -1988-07-05,46.50,47.25,46.13,47.25,3736400,10.88 -1988-07-01,46.50,46.88,46.25,46.50,3385600,10.71 -1988-06-30,46.25,46.75,46.00,46.25,4104800,10.65 -1988-06-29,46.00,46.75,45.75,46.38,5125200,10.68 -1988-06-28,44.75,46.25,44.50,46.25,5809200,10.65 -1988-06-27,44.50,45.38,44.50,44.50,3001200,10.25 -1988-06-24,45.00,45.50,44.50,45.00,2684400,10.36 -1988-06-23,45.75,45.75,45.00,45.00,2566400,10.36 -1988-06-22,45.50,45.88,45.00,45.63,6998000,10.51 -1988-06-21,44.00,45.00,43.88,44.88,4422000,10.33 -1988-06-20,44.38,44.75,44.00,44.13,2811200,10.16 -1988-06-17,44.75,44.75,44.25,44.75,3410800,10.30 -1988-06-16,45.00,45.25,44.25,44.50,3854400,10.25 -1988-06-15,45.25,45.75,45.00,45.75,4360000,10.53 -1988-06-14,45.25,46.00,45.00,45.25,10445600,10.42 -1988-06-13,45.00,45.25,44.25,45.00,5320000,10.36 -1988-06-10,43.50,44.75,43.00,44.50,6320000,10.25 -1988-06-09,45.00,45.25,43.25,43.50,9640000,10.02 -1988-06-08,44.25,45.50,44.00,45.00,9240000,10.36 -1988-06-07,43.75,45.25,43.50,44.00,11120000,10.13 -1988-06-06,42.75,44.00,42.75,44.00,5880000,10.13 -1988-06-03,41.75,43.25,41.75,43.00,6280000,9.90 -1988-06-02,42.00,42.50,41.50,41.75,4760000,9.61 -1988-06-01,41.50,42.50,41.25,42.50,8200000,9.79 -1988-05-31,40.00,41.50,39.75,41.50,4400000,9.56 -1988-05-27,39.25,40.00,39.00,39.75,3020000,9.15 -1988-05-26,38.50,39.50,38.50,39.38,3076800,9.07 -1988-05-25,39.00,39.75,38.50,38.50,4840000,8.87 -1988-05-24,38.00,39.00,37.75,38.88,5080000,8.95 -1988-05-23,38.50,38.88,37.38,38.00,6560000,8.75 -1988-05-20,39.25,39.50,38.75,38.75,2941200,8.92 -1988-05-19,39.50,39.75,38.50,39.00,8920000,8.98 -1988-05-18,40.50,40.75,39.50,39.75,6240000,9.15 -1988-05-17,41.50,42.00,40.25,40.50,6920000,9.33 -1988-05-16,40.50,41.38,40.00,41.25,2686800,9.50 -1988-05-13,40.25,40.50,40.00,40.50,2566800,9.31 -1988-05-12,39.50,40.25,39.50,39.75,2965600,9.13 -1988-05-11,40.25,40.75,39.50,39.50,6240000,9.08 -1988-05-10,40.50,41.00,40.25,40.88,3439200,9.39 -1988-05-09,41.25,41.25,40.50,40.75,2732000,9.36 -1988-05-06,41.63,41.75,41.25,41.25,3835600,9.48 -1988-05-05,42.00,42.25,41.50,41.75,2536800,9.59 -1988-05-04,41.88,43.13,41.75,42.00,8000000,9.65 -1988-05-03,41.00,42.25,40.75,41.75,4440000,9.59 -1988-05-02,40.75,41.25,40.50,41.00,2944400,9.42 -1988-04-29,41.25,41.50,40.50,41.00,3222000,9.42 -1988-04-28,41.75,42.00,41.25,41.38,3553600,9.51 -1988-04-27,41.75,42.00,41.50,41.75,4520000,9.59 -1988-04-26,41.00,41.75,40.75,41.50,6280000,9.54 -1988-04-25,40.25,41.00,40.00,40.88,5360000,9.39 -1988-04-22,39.75,40.25,39.50,40.13,3846800,9.22 -1988-04-21,40.38,40.50,39.00,39.50,6360000,9.08 -1988-04-20,40.25,40.50,39.25,39.75,7680000,9.13 -1988-04-19,40.13,41.50,40.13,40.25,7596400,9.25 -1988-04-18,39.75,40.75,39.25,40.00,6080000,9.19 -1988-04-15,39.75,40.00,38.50,39.50,8320000,9.08 -1988-04-14,40.50,41.50,39.00,39.50,6720000,9.08 -1988-04-13,41.75,42.00,41.00,41.25,5120000,9.48 -1988-04-12,41.75,42.25,41.25,41.75,6200000,9.59 -1988-04-11,41.75,42.00,41.00,41.50,5320000,9.54 -1988-04-08,40.75,41.75,39.75,41.00,7240000,9.42 -1988-04-07,41.75,42.38,40.75,40.75,5840000,9.36 -1988-04-06,39.50,41.75,39.00,41.75,6800000,9.59 -1988-04-05,39.25,39.50,38.50,39.25,5280000,9.02 -1988-04-04,39.75,40.50,38.50,38.75,6480000,8.91 -1988-03-31,39.75,40.50,39.25,40.00,7760000,9.19 -1988-03-30,40.75,41.25,38.75,39.50,13280000,9.08 -1988-03-29,41.50,42.00,40.63,41.00,7640000,9.42 -1988-03-28,40.00,41.75,39.50,41.50,6160000,9.54 -1988-03-25,40.75,41.25,40.00,40.13,4680000,9.22 -1988-03-24,41.75,42.50,40.00,40.88,11440000,9.39 -1988-03-23,44.00,44.00,41.88,42.50,7480000,9.77 -1988-03-22,44.00,44.50,43.25,44.00,4265600,10.11 -1988-03-21,44.38,44.63,43.00,43.88,8120000,10.08 -1988-03-18,45.00,45.50,44.25,44.75,9720000,10.28 -1988-03-17,46.25,46.50,44.75,45.00,9320000,10.34 -1988-03-16,44.88,46.38,44.50,46.13,4240000,10.60 -1988-03-15,46.00,46.25,44.75,45.00,6480000,10.34 -1988-03-14,45.75,46.50,45.50,46.25,3518000,10.63 -1988-03-11,45.50,45.75,44.50,45.75,5640000,10.51 -1988-03-10,47.00,47.25,45.25,45.25,6320000,10.40 -1988-03-09,46.25,47.25,46.25,46.75,4800000,10.74 -1988-03-08,46.75,47.00,46.00,46.25,5160000,10.63 -1988-03-07,46.75,47.75,46.50,46.88,7400000,10.77 -1988-03-04,46.00,47.00,45.50,46.88,7480000,10.77 -1988-03-03,44.50,47.00,44.50,46.50,16920000,10.69 -1988-03-02,43.75,45.00,43.50,44.75,10440000,10.28 -1988-03-01,43.25,43.50,42.50,43.25,6120000,9.94 -1988-02-29,41.75,43.25,41.50,43.00,4000000,9.88 -1988-02-26,42.00,42.25,41.25,41.75,2952400,9.59 -1988-02-25,42.00,43.00,41.75,41.75,6400000,9.59 -1988-02-24,42.75,43.00,42.00,42.25,5200000,9.71 -1988-02-23,43.25,43.75,42.25,42.75,7880000,9.82 -1988-02-22,41.50,43.63,41.50,43.25,7160000,9.94 -1988-02-19,41.75,42.00,41.50,41.75,3242400,9.59 -1988-02-18,41.63,42.75,41.50,41.75,5120000,9.59 -1988-02-17,41.25,42.50,41.25,41.88,9160000,9.62 -1988-02-16,41.00,41.25,40.00,41.25,5520000,9.48 -1988-02-12,40.63,41.50,40.50,41.00,4920000,9.42 -1988-02-11,41.00,41.25,40.25,40.63,5280000,9.32 -1988-02-10,39.75,41.50,39.75,41.00,8160000,9.40 -1988-02-09,39.00,39.88,38.75,39.75,4160000,9.12 -1988-02-08,38.50,39.25,37.75,38.75,7280000,8.89 -1988-02-05,40.00,40.38,38.50,38.63,4720000,8.86 -1988-02-04,39.50,40.13,39.00,39.75,7120000,9.12 -1988-02-03,41.00,41.25,39.25,39.50,8080000,9.06 -1988-02-02,41.50,41.88,40.50,41.25,6840000,9.46 -1988-02-01,41.75,42.50,41.38,41.75,7120000,9.58 -1988-01-29,41.50,41.75,40.25,41.50,9480000,9.52 -1988-01-28,40.00,41.50,39.75,41.25,8320000,9.46 -1988-01-27,40.25,40.50,38.75,39.75,9240000,9.12 -1988-01-26,40.75,41.00,39.25,39.75,5120000,9.12 -1988-01-25,39.50,41.50,39.50,40.88,7160000,9.38 -1988-01-22,40.50,40.75,38.25,39.25,15920000,9.00 -1988-01-21,40.50,40.75,39.38,40.13,17640000,9.20 -1988-01-20,43.00,43.00,38.25,39.75,24320000,9.12 -1988-01-19,42.25,43.25,41.38,42.75,9800000,9.80 -1988-01-18,43.00,43.00,42.00,42.75,4480000,9.80 -1988-01-15,43.50,45.00,42.50,42.88,12280000,9.83 -1988-01-14,42.75,42.88,42.00,42.25,4720000,9.69 -1988-01-13,42.00,43.25,41.13,42.25,7560000,9.69 -1988-01-12,43.00,43.50,39.75,42.00,14320000,9.63 -1988-01-11,40.00,42.75,39.75,42.50,14440000,9.75 -1988-01-08,44.50,45.25,39.50,40.00,17360000,9.17 -1988-01-07,43.50,44.75,42.50,44.50,7600000,10.21 -1988-01-06,45.00,45.00,43.75,43.75,9600000,10.03 -1988-01-05,46.00,46.25,44.25,44.63,11040000,10.24 -1988-01-04,42.75,44.75,42.25,44.75,11800000,10.26 -1987-12-31,42.50,43.00,41.88,42.00,4200000,9.63 -1987-12-30,42.50,43.75,42.50,43.38,5560000,9.95 -1987-12-29,40.50,42.25,40.25,42.13,4240000,9.66 -1987-12-28,42.25,42.50,39.50,40.25,8200000,9.23 -1987-12-24,42.00,43.00,41.75,42.63,2508000,9.78 -1987-12-23,41.75,42.75,41.25,42.25,6120000,9.69 -1987-12-22,41.75,41.75,40.50,41.50,4600000,9.52 -1987-12-21,40.50,41.75,40.25,41.75,6720000,9.58 -1987-12-18,39.50,41.25,39.25,40.50,10800000,9.29 -1987-12-17,40.50,40.75,39.25,39.25,11640000,9.00 -1987-12-16,37.75,39.75,37.25,39.25,11800000,9.00 -1987-12-15,37.75,38.25,37.00,37.50,10680000,8.60 -1987-12-14,34.50,37.50,34.25,37.25,12200000,8.54 -1987-12-11,34.75,34.75,33.50,34.00,4360000,7.80 -1987-12-10,33.75,36.00,33.25,34.75,9880000,7.97 -1987-12-09,34.50,36.25,33.88,35.00,6400000,8.03 -1987-12-08,33.50,34.88,33.25,34.50,9080000,7.91 -1987-12-07,31.00,33.25,31.00,33.00,7280000,7.57 -1987-12-04,30.25,31.25,29.75,30.75,8720000,7.05 -1987-12-03,33.00,33.38,29.75,30.50,11400000,7.00 -1987-12-02,33.25,33.50,32.50,32.50,5080000,7.45 -1987-12-01,33.50,34.00,32.75,33.25,6480000,7.63 -1987-11-30,33.75,34.50,30.50,33.00,14880000,7.57 -1987-11-27,36.25,36.50,34.75,35.00,2526800,8.03 -1987-11-25,37.00,37.00,36.00,36.50,3311200,8.37 -1987-11-24,36.75,37.75,36.13,37.00,7040000,8.49 -1987-11-23,35.50,36.25,34.75,36.25,3500000,8.31 -1987-11-20,34.00,36.00,33.25,35.50,8960000,8.14 -1987-11-19,36.50,36.50,34.00,34.50,6520000,7.91 -1987-11-18,35.75,36.50,34.50,36.25,9480000,8.31 -1987-11-17,36.75,37.00,35.00,35.00,9600000,8.03 -1987-11-16,37.75,38.50,36.50,36.75,6600000,8.41 -1987-11-13,39.25,39.50,37.00,37.25,5520000,8.52 -1987-11-12,38.50,40.00,38.38,38.75,8800000,8.87 -1987-11-11,37.25,38.25,36.75,37.25,6640000,8.52 -1987-11-10,36.50,37.50,36.00,36.25,8280000,8.30 -1987-11-09,37.00,37.50,36.25,37.25,7520000,8.52 -1987-11-06,38.25,39.50,37.00,37.75,6680000,8.64 -1987-11-05,36.25,38.75,36.25,38.00,9120000,8.70 -1987-11-04,35.50,37.25,34.75,36.00,8360000,8.24 -1987-11-03,38.00,38.50,34.25,36.25,11200000,8.30 -1987-11-02,38.75,39.50,37.50,38.75,6720000,8.87 -1987-10-30,40.00,43.00,38.50,38.63,15040000,8.84 -1987-10-29,34.25,40.00,32.25,39.50,11840000,9.04 -1987-10-28,30.75,33.75,29.25,33.50,14960000,7.67 -1987-10-27,29.50,32.25,29.00,30.25,16280000,6.92 -1987-10-26,34.50,35.00,27.62,28.00,11200000,6.41 -1987-10-23,35.75,36.50,34.25,35.50,7080000,8.12 -1987-10-22,39.25,40.50,36.00,36.75,13760000,8.41 -1987-10-21,38.50,42.00,38.00,40.50,19080000,9.27 -1987-10-20,38.50,42.00,32.63,34.50,20320000,7.90 -1987-10-19,48.25,48.25,35.50,36.50,17000000,8.35 -1987-10-16,52.25,53.00,47.50,48.25,15000000,11.04 -1987-10-15,53.25,54.50,51.75,52.00,12440000,11.90 -1987-10-14,53.75,54.00,52.00,53.25,9240000,12.19 -1987-10-13,54.50,54.75,53.25,54.50,5800000,12.47 -1987-10-12,54.25,54.38,51.75,53.25,7120000,12.19 -1987-10-09,54.25,55.50,54.00,54.13,5200000,12.39 -1987-10-08,55.50,56.00,53.25,54.25,5880000,12.42 -1987-10-07,55.50,55.75,54.25,55.50,8000000,12.70 -1987-10-06,59.50,59.50,55.50,55.75,7200000,12.76 -1987-10-05,58.50,59.75,57.75,59.25,4800000,13.56 -1987-10-02,58.25,58.75,57.50,58.50,3450000,13.39 -1987-10-01,56.75,58.75,56.50,58.25,4160000,13.33 -1987-09-30,54.25,57.00,54.25,56.50,4360000,12.93 -1987-09-29,56.00,56.00,54.25,54.50,6120000,12.47 -1987-09-28,57.50,58.75,55.50,55.75,7280000,12.76 -1987-09-25,56.75,58.00,56.50,57.50,3806800,13.16 -1987-09-24,55.25,57.88,55.25,56.50,6520000,12.93 -1987-09-23,54.13,56.00,53.75,55.25,9098800,12.64 -1987-09-22,50.50,54.25,50.25,54.13,5480000,12.39 -1987-09-21,51.75,52.75,50.25,50.25,4600000,11.50 -1987-09-18,52.00,52.25,51.38,51.75,2555600,11.84 -1987-09-17,52.00,52.25,51.00,52.00,2400000,11.90 -1987-09-16,51.75,52.63,51.25,51.75,6000000,11.84 -1987-09-15,53.00,53.00,51.50,51.75,3744800,11.84 -1987-09-14,54.75,55.25,52.75,53.00,2928000,12.13 -1987-09-11,54.00,55.50,52.75,54.50,4440000,12.47 -1987-09-10,53.25,54.50,53.13,53.75,5000000,12.30 -1987-09-09,50.25,53.00,49.50,52.75,5640000,12.07 -1987-09-08,50.25,50.50,48.50,49.88,6280000,11.42 -1987-09-04,51.25,51.75,50.00,50.50,3891200,11.56 -1987-09-03,52.50,52.75,50.25,51.25,6600000,11.73 -1987-09-02,52.00,53.25,50.75,52.00,8200000,11.90 -1987-09-01,54.75,55.25,52.50,52.50,4960000,12.01 -1987-08-31,52.25,54.25,51.75,54.00,5360000,12.36 -1987-08-28,52.00,52.50,51.50,52.00,3434400,11.90 -1987-08-27,52.25,52.75,51.50,52.00,4440000,11.90 -1987-08-26,53.00,53.50,52.00,52.00,7000000,11.90 -1987-08-25,52.75,53.25,52.00,52.00,4880000,11.90 -1987-08-24,53.00,53.50,52.25,52.25,4320000,11.96 -1987-08-21,51.75,53.75,51.50,53.00,5000000,12.13 -1987-08-20,50.25,52.50,49.75,51.75,6280000,11.84 -1987-08-19,49.50,50.00,49.00,50.00,2404400,11.44 -1987-08-18,49.25,49.50,48.25,48.75,8480000,11.16 -1987-08-17,49.50,50.00,48.75,49.50,5200000,11.33 -1987-08-14,48.50,50.00,48.00,49.00,3758800,11.21 -1987-08-13,48.75,50.25,48.50,49.00,7000000,11.21 -1987-08-12,49.50,49.75,48.25,48.75,5760000,11.16 -1987-08-11,49.50,50.25,48.75,49.50,9680000,11.33 -1987-08-10,48.25,48.25,45.75,48.25,2800000,11.04 -1987-08-07,46.25,47.25,46.00,46.50,5440000,10.63 -1987-08-06,43.25,46.75,42.75,46.25,9000000,10.57 -1987-08-05,42.25,43.50,42.00,43.25,4640000,9.89 -1987-08-04,40.50,42.25,40.00,42.25,4320000,9.66 -1987-08-03,41.00,41.50,40.25,40.25,2275600,9.20 -1987-07-31,41.25,42.00,41.25,41.25,2613600,9.43 -1987-07-30,41.00,41.50,40.75,41.50,3727600,9.49 -1987-07-29,42.00,42.00,40.50,41.00,3534800,9.37 -1987-07-28,42.50,42.75,41.75,41.88,2660800,9.57 -1987-07-27,42.50,43.00,42.00,42.25,2035600,9.66 -1987-07-24,41.50,42.75,41.50,42.50,4200000,9.71 -1987-07-23,43.00,43.50,40.50,41.75,2685600,9.54 -1987-07-22,41.50,42.75,41.25,42.50,2185200,9.71 -1987-07-21,42.00,42.50,41.25,41.38,3966400,9.46 -1987-07-20,43.00,43.25,41.50,41.75,4440000,9.54 -1987-07-17,44.25,44.75,42.75,43.25,3300000,9.89 -1987-07-16,44.00,44.00,43.25,44.00,3388000,10.06 -1987-07-15,43.00,44.75,42.25,44.00,9680000,10.06 -1987-07-14,41.00,43.00,41.00,43.00,9200000,9.83 -1987-07-13,39.00,40.75,38.75,40.50,9120000,9.26 -1987-07-10,38.00,39.25,37.75,38.00,5600000,8.69 -1987-07-09,37.25,38.75,37.25,37.75,8560000,8.63 -1987-07-08,39.25,39.25,36.50,37.25,12200000,8.51 -1987-07-07,40.50,41.00,38.75,39.25,7280000,8.97 -1987-07-06,40.75,41.75,40.50,40.75,3060800,9.31 -1987-07-02,40.00,41.00,39.75,40.63,2931200,9.29 -1987-07-01,40.75,40.75,39.75,40.00,3402000,9.14 -1987-06-30,40.50,41.00,39.75,40.50,5160000,9.26 -1987-06-29,40.50,40.75,40.00,40.75,3628000,9.31 -1987-06-26,40.75,41.50,40.00,40.50,4560000,9.26 -1987-06-25,42.00,42.50,40.50,40.50,4320000,9.26 -1987-06-24,41.50,43.25,40.50,42.00,4240000,9.60 -1987-06-23,42.00,42.13,40.75,41.25,2892000,9.43 -1987-06-22,41.25,42.25,40.88,42.00,6040000,9.60 -1987-06-19,41.50,41.75,40.38,41.00,4480000,9.37 -1987-06-18,40.25,41.75,39.50,41.50,8200000,9.49 -1987-06-17,41.50,42.50,40.00,40.50,10640000,9.26 -1987-06-16,41.50,41.75,38.00,41.50,12240000,9.49 -1987-06-15,79.00,79.50,77.50,78.50,9280000,8.97 -1987-06-12,79.00,79.75,78.75,79.00,3653600,9.03 -1987-06-11,78.50,80.00,78.00,79.00,4521600,9.03 -1987-06-10,78.75,80.25,78.00,78.50,5235200,8.97 -1987-06-09,77.50,79.50,77.50,78.50,4570400,8.97 -1987-06-08,77.75,78.00,76.75,77.75,7213600,8.89 -1987-06-05,78.75,78.75,77.75,77.75,4696000,8.89 -1987-06-04,78.00,78.75,77.00,78.50,5511200,8.97 -1987-06-03,77.25,79.50,77.25,77.75,6140000,8.89 -1987-06-02,77.50,78.00,77.00,77.25,4927200,8.83 -1987-06-01,79.50,79.50,77.50,77.75,2984000,8.89 -1987-05-29,80.25,80.50,79.00,79.00,3322400,9.03 -1987-05-28,79.50,80.25,78.50,80.00,5424000,9.14 -1987-05-27,78.00,80.25,77.50,79.50,6484000,9.09 -1987-05-26,74.50,78.00,74.00,78.00,5481600,8.91 -1987-05-22,75.00,75.50,73.75,74.12,3484000,8.47 -1987-05-21,74.75,75.75,74.50,74.50,6233600,8.51 -1987-05-20,73.00,75.00,72.50,74.50,10320000,8.51 -1987-05-19,75.75,75.75,72.62,73.25,8560000,8.37 -1987-05-18,78.25,78.50,75.50,75.75,8640000,8.66 -1987-05-15,79.25,79.25,78.00,78.25,5220000,8.94 -1987-05-14,78.25,79.50,78.25,79.25,5316000,9.06 -1987-05-13,75.75,78.62,75.50,78.50,11120000,8.97 -1987-05-12,76.00,76.50,75.00,75.50,9280000,8.63 -1987-05-11,77.00,79.50,76.75,77.00,7048800,8.80 -1987-05-08,80.50,81.00,79.00,79.00,6618400,9.01 -1987-05-07,79.75,81.00,79.75,80.25,6488800,9.16 -1987-05-06,80.50,82.25,79.25,80.00,10240000,9.13 -1987-05-05,80.00,80.75,78.00,80.25,8240000,9.16 -1987-05-04,79.50,80.25,79.00,79.75,5095200,9.10 -1987-05-01,79.50,80.00,78.75,80.00,4751200,9.13 -1987-04-30,78.00,80.00,77.75,79.25,9040000,9.04 -1987-04-29,77.25,79.75,77.00,77.75,10400000,8.87 -1987-04-28,75.75,77.87,75.50,77.00,11600000,8.79 -1987-04-27,74.25,75.25,73.25,75.00,13680000,8.56 -1987-04-24,75.75,76.50,74.50,74.75,9120000,8.53 -1987-04-23,74.25,77.25,74.25,76.00,10880000,8.67 -1987-04-22,76.62,77.00,74.00,74.25,14400000,8.47 -1987-04-21,70.25,75.00,69.50,74.75,15440000,8.53 -1987-04-20,71.50,72.75,70.75,71.12,5353600,8.12 -1987-04-16,71.25,73.25,71.00,71.50,12400000,8.16 -1987-04-15,69.50,71.00,68.75,71.00,12480000,8.10 -1987-04-14,66.75,69.75,66.50,68.00,14560000,7.76 -1987-04-13,70.00,70.25,67.50,67.50,5101600,7.70 -1987-04-10,71.25,71.50,69.75,70.25,7791200,8.02 -1987-04-09,68.75,71.50,67.75,71.00,8480000,8.10 -1987-04-08,67.75,70.25,67.50,69.00,8240000,7.87 -1987-04-07,69.75,70.25,67.75,67.75,9280000,7.73 -1987-04-06,71.50,72.75,69.25,70.00,10320000,7.99 -1987-04-03,71.50,71.87,70.25,71.75,19280000,8.19 -1987-04-02,68.25,71.75,67.00,71.75,27760000,8.19 -1987-04-01,63.00,67.00,62.38,66.75,7792800,7.62 -1987-03-31,62.25,64.75,62.25,64.50,9760000,7.36 -1987-03-30,63.50,64.25,62.25,62.50,9280000,7.13 -1987-03-27,67.25,67.50,64.75,65.00,4817600,7.42 -1987-03-26,66.75,67.75,66.50,67.25,5146400,7.67 -1987-03-25,66.50,67.00,65.25,66.75,9760000,7.62 -1987-03-24,67.75,68.50,66.25,66.25,9600000,7.56 -1987-03-23,68.00,68.25,66.25,67.50,8800000,7.70 -1987-03-20,68.25,69.75,68.25,68.25,12400000,7.79 -1987-03-19,65.75,68.50,65.50,68.37,7396000,7.80 -1987-03-18,67.25,67.50,64.75,66.00,10800000,7.53 -1987-03-17,65.50,68.00,65.00,67.00,8720000,7.65 -1987-03-16,63.50,65.25,62.50,65.25,8800000,7.45 -1987-03-13,65.25,66.00,63.50,63.50,7067200,7.25 -1987-03-12,66.00,66.25,63.63,65.25,10800000,7.45 -1987-03-11,67.25,68.00,66.25,66.25,7826400,7.56 -1987-03-10,64.50,66.87,64.50,66.75,8720000,7.62 -1987-03-09,66.50,66.75,64.50,64.62,9120000,7.37 -1987-03-06,67.25,68.37,66.75,67.25,6332800,7.67 -1987-03-05,67.50,69.00,67.25,68.50,12080000,7.82 -1987-03-04,65.75,68.25,65.37,67.62,16000000,7.72 -1987-03-03,67.50,68.12,64.75,65.00,15600000,7.42 -1987-03-02,70.25,70.50,67.00,67.50,14160000,7.70 -1987-02-27,69.12,71.00,67.75,70.00,14480000,7.99 -1987-02-26,69.50,71.37,68.00,69.12,17840000,7.89 -1987-02-25,65.50,69.50,64.62,69.12,16240000,7.89 -1987-02-24,63.25,66.00,63.13,65.50,12720000,7.47 -1987-02-23,60.88,64.25,59.63,63.13,12560000,7.20 -1987-02-20,62.38,62.50,60.63,61.25,6813600,6.99 -1987-02-19,63.50,63.50,61.75,62.38,11200000,7.12 -1987-02-18,66.62,67.37,63.38,63.50,16800000,7.25 -1987-02-17,62.13,66.50,61.88,66.37,14640000,7.57 -1987-02-13,58.63,62.50,58.00,62.13,18240000,7.09 -1987-02-12,57.00,59.88,57.00,58.63,25360000,6.69 -1987-02-11,53.00,56.75,52.75,56.50,12240000,6.45 -1987-02-10,52.50,52.75,51.63,52.75,5977600,6.02 -1987-02-09,52.88,53.38,52.25,52.63,5611200,6.01 -1987-02-06,54.00,54.00,52.88,54.00,10480000,6.16 -1987-02-05,55.00,55.13,53.13,53.88,12160000,6.15 -1987-02-04,55.50,55.50,54.38,55.00,7791200,6.28 -1987-02-03,56.00,56.13,54.75,55.50,6412800,6.33 -1987-02-02,55.50,56.00,54.25,55.88,8800000,6.38 -1987-01-30,54.00,55.88,52.63,55.50,14640000,6.33 -1987-01-29,55.88,57.25,53.38,54.13,19920000,6.18 -1987-01-28,53.00,55.75,52.13,55.38,14800000,6.32 -1987-01-27,50.00,53.13,49.88,52.75,13520000,6.02 -1987-01-26,50.00,50.50,49.50,49.75,12560000,5.68 -1987-01-23,52.50,53.00,50.25,50.25,16400000,5.73 -1987-01-22,48.88,52.63,48.50,52.50,16880000,5.99 -1987-01-21,50.88,51.13,49.00,49.00,19040000,5.59 -1987-01-20,55.00,55.75,51.50,51.63,27680000,5.89 -1987-01-19,48.75,53.13,47.88,53.13,12960000,6.06 -1987-01-16,50.00,50.00,47.75,48.75,14560000,5.56 -1987-01-15,48.25,51.38,48.00,49.88,19520000,5.69 -1987-01-14,44.63,48.25,44.50,48.13,18000000,5.49 -1987-01-13,45.13,45.38,44.63,44.63,7584800,5.09 -1987-01-12,45.50,45.75,44.75,45.50,8320000,5.19 -1987-01-09,44.75,45.75,44.38,45.38,8560000,5.18 -1987-01-08,44.75,45.13,44.50,44.75,10400000,5.11 -1987-01-07,43.88,44.88,43.63,44.75,15520000,5.11 -1987-01-06,43.13,44.00,42.63,43.75,11600000,4.99 -1987-01-05,41.25,43.25,41.00,43.00,8560000,4.91 -1987-01-02,40.38,41.13,40.13,40.88,4360000,4.66 -1986-12-31,41.00,41.38,40.38,40.50,4742400,4.62 -1986-12-30,40.50,41.50,40.38,41.00,5297600,4.68 -1986-12-29,41.00,41.13,40.25,40.50,4224800,4.62 -1986-12-26,41.88,41.88,41.00,41.00,3215200,4.68 -1986-12-24,42.00,42.13,41.63,41.88,3453600,4.78 -1986-12-23,42.25,42.38,41.88,42.13,8720000,4.81 -1986-12-22,42.00,42.50,41.75,42.13,5887200,4.81 -1986-12-19,41.38,42.50,41.38,42.13,7149600,4.81 -1986-12-18,41.13,41.88,40.75,41.38,6258400,4.72 -1986-12-17,42.38,42.50,40.88,41.25,5417600,4.71 -1986-12-16,41.63,42.50,41.63,42.50,5464000,4.85 -1986-12-15,41.00,41.75,40.38,41.75,7481600,4.76 -1986-12-12,42.88,43.00,41.25,41.25,6451200,4.71 -1986-12-11,43.63,43.88,42.63,42.88,8080000,4.89 -1986-12-10,42.38,43.75,42.00,43.50,8720000,4.96 -1986-12-09,42.38,42.63,41.13,42.38,10800000,4.84 -1986-12-08,43.63,43.88,42.38,42.50,12400000,4.85 -1986-12-05,42.63,43.75,42.50,43.75,9360000,4.99 -1986-12-04,42.63,42.75,42.00,42.50,9600000,4.85 -1986-12-03,41.63,43.00,41.50,42.75,12000000,4.88 -1986-12-02,40.50,41.75,40.00,41.50,13200000,4.74 -1986-12-01,40.00,40.13,39.13,40.13,12400000,4.58 -1986-11-28,40.50,40.63,39.63,40.00,7897600,4.56 -1986-11-26,40.13,41.25,40.00,40.50,18080000,4.62 -1986-11-25,38.00,40.38,38.00,40.25,30320000,4.59 -1986-11-24,36.25,38.13,36.00,38.00,13440000,4.34 -1986-11-21,35.25,36.25,35.13,36.00,10240000,4.11 -1986-11-20,34.88,35.38,34.88,35.25,10560000,4.02 -1986-11-19,35.13,35.25,34.50,35.00,10800000,3.99 -1986-11-18,36.38,36.75,35.13,35.38,6115200,4.04 -1986-11-17,35.25,37.00,35.00,36.38,5071200,4.15 -1986-11-14,35.50,35.50,34.88,35.25,4840000,4.02 -1986-11-13,36.50,36.50,35.50,35.50,4928800,4.05 -1986-11-12,35.75,36.63,35.63,36.63,4700000,4.18 -1986-11-11,35.50,35.75,35.25,35.50,1809600,4.05 -1986-11-10,35.88,35.88,35.13,35.38,3793600,4.04 -1986-11-07,36.00,36.13,34.88,35.75,5153600,4.08 -1986-11-06,36.63,36.88,35.75,36.13,11840000,4.12 -1986-11-05,35.75,37.13,35.50,37.00,22320000,4.22 -1986-11-04,34.88,35.88,33.88,35.75,8800000,4.08 -1986-11-03,34.75,35.13,34.63,35.00,5457600,3.99 -1986-10-31,34.25,34.88,34.25,34.63,4338400,3.95 -1986-10-30,33.50,34.75,33.38,34.25,10480000,3.91 -1986-10-29,33.50,33.50,33.13,33.38,3057600,3.81 -1986-10-28,34.00,34.13,33.00,33.38,5102400,3.81 -1986-10-27,33.50,34.00,33.25,34.00,5422400,3.88 -1986-10-24,33.13,33.25,32.75,33.00,2718400,3.77 -1986-10-23,32.50,33.13,32.50,33.13,4441600,3.78 -1986-10-22,32.75,32.88,32.25,32.50,3382400,3.71 -1986-10-21,33.00,33.00,32.63,32.75,4096000,3.74 -1986-10-20,33.50,33.63,32.88,32.88,5344000,3.75 -1986-10-17,33.75,34.00,33.38,33.63,5460000,3.84 -1986-10-16,33.38,33.88,33.25,33.63,4876000,3.84 -1986-10-15,33.50,33.50,32.75,33.38,7367200,3.81 -1986-10-14,34.63,35.25,33.75,34.00,7164000,3.88 -1986-10-13,33.13,34.63,33.00,34.63,3582400,3.95 -1986-10-10,32.88,33.38,32.38,33.25,2096000,3.79 -1986-10-09,32.75,33.25,32.63,33.00,2820000,3.77 -1986-10-08,32.88,33.00,32.25,32.75,4021600,3.74 -1986-10-07,34.00,34.13,32.88,33.00,4577600,3.77 -1986-10-06,33.75,34.25,33.63,34.13,3384000,3.89 -1986-10-03,34.38,34.75,33.38,33.75,4997600,3.85 -1986-10-02,33.75,34.38,33.50,34.13,3401600,3.89 -1986-10-01,33.38,34.50,33.38,34.13,4988800,3.89 -1986-09-30,32.88,33.88,32.63,33.50,6488800,3.82 -1986-09-29,33.63,33.88,31.62,32.50,7475200,3.71 -1986-09-26,34.13,34.38,33.88,34.25,2512800,3.91 -1986-09-25,35.13,35.25,33.63,34.50,6744800,3.94 -1986-09-24,36.13,36.38,34.00,35.13,6360000,4.01 -1986-09-23,35.25,36.25,35.13,36.13,12080000,4.12 -1986-09-22,33.50,35.38,33.50,35.25,8560000,4.02 -1986-09-19,33.75,33.88,33.25,33.63,4601600,3.84 -1986-09-18,34.25,34.50,33.75,34.00,3546400,3.88 -1986-09-17,34.88,35.00,34.25,34.25,4181600,3.91 -1986-09-16,33.13,35.13,32.50,34.88,8800000,3.98 -1986-09-15,32.25,33.13,32.00,33.13,7973600,3.78 -1986-09-12,32.50,32.75,31.75,31.75,8160000,3.62 -1986-09-11,34.63,34.75,32.50,32.63,4842400,3.72 -1986-09-10,35.63,35.88,34.75,35.00,2737600,3.99 -1986-09-09,34.63,36.00,34.63,35.75,5398400,4.08 -1986-09-08,35.00,35.00,33.63,34.75,4522400,3.97 -1986-09-05,35.63,35.88,35.00,35.13,3561600,4.01 -1986-09-04,35.00,35.50,34.75,35.50,7133600,4.05 -1986-09-03,34.75,34.88,34.13,34.75,4216000,3.97 -1986-09-02,37.13,37.13,34.75,34.75,8320000,3.97 -1986-08-29,37.63,38.00,36.88,37.00,4846400,4.22 -1986-08-28,37.00,38.00,36.88,37.75,7849600,4.31 -1986-08-27,36.63,37.00,36.25,37.00,5280000,4.22 -1986-08-26,36.38,36.88,36.38,36.63,4713600,4.18 -1986-08-25,36.50,36.88,36.38,36.38,4533600,4.15 -1986-08-22,35.88,36.63,35.88,36.25,4162400,4.14 -1986-08-21,36.13,36.38,35.75,35.75,6992800,4.08 -1986-08-20,35.25,36.50,35.25,36.25,6140000,4.14 -1986-08-19,35.13,35.50,34.63,35.38,4944000,4.04 -1986-08-18,35.75,35.88,35.00,35.38,5297600,4.04 -1986-08-15,36.13,36.50,35.63,35.75,4910400,4.08 -1986-08-14,36.00,37.00,36.00,36.00,8240000,4.11 -1986-08-13,34.25,36.25,34.25,36.00,16240000,4.11 -1986-08-12,33.38,34.38,33.38,34.25,8720000,3.91 -1986-08-11,31.87,33.50,31.75,33.50,6591200,3.82 -1986-08-08,31.87,32.38,31.62,31.62,3941600,3.61 -1986-08-07,31.12,32.63,31.12,31.75,6211200,3.62 -1986-08-06,32.13,32.13,31.00,31.12,6644800,3.55 -1986-08-05,31.62,32.38,31.50,32.13,4238400,3.67 -1986-08-04,31.37,31.50,30.62,31.50,4653600,3.59 -1986-08-01,31.12,31.75,31.12,31.37,5360000,3.58 -1986-07-31,30.50,31.50,30.50,31.25,10080000,3.57 -1986-07-30,31.25,31.50,30.00,30.50,9120000,3.48 -1986-07-29,32.25,32.25,30.75,31.25,21280000,3.57 -1986-07-28,33.88,34.00,32.25,32.38,8800000,3.69 -1986-07-25,33.13,34.00,33.00,34.00,7769600,3.88 -1986-07-24,34.25,34.38,33.00,33.13,5187200,3.78 -1986-07-23,34.63,34.63,34.13,34.13,6416000,3.89 -1986-07-22,33.50,34.63,33.25,34.63,8560000,3.95 -1986-07-21,33.00,33.75,32.75,33.50,8160000,3.82 -1986-07-18,32.25,32.50,31.25,31.75,11040000,3.62 -1986-07-17,33.50,33.75,32.13,32.25,8960000,3.68 -1986-07-16,35.50,35.63,32.75,33.50,19280000,3.82 -1986-07-15,35.00,35.00,34.25,34.88,10640000,3.98 -1986-07-14,37.13,37.38,36.25,36.25,8480000,4.14 -1986-07-11,35.38,37.75,35.25,37.13,8000000,4.24 -1986-07-10,34.75,35.38,34.63,35.38,7453600,4.04 -1986-07-09,34.25,34.75,34.00,34.63,13040000,3.95 -1986-07-08,35.25,35.25,34.13,34.25,9782400,3.91 -1986-07-07,37.63,37.75,35.38,35.63,6501600,4.07 -1986-07-03,36.13,37.75,35.63,37.63,6509600,4.29 -1986-07-02,35.38,36.25,35.38,36.13,5202400,4.12 -1986-07-01,35.88,36.13,34.75,35.38,3140000,4.04 -1986-06-30,35.88,36.25,35.75,35.88,2553600,4.09 -1986-06-27,36.25,36.75,35.50,35.88,1811200,4.09 -1986-06-26,35.88,36.38,35.50,36.25,4184800,4.14 -1986-06-25,35.00,36.00,35.00,35.88,4755200,4.09 -1986-06-24,34.75,35.13,34.38,34.88,5088800,3.98 -1986-06-23,36.00,36.25,34.63,34.75,4196000,3.97 -1986-06-20,35.00,36.13,35.00,36.00,5761600,4.11 -1986-06-19,34.25,35.75,33.88,35.00,12347200,3.99 -1986-06-18,34.25,34.75,32.50,34.25,15381600,3.91 -1986-06-17,35.88,36.00,34.00,34.25,7936000,3.91 -1986-06-16,36.38,36.88,35.63,35.88,6222400,4.09 -1986-06-13,36.00,36.38,35.25,36.38,5144800,4.15 -1986-06-12,36.13,36.38,36.00,36.00,4638400,4.11 -1986-06-11,36.00,36.25,35.50,36.13,6692800,4.12 -1986-06-10,36.00,36.00,35.13,36.00,8827200,4.11 -1986-06-09,37.75,37.88,35.88,36.00,8835200,4.11 -1986-06-06,38.88,38.88,37.50,37.75,6342400,4.31 -1986-06-05,38.75,39.13,38.50,38.88,5282400,4.44 -1986-06-04,37.88,38.88,37.75,38.75,10747200,4.42 -1986-06-03,37.13,38.13,37.13,37.88,11661600,4.32 -1986-06-02,37.00,37.38,36.75,37.13,7158400,4.24 -1986-05-30,37.00,37.25,36.50,37.00,4591200,4.22 -1986-05-29,37.25,37.25,36.50,37.00,3635200,4.22 -1986-05-28,36.88,37.50,36.75,37.25,7418400,4.25 -1986-05-27,37.00,37.00,36.38,36.88,3058400,4.21 -1986-05-23,36.75,37.13,36.38,37.00,5013600,4.22 -1986-05-22,37.00,37.50,35.75,36.75,7895200,4.19 -1986-05-21,35.38,37.25,35.00,37.00,12418400,4.22 -1986-05-20,35.63,35.63,34.25,35.38,8811200,4.04 -1986-05-19,36.00,36.50,35.50,35.63,7506400,4.07 -1986-05-16,36.00,36.25,35.13,36.00,11424800,4.11 -1986-05-15,36.88,37.00,35.63,36.00,7964000,4.11 -1986-05-14,36.00,37.38,36.00,36.88,17277600,4.21 -1986-05-13,36.38,36.50,35.25,36.00,16876000,4.11 -1986-05-12,33.38,36.63,33.25,36.38,14335200,4.15 -1986-05-09,33.00,33.63,32.75,33.38,7961600,3.81 -1986-05-08,31.50,33.13,31.50,33.00,8342400,3.77 -1986-05-07,32.63,32.88,31.25,31.50,7133600,3.59 -1986-05-06,32.25,33.25,32.25,32.63,7829600,3.72 -1986-05-05,30.50,32.50,30.50,32.13,5364000,3.67 -1986-05-02,30.25,31.00,30.12,30.50,3377600,3.48 -1986-05-01,30.25,30.25,29.75,30.25,9218400,3.45 -1986-04-30,31.25,31.62,30.25,30.25,4944000,3.45 -1986-04-29,32.00,32.25,26.87,31.25,4750400,3.57 -1986-04-28,32.25,32.75,31.75,32.00,5241600,3.65 -1986-04-25,31.37,32.63,31.37,32.25,9348800,3.68 -1986-04-24,29.62,31.50,29.50,31.37,16398400,3.58 -1986-04-23,29.87,30.37,29.37,29.62,9371200,3.38 -1986-04-22,30.37,31.25,29.62,29.87,11726400,3.41 -1986-04-21,29.87,30.75,29.87,30.37,9775200,3.47 -1986-04-18,29.00,29.87,28.75,29.75,8871200,3.39 -1986-04-17,28.25,29.12,28.00,29.00,9672800,3.31 -1986-04-16,27.37,28.50,27.37,28.25,7535200,3.22 -1986-04-15,26.87,27.50,26.87,27.37,4722400,3.12 -1986-04-14,27.00,27.25,26.75,26.87,3076000,3.07 -1986-04-11,27.25,27.50,27.00,27.00,2737600,3.08 -1986-04-10,27.12,27.37,26.87,27.25,3932800,3.11 -1986-04-09,27.62,27.75,26.87,27.12,4851200,3.09 -1986-04-08,27.25,27.75,27.25,27.62,6912800,3.15 -1986-04-07,26.75,27.50,26.25,27.25,4318400,3.11 -1986-04-04,27.00,27.00,26.62,26.75,4508800,3.05 -1986-04-03,27.25,27.62,26.87,27.00,7548800,3.08 -1986-04-02,27.25,27.37,26.25,27.25,11627200,3.11 -1986-04-01,28.25,28.25,27.00,27.25,7973600,3.11 -1986-03-31,28.25,28.50,28.00,28.25,6744800,3.22 -1986-03-27,28.25,29.00,28.25,28.25,7856000,3.22 -1986-03-26,27.87,28.75,27.87,28.25,7941600,3.22 -1986-03-25,26.75,27.87,26.75,27.87,10060000,3.18 -1986-03-24,27.62,27.62,26.37,26.75,10528800,3.05 -1986-03-21,28.25,28.75,27.50,27.62,9309600,3.15 -1986-03-20,28.00,29.62,28.00,28.25,32318400,3.22 -1986-03-19,26.87,27.25,26.37,26.50,6816000,3.02 -1986-03-18,26.00,27.25,25.87,26.87,8920000,3.07 -1986-03-17,26.00,26.00,25.37,26.00,4240000,2.97 -1986-03-14,24.75,26.25,24.75,26.12,13781600,2.98 -1986-03-13,24.75,25.00,24.37,24.75,4176000,2.82 -1986-03-12,24.87,25.12,24.75,24.75,3071200,2.82 -1986-03-11,24.62,24.87,24.50,24.87,3681600,2.84 -1986-03-10,24.75,24.87,24.62,24.62,2727200,2.81 -1986-03-07,25.37,25.37,24.75,24.75,3477600,2.82 -1986-03-06,25.25,25.75,25.12,25.37,3630400,2.89 -1986-03-05,24.62,25.50,24.25,25.25,6324000,2.88 -1986-03-04,24.62,25.00,24.50,24.62,3217600,2.81 -1986-03-03,25.00,25.12,24.50,24.62,3912800,2.81 -1986-02-28,25.62,25.87,24.87,25.00,4507200,2.85 -1986-02-27,26.00,26.12,25.50,25.62,3873600,2.92 -1986-02-26,26.37,26.75,26.00,26.00,5907200,2.97 -1986-02-25,25.75,26.37,25.12,26.37,8041600,3.01 -1986-02-24,25.25,25.75,25.00,25.75,8840000,2.94 -1986-02-21,25.12,25.75,25.12,25.25,6771200,2.88 -1986-02-20,25.00,25.37,24.87,25.12,4951200,2.87 -1986-02-19,23.87,25.50,23.87,25.00,12871200,2.85 -1986-02-18,23.75,24.00,23.25,23.87,5295200,2.72 -1986-02-14,23.87,24.12,23.75,23.75,4928800,2.71 -1986-02-13,24.00,24.00,23.75,23.87,3944000,2.72 -1986-02-12,23.87,24.00,23.75,24.00,4770400,2.74 -1986-02-11,23.87,24.00,23.50,23.87,5504000,2.72 -1986-02-10,24.00,24.50,23.75,23.87,4036000,2.72 -1986-02-07,24.12,24.12,23.50,24.00,4656000,2.74 -1986-02-06,23.75,24.25,23.62,24.12,4835200,2.75 -1986-02-05,23.75,23.87,23.50,23.75,7042400,2.71 -1986-02-04,23.87,24.37,23.75,23.75,9298400,2.71 -1986-02-03,23.12,24.00,22.87,23.87,12512800,2.72 -1986-01-31,23.00,23.25,22.87,23.12,5317600,2.64 -1986-01-30,23.50,23.50,22.87,23.00,8493600,2.62 -1986-01-29,22.25,24.37,22.00,23.62,21064800,2.70 -1986-01-28,22.12,22.37,22.00,22.25,7949600,2.54 -1986-01-27,22.62,22.75,22.00,22.12,13955200,2.52 -1986-01-24,23.00,23.37,22.62,22.62,4044000,2.58 -1986-01-23,23.37,23.50,22.75,23.00,5624000,2.62 -1986-01-22,24.00,24.12,22.37,23.37,5144800,2.67 -1986-01-21,23.87,24.12,23.75,24.00,5464800,2.74 -1986-01-20,24.00,24.00,23.37,23.87,4590400,2.72 -1986-01-17,24.50,24.75,23.87,24.00,12344000,2.74 -1986-01-16,23.87,24.75,23.87,24.50,19132800,2.80 -1986-01-15,23.25,24.00,23.12,23.87,15126400,2.72 -1986-01-14,23.00,23.75,22.50,23.25,9772800,2.65 -1986-01-13,22.75,23.12,22.50,23.00,7701600,2.62 -1986-01-10,22.62,23.12,22.62,22.75,5491200,2.60 -1986-01-09,22.87,23.00,21.87,22.62,16002400,2.58 -1986-01-08,23.00,23.50,22.75,22.87,21711200,2.61 -1986-01-07,22.25,23.00,22.12,23.00,16807200,2.62 -1986-01-06,22.37,22.37,21.87,22.25,6636000,2.54 -1986-01-03,22.25,22.37,22.12,22.37,8653600,2.55 -1986-01-02,22.00,22.25,21.75,22.25,4212800,2.54 -1985-12-31,22.25,22.37,22.00,22.00,3158400,2.51 -1985-12-30,22.37,22.62,22.12,22.25,3848800,2.54 -1985-12-27,21.75,22.62,21.75,22.37,4427200,2.55 -1985-12-26,21.75,22.00,21.62,21.75,1658400,2.48 -1985-12-24,21.87,22.00,21.62,21.75,2344800,2.48 -1985-12-23,22.37,22.50,21.62,21.87,5157600,2.50 -1985-12-20,22.50,22.75,22.25,22.37,7402400,2.55 -1985-12-19,22.25,22.75,22.12,22.50,9673600,2.57 -1985-12-18,21.37,22.87,21.37,22.25,20033600,2.54 -1985-12-17,20.87,21.00,20.37,20.62,3926400,2.35 -1985-12-16,20.00,21.25,20.00,20.87,10362400,2.38 -1985-12-13,20.00,20.25,19.75,20.00,8975200,2.28 -1985-12-12,19.87,20.25,19.87,20.00,4515200,2.28 -1985-12-11,19.50,20.12,19.50,19.75,8489600,2.25 -1985-12-10,19.37,19.62,19.25,19.50,7206400,2.23 -1985-12-09,19.75,20.00,19.25,19.37,5015200,2.21 -1985-12-06,20.12,20.12,19.62,19.75,2347200,2.25 -1985-12-05,20.50,20.75,20.00,20.12,4508800,2.30 -1985-12-04,20.12,20.62,20.12,20.50,5928800,2.34 -1985-12-03,20.25,20.37,20.00,20.12,5548800,2.30 -1985-12-02,20.12,20.25,20.00,20.25,3611200,2.31 -1985-11-29,20.00,20.12,19.87,20.12,3546400,2.30 -1985-11-27,19.37,20.12,19.25,20.00,6873600,2.28 -1985-11-26,19.12,19.50,19.00,19.37,5892800,2.21 -1985-11-25,19.00,19.25,19.00,19.12,3488800,2.18 -1985-11-22,19.00,19.25,18.87,19.00,4620000,2.17 -1985-11-21,19.00,19.25,19.00,19.00,3720000,2.17 -1985-11-20,19.25,19.37,19.00,19.00,3548800,2.17 -1985-11-19,19.87,20.00,19.25,19.25,3373600,2.20 -1985-11-18,19.87,20.00,19.87,19.87,2342400,2.27 -1985-11-15,20.00,20.25,19.87,19.87,2932800,2.27 -1985-11-14,20.00,20.12,20.00,20.00,4995200,2.28 -1985-11-13,19.87,19.87,19.37,19.37,3642400,2.21 -1985-11-12,20.00,20.25,19.87,19.87,6224800,2.27 -1985-11-11,20.50,20.75,20.00,20.00,6421600,2.28 -1985-11-08,20.50,20.75,20.50,20.50,10517600,2.34 -1985-11-07,19.62,19.87,19.62,19.62,11352800,2.24 -1985-11-06,19.25,19.37,19.25,19.25,7181600,2.20 -1985-11-05,18.75,19.12,18.62,18.62,3841600,2.12 -1985-11-04,18.75,19.12,18.75,18.75,5584800,2.14 -1985-11-01,18.62,19.00,18.62,18.62,3320000,2.12 -1985-10-31,19.00,19.25,18.62,18.62,5548800,2.12 -1985-10-30,19.00,19.00,19.00,19.00,8098400,2.17 -1985-10-29,18.00,18.00,17.87,17.87,4693600,2.04 -1985-10-28,18.00,18.12,18.00,18.00,2148800,2.05 -1985-10-25,18.37,18.37,18.00,18.00,2271200,2.05 -1985-10-24,18.37,18.87,18.37,18.37,9768800,2.10 -1985-10-23,18.00,18.50,18.00,18.00,5309600,2.05 -1985-10-22,18.00,18.25,18.00,18.00,15186400,2.05 -1985-10-21,17.75,17.75,17.25,17.25,4248800,1.97 -1985-10-18,18.25,18.37,17.75,17.75,8268800,2.03 -1985-10-17,18.25,19.12,18.25,18.25,12455200,2.08 -1985-10-16,18.00,18.12,18.00,18.00,10336000,2.05 -1985-10-15,17.00,17.12,17.00,17.00,10504800,1.94 -1985-10-14,16.62,16.62,16.62,16.62,5555200,1.90 -1985-10-11,16.00,16.25,16.00,16.00,4261600,1.83 -1985-10-10,15.88,16.00,15.88,15.88,9386400,1.81 -1985-10-09,15.13,15.25,15.00,15.00,3001600,1.71 -1985-10-08,15.13,15.13,15.13,15.13,3144000,1.73 -1985-10-07,15.00,15.25,15.00,15.00,3284800,1.71 -1985-10-04,15.50,15.50,15.00,15.00,2484800,1.71 -1985-10-03,15.63,15.63,15.50,15.50,1784800,1.77 -1985-10-02,15.75,15.88,15.63,15.63,795200,1.78 -1985-10-01,15.75,15.88,15.75,15.75,3175200,1.80 -1985-09-30,15.88,16.00,15.75,15.75,1324800,1.80 -1985-09-27,15.88,16.00,15.88,15.88,250400,1.81 -1985-09-26,15.88,16.00,15.88,15.88,1949600,1.81 -1985-09-25,16.50,16.50,15.88,15.88,3761600,1.81 -1985-09-24,16.87,17.25,16.50,16.50,3161600,1.88 -1985-09-23,16.87,17.12,16.87,16.87,4277600,1.92 -1985-09-20,17.00,17.12,16.75,16.75,4846400,1.91 -1985-09-19,17.00,17.00,17.00,17.00,6662400,1.94 -1985-09-18,16.25,16.25,16.25,16.25,4316000,1.85 -1985-09-17,15.25,15.25,15.25,15.25,6564000,1.74 -1985-09-16,15.75,15.75,15.25,15.25,1344000,1.74 -1985-09-13,16.12,16.12,15.75,15.75,2541600,1.80 -1985-09-12,16.12,16.12,16.12,16.12,3998400,1.84 -1985-09-11,15.50,15.63,15.50,15.50,3150400,1.77 -1985-09-10,15.38,15.63,15.38,15.38,4364800,1.75 -1985-09-09,15.25,15.38,15.25,15.25,4728800,1.74 -1985-09-06,15.00,15.00,15.00,15.00,3333600,1.71 -1985-09-05,14.88,15.00,14.88,14.88,1201600,1.70 -1985-09-04,14.88,15.13,14.88,14.88,1708800,1.70 -1985-09-03,15.00,15.00,14.75,14.75,1369600,1.68 -1985-08-30,15.00,15.00,15.00,15.00,1537600,1.71 -1985-08-29,15.25,15.25,14.88,14.88,2006400,1.70 -1985-08-28,15.25,15.38,15.25,15.25,1475200,1.74 -1985-08-27,15.25,15.25,15.25,15.25,1540000,1.74 -1985-08-26,15.13,15.13,15.13,15.13,1315200,1.73 -1985-08-23,14.88,15.00,14.75,14.75,1601600,1.68 -1985-08-22,15.25,15.25,14.88,14.88,4406400,1.70 -1985-08-21,15.25,15.25,15.25,15.25,2767200,1.74 -1985-08-20,15.25,15.25,15.25,15.25,2431200,1.74 -1985-08-19,15.00,15.25,15.00,15.00,1726400,1.71 -1985-08-16,14.63,14.88,14.63,14.63,3008800,1.67 -1985-08-15,14.63,14.75,14.50,14.50,3800000,1.65 -1985-08-14,15.25,15.25,14.63,14.63,10372800,1.67 -1985-08-13,15.25,15.50,15.25,15.25,1555200,1.74 -1985-08-12,15.25,15.25,15.00,15.00,1988800,1.71 -1985-08-09,15.25,15.25,15.25,15.25,2186400,1.74 -1985-08-08,15.13,15.25,15.13,15.13,5321600,1.73 -1985-08-07,15.25,16.00,14.88,14.88,5452800,1.70 -1985-08-06,15.38,15.75,15.25,15.25,2260000,1.74 -1985-08-05,15.75,15.88,15.38,15.38,3307200,1.75 -1985-08-02,15.88,15.88,15.75,15.75,3501600,1.80 -1985-08-01,15.88,16.12,15.88,15.88,1842400,1.81 -1985-07-31,16.25,16.37,15.88,15.88,2917600,1.81 -1985-07-30,16.25,16.37,16.25,16.25,3237600,1.85 -1985-07-29,16.62,16.62,16.00,16.00,2808800,1.83 -1985-07-26,16.62,16.75,16.62,16.62,4673600,1.90 -1985-07-25,16.62,16.75,16.62,16.62,11282400,1.90 -1985-07-24,16.50,16.75,16.25,16.25,6040000,1.85 -1985-07-23,16.87,17.12,16.50,16.50,6038400,1.88 -1985-07-22,17.37,17.37,16.87,16.87,6906400,1.92 -1985-07-19,17.37,17.37,17.37,17.37,4117600,1.98 -1985-07-18,17.62,17.62,17.25,17.25,6437600,1.97 -1985-07-17,17.62,17.87,17.62,17.62,4255200,2.01 -1985-07-16,17.75,17.87,17.50,17.50,5120000,2.00 -1985-07-15,17.87,18.25,17.75,17.75,2804800,2.03 -1985-07-12,18.00,18.00,17.87,17.87,1680000,2.04 -1985-07-11,18.00,18.12,18.00,18.00,2361600,2.05 -1985-07-10,18.00,18.00,18.00,18.00,3802400,2.05 -1985-07-09,17.62,17.75,17.62,17.62,5284000,2.01 -1985-07-08,17.62,17.75,17.62,17.62,3301600,2.01 -1985-07-05,17.62,17.75,17.62,17.62,1321600,2.01 -1985-07-03,17.50,17.50,17.50,17.50,2472800,2.00 -1985-07-02,18.12,18.25,17.25,17.25,2807200,1.97 -1985-07-01,18.12,18.25,18.12,18.12,3702400,2.07 -1985-06-28,18.37,18.50,18.00,18.00,4875200,2.05 -1985-06-27,18.37,18.50,18.37,18.37,6915200,2.10 -1985-06-26,18.12,18.12,18.12,18.12,4722400,2.07 -1985-06-25,17.50,17.87,17.50,17.50,10506400,2.00 -1985-06-24,17.25,17.50,17.25,17.25,7387200,1.97 -1985-06-21,16.12,16.50,16.12,16.12,5941600,1.84 -1985-06-20,15.75,15.75,15.75,15.75,6822400,1.80 -1985-06-19,15.63,15.88,15.63,15.63,6177600,1.78 -1985-06-18,15.25,15.50,15.25,15.25,9489600,1.74 -1985-06-17,14.88,15.00,14.88,14.88,8464000,1.70 -1985-06-14,14.88,15.75,14.75,14.75,20226400,1.68 -1985-06-13,15.75,15.88,14.88,14.88,13573600,1.70 -1985-06-12,16.12,16.25,15.75,15.75,8888800,1.80 -1985-06-11,16.12,16.50,16.12,16.12,10751200,1.84 -1985-06-10,16.37,16.50,16.12,16.12,11296000,1.84 -1985-06-07,17.00,17.00,16.37,16.37,16980000,1.87 -1985-06-06,17.00,17.00,17.00,17.00,9688800,1.94 -1985-06-05,17.25,17.75,16.87,16.87,10267200,1.92 -1985-06-04,17.25,17.37,17.25,17.25,14373600,1.97 -1985-06-03,17.00,17.00,16.00,16.00,20578400,1.83 -1985-05-31,17.62,18.00,17.37,17.37,13235200,1.98 -1985-05-30,17.62,17.87,17.62,17.62,11273600,2.01 -1985-05-29,17.12,17.25,17.12,17.12,8808800,1.95 -1985-05-28,17.87,17.87,16.87,16.87,18253600,1.92 -1985-05-24,19.75,19.75,18.12,18.12,21060000,2.07 -1985-05-23,20.50,20.50,19.75,19.75,8576000,2.25 -1985-05-22,20.75,20.87,20.62,20.62,4342400,2.35 -1985-05-21,21.25,21.25,20.75,20.75,5452800,2.37 -1985-05-20,21.75,22.25,21.37,21.37,7044000,2.44 -1985-05-17,21.37,22.12,21.25,21.75,7592800,2.48 -1985-05-16,21.37,22.00,21.37,21.37,8275200,2.44 -1985-05-15,20.00,20.37,20.00,20.00,4668800,2.28 -1985-05-14,20.00,20.12,19.75,19.75,4364000,2.25 -1985-05-13,20.25,20.37,20.00,20.00,3157600,2.28 -1985-05-10,20.00,20.50,20.00,20.25,4893600,2.31 -1985-05-09,20.00,20.12,20.00,20.00,4571200,2.28 -1985-05-08,19.87,19.87,19.87,19.87,5177600,2.27 -1985-05-07,20.00,20.00,20.00,20.00,3844800,2.28 -1985-05-06,20.00,20.25,19.75,19.75,2007200,2.25 -1985-05-03,19.25,20.12,19.25,20.00,5673600,2.28 -1985-05-02,20.62,20.62,19.25,19.25,11787200,2.20 -1985-05-01,21.25,21.37,20.87,20.87,2075200,2.38 -1985-04-30,21.25,21.37,21.25,21.25,3396000,2.42 -1985-04-29,21.87,22.00,21.12,21.12,2256000,2.41 -1985-04-26,22.00,22.62,21.87,21.87,4295200,2.50 -1985-04-25,22.00,22.12,22.00,22.00,3135200,2.51 -1985-04-24,22.12,22.50,22.00,22.00,2830400,2.51 -1985-04-23,22.12,22.25,22.12,22.12,4261600,2.52 -1985-04-22,22.50,22.50,21.62,21.62,3700000,2.47 -1985-04-19,22.87,22.87,22.37,22.50,3468800,2.57 -1985-04-18,22.87,23.00,22.87,22.87,7246400,2.61 -1985-04-17,22.62,22.87,22.62,22.62,4402400,2.58 -1985-04-16,21.62,21.75,21.62,21.62,2424800,2.47 -1985-04-15,21.37,21.62,21.37,21.37,2168800,2.44 -1985-04-12,21.37,21.37,20.75,20.87,2607200,2.38 -1985-04-11,21.37,22.00,21.37,21.37,5260000,2.44 -1985-04-10,21.00,21.25,21.00,21.00,8117600,2.40 -1985-04-09,19.62,19.75,19.62,19.62,9461600,2.24 -1985-04-08,20.87,21.00,19.62,19.62,7129600,2.24 -1985-04-04,21.00,21.12,20.62,20.87,5792800,2.38 -1985-04-03,21.00,21.12,21.00,21.00,8681600,2.40 -1985-04-02,21.62,21.75,21.00,21.00,8146400,2.40 -1985-04-01,22.12,22.62,21.62,21.62,4115200,2.47 -1985-03-29,21.87,22.25,21.87,22.12,3155200,2.52 -1985-03-28,21.87,22.25,21.87,21.87,4667200,2.50 -1985-03-27,22.50,22.75,21.87,21.87,4008800,2.50 -1985-03-26,22.50,22.50,22.50,22.50,4346400,2.57 -1985-03-25,22.25,22.25,21.62,21.62,3931200,2.47 -1985-03-22,22.62,23.00,22.25,22.25,2910400,2.54 -1985-03-21,22.62,23.00,22.62,22.62,5826400,2.58 -1985-03-20,22.25,22.62,22.25,22.25,14498400,2.54 -1985-03-19,22.87,23.12,22.00,22.00,6147200,2.51 -1985-03-18,22.87,23.12,22.87,22.87,4487200,2.61 -1985-03-15,21.75,23.12,21.62,22.62,6524000,2.58 -1985-03-14,21.75,21.87,21.75,21.75,8667200,2.48 -1985-03-13,23.00,23.00,21.75,21.75,8973600,2.48 -1985-03-12,23.00,23.25,23.00,23.00,7880000,2.62 -1985-03-11,22.25,22.37,22.25,22.25,10244800,2.54 -1985-03-08,22.12,22.12,20.75,21.50,16931200,2.45 -1985-03-07,24.62,24.75,22.12,22.12,26244000,2.52 -1985-03-06,25.87,25.87,24.62,24.62,6933600,2.81 -1985-03-05,25.87,25.87,25.87,25.87,4687200,2.95 -1985-03-04,25.25,26.00,25.25,25.25,5484000,2.88 -1985-03-01,24.75,24.87,24.00,24.87,8857600,2.84 -1985-02-28,25.12,25.12,24.75,24.75,11415200,2.82 -1985-02-27,26.75,26.75,25.12,25.12,14421600,2.87 -1985-02-26,27.25,27.37,26.75,26.75,6764800,3.05 -1985-02-25,27.62,27.75,27.25,27.25,3564000,3.11 -1985-02-22,26.87,27.87,26.87,27.62,8096000,3.15 -1985-02-21,26.87,27.00,26.87,26.87,11035200,3.07 -1985-02-20,27.62,27.75,26.37,26.37,7864800,3.01 -1985-02-19,27.87,27.87,27.62,27.62,5391200,3.15 -1985-02-15,27.62,28.12,27.37,28.00,6224000,3.19 -1985-02-14,28.37,28.62,27.62,27.62,15268800,3.15 -1985-02-13,29.75,29.75,28.37,28.37,18835200,3.24 -1985-02-12,30.50,30.62,29.75,29.75,8095200,3.39 -1985-02-11,30.50,30.75,30.50,30.50,12431200,3.48 -1985-02-08,29.87,30.00,29.50,29.87,4757600,3.41 -1985-02-07,30.00,30.37,29.87,29.87,8793600,3.41 -1985-02-06,30.00,30.00,30.00,30.00,6980000,3.42 -1985-02-05,29.50,30.00,29.50,29.50,6824800,3.37 -1985-02-04,29.25,29.37,29.25,29.25,7801600,3.34 -1985-02-01,29.00,29.12,28.37,28.62,4941600,3.27 -1985-01-31,29.87,30.00,29.00,29.00,9880000,3.31 -1985-01-30,29.87,30.50,29.87,29.87,17624800,3.41 -1985-01-29,30.25,30.50,29.87,29.87,8029600,3.41 -1985-01-28,30.25,30.62,30.25,30.25,14721600,3.45 -1985-01-25,29.00,29.62,28.37,29.62,11381600,3.38 -1985-01-24,29.62,29.62,29.00,29.00,14192800,3.31 -1985-01-23,30.12,30.25,29.62,29.62,15384000,3.38 -1985-01-22,30.12,30.25,30.12,30.12,15202400,3.44 -1985-01-21,29.25,29.50,29.25,29.25,11635200,3.34 -1985-01-18,28.12,29.25,28.00,28.62,12615200,3.27 -1985-01-17,30.25,30.75,28.12,28.12,19573600,3.21 -1985-01-16,30.25,30.75,30.25,30.25,6816000,3.45 -1985-01-15,30.62,31.12,30.00,30.00,9476000,3.42 -1985-01-14,30.62,30.87,30.62,30.62,9691200,3.49 -1985-01-11,30.00,30.25,29.50,29.75,7347200,3.39 -1985-01-10,30.00,30.12,30.00,30.00,9926400,3.42 -1985-01-09,28.75,29.12,28.75,28.75,5973600,3.28 -1985-01-08,28.25,28.50,28.00,28.00,5040000,3.19 -1985-01-07,28.37,28.50,28.25,28.25,6117600,3.22 -1985-01-04,28.37,28.50,28.00,28.37,4915200,3.24 -1985-01-03,28.37,29.12,28.37,28.37,5967200,3.24 -1985-01-02,29.12,29.12,27.87,27.87,6272800,3.18 -1984-12-31,29.12,29.25,29.12,29.12,7453600,3.32 -1984-12-28,27.75,28.87,27.62,28.75,5941600,3.28 -1984-12-27,27.75,27.87,27.75,27.75,3531200,3.17 -1984-12-26,27.62,27.87,27.62,27.62,2444000,3.15 -1984-12-24,27.50,27.62,27.50,27.50,2418400,3.14 -1984-12-21,27.37,27.50,26.75,27.00,4438400,3.08 -1984-12-20,27.50,28.00,27.37,27.37,5013600,3.12 -1984-12-19,28.62,28.75,27.50,27.50,11372800,3.14 -1984-12-18,28.62,28.75,28.62,28.62,12164800,3.27 -1984-12-17,27.00,27.25,27.00,27.00,4513600,3.08 -1984-12-14,25.75,26.62,25.75,26.37,3475200,3.01 -1984-12-13,25.75,26.25,25.75,25.75,2424800,2.94 -1984-12-12,26.37,26.37,25.50,25.50,3937600,2.91 -1984-12-11,26.75,27.12,26.37,26.37,4432800,3.01 -1984-12-10,27.25,27.25,26.75,26.75,4016000,3.05 -1984-12-07,27.37,28.37,27.12,27.25,17696000,3.11 -1984-12-06,27.37,27.50,27.37,27.37,11360000,3.12 -1984-12-05,26.12,26.12,26.12,26.12,9406400,2.98 -1984-12-04,24.87,25.37,24.87,24.87,4332800,2.84 -1984-12-03,24.75,24.87,24.37,24.37,3533600,2.78 -1984-11-30,25.37,25.62,24.62,24.75,3906400,2.82 -1984-11-29,25.87,25.87,25.37,25.37,6248800,2.89 -1984-11-28,25.87,26.50,25.87,25.87,14673600,2.95 -1984-11-27,24.62,24.87,24.62,24.62,4590400,2.81 -1984-11-26,24.00,24.00,24.00,24.00,3636000,2.74 -1984-11-23,23.37,24.12,23.37,23.75,4904800,2.71 -1984-11-21,23.12,23.25,23.12,23.12,6418400,2.64 -1984-11-20,22.62,22.75,22.62,22.62,9424800,2.58 -1984-11-19,23.25,23.37,21.87,21.87,8321600,2.50 -1984-11-16,23.75,24.12,23.12,23.25,5920000,2.65 -1984-11-15,23.75,24.00,23.75,23.75,3833600,2.71 -1984-11-14,23.75,24.00,23.75,23.75,3752800,2.71 -1984-11-13,24.12,24.62,23.50,23.50,4548800,2.68 -1984-11-12,24.12,24.25,24.12,24.12,4070400,2.75 -1984-11-09,24.75,24.87,23.00,23.25,10518400,2.65 -1984-11-08,25.75,25.75,24.75,24.75,3162400,2.82 -1984-11-07,26.25,26.37,25.75,25.75,8286400,2.94 -1984-11-06,26.25,26.37,26.25,26.25,8073600,3.00 -1984-11-05,24.87,25.37,24.75,24.75,3764800,2.82 -1984-11-02,25.00,25.12,24.75,24.87,1004800,2.84 -1984-11-01,25.00,25.25,25.00,25.00,1680000,2.85 -1984-10-31,25.00,25.25,24.87,24.87,2191200,2.84 -1984-10-30,25.00,25.25,25.00,25.00,2677600,2.85 -1984-10-29,24.75,24.87,24.75,24.75,1836000,2.82 -1984-10-26,25.25,25.25,24.50,24.62,4113600,2.81 -1984-10-25,26.25,26.25,25.25,25.25,5676000,2.88 -1984-10-24,26.25,26.50,26.25,26.25,5989600,3.00 -1984-10-23,26.00,26.25,26.00,26.00,6668800,2.97 -1984-10-22,25.62,26.00,25.37,25.37,4108800,2.89 -1984-10-19,25.62,27.37,25.50,25.62,11673600,2.92 -1984-10-18,25.62,25.75,25.62,25.62,8842400,2.92 -1984-10-17,24.87,25.00,24.87,24.87,5636000,2.84 -1984-10-16,24.00,24.12,23.87,23.87,4246400,2.72 -1984-10-15,24.00,24.25,24.00,24.00,8715200,2.74 -1984-10-12,23.75,23.87,22.50,22.75,9522400,2.60 -1984-10-11,23.87,24.50,23.75,23.75,6553600,2.71 -1984-10-10,24.62,24.62,23.87,23.87,13070400,2.72 -1984-10-09,24.87,25.00,24.62,24.62,4515200,2.81 -1984-10-08,24.87,25.00,24.87,24.87,1721600,2.84 -1984-10-05,25.37,25.37,24.75,24.87,3510400,2.84 -1984-10-04,25.37,25.62,25.37,25.37,4482400,2.89 -1984-10-03,25.12,25.50,25.12,25.12,4335200,2.87 -1984-10-02,24.75,25.62,24.75,24.75,4258400,2.82 -1984-10-01,25.00,25.00,24.50,24.50,3521600,2.80 -1984-09-28,25.75,25.75,24.62,25.12,8344800,2.87 -1984-09-27,25.75,25.87,25.75,25.75,3796000,2.94 -1984-09-26,26.12,27.25,25.75,25.75,3987200,2.94 -1984-09-25,26.50,26.50,26.12,26.12,5977600,2.98 -1984-09-24,26.87,27.00,26.62,26.62,2833600,3.04 -1984-09-21,27.12,27.87,26.50,26.87,3591200,3.07 -1984-09-20,27.12,27.37,27.12,27.12,2387200,3.09 -1984-09-19,27.62,27.87,27.00,27.00,3816000,3.08 -1984-09-18,28.62,28.87,27.62,27.62,3495200,3.15 -1984-09-17,28.62,29.00,28.62,28.62,6886400,3.27 -1984-09-14,27.62,28.50,27.62,27.87,8826400,3.18 -1984-09-13,27.50,27.62,27.50,27.50,7429600,3.14 -1984-09-12,26.87,27.00,26.12,26.12,4773600,2.98 -1984-09-11,26.62,27.37,26.62,26.87,5444000,3.07 -1984-09-10,26.50,26.62,25.87,26.37,2346400,3.01 -1984-09-07,26.50,26.87,26.25,26.50,2981600,3.02 Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/mpl_examples/data/AAPL.dat and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/mpl_examples/data/AAPL.dat differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/mpl_examples/data/ct.raw and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/mpl_examples/data/ct.raw differ diff -Nru matplotlib-0.99.3/lib/mpl_examples/data/data_x_x2_x3.csv matplotlib-1.0.1/lib/mpl_examples/data/data_x_x2_x3.csv --- matplotlib-0.99.3/lib/mpl_examples/data/data_x_x2_x3.csv 2009-07-31 15:14:50.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/data/data_x_x2_x3.csv 1970-01-01 00:00:00.000000000 +0000 @@ -1,11 +0,0 @@ - 0 0 0 - 1 1 1 - 2 4 8 - 3 9 27 - 4 16 64 - 5 25 125 - 6 36 216 - 7 49 343 - 8 64 512 - 9 81 729 -10 100 1000 diff -Nru matplotlib-0.99.3/lib/mpl_examples/data/demodata.csv matplotlib-1.0.1/lib/mpl_examples/data/demodata.csv --- matplotlib-0.99.3/lib/mpl_examples/data/demodata.csv 2009-07-31 15:14:50.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/data/demodata.csv 1970-01-01 00:00:00.000000000 +0000 @@ -1,11 +0,0 @@ -clientid,date,weekdays,gains,prices,up -0,2008-04-30,Wed,-0.52458192906686452,7791404.0091921333,False -1,2008-05-01,Thu,0.076191536201738269,3167180.7366340165,True -2,2008-05-02,Fri,-0.86850970062880861,9589766.9613829032,False -3,2008-05-03,Sat,-0.42701083852713395,8949415.1867596991,False -4,2008-05-04,Sun,0.2532553652693274,937163.44375252665,True -5,2008-05-05,Mon,-0.68151636911081892,949579.88022264629,False -6,2008-05-06,Tue,0.0071911579626532168,7268426.906552773,True -7,2008-05-07,Wed,0.67449747200412147,7517014.782897247,True -8,2008-05-08,Thu,-1.1841008656818983,1920959.5423492221,False -9,2008-05-09,Fri,-1.5803692595811152,8456240.6198725495,False Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/mpl_examples/data/eeg.dat and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/mpl_examples/data/eeg.dat differ diff -Nru matplotlib-0.99.3/lib/mpl_examples/data/embedding_in_wx3.xrc matplotlib-1.0.1/lib/mpl_examples/data/embedding_in_wx3.xrc --- matplotlib-0.99.3/lib/mpl_examples/data/embedding_in_wx3.xrc 2009-07-31 15:14:50.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/data/embedding_in_wx3.xrc 1970-01-01 00:00:00.000000000 +0000 @@ -1,65 +0,0 @@ - - - - embedding_in_wx3 - - - wxVERTICAL - - - - - - - wxALL|wxEXPAND - 5 - - - - wxHORIZONTAL - - - - - - wxALL|wxEXPAND - 2 - - - - - - - wxALL|wxEXPAND - 2 - - - - - - - - wxALL|wxEXPAND - 2 - - - - 0 - - - wxEXPAND - - - - wxLEFT|wxRIGHT|wxEXPAND - 5 - - - - - wxEXPAND - - - - - \ No newline at end of file diff -Nru matplotlib-0.99.3/lib/mpl_examples/data/goog.csv matplotlib-1.0.1/lib/mpl_examples/data/goog.csv --- matplotlib-0.99.3/lib/mpl_examples/data/goog.csv 2009-07-31 15:14:50.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/data/goog.csv 1970-01-01 00:00:00.000000000 +0000 @@ -1,1048 +0,0 @@ -Date,Open,High,Low,Close,Volume,Adj Close -2008-10-14,393.53,394.50,357.00,362.71,7784800,362.71 -2008-10-13,355.79,381.95,345.75,381.02,8905500,381.02 -2008-10-10,313.16,341.89,310.30,332.00,10597800,332.00 -2008-10-09,344.52,348.57,321.67,328.98,8075000,328.98 -2008-10-08,330.16,358.99,326.11,338.11,11826400,338.11 -2008-10-07,373.33,374.98,345.37,346.01,11054400,346.01 -2008-10-06,373.98,375.99,357.16,371.21,11220600,371.21 -2008-10-03,397.35,412.50,383.07,386.91,7992900,386.91 -2008-10-02,409.79,409.98,386.00,390.49,5984900,390.49 -2008-10-01,411.15,416.98,403.10,411.72,6234800,411.72 -2008-09-30,395.98,425.08,392.32,400.52,3086300,400.52 -2008-09-29,419.51,423.51,380.71,381.00,10762900,381.00 -2008-09-26,428.00,437.16,421.03,431.04,5292500,431.04 -2008-09-25,438.84,450.00,435.98,439.60,5020300,439.60 -2008-09-24,430.34,445.00,430.11,435.11,4242000,435.11 -2008-09-23,433.25,440.79,425.72,429.27,5204200,429.27 -2008-09-22,454.13,454.13,429.00,430.14,4407300,430.14 -2008-09-19,461.00,462.07,443.28,449.15,10006000,449.15 -2008-09-18,422.64,439.18,410.50,439.08,8589400,439.08 -2008-09-17,438.48,439.14,413.44,414.49,9126900,414.49 -2008-09-16,425.96,449.28,425.49,442.93,6990700,442.93 -2008-09-15,424.00,441.97,423.71,433.86,6567400,433.86 -2008-09-12,430.21,441.99,429.00,437.66,6028000,437.66 -2008-09-11,408.35,435.09,406.38,433.75,6471400,433.75 -2008-09-10,424.47,424.48,409.68,414.16,6226800,414.16 -2008-09-09,423.17,432.38,415.00,418.66,7229600,418.66 -2008-09-08,452.02,452.94,417.55,419.95,9017900,419.95 -2008-09-05,445.49,452.46,440.08,444.25,4534300,444.25 -2008-09-04,460.00,463.24,449.40,450.26,4848500,450.26 -2008-09-03,468.73,474.29,459.58,464.41,4314600,464.41 -2008-09-02,476.77,482.18,461.42,465.25,6111500,465.25 -2008-08-29,469.75,471.01,462.33,463.29,3848200,463.29 -2008-08-28,472.49,476.45,470.33,473.78,3029700,473.78 -2008-08-27,473.73,474.83,464.84,468.58,4387100,468.58 -2008-08-26,483.46,483.46,470.59,474.16,3308200,474.16 -2008-08-25,486.11,497.00,481.50,483.01,2014300,483.01 -2008-08-22,491.50,494.88,489.48,490.59,2297200,490.59 -2008-08-21,482.92,489.90,479.27,486.53,3514100,486.53 -2008-08-20,494.72,496.69,482.57,485.00,3982100,485.00 -2008-08-19,490.43,498.28,486.63,490.50,3046500,490.50 -2008-08-18,509.84,510.00,495.51,498.30,3333900,498.30 -2008-08-15,506.99,510.66,505.50,510.15,3545700,510.15 -2008-08-14,497.70,507.61,496.29,505.49,2918600,505.49 -2008-08-13,501.60,503.54,493.88,500.03,3625500,500.03 -2008-08-12,502.00,506.13,498.00,502.61,2755700,502.61 -2008-08-11,492.47,508.88,491.78,500.84,4239300,500.84 -2008-08-08,480.15,495.75,475.69,495.01,3739300,495.01 -2008-08-07,482.00,484.00,476.41,479.12,2773800,479.12 -2008-08-06,478.37,489.77,472.51,486.34,3375800,486.34 -2008-08-05,467.59,480.08,466.33,479.85,3584500,479.85 -2008-08-04,468.12,473.01,461.90,463.00,2487000,463.00 -2008-08-01,472.51,473.22,462.50,467.86,3007900,467.86 -2008-07-31,474.56,480.89,471.44,473.75,2865100,473.75 -2008-07-30,485.50,486.02,472.81,482.70,3490700,482.70 -2008-07-29,479.30,487.26,478.00,483.11,2802800,483.11 -2008-07-28,492.09,492.09,475.13,477.12,3160000,477.12 -2008-07-25,486.49,493.13,481.50,491.98,3183500,491.98 -2008-07-24,496.70,496.87,475.62,475.62,3540900,475.62 -2008-07-23,481.61,497.23,478.10,489.22,4894100,489.22 -2008-07-22,466.72,480.25,465.60,477.11,4691500,477.11 -2008-07-21,480.88,484.09,465.70,468.80,5901500,468.80 -2008-07-18,498.35,498.98,478.19,481.32,11292400,481.32 -2008-07-17,534.16,537.05,524.50,533.44,8787400,533.44 -2008-07-16,514.04,536.50,510.60,535.60,4742200,535.60 -2008-07-15,516.28,527.50,501.10,516.09,6071000,516.09 -2008-07-14,539.00,540.06,515.45,521.62,4424800,521.62 -2008-07-11,536.50,539.50,519.43,533.80,4981400,533.80 -2008-07-10,545.00,549.50,530.72,540.57,4331700,540.57 -2008-07-09,550.76,555.68,540.73,541.55,4154000,541.55 -2008-07-08,545.99,555.19,540.00,554.53,4932400,554.53 -2008-07-07,542.30,549.00,535.60,543.91,4255200,543.91 -2008-07-03,530.88,539.23,527.50,537.00,2400500,537.00 -2008-07-02,536.51,540.38,526.06,527.04,4223000,527.04 -2008-07-01,519.58,536.72,517.00,534.73,4959900,534.73 -2008-06-30,532.47,538.00,523.06,526.42,3765300,526.42 -2008-06-27,527.68,530.00,515.09,528.07,5436900,528.07 -2008-06-26,544.10,544.93,528.26,528.82,5659500,528.82 -2008-06-25,544.97,557.80,543.67,551.00,4122200,551.00 -2008-06-24,545.14,551.19,535.10,542.30,4672600,542.30 -2008-06-23,545.36,553.15,542.02,545.21,3635900,545.21 -2008-06-20,556.98,556.98,544.51,546.43,5983100,546.43 -2008-06-19,555.35,563.78,550.81,560.20,5683100,560.20 -2008-06-18,564.51,568.99,559.16,562.38,3381200,562.38 -2008-06-17,576.35,578.07,568.38,569.46,3462900,569.46 -2008-06-16,566.50,579.10,566.50,572.81,3542800,572.81 -2008-06-13,561.49,575.70,561.34,571.51,6184400,571.51 -2008-06-12,548.76,558.00,546.88,552.95,5491600,552.95 -2008-06-11,556.24,557.34,544.46,545.20,3812900,545.20 -2008-06-10,549.56,558.82,546.78,554.17,3657400,554.17 -2008-06-09,568.06,570.00,545.40,557.87,5288300,557.87 -2008-06-06,579.75,580.72,567.00,567.00,4734500,567.00 -2008-06-05,577.08,588.04,576.21,586.30,3916700,586.30 -2008-06-04,565.33,578.00,564.55,572.22,3363200,572.22 -2008-06-03,576.50,580.50,560.61,567.30,4305300,567.30 -2008-06-02,582.50,583.89,571.27,575.00,3674200,575.00 -2008-05-30,583.47,589.92,581.30,585.80,3225200,585.80 -2008-05-29,574.79,585.88,573.20,583.00,4845000,583.00 -2008-05-28,567.94,571.49,561.10,568.24,4050400,568.24 -2008-05-27,544.96,562.60,543.85,560.90,3865500,560.90 -2008-05-23,546.96,553.00,537.81,544.62,4431500,544.62 -2008-05-22,551.95,554.21,540.25,549.46,5076300,549.46 -2008-05-21,578.52,581.41,547.89,549.99,6468100,549.99 -2008-05-20,574.63,582.48,572.91,578.60,3313600,578.60 -2008-05-19,578.55,588.88,573.52,577.52,5604500,577.52 -2008-05-16,581.43,584.68,578.32,580.07,4274100,580.07 -2008-05-15,579.00,582.95,575.61,581.00,4342700,581.00 -2008-05-14,586.49,591.19,575.25,576.30,4375800,576.30 -2008-05-13,586.23,587.95,578.55,583.00,5163500,583.00 -2008-05-12,574.75,586.75,568.91,584.94,4863900,584.94 -2008-05-09,579.00,585.00,571.30,573.20,4484900,573.20 -2008-05-08,586.20,589.30,578.91,583.01,5122900,583.01 -2008-05-07,590.27,599.49,576.43,579.00,6613000,579.00 -2008-05-06,591.00,592.00,583.00,586.36,4629300,586.36 -2008-05-05,598.86,599.00,587.13,594.90,6281000,594.90 -2008-05-02,598.49,602.45,579.30,581.29,6998800,581.29 -2008-05-01,578.31,594.93,576.97,593.08,6602800,593.08 -2008-04-30,562.21,584.86,558.47,574.29,7903000,574.29 -2008-04-29,550.83,563.40,550.01,558.47,4346000,558.47 -2008-04-28,545.88,556.81,539.00,552.12,4008600,552.12 -2008-04-25,549.02,553.00,542.73,544.06,4164400,544.06 -2008-04-24,551.29,554.49,540.02,543.04,4135100,543.04 -2008-04-23,557.94,559.31,540.95,546.49,4921500,546.49 -2008-04-22,537.57,560.83,537.56,555.00,7938500,555.00 -2008-04-21,539.39,542.59,530.29,537.79,7439700,537.79 -2008-04-18,535.21,547.70,524.77,539.41,18235600,539.41 -2008-04-17,455.63,459.37,446.52,449.54,13353000,449.54 -2008-04-16,444.40,458.28,441.00,455.03,7620200,455.03 -2008-04-15,458.13,459.72,443.72,446.84,4577600,446.84 -2008-04-14,457.16,457.45,450.15,451.66,3842600,451.66 -2008-04-11,464.07,467.26,455.01,457.45,4151500,457.45 -2008-04-10,464.96,473.86,461.85,469.08,5072400,469.08 -2008-04-09,469.13,472.00,457.54,464.19,6048100,464.19 -2008-04-08,473.04,474.14,462.01,467.81,4547000,467.81 -2008-04-07,477.03,485.44,473.53,476.82,5943500,476.82 -2008-04-04,457.01,477.83,456.20,471.09,5897200,471.09 -2008-04-03,461.73,463.29,448.13,455.12,6778400,455.12 -2008-04-02,469.90,475.74,460.39,465.70,5999000,465.70 -2008-04-01,447.74,466.50,446.87,465.71,6093100,465.71 -2008-03-31,435.64,442.69,432.01,440.47,4446400,440.47 -2008-03-28,447.46,453.57,434.31,438.08,4376200,438.08 -2008-03-27,446.00,448.61,440.49,444.08,5832200,444.08 -2008-03-26,452.59,462.87,449.29,458.19,5214200,458.19 -2008-03-25,457.46,457.47,446.00,450.78,5831600,450.78 -2008-03-24,438.43,465.78,437.72,460.56,6763500,460.56 -2008-03-20,427.32,435.70,417.50,433.55,9900400,433.55 -2008-03-19,441.11,447.50,431.67,432.00,6179000,432.00 -2008-03-18,428.98,440.84,425.53,439.16,7237200,439.16 -2008-03-17,427.99,433.71,412.11,419.87,7888200,419.87 -2008-03-14,442.98,449.34,430.62,437.92,6574400,437.92 -2008-03-13,432.67,446.98,428.78,443.01,7726600,443.01 -2008-03-12,440.01,447.88,438.07,440.18,6651900,440.18 -2008-03-11,425.26,440.15,424.65,439.84,8826900,439.84 -2008-03-10,428.83,431.00,413.04,413.62,7987600,413.62 -2008-03-07,428.88,440.00,426.24,433.35,8071800,433.35 -2008-03-06,447.69,453.30,431.18,432.70,7470100,432.70 -2008-03-05,445.25,454.17,444.00,447.70,7436600,447.70 -2008-03-04,450.95,453.36,435.78,444.60,13621700,444.60 -2008-03-03,471.51,472.72,450.11,457.02,7554500,457.02 -2008-02-29,471.87,479.74,464.65,471.18,9425400,471.18 -2008-02-28,470.50,479.09,467.36,475.39,6586900,475.39 -2008-02-27,460.13,475.49,459.64,472.86,10121900,472.86 -2008-02-26,461.20,466.47,446.85,464.19,23287300,464.19 -2008-02-25,505.95,506.50,485.74,486.44,8350800,486.44 -2008-02-22,502.06,509.00,497.55,507.80,5515900,507.80 -2008-02-21,512.85,513.21,499.50,502.86,5677800,502.86 -2008-02-20,503.51,511.01,498.82,509.00,6662200,509.00 -2008-02-19,534.94,535.06,506.50,508.95,6350400,508.95 -2008-02-15,528.31,532.66,524.33,529.64,5240100,529.64 -2008-02-14,538.35,541.04,531.00,532.25,6476700,532.25 -2008-02-13,522.50,534.99,518.69,534.62,6624700,534.62 -2008-02-12,523.39,530.60,513.03,518.09,6662300,518.09 -2008-02-11,520.52,523.71,513.40,521.16,5826000,521.16 -2008-02-08,509.41,517.73,508.70,516.69,6828900,516.69 -2008-02-07,496.86,514.19,494.76,504.95,7928900,504.95 -2008-02-06,511.14,511.17,497.93,501.71,7636400,501.71 -2008-02-05,489.43,509.00,488.52,506.80,11203300,506.80 -2008-02-04,509.07,512.78,492.55,495.43,13157100,495.43 -2008-02-01,528.67,536.67,510.00,515.90,17600500,515.90 -2008-01-31,539.01,573.00,534.29,564.30,14871300,564.30 -2008-01-30,549.19,560.43,543.51,548.27,7939600,548.27 -2008-01-29,560.47,561.33,540.67,550.52,6283000,550.52 -2008-01-28,570.97,572.24,548.60,555.98,5816700,555.98 -2008-01-25,591.81,595.00,566.18,566.40,6966000,566.40 -2008-01-24,558.80,579.69,554.14,574.49,9400900,574.49 -2008-01-23,560.71,568.00,519.00,548.62,16965700,548.62 -2008-01-22,562.03,597.50,561.20,584.35,9501500,584.35 -2008-01-18,608.36,609.99,598.45,600.25,8539600,600.25 -2008-01-17,620.76,625.74,598.01,600.79,8216800,600.79 -2008-01-16,628.97,639.99,601.93,615.95,10560000,615.95 -2008-01-15,645.90,649.05,635.38,637.65,5568200,637.65 -2008-01-14,651.14,657.40,645.25,653.82,4447500,653.82 -2008-01-11,642.70,649.47,630.11,638.25,4977000,638.25 -2008-01-10,645.01,657.20,640.11,646.73,6334200,646.73 -2008-01-09,630.04,653.34,622.51,653.20,6739700,653.20 -2008-01-08,653.00,659.96,631.00,631.68,5339100,631.68 -2008-01-07,653.94,662.28,637.35,649.25,6403400,649.25 -2008-01-04,679.69,680.96,655.00,657.00,5359800,657.00 -2008-01-03,685.26,686.85,676.52,685.33,3252500,685.33 -2008-01-02,692.87,697.37,677.73,685.19,4306900,685.19 -2007-12-31,698.57,702.49,690.58,691.48,2376200,691.48 -2007-12-28,704.93,707.95,696.54,702.53,2562700,702.53 -2007-12-27,707.07,716.00,700.74,700.74,2942500,700.74 -2007-12-26,698.99,713.22,698.21,710.84,2530000,710.84 -2007-12-24,694.99,700.73,693.06,700.73,1628400,700.73 -2007-12-21,697.88,699.26,693.24,696.69,5382000,696.69 -2007-12-20,685.83,691.00,680.61,689.69,4422200,689.69 -2007-12-19,674.21,679.50,669.00,677.37,4421100,677.37 -2007-12-18,674.16,676.71,652.50,673.35,7166700,673.35 -2007-12-17,688.00,695.42,663.67,669.23,5486000,669.23 -2007-12-14,687.51,699.70,687.26,689.96,3673500,689.96 -2007-12-13,696.31,697.62,681.21,694.05,5040800,694.05 -2007-12-12,714.00,714.32,688.50,699.35,6159100,699.35 -2007-12-11,719.94,720.99,698.78,699.20,6139100,699.20 -2007-12-10,715.99,724.80,714.00,718.42,3856200,718.42 -2007-12-07,714.99,718.00,710.50,714.87,3852100,714.87 -2007-12-06,697.80,716.56,697.01,715.26,4909000,715.26 -2007-12-05,692.73,698.93,687.50,698.51,4209600,698.51 -2007-12-04,678.31,692.00,677.12,684.16,4231800,684.16 -2007-12-03,691.01,695.00,681.14,681.53,4325100,681.53 -2007-11-30,711.00,711.06,682.11,693.00,7895500,693.00 -2007-11-29,690.75,702.79,687.77,697.00,6208000,697.00 -2007-11-28,682.11,694.30,672.14,692.26,7916500,692.26 -2007-11-27,674.80,676.43,650.26,673.57,8904500,673.57 -2007-11-26,680.20,693.40,665.00,666.00,6790100,666.00 -2007-11-23,670.00,678.28,668.11,676.70,2738700,676.70 -2007-11-21,643.77,669.97,642.08,660.52,7013500,660.52 -2007-11-20,636.48,659.10,632.87,648.54,9840600,648.54 -2007-11-19,629.59,636.77,618.50,625.85,5527400,625.85 -2007-11-16,633.94,635.49,616.02,633.63,9042800,633.63 -2007-11-15,638.57,647.50,624.00,629.65,6967700,629.65 -2007-11-14,673.28,675.49,636.27,641.68,8094700,641.68 -2007-11-13,644.99,660.92,632.07,660.55,8426100,660.55 -2007-11-12,657.74,669.93,626.21,632.07,10227300,632.07 -2007-11-09,675.78,681.88,661.21,663.97,11388100,663.97 -2007-11-08,734.60,734.89,677.18,693.84,16512200,693.84 -2007-11-07,741.13,747.24,723.14,732.94,8252900,732.94 -2007-11-06,737.56,741.79,725.00,741.79,8436300,741.79 -2007-11-05,706.99,730.23,706.07,725.65,8883700,725.65 -2007-11-02,710.51,713.58,697.34,711.25,5841500,711.25 -2007-11-01,702.79,713.72,701.78,703.21,6527200,703.21 -2007-10-31,700.69,707.00,696.04,707.00,6876800,707.00 -2007-10-30,677.51,699.91,677.51,694.77,6900600,694.77 -2007-10-29,677.77,680.00,672.09,679.23,3066300,679.23 -2007-10-26,674.03,676.54,668.06,674.60,3353900,674.60 -2007-10-25,678.68,678.97,663.55,668.51,5795500,668.51 -2007-10-24,672.71,677.47,659.56,675.82,7404200,675.82 -2007-10-23,661.25,677.60,660.00,675.77,6793700,675.77 -2007-10-22,638.67,655.00,636.28,650.75,6664400,650.75 -2007-10-19,654.56,658.49,643.23,644.71,15789000,644.71 -2007-10-18,635.41,641.37,628.50,639.62,12289200,639.62 -2007-10-17,630.45,634.00,621.59,633.48,6030500,633.48 -2007-10-16,618.49,625.92,611.99,616.00,6025300,616.00 -2007-10-15,638.47,639.86,615.55,620.11,6943800,620.11 -2007-10-12,623.98,638.40,618.24,637.39,6823700,637.39 -2007-10-11,633.64,641.41,609.00,622.00,11799000,622.00 -2007-10-10,621.36,625.68,616.80,625.39,5385600,625.39 -2007-10-09,615.11,623.78,608.39,615.18,8767800,615.18 -2007-10-08,595.00,610.26,593.95,609.62,5028000,609.62 -2007-10-05,587.11,596.00,587.01,594.05,5068700,594.05 -2007-10-04,585.09,585.09,577.06,579.03,2986700,579.03 -2007-10-03,586.25,588.99,580.36,584.02,3879500,584.02 -2007-10-02,583.38,596.81,580.01,584.39,7067500,584.39 -2007-10-01,569.97,584.35,569.61,582.55,4711300,582.55 -2007-09-28,567.00,569.55,564.12,567.27,2639500,567.27 -2007-09-27,571.73,571.74,565.78,567.50,2056300,567.50 -2007-09-26,570.40,571.79,563.81,568.16,3346100,568.16 -2007-09-25,564.00,569.56,562.86,569.00,2730600,569.00 -2007-09-24,561.00,571.46,560.00,568.02,5297000,568.02 -2007-09-21,556.34,560.79,552.83,560.10,8011700,560.10 -2007-09-20,547.00,556.80,546.03,552.83,5525000,552.83 -2007-09-19,539.27,549.45,538.86,546.85,5526900,546.85 -2007-09-18,526.52,537.25,524.27,535.27,4215700,535.27 -2007-09-17,526.53,529.28,524.07,525.30,2197500,525.30 -2007-09-14,523.20,530.27,522.22,528.75,2764900,528.75 -2007-09-13,524.06,527.21,523.22,524.78,1891100,524.78 -2007-09-12,520.53,527.98,519.00,522.65,2986000,522.65 -2007-09-11,516.99,521.65,515.73,521.33,2703600,521.33 -2007-09-10,521.28,522.07,510.88,514.48,3225800,514.48 -2007-09-07,517.86,521.24,516.80,519.35,3663600,519.35 -2007-09-06,529.36,529.83,518.24,523.52,3625900,523.52 -2007-09-05,523.40,529.48,522.25,527.80,3312900,527.80 -2007-09-04,515.02,528.00,514.62,525.15,3693700,525.15 -2007-08-31,513.10,516.50,511.47,515.25,2977600,515.25 -2007-08-30,512.36,515.40,510.58,511.40,2651700,511.40 -2007-08-29,507.84,513.30,507.23,512.88,2549300,512.88 -2007-08-28,511.53,514.98,505.79,506.40,3273900,506.40 -2007-08-27,514.43,517.45,511.40,513.26,2325100,513.26 -2007-08-24,512.61,515.55,508.50,515.00,2472700,515.00 -2007-08-23,516.00,516.13,507.00,512.19,3076700,512.19 -2007-08-22,509.96,516.25,509.25,512.75,3252700,512.75 -2007-08-21,498.94,508.16,497.77,506.61,3610600,506.61 -2007-08-20,502.46,502.56,496.00,497.92,2697300,497.92 -2007-08-17,497.44,501.00,491.65,500.04,5479400,500.04 -2007-08-16,492.02,496.43,480.46,491.52,8645600,491.52 -2007-08-15,509.00,511.69,496.71,497.55,5409500,497.55 -2007-08-14,515.72,517.40,508.00,508.60,3633700,508.60 -2007-08-13,519.54,519.75,513.03,515.50,3179300,515.50 -2007-08-10,510.18,518.72,505.63,515.75,5875200,515.75 -2007-08-09,520.80,526.82,514.63,514.73,4846500,514.73 -2007-08-08,519.34,525.78,517.09,525.78,4068800,525.78 -2007-08-07,509.75,519.88,509.04,516.02,4264300,516.02 -2007-08-06,503.00,510.15,502.50,510.00,3651500,510.00 -2007-08-03,510.05,513.20,503.00,503.00,3176200,503.00 -2007-08-02,513.72,514.99,509.00,511.01,3154900,511.01 -2007-08-01,510.50,516.51,508.14,512.94,4421500,512.94 -2007-07-31,520.23,520.44,510.00,510.00,4270500,510.00 -2007-07-30,512.92,519.34,510.50,516.11,3963300,516.11 -2007-07-27,508.53,516.62,505.50,511.89,5509100,511.89 -2007-07-26,508.74,512.59,498.88,508.00,6883400,508.00 -2007-07-25,516.98,517.02,505.56,509.76,5545000,509.76 -2007-07-24,509.30,518.69,507.11,514.00,5572100,514.00 -2007-07-23,519.01,520.00,512.15,512.51,6356700,512.51 -2007-07-20,511.90,523.18,509.50,520.12,17772300,520.12 -2007-07-19,553.46,553.52,542.24,548.59,11127200,548.59 -2007-07-18,553.89,554.50,543.81,549.50,6080000,549.50 -2007-07-17,555.04,557.73,552.38,555.00,4328600,555.00 -2007-07-16,550.30,558.58,549.31,552.99,6599500,552.99 -2007-07-13,547.91,552.67,547.25,552.16,5237100,552.16 -2007-07-12,545.86,547.32,540.22,545.33,3441600,545.33 -2007-07-11,543.61,546.50,540.01,544.47,3309300,544.47 -2007-07-10,543.79,547.00,541.65,543.34,3856000,543.34 -2007-07-09,543.00,548.74,540.26,542.56,3729800,542.56 -2007-07-06,541.25,543.87,538.73,539.40,2747000,539.40 -2007-07-05,535.56,544.40,532.15,541.63,4942900,541.63 -2007-07-03,531.06,534.40,527.50,534.34,1871800,534.34 -2007-07-02,525.49,531.85,524.20,530.38,3487600,530.38 -2007-06-29,526.02,527.40,519.46,522.70,3880600,522.70 -2007-06-28,524.88,529.50,523.80,525.01,4168400,525.01 -2007-06-27,525.00,527.99,519.56,526.29,6123100,526.29 -2007-06-26,532.73,533.20,526.24,530.26,5689500,530.26 -2007-06-25,528.98,534.99,523.38,527.42,7925000,527.42 -2007-06-22,516.42,524.99,516.10,524.98,7203700,524.98 -2007-06-21,510.98,515.29,506.28,514.11,4409700,514.11 -2007-06-20,516.96,518.75,509.06,509.97,4338200,509.97 -2007-06-19,514.01,517.25,511.54,514.31,4355300,514.31 -2007-06-18,506.18,516.00,504.24,515.20,4835900,515.20 -2007-06-15,508.19,509.00,501.23,505.89,6174100,505.89 -2007-06-14,505.38,505.88,501.70,502.84,4621200,502.84 -2007-06-13,507.09,508.54,498.69,505.24,7034000,505.24 -2007-06-12,508.71,511.67,503.17,504.77,6419500,504.77 -2007-06-11,514.02,518.25,510.00,511.34,4647700,511.34 -2007-06-08,516.20,519.64,509.46,515.49,6358200,515.49 -2007-06-07,519.75,526.50,512.51,515.06,10630500,515.06 -2007-06-06,516.75,520.78,515.26,518.25,7886700,518.25 -2007-06-05,509.75,519.00,506.61,518.84,10447100,518.84 -2007-06-04,497.91,510.51,497.59,507.07,7101000,507.07 -2007-06-01,501.00,505.02,497.93,500.40,4799000,500.40 -2007-05-31,500.56,508.78,497.06,497.91,8924300,497.91 -2007-05-30,484.50,498.84,483.00,498.60,7245800,498.60 -2007-05-29,485.00,491.80,484.00,487.11,5218000,487.11 -2007-05-25,479.70,484.95,477.27,483.52,5348500,483.52 -2007-05-24,475.15,479.20,471.50,474.33,4173600,474.33 -2007-05-23,480.82,483.41,473.75,473.97,5060200,473.97 -2007-05-22,473.00,479.01,473.00,475.86,3839000,475.86 -2007-05-21,469.53,479.20,466.72,470.60,6159300,470.60 -2007-05-18,472.03,472.70,469.75,470.32,3695900,470.32 -2007-05-17,472.46,475.22,470.81,470.96,4660600,470.96 -2007-05-16,462.00,473.14,459.02,472.61,6554200,472.61 -2007-05-15,461.96,462.54,457.41,458.00,4119000,458.00 -2007-05-14,465.48,467.51,460.00,461.78,3872700,461.78 -2007-05-11,461.83,467.00,461.00,466.74,2944100,466.74 -2007-05-10,467.04,469.49,461.02,461.47,3686300,461.47 -2007-05-09,466.15,471.73,463.88,469.25,3889900,469.25 -2007-05-08,466.13,468.17,464.73,466.81,2905100,466.81 -2007-05-07,472.14,472.82,466.47,467.27,3020100,467.27 -2007-05-04,470.12,474.84,465.88,471.12,3950000,471.12 -2007-05-03,466.22,474.07,465.29,473.23,3594200,473.23 -2007-05-02,468.65,471.08,465.73,465.78,3062700,465.78 -2007-05-01,472.19,472.81,464.17,469.00,3658200,469.00 -2007-04-30,479.15,481.35,471.38,471.38,3641200,471.38 -2007-04-27,480.07,482.40,478.33,479.01,2925700,479.01 -2007-04-26,478.10,484.45,477.11,481.18,4124900,481.18 -2007-04-25,480.00,481.37,476.11,477.99,3966800,477.99 -2007-04-24,478.61,479.98,475.55,477.53,3694700,477.53 -2007-04-23,480.10,485.00,478.26,479.08,5674600,479.08 -2007-04-20,490.52,492.50,482.02,482.48,12161500,482.48 -2007-04-19,474.50,481.95,469.59,471.65,11009600,471.65 -2007-04-18,471.26,479.90,469.53,476.01,5670500,476.01 -2007-04-17,473.80,476.39,471.60,472.80,3210100,472.80 -2007-04-16,468.46,476.99,468.15,474.27,5077900,474.27 -2007-04-13,468.45,468.77,463.36,466.29,2794800,466.29 -2007-04-12,464.00,468.00,462.24,467.39,2707900,467.39 -2007-04-11,466.06,469.40,462.61,464.53,3812000,464.53 -2007-04-10,467.09,470.79,465.16,466.50,2979300,466.50 -2007-04-09,472.98,473.00,465.59,468.21,3062100,468.21 -2007-04-05,471.30,472.09,469.62,471.51,2715800,471.51 -2007-04-04,472.14,473.00,469.58,471.02,3778800,471.02 -2007-04-03,464.05,474.25,464.00,472.60,6501800,472.60 -2007-04-02,457.76,458.53,452.12,458.53,3448500,458.53 -2007-03-30,462.10,463.40,456.14,458.16,3380200,458.16 -2007-03-29,464.55,466.00,455.00,460.92,3988500,460.92 -2007-03-28,461.87,465.44,460.15,461.88,4591600,461.88 -2007-03-27,463.55,465.23,460.34,463.62,3741200,463.62 -2007-03-26,460.55,465.00,455.62,465.00,4710300,465.00 -2007-03-23,461.45,463.39,457.08,461.83,4111300,461.83 -2007-03-22,455.61,462.17,452.53,462.04,5680700,462.04 -2007-03-21,445.30,456.57,445.21,456.55,5798300,456.55 -2007-03-20,445.79,447.60,443.60,445.28,3421500,445.28 -2007-03-19,443.25,448.50,440.63,447.23,5197700,447.23 -2007-03-16,445.65,446.70,439.89,440.85,5659100,440.85 -2007-03-15,447.86,449.82,443.94,446.19,3944200,446.19 -2007-03-14,443.23,448.66,439.00,448.00,8016900,448.00 -2007-03-13,450.11,451.93,442.83,443.03,6377300,443.03 -2007-03-12,452.57,455.25,451.11,454.75,3465400,454.75 -2007-03-09,458.00,458.40,450.10,452.96,4977700,452.96 -2007-03-08,459.22,465.50,454.10,454.72,5362800,454.72 -2007-03-07,462.69,463.14,454.29,455.64,6534100,455.64 -2007-03-06,447.47,459.00,447.38,457.55,7533700,457.55 -2007-03-05,437.02,445.50,437.00,440.95,6355100,440.95 -2007-03-02,445.11,448.70,438.68,438.68,6583600,438.68 -2007-03-01,442.67,452.42,440.00,448.23,8685200,448.23 -2007-02-28,450.41,453.67,443.04,449.45,8032300,449.45 -2007-02-27,455.00,459.80,447.17,448.77,9312800,448.77 -2007-02-26,472.83,475.25,463.75,464.93,3969900,464.93 -2007-02-23,475.75,476.95,467.80,470.62,3882600,470.62 -2007-02-22,478.69,484.24,474.39,475.85,5743900,475.85 -2007-02-21,469.84,478.68,467.74,475.86,5640600,475.86 -2007-02-20,468.47,472.75,464.71,472.10,4067600,472.10 -2007-02-16,462.80,470.15,462.06,469.94,6177000,469.94 -2007-02-15,466.00,466.13,460.72,461.47,4042400,461.47 -2007-02-14,460.00,469.13,459.22,465.93,5698800,465.93 -2007-02-13,459.15,462.78,457.26,459.10,4062600,459.10 -2007-02-12,460.68,462.39,455.02,458.29,5754500,458.29 -2007-02-09,471.65,472.68,461.50,461.89,4858600,461.89 -2007-02-08,468.05,473.75,465.15,471.03,4076700,471.03 -2007-02-07,473.82,474.35,468.78,470.01,4119800,470.01 -2007-02-06,468.10,473.30,467.26,471.48,5321900,471.48 -2007-02-05,477.50,478.00,466.19,467.16,7206900,467.16 -2007-02-02,482.61,485.00,477.81,481.50,6286500,481.50 -2007-02-01,506.00,506.01,481.53,481.75,15658700,481.75 -2007-01-31,496.49,505.00,495.51,501.50,12206100,501.50 -2007-01-30,494.00,498.00,491.22,494.32,4180500,494.32 -2007-01-29,498.00,498.75,490.50,492.47,4775700,492.47 -2007-01-26,490.93,497.90,487.03,495.84,5496500,495.84 -2007-01-25,501.00,504.50,485.66,488.09,6368500,488.09 -2007-01-24,484.45,499.54,483.29,499.07,6059300,499.07 -2007-01-23,480.79,484.75,477.29,479.05,4665500,479.05 -2007-01-22,492.50,492.65,478.50,480.84,5404300,480.84 -2007-01-19,487.98,490.76,486.74,489.75,4978300,489.75 -2007-01-18,494.52,496.48,487.43,487.83,5932000,487.83 -2007-01-17,503.39,507.77,494.38,497.28,6699100,497.28 -2007-01-16,507.55,513.00,503.30,504.28,7568900,504.28 -2007-01-12,501.99,505.00,500.00,505.00,4473700,505.00 -2007-01-11,497.20,501.75,496.18,499.72,7208200,499.72 -2007-01-10,484.43,493.55,482.04,489.46,5968500,489.46 -2007-01-09,485.45,488.25,481.20,485.50,5381400,485.50 -2007-01-08,487.69,489.87,482.20,483.58,4754400,483.58 -2007-01-05,482.50,487.50,478.11,487.19,6872100,487.19 -2007-01-04,469.00,483.95,468.35,483.26,7887600,483.26 -2007-01-03,466.00,476.66,461.11,467.59,7706500,467.59 -2006-12-29,462.10,464.47,459.86,460.48,2559200,460.48 -2006-12-28,467.12,468.58,462.25,462.56,3116200,462.56 -2006-12-27,460.00,468.08,459.10,468.03,4231500,468.03 -2006-12-26,456.52,459.47,454.59,457.53,2074300,457.53 -2006-12-22,457.50,458.64,452.73,455.58,3988300,455.58 -2006-12-21,464.18,465.25,452.34,456.20,6953300,456.20 -2006-12-20,470.00,471.50,462.33,462.90,4367800,462.90 -2006-12-19,461.72,469.31,458.50,468.63,6587000,468.63 -2006-12-18,482.51,482.74,460.72,462.80,8016600,462.80 -2006-12-15,482.64,484.11,479.84,480.30,5190800,480.30 -2006-12-14,480.25,483.75,477.26,482.12,4748900,482.12 -2006-12-13,484.69,485.50,477.02,478.99,4662100,478.99 -2006-12-12,483.85,486.36,480.28,481.78,4181000,481.78 -2006-12-11,484.92,488.90,483.80,483.93,3263400,483.93 -2006-12-08,481.94,488.60,480.00,484.11,3974900,484.11 -2006-12-07,490.23,491.80,482.42,482.64,4664300,482.64 -2006-12-06,486.96,492.40,484.52,488.71,4450300,488.71 -2006-12-05,487.40,489.44,484.89,487.00,4103000,487.00 -2006-12-04,483.00,487.43,479.35,484.85,4899900,484.85 -2006-12-01,485.98,488.39,478.50,480.80,5631400,480.80 -2006-11-30,484.19,490.40,481.55,484.81,5577500,484.81 -2006-11-29,494.24,494.74,482.25,484.65,6315300,484.65 -2006-11-28,481.13,489.86,477.03,489.50,7797600,489.50 -2006-11-27,501.37,501.78,484.75,484.75,7324700,484.75 -2006-11-24,504.50,507.50,504.00,505.00,1732700,505.00 -2006-11-22,510.97,513.00,505.78,508.01,4500700,508.01 -2006-11-21,496.54,510.00,495.83,509.65,8427500,509.65 -2006-11-20,498.40,498.40,492.65,495.05,5124500,495.05 -2006-11-17,493.25,499.66,493.00,498.79,5511000,498.79 -2006-11-16,495.00,497.68,492.56,495.90,5092600,495.90 -2006-11-15,493.43,499.85,491.93,491.93,8370700,491.93 -2006-11-14,480.70,489.95,480.50,489.30,7223400,489.30 -2006-11-13,474.90,481.17,474.14,481.03,4341900,481.03 -2006-11-10,473.78,474.72,470.29,473.55,2796700,473.55 -2006-11-09,476.50,479.49,471.86,472.63,4879200,472.63 -2006-11-08,470.35,481.74,468.60,475.00,7965000,475.00 -2006-11-07,476.95,479.02,471.77,472.57,4897100,472.57 -2006-11-06,473.77,479.66,472.33,476.95,4991500,476.95 -2006-11-03,472.23,473.75,465.06,471.80,4907700,471.80 -2006-11-02,467.50,473.73,466.38,469.91,5236700,469.91 -2006-11-01,478.76,479.13,465.26,467.50,5426300,467.50 -2006-10-31,478.06,482.16,473.84,476.39,6285400,476.39 -2006-10-30,474.82,480.46,470.01,476.57,6563100,476.57 -2006-10-27,483.90,485.24,472.49,475.20,6604000,475.20 -2006-10-26,487.68,491.96,484.20,485.10,7031700,485.10 -2006-10-25,477.49,488.50,475.11,486.60,9187500,486.60 -2006-10-24,476.28,477.86,471.41,473.31,8660200,473.31 -2006-10-23,462.28,484.64,460.37,480.78,15104500,480.78 -2006-10-20,458.99,460.10,453.59,459.67,11647900,459.67 -2006-10-19,420.23,429.50,419.57,426.06,11503500,426.06 -2006-10-18,422.99,424.75,417.50,419.31,6017300,419.31 -2006-10-17,420.30,423.75,416.70,420.64,5211000,420.64 -2006-10-16,427.70,429.20,421.34,421.75,4319400,421.75 -2006-10-13,427.76,429.50,425.56,427.30,3622500,427.30 -2006-10-12,428.56,429.68,424.00,427.44,4844000,427.44 -2006-10-11,425.02,429.91,423.76,426.50,5635400,426.50 -2006-10-10,431.56,437.85,422.39,426.65,9788600,426.65 -2006-10-09,424.80,431.95,423.42,429.00,7583300,429.00 -2006-10-06,410.22,421.91,409.75,420.50,7336500,420.50 -2006-10-05,414.70,418.24,410.86,411.81,5789800,411.81 -2006-10-04,404.97,415.77,403.05,415.70,6661800,415.70 -2006-10-03,401.29,406.46,398.19,404.04,5464700,404.04 -2006-10-02,401.90,406.00,400.80,401.44,3651900,401.44 -2006-09-29,405.13,405.62,401.41,401.90,3310900,401.90 -2006-09-28,404.08,406.98,400.54,403.58,5107400,403.58 -2006-09-27,406.30,411.22,402.37,402.92,5876700,402.92 -2006-09-26,405.50,407.68,401.77,406.87,5289400,406.87 -2006-09-25,405.58,409.45,402.50,403.98,5737300,403.98 -2006-09-22,404.98,407.45,401.36,403.78,4649600,403.78 -2006-09-21,400.30,408.45,399.86,406.85,10692100,406.85 -2006-09-20,407.10,407.39,394.62,397.00,9147800,397.00 -2006-09-19,415.46,415.49,392.74,403.81,14292900,403.81 -2006-09-18,410.00,418.69,409.47,414.69,7106700,414.69 -2006-09-15,407.48,410.05,406.74,409.88,7838200,409.88 -2006-09-14,404.30,406.28,401.93,403.98,5366100,403.98 -2006-09-13,395.15,406.76,395.10,406.57,9768200,406.57 -2006-09-12,385.00,392.73,384.88,391.90,5442200,391.90 -2006-09-11,378.26,384.69,377.77,384.09,4529200,384.09 -2006-09-08,376.72,380.79,376.72,377.85,3083400,377.85 -2006-09-07,379.39,381.75,377.40,378.49,3842000,378.49 -2006-09-06,382.10,383.19,379.66,380.14,3724100,380.14 -2006-09-05,379.87,385.40,377.44,384.36,4074300,384.36 -2006-09-01,380.99,381.28,377.19,378.60,2672900,378.60 -2006-08-31,381.49,382.15,378.20,378.53,2959900,378.53 -2006-08-30,379.21,384.65,378.51,380.75,4044400,380.75 -2006-08-29,380.78,382.32,377.20,378.95,4460000,378.95 -2006-08-28,375.61,380.95,375.00,380.95,4164000,380.95 -2006-08-25,373.08,375.32,372.50,373.26,2466700,373.26 -2006-08-24,374.44,376.40,372.26,373.73,3482500,373.73 -2006-08-23,377.64,378.27,372.66,373.43,3642300,373.43 -2006-08-22,377.73,379.26,374.84,378.29,4164100,378.29 -2006-08-21,378.10,379.00,375.22,377.30,4023300,377.30 -2006-08-18,386.31,387.09,380.75,383.36,4952200,383.36 -2006-08-17,386.39,390.00,383.92,385.80,5080200,385.80 -2006-08-16,383.48,388.45,382.12,387.72,5853200,387.72 -2006-08-15,374.11,381.67,372.60,380.97,6698200,380.97 -2006-08-14,371.50,375.13,368.67,369.43,4968300,369.43 -2006-08-11,374.40,375.28,368.00,368.50,3766500,368.50 -2006-08-10,373.88,377.67,372.46,374.20,4261900,374.20 -2006-08-09,382.80,384.68,376.36,376.94,4311000,376.94 -2006-08-08,382.82,384.50,379.09,381.00,5743200,381.00 -2006-08-07,371.50,379.73,371.15,377.95,3946900,377.95 -2006-08-04,379.56,380.68,371.75,373.85,5095200,373.85 -2006-08-03,364.98,377.91,363.36,375.39,6327000,375.39 -2006-08-02,375.60,377.17,365.20,367.23,7097800,367.23 -2006-08-01,385.11,385.77,375.51,375.51,5463200,375.51 -2006-07-31,388.00,389.17,383.31,386.60,4595300,386.60 -2006-07-28,382.00,389.56,381.73,388.12,4083600,388.12 -2006-07-27,387.37,387.49,377.95,382.40,5641100,382.40 -2006-07-26,388.20,391.91,383.00,385.50,5531900,385.50 -2006-07-25,385.02,391.31,383.80,389.36,5761100,389.36 -2006-07-24,392.82,393.89,381.21,390.90,8086100,390.90 -2006-07-21,386.14,391.75,377.69,390.11,11754600,390.11 -2006-07-20,404.28,404.44,385.66,387.12,12538700,387.12 -2006-07-19,395.01,401.14,394.66,399.00,8518500,399.00 -2006-07-18,409.75,410.57,397.74,403.05,8536800,403.05 -2006-07-17,404.63,411.00,403.72,407.89,5811900,407.89 -2006-07-14,410.33,411.49,398.61,403.50,7552100,403.50 -2006-07-13,414.00,418.34,406.83,408.83,6924500,408.83 -2006-07-12,422.09,422.74,416.73,417.25,4906700,417.25 -2006-07-11,418.51,425.05,413.03,424.56,5971300,424.56 -2006-07-10,423.44,425.23,416.38,418.20,4436400,418.20 -2006-07-07,426.05,427.89,415.88,420.45,6041900,420.45 -2006-07-06,423.38,425.38,421.98,423.19,3687100,423.19 -2006-07-05,421.52,422.80,415.64,421.46,4985600,421.46 -2006-07-03,420.04,423.77,419.45,423.20,2156700,423.20 -2006-06-30,415.60,419.33,412.33,419.33,6258000,419.33 -2006-06-29,407.99,418.20,405.82,417.81,6658200,417.81 -2006-06-28,404.01,406.48,401.13,406.11,3710500,406.11 -2006-06-27,405.71,408.00,401.01,402.32,4107100,402.32 -2006-06-26,406.75,408.30,403.25,404.22,3551200,404.22 -2006-06-23,402.76,409.75,400.74,404.86,5314800,404.86 -2006-06-22,401.58,406.00,388.00,399.95,5911900,399.95 -2006-06-21,391.06,404.00,389.75,402.13,8744400,402.13 -2006-06-20,388.03,391.87,386.51,387.17,4039900,387.17 -2006-06-19,390.85,394.80,386.98,388.14,7633100,388.14 -2006-06-16,389.10,390.93,388.00,390.70,5304600,390.70 -2006-06-15,386.62,392.25,383.00,391.00,6785700,391.00 -2006-06-14,389.83,391.10,378.52,384.39,7772000,384.39 -2006-06-13,380.90,387.00,378.12,386.52,7659100,386.52 -2006-06-12,388.34,390.49,381.00,381.54,5019100,381.54 -2006-06-09,392.19,395.43,385.35,386.57,6157500,386.57 -2006-06-08,387.75,394.27,378.59,393.30,10359500,393.30 -2006-06-07,393.24,394.86,386.50,386.51,8911300,386.51 -2006-06-06,376.58,390.00,376.30,389.99,10259800,389.99 -2006-06-05,376.18,381.45,374.15,374.44,5558500,374.44 -2006-06-02,386.84,387.08,377.45,379.44,6386400,379.44 -2006-06-01,373.54,382.99,371.60,382.62,6278000,382.62 -2006-05-31,373.80,378.25,366.78,371.82,7981300,371.82 -2006-05-30,378.28,381.00,371.45,371.94,4316000,371.94 -2006-05-26,384.55,385.88,380.03,381.35,3667000,381.35 -2006-05-25,379.08,383.00,372.31,382.99,8194600,382.99 -2006-05-24,377.35,383.44,371.61,381.25,9553800,381.25 -2006-05-23,374.21,383.88,373.56,375.58,8983000,375.58 -2006-05-22,367.85,373.03,365.25,370.95,8604400,370.95 -2006-05-19,373.28,374.50,360.57,370.02,11398200,370.02 -2006-05-18,378.78,381.81,370.71,370.99,5835000,370.99 -2006-05-17,370.61,379.84,370.22,374.50,10643800,374.50 -2006-05-16,375.99,376.86,369.89,371.30,6491100,371.30 -2006-05-15,375.93,380.15,368.25,376.20,8590100,376.20 -2006-05-12,383.54,384.87,373.55,374.13,10087600,374.13 -2006-05-11,403.42,404.71,384.98,387.00,8892800,387.00 -2006-05-10,408.31,411.71,401.86,402.98,6187200,402.98 -2006-05-09,395.70,409.00,393.75,408.80,9140600,408.80 -2006-05-08,395.11,397.12,390.05,394.78,5118600,394.78 -2006-05-05,397.60,400.68,391.78,394.30,6065000,394.30 -2006-05-04,395.03,398.87,392.21,394.75,4652000,394.75 -2006-05-03,396.35,401.50,390.88,394.17,8072200,394.17 -2006-05-02,401.08,402.49,388.40,394.80,13104300,394.80 -2006-05-01,418.47,419.44,398.55,398.90,10361200,398.90 -2006-04-28,418.63,425.73,416.30,417.94,7421300,417.94 -2006-04-27,422.91,426.91,419.39,420.03,8337900,420.03 -2006-04-26,427.74,430.04,423.53,425.97,7277800,425.97 -2006-04-25,439.63,441.04,426.00,427.16,9569000,427.16 -2006-04-24,439.40,444.70,436.52,440.50,8836400,440.50 -2006-04-21,448.90,450.72,436.17,437.10,22551300,437.10 -2006-04-20,411.01,416.00,408.20,415.00,12271500,415.00 -2006-04-19,412.57,413.64,406.73,410.50,6781700,410.50 -2006-04-18,407.93,409.83,401.50,404.24,8137600,404.24 -2006-04-17,403.45,412.50,400.84,406.82,8259500,406.82 -2006-04-13,408.63,409.76,400.50,402.16,6552900,402.16 -2006-04-12,409.00,411.33,405.19,408.95,6017000,408.95 -2006-04-11,416.42,419.10,406.22,409.66,11107200,409.66 -2006-04-10,407.08,417.17,405.25,416.38,9320100,416.38 -2006-04-07,412.41,412.85,404.02,406.16,7025900,406.16 -2006-04-06,406.49,413.89,405.43,411.18,8598500,411.18 -2006-04-05,408.20,414.57,402.82,407.99,13410500,407.99 -2006-04-04,389.90,404.90,388.14,404.34,15715700,404.34 -2006-04-03,389.53,392.47,387.93,389.70,8122700,389.70 -2006-03-31,388.74,391.87,384.03,390.00,36521400,390.00 -2006-03-30,389.19,393.50,383.61,388.44,14711700,388.44 -2006-03-29,379.94,399.00,379.51,394.98,19027500,394.98 -2006-03-28,371.71,377.86,371.17,377.20,8945800,377.20 -2006-03-27,367.09,371.71,365.00,369.69,7023700,369.69 -2006-03-24,368.62,370.09,362.51,365.80,15180600,365.80 -2006-03-23,342.35,345.75,340.20,341.89,7434700,341.89 -2006-03-22,339.75,344.10,337.50,340.22,7596000,340.22 -2006-03-21,350.01,351.66,339.08,339.92,9831100,339.92 -2006-03-20,342.34,350.09,341.54,348.19,10407600,348.19 -2006-03-17,338.80,341.78,334.93,339.79,8551700,339.79 -2006-03-16,348.61,348.75,337.90,338.77,10016700,338.77 -2006-03-15,350.77,352.30,340.53,344.50,12768800,344.50 -2006-03-14,337.14,352.37,332.62,351.16,18450700,351.16 -2006-03-13,340.93,346.10,335.45,337.06,13642400,337.06 -2006-03-10,343.50,344.50,331.55,337.50,19325600,337.50 -2006-03-09,355.39,358.53,341.50,343.00,13910400,343.00 -2006-03-08,353.93,360.03,350.54,353.88,11745600,353.88 -2006-03-07,365.02,368.45,358.15,364.45,10378800,364.45 -2006-03-06,380.91,383.40,367.14,368.10,8939700,368.10 -2006-03-03,384.30,387.24,375.76,378.18,11962000,378.18 -2006-03-02,364.28,381.10,362.20,376.45,18330300,376.45 -2006-03-01,368.56,369.45,361.30,364.80,12061200,364.80 -2006-02-28,393.20,397.54,338.51,362.62,39437600,362.62 -2006-02-27,381.27,391.70,380.28,390.38,10212200,390.38 -2006-02-24,377.30,380.07,373.49,377.40,6484300,377.40 -2006-02-23,365.61,381.24,365.39,378.07,12551600,378.07 -2006-02-22,367.15,368.95,363.86,365.49,6476200,365.49 -2006-02-21,366.44,373.54,365.11,366.59,8686000,366.59 -2006-02-17,369.86,372.14,363.62,368.75,14320200,368.75 -2006-02-16,345.67,367.00,344.49,366.46,21315500,366.46 -2006-02-15,341.27,346.00,337.83,342.38,12947000,342.38 -2006-02-14,345.33,351.69,342.40,343.32,14654000,343.32 -2006-02-13,346.64,350.60,341.89,345.70,19717800,345.70 -2006-02-10,361.95,364.50,353.14,362.61,15223500,362.61 -2006-02-09,371.20,374.40,356.11,358.77,11912400,358.77 -2006-02-08,368.48,370.69,354.67,369.08,20804100,369.08 -2006-02-07,382.99,383.70,363.35,367.92,16630200,367.92 -2006-02-06,385.31,389.90,379.56,385.10,8940400,385.10 -2006-02-03,393.62,393.90,372.57,381.55,18281800,381.55 -2006-02-02,403.82,406.50,395.98,396.04,11807700,396.04 -2006-02-01,389.03,402.00,387.52,401.78,27122500,401.78 -2006-01-31,430.57,439.60,423.97,432.66,22066000,432.66 -2006-01-30,429.23,433.28,425.00,426.82,8588900,426.82 -2006-01-27,435.00,438.22,428.98,433.49,8452200,433.49 -2006-01-26,439.54,439.99,423.56,434.27,12926100,434.27 -2006-01-25,451.26,454.23,429.22,433.00,18739800,433.00 -2006-01-24,436.03,444.95,434.48,443.03,15464600,443.03 -2006-01-23,407.38,428.39,405.73,427.50,22741400,427.50 -2006-01-20,438.70,440.03,394.74,399.46,41116700,399.46 -2006-01-19,451.17,453.49,433.00,436.45,14537300,436.45 -2006-01-18,447.30,457.36,443.25,444.91,20485700,444.91 -2006-01-17,463.06,469.90,462.53,467.11,8270300,467.11 -2006-01-13,464.31,466.89,461.61,466.25,7656600,466.25 -2006-01-12,473.72,474.99,461.50,463.63,10125300,463.63 -2006-01-11,471.27,475.11,469.18,471.63,9007400,471.63 -2006-01-10,464.42,470.25,462.04,469.76,9097100,469.76 -2006-01-09,466.41,473.40,460.94,466.90,12791900,466.90 -2006-01-06,456.87,470.50,453.24,465.66,17756900,465.66 -2006-01-05,446.00,451.55,441.50,451.24,10808300,451.24 -2006-01-04,443.90,448.96,439.75,445.24,15286400,445.24 -2006-01-03,422.52,435.67,418.22,435.23,13121200,435.23 -2005-12-30,417.27,418.21,413.74,414.86,7587100,414.86 -2005-12-29,427.98,428.73,419.17,420.15,6945800,420.15 -2005-12-28,424.34,427.78,421.26,426.69,7117900,426.69 -2005-12-27,431.86,431.86,422.76,424.64,6702800,424.64 -2005-12-23,432.15,432.50,428.78,430.93,4595100,430.93 -2005-12-22,431.77,432.86,425.93,432.04,7546600,432.04 -2005-12-21,433.55,436.86,420.71,426.33,11221900,426.33 -2005-12-20,427.86,432.20,424.67,429.74,10084700,429.74 -2005-12-19,432.20,446.21,420.11,424.60,21936800,424.60 -2005-12-16,425.34,432.50,422.75,430.15,16330500,430.15 -2005-12-15,419.11,423.14,416.50,422.55,6045800,422.55 -2005-12-14,417.04,419.73,415.49,418.96,6630400,418.96 -2005-12-13,412.50,418.00,411.64,417.49,8157000,417.49 -2005-12-12,414.63,415.21,409.95,412.61,6950100,412.61 -2005-12-09,415.00,415.78,408.56,409.20,7643400,409.20 -2005-12-08,405.30,410.65,402.64,410.65,8910100,410.65 -2005-12-07,406.16,406.70,399.01,404.22,11665900,404.22 -2005-12-06,408.70,416.41,401.70,404.54,15114700,404.54 -2005-12-05,417.00,417.50,404.28,405.85,10289400,405.85 -2005-12-02,416.94,419.53,413.86,417.70,7543500,417.70 -2005-12-01,409.20,415.44,408.29,414.09,9744900,414.09 -2005-11-30,404.26,408.45,395.56,404.91,15596600,404.91 -2005-11-29,424.46,426.40,402.14,403.54,21495800,403.54 -2005-11-28,429.82,431.24,422.44,423.48,11008400,423.48 -2005-11-25,425.78,428.75,425.30,428.62,4840100,428.62 -2005-11-23,417.04,424.72,415.78,422.86,10085000,422.86 -2005-11-22,408.65,417.31,406.23,416.47,9596000,416.47 -2005-11-21,399.17,409.98,393.49,409.36,10335100,409.36 -2005-11-18,403.49,404.50,399.85,400.21,7025700,400.21 -2005-11-17,401.80,403.81,399.53,403.45,9212200,403.45 -2005-11-16,396.20,398.85,394.11,398.15,8695200,398.15 -2005-11-15,394.38,397.00,390.95,392.80,8624900,392.80 -2005-11-14,392.12,398.22,391.53,396.97,7807900,396.97 -2005-11-11,395.12,396.90,388.85,390.40,7063900,390.40 -2005-11-10,378.36,391.35,377.43,391.10,9128700,391.10 -2005-11-09,386.67,388.29,378.03,379.15,10466900,379.15 -2005-11-08,394.25,395.59,388.58,389.90,7897500,389.90 -2005-11-07,395.10,397.47,392.15,395.03,9591500,395.03 -2005-11-04,389.98,391.79,385.45,390.43,8824900,390.43 -2005-11-03,382.41,386.58,381.38,385.95,7448400,385.95 -2005-11-02,381.70,385.00,377.17,379.68,10565400,379.68 -2005-11-01,371.86,383.90,369.01,379.38,16356100,379.38 -2005-10-31,360.24,374.75,359.51,372.14,14342900,372.14 -2005-10-28,355.27,358.95,355.02,358.17,5903500,358.17 -2005-10-27,356.60,357.09,351.68,353.06,5134400,353.06 -2005-10-26,346.28,356.00,346.19,355.44,8907500,355.44 -2005-10-25,345.78,347.40,342.86,346.91,6878300,346.91 -2005-10-24,343.37,349.30,342.19,348.65,9431700,348.65 -2005-10-21,345.80,346.43,333.00,339.90,22892400,339.90 -2005-10-20,309.99,311.13,301.21,303.20,13911700,303.20 -2005-10-19,304.00,309.87,303.96,308.70,7010700,308.70 -2005-10-18,304.96,307.96,302.74,303.28,7077800,303.28 -2005-10-17,297.50,305.20,294.56,305.00,7566700,305.00 -2005-10-14,299.90,300.23,292.54,296.14,8519100,296.14 -2005-10-13,302.00,302.00,290.68,297.44,10567700,297.44 -2005-10-12,305.20,307.19,299.00,300.97,9306200,300.97 -2005-10-11,310.61,312.65,304.86,306.10,8542600,306.10 -2005-10-10,313.31,314.82,309.15,310.65,5572200,310.65 -2005-10-07,314.79,316.67,310.54,312.99,6770300,312.99 -2005-10-06,314.14,314.48,310.09,312.75,7993800,312.75 -2005-10-05,312.69,314.90,308.00,310.71,8328400,310.71 -2005-10-04,319.95,321.28,310.74,311.00,9144300,311.00 -2005-10-03,313.63,320.11,312.79,318.68,9160300,318.68 -2005-09-30,314.22,317.50,312.29,316.46,9151300,316.46 -2005-09-29,306.68,310.72,306.08,309.62,5613800,309.62 -2005-09-28,314.22,315.10,305.60,306.00,7997400,306.00 -2005-09-27,314.95,318.41,313.38,313.94,6873100,313.94 -2005-09-26,319.50,320.95,312.56,314.28,9894400,314.28 -2005-09-23,313.00,317.21,312.59,315.36,8483800,315.36 -2005-09-22,311.50,319.22,310.17,311.37,13006400,311.37 -2005-09-21,308.41,313.76,305.96,311.90,10119700,311.90 -2005-09-20,306.15,311.30,305.23,307.91,9351000,307.91 -2005-09-19,301.00,306.00,300.71,303.79,5761900,303.79 -2005-09-16,304.02,304.50,299.87,300.20,7579800,300.20 -2005-09-15,299.52,306.75,297.91,302.62,15466200,302.62 -2005-09-14,308.73,313.28,300.30,303.00,11275800,303.00 -2005-09-13,309.00,315.53,306.17,311.68,10299900,311.68 -2005-09-12,301.75,311.42,301.00,309.74,10386500,309.74 -2005-09-09,297.28,299.10,296.56,299.09,4390500,299.09 -2005-09-08,294.83,299.28,293.36,295.39,6613300,295.39 -2005-09-07,285.89,295.50,285.28,294.87,7499500,294.87 -2005-09-06,289.00,289.39,286.80,287.11,4212300,287.11 -2005-09-02,286.51,289.99,286.44,288.45,3434500,288.45 -2005-09-01,285.91,287.50,285.00,286.25,2742100,286.25 -2005-08-31,288.23,288.50,284.36,286.00,5034000,286.00 -2005-08-30,287.39,289.51,285.88,287.27,4792000,287.27 -2005-08-29,282.24,289.12,282.24,288.45,5903000,288.45 -2005-08-26,283.48,285.02,282.66,283.58,3755300,283.58 -2005-08-25,282.55,284.00,279.97,282.59,4376600,282.59 -2005-08-24,277.57,284.75,276.45,282.57,8593100,282.57 -2005-08-23,276.16,279.74,274.12,279.58,5821700,279.58 -2005-08-22,281.24,281.47,273.35,274.01,6813000,274.01 -2005-08-19,280.99,281.45,279.62,280.00,5542900,280.00 -2005-08-18,275.91,280.50,275.00,279.99,11872800,279.99 -2005-08-17,285.51,286.57,284.00,285.10,3883300,285.10 -2005-08-16,284.88,287.79,283.34,285.65,7109200,285.65 -2005-08-15,289.80,292.77,283.77,284.00,8174700,284.00 -2005-08-12,283.36,290.20,281.64,289.72,6585900,289.72 -2005-08-11,285.89,286.58,280.62,284.05,7514900,284.05 -2005-08-10,291.30,292.33,284.88,285.68,6879000,285.68 -2005-08-09,291.96,292.68,288.51,291.57,5779300,291.57 -2005-08-08,293.60,295.65,290.49,291.25,4481800,291.25 -2005-08-05,297.50,298.51,291.31,292.35,5939700,292.35 -2005-08-04,295.55,299.00,295.25,297.73,5236500,297.73 -2005-08-03,298.00,299.72,295.60,297.30,5930600,297.30 -2005-08-02,291.60,299.52,291.12,299.19,7290200,299.19 -2005-08-01,288.12,292.50,288.10,291.61,5662400,291.61 -2005-07-29,292.14,292.84,286.99,287.76,8363300,287.76 -2005-07-28,297.41,297.41,293.28,293.50,5925600,293.50 -2005-07-27,297.74,298.23,292.40,296.93,7217900,296.93 -2005-07-26,295.01,298.00,292.09,296.09,9816900,296.09 -2005-07-25,302.39,303.29,294.96,295.85,9658800,295.85 -2005-07-22,306.37,309.25,296.33,302.40,23386800,302.40 -2005-07-21,314.05,317.80,311.21,313.94,19789400,313.94 -2005-07-20,305.57,312.61,301.80,312.00,14310400,312.00 -2005-07-19,302.10,310.35,301.80,309.90,12621400,309.90 -2005-07-18,300.00,301.90,297.75,299.54,6207800,299.54 -2005-07-15,301.24,303.40,299.78,301.19,8438400,301.19 -2005-07-14,305.34,306.75,300.07,300.89,10667700,300.89 -2005-07-13,292.51,299.24,292.10,298.86,11437900,298.86 -2005-07-12,293.39,294.40,290.93,291.78,5864900,291.78 -2005-07-11,296.40,296.60,291.02,293.35,8390300,293.35 -2005-07-08,296.25,297.50,294.05,296.23,7457600,296.23 -2005-07-07,289.39,295.80,288.51,295.54,10672100,295.54 -2005-07-06,297.30,297.60,291.38,291.52,8000300,291.52 -2005-07-05,292.10,295.98,290.23,295.71,7494000,295.71 -2005-07-01,295.04,296.24,289.22,291.25,9227600,291.25 -2005-06-30,294.34,298.93,291.04,294.15,15094400,294.15 -2005-06-29,302.50,304.38,292.15,292.72,18298700,292.72 -2005-06-28,306.28,309.25,302.00,302.00,19036500,302.00 -2005-06-27,298.90,304.47,293.86,304.10,17802900,304.10 -2005-06-24,290.90,298.00,289.58,297.25,17771200,297.25 -2005-06-23,288.00,294.81,286.50,289.71,14056400,289.71 -2005-06-22,289.67,292.32,288.67,289.30,10474000,289.30 -2005-06-21,288.07,290.30,284.97,287.84,15132300,287.84 -2005-06-20,276.09,287.67,271.73,286.70,21024700,286.70 -2005-06-17,279.00,280.30,275.90,280.30,10434400,280.30 -2005-06-16,274.26,278.30,273.07,277.44,12462400,277.44 -2005-06-15,275.00,277.30,267.43,274.80,20883100,274.80 -2005-06-14,278.59,281.24,277.75,278.35,10091900,278.35 -2005-06-13,279.82,284.19,276.52,282.75,12803200,282.75 -2005-06-10,286.99,287.28,280.02,282.50,12696600,282.50 -2005-06-09,284.72,288.50,280.56,286.31,16441100,286.31 -2005-06-08,292.85,293.19,278.00,279.56,25700900,279.56 -2005-06-07,297.10,299.59,290.30,293.12,24323000,293.12 -2005-06-06,282.39,293.75,281.83,290.94,22525900,290.94 -2005-06-03,286.79,289.30,277.41,280.26,18782300,280.26 -2005-06-02,288.73,289.78,284.60,287.90,17974100,287.90 -2005-06-01,283.20,292.89,282.02,288.00,35191700,288.00 -2005-05-31,269.43,278.40,269.37,277.27,22236800,277.27 -2005-05-27,260.46,266.05,259.25,266.00,12184100,266.00 -2005-05-26,260.96,263.76,258.30,259.20,13546600,259.20 -2005-05-25,252.73,260.98,250.63,260.81,18057900,260.81 -2005-05-24,256.96,265.44,253.50,256.00,29043100,256.00 -2005-05-23,243.16,258.10,242.71,255.45,21388300,255.45 -2005-05-20,241.21,241.67,239.65,241.61,8163500,241.61 -2005-05-19,240.34,241.17,238.27,239.18,9716500,239.18 -2005-05-18,233.61,239.97,233.52,239.16,12312000,239.16 -2005-05-17,230.56,233.45,230.20,233.13,7808900,233.13 -2005-05-16,229.68,231.62,228.57,231.05,5681400,231.05 -2005-05-13,229.18,231.09,227.32,229.24,7415500,229.24 -2005-05-12,230.81,232.23,228.20,228.72,8948200,228.72 -2005-05-11,228.97,231.98,227.93,231.29,11478800,231.29 -2005-05-10,225.47,227.80,224.72,227.80,6345800,227.80 -2005-05-09,228.00,228.50,225.43,226.02,5536800,226.02 -2005-05-06,228.40,229.25,226.47,228.02,6763900,228.02 -2005-05-05,228.62,228.62,225.88,226.98,7509600,226.98 -2005-05-04,227.23,229.88,227.00,228.50,12083500,228.50 -2005-05-03,221.85,228.15,221.32,226.19,17780200,226.19 -2005-05-02,222.05,223.70,220.21,222.29,9767400,222.29 -2005-04-29,221.91,222.25,217.82,220.00,9170200,220.00 -2005-04-28,219.50,222.08,217.71,219.45,8682800,219.45 -2005-04-27,217.99,220.85,216.74,219.78,10264800,219.78 -2005-04-26,220.22,222.00,218.29,218.75,17272000,218.75 -2005-04-25,217.82,224.74,217.52,223.53,19840000,223.53 -2005-04-22,222.90,224.00,214.26,215.81,33205100,215.81 -2005-04-21,200.42,205.00,199.32,204.22,17751900,204.22 -2005-04-20,198.58,200.50,195.91,198.10,15451500,198.10 -2005-04-19,189.33,192.00,188.03,191.40,8430000,191.40 -2005-04-18,184.58,187.88,183.49,186.97,6550300,186.97 -2005-04-15,190.10,190.34,184.66,185.00,11577400,185.00 -2005-04-14,193.27,194.36,190.10,191.45,6152700,191.45 -2005-04-13,193.47,194.32,189.73,192.93,6555800,192.93 -2005-04-12,193.00,194.42,189.41,193.96,7319600,193.96 -2005-04-11,193.09,194.80,192.32,193.23,5410500,193.23 -2005-04-08,193.69,195.10,191.45,192.05,5116600,192.05 -2005-04-07,188.78,194.62,188.64,193.76,9692200,193.76 -2005-04-06,189.24,189.65,187.58,189.22,5252600,189.22 -2005-04-05,187.73,190.26,187.57,188.57,8736700,188.57 -2005-04-04,179.95,185.32,179.84,185.29,8076400,185.29 -2005-04-01,181.76,182.95,179.99,180.04,6182000,180.04 -2005-03-31,177.95,181.39,177.64,180.51,6768600,180.51 -2005-03-30,180.64,181.45,179.60,180.45,6236100,180.45 -2005-03-29,181.05,183.28,178.07,179.57,6473000,179.57 -2005-03-28,181.68,184.80,180.95,181.42,8738000,181.42 -2005-03-24,180.70,180.86,179.20,179.25,3705200,179.25 -2005-03-23,177.97,180.24,177.97,178.98,4845000,178.98 -2005-03-22,181.18,181.94,177.85,178.60,5631700,178.60 -2005-03-21,179.27,182.17,177.25,180.88,7483700,180.88 -2005-03-18,178.81,180.40,178.31,180.04,7090000,180.04 -2005-03-17,177.13,179.64,175.80,179.29,8260600,179.29 -2005-03-16,176.70,178.61,175.01,175.60,7106300,175.60 -2005-03-15,175.30,180.00,174.21,178.61,10422100,178.61 -2005-03-14,178.33,178.40,172.57,174.99,11146600,174.99 -2005-03-11,180.44,180.95,177.15,177.80,8028300,177.80 -2005-03-10,181.01,181.20,177.40,179.98,10960500,179.98 -2005-03-09,184.21,184.65,180.16,181.35,11360400,181.35 -2005-03-08,189.10,189.85,184.97,185.20,8046100,185.20 -2005-03-07,187.78,189.60,187.03,188.81,8667400,188.81 -2005-03-04,186.70,187.25,185.07,185.90,6774100,185.90 -2005-03-03,186.13,187.75,184.31,187.01,7608600,187.01 -2005-03-02,185.95,187.67,184.36,185.18,7285500,185.18 -2005-03-01,189.29,189.75,182.00,186.06,9311200,186.06 -2005-02-28,186.00,189.87,185.85,187.99,7818400,187.99 -2005-02-25,189.15,189.92,185.51,185.87,9973500,185.87 -2005-02-24,183.37,189.85,182.23,188.89,25814300,188.89 -2005-02-23,193.30,194.48,188.66,193.95,15586000,193.95 -2005-02-22,196.50,198.90,190.39,191.37,13483700,191.37 -2005-02-18,198.51,198.84,196.66,197.95,8485900,197.95 -2005-02-17,197.83,199.75,196.81,197.90,10414400,197.90 -2005-02-16,194.70,199.33,194.30,198.41,16532300,198.41 -2005-02-15,193.60,199.84,193.08,195.23,25782800,195.23 -2005-02-14,182.85,193.08,181.00,192.99,38562200,192.99 -2005-02-11,186.66,192.32,186.07,187.40,13116000,187.40 -2005-02-10,191.97,192.21,185.25,187.98,18982700,187.98 -2005-02-09,200.76,201.60,189.46,191.58,17171500,191.58 -2005-02-08,196.96,200.02,194.53,198.64,11480000,198.64 -2005-02-07,205.26,206.40,195.51,196.03,12960400,196.03 -2005-02-04,206.47,207.75,202.60,204.36,14819300,204.36 -2005-02-03,205.99,213.37,205.81,210.86,12988100,210.86 -2005-02-02,215.55,216.80,203.66,205.96,32799300,205.96 -2005-02-01,194.38,196.66,190.63,191.90,18839000,191.90 -2005-01-31,193.69,196.36,191.72,195.62,9596700,195.62 -2005-01-28,190.02,194.70,186.34,190.34,12208200,190.34 -2005-01-27,188.76,188.86,185.20,188.08,6627400,188.08 -2005-01-26,179.27,189.41,179.15,189.24,12307900,189.24 -2005-01-25,181.94,182.24,176.29,177.12,10659200,177.12 -2005-01-24,188.69,189.33,180.32,180.72,14022700,180.72 -2005-01-21,194.54,195.36,188.12,188.28,9258400,188.28 -2005-01-20,192.50,196.25,192.00,193.92,9001600,193.92 -2005-01-19,204.65,205.30,196.71,197.30,11257700,197.30 -2005-01-18,200.97,205.02,198.66,203.90,13172600,203.90 -2005-01-14,196.00,200.01,194.13,199.97,9640300,199.97 -2005-01-13,195.38,197.39,194.05,195.33,6849400,195.33 -2005-01-12,194.33,195.93,190.50,195.38,8177800,195.38 -2005-01-11,195.62,197.71,193.18,193.54,6958700,193.54 -2005-01-10,194.50,198.10,191.83,195.06,7539600,195.06 -2005-01-07,190.64,194.25,188.78,193.85,9662900,193.85 -2005-01-06,195.08,195.90,187.72,188.55,10387100,188.55 -2005-01-05,193.45,196.90,192.23,193.51,8236600,193.51 -2005-01-04,201.40,202.93,193.48,194.50,13755900,194.50 -2005-01-03,197.40,203.64,195.46,202.71,15844200,202.71 -2004-12-31,199.23,199.88,192.56,192.79,7668500,192.79 -2004-12-30,192.97,198.23,191.85,197.60,5904300,197.60 -2004-12-29,191.78,193.52,191.78,192.90,2678100,192.90 -2004-12-28,192.11,193.55,191.01,192.76,4145800,192.76 -2004-12-27,189.15,193.30,189.10,191.91,6104100,191.91 -2004-12-23,187.45,188.60,186.00,187.90,3614600,187.90 -2004-12-22,183.90,186.85,183.01,186.30,3907000,186.30 -2004-12-21,186.31,187.88,183.40,183.75,5516300,183.75 -2004-12-20,182.00,188.46,181.87,185.02,9834500,185.02 -2004-12-17,176.76,180.50,176.55,180.08,7386200,180.08 -2004-12-16,176.95,180.49,175.95,176.47,8572800,176.47 -2004-12-15,177.99,180.69,176.66,179.78,11471000,179.78 -2004-12-14,171.00,178.82,169.60,178.69,11088400,178.69 -2004-12-13,172.17,173.18,169.45,170.45,4818600,170.45 -2004-12-10,173.43,174.88,171.29,171.65,4317200,171.65 -2004-12-09,170.25,173.50,168.47,173.43,7654000,173.43 -2004-12-08,170.35,173.68,168.73,169.98,7541800,169.98 -2004-12-07,176.00,176.20,170.55,171.43,6870900,171.43 -2004-12-06,179.13,180.70,176.02,176.29,6254000,176.29 -2004-12-03,179.95,181.06,177.60,180.40,5869200,180.40 -2004-12-02,179.90,181.51,178.55,179.40,6260900,179.40 -2004-12-01,181.95,182.50,179.55,179.96,7864100,179.96 -2004-11-30,180.71,183.00,180.25,181.98,7700000,181.98 -2004-11-29,180.36,182.95,177.51,181.05,10666600,181.05 -2004-11-26,175.80,180.03,175.32,179.39,6480100,179.39 -2004-11-24,174.82,177.21,172.51,174.76,15281000,174.76 -2004-11-23,167.97,170.83,166.50,167.52,12413300,167.52 -2004-11-22,164.47,169.50,161.31,165.10,12368200,165.10 -2004-11-19,169.10,169.98,166.52,169.40,8769300,169.40 -2004-11-18,170.29,174.42,165.73,167.54,16629600,167.54 -2004-11-17,169.02,177.50,169.00,172.50,18132900,172.50 -2004-11-16,177.50,179.47,170.83,172.54,20917400,172.54 -2004-11-15,180.45,188.32,178.75,184.87,11901500,184.87 -2004-11-12,185.23,189.80,177.40,182.00,16746100,182.00 -2004-11-11,169.13,183.75,167.57,183.02,14985500,183.02 -2004-11-10,170.67,172.52,166.33,167.86,10644000,167.86 -2004-11-09,174.10,175.20,165.27,168.70,11064200,168.70 -2004-11-08,170.93,175.44,169.40,172.55,11191800,172.55 -2004-11-05,181.98,182.30,168.55,169.35,19833100,169.35 -2004-11-04,188.44,190.40,183.35,184.70,14409600,184.70 -2004-11-03,198.18,201.60,190.75,191.67,13888700,191.67 -2004-11-02,198.78,199.25,193.34,194.87,11346300,194.87 -2004-11-01,193.55,197.67,191.27,196.03,12224900,196.03 -2004-10-29,198.89,199.95,190.60,190.64,21162500,190.64 -2004-10-28,186.68,194.39,185.60,193.30,14846800,193.30 -2004-10-27,182.72,189.52,181.77,185.97,13356500,185.97 -2004-10-26,186.34,192.64,180.00,181.80,22307100,181.80 -2004-10-25,176.40,194.43,172.55,187.40,32764200,187.40 -2004-10-22,170.54,180.17,164.08,172.43,36891900,172.43 -2004-10-21,144.40,150.13,141.62,149.38,14589500,149.38 -2004-10-20,148.03,148.99,139.60,140.49,11372700,140.49 -2004-10-19,150.50,152.40,147.35,147.94,9064000,147.94 -2004-10-18,143.20,149.20,141.21,149.16,7025200,149.16 -2004-10-15,144.93,145.50,141.95,144.11,6604000,144.11 -2004-10-14,141.01,142.38,138.56,142.00,5226300,142.00 -2004-10-13,143.32,143.55,140.08,140.90,9893000,140.90 -2004-10-12,134.44,137.61,133.40,137.40,5838600,137.40 -2004-10-11,137.00,138.86,133.85,135.26,5241300,135.26 -2004-10-08,138.72,139.68,137.02,137.73,5540300,137.73 -2004-10-07,136.92,139.88,136.55,138.85,7064600,138.85 -2004-10-06,137.55,138.45,136.00,137.08,6697400,137.08 -2004-10-05,134.66,138.53,132.24,138.37,7494100,138.37 -2004-10-04,135.25,136.87,134.03,135.06,6517900,135.06 -2004-10-01,130.80,134.24,128.90,132.58,7570000,132.58 -2004-09-30,129.90,132.30,129.00,129.60,6885900,129.60 -2004-09-29,126.70,135.02,126.23,131.08,15273500,131.08 -2004-09-28,121.30,127.40,120.21,126.86,8473000,126.86 -2004-09-27,119.56,120.88,117.80,118.26,3536600,118.26 -2004-09-24,120.94,124.10,119.76,119.83,4566300,119.83 -2004-09-23,118.84,122.63,117.02,120.82,4272100,120.82 -2004-09-22,117.40,119.67,116.81,118.38,3794400,118.38 -2004-09-21,119.81,120.42,117.51,117.84,3618000,117.84 -2004-09-20,116.95,121.60,116.77,119.36,5319700,119.36 -2004-09-17,114.42,117.49,113.55,117.49,4741000,117.49 -2004-09-16,112.34,115.80,111.65,113.97,4637800,113.97 -2004-09-15,110.56,114.23,110.20,112.00,5361900,112.00 -2004-09-14,107.45,112.00,106.79,111.49,5419900,111.49 -2004-09-13,106.63,108.41,106.46,107.50,3926000,107.50 -2004-09-10,101.60,106.56,101.30,105.33,4353800,105.33 -2004-09-09,102.53,102.71,101.00,102.31,2032900,102.31 -2004-09-08,100.74,103.03,100.50,102.30,2495300,102.30 -2004-09-07,101.01,102.00,99.61,101.58,2926700,101.58 -2004-09-03,100.95,101.74,99.32,100.01,2578800,100.01 -2004-09-02,99.19,102.37,98.94,101.51,7566900,101.51 -2004-09-01,102.70,102.97,99.67,100.25,4573700,100.25 -2004-08-31,102.30,103.71,102.16,102.37,2461400,102.37 -2004-08-30,105.28,105.49,102.01,102.01,2601000,102.01 -2004-08-27,108.10,108.62,105.69,106.15,3109000,106.15 -2004-08-26,104.95,107.95,104.66,107.91,3551000,107.91 -2004-08-25,104.96,108.00,103.88,106.00,4598900,106.00 -2004-08-24,111.24,111.60,103.57,104.87,7631300,104.87 -2004-08-23,110.75,113.48,109.05,109.40,9137200,109.40 -2004-08-20,101.01,109.08,100.50,108.31,11428600,108.31 -2004-08-19,100.00,104.06,95.96,100.34,22351900,100.34 diff -Nru matplotlib-0.99.3/lib/mpl_examples/data/intc.csv matplotlib-1.0.1/lib/mpl_examples/data/intc.csv --- matplotlib-0.99.3/lib/mpl_examples/data/intc.csv 2009-07-31 15:14:50.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/data/intc.csv 1970-01-01 00:00:00.000000000 +0000 @@ -1,66 +0,0 @@ -Date,Open,High,Low,Close,Volume,Adj. Close* -19-Sep-03,29.30,29.36,28.83,29.17,53550300,29.15 -18-Sep-03,28.69,29.28,28.46,29.16,46619000,29.14 -17-Sep-03,28.94,29.38,28.77,28.88,52827300,28.86 -16-Sep-03,28.08,28.99,28.02,28.91,48748000,28.89 -15-Sep-03,28.33,28.45,27.91,27.99,36350400,27.97 -12-Sep-03,27.81,28.39,27.55,28.34,51931600,28.32 -11-Sep-03,27.62,28.35,27.29,28.03,56654900,28.01 -10-Sep-03,28.44,28.49,27.63,27.66,57999300,27.64 -9-Sep-03,29.00,29.13,28.66,28.79,49792900,28.77 -8-Sep-03,28.88,29.20,28.80,29.18,52154000,29.16 -5-Sep-03,28.83,29.10,28.37,28.71,68429904,28.69 -4-Sep-03,28.32,28.74,28.04,28.60,63744700,28.58 -3-Sep-03,28.94,28.97,28.04,28.22,60714800,28.20 -2-Sep-03,28.77,28.84,28.17,28.74,58841200,28.72 -29-Aug-03,28.18,28.65,28.04,28.59,41986600,28.57 -28-Aug-03,28.10,28.35,27.85,28.30,48631600,28.28 -27-Aug-03,27.61,28.08,27.42,28.02,58217200,28.00 -26-Aug-03,26.96,27.74,26.68,27.71,65213400,27.69 -25-Aug-03,27.56,27.76,27.07,27.24,52037500,27.22 -22-Aug-03,28.16,29.04,27.32,27.39,120604096,27.37 -21-Aug-03,26.69,26.78,26.01,26.39,66434900,26.37 -20-Aug-03,26.14,26.74,26.13,26.36,47210300,26.34 -19-Aug-03,26.37,26.54,25.92,26.47,55966300,26.45 -18-Aug-03,25.10,26.23,25.05,26.19,59081000,26.17 -15-Aug-03,25.09,25.25,24.81,25.05,21622800,25.04 -14-Aug-03,24.80,25.17,24.55,25.14,51830000,25.13 -13-Aug-03,24.50,25.00,24.30,24.71,51882500,24.70 -12-Aug-03,24.09,24.40,23.82,24.37,48475100,24.36 -11-Aug-03,23.62,24.13,23.58,23.90,41624600,23.89 -8-Aug-03,24.15,24.22,23.33,23.58,57453600,23.57 -7-Aug-03,23.94,24.30,23.86,23.99,48517800,23.98 -6-Aug-03,24.10,24.55,23.81,24.14,57799000,24.13 -5-Aug-03,25.12,25.12,24.23,24.27,51979800,24.26 -4-Aug-03,24.91,25.23,24.39,25.13,53570000,25.10 -1-Aug-03,24.78,25.07,24.73,25.02,48494900,24.99 -31-Jul-03,24.80,25.35,24.68,24.89,68692096,24.86 -30-Jul-03,24.86,24.87,24.28,24.49,40786200,24.46 -29-Jul-03,24.81,25.23,24.70,24.90,68217600,24.87 -28-Jul-03,24.92,25.13,24.61,24.76,45462200,24.73 -25-Jul-03,24.17,24.94,23.73,24.91,52627700,24.88 -24-Jul-03,25.15,25.17,23.95,23.97,58119100,23.94 -23-Jul-03,24.37,24.90,24.26,24.81,49058200,24.78 -22-Jul-03,24.39,24.53,24.05,24.42,61074300,24.39 -21-Jul-03,24.60,24.63,23.95,24.06,52851200,24.03 -18-Jul-03,25.10,25.15,24.15,24.66,65296900,24.63 -17-Jul-03,24.69,25.10,24.60,24.93,71736800,24.90 -16-Jul-03,25.24,25.50,24.82,25.31,128925696,25.27 -15-Jul-03,24.44,24.77,23.67,24.10,102323696,24.07 -14-Jul-03,24.27,24.58,23.85,24.02,76909400,23.99 -11-Jul-03,23.29,23.50,23.07,23.34,46535400,23.31 -10-Jul-03,23.07,23.30,22.61,22.91,63261600,22.88 -9-Jul-03,23.30,23.99,23.25,23.48,78521904,23.45 -8-Jul-03,22.83,23.40,22.67,23.15,64980800,23.12 -7-Jul-03,22.24,22.98,22.17,22.91,56553100,22.88 -3-Jul-03,21.97,22.31,21.71,21.72,40502400,21.69 -2-Jul-03,21.66,22.32,21.47,22.21,74291504,22.18 -1-Jul-03,20.87,21.50,20.51,21.41,64496600,21.38 -30-Jun-03,21.14,21.30,20.59,20.81,51457500,20.78 -27-Jun-03,20.70,21.13,20.53,20.57,63348200,20.54 -26-Jun-03,20.30,20.76,20.15,20.63,52904900,20.60 -25-Jun-03,20.53,20.83,19.99,20.04,61250600,20.01 -24-Jun-03,20.11,20.74,20.04,20.45,63799700,20.42 -23-Jun-03,20.70,20.97,20.05,20.36,59628100,20.33 -20-Jun-03,21.34,21.42,20.64,20.67,78909400,20.64 -19-Jun-03,21.66,21.92,21.12,21.12,69563696,21.09 Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/mpl_examples/data/INTC.dat and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/mpl_examples/data/INTC.dat differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/mpl_examples/data/lena.jpg and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/mpl_examples/data/lena.jpg differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/mpl_examples/data/lena.png and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/mpl_examples/data/lena.png differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/mpl_examples/data/logo2.png and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/mpl_examples/data/logo2.png differ diff -Nru matplotlib-0.99.3/lib/mpl_examples/data/membrane.dat matplotlib-1.0.1/lib/mpl_examples/data/membrane.dat --- matplotlib-0.99.3/lib/mpl_examples/data/membrane.dat 2009-07-31 15:14:50.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/data/membrane.dat 1970-01-01 00:00:00.000000000 +0000 @@ -1,64 +0,0 @@ -°ú*¿°ú*¿ºš+¿°ú*¿°ú*¿Ä:,¿Ä:,¿Ä:,¿°ú*¿ºš+¿ºš+¿°ú*¿ºš+¿°ú*¿¦Z*¿°ú*¿°ú*¿¦Z*¿¦Z*¿°ú*¿Ä:,¿Ä:,¿œº)¿¦Z*¿¦Z*¿°ú*¿°ú*¿°ú*¿ºš+¿Ä:,¿Ä:,¿°ú*¿ºš+¿°ú*¿ºš+¿ºš+¿ºš+¿ºš+¿ºš+¿ºš+¿°ú*¿°ú*¿ºš+¿ºš+¿ºš+¿°ú*¿°ú*¿ºš+¿¦Z*¿°ú*¿°ú*¿ºš+¿ºš+¿°ú*¿ºš+¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿¦Z*¿¦Z*¿°ú*¿ºš+¿¦Z*¿ºš+¿ºš+¿¦Z*¿°ú*¿°ú*¿ºš+¿ºš+¿ºš+¿ºš+¿Ä:,¿Ä:,¿ºš+¿ºš+¿ºš+¿¦Z*¿œº)¿ºš+¿°ú*¿°ú*¿Ä:,¿ºš+¿ºš+¿¦Z*¿Ä:,¿Ä:,¿¦Z*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿Ä:,¿ºš+¿°ú*¿°ú*¿°ú*¿ºš+¿ºš+¿ºš+¿°ú*¿°ú*¿ºš+¿Ä:,¿Ä:,¿°ú*¿ºš+¿ºš+¿ºš+¿°ú*¿°ú*¿ºš+¿°ú*¿°ú*¿ºš+¿ºš+¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿¦Z*¿¦Z*¿ºš+¿ºš+¿ºš+¿ºš+¿ºš+¿¦Z*¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿Ä:,¿°ú*¿°ú*¿Ä:,¿ÎÚ,¿ÎÚ,¿ºš+¿Ä:,¿Ä:,¿ºš+¿°ú*¿Ä:,¿ºš+¿ºš+¿ºš+¿¦Z*¿¦Z*¿°ú*¿ºš+¿ºš+¿¦Z*¿°ú*¿°ú*¿¦Z*¿¦Z*¿¦Z*¿°ú*¿ºš+¿¦Z*¿¦Z*¿¦Z*¿ºš+¿ºš+¿ºš+¿Ä:,¿°ú*¿°ú*¿ºš+¿°ú*¿ºš+¿ºš+¿ºš+¿œº)¿°ú*¿°ú*¿Ä:,¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿¦Z*¿¦Z*¿¦Z*¿¦Z*¿°ú*¿°ú*¿¦Z*¿¦Z*¿ºš+¿ºš+¿ºš+¿ºš+¿ºš+¿ºš+¿¦Z*¿°ú*¿°ú*¿Ä:,¿°ú*¿Ä:,¿Ä:,¿ÎÚ,¿°ú*¿¦Z*¿¦Z*¿¦Z*¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿œº)¿œº)¿ºš+¿ºš+¿°ú*¿°ú*¿ºš+¿°ú*¿°ú*¿¦Z*¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿°ú*¿ºš+¿ºš+¿ºš+¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿ºš+¿ºš+¿œº)¿¦Z*¿¦Z*¿Ä:,¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿¦Z*¿¦Z*¿°ú*¿¦Z*¿¦Z*¿ºš+¿ºš+¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿ÎÚ,¿ÎÚ,¿ºš+¿°ú*¿°ú*¿Ä:,¿°ú*¿ºš+¿ºš+¿ºš+¿¦Z*¿¦Z*¿¦Z*¿°ú*¿°ú*¿°ú*¿ºš+¿°ú*¿°ú*¿°ú*¿¦Z*¿¦Z*¿¦Z*¿ºš+¿°ú*¿¦Z*¿¦Z*¿ºš+¿ºš+¿ºš+¿ºš+¿Ä:,¿Ä:,¿ºš+¿ºš+¿ºš+¿ºš+¿Ä:,¿Ä:,¿ºš+¿¦Z*¿ºš+¿ºš+¿ºš+¿œº)¿°ú*¿°ú*¿°ú*¿œº)¿œº)¿ÎÚ,¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿¦Z*¿¦Z*¿°ú*¿Ä:,¿Ä:,¿ºš+¿ºš+¿ºš+¿Ä:,¿ºš+¿°ú*¿°ú*¿°ú*¿ÎÚ,¿ºš+¿ºš+¿ºš+¿ºš+¿ºš+¿¦Z*¿°ú*¿°ú*¿ºš+¿¦Z*¿¦Z*¿°ú*¿°ú*¿°ú*¿¦Z*¿°ú*¿œº)¿¦Z*¿¦Z*¿¦Z*¿¦Z*¿¦Z*¿Ä:,¿°ú*¿°ú*¿ºš+¿ºš+¿ºš+¿°ú*¿ºš+¿ºš+¿°ú*¿°ú*¿Ä:,¿°ú*¿°ú*¿ÎÚ,¿°ú*¿°ú*¿ºš+¿°ú*¿°ú*¿¦Z*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿ºš+¿°ú*¿ºš+¿¦Z*¿ºš+¿Ä:,¿ºš+¿ºš+¿°ú*¿ºš+¿ºš+¿Ä:,¿°ú*¿°ú*¿ºš+¿ºš+¿ºš+¿ºš+¿°ú*¿°ú*¿Ä:,¿œº)¿¦Z*¿°ú*¿ºš+¿¦Z*¿¦Z*¿¦Z*¿¦Z*¿°ú*¿°ú*¿¦Z*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿Ä:,¿Ä:,¿°ú*¿ºš+¿Ä:,¿°ú*¿°ú*¿°ú*¿¦Z*¿¦Z*¿°ú*¿°ú*¿°ú*¿ºš+¿ºš+¿ºš+¿ºš+¿¦Z*¿°ú*¿°ú*¿°ú*¿¦Z*¿°ú*¿°ú*¿¦Z*¿¦Z*¿¦Z*¿ºš+¿Ä:,¿Ä:,¿¦Z*¿¦Z*¿¦Z*¿¦Z*¿¦Z*¿ºš+¿°ú*¿°ú*¿ºš+¿ºš+¿ºš+¿Ä:,¿ºš+¿ºš+¿ºš+¿ºš+¿Ä:,¿ºš+¿°ú*¿ºš+¿Ä:,¿Ä:,¿¦Z*¿¦Z*¿¦Z*¿°ú*¿°ú*¿°ú*¿ºš+¿°ú*¿°ú*¿¦Z*¿¦Z*¿¦Z*¿ºš+¿ºš+¿ºš+¿°ú*¿ºš+¿ºš+¿¦Z*¿¦Z*¿ºš+¿ºš+¿ºš+¿ºš+¿Ä:,¿Ä:,¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿Ä:,¿°ú*¿°ú*¿°ú*¿¦Z*¿°ú*¿¦Z*¿¦Z*¿°ú*¿œº)¿œº)¿°ú*¿ºš+¿ºš+¿ºš+¿ºš+¿ºš+¿°ú*¿ºš+¿°ú*¿°ú*¿°ú*¿°ú*¿ºš+¿ºš+¿ºš+¿ºš+¿ºš+¿¦Z*¿ºš+¿ºš+¿°ú*¿°ú*¿¦Z*¿ºš+¿ºš+¿¦Z*¿°ú*¿°ú*¿°ú*¿œº)¿œº)¿°ú*¿¦Z*¿¦Z*¿°ú*¿¦Z*¿¦Z*¿ºš+¿ºš+¿¦Z*¿°ú*¿°ú*¿Ä:,¿°ú*¿°ú*¿°ú*¿Ä:,¿Ä:,¿°ú*¿°ú*¿°ú*¿¦Z*¿Ä:,¿ºš+¿°ú*¿Ä:,¿°ú*¿¦Z*¿¦Z*¿ºš+¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿°ú*¿œº)¿œº)¿ºš+¿¦Z*¿¦Z*¿°ú*¿ºš+¿ºš+¿¦Z*¿°ú*¿°ú*¿ºš+¿ºš+¿ºš+¿ºš+¿ºš+¿°ú*¿ºš+¿ºš+¿¦Z*¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿ºš+¿¦Z*¿œº)¿°ú*¿ºš+¿¦Z*¿¦Z*¿¦Z*¿ºš+¿°ú*¿°ú*¿ºš+¿°ú*¿°ú*¿°ú*¿ºš+¿ºš+¿°ú*¿Ä:,¿Ä:,¿°ú*¿¦Z*¿°ú*¿ºš+¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿¦Z*¿°ú*¿°ú*¿ºš+¿°ú*¿°ú*¿Ä:,¿°ú*¿¦Z*¿¦Z*¿¦Z*¿¦Z*¿œº)¿œº)¿°ú*¿ºš+¿ºš+¿°ú*¿ºš+¿ºš+¿œº)¿°ú*¿°ú*¿ºš+¿ºš+¿ºš+¿°ú*¿¦Z*¿¦Z*¿ºš+¿ºš+¿¦Z*¿ºš+¿ºš+¿°ú*¿œº)¿œº)¿ºš+¿°ú*¿°ú*¿¦Z*¿¦Z*¿¦Z*¿¦Z*¿°ú*¿°ú*¿¦Z*¿¦Z*¿¦Z*¿ºš+¿°ú*¿Ä:,¿¦Z*¿°ú*¿°ú*¿Ä:,¿Ä:,¿¦Z*¿°ú*¿°ú*¿ºš+¿¦Z*¿¦Z*¿ºš+¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿¦Z*¿°ú*¿°ú*¿¦Z*¿°ú*¿ºš+¿¦Z*¿¦Z*¿œº)¿ºš+¿ºš+¿¦Z*¿¦Z*¿¦Z*¿ºš+¿°ú*¿°ú*¿ºš+¿ºš+¿ºš+¿ºš+¿ºš+¿ºš+¿Ä:,¿ºš+¿ºš+¿¦Z*¿¦Z*¿°ú*¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿œº)¿°ú*¿°ú*¿°ú*¿¦Z*¿¦Z*¿°ú*¿°ú*¿°ú*¿ºš+¿°ú*¿°ú*¿°ú*¿¦Z*¿ºš+¿°ú*¿°ú*¿°ú*¿¦Z*¿¦Z*¿Ä:,¿Ä:,¿¦Z*¿°ú*¿Ä:,¿ºš+¿ºš+¿ºš+¿Ä:,¿Ä:,¿Ä:,¿¦Z*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿¦Z*¿¦Z*¿¦Z*¿°ú*¿¦Z*¿¦Z*¿Ä:,¿Ä:,¿œº)¿¦Z*¿¦Z*¿Ä:,¿¦Z*¿¦Z*¿ºš+¿ºš+¿ºš+¿°ú*¿ºš+¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿ºš+¿ºš+¿°ú*¿°ú*¿¦Z*¿ºš+¿ºš+¿¦Z*¿¦Z*¿¦Z*¿ºš+¿¦Z*¿¦Z*¿°ú*¿Ä:,¿Ä:,¿°ú*¿°ú*¿°ú*¿ºš+¿ºš+¿ºš+¿¦Z*¿¦Z*¿ºš+¿ºš+¿ºš+¿°ú*¿ºš+¿ºš+¿°ú*¿¦Z*¿¦Z*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿¦Z*¿°ú*¿¦Z*¿¦Z*¿°ú*¿¦Z*¿¦Z*¿¦Z*¿¦Z*¿°ú*¿°ú*¿ºš+¿°ú*¿°ú*¿°ú*¿ºš+¿ºš+¿œº)¿°ú*¿°ú*¿Ä:,¿°ú*¿°ú*¿ºš+¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿ºš+¿ºš+¿°ú*¿¦Z*¿¦Z*¿°ú*¿¦Z*¿’)¿¦Z*¿Ä:,¿¦Z*¿œº)¿œº)¿°ú*¿ºš+¿ºš+¿°ú*¿ºš+¿ºš+¿ºš+¿°ú*¿°ú*¿¦Z*¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿œº)¿œº)¿œº)¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿¦Z*¿¦Z*¿°ú*¿¦Z*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿¦Z*¿ºš+¿ºš+¿œº)¿°ú*¿°ú*¿ºš+¿¦Z*¿°ú*¿°ú*¿°ú*¿Ä:,¿°ú*¿°ú*¿°ú*¿ºš+¿ºš+¿°ú*¿œº)¿œº)¿ºš+¿ºš+¿ºš+¿¦Z*¿Ä:,¿°ú*¿œº)¿œº)¿°ú*¿ºš+¿ºš+¿¦Z*¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿¦Z*¿Ä:,¿Ä:,¿°ú*¿¦Z*¿°ú*¿Ä:,¿Ä:,¿ºš+¿°ú*¿°ú*¿¦Z*¿’)¿’)¿ºš+¿°ú*¿¦Z*¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿¦Z*¿¦Z*¿¦Z*¿°ú*¿œº)¿œº)¿Ä:,¿°ú*¿°ú*¿ºš+¿ºš+¿ºš+¿`ú%¿VZ%¿8z#¿$:"¿ü¹¿ÞÙ¿Àù¿Àù¿z™¿\¹¿\¹¿*™¿¿¿Ðø ¿² ¿² ¿”8 ¿vX¿vX¿:˜¿&X¿¿Ó/ý¾¿ïû¾«¯ú¾[¯õ¾[¯õ¾ ¯ð¾÷nï¾÷nモ.é¾C.ä¾C.ä¾ßíݾ˭ܾ˭ܾgmÖ¾+­Ò¾mѾmѾïìξwlǾwlǾwlǾ'l¾,Á¾,Á¾ë«¾¾ÿ뿾ÿ뿾×k½¾×k½¾×k½¾ë«¾¾ë«¾¾ë«¾¾ë«¾¾,Á¾,Á¾,Á¾'l¾c,ƾwlǾwlǾwlǾŸìɾŸìɾ³,˾Çl̾Çl̾mѾ-о-о+­Ò¾?íÓ¾?íÓ¾S-Õ¾gmÖ¾gmÖ¾{­×¾{­×¾{­×¾íؾ£-ھ˭ܾ·mÛ¾·mÛ¾ßíݾßíݾßíݾ˭ܾó-ß¾ó-ß¾nà¾ó-ß¾ßíݾnྮá¾/î⾮ᾮᾮá¾Wnå¾Wnå¾/îâ¾/îâ¾/îâ¾C.ä¾/îâ¾/îâ¾®á¾/îâ¾/îâ¾®á¾C.ä¾C.ä¾®á¾ó-ß¾nà¾nà¾nà¾/îâ¾nà¾nà¾ó-ß¾®á¾®á¾nà¾nà¾nà¾nà¾Ë­Ü¾Ë­Ü¾ßíݾnà¾Ë­Ü¾Ë­Ü¾ßíݾßíݾ£-Ú¾£-Ú¾£-Ú¾{­×¾{­×¾íؾS-Õ¾S-Õ¾gmÖ¾íؾíؾ+­Ò¾+­Ò¾+­Ò¾+­Ò¾mѾmѾïìξ-о۬;۬;۬;-оÇl̾Çl̾Çl̾³,˾³,˾Ÿìɾ³,˾³,˾ŸìɾŸìɾŸìɾ‹¬È¾‹¬È¾‹¬È¾c,ƾc,ƾwlǾwlǾwlǾOìľOìľOìľc,ƾOìľOìľOìľOìľOìľOìľwlǾOìľwlǾŸìɾwlǾwlǾwlǾ³,˾ŸìɾŸìɾ³,˾³,˾³,˾ŸìɾÇl̾Çl̾ŸìɾŸìɾÇl̾³,˾³,˾۬;۬;۬;۬;-о-оmѾ-о-о+­Ò¾-о-о+­Ò¾S-Õ¾S-Õ¾S-Õ¾gmÖ¾gmÖ¾gmÖ¾S-Õ¾{­×¾íؾíؾ{­×¾{­×¾{­×¾{­×¾Ë­Ü¾Ë­Ü¾·mÛ¾·mÛ¾·mÛ¾£-Ú¾íؾíؾ·mÛ¾·mÛ¾íؾ·mÛ¾·mÛ¾·mÛ¾£-Ú¾·m۾˭ܾ·mÛ¾·mÛ¾·mÛ¾·mÛ¾·m۾˭ܾ˭ܾ˭ܾ£-Ú¾·mÛ¾·mÛ¾£-Ú¾íؾ£-ھ˭ܾíؾíؾíؾíؾgmÖ¾gmÖ¾gmÖ¾gmÖ¾gmÖ¾gmÖ¾gmÖ¾?íÓ¾?íÓ¾?íÓ¾mѾmѾïìξmѾmѾ۬;۬;۬;-оÇl̾Çl̾³,˾³,˾wlǾŸìɾŸìɾc,ƾwlǾwlǾc,ƾ'l¾'l¾;¬Ã¾,Á¾ÿ뿾,Á¾,Á¾×k½¾×k½¾×k½¾×k½¾×k½¾×k½¾¯ëº¾¯ëº¾¯ëº¾‡k¸¾‡k¸¾s+·¾_ëµ¾_ëµ¾_ëµ¾›«¹¾›«¹¾s+·¾_ëµ¾_ëµ¾#+²¾_ëµ¾_ëµ¾7k³¾7k³¾7k³¾‡k¸¾K«´¾K«´¾s+·¾_ëµ¾s+·¾7k³¾7k³¾_ëµ¾‡k¸¾‡k¸¾‡k¸¾¯ëº¾¯ëº¾×k½¾¯ëº¾¯ëº¾×k½¾ë«¾¾ë«¾¾ë«¾¾,Á¾;¬Ã¾wlǾwlǾc,ƾwlǾwlǾ‹¬È¾‹¬È¾‹¬È¾³,˾Çl̾Çl̾Çl̾³,˾³,˾-о-оïìξ-о-о+­Ò¾-о-о?íÓ¾?íÓ¾?íÓ¾S-Õ¾S-Õ¾S-Õ¾S-Õ¾gmÖ¾gmÖ¾gmÖ¾íؾíؾ{­×¾{­×¾£-Ú¾íؾíؾíؾ£-Ú¾£-Ú¾£-Ú¾{­×¾{­×¾£-Ú¾£-Ú¾£-Ú¾£-Ú¾{­×¾{­×¾gmÖ¾íؾ{­×¾gmÖ¾gmÖ¾gmÖ¾gmÖ¾gmÖ¾?íÓ¾?íÓ¾?íÓ¾+­Ò¾+­Ò¾mѾïìξïìξ-о+­Ò¾+­Ò¾Û¬Í¾ïìξïìξÇl̾ŸìɾŸìɾ‹¬È¾³,˾³,˾wlǾOìľOìľc,ƾ'l¾'l¾ÿ뿾ÿ뿾ÿ뿾Ã+¼¾Ã+¼¾×k½¾×k½¾×k½¾›«¹¾s+·¾s+·¾7k³¾#+²¾#+²¾7k³¾7k³¾7k³¾çj®¾çj®¾çj®¾Ó*­¾¿ê«¾¿ê«¾—j©¾«ªª¾[ª¥¾[ª¥¾Gj¤¾[ª¥¾꡾꡾÷iŸ¾Ï霾Ï霾é—¾Wi•¾Wi•¾gh†¾ÕM]¾ÕM]¾9Žã½i‹¶½i‹¶½É¾]ÍU¾]ÍU¾Ó*­¾c,ƾ£-Ú¾k®æ¾3/ó¾Ó/ý¾¸¿¸¿b¿vX¿vX¿Š˜¿”8 ¿”8 ¿² ¿¨x -¿¨x -¿¨x -¿Š˜¿¨x -¿žØ ¿”8 ¿Š˜¿¨x -¿¨x -¿€ø¿Š˜¿Š˜¿€ø¿l¸¿l¸¿vX¿l¸¿l¸¿NØ¿b¿b¿Xx¿Xx¿NØ¿:˜¿:˜¿:˜¿&X¿&X¿¸¿&X¿&X¿û¯ÿ¾x¿x¿çoþ¾Ó/ý¾Ó/ý¾¿ïû¾«¯ú¾«¯ú¾—où¾ƒ/ø¾ƒ/ø¾oïö¾[¯õ¾3/ó¾ ¯ð¾ ¯ð¾ ¯ð¾÷nï¾÷nï¾ ¯ð¾ ¯ð¾ ¯ð¾»®ë¾Ïîì¾Ïîì¾î羓.龓.龓.é¾C.ä¾C.ä¾k®æ¾nà¾nà¾ßíݾßíݾ·mÛ¾£-Ú¾£-Ú¾íؾgmÖ¾gmÖ¾S-Õ¾+­Ò¾+­Ò¾-оmѾïìξ³,˾ŸìɾŸìɾŸìɾc,ƾc,ƾc,ƾc,ƾ'l¾,Á¾,Á¾ÿ뿾×k½¾×k½¾¯ëº¾›«¹¾›«¹¾›«¹¾K«´¾7k³¾7k³¾7k³¾ûª¯¾Ó*­¾Ó*­¾¿ê«¾«ªª¾«ªª¾ƒ*¨¾[ª¥¾[ª¥¾3*£¾꡾꡾Ï霾»©›¾§iš¾k©–¾Wi•¾/é’¾ó(¾ó(¾ýÍ_¾É¾É¾‰‰˜½ÉŠ¬½ÉŠ¬½mÌF¾gh†¾ƒ*¨¾;¬Ã¾;¬Ã¾Wnå¾ã.î¾ã.î¾Ó/ý¾¿¿NØ¿NØ¿NØ¿vX¿vX¿vX¿b¿€ø¿€ø¿b¿l¸¿l¸¿l¸¿l¸¿b¿l¸¿l¸¿NØ¿NØ¿NØ¿D8¿D8¿D8¿:˜¿¿¿:˜¿¸¿¸¿x¿&X¿û¯ÿ¾Ó/ý¾û¯ÿ¾çoþ¾û¯ÿ¾û¯ÿ¾¿ïû¾¿ïû¾¿ïû¾«¯ú¾oïö¾oïö¾Goô¾oïö¾oïö¾[¯õ¾Goô¾Goô¾Goô¾ïñ¾ã.î¾ã.î¾ã.nê¾»®ë¾»®ë¾»®ë¾îç¾îç¾k®æ¾k®æ¾k®æ¾®á¾®á¾®á¾ó-ß¾nà¾Ë­Ü¾·mÛ¾·mÛ¾£-Ú¾£-Ú¾£-Ú¾?íÓ¾S-Õ¾S-Õ¾mѾmѾmѾïìξïìξïìξÇl̾³,˾ŸìɾwlǾwlǾ;¬Ã¾c,ƾc,ƾ,Á¾ë«¾¾ë«¾¾ë«¾¾Ã+¼¾Ã+¼¾‡k¸¾‡k¸¾‡k¸¾7k³¾7k³¾#+²¾#+²¾#+²¾çj®¾Ó*­¾Ó*­¾—j©¾ƒ*¨¾ƒ*¨¾3*£¾[ª¥¾ ª ¾÷iŸ¾÷iŸ¾»©›¾»©›¾»©›¾C)”¾©‘¾©‘¾{¨‡¾ÝÏ}¾ÝÏ}¾ -Ⱦ)Š¢½)Š¢½)Š¢½…H¾…H¾ßè¾Ó*­¾;¬Ã¾S-Õ¾S-Õ¾÷nï¾[¯õ¾[¯õ¾û¯ÿ¾¸¿¸¿:˜¿D8¿D8¿0ø¿NØ¿NØ¿NØ¿:˜¿:˜¿D8¿:˜¿:˜¿0ø¿0ø¿&X¿&X¿¿¸¿x¿x¿¸¿û¯ÿ¾û¯ÿ¾çoþ¾û¯ÿ¾û¯ÿ¾Ó/ý¾¿ïû¾¿ïû¾«¯ú¾ƒ/ø¾ƒ/ø¾—où¾[¯õ¾[¯õ¾oïö¾Goô¾Goô¾Goô¾Goô¾ïñ¾3/ó¾3/ó¾ ¯ð¾ ¯ð¾ ¯ð¾ã.î¾Ïîì¾Ïî쾧n꾧n꾧nê¾îç¾k®æ¾k®æ¾C.ä¾C.ä¾C.ä¾®á¾nà¾ó-߾˭ܾ˭ܾ·mÛ¾£-Ú¾£-Ú¾£-Ú¾gmÖ¾gmÖ¾{­×¾gmÖ¾gmÖ¾+­Ò¾?íÓ¾mѾïìξïìξ۬;³,˾³,˾‹¬È¾ŸìɾŸìɾwlǾc,ƾc,ƾ,Á¾ÿ뿾ÿ뿾Ã+¼¾›«¹¾›«¹¾¯ëº¾s+·¾_ëµ¾_ëµ¾_ëµ¾#+²¾ë°¾ë°¾çj®¾—j©¾—j©¾«ªª¾«ªª¾«ªª¾[ª¥¾ ª ¾ ª ¾Ï霾Ï霾Ï霾闾闾©‘¾/é’¾/é’¾+¨‚¾ÅNl¾ÅNl¾ ŒÀ½q -W½q -W½‰‰˜½­È -¾­È -¾Wi•¾7k³¾7k³¾Ë­Ü¾k®æ¾÷nï¾Goô¾¿ïû¾çoþ¾û¯ÿ¾û¯ÿ¾¸¿&X¿&X¿¸¿&X¿&X¿¸¿¸¿¸¿¿¸¿¸¿x¿x¿x¿çoþ¾Ó/ý¾¿ïû¾¿ïû¾¿ïû¾«¯ú¾—où¾—où¾«¯ú¾«¯ú¾«¯ú¾[¯õ¾oïö¾oïö¾ïñ¾Goô¾Goô¾3/ó¾3/ó¾3/ó¾ïñ¾÷nï¾ ¯ð¾÷nï¾Ïîì¾Ïîì¾ã.î¾ã.n꾓.龓.龧nê¾k®æ¾k®æ¾k®æ¾Wnå¾Wnå¾nà¾C.ä¾/îâ¾nà¾nà¾ó-ß¾ó-ß¾ó-߾˭ܾ·mÛ¾·mÛ¾íؾíؾíؾS-Õ¾gmÖ¾gmÖ¾S-Õ¾-о-о-оmѾmѾ³,˾۬;³,˾³,˾ŸìɾŸìɾc,ƾc,ƾOìľ'l¾'l¾×k½¾,Á¾,Á¾›«¹¾¯ëº¾¯ëº¾‡k¸¾K«´¾K«´¾7k³¾ë°¾ûª¯¾çj®¾çj®¾«ªª¾«ªª¾«ªª¾oꦾ[ª¥¾[ª¥¾꡾ã)ž¾ã)ž¾Ï霾»©›¾»©›¾©‘¾ó(¾Ë¨Œ¾?胾=Ïs¾…MX¾ýȾýȾ ½ ½ ½É¾Oq¾Oq¾‡k¸¾Çl̾Çl̾k®æ¾÷nï¾÷nᆱ¯ú¾û¯ÿ¾Ó/ý¾û¯ÿ¾û¯ÿ¾x¿çoþ¾çoþ¾û¯ÿ¾û¯ÿ¾û¯ÿ¾çoþ¾çoþ¾çoþ¾çoþ¾Ó/ý¾¿ïû¾ƒ/ø¾ƒ/ø¾«¯ú¾oïö¾oïö¾[¯õ¾oïö¾oïö¾3/ó¾3/ó¾3/ó¾3/ó¾ ¯ð¾ ¯ð¾÷nï¾ ¯ð¾ã.î¾÷nï¾÷nï¾»®ë¾Ïîì¾Ïî쾧n꾓.龓.龓.é¾îç¾î羓.龓.龓.é¾C.ä¾C.ä¾Wn微ᾮᾮá¾ó-ß¾ó-ß¾ßíݾó-ß¾ó-ß¾ßíݾ˭ܾ˭ܾ˭ܾ£-Ú¾£-Ú¾£-Ú¾{­×¾{­×¾{­×¾gmÖ¾+­Ò¾+­Ò¾+­Ò¾?íÓ¾mѾmѾmѾïìξïìξ³,˾Çl̾Çl̾ŸìɾwlǾwlǾOìľ;¬Ã¾'l¾;¬Ã¾,Á¾ë«¾¾ë«¾¾ë«¾¾¯ëº¾¯ëº¾¯ëº¾‡k¸¾7k³¾7k³¾_ëµ¾#+²¾#+²¾ë°¾ûª¯¾¿ê«¾¿ê«¾¿ê«¾ƒ*¨¾Gj¤¾Gj¤¾[ª¥¾÷iŸ¾÷iŸ¾Ï霾»©›¾»©›¾C)”¾i¾i¾S(…¾h¾íÎn¾ELD¾)ò½a½¡ -ª¼¡ -ª¼¹‹»½-Ë2¾-Ë2¾oꦾÿ뿾+­Ò¾nྒྷ.é¾ïñ¾Goô¾Goô¾ƒ/ø¾¿ïû¾¿ïû¾çoþ¾Ó/ý¾Ó/ý¾çoþ¾çoþ¾çoþ¾¿ïû¾Ó/ý¾¿ïû¾—où¾—où¾oïö¾oïö¾oïö¾Goô¾3/ó¾3/ó¾ ¯ð¾[¯õ¾ïñ¾ã.î¾ã.î¾÷nï¾ ¯ð¾ ¯ð¾»®ë¾Ïîì¾Ïî쾓.龧n꾧n꾧nê¾îç¾îç¾k®æ¾k®æ¾Wnå¾k®æ¾k®æ¾®á¾®á¾®á¾/îâ¾ßíݾßíݾnà¾ßíݾßíݾßíݾßíݾ˭ܾ·mÛ¾·mÛ¾·mÛ¾£-Ú¾£-Ú¾{­×¾íؾíؾ{­×¾gmÖ¾gmÖ¾?íÓ¾?íÓ¾?íÓ¾mѾ-о-оmѾ-о۬;ïìξïìξ۬;³,˾³,˾wlǾ‹¬È¾‹¬È¾c,ƾc,ƾc,ƾ;¬Ã¾;¬Ã¾;¬Ã¾ÿ뿾ÿ뿾×k½¾Ã+¼¾Ã+¼¾›«¹¾¯ëº¾¯ëº¾_ëµ¾s+·¾s+·¾#+²¾ë°¾ë°¾ë°¾ûª¯¾Ó*­¾«ªª¾«ªª¾oꦾƒ*¨¾ƒ*¨¾÷iŸ¾÷iŸ¾÷iŸ¾“)™¾é—¾é—¾C)”¾ó(¾ó(¾gh†¾ÝÏ}¾ÝÏ}¾ÍË<¾éÞ½‘ 9½a –¼q½‹±½K0¾K0¾oꦾÿ뿾ÿ뿾ßíݾk®æ¾k®æ¾ ¯ð¾[¯õ¾[¯õ¾«¯ú¾—où¾—où¾¿ïû¾—où¾«¯ú¾—où¾—où¾[¯õ¾[¯õ¾[¯õ¾oïö¾Goô¾Goô¾Goô¾ïñ¾ïñ¾÷nï¾ ¯ð¾ ¯ð¾ã.î¾Ïîì¾Ïîì¾»®ë¾»®ë¾»®ë¾§nê¾îç¾îç¾k®æ¾k®æ¾Wnå¾Wnå¾Wnå¾Wnå¾/îâ¾/îâ¾C.侮ᾮá¾nà¾nà¾nྷm۾˭ܾ˭ܾ˭ܾ˭ܾ˭ܾ£-Ú¾·mÛ¾£-Ú¾gmÖ¾íؾ{­×¾{­×¾{­×¾{­×¾gmÖ¾gmÖ¾S-Õ¾+­Ò¾+­Ò¾+­Ò¾?íÓ¾?íÓ¾ïìξïìξïìξïìξïìξ۬;۬;۬;³,˾³,˾³,˾wlǾwlǾwlǾwlǾOìľOìľ'l¾Oìľÿ뿾,Á¾,Á¾×k½¾ÿ뿾ÿ뿾×k½¾›«¹¾›«¹¾‡k¸¾›«¹¾›«¹¾K«´¾7k³¾7k³¾7k³¾ë°¾ë°¾çj®¾¿ê«¾¿ê«¾—j©¾3*£¾Gj¤¾[ª¥¾[ª¥¾÷iŸ¾ã)ž¾ã)ž¾§iš¾C)”¾C)”¾©‘¾ßè¾ßè¾ÝÏ}¾eOv¾eOv¾%I¾Ù‰½Ù‰½!‚¼±k½5H¾­ÍZ¾/é’¾7k³¾ŸìɾŸìɾ®á¾“.龓.é¾Goô¾[¯õ¾[¯õ¾—où¾—où¾—où¾—où¾ƒ/ø¾ƒ/ø¾ƒ/ø¾Goô¾Goô¾Goô¾Goô¾3/ó¾ïñ¾ïñ¾ïñ¾ïñ¾ïñ¾÷nï¾÷nï¾÷nï¾»®ë¾“.龓.龓.龓.龓.é¾îç¾Wnå¾Wnå¾C.ä¾Wnå¾/îâ¾/îâ¾/îâ¾nà¾ó-ß¾ó-ß¾ó-ß¾ßíݾßíݾ˭ܾ˭ܾ˭ܾ£-Ú¾£-Ú¾£-Ú¾£-Ú¾£-Ú¾íؾ{­×¾{­×¾íؾ{­×¾{­×¾?íÓ¾gmÖ¾S-Õ¾?íÓ¾?íÓ¾mѾS-Õ¾S-Õ¾mѾmѾmѾïìξ۬;۬;Çl̾Çl̾Çl̾Çl̾ŸìɾŸìɾŸìɾŸìɾwlǾc,ƾc,ƾc,ƾOìľOìľ'l¾c,ƾc,ƾÿ뿾뫾¾ë«¾¾¯ëº¾¯ëº¾¯ëº¾Ã+¼¾¯ëº¾‡k¸¾›«¹¾›«¹¾‡k¸¾_ëµ¾_ëµ¾#+²¾ë°¾ë°¾Ó*­¾¿ê«¾¿ê«¾¿ê«¾—j©¾Gj¤¾Gj¤¾꡾3*£¾÷iŸ¾÷iŸ¾»©›¾§iš¾§iš¾C)”¾/é’¾/é’¾£(Š¾S(…¾S(…¾uNg¾õK?¾‰Žè½Ñ M½Ñ M½¡ -ª¼ÉŠ¬½ÉŠ¬½eOv¾÷iŸ¾÷iŸ¾Çl̾íؾíؾ§nê¾ã.î¾ã.î¾Goô¾oïö¾[¯õ¾ƒ/ø¾ƒ/ø¾[¯õ¾Goô¾Goô¾oïö¾3/ó¾3/ó¾Goô¾3/ó¾ïñ¾ ¯ð¾ ¯ð¾ïñ¾»®ë¾»®ë¾§nê¾»®ë¾»®ë¾“.龓.龓.é¾îç¾Wnå¾Wnå¾C.ä¾nà¾C.ä¾®á¾ó-ß¾ó-ß¾®á¾®á¾·mÛ¾ßíݾßíݾ˭ܾíؾíؾ·mÛ¾·mÛ¾·mÛ¾£-Ú¾íؾíؾíؾgmÖ¾íؾS-Õ¾S-Õ¾gmÖ¾S-Õ¾S-Õ¾S-Õ¾gmÖ¾gmÖ¾-оmѾmѾ-о-о-оïìξ۬;۬;Çl̾Çl̾³,˾ŸìɾŸìɾŸìɾc,ƾc,ƾ‹¬È¾wlǾwlǾwlǾ‹¬È¾‹¬È¾;¬Ã¾;¬Ã¾Oìľ뫾¾'l¾'l¾,Á¾,Á¾ë«¾¾ë«¾¾ë«¾¾¯ëº¾¯ëº¾¯ëº¾‡k¸¾_ëµ¾_ëµ¾_ëµ¾#+²¾#+²¾#+²¾ë°¾¿ê«¾¿ê«¾¿ê«¾¿ê«¾—j©¾—j©¾oꦾ[ª¥¾[ª¥¾꡾ ª ¾ ª ¾»©›¾“)™¾é—¾/é’¾©‘¾ßè¾èˆ¾èˆ¾eOv¾ýÍ_¾ýÍ_¾)Š¢½á ¾¼á ¾¼q½ùŒÏ½ÌA¾·h‹¾·h‹¾,Á¾mѾmѾC.侧n꾧nê¾ïñ¾3/ó¾3/ó¾ƒ/ø¾[¯õ¾[¯õ¾ƒ/ø¾oïö¾3/ó¾3/ó¾3/ó¾[¯õ¾ïñ¾ïñ¾÷nï¾ ¯ð¾ ¯ð¾Ïîì¾»®ë¾»®ë¾§n꾧n꾧nê¾îç¾k®æ¾“.é¾/îâ¾/îâ¾/îâ¾Wnå¾Wnå¾ó-ß¾®á¾®á¾®á¾ßíݾßíݾßíݾßíݾ·mÛ¾ßíݾ£-Ú¾íؾ£-Ú¾£-Ú¾íؾíؾíؾ{­×¾{­×¾{­×¾{­×¾{­×¾{­×¾mѾmѾmѾ+­Ò¾-о-оmѾmѾïìξ۬;۬;Çl̾Çl̾Çl̾Çl̾ŸìɾŸìɾÇl̾‹¬È¾‹¬È¾‹¬È¾³,˾³,˾c,ƾwlǾ‹¬È¾Oìľ;¬Ã¾;¬Ã¾OìľOìľÿ뿾'l¾'l¾뫾¾ë«¾¾ë«¾¾×k½¾›«¹¾×k½¾¯ëº¾›«¹¾‡k¸¾‡k¸¾‡k¸¾#+²¾#+²¾#+²¾K«´¾ë°¾ë°¾ûª¯¾çj®¾çj®¾¿ê«¾—j©¾—j©¾ƒ*¨¾[ª¥¾꡾3*£¾ ª ¾÷iŸ¾»©›¾»©›¾/é’¾Wi•¾Wi•¾{¨‡¾gh†¾gh†¾eOv¾…MX¾MɾɊ¬½ ½Á ¼¡ú¼¡ú¼¥K:¾èˆ¾èˆ¾,Á¾-о-оk®æ¾§n꾧nê¾ïñ¾Goô¾3/ó¾3/ó¾3/ó¾oïö¾oïö¾oïö¾[¯õ¾[¯õ¾[¯õ¾ïñ¾ ¯ð¾ ¯ð¾ã.î¾ã.î¾ã.î¾»®ë¾§n꾧n꾧nê¾Wnå¾k®æ¾k®æ¾k®æ¾C.ä¾C.ä¾C.ä¾Wnå¾C.ä¾C.ä¾/î⾮ᾮá¾ßíݾó-ß¾·mÛ¾ßíݾ˭ܾ·mÛ¾£-Ú¾£-Ú¾·mÛ¾·mÛ¾·mÛ¾S-Õ¾{­×¾{­×¾?íÓ¾gmÖ¾gmÖ¾S-Õ¾+­Ò¾+­Ò¾+­Ò¾+­Ò¾+­Ò¾-о-о-оïìξïìξ-о۬;۬;۬;۬;۬;Çl̾۬;Çl̾ŸìɾŸìɾŸìɾŸìɾŸìɾwlǾwlǾwlǾ;¬Ã¾;¬Ã¾;¬Ã¾;¬Ã¾;¬Ã¾;¬Ã¾,Á¾ÿ뿾ÿ뿾ÿ뿾×k½¾×k½¾Ã+¼¾Ã+¼¾›«¹¾›«¹¾›«¹¾¯ëº¾s+·¾s+·¾‡k¸¾_ëµ¾_ëµ¾7k³¾ë°¾ë°¾ë°¾ûª¯¾ûª¯¾¿ê«¾—j©¾—j©¾oꦾoꦾGj¤¾3*£¾3*£¾Ï霾»©›¾»©›¾»©›¾C)”¾C)”¾ó(¾Ë¨Œ¾Ë¨Œ¾+¨‚¾µO{¾µO{¾UK5¾™Ù½ñ -/½A 4¼A 4¼)Š¢½ÅI¾ÅI¾ã)ž¾›«¹¾›«¹¾{­×¾/îâ¾/îâ¾Ïîì¾÷nï¾÷nï¾ïñ¾3/ó¾Goô¾Goô¾Goô¾3/ó¾3/ó¾3/ó¾ïñ¾÷nï¾÷nï¾÷nï¾Ïîì¾Ïîì¾»®ë¾Ïîì¾Ïî쾧n꾧n꾧nê¾k®æ¾îç¾îç¾k®æ¾k®æ¾C.ä¾C.ä¾C.侮ᾮᾮá¾ó-ß¾ßíݾßíݾ˭ܾ·mÛ¾·mÛ¾·mÛ¾·mÛ¾·mÛ¾íؾíؾ£-Ú¾gmÖ¾gmÖ¾{­×¾{­×¾{­×¾S-Õ¾gmÖ¾gmÖ¾S-Õ¾?íÓ¾?íÓ¾+­Ò¾?íÓ¾?íÓ¾mѾ۬;۬;mѾ-оïìξ۬;ïìξÇl̾³,˾³,˾Ÿìɾ³,˾³,˾ŸìɾŸìɾŸìɾ‹¬È¾wlǾwlǾ;¬Ã¾OìľOìľ;¬Ã¾'l¾'l¾;¬Ã¾;¬Ã¾ÿ뿾,Á¾,Á¾×k½¾×k½¾×k½¾×k½¾Ã+¼¾Ã+¼¾›«¹¾s+·¾s+·¾s+·¾K«´¾7k³¾ë°¾#+²¾ûª¯¾¿ê«¾¿ê«¾Ó*­¾Ó*­¾Ó*­¾ƒ*¨¾oꦾoꦾGj¤¾÷iŸ¾÷iŸ¾ã)ž¾Ï霾Ï霾é—¾/é’¾/é’¾©‘¾£(Š¾S(…¾h¾Ïx¾ÕM]¾íɾíɾ± ½Á ¼Á ¼i‹¶½K0¾K0¾ ª ¾Ã+¼¾Û¬Í¾£-Ú¾nà¾îç¾Ïîì¾ã.î¾Goô¾3/ó¾3/ó¾ïñ¾Goô¾Goô¾3/ó¾ ¯ð¾ ¯ð¾Goô¾ïñ¾ïñ¾ ¯ð¾ïñ¾ïñ¾»®ë¾Ïîì¾Ïîì¾»®ë¾§nê¾»®ë¾îç¾îç¾Wnå¾Wnå¾Wnå¾/îâ¾C.ä¾C.ä¾ó-ß¾nà¾nà¾ó-߾˭ܾ˭ܾßíݾßíݾßíݾ£-Ú¾£-Ú¾£-Ú¾íؾ£-Ú¾£-Ú¾gmÖ¾gmÖ¾{­×¾{­×¾{­×¾S-Õ¾S-Õ¾S-Õ¾+­Ò¾+­Ò¾+­Ò¾?íÓ¾-о-оmѾmѾmѾïìξ۬;۬;۬;Çl̾Çl̾³,˾Ÿìɾ³,˾‹¬È¾‹¬È¾³,˾‹¬È¾‹¬È¾wlǾwlǾwlǾ;¬Ã¾OìľOìľOìľOìľOìľ;¬Ã¾;¬Ã¾'l¾,Á¾,Á¾ë«¾¾×k½¾×k½¾¯ëº¾¯ëº¾¯ëº¾›«¹¾s+·¾s+·¾K«´¾K«´¾K«´¾#+²¾#+²¾ûª¯¾ûª¯¾ûª¯¾¿ê«¾çj®¾çj®¾—j©¾oꦾoꦾGj¤¾3*£¾3*£¾÷iŸ¾Ï霾Ï霾§iš¾é—¾/é’¾i¾ó(¾·h‹¾S(…¾S(…¾Îi¾•LI¾•LI¾Qu½a –¼a –¼‘ 9½)ò½)ò½ó(¾Ó*­¾Ó*­¾mѾ·mÛ¾C.ä¾»®ë¾Ïîì¾÷nï¾ïñ¾ïñ¾3/ó¾Goô¾Goô¾[¯õ¾3/ó¾3/ó¾3/ó¾ ¯ð¾ ¯ð¾ïñ¾ã.î¾ã.î¾»®ë¾»®ë¾»®ë¾»®ë¾“.龓.龓.龓.é¾Wnå¾Wnå¾Wnå¾/îâ¾nà¾nà¾/îâ¾nà¾nྮá¾ó-ß¾ó-ß¾ó-ß¾ßíݾ˭ܾ˭ܾ˭ܾ£-Ú¾£-Ú¾£-Ú¾£-Ú¾íؾíؾ{­×¾gmÖ¾gmÖ¾-оS-Õ¾S-Õ¾S-Õ¾mѾ+­Ò¾+­Ò¾-оmѾ-о-оïìξïìξïìξïìξÇl̾Çl̾ïìξÇl̾Çl̾Çl̾Çl̾³,˾ŸìɾŸìɾŸìɾ‹¬È¾‹¬È¾wlǾ‹¬È¾‹¬È¾;¬Ã¾OìľOìľ,Á¾'l¾'l¾ÿ뿾뫾¾ë«¾¾ÿ뿾¯ëº¾×k½¾Ã+¼¾Ã+¼¾‡k¸¾›«¹¾›«¹¾›«¹¾_ëµ¾_ëµ¾_ëµ¾K«´¾K«´¾ûª¯¾ë°¾ë°¾Ó*­¾Ó*­¾Ó*­¾oꦾ[ª¥¾oꦾGj¤¾3*£¾ ª ¾ ª ¾ ª ¾“)™¾é—¾é—¾k©–¾i¾i¾Ë¨Œ¾S(…¾S(…¾eOv¾MÎd¾MÎd¾©ŒÊ½ñ -/½Á ¼!‚¼Iˆ„½É¾ÅNl¾ÅNl¾K«´¾ŸìɾŸìɾó-ß¾k®æ¾k®æ¾ã.î¾÷nï¾÷nï¾Goô¾3/ó¾3/ó¾3/ó¾ïñ¾ ¯ð¾ïñ¾ïñ¾ïñ¾Ïîì¾Ïîì¾Ïîì¾»®ë¾»®ë¾»®ë¾Ïîì¾Ïî쾓.é¾îç¾îç¾k®æ¾k®æ¾k®æ¾Wnå¾C.ä¾/îâ¾C.ä¾®á¾nà¾nà¾nà¾nà¾ßíݾßíݾ˭ܾíؾ£-ھ˭ܾ˭ܾíؾ£-Ú¾£-Ú¾£-Ú¾{­×¾{­×¾{­×¾?íÓ¾?íÓ¾?íÓ¾gmÖ¾?íÓ¾+­Ò¾+­Ò¾S-Õ¾mѾmѾ+­Ò¾-о-о-оmѾmѾ۬;۬;۬;ïìξ³,˾³,˾³,˾³,˾ŸìɾŸìɾŸìɾwlǾŸìɾŸìɾc,ƾOìľOìľc,ƾ;¬Ã¾;¬Ã¾;¬Ã¾;¬Ã¾,Á¾ÿ뿾ÿ뿾,Á¾ë«¾¾ë«¾¾×k½¾Ã+¼¾Ã+¼¾›«¹¾¯ëº¾s+·¾_ëµ¾_ëµ¾K«´¾7k³¾7k³¾ë°¾ûª¯¾ûª¯¾Ó*­¾Ó*­¾Ó*­¾oꦾƒ*¨¾ƒ*¨¾oꦾ꡾÷iŸ¾÷iŸ¾÷iŸ¾“)™¾é—¾é—¾Wi•¾/é’¾/é’¾£(Š¾gh†¾gh†¾eOv¾ÕM]¾=Ê#¾ ŒÀ½Q -%½Á ¼!‚¼!‚¼íɾ=Ïs¾=Ïs¾s+·¾‹¬È¾‹¬È¾Ë­Ü¾k®æ¾k®æ¾Ïîì¾Ïîì¾ ¯ð¾3/ó¾3/ó¾ïñ¾3/ó¾3/ó¾ïñ¾ïñ¾ïñ¾ ¯ð¾ ¯ð¾ ¯ð¾ïñ¾Ïîì¾Ïîì¾»®ë¾»®ë¾»®ë¾§n꾧nê¾k®æ¾k®æ¾k®æ¾Wnå¾C.ä¾C.ä¾Wnå¾/îâ¾nà¾ó-ß¾ó-ß¾nà¾ßíݾßíݾ˭ܾßíݾßíݾ·mÛ¾£-Ú¾£-Ú¾£-Ú¾íؾ£-Ú¾{­×¾{­×¾{­×¾gmÖ¾gmÖ¾gmÖ¾{­×¾{­×¾S-Õ¾?íÓ¾?íÓ¾?íÓ¾+­Ò¾mѾ+­Ò¾mѾ۬;ïìξïìξ-оïìξïìξÇl̾Çl̾Çl̾³,˾Ÿìɾ‹¬È¾wlǾ‹¬È¾wlǾc,ƾc,ƾ‹¬È¾c,ƾc,ƾc,ƾwlǾwlǾ'l¾;¬Ã¾;¬Ã¾,Á¾,Á¾,Á¾ÿ뿾뫾¾ë«¾¾Ã+¼¾›«¹¾›«¹¾‡k¸¾‡k¸¾K«´¾_ëµ¾_ëµ¾7k³¾ë°¾ë°¾ûª¯¾#+²¾#+²¾¿ê«¾«ªª¾«ªª¾ƒ*¨¾ƒ*¨¾[ª¥¾Gj¤¾Gj¤¾꡾÷iŸ¾÷iŸ¾§iš¾§iš¾§iš¾©‘¾ó(¾ó(¾£(Š¾?胾ÝÏ}¾Îi¾Îi¾5H¾Iˆ„½Iˆ„½p»± ½± ½mÌF¾£(Š¾£(Š¾ÿ뿾۬;۬;®á¾“.龧nê¾Ïîì¾Ïîì¾3/ó¾3/ó¾3/ó¾Goô¾Goô¾Goô¾ ¯ð¾ïñ¾ïñ¾ ¯ð¾÷nï¾÷nï¾ã.î¾ã.î¾ã.n꾧nê¾î羧n꾧nê¾Wnå¾k®æ¾k®æ¾k®æ¾®á¾®á¾C.ä¾/îâ¾®á¾ó-ß¾nà¾ó-ß¾ó-ß¾ó-ß¾ó-ß¾·mÛ¾·mÛ¾ßíݾ˭ܾ˭ܾ£-Ú¾£-Ú¾£-Ú¾{­×¾{­×¾{­×¾íؾ?íÓ¾gmÖ¾?íÓ¾?íÓ¾?íÓ¾+­Ò¾+­Ò¾+­Ò¾mѾmѾmѾïìξïìξ-о۬;۬;ïìξïìξïìξ۬;Çl̾۬;³,˾³,˾³,˾Çl̾Çl̾wlǾwlǾwlǾwlǾc,ƾOìľc,ƾ;¬Ã¾'l¾'l¾'l¾ÿ뿾'l¾'l¾×k½¾¯ëº¾¯ëº¾ë«¾¾¯ëº¾¯ëº¾s+·¾‡k¸¾‡k¸¾K«´¾K«´¾K«´¾7k³¾ë°¾ë°¾ûª¯¾ûª¯¾Ó*­¾«ªª¾«ªª¾ƒ*¨¾oꦾoꦾ ª ¾꡾꡾Ï霾“)™¾é—¾k©–¾C)”¾i¾ßè¾ßè¾{¨‡¾ÝÏ}¾ÝÏ}¾­ÍZ¾íɾíɾaæ¼ - º - º‰‰˜½=Ê#¾=Ê#¾ã)ž¾s+·¾³,˾gm־˭ܾk®æ¾»®ë¾»®ë¾ ¯ð¾ ¯ð¾ ¯ð¾ïñ¾3/ó¾3/ó¾ïñ¾ ¯ð¾ ¯ð¾ïñ¾ ¯ð¾ ¯ð¾÷nï¾÷nᄃnê¾Ïîì¾Ïîì¾»®ë¾“.龓.é¾î羓.龓.é¾Wnå¾îç¾îç¾Wnå¾C.ä¾C.ä¾/îâ¾/îâ¾nྮᾮá¾ó-ß¾®á¾®á¾ßíݾ˭ܾ˭ܾ·mÛ¾íؾ£-Ú¾íؾíؾ{­×¾gmÖ¾gmÖ¾gmÖ¾S-Õ¾S-Õ¾?íÓ¾+­Ò¾+­Ò¾S-Õ¾?íÓ¾?íÓ¾+­Ò¾+­Ò¾+­Ò¾mѾmѾ+­Ò¾mѾmѾ-о-о-оÇl̾Çl̾Çl̾³,˾‹¬È¾ŸìɾŸìɾŸìɾŸìɾc,ƾc,ƾOìľOìľOìľ;¬Ã¾;¬Ã¾;¬Ã¾;¬Ã¾ÿ뿾ÿ뿾뫾¾ë«¾¾ë«¾¾Ã+¼¾Ã+¼¾¯ëº¾›«¹¾›«¹¾›«¹¾_ëµ¾_ëµ¾K«´¾7k³¾7k³¾ë°¾7k³¾7k³¾¿ê«¾«ªª¾«ªª¾¿ê«¾[ª¥¾[ª¥¾Gj¤¾Gj¤¾ã)ž¾÷iŸ¾÷iŸ¾»©›¾§iš¾§iš¾k©–¾i¾i¾Ë¨Œ¾èˆ¾+¨‚¾Ïx¾MÎd¾õK?¾ÙŽí½ÙŽí½Á -\¼p»p»ÙŽí½ -ÍP¾ -ÍP¾Ó*­¾,Á¾,Á¾Ë­Ü¾®á¾“.é¾»®ë¾»®ë¾ ¯ð¾3/ó¾3/ó¾÷nï¾Goô¾Goô¾ïñ¾ïñ¾ ¯ð¾ ¯ð¾ã.î¾÷nï¾÷nï¾÷nï¾ã.î¾»®ë¾»®ë¾Ïî쾓.龓.龧nê¾îç¾îç¾îç¾îç¾Wnå¾Wnå¾Wnå¾/îâ¾ó-ß¾ó-ß¾/î⾮ᾮá¾ßíݾßíݾßíݾ˭ܾ£-Ú¾£-Ú¾£-Ú¾íؾíؾ£-Ú¾£-Ú¾·mÛ¾£-Ú¾£-Ú¾gmÖ¾gmÖ¾gmÖ¾gmÖ¾?íÓ¾?íÓ¾gmÖ¾+­Ò¾+­Ò¾+­Ò¾mѾ+­Ò¾mѾmѾ-оÇl̾Çl̾ïìξ۬;۬;Çl̾Çl̾Çl̾³,˾‹¬È¾‹¬È¾‹¬È¾wlǾ‹¬È¾‹¬È¾c,ƾ;¬Ã¾wlǾwlǾ;¬Ã¾,Á¾,Á¾'l¾'l¾'l¾ÿ뿾뫾¾ë«¾¾×k½¾Ã+¼¾Ã+¼¾‡k¸¾›«¹¾›«¹¾_ëµ¾K«´¾K«´¾7k³¾7k³¾¿ê«¾ûª¯¾ûª¯¾Ó*­¾ƒ*¨¾ƒ*¨¾ƒ*¨¾oꦾoꦾGj¤¾꡾꡾꡾ã)ž¾ã)ž¾“)™¾“)™¾Wi•¾ßè¾ßè¾Ë¨Œ¾{¨‡¾{¨‡¾=Ïs¾­ÍZ¾­ÍZ¾‹±½¡ú¼¡ú¼!‚¼™ˆ‰½MɾÅNl¾“)™¾K«´¾ŸìɾŸìɾßíݾWnå¾Wnå¾Ïîì¾ã.î¾ã.î¾Goô¾3/ó¾3/ó¾Goô¾Goô¾Goô¾÷nï¾ ¯ð¾ïñ¾ïñ¾÷nï¾÷nï¾÷nï¾÷nï¾÷nᄃn꾧nê¾îç¾îç¾îç¾îç¾Wnå¾Wnå¾îç¾C.ä¾/îâ¾/îâ¾/îâ¾/îâ¾nà¾nà¾ó-ß¾ó-ß¾ó-ß¾ó-ß¾ßíݾßíݾ˭ܾ˭ܾ˭ܾ·mÛ¾ßíݾßíݾ{­×¾{­×¾{­×¾{­×¾gmÖ¾íؾgmÖ¾{­×¾?íÓ¾S-Õ¾S-Õ¾S-Õ¾mѾmѾ+­Ò¾-о-о+­Ò¾ïìξïìξÇl̾ïìξ۬;Çl̾Çl̾ïìξÇl̾Çl̾³,˾³,˾³,˾‹¬È¾‹¬È¾‹¬È¾wlǾOìľc,ƾc,ƾc,ƾ;¬Ã¾'l¾'l¾뫾¾ÿ뿾ÿ뿾×k½¾×k½¾¯ëº¾×k½¾×k½¾s+·¾‡k¸¾‡k¸¾K«´¾_ëµ¾_ëµ¾#+²¾ë°¾ë°¾ë°¾Ó*­¾¿ê«¾¿ê«¾ƒ*¨¾ƒ*¨¾[ª¥¾oꦾ3*£¾ ª ¾ ª ¾÷iŸ¾»©›¾»©›¾é—¾C)”¾C)”¾Ë¨Œ¾{¨‡¾{¨‡¾(€¾íÎn¾íÎn¾µJ+¾ ŒÀ½± ½ - ºÁ ¼a½…H¾…H¾k©–¾#+²¾#+²¾?íӾ˭ܾ˭ܾ»®ë¾÷nï¾÷nï¾ã.î¾3/ó¾3/ó¾3/ó¾3/ó¾3/ó¾ïñ¾ïñ¾ïñ¾ ¯ð¾÷nï¾ã.î¾÷nï¾÷nï¾»®ë¾§n꾧nê¾Ïîì¾îç¾î羧n꾓.龓.é¾Wnå¾Wnå¾Wnå¾Wnå¾C.ä¾/î⾮ᾮá¾C.侮ᾮá¾nà¾nà¾nà¾Ë­Ü¾Ë­Ü¾Ë­Ü¾ßíݾ£-Ú¾£-Ú¾£-Ú¾íؾ{­×¾{­×¾{­×¾{­×¾íؾíؾgmÖ¾?íÓ¾?íÓ¾?íÓ¾?íÓ¾?íÓ¾?íÓ¾?íÓ¾+­Ò¾+­Ò¾+­Ò¾mѾmѾmѾïìξïìξïìξÇl̾Çl̾Çl̾Çl̾Çl̾Çl̾Ÿìɾ‹¬È¾‹¬È¾ŸìɾŸìɾc,ƾwlǾwlǾ,Á¾'l¾'l¾;¬Ã¾ÿ뿾ÿ뿾ÿ뿾뫾¾ë«¾¾Ã+¼¾×k½¾×k½¾Ã+¼¾‡k¸¾‡k¸¾_ëµ¾K«´¾_ëµ¾#+²¾#+²¾ë°¾ë°¾ë°¾¿ê«¾«ªª¾«ªª¾ƒ*¨¾Gj¤¾Gj¤¾3*£¾3*£¾3*£¾Ï霾»©›¾§iš¾é—¾é—¾/é’¾ó(¾ó(¾{¨‡¾S(…¾S(…¾ÅNl¾…MX¾…MX¾)Š¢½á ¾¼á ¾¼¡ -ª¼Ù‰½eJ&¾ÝÏ}¾ ª ¾s+·¾ŸìɾŸìɾnà¾Wnå¾Wnå¾ã.î¾ã.î¾ã.î¾ ¯ð¾ïñ¾ïñ¾3/ó¾[¯õ¾[¯õ¾ ¯ð¾ ¯ð¾ïñ¾÷nï¾Ïîì¾÷nï¾÷nï¾÷nï¾»®ë¾ã.î¾ã..龧n꾧nê¾îç¾î羓.é¾k®æ¾k®æ¾Wnå¾Wnå¾Wnå¾nà¾nà¾nà¾nà¾ó-ß¾ó-ß¾nà¾ßíݾßíݾ·mÛ¾·mÛ¾·mÛ¾·mÛ¾·mÛ¾íؾíؾíؾíؾ{­×¾{­×¾{­×¾£-Ú¾£-Ú¾?íÓ¾gmÖ¾gmÖ¾gmÖ¾+­Ò¾?íÓ¾?íÓ¾?íÓ¾mѾ+­Ò¾+­Ò¾mѾïìξïìξ۬;Çl̾Çl̾۬;³,˾³,˾Çl̾ŸìɾŸìɾ‹¬È¾wlǾ‹¬È¾c,ƾOìľwlǾwlǾOìľ;¬Ã¾;¬Ã¾;¬Ã¾,Á¾,Á¾,Á¾ë«¾¾×k½¾×k½¾×k½¾›«¹¾›«¹¾›«¹¾‡k¸¾‡k¸¾K«´¾K«´¾#+²¾ë°¾çj®¾ûª¯¾çj®¾çj®¾«ªª¾—j©¾—j©¾oꦾGj¤¾Gj¤¾ã)ž¾ ª ¾ ª ¾»©›¾“)™¾“)™¾k©–¾i¾Ë¨Œ¾£(Š¾{¨‡¾+¨‚¾Ïx¾Ïx¾ÍË<¾ÙŽí½ÙŽí½ È»p»± ½ÙŽí½½ÌK¾ß辫ªª¾«ªª¾-о£-Ú¾£-Ú¾îç¾Ïîì¾Ïîì¾ã.î¾ ¯ð¾ ¯ð¾ ¯ð¾ ¯ð¾ ¯ð¾Goô¾3/ó¾3/ó¾ïñ¾ ¯ð¾÷nï¾÷nï¾÷nï¾ã.n꾧nê¾»®ë¾»®ë¾»®ë¾§nê¾îç¾îç¾Wnå¾k®æ¾k®æ¾/îâ¾C.ä¾C.ä¾C.ä¾®á¾ó-ß¾/îâ¾/îâ¾ó-ß¾ßíݾßíݾßíݾó-ß¾ó-ß¾ßíݾ·mÛ¾·m۾˭ܾ£-Ú¾£-Ú¾{­×¾{­×¾íؾS-Õ¾S-Õ¾gmÖ¾íؾíؾgmÖ¾S-Õ¾S-Õ¾S-Õ¾mѾmѾ-о+­Ò¾+­Ò¾-о۬;۬;-оÇl̾Çl̾ïìξïìξÇl̾ŸìɾŸìɾ³,˾ŸìɾŸìɾwlǾwlǾwlǾc,ƾ;¬Ã¾;¬Ã¾;¬Ã¾Oìľ'l¾ÿ뿾ÿ뿾ÿ뿾×k½¾×k½¾›«¹¾¯ëº¾¯ëº¾s+·¾_ëµ¾K«´¾K«´¾K«´¾#+²¾ë°¾ë°¾ûª¯¾Ó*­¾Ó*­¾¿ê«¾—j©¾—j©¾oꦾ[ª¥¾[ª¥¾Gj¤¾꡾꡾»©›¾Ï霾»©›¾k©–¾k©–¾/é’¾i¾i¾gh†¾+¨‚¾+¨‚¾MÎd¾}Ë7¾}Ë7¾1 C½Á ¼Á ¼á ¾¼IÔ½ELD¾£(Š¾ƒ*¨¾Ã+¼¾Çl̾Çl̾®á¾Wnå¾Wnå¾ã.î¾ ¯ð¾ ¯ð¾ïñ¾3/ó¾3/ó¾ ¯ð¾3/ó¾3/ó¾ïñ¾ïñ¾ïñ¾÷nï¾Ïîì¾Ïîì¾ã.î¾»®ë¾»®ë¾Ïîì¾Ïîì¾îç¾îç¾îç¾îç¾îç¾îç¾Wnå¾/îâ¾/îâ¾/îâ¾/îâ¾/îâ¾/îâ¾/îâ¾®á¾nà¾nà¾C.ä¾nà¾nà¾ßíݾnà¾nà¾íؾ·mÛ¾·mÛ¾£-Ú¾{­×¾{­×¾íؾS-Õ¾S-Õ¾gmÖ¾gmÖ¾+­Ò¾?íÓ¾S-Õ¾+­Ò¾+­Ò¾+­Ò¾+­Ò¾+­Ò¾+­Ò¾mѾ?íÓ¾?íӾ۬;-о-оïìξïìξÇl̾Çl̾Çl̾Çl̾³,˾³,˾ŸìɾŸìɾŸìɾc,ƾOìľc,ƾc,ƾc,ƾ,Á¾c,ƾc,ƾÿ뿾뫾¾ë«¾¾×k½¾Ã+¼¾Ã+¼¾¯ëº¾‡k¸¾‡k¸¾s+·¾s+·¾s+·¾K«´¾K«´¾ûª¯¾ûª¯¾çj®¾#+²¾Ó*­¾Ó*­¾—j©¾«ªª¾«ªª¾Gj¤¾3*£¾3*£¾꡾Ï霾Ï霾Ï霾k©–¾k©–¾/é’¾©‘¾©‘¾·h‹¾gh†¾gh†¾=Ïs¾ýÍ_¾¥K:¾™Ù½™Ù½A 4¼p»p»™Ù½•LI¾•LI¾«ªª¾×k½¾×k½¾£-Ú¾®á¾®á¾»®ë¾÷nï¾÷nï¾ ¯ð¾ïñ¾ïñ¾ïñ¾3/ó¾Goô¾ã.î¾ã.î¾ ¯ð¾ïñ¾ïñ¾ã.î¾Ïîì¾Ïîì¾»®ë¾Ïîì¾Ïîì¾»®ë¾§n꾧n꾓.é¾îç¾îç¾îç¾îç¾Wnå¾Wnå¾Wnå¾C.ä¾/îâ¾/îâ¾/îâ¾/îâ¾ó-ß¾ó-ß¾®á¾nà¾ßíݾßíݾ˭ܾ·mÛ¾·m۾˭ܾ˭ܾ˭ܾ£-Ú¾£-Ú¾£-Ú¾íؾ{­×¾£-Ú¾£-Ú¾gmÖ¾S-Õ¾íؾíؾ+­Ò¾S-Õ¾S-Õ¾S-Õ¾+­Ò¾+­Ò¾mѾ-о-оmѾïìξ۬;-оïìξÇl̾³,˾³,˾Ÿìɾ‹¬È¾‹¬È¾Ÿìɾ‹¬È¾‹¬È¾;¬Ã¾c,ƾc,ƾOìľ;¬Ã¾;¬Ã¾,Á¾,Á¾×k½¾,Á¾,Á¾¯ëº¾×k½¾×k½¾›«¹¾‡k¸¾‡k¸¾‡k¸¾7k³¾7k³¾K«´¾ë°¾ë°¾çj®¾çj®¾Ó*­¾«ªª¾«ªª¾ƒ*¨¾[ª¥¾[ª¥¾Gj¤¾3*£¾3*£¾ã)ž¾§iš¾§iš¾é—¾k©–¾k©–¾i¾·h‹¾·h‹¾S(…¾(€¾(€¾ÕM]¾µJ+¾YŒÅ½ ½p»p»Ñ M½Ñ M½…MX¾©‘¾©‘¾'l¾+­Ò¾+­Ò¾nà¾îç¾Ïîì¾Ïîì¾ã.î¾ ¯ð¾ïñ¾3/ó¾ïñ¾ïñ¾ïñ¾ïñ¾ïñ¾ïñ¾ ¯ð¾ ¯ð¾ ¯ð¾÷nï¾ã.î¾ã.î¾÷nï¾Ïîì¾Ïîì¾k®æ¾»®ë¾»®ë¾îç¾îç¾îç¾îç¾C.ä¾/îâ¾Wnå¾Wnå¾/îâ¾/îâ¾/îâ¾®á¾nà¾nà¾ó-ß¾nà¾nà¾ßíݾßíݾßíݾßíݾnà¾nྣ-Ú¾£-Ú¾£-Ú¾£-Ú¾{­×¾íؾ{­×¾íؾ{­×¾{­×¾{­×¾S-Õ¾S-Õ¾S-Õ¾+­Ò¾mѾmѾ+­Ò¾mѾmѾïìξïìξïìξÇl̾Çl̾Çl̾Çl̾³,˾ŸìɾÇl̾³,˾ŸìɾŸìɾŸìɾc,ƾc,ƾc,ƾOìľ'l¾'l¾'l¾'l¾'l¾ÿ뿾×k½¾×k½¾Ã+¼¾Ã+¼¾Ã+¼¾‡k¸¾‡k¸¾K«´¾_ëµ¾7k³¾#+²¾7k³¾7k³¾çj®¾çj®¾çj®¾«ªª¾«ªª¾«ªª¾ƒ*¨¾3*£¾3*£¾3*£¾÷iŸ¾Ï霾§iš¾§iš¾§iš¾Wi•¾Wi•¾ó(¾Ë¨Œ¾Ë¨Œ¾?胾(€¾(€¾­ÍZ¾íɾíɾq½ - º - ºq -W½5H¾…MX¾C)”¾C)”¾,Á¾mѾmѾC.ä¾Wnå¾Wnå¾Ïîì¾ïñ¾ïñ¾ïñ¾3/ó¾3/ó¾ïñ¾Goô¾Goô¾ïñ¾ïñ¾ïñ¾÷nï¾÷nï¾ ¯ð¾ã.î¾ã.î¾»®ë¾Ïîì¾Ïîì¾îç¾îç¾î羓.é¾k®æ¾k®æ¾îç¾Wnå¾Wnå¾C.ä¾C.ä¾/îâ¾/îâ¾®á¾nà¾nà¾nྮá¾nà¾nà¾ßíݾnà¾nྣ-ھ˭ܾ˭ܾ˭ܾ£-Ú¾£-Ú¾£-Ú¾íؾíؾS-Õ¾íؾíؾgmÖ¾{­×¾S-Õ¾+­Ò¾+­Ò¾S-Õ¾mѾmѾmѾ?íÓ¾?íÓ¾-о-о-оïìξïìξïìξ۬;۬;³,˾ŸìɾŸìɾ‹¬È¾‹¬È¾‹¬È¾OìľOìľOìľc,ƾ,Á¾,Á¾,Á¾'l¾'l¾×k½¾ë«¾¾×k½¾¯ëº¾‡k¸¾›«¹¾‡k¸¾‡k¸¾K«´¾_ëµ¾_ëµ¾7k³¾ë°¾ë°¾çj®¾çj®¾çj®¾Ó*­¾—j©¾—j©¾—j©¾oꦾoꦾ3*£¾꡾÷iŸ¾»©›¾“)™¾k©–¾Wi•¾Wi•¾ó(¾ßè¾ßè¾S(…¾(€¾(€¾%Nb¾õK?¾õK?¾±k½Á ¼Á ¼aæ¼i‹¶½µJ+¾+¨‚¾3*£¾›«¹¾³,˾³,˾nà¾Wnå¾Wnå¾Ïîì¾ ¯ð¾ ¯ð¾ïñ¾ïñ¾ïñ¾ ¯ð¾ïñ¾ïñ¾ïñ¾ ¯ð¾ ¯ð¾ïñ¾ã.î¾Ïîì¾ã.î¾ã.n꾧n꾧n꾓.龧n꾧nê¾îç¾k®æ¾k®æ¾îç¾k®æ¾k®æ¾Wnå¾k®æ¾k®æ¾C.ä¾nྮá¾C.ä¾C.ä¾ó-ß¾nà¾nà¾ßíݾßíݾßíݾ˭ܾ˭ܾ£-Ú¾·mÛ¾·mÛ¾·mÛ¾£-Ú¾£-Ú¾gmÖ¾{­×¾{­×¾{­×¾S-Õ¾S-Õ¾íؾS-Õ¾S-Õ¾?íÓ¾?íÓ¾S-Õ¾-о-о+­Ò¾mѾmѾ-о-о-о۬;Çl̾Çl̾³,˾³,˾³,˾‹¬È¾‹¬È¾c,ƾwlǾOìľ;¬Ã¾;¬Ã¾;¬Ã¾'l¾ÿ뿾ÿ뿾,Á¾ÿ뿾ÿ뿾Ã+¼¾×k½¾×k½¾Ã+¼¾›«¹¾s+·¾_ëµ¾‡k¸¾_ëµ¾#+²¾#+²¾#+²¾ûª¯¾ûª¯¾¿ê«¾«ªª¾«ªª¾ƒ*¨¾oꦾoꦾ3*£¾ ª ¾ ª ¾ã)ž¾§iš¾§iš¾“)™¾“)™¾/é’¾ó(¾ó(¾£(Š¾{¨‡¾{¨‡¾µO{¾%Nb¾%Nb¾ -ȾIˆ„½Iˆ„½p;!‚¼‰‰˜½Ê(¾µO{¾÷iŸ¾s+·¾s+·¾S-Õ¾ßíݾßíݾîç¾»®ë¾»®ë¾÷nï¾÷nï¾÷nï¾ïñ¾ ¯ð¾ ¯ð¾ïñ¾ïñ¾ïñ¾ ¯ð¾ ¯ð¾÷nï¾÷nï¾÷nï¾ã.î¾Ïîì¾Ïîì¾Ïîì¾Ïîì¾Ïî쾓.龧n꾓.é¾îç¾k®æ¾îç¾îç¾îç¾C.ä¾C.ä¾C.ä¾C.侮ᾮᾮᾮᾮá¾nà¾ßíݾßíݾó-ß¾ó-߾˭ܾßíݾßíݾ˭ܾíؾíؾ·mÛ¾·mÛ¾·mÛ¾·mÛ¾íؾíؾ{­×¾S-Õ¾gmÖ¾S-Õ¾S-Õ¾?íÓ¾+­Ò¾+­Ò¾+­Ò¾+­Ò¾+­Ò¾-оmѾmѾïìξ۬;۬;ïìξ³,˾³,˾³,˾Çl̾³,˾‹¬È¾‹¬È¾wlǾwlǾwlǾc,ƾOìľOìľ;¬Ã¾;¬Ã¾;¬Ã¾×k½¾ë«¾¾ë«¾¾¯ëº¾¯ëº¾›«¹¾›«¹¾›«¹¾_ëµ¾_ëµ¾_뵾밾밾밾ûª¯¾ûª¯¾ûª¯¾¿ê«¾—j©¾—j©¾ƒ*¨¾oꦾoꦾGj¤¾Gj¤¾÷iŸ¾Ï霾Ï霾“)™¾é—¾é—¾©‘¾i¾i¾{¨‡¾?胾?胾Îi¾åLN¾É¾yŠ§½yŠ§½ - º È» È»…H¾%Nb¾%Nb¾çj®¾,Á¾,Á¾Ë­Ü¾®á¾k®æ¾»®ë¾»®ë¾÷nï¾ ¯ð¾ ¯ð¾ïñ¾ ¯ð¾ ¯ð¾ ¯ð¾Goô¾Goô¾3/ó¾ïñ¾ïñ¾÷nï¾÷nï¾÷nï¾Ïîì¾Ïî쾧nê¾ã.î¾ã.î¾î羧n꾧n꾓.é¾Wnå¾Wnå¾Wnå¾C.ä¾C.ä¾Wnå¾C.ä¾/îâ¾Wnå¾Wnå¾ó-ß¾®á¾®á¾®á¾ó-ß¾ó-ß¾nà¾nà¾nà¾ßíݾßíݾßíݾ·mÛ¾·mÛ¾·mÛ¾íؾíؾíؾ{­×¾{­×¾gmÖ¾{­×¾{­×¾gmÖ¾?íÓ¾?íÓ¾?íÓ¾mѾmѾ+­Ò¾+­Ò¾ïìξ-о-о-о-о-оÇl̾³,˾Çl̾Çl̾Çl̾‹¬È¾‹¬È¾‹¬È¾‹¬È¾c,ƾc,ƾ;¬Ã¾;¬Ã¾,Á¾,Á¾,Á¾×k½¾×k½¾×k½¾ë«¾¾¯ëº¾¯ëº¾›«¹¾s+·¾s+·¾_ëµ¾s+·¾K«´¾#+²¾#+²¾#+²¾çj®¾çj®¾ûª¯¾¿ê«¾¿ê«¾ƒ*¨¾oꦾoꦾ꡾꡾ ª ¾÷iŸ¾Ï霾k©–¾“)™¾“)™¾/é’¾ó(¾ó(¾{¨‡¾{¨‡¾{¨‡¾=Ïs¾ýÍ_¾ýÍ_¾ -Ⱦ±k½±k½p;¡ -ª¼ÉŠ¬½µJ+¾µO{¾ ª ¾s+·¾s+·¾+­Ò¾ßíݾßíݾîç¾»®ë¾»®ë¾÷nï¾3/ó¾3/ó¾ïñ¾ïñ¾3/ó¾3/ó¾3/ó¾ ¯ð¾ïñ¾ïñ¾÷nï¾ã.î¾ã.î¾÷nï¾Ïîì¾Ïîì¾Ïî쾓.龓.龓.龧n꾧n꾧n꾧n꾓.é¾Wnå¾Wnå¾îç¾k®æ¾k®æ¾/îâ¾C.ä¾C.ä¾®á¾nྮᾮᾮá¾ßíݾ˭ܾ˭ܾó-߾˭ܾ˭ܾ£-Ú¾£-Ú¾·mÛ¾·mÛ¾·mÛ¾£-Ú¾£-Ú¾£-Ú¾gmÖ¾S-Õ¾S-Õ¾{­×¾S-Õ¾S-Õ¾?íÓ¾S-Õ¾S-Õ¾?íÓ¾?íÓ¾mѾmѾmѾmѾ۬;۬;Çl̾³,˾³,˾‹¬È¾³,˾³,˾c,ƾ‹¬È¾wlǾOìľOìľ;¬Ã¾;¬Ã¾;¬Ã¾,Á¾,Á¾,Á¾ë«¾¾ë«¾¾ë«¾¾×k½¾¯ëº¾Ã+¼¾›«¹¾s+·¾_ëµ¾_ëµ¾_ëµ¾#+²¾ë°¾ë°¾#+²¾¿ê«¾¿ê«¾«ªª¾ƒ*¨¾ƒ*¨¾Gj¤¾3*£¾3*£¾ ª ¾÷iŸ¾ã)ž¾»©›¾»©›¾é—¾Wi•¾Wi•¾ó(¾ó(¾ó(¾S(…¾?胾?胾Îi¾•LI¾•LI¾)Š¢½á ¾¼p; È» È»…H¾%Nb¾%Nb¾çj®¾,Á¾,Á¾·mÛ¾nà¾nྦྷnê¾÷nï¾÷nï¾Ïîì¾ ¯ð¾3/ó¾ïñ¾ïñ¾ïñ¾ïñ¾ïñ¾ ¯ð¾ ¯ð¾ã.î¾ã.î¾ã.î¾Ïîì¾ã.î¾ã.î¾÷nï¾Ïîì¾Ïî쾧nê¾»®ë¾»®ë¾îç¾îç¾îç¾îç¾Wnå¾Wnå¾Wnå¾Wnå¾/îâ¾C.ä¾C.ä¾nྮᾮᾮá¾ó-ß¾ó-ß¾ó-ß¾ßíݾßíݾ·mÛ¾ßíݾ˭ܾ£-Ú¾£-ھ˭ܾ·mÛ¾·mÛ¾£-Ú¾íؾíؾgmÖ¾{­×¾{­×¾S-Õ¾gmÖ¾gmÖ¾?íÓ¾+­Ò¾?íÓ¾+­Ò¾+­Ò¾ïìξ-о-оïìξÇl̾Çl̾۬;³,˾ŸìɾŸìɾ³,˾‹¬È¾wlǾwlǾwlǾwlǾwlǾOìľ'l¾'l¾'l¾,Á¾,Á¾×k½¾ë«¾¾ë«¾¾Ã+¼¾Ã+¼¾‡k¸¾›«¹¾›«¹¾ë°¾K«´¾K«´¾ûª¯¾çj®¾çj®¾¿ê«¾¿ê«¾¿ê«¾—j©¾oꦾGj¤¾Gj¤¾Gj¤¾÷iŸ¾÷iŸ¾÷iŸ¾Ï霾k©–¾k©–¾é—¾Wi•¾Wi•¾·h‹¾·h‹¾gh†¾h¾h¾uNg¾ELD¾ELD¾™ˆ‰½Á -\¼Á -\¼Á ¼Qu½%I¾MÎd¾MÎd¾#+²¾;¬Ã¾;¬Ã¾£-Ú¾C.ä¾C.侓.é¾ã.î¾ã.î¾ ¯ð¾ïñ¾ïñ¾3/ó¾ ¯ð¾ïñ¾ïñ¾ïñ¾ã.î¾ïñ¾ïñ¾ ¯ð¾ã.î¾ã.î¾ïñ¾»®ë¾»®ë¾Ïîì¾»®ë¾»®ë¾“.龓.龓.é¾îç¾Wnå¾îç¾k®æ¾k®æ¾Wnå¾C.ä¾C.ä¾®á¾/îâ¾/îâ¾ó-ß¾nà¾C.ä¾nà¾ó-ß¾nà¾ó-ß¾ó-ß¾ßíݾ£-Ú¾£-Ú¾ßíݾ˭ܾ˭ܾ·mÛ¾íؾíؾ{­×¾gmÖ¾gmÖ¾{­×¾íؾgmÖ¾+­Ò¾?íÓ¾gmÖ¾?íÓ¾?íÓ¾mѾmѾmѾïìξ۬;۬;ïìξ۬;³,˾Çl̾³,˾³,˾ŸìɾŸìɾc,ƾ‹¬È¾‹¬È¾Oìľ;¬Ã¾;¬Ã¾;¬Ã¾'l¾'l¾뫾¾ë«¾¾×k½¾¯ëº¾¯ëº¾¯ëº¾›«¹¾›«¹¾‡k¸¾K«´¾K«´¾7k³¾7k³¾7k³¾Ó*­¾ë°¾çj®¾¿ê«¾—j©¾«ªª¾«ªª¾Gj¤¾[ª¥¾3*£¾3*£¾ã)ž¾Ï霾Ï霾Ï霾闾闾/é’¾i¾i¾£(Š¾S(…¾S(…¾ÝÏ}¾íÎn¾]ÍU¾J!¾J!¾± ½ - : - : ½9Žã½9Žã½gh†¾oꦾoꦾÇl̾S-Õ¾S-Õ¾C.ä¾îç¾Ïîì¾ã.î¾ã.î¾ã.î¾3/ó¾3/ó¾ïñ¾ ¯ð¾ ¯ð¾ïñ¾÷nï¾÷nï¾ã.î¾ ¯ð¾ ¯ð¾»®ë¾ã.î¾ã.î¾»®ë¾§nê¾»®ë¾“.龓.é¾î羓.龓.é¾k®æ¾“.龓.é¾Wnå¾/îâ¾/îâ¾C.ä¾/îâ¾/îâ¾/î⾮ᾮá¾nà¾nà¾nà¾ó-ß¾ó-ß¾nà¾Ë­Ü¾Ë­Ü¾Ë­Ü¾íؾíؾ·mÛ¾·mÛ¾·mÛ¾gmÖ¾£-Ú¾gmÖ¾gmÖ¾gmÖ¾?íÓ¾íؾíؾ+­Ò¾?íÓ¾?íÓ¾?íÓ¾+­Ò¾+­Ò¾+­Ò¾-оmѾïìξïìξ³,˾Çl̾Çl̾ŸìɾŸìɾŸìɾŸìɾOìľOìľwlǾc,ƾc,ƾ'l¾'l¾,Á¾,Á¾ÿ뿾×k½¾ë«¾¾ë«¾¾¯ëº¾›«¹¾›«¹¾‡k¸¾›«¹¾›«¹¾7k³¾#+²¾#+²¾#+²¾ûª¯¾ûª¯¾çj®¾ûª¯¾ûª¯¾ƒ*¨¾—j©¾—j©¾[ª¥¾3*£¾꡾÷iŸ¾÷iŸ¾»©›¾§iš¾§iš¾k©–¾Wi•¾Wi•¾Ë¨Œ¾£(Š¾èˆ¾+¨‚¾+¨‚¾Îi¾%Nb¾%Nb¾)ò½a½a½Á <Á -\¼Á -\¼µJ+¾eOv¾Ï霾_ëµ¾_ëµ¾-о·mÛ¾·mÛ¾î羓.龓.é¾÷nï¾Ïîì¾Ïîì¾ ¯ð¾ïñ¾ïñ¾÷nï¾ ¯ð¾ ¯ð¾÷nï¾÷nï¾÷nï¾ã.î¾ã.î¾÷nï¾»®ë¾»®ë¾»®ë¾ã.î¾ã..龓.龓.龓.é¾k®æ¾îç¾îç¾îç¾C.ä¾C.ä¾C.ä¾C.ä¾/îâ¾/îâ¾®á¾nà¾nà¾nà¾ßíݾßíݾó-ß¾ßíݾßíݾ˭ܾßíݾ˭ܾ·mÛ¾·mÛ¾£-Ú¾·mÛ¾·mÛ¾{­×¾{­×¾{­×¾{­×¾íؾíؾ{­×¾S-Õ¾S-Õ¾?íÓ¾+­Ò¾+­Ò¾?íÓ¾?íÓ¾ïìξ۬;۬;mѾ۬;۬;³,˾۬;۬;‹¬È¾‹¬È¾‹¬È¾‹¬È¾wlǾwlǾc,ƾ;¬Ã¾;¬Ã¾;¬Ã¾'l¾뫾¾ÿ뿾ÿ뿾×k½¾×k½¾×k½¾Ã+¼¾‡k¸¾‡k¸¾‡k¸¾s+·¾s+·¾#+²¾7k³¾7k³¾çj®¾çj®¾çj®¾«ªª¾«ªª¾ƒ*¨¾[ª¥¾[ª¥¾3*£¾3*£¾3*£¾Ï霾Ï霾Ï霾§iš¾é—¾é—¾/é’¾/é’¾/é’¾·h‹¾{¨‡¾+¨‚¾Ïx¾Ïx¾]ÍU¾=Ê#¾=Ê#¾Q -%½p;p; ½IÔ½ÍË<¾S(…¾[ª¥¾›«¹¾‹¬È¾‹¬È¾Ë­Ü¾Wnå¾Wn徧nê¾Ïîì¾Ïîì¾÷nï¾ ¯ð¾ ¯ð¾3/ó¾ ¯ð¾ ¯ð¾ïñ¾÷nï¾Ïîì¾ïñ¾ïñ¾»®ë¾ã.î¾ã.î¾ã.î¾Ïîì¾Ïîì¾»®ë¾Ïîì¾Ïîì¾î羓.龓.é¾k®æ¾k®æ¾k®æ¾Wnå¾k®æ¾Wnå¾C.ä¾C.ä¾/îâ¾C.ä¾C.ä¾ó-ß¾nà¾nà¾nà¾ó-ß¾ó-ß¾nà¾nà¾nà¾Ë­Ü¾ßíݾßíݾ·mÛ¾·m۾˭ܾíؾíؾíؾíؾíؾgmÖ¾íؾíؾmѾ?íÓ¾?íÓ¾+­Ò¾-оmѾmѾmѾ-оïìξ۬;۬;³,˾³,˾۬;³,˾³,˾Ÿìɾ‹¬È¾‹¬È¾‹¬È¾‹¬È¾‹¬È¾'l¾OìľOìľ,Á¾,Á¾ë«¾¾ÿ뿾ÿ뿾›«¹¾Ã+¼¾Ã+¼¾s+·¾s+·¾s+·¾7k³¾7k³¾#+²¾ë°¾ë°¾¿ê«¾Ó*­¾Ó*­¾—j©¾ƒ*¨¾ƒ*¨¾oꦾGj¤¾Gj¤¾꡾꡾꡾Ï霾»©›¾“)™¾k©–¾k©–¾ó(¾ßè¾ßè¾gh†¾+¨‚¾+¨‚¾ÅNl¾­ÍZ¾­ÍZ¾ ŒÀ½± ½± ½ È;a –¼¹‹»½UK5¾UK5¾÷iŸ¾‡k¸¾‡k¸¾?íӾ˭ܾ˭ܾî羧n꾧nê¾ã.î¾ã.î¾ã.î¾ïñ¾3/ó¾3/ó¾÷nï¾3/ó¾3/ó¾÷nï¾÷nï¾÷nï¾÷nï¾÷nï¾Ïîì¾Ïîì¾Ïîì¾»®ë¾“.龓.龓.龧n꾧n꾓.é¾k®æ¾k®æ¾k®æ¾k®æ¾C.ä¾Wnå¾Wnå¾Wn微ᾮá¾C.ä¾C.ä¾C.ä¾ó-ß¾/îâ¾/îâ¾nà¾nà¾nà¾ßíݾßíݾßíݾ·mÛ¾£-Ú¾£-ھ˭ܾ˭ܾ{­×¾{­×¾{­×¾{­×¾?íÓ¾?íÓ¾{­×¾gmÖ¾gmÖ¾S-Õ¾S-Õ¾S-Õ¾+­Ò¾+­Ò¾-оïìξïìξïìξïìξïìξ۬;۬;۬;‹¬È¾‹¬È¾‹¬È¾wlǾc,ƾ'l¾OìľOìľ'l¾'l¾'l¾ÿ뿾뫾¾ë«¾¾Ã+¼¾¯ëº¾¯ëº¾›«¹¾_ëµ¾7k³¾‡k¸¾s+·¾7k³¾#+²¾#+²¾7k³¾ûª¯¾ûª¯¾Ó*­¾¿ê«¾¿ê«¾ƒ*¨¾[ª¥¾[ª¥¾Gj¤¾꡾꡾ã)ž¾Ï霾Ï霾é—¾C)”¾©‘¾/é’¾/钾舾gh†¾gh†¾h¾Oq¾Oq¾ÌA¾ -Ⱦ -Ⱦ!‚¼Á <Á <a½ÕH -¾%Nb¾/é’¾ûª¯¾,Á¾Û¬Í¾Û¬Í¾nà¾k®æ¾k®æ¾§nê¾÷nï¾÷nï¾ ¯ð¾ã.î¾ã.î¾ïñ¾ ¯ð¾ ¯ð¾3/ó¾÷nï¾÷nï¾÷nï¾÷nï¾Ïîì¾Ïîì¾Ïîì¾Ïîì¾Ïîì¾Ïîì¾Ïî쾧n꾧n꾧n꾓.龓.é¾Wnå¾k®æ¾k®æ¾îç¾îç¾Wnå¾îç¾îç¾C.ä¾/îâ¾/îâ¾nྮᾮᾮá¾ó-ß¾ó-ß¾®á¾ßíݾ˭ܾ·m۾˭ܾßíݾíؾíؾ·mÛ¾·mÛ¾·mÛ¾£-Ú¾íؾíؾ{­×¾S-Õ¾{­×¾S-Õ¾S-Õ¾?íÓ¾+­Ò¾+­Ò¾?íÓ¾?íÓ¾?íÓ¾Çl̾ïìξïìξ۬;Çl̾Çl̾۬;‹¬È¾wlǾ‹¬È¾‹¬È¾wlǾc,ƾc,ƾ'l¾'l¾'l¾,Á¾ÿ뿾ÿ뿾ÿ뿾×k½¾×k½¾¯ëº¾Ã+¼¾Ã+¼¾s+·¾s+·¾_ëµ¾_ëµ¾_ëµ¾#+²¾çj®¾çj®¾çj®¾«ªª¾«ªª¾—j©¾—j©¾—j©¾[ª¥¾꡾꡾꡾꡾§iš¾»©›¾»©›¾k©–¾©‘¾©‘¾©‘¾ßè¾ßè¾gh†¾h¾h¾íÎn¾]ÍU¾ÝÊ-¾ùŒÏ½1 C½p»A 4Ù¿>Ù¿>Ù¿49¿R¿R¿>Ù¿>Ù¿Hy¿\¹¿\¹¿\¹¿\¹¿\¹¿fY¿fY¿fY¿\¹¿pù¿pù¿pù¿pù¿„9¿ŽÙ¿ŽÙ¿„9¿„9¿„9¿˜y¿ŽÙ¿ŽÙ¿¢¿¢¿ŽÙ¿¬¹¿¬¹¿¢¿¢¿¢¿Ê™¿¬¹¿¬¹¿Àù¿¬¹¿¬¹¿Ô9¿Ô9¿Ô9¿¶Y¿Ô9¿Ô9¿¶Y¿Àù¿Ô9¿Ô9¿Ô9¿Ê™¿èy¿èy¿èy¿èy¿èy¿ÞÙ¿ò¿ò¿èy¿èy¿èy¿ü¹¿ò¿ò¿ò¿ú ¿Z ¿èy¿èy¿Z ¿ü¹¿ü¹¿ò¿Z ¿Z ¿ü¹¿ü¹¿ü¹¿ü¹¿ú ¿ú ¿ú ¿ü¹¿ú ¿ú ¿ú ¿ü¹¿š!¿š!¿ú ¿ú ¿ú ¿$:"¿š!¿š!¿š!¿$:"¿$:"¿$:"¿$:"¿$:"¿š!¿$:"¿$:"¿8z#¿$:"¿.Ú"¿.Ú"¿.Ú"¿š!¿$:"¿$:"¿š!¿.Ú"¿.Ú"¿8z#¿.Ú"¿.Ú"¿8z#¿8z#¿Lº$¿8z#¿8z#¿B$¿.Ú"¿.Ú"¿B$¿8z#¿8z#¿Lº$¿B$¿8z#¿B$¿B$¿VZ%¿8z#¿8z#¿B$¿Lº$¿Lº$¿B$¿Lº$¿Lº$¿B$¿B$¿Lº$¿8z#¿B$¿VZ%¿B$¿B$¿Lº$¿`ú%¿`ú%¿8z#¿VZ%¿VZ%¿VZ%¿VZ%¿VZ%¿`ú%¿VZ%¿VZ%¿Lº$¿Lº$¿`ú%¿VZ%¿VZ%¿`ú%¿Lº$¿Lº$¿VZ%¿VZ%¿VZ%¿VZ%¿`ú%¿`ú%¿Lº$¿VZ%¿VZ%¿VZ%¿`ú%¿`ú%¿`ú%¿VZ%¿VZ%¿t:'¿t:'¿`ú%¿`ú%¿`ú%¿`ú%¿jš&¿jš&¿t:'¿`ú%¿`ú%¿~Ú'¿t:'¿t:'¿jš&¿t:'¿t:'¿jš&¿jš&¿jš&¿~Ú'¿~Ú'¿`ú%¿jš&¿jš&¿jš&¿`ú%¿`ú%¿VZ%¿t:'¿t:'¿`ú%¿jš&¿jš&¿~Ú'¿jš&¿`ú%¿`ú%¿ˆz(¿~Ú'¿jš&¿jš&¿~Ú'¿~Ú'¿~Ú'¿t:'¿t:'¿t:'¿`ú%¿t:'¿t:'¿`ú%¿t:'¿t:'¿jš&¿jš&¿~Ú'¿t:'¿t:'¿jš&¿t:'¿t:'¿jš&¿jš&¿jš&¿t:'¿~Ú'¿~Ú'¿~Ú'¿t:'¿jš&¿t:'¿t:'¿~Ú'¿t:'¿t:'¿~Ú'¿~Ú'¿~Ú'¿ˆz(¿~Ú'¿~Ú'¿~Ú'¿t:'¿t:'¿jš&¿~Ú'¿~Ú'¿~Ú'¿t:'¿t:'¿~Ú'¿~Ú'¿~Ú'¿t:'¿t:'¿jš&¿t:'¿t:'¿~Ú'¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿t:'¿ˆz(¿’)¿t:'¿t:'¿ˆz(¿~Ú'¿~Ú'¿~Ú'¿ˆz(¿ˆz(¿~Ú'¿~Ú'¿~Ú'¿t:'¿t:'¿t:'¿t:'¿t:'¿~Ú'¿ˆz(¿t:'¿~Ú'¿t:'¿t:'¿~Ú'¿t:'¿t:'¿ˆz(¿’)¿’)¿~Ú'¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿t:'¿~Ú'¿’)¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿~Ú'¿~Ú'¿~Ú'¿t:'¿t:'¿t:'¿’)¿~Ú'¿t:'¿~Ú'¿~Ú'¿ˆz(¿t:'¿t:'¿’)¿ˆz(¿ˆz(¿’)¿~Ú'¿~Ú'¿ˆz(¿~Ú'¿~Ú'¿~Ú'¿ˆz(¿’)¿ˆz(¿ˆz(¿’)¿œº)¿œº)¿ˆz(¿’)¿’)¿~Ú'¿ˆz(¿ˆz(¿t:'¿ˆz(¿ˆz(¿t:'¿t:'¿t:'¿ˆz(¿ˆz(¿t:'¿~Ú'¿~Ú'¿~Ú'¿t:'¿t:'¿’)¿ˆz(¿ˆz(¿ˆz(¿’)¿’)¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿~Ú'¿’)¿’)¿t:'¿ˆz(¿ˆz(¿œº)¿~Ú'¿ˆz(¿ˆz(¿t:'¿ˆz(¿~Ú'¿~Ú'¿~Ú'¿’)¿’)¿’)¿ˆz(¿ˆz(¿’)¿’)¿’)¿’)¿œº)¿ˆz(¿~Ú'¿~Ú'¿~Ú'¿ˆz(¿ˆz(¿~Ú'¿’)¿’)¿ˆz(¿ˆz(¿ˆz(¿t:'¿ˆz(¿ˆz(¿~Ú'¿~Ú'¿~Ú'¿’)¿~Ú'¿~Ú'¿~Ú'¿~Ú'¿ˆz(¿~Ú'¿~Ú'¿œº)¿~Ú'¿~Ú'¿ˆz(¿œº)¿’)¿’)¿~Ú'¿~Ú'¿’)¿’)¿’)¿~Ú'¿~Ú'¿~Ú'¿ˆz(¿ˆz(¿t:'¿ˆz(¿ˆz(¿~Ú'¿t:'¿t:'¿’)¿ˆz(¿ˆz(¿ˆz(¿~Ú'¿~Ú'¿~Ú'¿~Ú'¿ˆz(¿~Ú'¿~Ú'¿’)¿~Ú'¿~Ú'¿œº)¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿t:'¿’)¿ˆz(¿’)¿’)¿~Ú'¿ˆz(¿ˆz(¿’)¿~Ú'¿~Ú'¿~Ú'¿~Ú'¿~Ú'¿~Ú'¿ˆz(¿~Ú'¿ˆz(¿ˆz(¿t:'¿’)¿’)¿’)¿~Ú'¿~Ú'¿ˆz(¿~Ú'¿~Ú'¿~Ú'¿ˆz(¿~Ú'¿ˆz(¿~Ú'¿ˆz(¿~Ú'¿~Ú'¿ˆz(¿~Ú'¿~Ú'¿’)¿~Ú'¿~Ú'¿~Ú'¿ˆz(¿ˆz(¿~Ú'¿ˆz(¿ˆz(¿’)¿’)¿~Ú'¿t:'¿t:'¿ˆz(¿’)¿’)¿~Ú'¿~Ú'¿~Ú'¿~Ú'¿t:'¿t:'¿ˆz(¿’)¿’)¿~Ú'¿~Ú'¿œº)¿~Ú'¿~Ú'¿ˆz(¿’)¿’)¿t:'¿ˆz(¿ˆz(¿t:'¿ˆz(¿ˆz(¿t:'¿~Ú'¿~Ú'¿~Ú'¿~Ú'¿~Ú'¿’)¿’)¿t:'¿~Ú'¿~Ú'¿ˆz(¿t:'¿t:'¿’)¿’)¿’)¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿~Ú'¿’)¿t:'¿t:'¿’)¿t:'¿t:'¿~Ú'¿ˆz(¿ˆz(¿t:'¿t:'¿t:'¿~Ú'¿jš&¿jš&¿t:'¿ˆz(¿t:'¿ˆz(¿~Ú'¿~Ú'¿’)¿’)¿ˆz(¿~Ú'¿~Ú'¿ˆz(¿~Ú'¿~Ú'¿ˆz(¿œº)¿œº)¿~Ú'¿ˆz(¿ˆz(¿t:'¿~Ú'¿~Ú'¿ˆz(¿ˆz(¿’)¿~Ú'¿~Ú'¿ˆz(¿~Ú'¿~Ú'¿t:'¿~Ú'¿~Ú'¿ˆz(¿jš&¿t:'¿’)¿~Ú'¿t:'¿ˆz(¿ˆz(¿’)¿~Ú'¿~Ú'¿ˆz(¿’)¿’)¿t:'¿ˆz(¿ˆz(¿’)¿~Ú'¿~Ú'¿ˆz(¿ˆz(¿ˆz(¿~Ú'¿~Ú'¿t:'¿’)¿’)¿t:'¿ˆz(¿ˆz(¿~Ú'¿~Ú'¿ˆz(¿ˆz(¿ˆz(¿~Ú'¿~Ú'¿~Ú'¿ˆz(¿’)¿’)¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿~Ú'¿ˆz(¿ˆz(¿’)¿~Ú'¿~Ú'¿ˆz(¿t:'¿t:'¿~Ú'¿~Ú'¿~Ú'¿~Ú'¿~Ú'¿ˆz(¿ˆz(¿ˆz(¿’)¿~Ú'¿~Ú'¿ˆz(¿’)¿’)¿t:'¿ˆz(¿ˆz(¿œº)¿jš&¿jš&¿’)¿ˆz(¿~Ú'¿~Ú'¿’)¿~Ú'¿œº)¿œº)¿’)¿ˆz(¿ˆz(¿’)¿ˆz(¿ˆz(¿ˆz(¿’)¿’)¿jš&¿ˆz(¿ˆz(¿~Ú'¿t:'¿~Ú'¿ˆz(¿ˆz(¿~Ú'¿’)¿’)¿~Ú'¿ˆz(¿ˆz(¿’)¿~Ú'¿~Ú'¿’)¿~Ú'¿~Ú'¿’)¿œº)¿œº)¿t:'¿’)¿’)¿jš&¿jš&¿~Ú'¿~Ú'¿~Ú'¿t:'¿~Ú'¿~Ú'¿’)¿~Ú'¿~Ú'¿~Ú'¿t:'¿ˆz(¿’)¿’)¿’)¿’)¿’)¿~Ú'¿~Ú'¿~Ú'¿’)¿~Ú'¿~Ú'¿’)¿ˆz(¿ˆz(¿’)¿’)¿~Ú'¿ˆz(¿ˆz(¿t:'¿t:'¿t:'¿’)¿~Ú'¿~Ú'¿t:'¿ˆz(¿ˆz(¿jš&¿ˆz(¿ˆz(¿ˆz(¿t:'¿~Ú'¿ˆz(¿ˆz(¿’)¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿’)¿ˆz(¿ˆz(¿’)¿~Ú'¿~Ú'¿’)¿ˆz(¿~Ú'¿t:'¿t:'¿’)¿t:'¿t:'¿~Ú'¿ˆz(¿ˆz(¿t:'¿~Ú'¿~Ú'¿jš&¿~Ú'¿~Ú'¿~Ú'¿t:'¿t:'¿’)¿~Ú'¿ˆz(¿’)¿’)¿jš&¿’)¿’)¿œº)¿ˆz(¿ˆz(¿ˆz(¿’)¿’)¿t:'¿’)¿’)¿~Ú'¿~Ú'¿~Ú'¿t:'¿t:'¿’)¿ˆz(¿ˆz(¿jš&¿ˆz(¿ˆz(¿t:'¿~Ú'¿~Ú'¿ˆz(¿t:'¿t:'¿ˆz(¿~Ú'¿~Ú'¿ˆz(¿ˆz(¿t:'¿ˆz(¿ˆz(¿~Ú'¿~Ú'¿’)¿ˆz(¿’)¿ˆz(¿ˆz(¿ˆz(¿t:'¿~Ú'¿~Ú'¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿~Ú'¿~Ú'¿t:'¿~Ú'¿t:'¿~Ú'¿~Ú'¿~Ú'¿’)¿’)¿ˆz(¿~Ú'¿~Ú'¿~Ú'¿~Ú'¿~Ú'¿jš&¿jš&¿ \ No newline at end of file diff -Nru matplotlib-0.99.3/lib/mpl_examples/data/msft.csv matplotlib-1.0.1/lib/mpl_examples/data/msft.csv --- matplotlib-0.99.3/lib/mpl_examples/data/msft.csv 2009-07-31 15:14:50.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/data/msft.csv 1970-01-01 00:00:00.000000000 +0000 @@ -1,66 +0,0 @@ -Date,Open,High,Low,Close,Volume,Adj. Close* -19-Sep-03,29.76,29.97,29.52,29.96,92433800,29.79 -18-Sep-03,28.49,29.51,28.42,29.50,67268096,29.34 -17-Sep-03,28.76,28.95,28.47,28.50,47221600,28.34 -16-Sep-03,28.41,28.95,28.32,28.90,52060600,28.74 -15-Sep-03,28.37,28.61,28.33,28.36,41432300,28.20 -12-Sep-03,27.48,28.40,27.45,28.34,55777200,28.18 -11-Sep-03,27.66,28.11,27.59,27.84,37813300,27.68 -10-Sep-03,28.03,28.18,27.48,27.55,54763500,27.40 -9-Sep-03,28.65,28.71,28.31,28.37,44315200,28.21 -8-Sep-03,28.39,28.92,28.34,28.84,46105300,28.68 -5-Sep-03,28.23,28.75,28.17,28.38,64024500,28.22 -4-Sep-03,28.10,28.47,27.99,28.43,59840800,28.27 -3-Sep-03,27.42,28.40,27.38,28.30,109437800,28.14 -2-Sep-03,26.70,27.30,26.47,27.26,74168896,27.11 -29-Aug-03,26.46,26.55,26.35,26.52,34503000,26.37 -28-Aug-03,26.50,26.58,26.24,26.51,46211200,26.36 -27-Aug-03,26.51,26.58,26.30,26.42,30633900,26.27 -26-Aug-03,26.31,26.67,25.96,26.57,47546000,26.42 -25-Aug-03,26.31,26.54,26.23,26.50,36132900,26.35 -22-Aug-03,26.78,26.95,26.21,26.22,65846300,26.07 -21-Aug-03,26.65,26.73,26.13,26.24,63802700,26.09 -20-Aug-03,26.30,26.53,26.00,26.45,56739300,26.30 -19-Aug-03,25.85,26.65,25.77,26.62,72952896,26.47 -18-Aug-03,25.56,25.83,25.46,25.70,45817400,25.56 -15-Aug-03,25.61,25.66,25.43,25.54,27607900,25.40 -14-Aug-03,25.66,25.71,25.52,25.63,37338300,25.49 -13-Aug-03,25.79,25.89,25.50,25.60,39636900,25.46 -12-Aug-03,25.71,25.77,25.45,25.73,38208400,25.59 -11-Aug-03,25.61,25.99,25.54,25.61,36433900,25.47 -8-Aug-03,25.88,25.98,25.50,25.58,33241400,25.44 -7-Aug-03,25.72,25.81,25.45,25.71,44258500,25.57 -6-Aug-03,25.54,26.19,25.43,25.65,56294900,25.51 -5-Aug-03,26.31,26.54,25.60,25.66,58825800,25.52 -4-Aug-03,26.15,26.41,25.75,26.18,51825600,26.03 -1-Aug-03,26.33,26.51,26.12,26.17,42649700,26.02 -31-Jul-03,26.60,26.99,26.31,26.41,64504800,26.26 -30-Jul-03,26.46,26.57,26.17,26.23,41240300,26.08 -29-Jul-03,26.88,26.90,26.24,26.47,62391100,26.32 -28-Jul-03,26.94,27.00,26.49,26.61,52658300,26.46 -25-Jul-03,26.28,26.95,26.07,26.89,54173000,26.74 -24-Jul-03,26.78,26.92,25.98,26.00,53556600,25.85 -23-Jul-03,26.42,26.65,26.14,26.45,49828200,26.30 -22-Jul-03,26.28,26.56,26.13,26.38,51791000,26.23 -21-Jul-03,26.87,26.91,26.00,26.04,48480800,25.89 -18-Jul-03,27.11,27.23,26.75,26.89,63388400,26.74 -17-Jul-03,27.14,27.27,26.54,26.69,72805000,26.54 -16-Jul-03,27.56,27.62,27.20,27.52,49838900,27.37 -15-Jul-03,27.47,27.53,27.10,27.27,53567600,27.12 -14-Jul-03,27.63,27.81,27.05,27.40,60464400,27.25 -11-Jul-03,26.95,27.45,26.89,27.31,50377300,27.16 -10-Jul-03,27.25,27.42,26.59,26.91,55350800,26.76 -9-Jul-03,27.56,27.70,27.25,27.47,62300700,27.32 -8-Jul-03,27.26,27.80,27.25,27.70,61896800,27.55 -7-Jul-03,27.02,27.55,26.95,27.42,88960800,27.27 -3-Jul-03,26.69,26.95,26.41,26.50,39440900,26.35 -2-Jul-03,26.50,26.93,26.45,26.88,94069296,26.73 -1-Jul-03,25.59,26.20,25.39,26.15,60926000,26.00 -30-Jun-03,25.94,26.12,25.50,25.64,48073100,25.50 -27-Jun-03,25.95,26.34,25.53,25.63,76040304,25.49 -26-Jun-03,25.39,26.51,25.21,25.75,51758100,25.61 -25-Jun-03,25.64,25.99,25.14,25.26,60483500,25.12 -24-Jun-03,25.65,26.04,25.52,25.70,51820300,25.56 -23-Jun-03,26.14,26.24,25.49,25.78,52584500,25.64 -20-Jun-03,26.34,26.38,26.01,26.33,86048896,26.18 -19-Jun-03,26.09,26.39,26.01,26.07,63626900,25.92 \ No newline at end of file diff -Nru matplotlib-0.99.3/lib/mpl_examples/data/msft_nasdaq_d.csv matplotlib-1.0.1/lib/mpl_examples/data/msft_nasdaq_d.csv --- matplotlib-0.99.3/lib/mpl_examples/data/msft_nasdaq_d.csv 2009-07-31 15:14:50.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/data/msft_nasdaq_d.csv 1970-01-01 00:00:00.000000000 +0000 @@ -1,2000 +0,0 @@ -"20040406093000",-1,-1,-1,25.951,0 -"20040405093000",25.8,25.98,25.73,25.951,53803929 -"20040402093000",25.47,25.9,25.44,25.85,98051438 -"20040401093000",24.95,25.11,24.85,25.08,69070246 -"20040331093000",25.19,25.2,24.8699,24.93,70546891 -"20040330093000",25.19,25.33,25.03,25.2,59015157 -"20040329093000",25.24,25.4,25,25.31,51888701 -"20040326093000",25.11,25.51,25,25.03,61593457 -"20040325093000",24.6,25.24,24.58,25.19,85689639 -"20040324093000",24.36,24.58,24.18,24.41,97589357 -"20040323093000",24.63,24.66,24.11,24.15,91728989 -"20040322093000",24.53,24.84,24.01,24.5,127820324 -"20040319093000",24.84,24.94,24.56,24.63,86679709 -"20040318093000",25.03,25.03,24.58,24.89,123243243 -"20040317093000",25.25,25.46,25.11,25.13,56265756 -"20040316093000",25.27,25.37,25.0999,25.18,65454169 -"20040315093000",25.33,25.43,25.06,25.16,68841599 -"20040312093000",25.38,25.51,25.23,25.38,64143859 -"20040311093000",25.2,25.78,25.07,25.09,90594370 -"20040310093000",25.66,25.8,25.35,25.37,75170933 -"20040309093000",25.8,25.97,25.54,25.73,81131386 -"20040308093000",26.31,26.35,25.81,25.83,69399003 -"20040305093000",26.23,26.6,26.2,26.35,59852306 -"20040304093000",26.37,26.42,26.21,26.37,44030373 -"20040303093000",26.35,26.55,26.22,26.37,55002830 -"20040302093000",26.63,26.69,26.35,26.37,66346629 -"20040301093000",26.65,26.72,26.5,26.7,52154834 -"20040227093000",26.48,26.62,26.35,26.53,58282185 -"20040226093000",26.63,26.65,26.41,26.5,66605896 -"20040225093000",26.89,26.99,26.61,26.7,64495129 -"20040224093000",26.6,26.95,26.55,26.88,55437308 -"20040223093000",26.75,26.76,26.4799,26.61,50274762 -"20040220093000",26.65,26.795,26.5,26.57,57835228 -"20040219093000",26.9,26.98,26.43,26.46,62151119 -"20040218093000",26.92,27.11,26.74,26.77,50342324 -"20040217093000",26.7,27.1,26.59,26.99,43486350 -"20040213093000",26.98,27.06,26.5,26.59,67550717 -"20040212093000",27.09,27.15,26.93,26.95,44792237 -"20040211093000",26.95,27.23,26.85,27.15,51515284 -"20040210093000",26.86,27.15,26.82,27.02,37843404 -"20040209093000",27.18,27.229,26.85,26.9,48110933 -"20040206093000",27,27.19,26.93,27.08,47216232 -"20040205093000",27.06,27.17,26.83,26.96,55565357 -"20040204093000",27.15,27.43,27.01,27.01,60938651 -"20040203093000",27.42,27.55,27.18,27.29,48206749 -"20040202093000",27.63,27.8,27.24,27.4,63305411 -"20040130093000",27.85,27.9,27.55,27.65,40531805 -"20040129093000",27.78,27.95,27.57,27.91,63750367 -"20040128093000",28.28,28.44,27.47,27.71,71251148 -"20040127093000",28.6,28.72,28.22,28.25,63227109 -"20040126093000",28.49,28.83,28.32,28.8,58316839 -"20040123093000",28.27,28.76,28.22,28.48,127268328 -"20040122093000",28.37,28.44,27.94,28.01,79830106 -"20040121093000",28.13,28.3,27.85,28.3,53641475 -"20040120093000",27.99,28.2,27.93,28.1,63096877 -"20040116093000",27.74,27.88,27.53,27.81,64008119 -"20040115093000",27.55,27.72,27.42,27.54,58526359 -"20040114093000",27.51,27.73,27.47,27.7,43940830 -"20040113093000",27.54,27.64,27.26,27.43,51558311 -"20040112093000",27.67,27.73,27.35,27.57,55860375 -"20040109093000",28.03,28.061,27.59,27.66,67144616 -"20040108093000",28.39,28.48,28,28.16,58818964 -"20040107093000",28.17,28.31,28.01,28.21,54330541 -"20040106093000",28.19,28.28,28.07,28.24,46958281 -"20040105093000",27.73,28.18,27.72,28.14,67341841 -"20040102093000",27.58,27.77,27.33,27.45,44487643 -"20031231093000",27.42,27.55,27.23,27.37,42251891 -"20031230093000",27.41,27.55,27.4,27.52,34407446 -"20031229093000",27.21,27.53,27.16,27.46,40436735 -"20031226093000",27.05,27.25,27,27.21,12076814 -"20031224093000",27.14,27.16,27,27.04,19924190 -"20031223093000",27.17,27.34,27.01,27.15,39615407 -"20031222093000",27.16,27.43,26.97,27.18,43931366 -"20031219093000",27.49,27.55,27.19,27.36,76923606 -"20031218093000",27.1,27.45,27.05,27.4,61190617 -"20031217093000",27.04,27.08,26.85,27.04,53753584 -"20031216093000",26.83,27.16,26.77,27.06,73984242 -"20031215093000",27.05,27.1,26.68,26.74,88870946 -"20031212093000",26.69,26.81,26.5,26.65,69212563 -"20031211093000",26.59,26.77,26.28,26.61,79332407 -"20031210093000",26.45,26.63,26.38,26.59,82868113 -"20031209093000",26.44,26.61,26.25,26.38,103563951 -"20031208093000",26.12,26.34,25.81,26.24,90611833 -"20031205093000",25.96,26.48,25.919,25.98,96622995 -"20031204093000",25.72,26.23,25.66,26.2,87238064 -"20031203093000",25.82,26.07,25.62,25.67,93121525 -"20031202093000",25.95,26.09,25.61,25.66,85121710 -"20031201093000",25.9,26.21,25.5,25.84,102442206 -"20031128093000",25.5,25.75,25.4,25.71,33404276 -"20031126093000",25.61,25.63,25.32,25.45,69767066 -"20031125093000",25.87,25.95,25.38,25.4,85997502 -"20031124093000",25.33,25.81,25.28,25.73,100276357 -"20031121093000",25.33,25.38,25.08,25.11,70823445 -"20031120093000",25.17,25.631,25.08,25.1,107168833 -"20031119093000",25.29,25.54,25.17,25.35,78862796 -"20031118093000",25.33,25.84,25.12,25.15,110110627 -"20031117093000",25.39,25.44,24.95,25.15,103808559 -"20031114093000",25.7,26.02,25.44,25.5,83171113 -"20031113093000",25.86,25.93,25.45,25.69,79154370 -"20031112093000",25.85,26.14,25.6,25.98,76231280 -"20031111093000",26.01,26.076,25.67,25.8,64999504 -"20031110093000",26.12,26.23,26,26.001,54596151 -"20031107093000",26.38,26.49,26.03,26.1,57862061 -"20031106093000",26.26,26.3,26,26.23,68225794 -"20031105093000",26.15,26.32,26,26.1,61569647 -"20031104093000",26.59,26.62,26.01,26.07,84035771 -"20031103093000",26.35,26.75,26.29,26.68,57790227 -"20031031093000",26.37,26.44,26.11,26.14,69659088 -"20031030093000",27.01,27.04,25.91,26.12,99139273 -"20031029093000",27.16,27.25,26.66,26.74,73595062 -"20031028093000",27.09,27.22,26.88,27.2,72144561 -"20031027093000",26.91,27.1,26.82,26.91,65641718 -"20031024093000",27.27,27.4,26.42,26.61,210918193 -"20031023093000",28.72,29.08,28.7,28.91,69346691 -"20031022093000",29.03,29.21,28.8,28.89,48852064 -"20031021093000",29.35,29.43,29.17,29.353,44176165 -"20031020093000",28.95,29.37,28.8,29.35,38831483 -"20031017093000",29.28,29.29,28.8,28.93,51135991 -"20031016093000",28.91,29.31,28.8,29.23,42270253 -"20031015093000",29.2,29.26,28.7,29.07,58358102 -"20031014093000",28.66,28.77,28.48,28.68,35191311 -"20031013093000",28.98,29.1,28.5,28.78,39342697 -"20031010093000",28.91,29.2,28.67,28.91,37611609 -"20031009093000",29.22,29.3496,28.8,28.94,62736808 -"20031008093000",29.36,29.36,28.68,28.82,47001129 -"20031007093000",29.01,29.372,28.92,29.14,52374444 -"20031006093000",29.15,29.3,28.91,29.19,34057031 -"20031003093000",29.16,29.46,28.93,29.08,57309125 -"20031002093000",28.45,28.75,28.19,28.5,38393640 -"20031001093000",28.03,28.63,27.81,28.52,59194078 -"20030930093000",28.59,28.61,27.75,27.8,63403292 -"20030929093000",28.41,28.91,28.1,28.83,47384602 -"20030926093000",28.27,28.78,28.14,28.19,49867950 -"20030925093000",28.47,28.9597,28.22,28.24,56263206 -"20030924093000",29.61,29.7,28.419,28.46,66476631 -"20030923093000",29.12,29.71,28.88,29.6,58359896 -"20030922093000",29.39,30,28.81,29.07,65714021 -"20030919093000",29.76,29.97,29.52,29.96,92380218 -"20030918093000",28.49,29.51,28.42,29.5,67278172 -"20030917093000",28.76,28.95,28.47,28.5,47232034 -"20030916093000",28.41,28.95,28.32,28.9,52369785 -"20030915093000",28.37,28.61,28.33,28.36,41446549 -"20030912093000",27.48,28.4,26.7,28.34,55787533 -"20030911093000",27.66,28.11,27.59,27.84,37958093 -"20030910093000",28.03,28.18,27.48,27.55,54770213 -"20030909093000",28.645,28.71,28.314,28.37,44455559 -"20030908093000",28.39,28.92,28.34,28.84,46161767 -"20030905093000",28.23,28.75,28.17,28.38,64049179 -"20030904093000",28.1,28.47,27.99,28.43,60199009 -"20030903093000",27.42,28.4,27.38,28.3,109502844 -"20030902093000",26.7,27.3,26.47,27.26,74314623 -"20030829093000",26.46,26.551,26.35,26.52,34776119 -"20030828093000",26.5,26.58,26.24,26.51,46220735 -"20030827093000",26.51,26.58,26.3,26.42,30638514 -"20030826093000",26.31,26.67,25.96,26.57,47557325 -"20030825093000",26.31,26.54,26.23,26.5,36157255 -"20030822093000",26.78,26.95,26.21,26.22,65864451 -"20030821093000",26.65,26.73,26.13,26.24,63920667 -"20030820093000",26.3,26.53,26,26.45,56805847 -"20030819093000",25.85,26.65,25.77,26.62,73001390 -"20030818093000",25.56,25.83,25.46,25.7,45970005 -"20030815093000",25.61,25.66,25.43,25.54,27613331 -"20030814093000",25.66,25.71,25.52,25.63,37416724 -"20030813093000",25.79,25.89,25.5,25.6,39689032 -"20030812093000",25.71,25.77,25.45,25.73,38219342 -"20030811093000",25.61,25.99,25.54,25.61,36438082 -"20030808093000",25.88,25.98,25.5,25.58,33329526 -"20030807093000",25.72,25.81,25.45,25.71,44295184 -"20030806093000",25.54,26.19,25.43,25.65,56301022 -"20030805093000",26.31,26.54,25.6,25.66,58918339 -"20030804093000",26.15,26.41,25.75,26.18,51837768 -"20030801093000",26.33,26.51,26.12,26.17,43200258 -"20030731093000",26.6,26.99,26.31,26.41,64532271 -"20030730093000",26.46,26.57,26.17,26.23,41252147 -"20030729093000",26.88,26.9,26.24,26.47,62427090 -"20030728093000",26.94,27,26.49,26.61,52711820 -"20030725093000",26.28,26.95,26.07,26.89,54185086 -"20030724093000",26.78,26.92,25.98,26,53573421 -"20030723093000",26.42,26.65,26.14,26.45,49831938 -"20030722093000",26.28,26.56,26.1311,26.38,51802602 -"20030721093000",26.87,26.91,26,26.04,49061777 -"20030718093000",27.11,27.23,26.75,26.89,63403704 -"20030717093000",27.14,27.27,26.54,26.69,73663317 -"20030716093000",27.56,27.62,27.2,27.52,50506829 -"20030715093000",27.47,27.53,27.1,27.27,53649884 -"20030714093000",27.63,27.81,27.05,27.4,60470938 -"20030711093000",26.95,27.45,26.89,27.309,50386814 -"20030710093000",27.25,27.45,26.59,26.91,55496602 -"20030709093000",27.56,27.7,27.248,27.47,62413894 -"20030708093000",27.26,27.8,27.249,27.7,61963586 -"20030707093000",27.02,27.551,26.95,27.42,89248289 -"20030703093000",26.7,26.95,26.41,26.45,39441210 -"20030702093000",26.5,26.93,26.45,26.88,95165555 -"20030701093000",25.59,26.201,25.39,26.15,61030761 -"20030630093000",25.94,26.12,25.5,25.64,53109054 -"20030627093000",25.95,26.34,25.53,25.63,76061812 -"20030626093000",25.39,26.51,25.21,25.75,51735860 -"20030625093000",25.64,25.987,25.139,25.26,60580527 -"20030624093000",25.65,26.04,25.52,25.7,51939104 -"20030623093000",26.14,26.24,25.49,25.78,53001295 -"20030620093000",26.344,26.38,26.01,26.33,86918549 -"20030619093000",26.09,26.39,26.01,26.07,63712208 -"20030618093000",25.98,26.43,25.71,26.07,89966720 -"20030617093000",25.64,26.14,25.53,25.959,122234258 -"20030616093000",24.8,25.42,24.669,25.39,70139491 -"20030613093000",25.2,25.25,24.49,24.65,55157665 -"20030612093000",24.97,25.14,24.74,24.99,66204796 -"20030611093000",24.669,24.96,24.422,24.88,75791784 -"20030610093000",23.94,24.75,23.85,24.68,80734302 -"20030609093000",23.72,23.982,23.5999,23.75,73629370 -"20030606093000",24.44,24.56,23.65,23.67,121172563 -"20030605093000",24.47,24.52,24.009,24.09,116136863 -"20030604093000",24.99,25.22,24.74,24.87,83566075 -"20030603093000",24.75,24.92,24.57,24.88,61069552 -"20030602093000",24.98,25.03,24.57,24.639,66328680 -"20030530093000",24.73,24.91,24.51,24.61,85397900 -"20030529093000",24.47,24.67,24.23,24.4,75491901 -"20030528093000",24.78,24.871,24.3,24.41,91524308 -"20030527093000",24.25,24.89,24.219,24.79,68514305 -"20030523093000",24.2,24.54,24.03,24.22,77053076 -"20030522093000",24.2,24.27,24.04,24.16,93413313 -"20030521093000",24.63,24.71,23.89,24.03,109343442 -"20030520093000",24.86,25,24.5,24.63,52775368 -"20030519093000",25.4,25.54,24.74,24.8,55447137 -"20030516093000",25.88,26.05,25.41,25.57,60488391 -"20030515093000",25.85,26.01,25.57,25.79,45696020 -"20030514093000",26.08,26.18,25.546,25.63,45131526 -"20030513093000",26.04,26.2,25.89,25.99,44620696 -"20030512093000",26.15,26.47,26.06,26.21,54013255 -"20030509093000",25.9,26.5,25.89,26.35,59018279 -"20030508093000",25.75,26.148,25.71,25.75,46541276 -"20030507093000",26.11,26.35,25.84,25.99,49234538 -"20030506093000",25.86,26.501,25.82,26.38,54468151 -"20030505093000",26.25,26.39,25.84,25.86,50537557 -"20030502093000",25.65,26.29,25.57,26.13,52815510 -"20030501093000",25.54,25.95,25.34,25.71,42214792 -"20030430093000",25.73,25.88,25.25,25.56,55690962 -"20030429093000",25.95,26.25,25.68,25.809,66022742 -"20030428093000",25.39,25.94,25.32,25.74,56393943 -"20030425093000",25.33,25.644,25.17,25.21,53778322 -"20030424093000",25.48,25.72,25.32,25.49,51884817 -"20030423093000",25.75,25.99,25.47,25.72,55821379 -"20030422093000",25.06,25.8,25.03,25.74,58986853 -"20030421093000",25.61,25.61,25.08,25.21,41678747 -"20030417093000",24.77,25.54,24.74,25.5,58519227 -"20030416093000",25.6,25.74,24.6,24.91,86373961 -"20030415093000",24.68,24.79,24.1,24.61,64340820 -"20030414093000",24.27,24.88,24,24.75,51950191 -"20030411093000",24.89,25.18,23.95,24.2,71742754 -"20030410093000",24.719,24.79,24.28,24.59,51638640 -"20030409093000",25.61,25.67,24.54,24.57,76927109 -"20030408093000",25.31,25.835,25.2,25.58,54145573 -"20030407093000",26.23,26.43,25.17,25.171,65658301 -"20030404093000",25.76,25.8,24.93,25.09,55755448 -"20030403093000",25.99,26.09,25.6,25.73,57710342 -"20030402093000",25.1,26,25.1,25.72,68328205 -"20030401093000",24.46,24.7,24.25,24.35,49803234 -"20030331093000",24.25,24.71,24.01,24.21,71461181 -"20030328093000",24.67,25.1,24.6,24.67,39582173 -"20030327093000",24.94,25.26,24.599,25.04,60045257 -"20030326093000",25.46,25.62,25.24,25.25,51687898 -"20030325093000",25.6,25.751,25.03,25.49,63608930 -"20030324093000",25.55,25.935,25.1899,25.29,61250394 -"20030321093000",26.79,26.9,26.03,26.57,85826301 -"20030320093000",26.02,26.52,25.67,26.25,72006425 -"20030319093000",25.98,26.43,25.74,26.32,73828591 -"20030318093000",25.89,26.04,25.5,26.04,78377645 -"20030317093000",24.52,25.95,24.33,25.93,101197122 -"20030314093000",24.68,24.961,24.26,24.86,75701349 -"20030313093000",23.72,24.74,23.44,24.67,81041416 -"20030312093000",22.818,23.44,22.55,23.39,72568874 -"20030311093000",23.06,23.2679,22.76,22.79,54268389 -"20030310093000",23.31,23.46,22.89,22.95,48721361 -"20030307093000",22.95,23.79,22.9,23.56,66167680 -"20030306093000",23.17,23.5,23.13,23.27,51553414 -"20030305093000",23.07,23.55,23.05,23.44,55631397 -"20030304093000",23.58,23.66,23.06,23.07,56803900 -"20030303093000",24.02,24.12,23.4068,23.54,50841129 -"20030228093000",23.74,24.07,23.559,23.7,56737928 -"20030227093000",23.9,24.21,23.3,23.58,75639266 -"20030226093000",24.079,24.47,23.58,23.6,57314562 -"20030225093000",23.54,24.27,23.38,24.19,68473109 -"20030224093000",24.44,24.5,23.84,24.07,62548553 -"20030221093000",24.29,24.8,23.7,24.61,57081029 -"20030220093000",24.77,24.87,24.1,24.15,51027895 -"20030219093000",24.82,24.88,24.17,24.53,47130583 -"20030218093000",24.62,24.99,24.4,24.96,57543713 -"20030214093000",23.625,24.25,23.385,24.15,90770856 -"20030213093000",23.205,23.56,23.0655,23.495,73839528 -"20030212093000",23.275,23.55,23.134,23.22,71576300 -"20030211093000",23.65,23.835,23,23.22,84596680 -"20030210093000",23.4,23.76,23.27,23.69,74333418 -"20030207093000",23.94,23.975,23.205,23.29,75852114 -"20030206093000",23.43,23.81,23.28,23.71,83617960 -"20030205093000",23.915,24.265,23.33,23.48,101376734 -"20030204093000",23.9,23.97,23.44,23.66,82124484 -"20030203093000",23.965,24.55,23.73,24.28,80820526 -"20030131093000",23.725,24.177,23.515,23.73,107182966 -"20030130093000",25.08,25.085,24.095,24.12,88387876 -"20030129093000",24.365,25.0245,23.965,24.955,107226456 -"20030128093000",24.845,24.85,24.2805,24.41,86413978 -"20030127093000",24.66,25.3,24.205,24.585,115186478 -"20030124093000",26.015,26.025,24.8505,24.925,103436814 -"20030123093000",25.975,26.27,25.73,26.14,71629620 -"20030122093000",25.795,26.2,25.455,25.5,87486264 -"20030121093000",25.935,26.075,25.645,25.665,86413486 -"20030117093000",26.47,26.5,25.655,25.73,156119200 -"20030116093000",28.16,28.325,27.555,27.675,83405140 -"20030115093000",28.5,28.66,28.095,28.135,59999384 -"20030114093000",28.16,28.5,28.095,28.485,54441838 -"20030113093000",28.2625,28.375,27.889,28.195,61040604 -"20030110093000",27.55,28.15,27.45,27.96,67985474 -"20030109093000",27.36,27.96,27.265,27.905,62048642 -"20030108093000",27.685,27.775,27.055,27.12,64749146 -"20030107093000",27.46,28.005,27.34,27.9,81113928 -"20030106093000",27.01,27.615,26.9,27.385,59691684 -"20030103093000",26.795,26.9,26.44,26.895,55744224 -"20030102093000",26.15,26.875,25.855,26.86,67208216 -"20021231093000",26.37,26.495,25.63,25.85,58385956 -"20021230093000",26.505,26.62,26.135,26.375,48298450 -"20021227093000",26.64,27,26.45,26.485,41013688 -"20021226093000",27.015,27.345,26.585,26.695,37341460 -"20021224093000",26.7705,27.115,26.76,26.9105,18427844 -"20021223093000",26.525,27.14,26.45,27,48904018 -"20021220093000",26.745,26.86,26.475,26.52,98535408 -"20021219093000",26.625,27.375,26.44,26.555,82925616 -"20021218093000",26.92,27.2,26.395,26.765,62897932 -"20021217093000",27.21,27.495,26.89,27.18,49820892 -"20021216093000",26.5,27.275,26.335,27.24,60273208 -"20021213093000",26.84,26.875,26.245,26.25,65405618 -"20021212093000",27.5,27.53,26.845,27.085,55394146 -"20021211093000",26.925,27.5095,26.7915,27.33,69323784 -"20021210093000",26.78,27.24,26.74,27.005,63924442 -"20021209093000",27.5,27.61,26.755,26.765,64040988 -"20021206093000",27.435,27.87,27.11,27.735,71820280 -"20021205093000",28.475,28.545,27.65,27.67,69034046 -"20021204093000",28.065,28.72,27.91,28.27,84090988 -"20021203093000",28.6405,28.675,28.205,28.355,58650318 -"20021202093000",29.325,29.48,28.505,28.845,63904216 -"20021129093000",29.215,29.315,28.8,28.84,28466796 -"20021127093000",28.8,29.307,28.7,29.04,55334804 -"20021126093000",28.82,29.125,28.39,28.45,69180644 -"20021125093000",29.03,29.32,28.7855,29.115,61738074 -"20021122093000",28.725,29.15,28.525,29.11,70139728 -"20021121093000",28.49,29,28.39,28.92,83128144 -"20021120093000",27.505,28.45,27.465,28.31,76738650 -"20021119093000",27.775,27.9,27.155,27.415,76558560 -"20021118093000",28.475,28.5185,27.87,27.925,58236538 -"20021115093000",28.335,28.46,27.835,28.35,78480722 -"20021114093000",27.995,28.5,27.935,28.495,78519768 -"20021113093000",27.12,27.965,27.055,27.685,107992828 -"20021112093000",27.05,27.715,26.95,27.255,81898940 -"20021111093000",27.535,27.55,26.91,26.93,58479334 -"20021108093000",28,28.275,27.505,27.55,66088754 -"20021107093000",28.1,28.31,27.75,28.045,73840362 -"20021106093000",28.495,28.552,27.765,28.5,115817030 -"20021105093000",27.89,28.4,27.79,28.34,76831422 -"20021104093000",28.375,28.625,27.76,28.045,140207228 -"20021101093000",26.215,26.62,25.95,26.5,105682436 -"20021031093000",26.595,27.035,26.425,26.735,106194640 -"20021030093000",26.1,26.695,25.815,26.555,94625004 -"20021029093000",26.075,26.245,25.425,26.035,90809122 -"20021028093000",26.7,26.75,25.755,26,80081818 -"20021025093000",25.625,26.4,25.58,26.34,75604510 -"20021024093000",26.66,26.685,25.45,25.615,96088000 -"20021023093000",25.715,26.63,25.5,26.595,111183962 -"20021022093000",25.715,25.965,25.515,25.835,87367430 -"20021021093000",25.985,26.495,25.68,26.255,112638800 -"20021018093000",26.3,26.6,25.57,26.575,153310760 -"20021017093000",26.14,26.25,25.025,25.375,183771030 -"20021016093000",25.195,25.63,25.14,25.205,95686356 -"20021015093000",25.6325,26.185,25.325,26.145,133729336 -"20021014093000",24.125,24.665,23.92,24.65,76551010 -"20021011093000",23.68,24.45,23.505,24.435,109088928 -"20021010093000",22,23.31,21.625,23.19,118830614 -"20021009093000",22.1135,22.725,21.905,21.995,123626070 -"20021008093000",22.375,22.99,22.065,22.48,116046636 -"20021007093000",21.905,22.53,21.845,22.06,90274004 -"20021004093000",22.695,22.785,21.845,21.885,107475586 -"20021003093000",22.65,23.297,22.3,22.4,105567092 -"20021002093000",23.05,23.408,22.58,22.805,103758332 -"20021001093000",22.125,23.125,21.595,23.115,110976456 -"20020930093000",22.435,22.52,21.5585,21.845,115849066 -"20020927093000",23.02,23.55,22.595,22.625,81222772 -"20020926093000",23.555,23.75,22.975,23.105,101115546 -"20020925093000",23.2,23.483,22.525,23.255,107405112 -"20020924093000",22.415,23.24,22.315,22.82,103789188 -"20020923093000",23.3,23.355,22.405,22.62,90025730 -"20020920093000",23.855,24,23.65,23.74,130785394 -"20020919093000",23.34,23.91,23.295,23.5865,77905338 -"20020918093000",23.36,24.12,23.33,23.875,84261030 -"20020917093000",24.335,24.4535,23.605,23.645,73707242 -"20020916093000",23.8,24.065,23.525,23.89,50320084 -"20020913093000",23.45,24.13,23.425,23.955,59695926 -"20020912093000",24.075,24.15,23.51,23.595,63976426 -"20020911110000",25.14,25.55,24.265,24.28,78213394 -"20020910093000",24.27,24.91,24.175,24.895,84133970 -"20020909093000",23.625,24.475,23.315,24.345,81844806 -"20020906093000",23.875,24.1395,23.735,23.91,70303318 -"20020905093000",23.75,23.76,22.94,22.955,90939744 -"20020904093000",23.725,24.3,23.575,24.05,80445182 -"20020903093000",24.26,24.26,23.5,23.51,74629474 -"20020830093000",25.07,25.24,24.5,24.56,58547076 -"20020829093000",24.445,25.5,24.26,25.29,94530678 -"20020828093000",25.24,25.33,24.65,24.69,69290570 -"20020827093000",26.17,26.225,25.325,25.42,65639262 -"20020826093000",26.25,26.325,25.59,26.05,55826724 -"20020823093000",26.33,26.425,25.92,26.11,58197160 -"20020822093000",26.43,26.725,26.3,26.615,72736384 -"20020821093000",25.78,26.19,25.575,26.14,81397866 -"20020820093000",25.69,25.85,25.375,25.52,70827940 -"20020819093000",25.02,26.025,24.925,25.995,79959898 -"20020816093000",24.715,25.115,24.46,24.995,69480666 -"20020815093000",24.98,25.37,24.375,24.885,99017036 -"20020814093000",23.625,24.95,23.605,24.855,97624276 -"20020813093000",23.995,24.85,23.46,23.525,100507942 -"20020812093000",23.805,24.375,23.8,24.235,57071304 -"20020809093000",24.075,24.575,23.83,24.06,69319848 -"20020808093000",23.555,24.5025,23.205,24.455,89001030 -"20020807093000",23.5,23.65,22.58,23.545,86685090 -"20020806093000",22.45,23.625,22.375,22.83,88996052 -"20020805093000",22.145,22.585,21.905,21.995,79442490 -"20020802093000",22.755,22.925,21.9,22.205,86261194 -"20020801093000",23.79,24.045,22.75,22.875,92222218 -"20020731093000",23.805,24,23.18,23.975,94116780 -"20020730093000",23.775,24.415,23.665,24.05,122988458 -"20020729093000",23.425,24.15,23.275,24.125,112379358 -"20020726093000",21.87,22.705,21.84,22.675,124122814 -"20020725093000",22.725,22.8575,21.22,21.41,163940526 -"20020724093000",20.875,23.18,20.705,23.115,203412788 -"20020723093000",23.155,23.4025,21.48495,21.50495,168061600 -"20020722093000",24.475,24.995,22.95,23.145,180678824 -"20020719093000",24.935,25.445,24.406,24.78,112572000 -"20020718093000",26.03,26.37,25.33,25.555,91493800 -"20020717093000",26.26,26.65,25.585,26,98062200 -"20020716093000",25.655,26.4,25.32,25.625,97267000 -"20020715093000",25.695,25.93,24,25.89,136966600 -"20020712093000",26.685,26.865,25.74,25.93,95786200 -"20020711093000",26.02,26.5375,25.625,26.45,129628600 -"20020710093000",26.845,27.1,26.065,26.12,90686600 -"20020709093000",26.655,27.365,26.485,26.605,85286800 -"20020708093000",27.205,27.465,26.2945,26.46,63216000 -"20020705093000",26.545,27.45,26.525,27.45,35673600 -"20020703093000",25.62,26.26,25.225,26.225,80959600 -"20020702093000",26.19,26.46,25.665,25.72,82822800 -"20020701093000",27.06,27.195,26.29,26.34,66654000 -"20020628093000",27.275,27.895,27,27.06,90210000 -"20020627093000",27.3015,27.47,26.43,27.46,95816400 -"20020626093000",25.52995,27.195,25.525,27.065,112187000 -"20020625093000",27.35,27.5,26.4,26.475,84059000 -"20020624093000",26.045,27.32,25.925,27.08,104562000 -"20020621093000",26.7,27.275,26.14,26.14,116844800 -"20020620093000",27.185,27.55,26.95,27.05,86432600 -"20020619093000",27.735,27.971,27.16,27.18,81679000 -"20020618093000",27.765,28.145,27.675,27.995,77931800 -"20020617093000",27.83,28.22,27.685,27.84,94580400 -"20020614093000",26.575,27.775,26.5,27.625,109433600 -"20020613093000",27.42,27.74,27.1,27.11,79931000 -"20020612093000",26.29,27.89,26.25,27.77,136476800 -"20020611093000",26.62,27.09,26.21,26.285,74375000 -"20020610093000",25.825,26.65,25.73,26.41,71838800 -"20020607093000",24.945,26.3,24.93,25.99,97839800 -"20020606093000",25.75,26.07,25,25.925,78987400 -"20020605093000",25.215,25.875,25.165,25.83,66978600 -"20020604093000",24.75,25.615,24.62,24.99,88057200 -"20020603093000",25.495,25.82,24.585,24.685,88448600 -"20020531093000",26.45,26.71,25.44,25.505,66475000 -"20020530093000",25.82,26.68,25.715,26.32,63522600 -"20020529093000",25.825,26.36,25.775,26.025,45399800 -"20020528093000",26.795,26.845,25.875,26.16,49602400 -"20020524093000",27.07,27.26,26.52,26.63,36015600 -"20020523093000",26.85,27.42,26.505,27.41,51433800 -"20020522093000",25.935,26.86,25.925,26.835,54170800 -"20020521093000",26.975,27.3,26.065,26.095,63128200 -"20020520093000",27.75,27.775,26.75,27.005,52121800 -"20020517093000",28.105,28.2,27.635,28.015,54647000 -"20020516093000",27.355,28.02,27.325,27.87,53417600 -"20020515093000",27.245,28.22,26.93,27.375,70460400 -"20020514093000",27.2,27.55,26.9935,27.495,64877000 -"20020513093000",25.225,26.455,24.875,26.345,64821800 -"20020510093000",26.265,26.338,24.998,25.025,64522400 -"20020509093000",27.2,27.5,25.95,26.06,83300000 -"20020508093000",25.635,27.485,25.61,27.485,101262000 -"20020507093000",24.59,25.145,24.1765,24.735,88535000 -"20020506093000",24.72,25.27,24.185,24.31,66315400 -"20020503093000",25.63,25.84,24.755,24.78,71649600 -"20020502093000",26.32,27.035,25.575,25.605,79011600 -"20020501093000",26.08,26.595,25.33,26.375,76423200 -"20020430093000",26.05,26.65,25.96,26.13,77394000 -"20020429093000",25.735,26.455,25.72,26.12,70330400 -"20020426093000",27.035,27.225,25.73,25.75,62785400 -"20020425093000",26.45,27.225,26.4445,26.865,57293200 -"20020424093000",26.925,27.215,26.5,26.51,61235200 -"20020423093000",27.85,27.91,26.65,26.995,68472600 -"20020422093000",28.26,28.35,27.5,27.795,51480000 -"20020419093000",28.72,28.99,28.43,28.6,104631800 -"20020418093000",28.395,28.655,27.92,28.185,77057200 -"20020417093000",28.975,29.14,28.21,28.315,55162800 -"20020416093000",28.2,29.05,28.18,28.905,52041000 -"20020415093000",28,28.385,27.7,27.845,47393800 -"20020412093000",27.575,28.13,27.43,27.965,52297600 -"20020411093000",27.945,28.225,27.25,27.395,58171000 -"20020410093000",27.56,28.555,27.53,28.15,75637800 -"20020409093000",28.665,28.7155,27.4,27.435,63424200 -"20020408093000",27.15,28.656,27.13,28.61,73392000 -"20020405093000",28.445,28.65,27.92,27.935,50176200 -"20020404093000",27.99,28.485,27.714,28.225,61769400 -"20020403093000",28.7225,28.805,27.75,28.165,76969000 -"20020402093000",29.45,29.5495,28.555,28.725,77037800 -"20020401093000",29.915,30.2,29.6,30.19,47010200 -"20020328093000",29.975,30.325,29.83,30.155,44393000 -"20020327093000",29.4,29.94,29.295,29.72,47322200 -"20020326093000",29.55,30.46,29.155,29.54,69403400 -"20020325093000",30.24,30.39,29.575,29.615,47942400 -"20020322093000",30.525,30.57,30.11,30.215,41341400 -"20020321093000",30.105,30.7995,29.915,30.68,46169600 -"20020320093000",30.7,31.01,30.05,30.05,55508600 -"20020319093000",31.09,31.5,30.75,31.115,36376400 -"20020318093000",31.37,31.495,30.6,31.07,44854600 -"20020315093000",30.5,31.255,30.485,31.245,69094000 -"20020314093000",31.07,31.12,30.525,30.61,51828400 -"20020313093000",31.04,31.51,30.975,31.05,44388000 -"20020312093000",31.26,31.4,30.835,31.27,66417800 -"20020311093000",31.755,32.5,31.5,32.17,43718200 -"20020308093000",31.815,32.35,31.585,31.975,57703800 -"20020307093000",31.835,31.9445,30.93,31.36,58081000 -"20020306093000",31.455,31.85,31.095,31.815,50160800 -"20020305093000",31.5,31.94,31.17,31.54,55926800 -"20020304093000",30.62,31.75,30.4395,31.595,74464400 -"20020301093000",29.525,30.71,29.425,30.685,62457600 -"20020228093000",29.39,29.85,29.07,29.17,68067000 -"20020227093000",29.5375,30.075,28.9995,29.195,65755400 -"20020226093000",29.551,30,28.95,29.275,63279000 -"20020225093000",28.97,29.945,28.945,29.54,51832400 -"20020222093000",29.025,29.3755,28.575,28.995,71348200 -"20020221093000",29.86,30.135,29.005,29.025,59449400 -"20020220093000",29.7,30.18,29.4,29.95,50498200 -"20020219093000",29.955,30.07,29.3045,29.415,52265200 -"20020215093000",30.85,31.03,30.1,30.115,50184400 -"20020214093000",31,31.495,30.66,30.8,57267600 -"20020213093000",30.13,30.94,29.975,30.875,54175200 -"20020212093000",30.245,30.425,30.01,30.07,44975200 -"20020211093000",30.005,30.62,29.795,30.565,50900400 -"20020208093000",30.06,30.33,29.415,30.325,61285200 -"20020207093000",30.15,30.805,29.875,29.9,63327800 -"20020206093000",30.805,30.945,30.125,30.225,66126200 -"20020205093000",30.4,31.115,30.25,30.575,66772800 -"20020204093000",31.2,31.345,30.375,30.56,70310400 -"20020201093000",32.075,32.2505,31.235,31.33,63462800 -"20020131093000",31.53,31.905,31.06,31.855,69572800 -"20020130093000",31.225,31.45,30.665,31.425,66104200 -"20020129093000",31.95,32.25,30.995,31.16,58669400 -"20020128093000",32.115,32.2,31.455,31.91,41623400 -"20020125093000",32.095,32.425,31.755,31.9,48981600 -"20020124093000",32.05,32.59,31.9,32.33,83959400 -"20020123093000",32.025,32.355,31.62,31.87,80408600 -"20020122093000",33.305,33.315,32.125,32.275,76840800 -"20020118093000",33.55,33.925,32.71,33.05,107271600 -"20020117093000",34.265,35.0005,34.2,34.93,80371200 -"20020116093000",34.425,34.92,33.925,33.935,61959000 -"20020115093000",34.33,34.81,34.25,34.775,60720200 -"20020114093000",34.15,34.52,33.87,34.235,50999800 -"20020111093000",34.76,35.16,34.05,34.305,72994600 -"20020110093000",34.24,34.9,34.065,34.64,50329000 -"20020109093000",34.86,35.31,34.235,34.345,76309000 -"20020108093000",34.345,34.93,34,34.685,47736600 -"20020107093000",34.875,35.01,34.175,34.28,58508800 -"20020104093000",34.625,34.955,34.335,34.45,52733600 -"20020103093000",33.555,34.625,33.545,34.615,67692400 -"20020102093000",33.325,33.555,32.755,33.52,48124800 -"20011231093000",33.92,34.24,33.125,33.135,43058200 -"20011228093000",34.115,34.425,33.85,33.925,28789000 -"20011227093000",33.99,34.355,33.63,33.925,32429000 -"20011226093000",33.71,34.535,33.695,33.84,29331800 -"20011224093000",33.86,34.015,33.6,33.625,11701600 -"20011221093000",34.005,34.365,33.5,33.77,84324600 -"20011220093000",34.575,34.7,33.313,33.38,78593000 -"20011219093000",34.31,34.9455,34.225,34.745,56996200 -"20011218093000",34.46,34.7,34.3045,34.635,47261200 -"20011217093000",33.585,34.555,33.58,34.49,57080600 -"20011214093000",33.01,33.975,32.965,33.72,43003800 -"20011213093000",33.565,34.19,33.0395,33.135,53234000 -"20011212093000",33.58,33.99,33.125,33.975,47884200 -"20011211093000",33.83,34.0695,33.535,33.66,54334000 -"20011210093000",33.76,34.225,33.43,33.53,38367400 -"20011207093000",34.1,34.42,33.275,33.915,42332400 -"20011206093000",33.99,34.5,33.775,34.27,56033600 -"20011205093000",33.245,34.085,33.19,34.05,74251200 -"20011204093000",32.5,33.04,32.05,33,51012600 -"20011203093000",31.915,32.615,31.9,32.385,47213600 -"20011130093000",32.33,32.54,31.965,32.105,48238400 -"20011129093000",31.56,32.45,31.4795,32.42,54042600 -"20011128093000",31.585,32.06,31.365,31.4,54593600 -"20011127093000",32.395,32.5385,31.375,31.87,90811200 -"20011126093000",32.495,32.855,32.2,32.57,41992400 -"20011123093000",32.19,32.405,31.81,32.355,15767200 -"20011121093000",32.18,32.3,31.7445,32.015,50788200 -"20011120093000",33.225,33.9,32.515,32.7,65934800 -"20011119093000",33.125,33.485,32.8525,33.27,56007600 -"20011116093000",33.15,33.3095,32.475,32.875,59262600 -"20011115093000",33.05,33.525,32.725,33.06,77944400 -"20011114093000",34.115,34.17,32.895,32.975,88634600 -"20011113093000",33.4,33.975,33.3,33.91,60175400 -"20011112093000",32.35,33.22,31.825,32.895,57754800 -"20011109093000",32.17,32.825,31.955,32.605,48017200 -"20011108093000",32.23,33.03,31.83,32.21,74239800 -"20011107093000",32.11,32.525,32.015,32.125,58910200 -"20011106093000",31.35,32.47,31.08,32.39,68621000 -"20011105093000",30.93,32.015,30.875,31.635,66367400 -"20011102093000",30.965,31.5105,30.255,30.7,83368800 -"20011101093000",30.04,31.1295,29.8,30.92,109690400 -"20011031093000",29.65,30.365,29.05,29.075,64736400 -"20011030093000",29.46,29.7745,29.095,29.44,57395600 -"20011029093000",31.05,31.1,29.77,29.82,55139000 -"20011026093000",31.16,31.815,31.04,31.1,64514200 -"20011025093000",30.305,31.3,29.785,31.28,75324600 -"20011024093000",30.25,30.81,29.81,30.66,79166800 -"20011023093000",30.235,30.72,29.7,30.215,80328000 -"20011022093000",28.95,30.09,28.735,30.08,72327400 -"20011019093000",28.7,29.005,27.815,28.95,91231800 -"20011018093000",28.17,28.79,27.75,28.4,78524600 -"20011017093000",29.56,29.65,27.99,28.015,73730400 -"20011016093000",28.935,29.455,28.605,29.225,66221800 -"20011015093000",27.95,29.25,27.75,29.03,68458400 -"20011012093000",27.85,28.32,27.275,28.19,63370000 -"20011011093000",27.8835,28.42,27.2995,28.16,83783600 -"20011010093000",26.8,27.875,26.5,27.755,86370000 -"20011009093000",28.75,28.7855,27.095,27.28,99485000 -"20011008093000",28.4,29.325,28.37,29.025,60611600 -"20011005093000",28.08,29,27.47,28.87,80875200 -"20011004093000",28.46,29.2005,28.105,28.22,101782400 -"20011003093000",26.24,28.465,26.2,28.125,97478200 -"20011002093000",25.8195,26.775,25.78,26.5,80863200 -"20011001093000",25.47,26.25,25.205,25.875,70035800 -"20010928093000",24.81,25.795,24.49,25.585,116647800 -"20010927093000",25.05,25.34,24,24.97,81194200 -"20010926093000",25.755,25.9,24.775,25.135,58531200 -"20010925093000",26.135,26.5,25.08,25.65,84952800 -"20010924093000",25.325,26.225,24.935,26.005,85568800 -"20010921093000",23.96,25.3,23.75,24.855,184985200 -"20010920093000",26.175,26.305,25.335,25.38,118076400 -"20010919093000",27.23,27.56,25.3,26.935,126951600 -"20010918093000",26.705,27.5,26.585,27.16,83249800 -"20010917093000",27.01,27.55,26.4,26.455,128096200 -"20010910093000",27.46,28.975,27.35,28.79,84474800 -"20010907093000",28.055,28.68,27.6595,27.7,89888400 -"20010906093000",28.28,29.195,27.95,28.01,112447000 -"20010905093000",28.09,29.195,27.645,28.87,89476800 -"20010904093000",28.595,29.54,28.035,28.05,67189600 -"20010831093000",28.425,29.03,28.15,28.525,57977200 -"20010830093000",29.52,29.83,28.26,28.47,97685600 -"20010829093000",30.525,30.65,29.77,30.125,48173600 -"20010828093000",31.17,31.475,30.29,30.37,47425000 -"20010827093000",30.95,31.68,30.785,31.155,44563000 -"20010824093000",29.8,31.14,29.615,31.025,63407000 -"20010823093000",30.335,30.765,29.5,29.5,52023400 -"20010822093000",30.565,30.575,29.54,30.33,78144800 -"20010821093000",31.35,31.6,30.356,30.39,47120600 -"20010820093000",30.83,31.375,30.55,31.35,48372200 -"20010817093000",31.89,32.065,30.75,30.94,52236600 -"20010816093000",31.42,32.355,31.35,32.31,43917600 -"20010815093000",32.355,32.525,31.6,31.6,39505200 -"20010814093000",32.875,33.045,32.225,32.345,36481600 -"20010813093000",32.62,32.995,32.375,32.855,32675600 -"20010810093000",32.385,32.93,31.45,32.76,51757000 -"20010809093000",32.49,32.775,32.15,32.505,45537800 -"20010808093000",33.255,33.62,32.245,32.415,55004000 -"20010807093000",33.02,33.525,32.995,33.175,31349800 -"20010806093000",33.265,33.56,32.84,33.065,27833400 -"20010803093000",33.65,33.68,33,33.445,43260600 -"20010802093000",33.605,33.77,33.13,33.725,54199600 -"20010801093000",33.4,33.405,32.88,33.235,55679400 -"20010731093000",33.005,33.695,32.925,33.095,59033200 -"20010730093000",32.825,33.44,32.77,32.9,42196800 -"20010727093000",33.025,33.125,32.525,32.735,65405200 -"20010726093000",33.56,33.66,32.75,33.305,78047200 -"20010725093000",33.13,33.76,32.68,33.67,74105000 -"20010724093000",33.5,33.995,32.85,33.16,67543600 -"20010723093000",34.62,34.63,33.35,33.545,80002400 -"20010720093000",34.015,34.7,33.9,34.59,124210200 -"20010719093000",35.61,36.5,35.57,36.255,76871800 -"20010718093000",35.3,35.75,34.935,35.285,57598400 -"20010717093000",35.33,36.005,35.07,35.91,63252400 -"20010716093000",35.725,36.08,35.075,35.59,55990800 -"20010713093000",35.7,36,35.47,35.67,58938400 -"20010712093000",35.35,36.025,35.165,35.8,128125800 -"20010711093000",32.105,33.375,32.1,33.25,74713800 -"20010710093000",32.95,33.125,32.175,32.24,66567200 -"20010709093000",33.1,33.455,32.52,32.845,66479600 -"20010706093000",34.15,34.2,32.835,33.03,67565200 -"20010705093000",35.11,35.36,34.22,34.255,49268400 -"20010703093000",35.15,35.4,34.965,35.225,28038000 -"20010702093000",36.025,36.575,35.075,35.3,72820800 -"20010629093000",36.3,36.705,35.68,36.3,94465400 -"20010628093000",35.775,38.075,35.125,36.355,129054000 -"20010627093000",34.93,35.765,34.68,35.58,69205800 -"20010626093000",33.91,35.105,33.85,35.04,63077800 -"20010625093000",34.55,34.905,33.885,34.425,49218800 -"20010622093000",35,35.305,34.29,34.415,51092200 -"20010621093000",34.575,35.275,34.46,34.92,69612200 -"20010620093000",33.57,34.795,33.55,34.705,64111600 -"20010619093000",34.105,34.425,33.425,33.66,63469000 -"20010618093000",33.975,33.98,33.005,33.44,56889600 -"20010615093000",33.755,34.15,33.2,33.995,108492400 -"20010614093000",35.11,35.275,34.2,34.65,72040400 -"20010613093000",36.025,36.15,35.32,35.345,55335600 -"20010612093000",35.51,36.205,35.405,36.035,66716000 -"20010611093000",36.425,36.425,35.755,36.06,47347600 -"20010608093000",36.85,36.875,36.025,36.595,51867400 -"20010607093000",36.06,36.865,36.04,36.825,66981000 -"20010606093000",36.445,36.74,35.775,36.18,80052000 -"20010605093000",35.38,36.54,35.25,36.3,89456200 -"20010604093000",35.275,35.51,34.9,35.4,43758200 -"20010601093000",34.8,35.35,34.35,35.17,57588200 -"20010531093000",34.745,35.19,34.2,34.59,70687800 -"20010530093000",34.78,35.29,34.325,34.595,86463400 -"20010529093000",35.4,35.875,35.025,35.17,71212400 -"20010525093000",35.83,35.95,35.18,35.455,52757200 -"20010524093000",34.97,35.89,34.635,35.86,80789800 -"20010523093000",35.195,35.8,34.75,34.85,93664800 -"20010522093000",34.725,35.175,34.57,35.14,83461000 -"20010521093000",34.025,34.995,33.875,34.395,103508200 -"20010518093000",33.845,34.6,33.625,34.045,90867200 -"20010517093000",34.55,35.07,33.775,34.08,107002000 -"20010516093000",33.85,34.94,33.665,34.58,91899800 -"20010515093000",34.37,34.65,34,34.135,61389600 -"20010514093000",34.565,34.6,34.15,34.36,45010600 -"20010511093000",34.98,35,34.325,34.7,51129800 -"20010510093000",35.565,35.62,34.98,35,64341800 -"20010509093000",35.62,35.65,34.93,35.2,76677000 -"20010508093000",35.875,36.05,35.375,36.03,75086200 -"20010507093000",35.415,36.075,35.35,35.675,109360200 -"20010504093000",34,35.525,33.98,35.375,119556800 -"20010503093000",34.625,35.09,34.07,34.265,66273600 -"20010502093000",35.5,35.575,34.675,34.88,92864400 -"20010501093000",33.83,35.15,33.8,35.09,83723400 -"20010430093000",34.265,34.53,33.84,33.875,74368200 -"20010427093000",34.765,34.84,33.105,33.565,127400000 -"20010426093000",35.035,35.5,34.125,34.565,118741000 -"20010425093000",33.785,34.895,33.625,34.845,76747200 -"20010424093000",34.1,34.965,33.57,33.775,89180600 -"20010423093000",34.055,34.235,33.45,34.125,92172200 -"20010420093000",35.15,35.55,34.25,34.5,192956000 -"20010419093000",32.905,34.5,32.875,34.01,160024000 -"20010418093000",31.695,33.155,31.5,32.715,156746400 -"20010417093000",30.26,31.055,30.02,30.74,85308000 -"20010416093000",30.7,30.79,30.06,30.395,65858000 -"20010412093000",29.78,31.155,29.675,31.09,87523800 -"20010411093000",30.325,30.75,29.85,30.5,109879800 -"20010410093000",28.975,30.045,28.89,29.84,109211000 -"20010409093000",28.285,28.71,27.83,28.575,56295600 -"20010406093000",28.19,28.595,27.53,28.09,92624200 -"20010405093000",26.875,28.6875,26.75,28.375,113459600 -"20010404093000",26.6875,27.5,25.53125,25.96875,104069800 -"20010403093000",27.65625,27.78125,26.375,26.6875,94192800 -"20010402093000",27.40625,28.46875,27.3125,27.90625,75924400 -"20010330093000",27.875,28.09375,26.9375,27.34375,91344200 -"20010329093000",27.6875,28.59375,27.28125,27.6875,86987400 -"20010328093000",28.6875,28.96875,27.6875,27.75,78704200 -"20010327093000",28.03125,29.28125,27.9375,29.125,95144400 -"20010326093000",28.5625,28.75,27.78125,28.03125,63118800 -"20010323093000",27.46875,28.5,27.1875,28.28125,99520200 -"20010322093000",25.28125,27.03125,25.25,27,126372200 -"20010321093000",26.125,26.625,24.875,24.96875,125052600 -"20010320093000",27.28125,28.0625,26.3125,26.34375,91825600 -"20010319093000",27.25,27.75,26.5625,27.15625,61036400 -"20010316093000",26.25,27.5625,26.23435,27.21875,112851600 -"20010315093000",27.65625,28.03125,26.75,26.84375,71638400 -"20010314093000",26.25,27.625,26.09375,27,90686600 -"20010313093000",26.09375,27.375,26,27.09375,91042400 -"20010312093000",27.34375,27.5,25.8125,25.96875,114377400 -"20010309093000",28.96875,29.09375,27.4375,28.34375,103794400 -"20010308093000",30.15625,30.29685,29.21875,29.625,54626000 -"20010307093000",29.9375,30.5625,29.65625,30.34375,59744600 -"20010306093000",29.3125,30,29.1875,29.71875,66781800 -"20010305093000",28.625,29.3125,28.28125,28.71875,49384000 -"20010302093000",28.75,29.0625,28.21875,28.34375,79800800 -"20010301093000",29.28125,29.75,28.125,29.67185,81781600 -"20010228093000",29.78125,30.03125,29.09375,29.5,84608800 -"20010227093000",29.6875,30.59375,29.3281,29.6875,99155400 -"20010226093000",28.8125,29.96875,28.6875,29.75,87936800 -"20010223093000",27.21875,28.75,27.15625,28.375,92620800 -"20010222093000",28.15625,28.40625,26.9375,27.59375,100828400 -"20010221093000",27.625,29.03125,27.59375,28.125,63947200 -"20010220093000",28.6875,29.125,27.6875,27.9375,60731400 -"20010216093000",28.5,29.125,28.0625,28.59375,66958400 -"20010215093000",29.5,30.09375,28.9375,29.40625,65627800 -"20010214093000",28.8125,29.5,28.1875,29.1875,61728400 -"20010213093000",29.8125,30.53125,29.0625,29.09375,73957000 -"20010212093000",29.40625,29.71875,28.59375,29.375,70263600 -"20010209093000",30.65625,30.78125,29.25,29.5625,100579600 -"20010208093000",31.875,32.25,31,31.125,88041200 -"20010207093000",31,32.53125,30.90625,32.34375,126061800 -"20010206093000",31.03125,31.90625,30.84375,31.28125,96442000 -"20010205093000",30.375,31.03125,30.125,30.96875,56092600 -"20010202093000",31.25,31.6875,30.375,30.40625,71117000 -"20010201093000",30.40625,31.3125,30.1875,31.15625,71796800 -"20010131093000",31.5,31.875,30.5,30.53125,81898800 -"20010130093000",32.25,32.375,31.4375,31.6875,57276800 -"20010129093000",31.78125,32.3125,31.5625,32.25,84983800 -"20010126093000",30.5,32.15625,30.46875,32,93080000 -"20010125093000",31.375,32,30.78125,30.90625,85687400 -"20010124093000",30.5,31.71875,30.375,31.46875,110455000 -"20010123093000",29.875,30.46875,29.46875,30.28125,70297000 -"20010122093000",30.375,30.5,29.5,30.0625,76673200 -"20010119093000",30,30.71875,29.4375,30.5,209348800 -"20010118093000",26.84375,28.09375,26.3125,27.8125,109801400 -"20010117093000",26.8125,27.4375,26.28125,26.46875,72850200 -"20010116093000",26.6875,26.75,25.5625,26.28125,68462400 -"20010112093000",27.4375,27.5,26.25,26.75,73712800 -"20010111093000",26.5,27.875,26.15625,27.5,101862200 -"20010110093000",25.5,26.90625,25.375,26.4375,90243400 -"20010109093000",25,26.3125,24.875,25.90625,114965400 -"20010108093000",24.46875,24.875,23.34375,24.46875,79784600 -"20010105093000",24.25,24.9375,23.78125,24.5,93416400 -"20010104093000",23.90625,25.25,23.4375,24.1875,112398400 -"20010103093000",21.59375,24.4375,21.5625,23.96875,135964000 -"20010102093000",22.0625,22.5,21.4375,21.6406,82413600 -"20001229093000",21.96875,22.90625,21.3125,21.6875,100072000 -"20001228093000",22.5625,23.125,21.9375,22.28125,77620600 -"20001227093000",23.0625,23.40625,22.5,23.21875,69003800 -"20001226093000",23.4375,24.28125,22.9375,23.4375,66942200 -"20001222093000",22.375,23.5625,22.375,23.21875,110185800 -"20001221093000",20.375,22.5625,20.125,21.71875,163177600 -"20001220093000",21.40625,22,20.6875,20.75,149037600 -"20001219093000",23.71875,24,22.25,22.375,120377000 -"20001218093000",24.5,25,23.5,23.90625,107187400 -"20001215093000",25.5156,26,23.875,24.59375,326615000 -"20001214093000",28.96875,29.35935,27.6875,27.75,71202800 -"20001213093000",30.25,30.25,28.40625,28.625,98360400 -"20001212093000",28.90625,30,28.375,29.1875,63106000 -"20001211093000",27.75,29.375,27.5,29.03125,95576200 -"20001208093000",27.3125,27.9375,26.71875,27.21875,120939800 -"20001207093000",26.71875,27,26.125,26.5625,145308200 -"20001206093000",30,30.03125,28.03125,28.34375,90560800 -"20001205093000",29.59375,30.25,29.125,29.9375,101734400 -"20001204093000",28.625,29.5,27.59375,28.1875,80407200 -"20001201093000",29.03125,30.3125,28.03125,28.3125,109810200 -"20001130093000",31,31.03125,28.5,28.6875,197206400 -"20001129093000",33.40625,33.5625,31.625,32.53125,98283400 -"20001128093000",34.6875,34.875,33.40625,33.5,127446200 -"20001127093000",35.71875,36.125,35.3125,35.34375,85307600 -"20001124093000",34.5,35.21875,34.25,34.96875,34439200 -"20001122093000",33.03125,34.75,33,34.125,76344200 -"20001121093000",33.6875,34.625,33.6875,33.875,59487600 -"20001120093000",34.0625,34.25,32.78125,33.59375,80157200 -"20001117093000",34.71875,35,33.8906,34.53125,106525600 -"20001116093000",34.71875,35.75,34.46875,34.46875,92128600 -"20001115093000",34.53125,35.4375,34.34375,35.03125,60422200 -"20001114093000",34,34.90625,33.65625,34.40625,84218600 -"20001113093000",33.34375,34.0625,32.2031,33.21875,83370400 -"20001110093000",34.96875,35.15625,33.40625,33.6875,93744400 -"20001109093000",34.25,35.65625,34.21875,35.4375,91058600 -"20001108093000",35.5625,36.1875,34,34.71875,206149400 -"20001107093000",34.875,35.9375,34.75,35.25,104345400 -"20001106093000",34.34375,35.0625,34.125,34.75,74851400 -"20001103093000",34.625,34.8125,34.03125,34.125,68711000 -"20001102093000",35.1875,35.42185,34.8125,35.15625,77985200 -"20001101093000",34.25,35.03125,34.21875,34.8125,81313400 -"20001031093000",34.5,34.75,34,34.4375,104474000 -"20001030093000",33.75,35.0625,33.6875,34.53125,110057600 -"20001027093000",32.34375,34.59375,32.3125,33.84375,124292600 -"20001026093000",30.5,32.53125,30.40625,32.21875,114832400 -"20001025093000",30.96875,31.71875,30.21875,30.625,167603800 -"20001024093000",31.3125,31.46875,30.09375,30.75,94427400 -"20001023093000",32.3125,33.125,30.34375,31.0625,185170400 -"20001020093000",30.65625,33.0625,30.5625,32.59375,160378600 -"20001019093000",29.21875,31.09375,29,30.9375,257015200 -"20001018093000",24.8125,26.625,24.21875,25.875,110537400 -"20001017093000",25.9375,26.21875,25.125,25.21875,81276600 -"20001016093000",26.75,26.90625,24.78125,25.1875,119759000 -"20001013093000",26.9375,27.4375,26.0625,26.84375,104522400 -"20001012093000",28.15625,28.4375,26.90625,27.21875,90224600 -"20001011093000",27,28.46875,27,27.875,101208400 -"20001010093000",26.96875,27.78125,26.90625,27.28125,62066200 -"20001009093000",27.8125,27.875,26.5,27.09375,58323600 -"20001006093000",27.90625,28.375,27.375,27.78125,61795200 -"20001005093000",27.75,28.625,27.625,27.625,81099400 -"20001004093000",28.1875,28.28125,27.25,27.71875,136540000 -"20001003093000",29.78125,29.90625,28.25,28.28125,85374000 -"20001002093000",30.25,30.40625,29.125,29.5625,58562400 -"20000929093000",30.5,30.65625,29.3125,30.125,74053600 -"20000928093000",30.40625,30.9375,30.3125,30.65625,52360400 -"20000927093000",31.71875,31.78125,29.90625,30.3125,106155600 -"20000926093000",30.46875,32.9375,30.21875,31.34375,155704800 -"20000925093000",31.625,31.75,30.21875,30.625,53479200 -"20000922093000",30.5625,31.75,30.46875,31.625,84476600 -"20000921093000",32,32.5625,31.78125,32.09375,48877200 -"20000920093000",32.4375,32.5,31.59375,32.125,67791400 -"20000919093000",31.8125,32.875,31.6875,32.5,79311400 -"20000918093000",32.125,32.3125,31.09375,31.5,69037800 -"20000915093000",32.71875,32.8125,31.65625,32.09375,99915200 -"20000914093000",34.34375,34.375,32.84375,32.9375,78503000 -"20000913093000",33.75,34.375,33.59375,34.15625,40744800 -"20000912093000",34.375,34.65625,33.8125,34.0625,46781200 -"20000911093000",34.5625,34.84375,34.03125,34.40625,48495200 -"20000908093000",35.1875,35.4375,34.59375,34.65625,56709600 -"20000907093000",35,36.03125,34.71875,34.96875,111720000 -"20000906093000",35.03125,35.34375,34.65625,34.71875,62960800 -"20000905093000",35,35.34375,34.90625,35.09375,50755200 -"20000901093000",35,35.3125,34.84375,35.09375,37629800 -"20000831093000",35.4375,35.65625,34.84375,34.90625,72575400 -"20000830093000",35.34375,35.46875,34.84375,35,53498800 -"20000829093000",35.59375,36.375,35.4375,35.46875,59400200 -"20000828093000",35.09375,36.0625,35.0625,35.65625,56421600 -"20000825093000",35.34375,35.84375,35.28125,35.3125,52729400 -"20000824093000",35.3125,35.59375,34.96875,35.5625,42405400 -"20000823093000",35.40625,35.5625,35.1875,35.375,36726800 -"20000822093000",35.40625,36.21875,35.3125,35.625,54428200 -"20000821093000",35.34375,35.40625,35,35.3125,34119800 -"20000818093000",35.5625,35.71875,35.1875,35.5,54438800 -"20000817093000",35.5625,36,35.28125,35.78125,36112800 -"20000816093000",35.9375,36.125,35.28125,35.5,44976200 -"20000815093000",36,36.5,35.75,35.8125,40714200 -"20000814093000",36.15625,36.6875,35.6875,36.125,53427000 -"20000811093000",36.21875,36.34375,35.8125,36.21875,35629600 -"20000810093000",36.90625,37.03125,35.875,36.3125,48986000 -"20000809093000",36.875,37.4375,36.5625,37.15625,63945600 -"20000808093000",35.03125,37.34375,35,37.0625,138038800 -"20000807093000",35.09375,35.5625,34.875,35,52741800 -"20000804093000",34.71875,34.9375,34.09375,34.5625,38107400 -"20000803093000",34.09375,35.1875,34.0625,35.125,54543400 -"20000802093000",34.28125,35.21875,34.25,34.6875,48269200 -"20000801093000",34.96875,35.03125,34.09375,34.375,47163600 -"20000731093000",35.09375,35.5625,34.625,34.90625,70283800 -"20000728093000",35.46875,35.90625,34.8125,34.84375,75650000 -"20000727093000",33.9375,35.0625,33.75,34.78125,74337600 -"20000726093000",34.53125,34.75,33.625,33.90625,85404600 -"20000725093000",35.40625,35.5,34.1875,34.5,64188600 -"20000724093000",36.03125,36.0625,35,35.25,56165600 -"20000721093000",37.375,37.5,35.9375,36.15625,56100600 -"20000720093000",36.71875,37.625,36.5625,37.40625,54690600 -"20000719093000",38.03125,38.75,36.40625,36.5625,139924600 -"20000718093000",38.8125,39.75,38.71875,39.21875,70617200 -"20000717093000",39.125,39.78125,38.75,39.09375,53992800 -"20000714093000",39.75,39.875,39.21875,39.46875,51180600 -"20000713093000",39.40625,40,38.6875,39.96875,80843200 -"20000712093000",39.125,40.5,38.59375,40.15625,58370200 -"20000711093000",39.40625,40.25,39.25,39.5625,37164800 -"20000710093000",40.34375,40.65625,39.6875,39.75,52689800 -"20000707093000",40.625,41.4375,40.28125,41,54153200 -"20000706093000",39.4375,40.84375,39.25,40.46875,47873200 -"20000705093000",39.9375,39.9375,39.125,39.25,34824400 -"20000703093000",39.84375,40.03125,39.6875,39.96875,15734800 -"20000630093000",38.53125,40,38.34375,40,52356400 -"20000629093000",39.125,39.46875,38.53125,38.59375,38449000 -"20000628093000",39.5,40.03125,39.3125,39.46875,37459200 -"20000627093000",39.625,40.0625,39.1875,39.40625,31071200 -"20000626093000",38.75,40.0625,38.75,39.75,48287000 -"20000623093000",39.96875,40.03125,38.5,38.875,49811600 -"20000622093000",40.6875,41,39.65625,39.9375,87315200 -"20000621093000",38.5,41.09375,38.46875,40.34375,160399600 -"20000620093000",36.9375,37.625,36.875,37.46875,62275000 -"20000619093000",36.28125,36.90625,36,36.84375,46604800 -"20000616093000",36.3125,36.5625,35.75,36.28125,68710600 -"20000615093000",35.40625,36.34375,35.3125,36.1875,65592600 -"20000614093000",34.90625,35.5,34.75,35.25,79992400 -"20000613093000",33.375,34,33.0625,33.9375,44289200 -"20000612093000",34.5,34.5,33.1875,33.46875,49260600 -"20000609093000",34.8125,34.84375,34.15625,34.40625,35560200 -"20000608093000",35.78125,36.0625,34.125,34.40625,94765600 -"20000607093000",34.625,35.375,33.5625,35.25,76311600 -"20000606093000",34.09375,34.9375,33.90625,34.8125,99019000 -"20000605093000",33.0156,34.1875,33,33.4375,64400000 -"20000602093000",33,33.375,32.5,33.15625,80463200 -"20000601093000",32.1875,33,31.90625,32.28125,94507200 -"20000531093000",31.8125,31.84375,31.03125,31.28125,54968200 -"20000530093000",31.21875,32.0625,31,31.6875,68536400 -"20000526093000",31.03125,31.46875,30.1875,30.71875,55822000 -"20000525093000",32.28125,32.375,30.5625,30.75,94348800 -"20000524093000",31.5625,33.28125,31.5,32.78125,85482400 -"20000523093000",31.9375,32.78125,31.53125,31.625,57962600 -"20000522093000",32.5625,32.625,31.21875,32.09375,69962800 -"20000519093000",32.6875,32.96875,32.25,32.53125,66578000 -"20000518093000",34.03125,34.03125,32.9375,33.09375,53640400 -"20000517093000",34.4375,34.5625,33.625,33.84375,53242000 -"20000516093000",34.78125,35.3125,34.53125,34.75,48410600 -"20000515093000",34.5,34.71875,34,34.6875,33899600 -"20000512093000",34.21875,34.875,34.125,34.40625,37886000 -"20000511093000",33.3125,34.0625,32.875,33.9375,58390800 -"20000510093000",33.875,33.9375,32.875,33.09375,67740000 -"20000509093000",35.09375,35.21875,33.75,33.90625,60778400 -"20000508093000",35.46875,35.6875,34.84375,34.90625,36187600 -"20000505093000",35.125,35.90625,34.9375,35.5625,36402200 -"20000504093000",35.15625,35.625,34.65625,35.28125,43317200 -"20000503093000",35.1875,35.40625,34.40625,35.28125,55354800 -"20000502093000",36.40625,36.75,34.75,34.9375,97716200 -"20000501093000",36.4375,37,35.84375,36.71875,107811000 -"20000428093000",35.375,35.5,34.125,34.875,78082600 -"20000427093000",33.71875,34.96875,33.6875,34.90625,77669800 -"20000426093000",35,35.5625,33.6875,34,107091400 -"20000425093000",34.375,34.75,33.8125,34.6875,159517400 -"20000424093000",33.625,34,32.5,33.3125,313681800 -"20000420093000",39.3125,39.9375,38.75,39.46875,52261800 -"20000419093000",40.71875,40.75,39.0625,39.34375,53715400 -"20000418093000",38.25,40.96875,37.9375,40.28125,91802000 -"20000417093000",37.125,38,36.5,37.8125,119773000 -"20000414093000",39.5625,39.75,36.625,37.0625,151221400 -"20000413093000",40.4375,41.125,39.5,39.625,94316200 -"20000412093000",41.0625,41.125,39.375,39.6875,153017800 -"20000411093000",42.5625,43.03125,41.75,41.9375,71961800 -"20000410093000",44.3125,44.3125,43,43.03125,60685400 -"20000407093000",43.5,44.6875,42.5,44.5625,82628200 -"20000406093000",43.9375,44,42.625,43,66421400 -"20000405093000",44.125,44.25,42.9375,43.1875,82888200 -"20000404093000",45.78125,46,42.46875,44.28125,181246600 -"20000403093000",47.21875,48.34375,45,45.4375,232158600 -"20000331093000",53,54.125,52.0625,53.125,64281400 -"20000330093000",53.09375,54.3125,51.25,51.71875,64178400 -"20000329093000",52.59375,54.46875,52.5625,53.59375,64365200 -"20000328093000",51.8125,53.71875,51.1875,52.15625,81114400 -"20000327093000",53.875,54.125,51.96875,52.03125,111434000 -"20000324093000",56.3125,57.5,54.78125,55.84375,112196800 -"20000323093000",53.40625,56.4375,53.3125,55.9375,148223800 -"20000322093000",51.40625,52.8125,50.5625,51.625,93976000 -"20000321093000",48.375,51.5625,48.25,51.375,81648800 -"20000320093000",49.375,49.875,48.25,48.6875,47773000 -"20000317093000",47.625,49.75,47.25,49.6875,81161600 -"20000316093000",47.96875,48.34375,46.625,47.6875,77300800 -"20000315093000",47.28125,48.3125,46.84375,47.6875,53208000 -"20000314093000",49.3125,49.625,47.5625,47.5625,73489200 -"20000313093000",48.8125,50.125,48.75,49,61831800 -"20000310093000",49.78125,51.25,49.75,50.5,85589000 -"20000309093000",47.65625,50,47.5,50,88198800 -"20000308093000",46.90625,48.09375,45.5,47.78125,94290000 -"20000307093000",48.0625,48.75,45.96875,46.4375,135061000 -"20000306093000",48,48.6875,45.04685,45.5,93609600 -"20000303093000",47.375,49.4375,46.9375,48.0625,101437400 -"20000302093000",45.90625,47.6875,45.5625,46.6875,106932600 -"20000301093000",44.8125,47.1875,44.46875,45.21875,106889800 -"20000229093000",45.875,45.875,44.4375,44.6875,58438200 -"20000228093000",45.125,46.0625,44.0625,45.78125,76131800 -"20000225093000",47.34375,47.34375,45.25,45.65625,65301400 -"20000224093000",47.125,47.9375,46,47.34375,69734000 -"20000223093000",46.75,47.875,46.03125,47.125,75847200 -"20000222093000",47.5625,48.5625,46.40625,46.90625,66296200 -"20000218093000",50,50.03125,47.4375,47.6875,79063000 -"20000217093000",49.25,49.84375,48.5625,49.8125,80344200 -"20000216093000",49.625,50.09375,48.5625,48.8125,65202600 -"20000215093000",49.875,50,48.1875,49.28125,71027600 -"20000214093000",50.60935,50.875,49.53125,49.8125,81028600 -"20000211093000",52.4375,52.4375,49.5625,49.96875,115559000 -"20000210093000",51.9375,53.28125,51.25,53,54528600 -"20000209093000",54.71875,54.71875,51.9375,52,55092800 -"20000208093000",53.21875,55,53.21875,54.96875,56231600 -"20000207093000",53.40625,53.4375,52.125,53.3125,40007800 -"20000204093000",52.1875,54,52.0625,53.28125,55365400 -"20000203093000",51.03125,52.09375,50.0625,51.8125,49186000 -"20000202093000",51.21875,51.96875,50.25,50.40625,49915600 -"20000201093000",49.25,51.625,48.84375,51.46875,70196600 -"20000131093000",48.8125,49.09375,47.4375,48.9375,73194200 -"20000128093000",49.0625,50.125,48.625,49.125,58227600 -"20000127093000",49.9375,50.59375,48.625,49.375,63654800 -"20000126093000",51.21875,51.75,49.5625,49.6875,49365000 -"20000125093000",50.5,51.9375,49.78125,51.40625,59827800 -"20000124093000",51.8906,52.84375,50.40625,50.625,63601400 -"20000121093000",53.5,53.625,51.625,51.875,68416200 -"20000120093000",53.53125,54.84375,52.9375,53,56349800 -"20000119093000",55.25,55.75,53,53.5,97566200 -"20000118093000",55.90625,58.25,55.875,57.65625,81484400 -"20000114093000",53.59375,56.96875,52.875,56.125,73417400 -"20000113093000",52.1875,54.3125,50.75,53.8125,83144000 -"20000112093000",54.25,54.4375,52.21875,52.90625,66538200 -"20000111093000",55.75,57.125,54.34375,54.6875,46747800 -"20000110093000",56.71875,56.84375,55.6875,56.125,44963600 -"20000107093000",54.3125,56.125,53.65625,55.71875,62013600 -"20000106093000",56.09375,56.9375,54.1875,55,54976600 -"20000105093000",55.5625,58.1875,54.6875,56.90625,64059600 -"20000104093000",56.78125,58.5625,56.125,56.3125,54094400 -"20000103093000",58.6875,59.3125,56,58.28125,53236000 -"19991231093000",58.75,58.875,58.125,58.375,12517600 -"19991230093000",58.9375,59.96875,58.5625,58.8125,22360000 -"19991229093000",58.46875,59.1875,58.40625,58.84375,17449000 -"19991228093000",59.375,59.40625,58.53125,58.75,24591000 -"19991227093000",59.21875,59.625,58.0625,59.54685,32202200 -"19991223093000",58.625,59.625,58.375,58.71875,31028400 -"19991222093000",58.1406,59,57.5625,58.78125,38565200 -"19991221093000",56.1875,58.3125,55.3125,57.9375,57446000 -"19991220093000",57.40625,57.5,55.59375,56.375,39433800 -"19991217093000",58.3125,58.5625,56.8125,57.625,105898800 -"19991216093000",54.625,57.5,54.46875,56.8125,128659600 -"19991215093000",49.28125,54.375,49.25,54.125,155571600 -"19991214093000",48.09375,50.5625,47.65625,49.34375,144121200 -"19991213093000",46.79685,48.46875,46.375,48.3125,52691600 -"19991210093000",46.6875,47.0625,46.125,46.9375,36836000 -"19991209093000",46,46.65625,45.71875,46.375,46258200 -"19991208093000",46.5625,47.15625,45.84375,45.875,40955800 -"19991207093000",47.375,47.4375,46.4375,46.5,56859200 -"19991206093000",47.625,48.59375,47.375,47.71875,49098200 -"19991203093000",47.90625,48.5625,47.85935,48.0625,64100600 -"19991202093000",46.53125,47.625,46.4375,47.34375,55473800 -"19991201093000",45.53125,46.96875,45.4375,46.59375,48864200 -"19991130093000",44.875,46.4375,44.78125,45.5156,64145600 -"19991129093000",45.0625,46.03125,44.75,45.09375,51512200 -"19991126093000",45.8125,46.6875,45.5,45.5625,28514200 -"19991124093000",44.78125,46.125,44.75,45.84375,53771000 -"19991123093000",44.625,45.6875,44.1875,44.84375,70787400 -"19991122093000",44.8125,45.1875,44.21875,44.90625,91029400 -"19991119093000",42.21875,43.28125,42.1875,43,58231200 -"19991118093000",42.46875,42.90625,42.25,42.40625,64493200 -"19991117093000",43.21875,43.53125,42.5,42.5,66819000 -"19991116093000",43.46875,43.875,42.9375,43.65625,59165400 -"19991115093000",44.125,44.25,43.46875,43.5,47073400 -"19991112093000",44.875,45,43.53125,44.59375,49414200 -"19991111093000",44.125,45.21875,44.125,44.8125,69269400 -"19991110093000",44.0625,44.5625,43.21875,43.5625,69385400 -"19991109093000",44.875,44.9375,43.21875,44.4375,109769800 -"19991108093000",42.40625,45.375,42.1875,44.96875,243832200 -"19991105093000",45.90625,46.4375,45.25,45.78125,70165400 -"19991104093000",46.15625,46.375,45.15625,45.78125,54239400 -"19991103093000",46.46875,46.75,45.75,46,44517000 -"19991102093000",46.375,47.25,45.96875,46.28125,46349000 -"19991101093000",46.625,47.09375,46.0625,46.1875,53261200 -"19991029093000",45.71875,47,45.625,46.28125,79452600 -"19991028093000",45,45.4375,44.65625,44.96875,70568400 -"19991027093000",45.75,45.8125,44.84375,45.4375,54416600 -"19991026093000",47.1875,47.625,46.125,46.1875,52467600 -"19991025093000",46,46.78125,45.5625,46.21875,30492200 -"19991022093000",46.78125,46.9375,45.875,46.34375,43650600 -"19991021093000",45.28125,46.5625,45.25,46.53125,60801200 -"19991020093000",45.78125,46.1875,45.125,46.125,88090600 -"19991019093000",44.125,44.625,42.625,43.15625,69945600 -"19991018093000",43.59375,44,42.53125,43.8906,75312800 -"19991015093000",44.75,44.90625,43.65625,44.03125,73788000 -"19991014093000",45.4375,46.10935,44.84375,45.34375,42737800 -"19991013093000",46,46.5625,45.15625,45.53125,38088400 -"19991012093000",47,47.0625,46.1875,46.28125,27663400 -"19991011093000",47.3125,47.5,47.0625,47.15625,19943800 -"19991008093000",46.75,47.59375,46.0625,47.46875,35697000 -"19991007093000",46.84375,47.53125,46.34375,46.875,46036400 -"19991006093000",46.15625,47,46.03125,46.84375,35501200 -"19991005093000",46.375,46.9375,44.75,45.96875,43397000 -"19991004093000",45.25,46.3125,45.125,46.28125,29998000 -"19991001093000",45.09375,45.3125,44.15625,44.98435,44239000 -"19990930093000",45,45.84375,44.40625,45.28125,47455400 -"19990929093000",45.78125,46.0625,44.5625,44.75,37484400 -"19990928093000",45.625,46.34375,44.53125,46.0625,46000600 -"19990927093000",46,46.46875,45.4375,45.71875,34132200 -"19990924093000",45.09375,45.6875,44.4375,45.46875,70277000 -"19990923093000",48.4375,48.4375,45.0156,45.59375,71073600 -"19990922093000",47.375,48.3125,46.84375,48.03125,48531600 -"19990921093000",48.28125,48.28125,47.0625,47.3125,47082800 -"19990920093000",48,48.9375,47.5,48.78125,48601800 -"19990917093000",47.1875,48.25,46.90625,48.21875,79773400 -"19990916093000",46.4375,47.03125,45.3125,46.875,45796000 -"19990915093000",47.75,47.875,46.1875,46.3125,48413800 -"19990914093000",46.84375,47.78125,46.8125,47.5,40207800 -"19990913093000",47.25,47.40625,46.6875,46.9375,27870800 -"19990910093000",47.53125,47.65625,47,47.5,34455000 -"19990909093000",46.21875,47.0625,45.8906,47.03125,38475200 -"19990908093000",46.84375,47.34375,46.03125,46.125,42568200 -"19990907093000",47.4375,48.34375,46.875,47.125,47028000 -"19990903093000",46.875,48.21875,46.75,47.875,52098000 -"19990902093000",45.75,46.28125,45.34375,45.90625,33340800 -"19990901093000",46.15625,46.71875,45.8125,46.1875,36607200 -"19990831093000",45.90625,46.5625,45.0625,46.28125,46882800 -"19990830093000",46.4375,46.71875,45.78125,46.125,33300800 -"19990827093000",47.53125,47.5625,46.1875,46.625,41948400 -"19990826093000",47.6875,48.1875,46.84375,47.3125,61246000 -"19990825093000",46.8125,48,46.59375,47.65625,81877600 -"19990824093000",43.53125,46.75,43.53125,46.09375,120450000 -"19990823093000",42.15625,43.3125,41.9375,43.21875,60447000 -"19990820093000",42,42.3906,41.53125,41.6875,46072800 -"19990819093000",42.28125,42.5625,41.5625,41.90625,71478200 -"19990818093000",42.21875,43.09375,42.03125,42.5,58361200 -"19990817093000",42.71875,42.75,41.46875,42.28125,51749000 -"19990816093000",42.53125,42.9375,41.15625,42.15625,57321800 -"19990813093000",41.46875,42.8125,41.375,42.34375,65099800 -"19990812093000",41.96875,42.09375,40.8125,40.875,61062000 -"19990811093000",42,42.34375,41.15625,42.09375,66105200 -"19990810093000",41.78125,42.03125,40.8125,41.46875,62743000 -"19990809093000",42.8125,42.90625,41.84375,41.90625,39333600 -"19990806093000",43.03125,43.21875,42.46875,42.5625,67205800 -"19990805093000",42.6875,43.1875,42.375,42.875,76634000 -"19990804093000",42.5625,43.59375,42.375,42.46875,75573400 -"19990803093000",42.9375,43.03125,42.1875,42.375,55051200 -"19990802093000",42.84375,43.46875,42.1875,42.40625,48050600 -"19990730093000",44.34375,44.3125,42.75,42.90625,51127400 -"19990729093000",44.34375,44.40625,43.15625,43.46875,57968200 -"19990728093000",44.59375,45.25,44.1875,45,62215200 -"19990727093000",44.40625,44.875,44,44.40625,65513000 -"19990726093000",44.4375,44.90625,43.8125,43.875,51107800 -"19990723093000",45.78125,45.875,44.84375,45.125,68810000 -"19990722093000",47.1875,47.25,45,45.53125,60892400 -"19990721093000",46.8125,47.65625,46.5,47.34375,54045600 -"19990720093000",48.21875,48.375,46.15625,46.65625,92269200 -"19990719093000",50,50.375,48.90625,49.1875,81169200 -"19990716093000",47.75,49.9375,47.5,49.71875,115419800 -"19990715093000",47.5,47.625,46.875,47.1875,40915000 -"19990714093000",46.875,47.5,46.25,47.46875,37985200 -"19990713093000",46.5625,47.03125,46.40625,46.8125,30844400 -"19990712093000",46.60935,47.375,46.1875,47.09375,43847800 -"19990709093000",46.1875,46.65625,46.125,46.625,33884200 -"19990708093000",46.1406,46.5,45.34375,46.28125,37790400 -"19990707093000",44.79685,46.15625,44.9375,46.15625,33834600 -"19990706093000",46.125,46.46875,44.625,44.78125,45413000 -"19990702093000",45.4375,46.0625,45.15625,46,32088400 -"19990701093000",44.9375,45.75,44.1875,45.59375,47752400 -"19990630093000",43.875,45.125,43.375,45.09375,57543400 -"19990629093000",43.34375,44.03125,43,44,38972400 -"19990628093000",42.75,43.40625,42.46875,43.375,31700800 -"19990625093000",42.6875,43.21875,42.1875,42.46875,24938200 -"19990624093000",42.875,43.125,42,42.3125,33557800 -"19990623093000",42.96875,43.6875,42.53125,43,33941200 -"19990622093000",44.21875,44.21875,43.125,43.25,38746200 -"19990621093000",42.4375,44.5,42.4375,44.46875,56083200 -"19990618093000",41.15625,42.5,41.0625,42.5,69341000 -"19990617093000",40.34375,41.5,40.25,41.4375,44460800 -"19990616093000",39.53125,40.8125,39.46875,40.5,48317800 -"19990615093000",39.03125,39.4375,38.34375,38.84375,36976400 -"19990614093000",39.375,39.84375,38.71875,38.78125,28364400 -"19990611093000",40,40.25,38.78125,39.0625,34543000 -"19990610093000",40.9375,41.15625,39.53125,39.9375,35269400 -"19990609093000",40.0625,41.3125,40,41.15625,53308800 -"19990608093000",39.9375,41.0625,39.5,39.6875,41502800 -"19990607093000",39.96875,40.53125,39.59375,40.125,32389800 -"19990604093000",38.46875,39.84375,38.375,39.78125,35666200 -"19990603093000",39.1875,39.46875,38.0625,38.21875,32940400 -"19990602093000",39.03125,39.3125,38.125,39.21875,42812600 -"19990601093000",40.3125,40.375,39.21875,39.25,36045800 -"19990528093000",39.375,40.4375,39.0625,40.34375,41548200 -"19990527093000",39.125,39.71875,38.75,39.1875,56700000 -"19990526093000",38.59375,39.25,37.75,39.25,52022800 -"19990525093000",38.375,39.625,38.0625,38.10935,50779200 -"19990524093000",38.9375,38.9375,38.03125,38.625,38987200 -"19990521093000",39.25,39.5,38.5,38.78125,56569800 -"19990520093000",39.78125,40,39.1875,39.21875,42371000 -"19990519093000",39.9375,39.9375,38.625,39.65625,46516000 -"19990518093000",39.90625,40.125,38.96875,39.34375,63857400 -"19990517093000",38.6875,39.78125,38.5,39.5625,66850000 -"19990514093000",39.4375,39.96875,38.3125,38.4375,84401200 -"19990513093000",40.5625,40.875,39.5625,39.5625,51735200 -"19990512093000",40.375,40.5,39.625,40.1875,60133400 -"19990511093000",40.375,40.5156,39.53125,39.9375,42784400 -"19990510093000",39.9375,40.25,39.125,39.84375,46218000 -"19990507093000",39.8125,40.1875,39,39.53125,48010200 -"19990506093000",40.34375,40.5625,38.75,39.0625,74011800 -"19990505093000",39.5625,39.9375,38.21875,39.5,67026400 -"19990504093000",40.25,40.90625,38.875,39.03125,66500200 -"19990503093000",40.71875,40.75,39.28125,39.875,67183000 -"19990430093000",41.375,41.875,39.9375,40.65625,58555200 -"19990429093000",41.1875,41.84375,40.2031,41.03125,60878600 -"19990428093000",42.65625,43.25,40.85935,41.0625,55961400 -"19990427093000",44.375,44.375,41.96875,42,58664400 -"19990426093000",43.59375,44.46875,43.375,44,48347400 -"19990423093000",42.5,43.5,41.5,43,56597800 -"19990422093000",42.5,42.625,41.6875,42.40625,55095200 -"19990421093000",41.0625,41.25,40,41,92759800 -"19990420093000",41.125,42,40,41.5625,108460000 -"19990419093000",43.4375,44.0625,40.1875,40.5,75380400 -"19990416093000",44.3125,44.5625,42.9375,43.3125,44772200 -"19990415093000",43.65625,44.9375,41.9375,44.4375,72594600 -"19990414093000",45.40625,45.5625,42.9375,42.9375,52944000 -"19990413093000",46.5625,46.5625,44.59375,45.0625,46744400 -"19990412093000",45.78125,46.8125,45.6875,46.5,37855200 -"19990409093000",47.125,47.5,46.5,47.125,31816400 -"19990408093000",46.625,47.3125,45.5,47.28125,38629600 -"19990407093000",47.4375,47.5,45.625,46.65625,46909600 -"19990406093000",47.59375,47.8125,46.625,47.03125,39673800 -"19990405093000",47.15625,47.5156,46.75,47.46875,39848600 -"19990401093000",45.625,46.4375,45.125,46.34375,41106000 -"19990331093000",47.25,47.3125,44.5625,44.8125,58764600 -"19990330093000",46.6875,46.75,46.125,46.5,67502200 -"19990329093000",45.0625,46.3125,43.9375,46.09375,79816800 -"19990326093000",44.734375,45.09375,43.9375,44.53125,94687600 -"19990325093000",43.265625,45.015625,43.125,44.953125,109448400 -"19990324093000",41.75,42.953125,40.78125,42.8125,82637600 -"19990323093000",43.171875,43.53125,41.5625,41.640625,69579600 -"19990322093000",43.234375,43.734375,43,43.203125,55748800 -"19990319093000",43.46875,43.53125,42.46875,42.796875,92175200 -"19990318093000",41.609375,43.140625,41.546875,43.109375,56231600 -"19990317093000",42.265625,42.359375,41.6875,41.78125,44919600 -"19990316093000",41.375,42.5,41.0625,42.265625,68555200 -"19990315093000",40.140625,41.5,39.46875,41.46875,60609600 -"19990312093000",40.65625,40.6875,39.203125,40.046875,73396800 -"19990311093000",40.25,41.140625,39.828125,40.359375,62948400 -"19990310093000",40.578125,40.625,39.796875,40.34375,53112800 -"19990309093000",39.96875,41.1875,39.9375,40.453125,90124800 -"19990308093000",38.875,39.804675,38.75,39.75,46754000 -"19990305093000",38.6875,38.84375,38.28125,38.734375,47296800 -"19990304093000",37.78125,38.375,37.03125,38.0625,61696400 -"19990303093000",37.25,37.671875,36.765625,37.40625,76798400 -"19990302093000",37.96875,38.53125,36.90625,37.140625,58587600 -"19990301093000",37.390625,38.140625,37.375,37.9375,58332000 -"19990226093000",38.09375,38.125,37.375,37.53125,59281200 -"19990225093000",38.09375,38.4375,37.40625,38.375,70276800 -"19990224093000",39.109375,39.84375,38.1875,38.21875,67695600 -"19990223093000",38.234375,38.90625,37.625,38.859375,95098800 -"19990222093000",37.0625,37.25,36.1875,37.25,92514800 -"19990219093000",36.859375,37.3125,36.4375,36.9375,73120000 -"19990218093000",37.734375,37.84375,35.992175,36.4375,117035200 -"19990217093000",38.234375,38.53125,37.125,37.5,101442800 -"19990216093000",39.9375,39.96875,38.640625,39.0625,73667600 -"19990212093000",40.421875,40.921875,39.28125,39.4375,62930400 -"19990211093000",40.6875,40.96875,40.09375,40.6875,60366000 -"19990210093000",39.96875,41.09375,39.65625,40.15625,73701600 -"19990209093000",41.234375,41.6875,39.9375,40.015625,77293600 -"19990208093000",40.640625,41.390625,40.40625,41.3125,109866800 -"19990205093000",40.0625,40.40625,38.71875,40,127945200 -"19990204093000",42.03125,42.09375,39.71875,39.765625,89151600 -"19990203093000",41.59375,42.46875,41.5,41.703125,73749600 -"19990202093000",43.125,43.140625,41.5625,41.90625,91965600 -"19990201093000",43.859375,43.984375,42.703125,43.234375,81727200 -"19990129093000",43.6875,43.78125,42.71875,43.75,79571600 -"19990128093000",42.9375,43.515625,42.453125,43.5,78838400 -"19990127093000",43.125,43.609375,42.125,42.1875,98048400 -"19990126093000",41.375,42.9375,41.125,42.890625,120203200 -"19990125093000",40.46875,40.828125,39.78125,40.46875,103076400 -"19990122093000",38.90625,40.054675,38.8125,39.0625,82160000 -"19990121093000",40.4375,40.828125,39.4375,39.578125,80077200 -"19990120093000",41.78125,41.9375,40.617175,40.625,125526800 -"19990119093000",37.84375,39.59375,37.71875,38.90625,102773600 -"19990115093000",35.734375,37.5,35.34375,37.4375,59344000 -"19990114093000",36.3125,36.390625,35.375,35.4375,59214000 -"19990113093000",34,36.9375,34,35.953125,75346000 -"19990112093000",37.03125,37.03125,35.25,35.546875,57907200 -"19990111093000",37.71875,37.734375,36.0625,36.875,46460000 -"19990108093000",38.046875,38.125,36.75,37.46875,50236000 -"19990107093000",37.4375,37.65625,37.0625,37.625,51150400 -"19990106093000",37.375,37.875,36.6875,37.8125,69077200 -"19990105093000",35.46875,37,35.359375,36.625,64278800 -"19990104093000",34.898425,36.3125,34.84375,35.25,69300400 -"19981231093000",34.796875,35,34.5,34.671875,23834400 -"19981230093000",35.21875,35.835925,34.71875,34.75,34942800 -"19981229093000",35.640625,35.640625,34.90625,35.0625,29652000 -"19981228093000",35.75,35.90625,35.375,35.59375,23636400 -"19981224093000",35.40625,35.5,35.375,35.4375,1250800 -"19981223093000",35.09375,35.953125,34.84375,35.890625,34940000 -"19981222093000",35.125,35.125,34.34375,34.609375,41350000 -"19981221093000",34.65625,35.546875,34.4375,35.109375,48112000 -"19981218093000",33.75,34.5625,33.53125,34.453125,59648000 -"19981217093000",33.546875,33.71875,33.0625,33.59375,46963600 -"19981216093000",33.125,33.78125,32.28125,33.4375,60024000 -"19981215093000",32.328125,33,32.3125,32.96875,51719600 -"19981214093000",33.1875,33.4375,31.921875,31.984375,64076400 -"19981211093000",32.75,33.671875,32.6875,33.5,51760800 -"19981210093000",33.28125,33.65625,32.84375,32.890625,57135600 -"19981209093000",33.03125,33.453125,32.5,33.40625,44781600 -"19981208093000",33.21875,33.5625,32.4375,32.796875,77583600 -"19981207093000",31.921875,33.4375,31.6875,33.390625,89809200 -"19981204093000",31.234375,31.84375,31,31.84375,44352000 -"19981203093000",31.71875,32.234375,30.5,30.53125,51426800 -"19981202093000",32.296875,32.4375,31.375,31.6875,65596000 -"19981201093000",30.0625,32.4375,30.03125,32.390625,86330400 -"19981130093000",32.34375,32.5625,30.484375,30.5,70900000 -"19981127093000",31.28125,32.03125,31.078125,32.015625,26335600 -"19981125093000",30.671875,31.09375,30.1875,31.0625,41356800 -"19981124093000",29.671875,31.265625,29.65625,30.421875,101114800 -"19981123093000",28.125,30.046875,28.125,29.796875,110885200 -"19981120093000",28.1875,28.4375,27.8125,28.40625,48405600 -"19981119093000",27.265625,28.125,27.265625,27.9375,45220800 -"19981118093000",27.390625,27.765625,27.28125,27.4375,41691600 -"19981117093000",27.25,28.09375,27.234375,27.96875,58744000 -"19981116093000",27.828125,27.9375,26.875,27.203125,42620800 -"19981113093000",27.109375,27.625,27.09375,27.5,28368800 -"19981112093000",27.5625,27.78125,27.125,27.1875,38526800 -"19981111093000",28.359375,28.6875,27.71875,27.765625,63899200 -"19981110093000",27.53125,28.359375,27.515625,28.015625,72087600 -"19981109093000",27.296875,27.84375,27.203125,27.671875,68956800 -"19981106093000",26.515625,27.4375,26.484375,27.328125,74461200 -"19981105093000",26.328125,26.90625,26.3125,26.59375,76727200 -"19981104093000",26.453125,26.828125,26.21875,26.375,67459600 -"19981103093000",26.375,26.640625,26.1875,26.296875,36546800 -"19981102093000",26.59375,26.71875,26.25,26.453125,48388400 -"19981030093000",26.8125,27.046875,26.28125,26.46875,59322800 -"19981029093000",26.359375,26.875,26.359375,26.640625,52403200 -"19981028093000",26.21875,26.65625,26.21875,26.421875,56808400 -"19981027093000",26.9375,26.96875,26.25,26.359375,65436800 -"19981026093000",26.703125,27,26.421875,26.765625,59678400 -"19981023093000",27.25,27.5,26.546875,26.59375,59891200 -"19981022093000",26.5,27.53125,26.3125,27.5,81912800 -"19981021093000",26.21875,26.71875,25.765625,26.578125,125381600 -"19981020093000",25.8125,25.84375,24.90625,25.0625,94369200 -"19981019093000",26.03125,26.046875,25.28125,25.734375,60177200 -"19981016093000",26.5,26.625,26,26.265625,68636000 -"19981015093000",25.03125,26.40625,24.90625,26.359375,66253600 -"19981014093000",23.96875,25.34375,23.96875,25.046875,62403200 -"19981013093000",24.875,24.9375,23.9375,24.109375,47987600 -"19981012093000",24.8125,25.25,24.625,24.9375,51502800 -"19981009093000",23.296875,24.25,23.0625,24.21875,72661600 -"19981008093000",22.640625,22.96875,21.9375,22.796875,144657600 -"19981007093000",24.34375,24.9375,23.34375,23.53125,90761600 -"19981006093000",25.625,25.90625,24.34375,24.40625,76550000 -"19981005093000",25.625,25.71875,24.125,25.1875,114938000 -"19981002093000",25.84375,26.296875,25.25,26.03125,65885600 -"19981001093000",27.015625,27.375,26,26.015625,65445200 -"19980930093000",28.078125,28.390625,27.5078,27.515625,38875600 -"19980929093000",27.953125,28.5,27.84375,28.21875,48743200 -"19980928093000",28.25,28.59375,27.4375,27.828125,41406400 -"19980925093000",27.28125,28.28125,27.15625,28.265625,47878400 -"19980924093000",28.28125,28.65625,27.25,27.53125,63521600 -"19980923093000",27.40625,28.46875,27.125,28.40625,65263600 -"19980922093000",27.109375,27.46875,26.6875,27.296875,43082000 -"19980921093000",25.625,27.015625,25.59375,26.96875,45872000 -"19980918093000",26.5625,26.5625,26.078125,26.34375,47361600 -"19980917093000",26.328125,26.625,26.203125,26.234375,45178400 -"19980916093000",26.96875,27.125,26.53125,27.046875,42886800 -"19980915093000",26.46875,27.109375,26.28125,27.078125,49413600 -"19980914093000",26.234375,26.765625,26.21875,26.5,45086800 -"19980911093000",25.28125,26.15625,25.03125,26.0625,58989200 -"19980910093000",25,25.28125,24.671875,25.1875,60758000 -"19980909093000",25.5625,26.109375,25.40625,25.5625,65494400 -"19980908093000",24.734375,25.515625,24.765625,25.492175,60625600 -"19980904093000",24.921875,25.0625,24.03125,24.15625,50890400 -"19980903093000",24.6875,25.1875,24.5625,24.8125,67468000 -"19980902093000",25.453125,26.0625,25.0625,25.140625,63438400 -"19980901093000",23.8125,25.4375,23.625,25.3125,140112400 -"19980831093000",26.21875,26.625,23.9375,23.984375,132688400 -"19980828093000",27.0625,27.40625,26.1875,26.3125,72730000 -"19980827093000",27.640625,28.1875,27.125,27.3125,74874000 -"19980826093000",27.8125,28.4375,27.71875,28.140625,44804400 -"19980825093000",27.84375,28.421875,27.78125,28.203125,58027200 -"19980824093000",27.578125,28,27.5,27.59375,26319200 -"19980821093000",27.78125,27.96875,27.1875,27.65625,59523600 -"19980820093000",27.53125,28.1875,27.421875,28.140625,49964000 -"19980819093000",28.0625,28.1875,27.5625,27.640625,55709600 -"19980818093000",26.96875,27.953125,26.84375,27.8125,70591200 -"19980817093000",25.875,26.84375,25.75,26.828125,54073200 -"19980814093000",26.171875,26.265625,25.875,26.0625,29566400 -"19980813093000",26.03125,26.5,25.9375,25.984375,51193200 -"19980812093000",26.078125,26.296875,25.75,26.265625,53760000 -"19980811093000",25.71875,26.09375,25.5,25.859375,60976400 -"19980810093000",26.453125,26.578125,26.109375,26.109375,46763200 -"19980807093000",26.859375,26.875,26.265625,26.46875,54972400 -"19980806093000",25.9375,26.734375,25.90625,26.71875,68308000 -"19980805093000",26.03125,26.5625,25.375,26.078125,120191200 -"19980804093000",27.15625,27.40625,26.046875,26.125,91412000 -"19980803093000",27.28125,27.71875,26.84375,27.109375,73566400 -"19980731093000",28.234375,28.375,27.484375,27.484375,53706000 -"19980730093000",27.984375,28.40625,27.6875,28.359375,72746400 -"19980729093000",28.3125,28.5625,27.515625,27.671875,59904800 -"19980728093000",29,29.21875,28,28.0625,78378800 -"19980727093000",28.28125,29.1875,27.671875,29.1875,58998000 -"19980724093000",28.4375,28.90625,28.109375,28.453125,60366800 -"19980723093000",29.078125,29.375,28.25,28.25,51029600 -"19980722093000",28,29.3125,27.96875,29.1875,71630400 -"19980721093000",29.21875,29.75,28.125,28.203125,74605200 -"19980720093000",29.546875,29.875,29.203125,29.25,45794800 -"19980717093000",29.4375,29.90625,28.984375,29.484375,83137600 -"19980716093000",29.515625,29.71875,29.15625,29.34375,65130800 -"19980715093000",29,29.5,28.90625,29.34375,48690000 -"19980714093000",29.5625,29.6875,28.875,29.125,56972400 -"19980713093000",28.53125,29.5625,28.40625,29.390625,69223200 -"19980710093000",27.78125,28.3125,27.46875,28.296875,45396800 -"19980709093000",27.5,28,27.4375,27.75,43690000 -"19980708093000",27.03125,27.53125,26.6875,27.46875,41553600 -"19980707093000",26.96875,27.140625,26.625,26.984375,32423600 -"19980706093000",26.71875,27.015625,26.34375,26.953125,35260400 -"19980702093000",27.203125,27.28125,26.78125,26.8125,27321200 -"19980701093000",27.28125,27.53125,26.796875,27.34375,53474000 -"19980630093000",26.3125,27.140625,26.15625,27.09375,77010000 -"19980629093000",26.375,26.921875,26.3125,26.859375,65906000 -"19980626093000",25.5625,26.15625,25.5,26.109375,55680400 -"19980625093000",26.46875,26.71875,25.34375,25.390625,88969600 -"19980624093000",25.421875,26.28125,24.984375,26.234375,105728800 -"19980623093000",23.953125,25.21875,23.8125,25.1875,124675200 -"19980622093000",23.6875,23.984375,23.421875,23.953125,48969600 -"19980619093000",23.375,23.6875,23.125,23.671875,91345600 -"19980618093000",22.703125,22.9375,22.59375,22.796875,39228400 -"19980617093000",22.484375,23.09375,22.4375,22.765625,76145200 -"19980616093000",21.578125,22.484375,21.375,22.46875,61138400 -"19980615093000",21.171875,21.828125,21.140625,21.484375,42846000 -"19980612093000",21.21875,21.53125,21,21.4375,41999600 -"19980611093000",21.609375,21.78125,21.28125,21.328125,41511200 -"19980610093000",21.65625,22.09375,21.46875,21.5,33305600 -"19980609093000",21.328125,21.890625,21.3125,21.765625,36171600 -"19980608093000",21.40625,21.578125,21.25,21.421875,18900400 -"19980605093000",21.46875,21.625,21.1875,21.5625,34654000 -"19980604093000",21.171875,21.53125,20.90625,21.515625,33815200 -"19980603093000",21.46875,21.609375,21,21.078125,35992800 -"19980602093000",21.015625,21.484375,20.96875,21.375,39188000 -"19980601093000",20.96875,21.148425,20.78125,20.9375,42441600 -"19980529093000",21.59375,21.625,21.1875,21.203125,34094400 -"19980528093000",21.4375,21.59375,21.265625,21.578125,30868400 -"19980527093000",20.71875,21.53125,20.71875,21.5,58689600 -"19980526093000",21.328125,21.546875,20.875,20.90625,44532000 -"19980522093000",21.65625,21.6875,21.359375,21.390625,32211600 -"19980521093000",21.453125,21.84375,21.375,21.59375,36680400 -"19980520093000",21.53125,21.71875,21.34375,21.4375,35532400 -"19980519093000",21.453125,21.734375,21.390625,21.625,51278800 -"19980518093000",21.125,21.90625,21.125,21.515625,80977600 -"19980515093000",22.53125,22.546875,22.1875,22.359375,48150800 -"19980514093000",21.46875,22.75,21.453125,22.234375,94771200 -"19980513093000",22.1875,22.1875,21.625,21.734375,80681200 -"19980512093000",20.8125,21.4375,20.8125,21.421875,64122400 -"19980511093000",21.53125,21.546875,21.015625,21.046875,51474400 -"19980508093000",20.46875,21.53125,20.46875,21.4375,96249200 -"19980507093000",21.546875,21.5625,20.796875,20.84375,78022800 -"19980506093000",21.875,21.875,21.5,21.59375,48110800 -"19980505093000",21.90625,22.390625,21.75,21.9375,50839600 -"19980504093000",22.296875,22.46875,21.984375,22.015625,37898800 -"19980501093000",22.546875,22.625,22.03125,22.40625,36135200 -"19980430093000",22.875,22.90625,22.421875,22.53125,54481600 -"19980429093000",22.515625,22.875,22.40625,22.625,50171600 -"19980428093000",23.03125,23.0625,22.25,22.46875,56769600 -"19980427093000",22.375,22.6328,22.125,22.578125,58748000 -"19980424093000",23.375,23.6875,22.96875,23,51436000 -"19980423093000",24.3125,24.3125,23.53125,23.625,64215600 -"19980422093000",24,24.78125,23.90625,24.6875,80153600 -"19980421093000",23.671875,23.75,23.28125,23.75,51932400 -"19980420093000",23.09375,23.75,23.046875,23.65625,45534400 -"19980417093000",22.875,23.0625,22.578125,23.046875,37402800 -"19980416093000",22.59375,23.015625,22.5625,22.921875,39695600 -"19980415093000",22.3125,22.84375,22.21875,22.84375,40498400 -"19980414093000",22.171875,22.390625,21.875,22.109375,28476800 -"19980413093000",22.203125,22.25,21.6875,22.15625,33156400 -"19980409093000",21.984375,22.40625,21.898425,22.25,33619200 -"19980408093000",21.6875,22.265625,21.65625,22.234375,36798800 -"19980407093000",22.328125,22.65625,21.6875,21.8125,63295200 -"19980406093000",23.15625,23.15625,22.265625,22.484375,74242800 -"19980403093000",23,23.265625,22.875,23.25,40987600 -"19980402093000",22.671875,22.984375,22.46875,22.828125,41412800 -"19980401093000",22.453125,22.65625,22.125,22.59375,36840000 -"19980331093000",22.15625,22.4375,22.125,22.375,38126400 -"19980330093000",22.015625,22.15625,21.78125,22,27463200 -"19980327093000",22.34375,22.34375,21.890625,21.953125,38940000 -"19980326093000",22.125,22.390625,21.875,22.0625,45442400 -"19980325093000",22.59375,22.734375,21.8125,22.203125,124248000 -"19980324093000",21.046875,21.265625,20.859375,21.234375,32281600 -"19980323093000",20.296875,21.15625,20.265625,20.96875,55090400 -"19980320093000",20.53125,20.75,20.125,20.46875,56310000 -"19980319093000",20.375,20.578125,20.3125,20.5,30297200 -"19980318093000",20.015625,20.453125,19.96875,20.4375,33887600 -"19980317093000",20.421875,20.421875,19.921875,20.09375,53842400 -"19980316093000",20.609375,20.6875,20.34375,20.5,27979600 -"19980313093000",20.609375,20.75,20.390625,20.59375,32542400 -"19980312093000",20.625,20.59375,20.203125,20.46875,47921200 -"19980311093000",20.5,20.5,19.9375,20.171875,39839600 -"19980310093000",20.296875,20.375,19.984375,20.390625,47406400 -"19980309093000",20.625,20.625,19.875,19.898425,52255600 -"19980306093000",20.078125,20.6875,20.0625,20.640625,51405200 -"19980305093000",19.8125,20.359375,19.875,20.015625,92256400 -"19980304093000",20.609375,20.953125,20.390625,20.578125,71513600 -"19980303093000",20.65625,21.140625,20.640625,21.125,50754400 -"19980302093000",21.46875,21.46875,20.765625,20.84375,50094000 -"19980227093000",21.390625,21.5,21.140625,21.1875,47528400 -"19980226093000",21.375,21.421875,21.109375,21.375,61388000 -"19980225093000",20.859375,21.25,20.765625,21.234375,94944800 -"19980224093000",20.84375,21.234375,20.46875,20.53125,118314400 -"19980223093000",20.21875,20.421875,19.84375,20.40625,120803600 -"19980220093000",19.4375,19.46875,19.109375,19.390625,86108000 -"19980219093000",19.4375,19.5078125,19.28125,19.359375,73773600 -"19980218093000",19.328125,19.5,19.21875,19.328125,76608800 -"19980217093000",19.8125,19.8125,19.234375,19.296875,85673600 -"19980213093000",19.828125,19.84375,19.671875,19.6875,42206400 -"19980212093000",19.7578125,19.8671875,19.5078125,19.84375,76698400 -"19980211093000",19.9921875,20.0078125,19.6328125,19.8671875,76460000 -"19980210093000",19.65625,19.9375,19.59375,19.90625,48099200 -"19980209093000",19.84375,19.859375,19.453125,19.6484375,54682400 -"19980206093000",19.421875,19.78125,19.390625,19.765625,50070400 -"19980205093000",19.765625,19.84375,19.34375,19.4296875,67014400 -"19980204093000",19.484375,19.75,19.3828125,19.6015625,61940800 -"19980203093000",19.390625,19.515625,19.2265625,19.484375,61374400 -"19980202093000",18.96875,19.390625,18.8125,19.34375,98392000 -"19980130093000",18.578125,18.75,18.453125,18.6484375,50071200 -"19980129093000",18.6171875,18.765625,18.4375,18.53125,73571200 -"19980128093000",18.28125,18.6875,18.1875,18.625,79388800 -"19980127093000",17.796875,18.234375,17.6953125,18.1484375,97540000 -"19980126093000",17.484375,17.734375,17.3046875,17.71875,74276000 -"19980123093000",17.34375,17.4296875,17.0859375,17.28125,63312000 -"19980122093000",16.9453125,17.484375,16.9140625,17.328125,159360800 -"19980121093000",17.15625,17.3046875,16.953125,17.125,85562400 -"19980120093000",16.765625,17.25,16.75,17.2265625,64956000 -"19980116093000",16.546875,16.921875,16.5390625,16.90625,72943200 -"19980115093000",16.296875,16.625,16.234375,16.5390625,50624000 -"19980114093000",16.515625,16.5625,16.15625,16.390625,54774400 -"19980113093000",16.1875,16.5234375,16.015625,16.515625,66945600 -"19980112093000",16.078125,16.25,15.546875,16.1953125,78400800 -"19980109093000",16.2578125,16.4375,15.734375,15.875,87534400 -"19980108093000",16.078125,16.515625,15.9375,16.3125,77657600 -"19980107093000",16.234375,16.328125,15.9375,16.1953125,61492800 -"19980106093000",16.21875,16.625,16.15625,16.390625,67836800 -"19980105093000",16.40625,16.703125,15.984375,16.296875,80377600 -"19980102093000",16.203125,16.4375,16.1875,16.390625,39748000 -"19971231093000",16.375,16.4375,16.125,16.15625,46146400 -"19971230093000",15.8046875,16.375,15.78125,16.28125,77881600 -"19971229093000",15.296875,15.84375,15.265625,15.7890625,67799200 -"19971226093000",14.859375,15.09375,14.84375,15.09375,32388800 -"19971224093000",15.46875,15.484375,14.75,14.8671875,88411200 -"19971223093000",15.8828125,16.03125,15.375,15.4140625,67195200 -"19971222093000",16.140625,16.25,15.734375,15.8828125,59063200 -"19971219093000",16.09375,16.2734375,15.78125,16.0703125,137783200 -"19971218093000",16.8125,16.84375,16.296875,16.359375,98774400 -"19971217093000",17.484375,17.546875,16.9453125,16.953125,51472000 -"19971216093000",16.984375,17.546875,16.875,17.3828125,65401600 -"19971215093000",17.0546875,17.125,16.515625,17.015625,84314400 -"19971212093000",17.21875,17.3125,17,17.09375,54375200 -"19971211093000",17.546875,17.625,17.359375,17.3828125,70189600 -"19971210093000",17.78125,17.90625,17.625,17.78125,66434400 -"19971209093000",18.125,18.171875,17.9375,18.0390625,51864000 -"19971208093000",17.9375,18.328125,17.890625,18.265625,49952800 -"19971205093000",17.765625,18.09375,17.765625,17.890625,48136000 -"19971204093000",18.09375,18.234375,17.78125,17.8203125,62627200 -"19971203093000",17.7109375,18.1328125,17.625,18.09375,57712000 -"19971202093000",17.9453125,18.109375,17.75,17.78125,50167200 -"19971201093000",17.7421875,18,17.703125,17.9765625,49006400 -"19971128093000",17.65625,17.78125,17.640625,17.6875,17392800 -"19971127093000",-1,-1,-1,-1,-1 -"19971126093000",17.375,17.734375,17.28125,17.6953125,63053600 -"19971125093000",16.984375,17.40625,16.96875,17.375,56464800 -"19971124093000",17.140625,17.265625,16.9375,16.9375,39084000 -"19971121093000",17.2265625,17.25,17.046875,17.234375,68220800 -"19971120093000",16.90625,17.140625,16.859375,17.109375,53680800 -"19971119093000",16.703125,16.890625,16.671875,16.8828125,31720800 -"19971118093000",16.8671875,16.9375,16.71875,16.75,36683200 -"19971117093000",16.8125,16.9765625,16.6796875,16.859375,60094400 -"19971114093000",16.453125,16.734375,16.421875,16.6640625,46663200 -"19971113093000",16.2578125,16.453125,16.1484375,16.4453125,60094400 -"19971112093000",16.265625,16.375,16.125,16.1484375,45784000 -"19971111093000",16.3046875,16.4296875,16.171875,16.328125,37013600 -"19971110093000",16.453125,16.5625,16.21875,16.2734375,36764800 -"19971107093000",16.2578125,16.5,16.234375,16.4453125,63631200 -"19971106093000",16.65625,16.6875,16.46875,16.5078125,40266400 -"19971105093000",16.8125,16.828125,16.5625,16.6953125,42512800 -"19971104093000",16.75,16.8671875,16.6484375,16.78125,49126400 -"19971103093000",16.453125,16.78125,16.4140625,16.765625,67714400 -"19971031093000",16.375,16.4375,16.203125,16.25,46808800 -"19971030093000",16.1875,16.453125,16.0625,16.078125,72097600 -"19971029093000",16.71875,16.8828125,16.265625,16.390625,85533600 -"19971028093000",15.5,16.78125,15.4375,16.671875,159689600 -"19971027093000",16.859375,17.03125,16.078125,16.109375,96792800 -"19971024093000",17.109375,17.15625,16.65625,16.921875,70030400 -"19971023093000",16.5,17.15625,16.5,16.953125,66413600 -"19971022093000",17.296875,17.3125,16.921875,16.9609375,55775200 -"19971021093000",17.015625,17.4023375,16.9140625,17.3125,115682400 -"19971020093000",16.625,16.90625,15.9375,16.5625,154052800 -"19971017093000",16.640625,16.828125,16.296875,16.53125,87720000 -"19971016093000",17.015625,17.078125,16.53125,16.738275,47327200 -"19971015093000",16.96875,17,16.921875,16.96875,44997600 -"19971014093000",17.140625,17.171875,16.921875,17.0859375,33361600 -"19971013093000",17.125,17.234375,17.0703125,17.09375,19051200 -"19971010093000",17.2890625,17.34375,17.03125,17.0625,24893600 -"19971009093000",17.3125,17.453125,17.265625,17.3671875,34482400 -"19971008093000",17.078125,17.3828125,17.03125,17.375,71196800 -"19971007093000",16.875,17.2109375,16.828125,17.0625,54548800 -"19971006093000",16.984375,17.03125,16.78125,16.890625,41776800 -"19971003093000",16.8671875,17.03125,16.671875,16.8671875,60287200 -"19971002093000",16.71875,16.828125,16.59375,16.6484375,28756000 -"19971001093000",16.5625,16.8125,16.421875,16.734375,61466400 -"19970930093000",16.8046875,16.96875,16.53125,16.5390625,43892800 -"19970929093000",16.6875,16.84375,16.609375,16.8125,27505600 -"19970926093000",16.703125,16.71875,16.453125,16.671875,36644000 -"19970925093000",16.609375,16.765625,16.5078125,16.59375,39272000 -"19970924093000",16.953125,17.0078125,16.515625,16.5546875,60043200 -"19970923093000",16.6953125,16.9375,16.640625,16.9375,39946400 -"19970922093000",16.875,16.984375,16.6484375,16.6640625,43251200 -"19970919093000",16.53125,16.90625,16.5,16.8984375,77428800 -"19970918093000",16.78125,16.890625,16.4296875,16.53125,61077600 -"19970917093000",17.078125,17.09375,16.578125,16.6484375,61609600 -"19970916093000",16.46875,17.125,16.375,17.046875,102540800 -"19970915093000",16.953125,17.15625,16.328125,16.3359375,129004000 -"19970912093000",17.109375,17.296875,16.953125,17.2421875,48576000 -"19970911093000",16.875,17.171875,16.609375,17.1015625,61779200 -"19970910093000",17.359375,17.390625,16.8828125,16.890625,53294400 -"19970909093000",17.40625,17.53125,17.296875,17.4375,39465600 -"19970908093000",17.21875,17.4765625,17.21875,17.4140625,42416000 -"19970905093000",17.3828125,17.4609375,17.03125,17.1640625,48398400 -"19970904093000",17,17.3125,17.015625,17.2734375,44481600 -"19970903093000",17.203125,17.359375,17.0234375,17.0703125,42872800 -"19970902093000",16.640625,17.1875,16.625,17.1484375,50106400 -"19970901093000",-1,-1,-1,-1,-1 -"19970829093000",16.5078125,16.734375,16.46875,16.5234375,37857600 -"19970828093000",16.6875,16.71875,16.5,16.5078125,43641600 -"19970827093000",16.90625,16.9140625,16.625,16.8203125,49372000 -"19970826093000",17,17.109375,16.84375,16.875,34124000 -"19970825093000",17.234375,17.375,16.953125,17.0625,38856800 -"19970822093000",16.90625,17.1875,16.765625,17.15625,72029600 -"19970821093000",17.703125,17.796875,17.1875,17.234375,64443200 -"19970820093000",17.375,17.5859375,17.125,17.5703125,50312800 -"19970819093000",16.84375,17.375,16.828125,17.3515625,91013600 -"19970818093000",16.625,16.734375,16.375,16.734375,69921600 -"19970815093000",16.9375,17,16.59375,16.609375,51078400 -"19970814093000",17,17.09375,16.765625,17.03125,45912800 -"19970813093000",17.265625,17.28125,16.84375,17.0078125,66731200 -"19970812093000",17.421875,17.46875,16.9765625,17,60887200 -"19970811093000",17.5,17.53125,17.046875,17.28125,72695200 -"19970808093000",17.8515625,17.890625,17.5,17.5,66811200 -"19970807093000",18.0390625,18.046875,17.75,18.0429625,43964800 -"19970806093000",17.9140625,18.078125,17.78125,17.9296875,43412000 -"19970805093000",17.78125,18.046875,17.75,17.9140625,59336000 -"19970804093000",17.53125,17.75,17.4296875,17.6953125,46312800 -"19970801093000",17.671875,17.7265625,17.3984375,17.578125,58912800 -"19970731093000",17.75,17.765625,17.609375,17.6875,42232800 -"19970730093000",17.59375,17.75,17.453125,17.640625,78323200 -"19970729093000",17.09375,17.5078125,17.015625,17.4921875,78816000 -"19970728093000",17.40625,17.421875,16.96875,17.125,56404000 -"19970725093000",17.3125,17.78125,17.15625,17.3125,90308800 -"19970724093000",17.296875,17.546875,16.953125,17.25,141855200 -"19970723093000",18.15625,18.359375,17.625,17.6796875,95857600 -"19970722093000",17.109375,18.1015625,17.09375,18.03125,101383200 -"19970721093000",17.609375,17.625,16.71875,16.9921875,127221600 -"19970718093000",18.1875,18.421875,17.5,17.5625,158937600 -"19970717093000",18.8125,18.84375,18.3125,18.6796875,131656800 -"19970716093000",17.765625,18.6875,17.5,18.5546875,110971200 -"19970715093000",17.2578125,17.40625,17.078125,17.3085875,75501600 -"19970714093000",16.3515625,17,16.3125,16.9921875,57424000 -"19970711093000",16.28125,16.3828125,16.0546875,16.21875,38096000 -"19970710093000",16.3125,16.40625,16.109375,16.234375,43780800 -"19970709093000",16.5625,16.578125,16.1875,16.34375,48239200 -"19970708093000",16.171875,16.4140625,16.1171875,16.40625,36007200 -"19970707093000",16.328125,16.46875,16.171875,16.1875,39320000 -"19970704093000",-1,-1,-1,-1,-1 -"19970703093000",16.2578125,16.2578125,16.0625,16.1953125,28764000 -"19970702093000",15.703125,16.0625,15.5078125,16.046875,53237600 -"19970701093000",15.8046875,15.859375,15.40625,15.6171875,59377600 -"19970630093000",15.984375,16.09375,15.7734375,15.796875,38286400 -"19970627093000",16.140625,16.25,15.90625,15.9375,38198400 -"19970626093000",16.265625,16.3515625,15.984375,16.03125,37212800 -"19970625093000",16.609375,16.65625,16.15625,16.3046875,49576800 -"19970624093000",16.1875,16.515625,16.046875,16.5078125,39319200 -"19970623093000",16.234375,16.4375,16,16.0078125,35724800 -"19970620093000",16.171875,16.421875,16.0625,16.234375,64236000 -"19970619093000",16.046875,16.34375,16,16.1640625,65515200 -"19970618093000",16.65625,16.6875,16.2578125,16.2734375,55648000 -"19970617093000",16.4375,16.8671875,16.359375,16.7734375,53191200 -"19970616093000",16.203125,16.421875,16.109375,16.421875,40612800 -"19970613093000",15.84375,16.2578125,15.8203125,16.203125,50116000 -"19970612093000",15.84375,16.015625,15.6875,15.84375,44620000 -"19970611093000",15.6015625,15.921875,15.4453125,15.875,49056800 -"19970610093000",15.640625,15.8828125,15.46875,15.6015625,53135200 -"19970609093000",15.609375,15.765625,15.3125,15.65625,48200000 -"19970606093000",15.171875,15.5390625,15.125,15.5,35964000 -"19970605093000",15.03125,15.1875,14.9375,15.046875,35892000 -"19970604093000",15.078125,15.28125,14.78125,14.8984375,54639200 -"19970603093000",15.421875,15.4375,15.078125,15.2578125,41987200 -"19970602093000",15.625,15.6875,15.390625,15.546875,38939200 -"19970530093000",14.6875,15.703125,14.6875,15.5,83340000 -"19970529093000",15.90625,16.1328125,15.625,15.734375,51103200 -"19970528093000",15.90625,15.90625,15.609375,15.734375,52241600 -"19970527093000",15.34375,15.921875,15.296875,15.828125,69036000 -"19970526093000",-1,-1,-1,-1,-1 -"19970523093000",15.171875,15.375,15.109375,15.359375,28904800 -"19970522093000",15.125,15.203125,14.96875,15.078125,33478400 -"19970521093000",15.078125,15.3671875,14.96875,15.046875,76620000 -"19970520093000",14.484375,14.90625,14.40625,14.890625,64876800 -"19970519093000",14.515625,14.640625,14.390625,14.390625,45632000 -"19970516093000",14.546875,14.625,14.359375,14.4296875,59913600 -"19970515093000",14.5,14.734375,14.484375,14.640625,41864800 -"19970514093000",14.796875,14.828125,14.453125,14.484375,60741600 -"19970513093000",14.796875,14.90625,14.609375,14.71875,49813600 -"19970512093000",14.6875,14.8125,14.625,14.765625,42974400 -"19970509093000",14.75,14.8125,14.46875,14.59375,58392000 -"19970508093000",14.40625,14.765625,14.390625,14.5625,53834400 -"19970507093000",14.546875,14.875,14.390625,14.4375,70532800 -"19970506093000",-1,-1,-1,-1,-1 -"19970505093000",14.953125,15.09375,14.4375,15,110850400 -"19970502093000",15.25,15.4375,14.8671875,15.09375,96188800 -"19970501093000",15.25,15.40625,14.90625,15.125,72317600 -"19970430093000",14.828125,15.328125,14.796875,15.1875,90204000 -"19970429093000",14.671875,14.890625,14.5625,14.875,73952000 -"19970428093000",14.21875,14.3828125,13.953125,14.359375,67224000 -"19970425093000",14.1875,14.421875,14.15625,14.203125,58565600 -"19970424093000",14.578125,14.734375,14.09375,14.265625,118175200 -"19970423093000",13.828125,14.46875,13.796875,14.390625,102813600 -"19970422093000",13.453125,13.8515625,13.4375,13.828125,82420800 -"19970421093000",13.375,13.984375,13.265625,13.453125,155708800 -"19970418093000",13,13.453125,12.953125,13.453125,231800800 -"19970417093000",12.3125,12.5,12.1875,12.265625,71829600 -"19970416093000",12.078125,12.3125,12.03125,12.28125,42710400 -"19970415093000",12.234375,12.375,11.984375,12.140625,84438400 -"19970414093000",11.84375,12.171875,11.671875,12.171875,59267200 -"19970411093000",11.9375,12.15625,11.8671875,11.875,60033600 -"19970410093000",12.21875,12.21875,11.9375,12.09375,67913600 -"19970409093000",12.390625,12.40625,12.21875,12.25,73760800 -"19970408093000",12.078125,12.28125,11.9375,12.28125,53331200 -"19970407093000",11.953125,12.203125,11.90625,12,76507200 -"19970404093000",11.71875,12.09375,11.71875,11.7734375,94963200 -"19970403093000",11.375,11.921875,11.328125,11.859375,92252800 -"19970402093000",11.609375,11.703125,11.375,11.5,63330400 -"19970401093000",11.265625,11.71875,11.21875,11.65625,86684000 -"19970331093000",11.640625,11.8125,11.40625,11.4609375,93826400 -"19970328093000",-1,-1,-1,-1,-1 -"19970327093000",11.5625,12.015625,11.5625,11.5625,93927200 -"19970326093000",11.34375,11.828125,11.328125,11.78125,81270400 -"19970325093000",11.328125,11.421875,11.109375,11.2890625,89712800 -"19970324093000",11.640625,11.6875,10.9375,11.296875,186269600 -"19970321093000",12.0625,12.140625,11.609375,11.75,85829600 -"19970320093000",12.078125,12.21875,11.921875,12,81410400 -"19970319093000",12.21875,12.28125,11.8671875,12.09375,111556800 -"19970318093000",12.578125,12.6015625,12.359375,12.453125,59007200 -"19970317093000",12.3125,12.59375,12.25,12.578125,83958400 -"19970314093000",12.46875,12.53125,12.359375,12.375,61327200 -"19970313093000",12.28125,12.515625,12.25,12.4375,45505600 -"19970312093000",12.21875,12.4375,12.21875,12.34375,43234400 -"19970311093000",12.453125,12.5703125,12.296875,12.296875,47577600 -"19970310093000",12.140625,12.515625,11.9921875,12.5,45997600 -"19970307093000",12.296875,12.4375,12.0625,12.09375,46032000 -"19970306093000",12.59375,12.609375,12.2148375,12.21875,57018400 -"19970305093000",12.4375,12.625,12.40625,12.609375,46393600 -"19970304093000",12.40625,12.515625,12.328125,12.390625,63920800 -"19970303093000",12.125,12.515625,12.078125,12.4375,53874400 -"19970228093000",12.015625,12.296875,11.9296875,12.1875,78412000 -"19970227093000",12.53125,12.53125,12,12.015625,56628800 -"19970226093000",12.4375,12.546875,12.296875,12.53125,48939200 -"19970225093000",12.5,12.625,12.359375,12.4375,63941600 -"19970224093000",11.78125,12.53125,11.75,12.515625,68599200 -"19970221093000",11.859375,11.921875,11.75,11.875,61131200 -"19970220093000",12.109375,12.15625,11.890625,11.90625,75395200 -"19970219093000",12.171875,12.265625,12.0625,12.1875,56383200 -"19970218093000",12.203125,12.234375,12.015625,12.171875,52546400 -"19970217093000",-1,-1,-1,-1,-1 -"19970214093000",12.421875,12.5625,12.203125,12.234375,57395200 -"19970213093000",12.5625,12.640625,12.421875,12.5,58277600 -"19970212093000",12.296875,12.5,12.1875,12.484375,72009600 -"19970211093000",12.28125,12.328125,11.890625,12.3125,88841600 -"19970210093000",12.59375,12.6875,12.203125,12.21875,66812800 -"19970207093000",12.296875,12.5625,12.1875,12.546875,62448000 -"19970206093000",12.28125,12.296875,12,12.140625,102122400 -"19970205093000",12.890625,12.9375,12.109375,12.296875,110099200 -"19970204093000",12.796875,12.90625,12.5625,12.890625,56464000 -"19970203093000",12.828125,12.921875,12.640625,12.796875,60804800 -"19970131093000",12.734375,12.90625,12.609375,12.75,86529600 -"19970130093000",12.28125,12.65625,12.25,12.640625,79946400 -"19970129093000",12.09375,12.171875,11.96875,12.15625,48933600 -"19970128093000",12.296875,12.34375,11.84375,11.953125,64657600 -"19970127093000",12.0625,12.171875,11.9375,12.015625,53263200 -"19970124093000",11.890625,12.21875,11.796875,11.9921875,89821600 -"19970123093000",12.265625,12.46875,11.8125,11.84375,105320000 -"19970122093000",11.890625,12.3125,11.828125,12.171875,129260800 -"19970121093000",11.328125,11.8828125,11.203125,11.875,114592000 -"19970120093000",10.875,11.609375,10.828125,11.34375,146220800 -"19970117093000",10.703125,10.96875,10.6875,10.890625,65368800 -"19970116093000",10.625,10.890625,10.625,10.75,58688000 -"19970115093000",10.703125,10.78125,10.546875,10.578125,53058400 -"19970114093000",10.53125,10.828125,10.53125,10.671875,63728000 -"19970113093000",10.640625,10.6875,10.4375,10.46875,50361600 -"19970110093000",10.25,10.546875,10.203125,10.53125,66578400 -"19970109093000",10.46875,10.46875,10.28125,10.296875,47764800 -"19970108093000",10.625,10.6523375,10.390625,10.421875,50593600 -"19970107093000",10.5625,10.640625,10.421875,10.625,36880800 -"19970106093000",10.578125,10.65625,10.390625,10.546875,55948800 -"19970103093000",10.28125,10.59375,10.25,10.578125,44124000 -"19970102093000",10.390625,10.390625,10.09375,10.203125,54419200 -"19970101093000",-1,-1,-1,-1,-1 -"19961231093000",10.5,10.53125,10.3125,10.328125,34367200 -"19961230093000",10.671875,10.703125,10.4375,10.4375,27279200 -"19961227093000",10.6875,10.71875,10.5,10.53125,19079200 -"19961226093000",10.65625,10.765625,10.640625,10.6875,27905600 -"19961225093000",-1,-1,-1,-1,-1 -"19961224093000",10.515625,10.640625,10.390625,10.609375,16246400 -"19961223093000",10.515625,10.59375,10.359375,10.46875,36892800 -"19961220093000",10.6875,10.703125,10.421875,10.453125,90414400 -"19961219093000",10.5,10.640625,10.375,10.609375,94609600 -"19961218093000",10.25,10.34375,10,10.328125,61796800 -"19961217093000",9.578125,10.015625,9.546875,9.984375,68952800 -"19961216093000",10.03125,10.09375,9.5625,9.59375,64883200 -"19961213093000",10.140625,10.25,9.9023375,10,74544000 -"19961212093000",10.625,10.65625,10.125,10.140625,78272800 -"19961211093000",10.125,10.453125,10.015625,10.421875,113576000 -"19961210093000",10.546875,10.5703125,10.21875,10.234375,125725600 -"19961209093000",9.796875,10.234375,9.75,10.21875,94718400 -"19961206093000",9.3125,9.65625,9.265625,9.5546875,110238400 -"19961205093000",9.5859375,9.7109375,9.4921875,9.5625,74950400 -"19961204093000",9.6953125,9.703125,9.5078125,9.578125,102542400 -"19961203093000",9.8984375,9.96875,9.6640625,9.6679625,77563200 -"19961202093000",9.84375,9.859375,9.703125,9.859375,64502400 -"19961129093000",9.71875,9.8203125,9.71875,9.8046875,17152000 -"19961128093000",-1,-1,-1,-1,-1 -"19961127093000",9.6328125,9.734375,9.609375,9.71875,44446400 -"19961126093000",9.625,9.7109375,9.5234375,9.609375,108238400 -"19961125093000",9.4453125,9.6015625,9.40625,9.59375,75131200 -"19961122093000",9.421875,9.53125,9.3359375,9.40625,94424000 -"19961121093000",9.65625,9.6640625,9.375,9.3984375,130718400 -"19961120093000",9.75,9.875,9.578125,9.578125,123857600 -"19961119093000",9.40625,9.7421875,9.390625,9.7421875,104739200 -"19961118093000",9.3359375,9.46875,9.2890625,9.3984375,98585600 -"19961115093000",9.421875,9.4296875,9.2109375,9.3125,104041600 -"19961114093000",9.078125,9.3515625,9.078125,9.3515625,114969600 -"19961113093000",8.9765625,9.109375,8.9453125,9.0625,90409600 -"19961112093000",9,9.1171875,8.84375,8.859375,81156800 -"19961111093000",8.9609375,9.046875,8.9375,8.9765625,38593600 -"19961108093000",8.9609375,8.96875,8.84375,8.96875,67369600 -"19961107093000",9.03125,9.1328125,8.9453125,8.96875,76742400 -"19961106093000",8.828125,9.03125,8.8125,9.03125,71438400 -"19961105093000",8.65625,8.84375,8.644525,8.84375,86417600 -"19961104093000",8.578125,8.6484375,8.546875,8.625,36006400 -"19961101093000",8.578125,8.671875,8.53125,8.5859375,56531200 -"19961031093000",8.5234375,8.5859375,8.5078125,8.578125,37028800 -"19961030093000",8.4609375,8.5625,8.4296875,8.515625,60526400 -"19961029093000",8.5546875,8.5859375,8.4296875,8.4609375,66756800 -"19961028093000",8.5429625,8.6015625,8.515625,8.5390625,51241600 -"19961025093000",8.5390625,8.6171875,8.5078125,8.5273375,53084800 -"19961024093000",8.4296875,8.5859375,8.3671875,8.5390625,81417600 -"19961023093000",8.2890625,8.421875,8.234375,8.40625,67408000 -"19961022093000",8.3203125,8.3359375,8.203125,8.28125,113806400 -"19961021093000",8.421875,8.5,8.34375,8.375,71401600 -"19961018093000",8.375,8.4375,8.34765,8.4375,69646400 -"19961017093000",8.640625,8.6875,8.46875,8.46875,49097600 -"19961016093000",8.671875,8.6835875,8.5625,8.625,36427200 -"19961015093000",8.671875,8.6953125,8.5859375,8.6796875,61206400 -"19961014093000",8.5859375,8.6328125,8.5234375,8.5390625,36091200 -"19961011093000",8.4140625,8.578125,8.390625,8.5703125,36523200 -"19961010093000",8.359375,8.5078125,8.3359375,8.359375,51739200 -"19961009093000",8.5,8.5078125,8.328125,8.40625,64960000 -"19961008093000",8.609375,8.609375,8.4375,8.4609375,48465600 -"19961007093000",8.5234375,8.6328125,8.4921875,8.59375,42432000 -"19961004093000",8.4140625,8.5390625,8.390625,8.5234375,45166400 -"19961003093000",8.421875,8.4453125,8.3515625,8.375,58294400 -"19961002093000",8.3046875,8.484375,8.2734375,8.421875,68760000 -"19961001093000",8.234375,8.3671875,8.1796875,8.2578125,69124800 -"19960930093000",8.34375,8.4296875,8.234375,8.2421875,89574400 -"19960927093000",8.28125,8.453125,8.203125,8.3984375,98372800 -"19960926093000",8.484375,8.5078125,8.234375,8.25,92604800 -"19960925093000",8.59375,8.6171875,8.4609375,8.4765625,44067200 -"19960924093000",8.59375,8.6484375,8.5078125,8.5546875,72520000 -"19960923093000",8.6015625,8.6328125,8.515625,8.609375,46385600 -"19960920093000",8.5625,8.6640625,8.4921875,8.6328125,104849600 -"19960919093000",8.53125,8.640625,8.484375,8.609375,75912000 -"19960918093000",8.375,8.6171875,8.328125,8.53125,86049600 -"19960917093000",8.3046875,8.4140625,8.265625,8.3671875,75624000 -"19960916093000",8.1953125,8.3203125,8.1875,8.21875,62409600 -"19960913093000",8.1015625,8.2109375,8.0546875,8.1875,80136000 -"19960912093000",7.84375,8.09375,7.8242125,8.019525,95944000 -"19960911093000",7.7460875,7.84375,7.7265625,7.8203125,36387200 -"19960910093000",7.796875,7.8203125,7.7265625,7.7734375,38904000 -"19960909093000",7.65625,7.8125,7.640625,7.8046875,41747200 -"19960906093000",7.625,7.671875,7.6015625,7.65625,41921600 -"19960905093000",7.671875,7.6875,7.59375,7.59375,40372800 -"19960904093000",7.7109375,7.7265625,7.6835875,7.7109375,27126400 -"19960903093000",7.625,7.7109375,7.5390625,7.7109375,48524800 -"19960902093000",-1,-1,-1,-1,-1 -"19960830093000",7.765625,7.765625,7.65625,7.65625,28088000 -"19960829093000",7.828125,7.828125,7.7265625,7.7578125,34182400 -"19960828093000",7.8125,7.859375,7.8046875,7.8515625,32070400 -"19960827093000",7.6875,7.796875,7.6875,7.796875,28038400 -"19960826093000",7.6875,7.734375,7.671875,7.6796875,31952000 -"19960823093000",7.8046875,7.8125,7.703125,7.703125,44006400 -"19960822093000",7.7578125,7.8203125,7.71875,7.8125,50236800 -"19960821093000",7.6484375,7.71875,7.609375,7.71875,49345600 -"19960820093000",7.734375,7.7578125,7.703125,7.7109375,25678400 -"19960819093000",7.7421875,7.7578125,7.640625,7.71875,43131200 -"19960816093000",7.8203125,7.828125,7.7265625,7.7265625,47598400 -"19960815093000",7.796875,7.859375,7.7734375,7.8203125,35556800 -"19960814093000",7.7421875,7.8203125,7.734375,7.8046875,52032000 -"19960813093000",7.8125,7.8671875,7.7109375,7.71875,72508800 -"19960812093000",7.765625,7.8828125,7.75,7.828125,66187200 -"19960809093000",7.796875,7.84375,7.7421875,7.78125,44313600 -"19960808093000",7.7578125,7.8671875,7.734375,7.828125,54379200 -"19960807093000",7.7734375,7.8203125,7.6796875,7.796875,76790400 -"19960806093000",7.6015625,7.7578125,7.5546875,7.75,67388800 -"19960805093000",7.71875,7.734375,7.578125,7.609375,55072000 -"19960802093000",7.6328125,7.7421875,7.5390625,7.7109375,109289600 -"19960801093000",7.3671875,7.5546875,7.3359375,7.5390625,96025600 -"19960731093000",7.4375,7.4765625,7.3515625,7.3671875,56320000 -"19960730093000",7.3671875,7.421875,7.2578125,7.4140625,66976000 -"19960729093000",7.453125,7.4921875,7.296875,7.3046875,56748800 -"19960726093000",7.46875,7.46875,7.390625,7.4453125,59304000 -"19960725093000",7.25,7.421875,7.1953125,7.40625,100920000 -"19960724093000",6.84375,7.234375,6.84375,7.171875,192176000 -"19960723093000",7.5,7.5078125,6.890625,7.0078125,257678400 -"19960722093000",7.5625,7.59375,7.3671875,7.484375,144475200 -"19960719093000",7.359375,7.6015625,7.359375,7.5605375,99208000 -"19960718093000",7.328125,7.5,7.2421875,7.4921875,98537600 -"19960717093000",7.359375,7.3828125,7.2265625,7.3203125,126272000 -"19960716093000",6.890625,7.2265625,6.71875,7.2109375,182116800 -"19960715093000",7.0234375,7.109375,6.8671875,6.9140625,111832000 -"19960712093000",7.1992125,7.1992125,6.9042875,7.0234375,139478400 -"19960711093000",7.390625,7.3984375,7.109375,7.15625,140915200 -"19960710093000",7.5,7.5,7.3828125,7.46875,77980800 -"19960709093000",7.5546875,7.5859375,7.5,7.5,32316800 -"19960708093000",7.40625,7.546875,7.3828125,7.519525,64440000 -"19960705093000",7.421875,7.5234375,7.3984375,7.3984375,35331200 -"19960704093000",-1,-1,-1,-1,-1 -"19960703093000",7.6015625,7.6796875,7.5390625,7.5703125,44243200 -"19960702093000",7.6484375,7.6640625,7.578125,7.6015625,38548800 -"19960701093000",7.515625,7.65625,7.5078125,7.644525,47859200 -"19960628093000",7.53125,7.5625,7.4453125,7.5078125,51960000 -"19960627093000",7.53125,7.5625,7.4375,7.4960875,77582400 -"19960626093000",7.6171875,7.625,7.4375,7.53125,71457600 -"19960625093000",7.765625,7.765625,7.5859375,7.625,41145600 -"19960624093000",7.75,7.8203125,7.6875,7.7578125,48102400 -"19960621093000",7.6484375,7.7578125,7.59375,7.7304625,56806400 -"19960620093000",7.625,7.6542875,7.4375,7.609375,102228800 -"19960619093000",7.65625,7.6953125,7.5859375,7.609375,73409600 -"19960618093000",7.78125,7.78125,7.625,7.6484375,74585600 -"19960617093000",7.6953125,7.8125,7.6484375,7.7890625,57499200 -"19960614093000",7.796875,7.8125,7.6796875,7.6875,55944000 -"19960613093000",7.8203125,7.8671875,7.734375,7.7890625,62577600 -"19960612093000",7.6796875,7.8359375,7.671875,7.8125,88844800 -"19960611093000",7.546875,7.703125,7.5390625,7.6328125,65259200 -"19960610093000",7.5625,7.578125,7.4980375,7.5390625,45819200 -"19960607093000",7.3515625,7.578125,7.3515625,7.578125,70198400 -"19960606093000",7.609375,7.6875,7.484375,7.488275,88136000 -"19960605093000",7.375,7.578125,7.3671875,7.5546875,50968000 -"19960604093000",7.4140625,7.4296875,7.265625,7.3671875,65854400 -"19960603093000",7.421875,7.46875,7.3828125,7.3984375,31684800 -"19960531093000",7.41015,7.4609375,7.375,7.421875,40259200 -"19960530093000",7.328125,7.390625,7.2890625,7.3828125,33824000 -"19960529093000",7.3359375,7.390625,7.2890625,7.3203125,33569600 -"19960528093000",7.421875,7.4453125,7.3203125,7.328125,43376000 -"19960527093000",-1,-1,-1,-1,-1 -"19960524093000",7.40625,7.4375,7.390625,7.40625,26443200 -"19960523093000",7.3046875,7.4453125,7.3046875,7.40625,51976000 -"19960522093000",7.1875,7.328125,7.1640625,7.3046875,45646400 -"19960521093000",7.296875,7.3046875,7.1953125,7.1953125,42113600 -"19960520093000",7.3359375,7.3671875,7.2890625,7.296875,38457600 -"19960517093000",7.3671875,7.375,7.2734375,7.3125,35392000 -"19960516093000",7.25,7.3359375,7.2265625,7.3203125,67092800 -"19960515093000",7.4375,7.484375,7.3359375,7.3515625,56323200 -"19960514093000",7.453125,7.5,7.3886625,7.4375,76832000 Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/mpl_examples/data/s1045.ima and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/mpl_examples/data/s1045.ima differ diff -Nru matplotlib-0.99.3/lib/mpl_examples/event_handling/close_event.py matplotlib-1.0.1/lib/mpl_examples/event_handling/close_event.py --- matplotlib-0.99.3/lib/mpl_examples/event_handling/close_event.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/event_handling/close_event.py 2010-07-07 01:41:54.000000000 +0000 @@ -0,0 +1,10 @@ +import matplotlib.pyplot as plt + +def handle_close(evt): + print 'Closed Figure!' + +fig = plt.figure() +fig.canvas.mpl_connect('close_event', handle_close) + +plt.text(0.35, 0.5, 'Close Me!', dict(size=30)) +plt.show() diff -Nru matplotlib-0.99.3/lib/mpl_examples/event_handling/legend_picking.py matplotlib-1.0.1/lib/mpl_examples/event_handling/legend_picking.py --- matplotlib-0.99.3/lib/mpl_examples/event_handling/legend_picking.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/event_handling/legend_picking.py 2010-07-07 01:41:54.000000000 +0000 @@ -0,0 +1,46 @@ +""" +Enable picking on the legend to toggle the legended line on and off +""" +import numpy as np +import matplotlib.pyplot as plt + +t = np.arange(0.0, 0.2, 0.1) +y1 = 2*np.sin(2*np.pi*t) +y2 = 4*np.sin(2*np.pi*2*t) + +fig = plt.figure() +ax = fig.add_subplot(111) +ax.set_title('Click on legend line to toggle line on/off') +line1, = ax.plot(t, y1, lw=2, color='red', label='1 HZ') +line2, = ax.plot(t, y2, lw=2, color='blue', label='2 HZ') +leg = ax.legend(loc='upper left', fancybox=True, shadow=True) +leg.get_frame().set_alpha(0.4) + + +# we will set up a dict mapping legend line to orig line, and enable +# picking on the legend line +lines = [line1, line2] +lined = dict() +for legline, origline in zip(leg.get_lines(), lines): + legline.set_picker(5) # 5 pts tolerance + lined[legline] = origline + + +def onpick(event): + # on the pick event, find the orig line corresponding to the + # legend proxy line, and toggle the visibilit + legline = event.artist + origline = lined[legline] + vis = not origline.get_visible() + origline.set_visible(vis) + # Change the alpha on the line in the legend so we can see what lines + # have been toggled + if vis: + legline.set_alpha(1.0) + else: + legline.set_alpha(0.2) + fig.canvas.draw() + +fig.canvas.mpl_connect('pick_event', onpick) + +plt.show() diff -Nru matplotlib-0.99.3/lib/mpl_examples/event_handling/pipong.py matplotlib-1.0.1/lib/mpl_examples/event_handling/pipong.py --- matplotlib-0.99.3/lib/mpl_examples/event_handling/pipong.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/event_handling/pipong.py 2010-07-07 01:41:54.000000000 +0000 @@ -12,17 +12,17 @@ 'e' up 'i' 'd' down 'k' -press 't' -- close these instructions +press 't' -- close these instructions (animation will be much faster) -press 'a' -- add a puck -press 'A' -- remove a puck -press '1' -- slow down all pucks -press '2' -- speed up all pucks -press '3' -- slow down distractors -press '4' -- speed up distractors +press 'a' -- add a puck +press 'A' -- remove a puck +press '1' -- slow down all pucks +press '2' -- speed up all pucks +press '3' -- slow down distractors +press '4' -- speed up distractors press ' ' -- reset the first puck -press 'n' -- toggle distractors on/off -press 'g' -- toggle the game on/off +press 'n' -- toggle distractors on/off +press 'g' -- toggle the game on/off """ @@ -56,7 +56,7 @@ def _reset(self,pad): self.x = pad.x + pad.xoffset if pad.y < 0: - self.y = pad.y + pad.yoffset + self.y = pad.y + pad.yoffset else: self.y = pad.y - pad.yoffset self.vx = pad.x - self.x @@ -84,7 +84,7 @@ self._reset(pads[1]) return True if self.y < -1+fudge or self.y > 1-fudge: - self.vy *= -1.0 + self.vy *= -1.0 # add some randomness, just to make it interesting self.vy -= (randn()/300.0 + 1/300.0) * np.sign(self.vy) self._speedlimit() @@ -106,7 +106,7 @@ if self.vy < -self.vmax: self.vy = -self.vmax -class Game(object): +class Game(object): def __init__(self, ax): # create the initial line @@ -137,7 +137,7 @@ self.pads = [] self.pads.append( Pad(pA,0,padAy)) self.pads.append( Pad(pB,padBx,padBy,'r')) - self.pucks =[] + self.pucks =[] self.i = self.ax.annotate(instructions,(.5,0.5), name='monospace', verticalalignment='center', @@ -180,8 +180,8 @@ for puck in self.pucks: if puck.update(self.pads): # we only get here if someone scored - self.pads[0].disp.set_label(" "+ str(self.pads[0].score)) - self.pads[1].disp.set_label(" "+ str(self.pads[1].score)) + self.pads[0].disp.set_label(" "+ str(self.pads[0].score)) + self.pads[1].disp.set_label(" "+ str(self.pads[1].score)) self.ax.legend(loc='center') self.leg = self.ax.get_legend() #self.leg.draw_frame(False) #don't draw the legend border @@ -189,7 +189,7 @@ plt.setp(self.leg.get_texts(),fontweight='bold',fontsize='xx-large') self.leg.get_frame().set_facecolor('0.2') self.background = None - self.ax.draw() + self.ax.figure.canvas.draw() return True puck.disp.set_offsets([puck.x,puck.y]) self.ax.draw_artist(puck.disp) @@ -229,7 +229,7 @@ self.pads[1].y -= .1 if self.pads[1].y < -1: self.pads[1].y = -1 - + if event.key == 'a': self.pucks.append(Puck(self.puckdisp,self.pads[randint(2)],self.ax.bbox)) if event.key == 'A' and len(self.pucks): @@ -242,7 +242,7 @@ if event.key == '2': for p in self.pucks: p._faster() - + if event.key == 'n': self.distract = not self.distract @@ -254,4 +254,4 @@ self.inst = not self.inst self.i.set_visible(self.i.get_visible()) if event.key == 'q': - plt.close() + plt.close() diff -Nru matplotlib-0.99.3/lib/mpl_examples/event_handling/pong_gtk.py matplotlib-1.0.1/lib/mpl_examples/event_handling/pong_gtk.py --- matplotlib-0.99.3/lib/mpl_examples/event_handling/pong_gtk.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/event_handling/pong_gtk.py 2010-07-07 01:41:54.000000000 +0000 @@ -12,7 +12,7 @@ import numpy as np import matplotlib.pyplot as plt -import pipong +import pipong from numpy.random import randn, randint @@ -22,7 +22,8 @@ def start_anim(event): - gobject.idle_add(animation.draw,animation) +# gobject.idle_add(animation.draw,animation) + gobject.timeout_add(10,animation.draw,animation) canvas.mpl_disconnect(start_anim.cid) animation = pipong.Game(ax) diff -Nru matplotlib-0.99.3/lib/mpl_examples/event_handling/pong_qt.py matplotlib-1.0.1/lib/mpl_examples/event_handling/pong_qt.py --- matplotlib-0.99.3/lib/mpl_examples/event_handling/pong_qt.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/event_handling/pong_qt.py 2010-07-07 01:41:54.000000000 +0000 @@ -18,7 +18,7 @@ import matplotlib.pyplot as plt import numpy as np import time -import pipong +import pipong from numpy.random import randn, randint class BlitQT(QObject): @@ -36,7 +36,7 @@ app = BlitQT() # for profiling app.tstart = time.time() -app.startTimer(0) +app.startTimer(10) plt.show() print 'FPS:' , app.animation.cnt/(time.time()-app.tstart) diff -Nru matplotlib-0.99.3/lib/mpl_examples/event_handling/resample.py matplotlib-1.0.1/lib/mpl_examples/event_handling/resample.py --- matplotlib-0.99.3/lib/mpl_examples/event_handling/resample.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/event_handling/resample.py 2010-07-07 01:41:54.000000000 +0000 @@ -0,0 +1,53 @@ +import numpy as np +import matplotlib.pyplot as plt +from scikits.audiolab import wavread + +# A class that will downsample the data and recompute when zoomed. +class DataDisplayDownsampler(object): + def __init__(self, xdata, ydata): + self.origYData = ydata + self.origXData = xdata + self.numpts = 3000 + self.delta = xdata[-1] - xdata[0] + + def resample(self, xstart, xend): + # Very simple downsampling that takes the points within the range + # and picks every Nth point + mask = (self.origXData > xstart) & (self.origXData < xend) + xdata = self.origXData[mask] + ratio = int(xdata.size / self.numpts) + 1 + xdata = xdata[::ratio] + + ydata = self.origYData[mask] + ydata = ydata[::ratio] + + return xdata, ydata + + def update(self, ax): + # Update the line + lims = ax.viewLim + if np.abs(lims.width - self.delta) > 1e-8: + self.delta = lims.width + xstart, xend = lims.intervalx + self.line.set_data(*self.downsample(xstart, xend)) + ax.figure.canvas.draw_idle() + +# Read data +data = wavread('/usr/share/sounds/purple/receive.wav')[0] +ydata = np.tile(data[:, 0], 100) +xdata = np.arange(ydata.size) + +d = DataDisplayDownsampler(xdata, ydata) + +fig = plt.figure() +ax = fig.add_subplot(1, 1, 1) + +#Hook up the line +xdata, ydata = d.downsample(xdata[0], xdata[-1]) +d.line, = ax.plot(xdata, ydata) +ax.set_autoscale_on(False) # Otherwise, infinite loop + +# Connect for changing the view limits +ax.callbacks.connect('xlim_changed', d.update) + +plt.show() diff -Nru matplotlib-0.99.3/lib/mpl_examples/event_handling/timers.py matplotlib-1.0.1/lib/mpl_examples/event_handling/timers.py --- matplotlib-0.99.3/lib/mpl_examples/event_handling/timers.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/event_handling/timers.py 2010-07-07 01:41:54.000000000 +0000 @@ -0,0 +1,29 @@ +# Simple example of using general timer objects. This is used to update +# the time placed in the title of the figure. +import matplotlib.pyplot as plt +import numpy as np +from datetime import datetime + +def update_title(axes): + axes.set_title(datetime.now()) + axes.figure.canvas.draw() + +fig = plt.figure() +ax = fig.add_subplot(1, 1, 1) + +x = np.linspace(-3, 3) +ax.plot(x, x*x) + +# Create a new timer object. Set the interval 500 milliseconds (1000 is default) +# and tell the timer what function should be called. +timer = fig.canvas.new_timer(interval=100) +timer.add_callback(update_title, ax) +timer.start() + +#Or could start the timer on first figure draw +#def start_timer(evt): +# timer.start() +# fig.canvas.mpl_disconnect(drawid) +#drawid = fig.canvas.mpl_connect('draw_event', start_timer) + +plt.show() diff -Nru matplotlib-0.99.3/lib/mpl_examples/event_handling/viewlims.py matplotlib-1.0.1/lib/mpl_examples/event_handling/viewlims.py --- matplotlib-0.99.3/lib/mpl_examples/event_handling/viewlims.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/event_handling/viewlims.py 2010-07-07 01:41:54.000000000 +0000 @@ -40,7 +40,7 @@ ax.set_autoscale_on(False) # Otherwise, infinite loop #Get the number of points from the number of pixels in the window - dims = ax.axesFrame.get_window_extent().bounds + dims = ax.axesPatch.get_window_extent().bounds self.width = int(dims[2] + 0.5) self.height = int(dims[2] + 0.5) diff -Nru matplotlib-0.99.3/lib/mpl_examples/misc/contour_manual.py matplotlib-1.0.1/lib/mpl_examples/misc/contour_manual.py --- matplotlib-0.99.3/lib/mpl_examples/misc/contour_manual.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/misc/contour_manual.py 2010-07-07 01:41:55.000000000 +0000 @@ -0,0 +1,50 @@ +""" +Example of displaying your own contour lines and polygons using ContourSet. +""" +import matplotlib.pyplot as plt +from matplotlib.contour import ContourSet +import matplotlib.cm as cm + +# Contour lines for each level are a list/tuple of polygons. +lines0 = [ [[0,0],[0,4]] ] +lines1 = [ [[2,0],[1,2],[1,3]] ] +lines2 = [ [[3,0],[3,2]], [[3,3],[3,4]] ] # Note two lines. + +# Filled contours between two levels are also a list/tuple of polygons. +# Points can be ordered clockwise or anticlockwise. +filled01 = [ [[0,0],[0,4],[1,3],[1,2],[2,0]] ] +filled12 = [ [[2,0],[3,0],[3,2],[1,3],[1,2]], # Note two polygons. + [[1,4],[3,4],[3,3]] ] + + +plt.figure() + +# Filled contours using filled=True. +cs = ContourSet(plt.gca(), [0,1,2], [filled01, filled12], filled=True, cmap=cm.bone) +cbar = plt.colorbar(cs) + +# Contour lines (non-filled). +lines = ContourSet(plt.gca(), [0,1,2], [lines0, lines1, lines2], cmap=cm.cool, + linewidths=3) +cbar.add_lines(lines) + +plt.axis([-0.5, 3.5, -0.5, 4.5]) +plt.title('User-specified contours') + + + +# Multiple filled contour lines can be specified in a single list of polygon +# vertices along with a list of vertex kinds (code types) as described in the +# Path class. This is particularly useful for polygons with holes. +# Here a code type of 1 is a MOVETO, and 2 is a LINETO. + +plt.figure() +filled01 = [ [[0,0],[3,0],[3,3],[0,3],[1,1],[1,2],[2,2],[2,1]] ] +kinds01 = [ [1,2,2,2,1,2,2,2] ] +cs = ContourSet(plt.gca(), [0,1], [filled01], [kinds01], filled=True) +cbar = plt.colorbar(cs) + +plt.axis([-0.5, 3.5, -0.5, 3.5]) +plt.title('User specified filled contours with holes') + +plt.show() \ No newline at end of file diff -Nru matplotlib-0.99.3/lib/mpl_examples/misc/rec_groupby_demo.py matplotlib-1.0.1/lib/mpl_examples/misc/rec_groupby_demo.py --- matplotlib-0.99.3/lib/mpl_examples/misc/rec_groupby_demo.py 2009-07-31 15:14:51.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/misc/rec_groupby_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,8 +1,10 @@ import numpy as np import matplotlib.mlab as mlab +import matplotlib.cbook as cbook - -r = mlab.csv2rec('../data/aapl.csv') +datafile = cbook.get_sample_data('aapl.csv', asfileobj=False) +print 'loading', datafile +r = mlab.csv2rec(datafile) r.sort() def daily_return(prices): diff -Nru matplotlib-0.99.3/lib/mpl_examples/misc/rec_join_demo.py matplotlib-1.0.1/lib/mpl_examples/misc/rec_join_demo.py --- matplotlib-0.99.3/lib/mpl_examples/misc/rec_join_demo.py 2009-07-31 15:14:51.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/misc/rec_join_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,8 +1,11 @@ import numpy as np import matplotlib.mlab as mlab +import matplotlib.cbook as cbook +datafile = cbook.get_sample_data('aapl.csv', asfileobj=False) +print 'loading', datafile +r = mlab.csv2rec(datafile) -r = mlab.csv2rec('../data/aapl.csv') r.sort() r1 = r[-10:] diff -Nru matplotlib-0.99.3/lib/mpl_examples/misc/sample_data_demo.py matplotlib-1.0.1/lib/mpl_examples/misc/sample_data_demo.py --- matplotlib-0.99.3/lib/mpl_examples/misc/sample_data_demo.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/misc/sample_data_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -0,0 +1,12 @@ +""" +Grab mpl data from the ~/.matplotlib/sample_data cache if it exists, else +fetch it from svn and cache it +""" +import matplotlib.cbook as cbook +import matplotlib.pyplot as plt +fname = cbook.get_sample_data('lena.png', asfileobj=False) + +print 'fname', fname +im = plt.imread(fname) +plt.imshow(im) +plt.show() diff -Nru matplotlib-0.99.3/lib/mpl_examples/misc/sample_data_test.py matplotlib-1.0.1/lib/mpl_examples/misc/sample_data_test.py --- matplotlib-0.99.3/lib/mpl_examples/misc/sample_data_test.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/misc/sample_data_test.py 2010-07-07 01:41:55.000000000 +0000 @@ -0,0 +1,26 @@ +""" +Demonstrate how get_sample_data works with svn revisions in the data. + + svn co https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/trunk/sample_data + +and edit testdata.csv to add a new row. After committing the changes, +when you rerun this script you will get the updated data (and the new +svn version will be cached in ~/.matplotlib/sample_data) +""" + +import matplotlib.mlab as mlab +import matplotlib.cbook as cbook + +# get the file handle to the cached data and print the contents +datafile = 'testdir/subdir/testsub.csv' +fh = cbook.get_sample_data(datafile) +print fh.read() + +# make sure we can read it using csv2rec +fh.seek(0) +r = mlab.csv2rec(fh) + +print mlab.rec2txt(r) + +fh.close() + diff -Nru matplotlib-0.99.3/lib/mpl_examples/mplot3d/2dcollections3d_demo.py matplotlib-1.0.1/lib/mpl_examples/mplot3d/2dcollections3d_demo.py --- matplotlib-0.99.3/lib/mpl_examples/mplot3d/2dcollections3d_demo.py 2009-08-22 21:06:13.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/mplot3d/2dcollections3d_demo.py 2010-08-03 14:22:42.000000000 +0000 @@ -3,7 +3,7 @@ import matplotlib.pyplot as plt fig = plt.figure() -ax = Axes3D(fig) +ax = fig.gca(projection='3d') x = np.linspace(0, 1, 100) y = np.sin(x * 2 * np.pi) / 2 + 0.5 diff -Nru matplotlib-0.99.3/lib/mpl_examples/mplot3d/bars3d_demo.py matplotlib-1.0.1/lib/mpl_examples/mplot3d/bars3d_demo.py --- matplotlib-0.99.3/lib/mpl_examples/mplot3d/bars3d_demo.py 2009-08-22 21:06:13.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/mplot3d/bars3d_demo.py 2010-08-03 14:22:42.000000000 +0000 @@ -3,11 +3,16 @@ import numpy as np fig = plt.figure() -ax = Axes3D(fig) +ax = fig.add_subplot(111, projection='3d') for c, z in zip(['r', 'g', 'b', 'y'], [30, 20, 10, 0]): xs = np.arange(20) ys = np.random.rand(20) - ax.bar(xs, ys, zs=z, zdir='y', color=c, alpha=0.8) + + # You can provide either a single color or an array. To demonstrate this, + # the first bar of each set will be colored cyan. + cs = [c] * len(xs) + cs[0] = 'c' + ax.bar(xs, ys, zs=z, zdir='y', color=cs, alpha=0.8) ax.set_xlabel('X') ax.set_ylabel('Y') diff -Nru matplotlib-0.99.3/lib/mpl_examples/mplot3d/contour3d_demo2.py matplotlib-1.0.1/lib/mpl_examples/mplot3d/contour3d_demo2.py --- matplotlib-0.99.3/lib/mpl_examples/mplot3d/contour3d_demo2.py 2009-08-22 21:06:13.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/mplot3d/contour3d_demo2.py 2010-08-03 14:22:42.000000000 +0000 @@ -2,7 +2,7 @@ import matplotlib.pyplot as plt fig = plt.figure() -ax = axes3d.Axes3D(fig) +ax = fig.gca(projection='3d') X, Y, Z = axes3d.get_test_data(0.05) cset = ax.contour(X, Y, Z, 16, extend3d=True) ax.clabel(cset, fontsize=9, inline=1) diff -Nru matplotlib-0.99.3/lib/mpl_examples/mplot3d/contour3d_demo3.py matplotlib-1.0.1/lib/mpl_examples/mplot3d/contour3d_demo3.py --- matplotlib-0.99.3/lib/mpl_examples/mplot3d/contour3d_demo3.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/mplot3d/contour3d_demo3.py 2010-08-03 14:22:42.000000000 +0000 @@ -0,0 +1,20 @@ +from mpl_toolkits.mplot3d import axes3d +import matplotlib.pyplot as plt + +fig = plt.figure() +ax = fig.gca(projection='3d') +X, Y, Z = axes3d.get_test_data(0.05) +ax.plot_surface(X, Y, Z, rstride=8, cstride=8, alpha=0.3) +cset = ax.contour(X, Y, Z, zdir='z', offset=-100) +cset = ax.contour(X, Y, Z, zdir='x', offset=-40) +cset = ax.contour(X, Y, Z, zdir='y', offset=40) + +ax.set_xlabel('X') +ax.set_xlim3d(-40, 40) +ax.set_ylabel('Y') +ax.set_ylim3d(-40, 40) +ax.set_zlabel('Z') +ax.set_zlim3d(-100, 100) + +plt.show() + diff -Nru matplotlib-0.99.3/lib/mpl_examples/mplot3d/contour3d_demo.py matplotlib-1.0.1/lib/mpl_examples/mplot3d/contour3d_demo.py --- matplotlib-0.99.3/lib/mpl_examples/mplot3d/contour3d_demo.py 2009-08-22 21:06:13.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/mplot3d/contour3d_demo.py 2010-08-03 14:22:42.000000000 +0000 @@ -2,7 +2,7 @@ import matplotlib.pyplot as plt fig = plt.figure() -ax = axes3d.Axes3D(fig) +ax = fig.add_subplot(111, projection='3d') X, Y, Z = axes3d.get_test_data(0.05) cset = ax.contour(X, Y, Z) ax.clabel(cset, fontsize=9, inline=1) diff -Nru matplotlib-0.99.3/lib/mpl_examples/mplot3d/contourf3d_demo.py matplotlib-1.0.1/lib/mpl_examples/mplot3d/contourf3d_demo.py --- matplotlib-0.99.3/lib/mpl_examples/mplot3d/contourf3d_demo.py 2009-08-22 21:06:13.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/mplot3d/contourf3d_demo.py 2010-08-03 14:22:42.000000000 +0000 @@ -2,7 +2,7 @@ import matplotlib.pyplot as plt fig = plt.figure() -ax = axes3d.Axes3D(fig) +ax = fig.gca(projection='3d') X, Y, Z = axes3d.get_test_data(0.05) cset = ax.contourf(X, Y, Z) ax.clabel(cset, fontsize=9, inline=1) diff -Nru matplotlib-0.99.3/lib/mpl_examples/mplot3d/hist3d_demo.py matplotlib-1.0.1/lib/mpl_examples/mplot3d/hist3d_demo.py --- matplotlib-0.99.3/lib/mpl_examples/mplot3d/hist3d_demo.py 2009-08-22 21:06:13.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/mplot3d/hist3d_demo.py 2010-08-03 14:22:42.000000000 +0000 @@ -3,7 +3,7 @@ import numpy as np fig = plt.figure() -ax = Axes3D(fig) +ax = fig.add_subplot(111, projection='3d') x, y = np.random.rand(2, 100) * 4 hist, xedges, yedges = np.histogram2d(x, y, bins=4) @@ -16,7 +16,8 @@ dx = 0.5 * np.ones_like(zpos) dy = dx.copy() dz = hist.flatten() -ax.bar3d(xpos, ypos, zpos, dx, dy, dz, color='b') + +ax.bar3d(xpos, ypos, zpos, dx, dy, dz, color='b', zsort='average') plt.show() diff -Nru matplotlib-0.99.3/lib/mpl_examples/mplot3d/lines3d_demo.py matplotlib-1.0.1/lib/mpl_examples/mplot3d/lines3d_demo.py --- matplotlib-0.99.3/lib/mpl_examples/mplot3d/lines3d_demo.py 2009-08-22 21:06:13.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/mplot3d/lines3d_demo.py 2010-08-03 14:22:42.000000000 +0000 @@ -6,7 +6,7 @@ mpl.rcParams['legend.fontsize'] = 10 fig = plt.figure() -ax = Axes3D(fig) +ax = fig.gca(projection='3d') theta = np.linspace(-4 * np.pi, 4 * np.pi, 100) z = np.linspace(-2, 2, 100) r = z**2 + 1 diff -Nru matplotlib-0.99.3/lib/mpl_examples/mplot3d/mixed_subplots_demo.py matplotlib-1.0.1/lib/mpl_examples/mplot3d/mixed_subplots_demo.py --- matplotlib-0.99.3/lib/mpl_examples/mplot3d/mixed_subplots_demo.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/mplot3d/mixed_subplots_demo.py 2010-08-03 14:22:42.000000000 +0000 @@ -0,0 +1,48 @@ +""" +Demonstrate the mixing of 2d and 3d subplots +""" +from mpl_toolkits.mplot3d import Axes3D +import matplotlib.pyplot as plt +import numpy as np + +def f(t): + s1 = np.cos(2*np.pi*t) + e1 = np.exp(-t) + return np.multiply(s1,e1) + + +################ +# First subplot +################ +t1 = np.arange(0.0, 5.0, 0.1) +t2 = np.arange(0.0, 5.0, 0.02) +t3 = np.arange(0.0, 2.0, 0.01) + +fig = plt.figure() +fig.suptitle('A tale of 2 subplots') +ax = fig.add_subplot(2, 1, 1) +l = ax.plot(t1, f(t1), 'bo', + t2, f(t2), 'k--', markerfacecolor='green') +ax.grid(True) +ax.set_ylabel('Damped oscillation') + + +################# +# Second subplot +################# +ax = fig.add_subplot(2, 1, 2, projection='3d') +X = np.arange(-5, 5, 0.25) +xlen = len(X) +Y = np.arange(-5, 5, 0.25) +ylen = len(Y) +X, Y = np.meshgrid(X, Y) +R = np.sqrt(X**2 + Y**2) +Z = np.sin(R) + +surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, + linewidth=0, antialiased=False) + +ax.set_zlim3d(-1, 1) + +plt.show() + diff -Nru matplotlib-0.99.3/lib/mpl_examples/mplot3d/pathpatch3d_demo.py matplotlib-1.0.1/lib/mpl_examples/mplot3d/pathpatch3d_demo.py --- matplotlib-0.99.3/lib/mpl_examples/mplot3d/pathpatch3d_demo.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/mplot3d/pathpatch3d_demo.py 2010-08-03 14:22:42.000000000 +0000 @@ -0,0 +1,52 @@ +import matplotlib.pyplot as plt +from matplotlib.patches import Circle, PathPatch +from mpl_toolkits.mplot3d import Axes3D +import mpl_toolkits.mplot3d.art3d as art3d +from matplotlib.text import TextPath +from matplotlib.transforms import Affine2D + + +def text3d(ax, (x, y, z), s, zdir="z", size=None, angle=0, usetex=False, + **kwargs): + + if zdir == "y": + xy1, z1 = (x, z), y + elif zdir == "y": + xy1, z1 = (y, z), x + else: + xy1, z1 = (x, y), z + + text_path = TextPath((0, 0), s, size=size, usetex=usetex) + trans = Affine2D().rotate(angle).translate(xy1[0], xy1[1]) + + p1 = PathPatch(trans.transform_path(text_path), **kwargs) + ax.add_patch(p1) + art3d.pathpatch_2d_to_3d(p1, z=z1, zdir=zdir) + + +fig = plt.figure() +ax = fig.add_subplot(111, projection='3d') + +p = Circle((5, 5), 3) +ax.add_patch(p) +art3d.pathpatch_2d_to_3d(p, z=0, zdir="x") + + +text3d(ax, (4, -2, 0), "X-axis", zdir="z", size=.5, usetex=False, + ec="none", fc="k") +text3d(ax, (12, 4, 0), "Y-axis", zdir="z", size=.5, usetex=False, angle=.5*3.14159, + ec="none", fc="k") +text3d(ax, (12, 10, 4), "Z-axis", zdir="y", size=.5, usetex=False, angle=.5*3.14159, + ec="none", fc="k") + +text3d(ax, (1, 5, 0), + r"$\displaystyle G_{\mu\nu} + \Lambda g_{\mu\nu} = \frac{8\pi G}{c^4} T_{\mu\nu} $", + zdir="z", size=1, usetex=True, + ec="none", fc="k") + +ax.set_xlim3d(0, 10) +ax.set_ylim3d(0, 10) +ax.set_zlim3d(0, 10) + +plt.show() + diff -Nru matplotlib-0.99.3/lib/mpl_examples/mplot3d/polys3d_demo.py matplotlib-1.0.1/lib/mpl_examples/mplot3d/polys3d_demo.py --- matplotlib-0.99.3/lib/mpl_examples/mplot3d/polys3d_demo.py 2009-08-22 21:06:13.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/mplot3d/polys3d_demo.py 2010-08-03 14:22:42.000000000 +0000 @@ -5,7 +5,7 @@ import numpy as np fig = plt.figure() -ax = Axes3D(fig) +ax = fig.gca(projection='3d') cc = lambda arg: colorConverter.to_rgba(arg, alpha=0.6) @@ -22,8 +22,11 @@ poly.set_alpha(0.7) ax.add_collection3d(poly, zs=zs, zdir='y') +ax.set_xlabel('X') ax.set_xlim3d(0, 10) +ax.set_ylabel('Y') ax.set_ylim3d(-1, 4) +ax.set_zlabel('Z') ax.set_zlim3d(0, 1) plt.show() diff -Nru matplotlib-0.99.3/lib/mpl_examples/mplot3d/rotate_axes3d_demo.py matplotlib-1.0.1/lib/mpl_examples/mplot3d/rotate_axes3d_demo.py --- matplotlib-0.99.3/lib/mpl_examples/mplot3d/rotate_axes3d_demo.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/mplot3d/rotate_axes3d_demo.py 2010-08-03 14:22:42.000000000 +0000 @@ -0,0 +1,15 @@ +from mpl_toolkits.mplot3d import axes3d +import matplotlib.pyplot as plt +import numpy as np + +plt.ion() + +fig = plt.figure() +ax = fig.add_subplot(111, projection='3d') +X, Y, Z = axes3d.get_test_data(0.1) +ax.plot_wireframe(X, Y, Z, rstride=5, cstride=5) + +for angle in range(0, 360): + ax.view_init(30, angle) + plt.draw() + diff -Nru matplotlib-0.99.3/lib/mpl_examples/mplot3d/scatter3d_demo.py matplotlib-1.0.1/lib/mpl_examples/mplot3d/scatter3d_demo.py --- matplotlib-0.99.3/lib/mpl_examples/mplot3d/scatter3d_demo.py 2009-08-22 21:06:13.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/mplot3d/scatter3d_demo.py 2010-08-03 14:22:42.000000000 +0000 @@ -2,18 +2,17 @@ from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt - def randrange(n, vmin, vmax): return (vmax-vmin)*np.random.rand(n) + vmin fig = plt.figure() -ax = Axes3D(fig) +ax = fig.add_subplot(111, projection='3d') n = 100 -for c, zl, zh in [('r', -50, -25), ('b', -30, -5)]: +for c, m, zl, zh in [('r', 'o', -50, -25), ('b', '^', -30, -5)]: xs = randrange(n, 23, 32) ys = randrange(n, 0, 100) zs = randrange(n, zl, zh) - ax.scatter(xs, ys, zs, c=c) + ax.scatter(xs, ys, zs, c=c, marker=m) ax.set_xlabel('X Label') ax.set_ylabel('Y Label') diff -Nru matplotlib-0.99.3/lib/mpl_examples/mplot3d/subplot3d_demo.py matplotlib-1.0.1/lib/mpl_examples/mplot3d/subplot3d_demo.py --- matplotlib-0.99.3/lib/mpl_examples/mplot3d/subplot3d_demo.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/mplot3d/subplot3d_demo.py 2010-08-03 14:22:42.000000000 +0000 @@ -0,0 +1,32 @@ +from mpl_toolkits.mplot3d.axes3d import Axes3D +import matplotlib.pyplot as plt + + +# imports specific to the plots in this example +import numpy as np +from matplotlib import cm +from mpl_toolkits.mplot3d.axes3d import get_test_data + + +fig = plt.figure(figsize=(9.5,5.0)) + +#---- First subplot +ax = fig.add_subplot(1, 2, 1, projection='3d') +X = np.arange(-5, 5, 0.25) +Y = np.arange(-5, 5, 0.25) +X, Y = np.meshgrid(X, Y) +R = np.sqrt(X**2 + Y**2) +Z = np.sin(R) +surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.jet, + linewidth=0, antialiased=False) +ax.set_zlim3d(-1.01, 1.01) + +fig.colorbar(surf, shrink=0.5, aspect=10) + +#---- Second subplot +ax = fig.add_subplot(1, 2, 2, projection='3d') +X, Y, Z = get_test_data(0.05) +ax.plot_wireframe(X, Y, Z, rstride=10, cstride=10) + +plt.show() + diff -Nru matplotlib-0.99.3/lib/mpl_examples/mplot3d/surface3d_demo2.py matplotlib-1.0.1/lib/mpl_examples/mplot3d/surface3d_demo2.py --- matplotlib-0.99.3/lib/mpl_examples/mplot3d/surface3d_demo2.py 2009-08-22 21:06:13.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/mplot3d/surface3d_demo2.py 2010-08-03 14:22:42.000000000 +0000 @@ -3,7 +3,7 @@ import numpy as np fig = plt.figure() -ax = Axes3D(fig) +ax = fig.add_subplot(111, projection='3d') u = np.linspace(0, 2 * np.pi, 100) v = np.linspace(0, np.pi, 100) diff -Nru matplotlib-0.99.3/lib/mpl_examples/mplot3d/surface3d_demo3.py matplotlib-1.0.1/lib/mpl_examples/mplot3d/surface3d_demo3.py --- matplotlib-0.99.3/lib/mpl_examples/mplot3d/surface3d_demo3.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/mplot3d/surface3d_demo3.py 2010-08-03 14:22:42.000000000 +0000 @@ -0,0 +1,31 @@ +from mpl_toolkits.mplot3d import Axes3D +from matplotlib import cm +from matplotlib.ticker import LinearLocator, FixedLocator, FormatStrFormatter +import matplotlib.pyplot as plt +import numpy as np + +fig = plt.figure() +ax = fig.gca(projection='3d') +X = np.arange(-5, 5, 0.25) +xlen = len(X) +Y = np.arange(-5, 5, 0.25) +ylen = len(Y) +X, Y = np.meshgrid(X, Y) +R = np.sqrt(X**2 + Y**2) +Z = np.sin(R) + +colortuple = ('y', 'b') +colors = np.empty(X.shape, dtype=str) +for y in range(ylen): + for x in range(xlen): + colors[x, y] = colortuple[(x + y) % len(colortuple)] + +surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, facecolors=colors, + linewidth=0, antialiased=False) + +ax.set_zlim3d(-1, 1) +ax.w_zaxis.set_major_locator(LinearLocator(6)) +ax.w_zaxis.set_major_formatter(FormatStrFormatter('%.03f')) + +plt.show() + diff -Nru matplotlib-0.99.3/lib/mpl_examples/mplot3d/surface3d_demo.py matplotlib-1.0.1/lib/mpl_examples/mplot3d/surface3d_demo.py --- matplotlib-0.99.3/lib/mpl_examples/mplot3d/surface3d_demo.py 2009-08-22 21:06:13.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/mplot3d/surface3d_demo.py 2010-08-03 14:22:42.000000000 +0000 @@ -1,16 +1,24 @@ from mpl_toolkits.mplot3d import Axes3D from matplotlib import cm +from matplotlib.ticker import LinearLocator, FixedLocator, FormatStrFormatter import matplotlib.pyplot as plt import numpy as np fig = plt.figure() -ax = Axes3D(fig) +ax = fig.gca(projection='3d') X = np.arange(-5, 5, 0.25) Y = np.arange(-5, 5, 0.25) X, Y = np.meshgrid(X, Y) R = np.sqrt(X**2 + Y**2) Z = np.sin(R) -ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.jet) +surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.jet, + linewidth=0, antialiased=False) +ax.set_zlim3d(-1.01, 1.01) + +ax.w_zaxis.set_major_locator(LinearLocator(10)) +ax.w_zaxis.set_major_formatter(FormatStrFormatter('%.03f')) + +fig.colorbar(surf, shrink=0.5, aspect=5) plt.show() diff -Nru matplotlib-0.99.3/lib/mpl_examples/mplot3d/surface3d_radial_demo.py matplotlib-1.0.1/lib/mpl_examples/mplot3d/surface3d_radial_demo.py --- matplotlib-0.99.3/lib/mpl_examples/mplot3d/surface3d_radial_demo.py 2010-05-30 20:31:09.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/mplot3d/surface3d_radial_demo.py 2010-08-03 14:22:42.000000000 +0000 @@ -8,7 +8,7 @@ step = 0.04 maxval = 1.0 fig = plt.figure() -ax = Axes3D(fig) +ax = fig.add_subplot(111, projection='3d') # create supporting points in polar coordinates r = np.linspace(0,1.25,50) diff -Nru matplotlib-0.99.3/lib/mpl_examples/mplot3d/text3d_demo.py matplotlib-1.0.1/lib/mpl_examples/mplot3d/text3d_demo.py --- matplotlib-0.99.3/lib/mpl_examples/mplot3d/text3d_demo.py 2009-08-22 21:06:13.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/mplot3d/text3d_demo.py 2010-08-03 14:22:42.000000000 +0000 @@ -2,7 +2,7 @@ import matplotlib.pyplot as plt fig = plt.figure() -ax = Axes3D(fig) +ax = fig.gca(projection='3d') zdirs = (None, 'x', 'y', 'z', (1, 1, 0), (1, 1, 1)) xs = (2, 6, 4, 9, 7, 2) @@ -13,6 +13,9 @@ label = '(%d, %d, %d), dir=%s' % (x, y, z, zdir) ax.text(x, y, z, label, zdir) +ax.text(1, 1, 1, "red", color='red') +ax.text2D(0.05, 0.95, "2D Text", transform=ax.transAxes) + ax.set_xlim3d(0, 10) ax.set_ylim3d(0, 10) ax.set_zlim3d(0, 10) diff -Nru matplotlib-0.99.3/lib/mpl_examples/mplot3d/wire3d_animation_demo.py matplotlib-1.0.1/lib/mpl_examples/mplot3d/wire3d_animation_demo.py --- matplotlib-0.99.3/lib/mpl_examples/mplot3d/wire3d_animation_demo.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/mplot3d/wire3d_animation_demo.py 2010-08-03 14:22:42.000000000 +0000 @@ -0,0 +1,37 @@ +""" +A very simple 'animation' of a 3D plot +""" +from mpl_toolkits.mplot3d import axes3d +import matplotlib.pyplot as plt +import numpy as np +import time + +def generate(X, Y, phi): + R = 1 - np.sqrt(X**2 + Y**2) + return np.cos(2 * np.pi * X + phi) * R + +plt.ion() +fig = plt.figure() +ax = fig.add_subplot(111, projection='3d') + +xs = np.linspace(-1, 1, 50) +ys = np.linspace(-1, 1, 50) +X, Y = np.meshgrid(xs, ys) +Z = generate(X, Y, 0.0) + +wframe = None +tstart = time.time() +for phi in np.linspace(0, 360 / 2 / np.pi, 100): + + oldcol = wframe + + Z = generate(X, Y, phi) + wframe = ax.plot_wireframe(X, Y, Z, rstride=2, cstride=2) + + # Remove old line collection before drawing + if oldcol is not None: + ax.collections.remove(oldcol) + + plt.draw() + +print 'FPS: %f' % (100 / (time.time() - tstart)) diff -Nru matplotlib-0.99.3/lib/mpl_examples/mplot3d/wire3d_demo.py matplotlib-1.0.1/lib/mpl_examples/mplot3d/wire3d_demo.py --- matplotlib-0.99.3/lib/mpl_examples/mplot3d/wire3d_demo.py 2009-08-22 21:06:13.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/mplot3d/wire3d_demo.py 2010-08-03 14:22:42.000000000 +0000 @@ -3,7 +3,7 @@ import numpy as np fig = plt.figure() -ax = axes3d.Axes3D(fig) +ax = fig.add_subplot(111, projection='3d') X, Y, Z = axes3d.get_test_data(0.05) ax.plot_wireframe(X, Y, Z, rstride=10, cstride=10) diff -Nru matplotlib-0.99.3/lib/mpl_examples/pylab_examples/accented_text.py matplotlib-1.0.1/lib/mpl_examples/pylab_examples/accented_text.py --- matplotlib-0.99.3/lib/mpl_examples/pylab_examples/accented_text.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/pylab_examples/accented_text.py 2010-09-23 19:54:49.000000000 +0000 @@ -11,6 +11,7 @@ """ from pylab import * +axes([0.1, 0.15, 0.8, 0.75]) plot(range(10)) title(r'$\ddot{o}\acute{e}\grave{e}\hat{O}\breve{i}\bar{A}\tilde{n}\vec{q}$', fontsize=20) diff -Nru matplotlib-0.99.3/lib/mpl_examples/pylab_examples/annotation_demo3.py matplotlib-1.0.1/lib/mpl_examples/pylab_examples/annotation_demo3.py --- matplotlib-0.99.3/lib/mpl_examples/pylab_examples/annotation_demo3.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/pylab_examples/annotation_demo3.py 2010-07-07 01:41:55.000000000 +0000 @@ -0,0 +1,101 @@ +import matplotlib.pyplot as plt + +fig = plt.figure(1) +fig.clf() + +ax1 = plt.subplot(121) +ax2 = plt.subplot(122) + +bbox_args = dict(boxstyle="round", fc="0.8") +arrow_args = dict(arrowstyle="->") + +ax1.annotate('figure fraction : 0, 0', xy=(0, 0), xycoords='figure fraction', + xytext=(20, 20), textcoords='offset points', + ha="left", va="bottom", + bbox=bbox_args, + arrowprops=arrow_args + ) + +ax1.annotate('figure fraction : 1, 1', xy=(1, 1), xycoords='figure fraction', + xytext=(-20, -20), textcoords='offset points', + ha="right", va="top", + bbox=bbox_args, + arrowprops=arrow_args + ) + +ax1.annotate('axes fraction : 0, 0', xy=(0, 0), xycoords='axes fraction', + xytext=(20, 20), textcoords='offset points', + ha="left", va="bottom", + bbox=bbox_args, + arrowprops=arrow_args + ) + +ax1.annotate('axes fraction : 1, 1', xy=(1, 1), xycoords='axes fraction', + xytext=(-20, -20), textcoords='offset points', + ha="right", va="top", + bbox=bbox_args, + arrowprops=arrow_args + ) + + +an1 = ax1.annotate('Drag me 1', xy=(.5, .7), xycoords='data', + #xytext=(.5, .7), textcoords='data', + ha="center", va="center", + bbox=bbox_args, + #arrowprops=arrow_args + ) + +an2 = ax1.annotate('Drag me 2', xy=(.5, .5), xycoords=an1, + xytext=(.5, .3), textcoords='axes fraction', + ha="center", va="center", + bbox=bbox_args, + arrowprops=dict(patchB=an1.get_bbox_patch(), + connectionstyle="arc3,rad=0.2", + **arrow_args) + ) + +an3 = ax1.annotate('', xy=(.5, .5), xycoords=an2, + xytext=(.5, .5), textcoords=an1, + ha="center", va="center", + bbox=bbox_args, + arrowprops=dict(patchA=an1.get_bbox_patch(), + patchB=an2.get_bbox_patch(), + connectionstyle="arc3,rad=0.2", + **arrow_args) + ) + + + +t = ax2.annotate('xy=(0, 1)\nxycoords=("data", "axes fraction")', + xy=(0, 1), xycoords=("data", 'axes fraction'), + xytext=(0, -20), textcoords='offset points', + ha="center", va="top", + bbox=bbox_args, + arrowprops=arrow_args + ) + +from matplotlib.text import OffsetFrom + +ax2.annotate('xy=(0.5, 0)\nxycoords=artist', + xy=(0.5, 0.), xycoords=t, + xytext=(0, -20), textcoords='offset points', + ha="center", va="top", + bbox=bbox_args, + arrowprops=arrow_args + ) + +ax2.annotate('xy=(0.8, 0.5)\nxycoords=ax1.transData', + xy=(0.8, 0.5), xycoords=ax1.transData, + xytext=(10, 10), textcoords=OffsetFrom(ax2.bbox, (0, 0), "points"), + ha="left", va="bottom", + bbox=bbox_args, + arrowprops=arrow_args + ) + +ax2.set_xlim(-2, 2) +ax2.set_ylim(-2, 2) + +an1.draggable() +an2.draggable() + +plt.show() diff -Nru matplotlib-0.99.3/lib/mpl_examples/pylab_examples/axes_props.py matplotlib-1.0.1/lib/mpl_examples/pylab_examples/axes_props.py --- matplotlib-0.99.3/lib/mpl_examples/pylab_examples/axes_props.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/pylab_examples/axes_props.py 2010-07-07 01:41:55.000000000 +0000 @@ -10,7 +10,7 @@ plot(t, s) grid(True) -# matlab style +# MATLAB style xticklines = getp(gca(), 'xticklines') yticklines = getp(gca(), 'yticklines') xgridlines = getp(gca(), 'xgridlines') diff -Nru matplotlib-0.99.3/lib/mpl_examples/pylab_examples/axes_zoom_effect.py matplotlib-1.0.1/lib/mpl_examples/pylab_examples/axes_zoom_effect.py --- matplotlib-0.99.3/lib/mpl_examples/pylab_examples/axes_zoom_effect.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/pylab_examples/axes_zoom_effect.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,7 +1,7 @@ from matplotlib.transforms import Bbox, TransformedBbox, \ blended_transform_factory -from mpl_toolkits.axes_grid.inset_locator import BboxPatch, BboxConnector,\ +from mpl_toolkits.axes_grid1.inset_locator import BboxPatch, BboxConnector,\ BboxConnectorPatch diff -Nru matplotlib-0.99.3/lib/mpl_examples/pylab_examples/barchart_demo.py matplotlib-1.0.1/lib/mpl_examples/pylab_examples/barchart_demo.py --- matplotlib-0.99.3/lib/mpl_examples/pylab_examples/barchart_demo.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/pylab_examples/barchart_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -12,11 +12,17 @@ plt.subplot(111) -rects1 = plt.bar(ind, menMeans, width, color='r', yerr=menStd) +rects1 = plt.bar(ind, menMeans, width, + color='r', + yerr=menStd, + error_kw=dict(elinewidth=6, ecolor='pink')) womenMeans = (25, 32, 34, 20, 25) womenStd = (3, 5, 2, 3, 3) -rects2 = plt.bar(ind+width, womenMeans, width, color='y', yerr=womenStd) +rects2 = plt.bar(ind+width, womenMeans, width, + color='y', + yerr=womenStd, + error_kw=dict(elinewidth=6, ecolor='yellow')) # add some plt.ylabel('Scores') diff -Nru matplotlib-0.99.3/lib/mpl_examples/pylab_examples/boxplot_demo3.py matplotlib-1.0.1/lib/mpl_examples/pylab_examples/boxplot_demo3.py --- matplotlib-0.99.3/lib/mpl_examples/pylab_examples/boxplot_demo3.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/pylab_examples/boxplot_demo3.py 2010-07-07 01:41:55.000000000 +0000 @@ -0,0 +1,27 @@ +import matplotlib.pyplot as plt +import matplotlib.transforms as mtransforms +import numpy as np + +np.random.seed(2) +inc = 0.1 +e1 = np.random.uniform(0,1, size=(500,)) +e2 = np.random.uniform(0,1, size=(500,)) +e3 = np.random.uniform(0,1 + inc, size=(500,)) +e4 = np.random.uniform(0,1 + 2*inc, size=(500,)) + +treatments = [e1,e2,e3,e4] + +fig = plt.figure() +ax = fig.add_subplot(111) +pos = np.array(range(len(treatments)))+1 +bp = ax.boxplot( treatments, sym='k+', patch_artist=True, + positions=pos, notch=1, bootstrap=5000 ) +text_transform= mtransforms.blended_transform_factory(ax.transData, + ax.transAxes) +ax.set_xlabel('treatment') +ax.set_ylabel('response') +ax.set_ylim(-0.2, 1.4) +plt.setp(bp['whiskers'], color='k', linestyle='-' ) +plt.setp(bp['fliers'], markersize=3.0) +fig.subplots_adjust(right=0.99,top=0.99) +plt.show() diff -Nru matplotlib-0.99.3/lib/mpl_examples/pylab_examples/centered_ticklabels.py matplotlib-1.0.1/lib/mpl_examples/pylab_examples/centered_ticklabels.py --- matplotlib-0.99.3/lib/mpl_examples/pylab_examples/centered_ticklabels.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/pylab_examples/centered_ticklabels.py 2010-07-07 01:41:55.000000000 +0000 @@ -15,12 +15,13 @@ import datetime import numpy as np import matplotlib +import matplotlib.cbook as cbook import matplotlib.dates as dates import matplotlib.ticker as ticker import matplotlib.pyplot as plt # load some financial data; apple's stock price -fh = matplotlib.get_example_data('aapl.npy') +fh = cbook.get_sample_data('aapl.npy') r = np.load(fh); fh.close() r = r[-250:] # get the last 250 days diff -Nru matplotlib-0.99.3/lib/mpl_examples/pylab_examples/clippedline.py matplotlib-1.0.1/lib/mpl_examples/pylab_examples/clippedline.py --- matplotlib-0.99.3/lib/mpl_examples/pylab_examples/clippedline.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/pylab_examples/clippedline.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,6 +1,11 @@ """ Clip a line according to the current xlimits, and change the marker -style when zoomed in +style when zoomed in. + +It is not clear this example is still needed or valid; clipping +is now automatic for Line2D objects when x is sorted in +ascending order. + """ from matplotlib.lines import Line2D @@ -19,8 +24,7 @@ def set_data(self, *args, **kwargs): Line2D.set_data(self, *args, **kwargs) - if self._invalid: - self.recache() + self.recache() self.xorig = np.array(self._x) self.yorig = np.array(self._y) diff -Nru matplotlib-0.99.3/lib/mpl_examples/pylab_examples/color_demo.py matplotlib-1.0.1/lib/mpl_examples/pylab_examples/color_demo.py --- matplotlib-0.99.3/lib/mpl_examples/pylab_examples/color_demo.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/pylab_examples/color_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -2,7 +2,7 @@ """ matplotlib gives you 4 ways to specify colors, - 1) as a single letter string, ala matlab + 1) as a single letter string, ala MATLAB 2) as an html style hex string or html color name diff -Nru matplotlib-0.99.3/lib/mpl_examples/pylab_examples/contourf_demo.py matplotlib-1.0.1/lib/mpl_examples/pylab_examples/contourf_demo.py --- matplotlib-0.99.3/lib/mpl_examples/pylab_examples/contourf_demo.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/pylab_examples/contourf_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -3,15 +3,7 @@ origin = 'lower' #origin = 'upper' -# The following controls only interior masking. -test_masking = False # There is a bug in filled contour masking with - # interior masks. - -if test_masking: - # Use a coarse grid so only a few masked points are needed. - delta = 0.5 -else: - delta = 0.025 +delta = 0.025 x = y = arange(-3.0, 3.01, delta) X, Y = meshgrid(x, y) @@ -19,19 +11,6 @@ Z2 = bivariate_normal(X, Y, 1.5, 0.5, 1, 1) Z = 10 * (Z1 - Z2) -# interior badmask doesn't work yet for filled contours -if test_masking: - badmask = zeros(shape(Z)) - - badmask[5,5] = 1 - badmask[5,6] = 1 - Z[5,5] = 0 - Z[5,6] = 0 - - badmask[0,0] = 1 - Z[0,0] = 0 - Z = ma.array(Z, mask=badmask) - nr, nc = Z.shape # put NaNs in one corner: @@ -43,6 +22,10 @@ # mask another corner: Z[:nr//6, :nc//6] = ma.masked +# mask a circle in the middle: +interior = sqrt((X**2) + (Y**2)) < 0.5 +Z[interior] = ma.masked + # We are using automatic selection of contour levels; # this is usually not such a good idea, because they don't @@ -55,14 +38,15 @@ # Note that in the following, we explicitly pass in a subset of # the contour levels used for the filled contours. Alternatively, -# We could pass in additional levels to provide extra resolution. +# We could pass in additional levels to provide extra resolution, +# or leave out the levels kwarg to use all of the original levels. -CS2 = contour(X, Y, Z, CS.levels[::2], +CS2 = contour(CS, levels=CS.levels[::2], colors = 'r', origin=origin, hold='on') -title('Nonsense (with 2 masked corners)') +title('Nonsense (3 masked regions)') xlabel('word length anomaly') ylabel('sentence length anomaly') @@ -77,17 +61,26 @@ # Now make a contour plot with the levels specified, # and with the colormap generated automatically from a list # of colors. -levels = [-2, -1.5, -1, -0.5, 0, 0.5, 1, 1.5] +levels = [-1.5, -1, -0.5, 0, 0.5, 1] CS3 = contourf(X, Y, Z, levels, colors = ('r', 'g', 'b'), - origin=origin) + origin=origin, + extend='both') +# Our data range extends outside the range of levels; make +# data below the lowest contour level yellow, and above the +# highest level cyan: +CS3.cmap.set_under('yellow') +CS3.cmap.set_over('cyan') CS4 = contour(X, Y, Z, levels, colors = ('k',), linewidths = (3,), origin = origin) -title('Listed colors (with 2 masked corners)') +title('Listed colors (3 masked regions)') clabel(CS4, fmt = '%2.1f', colors = 'w', fontsize=14) + +# Notice that the colorbar command gets all the information it +# needs from the ContourSet object, CS3. colorbar(CS3) show() diff -Nru matplotlib-0.99.3/lib/mpl_examples/pylab_examples/contour_image.py matplotlib-1.0.1/lib/mpl_examples/pylab_examples/contour_image.py --- matplotlib-0.99.3/lib/mpl_examples/pylab_examples/contour_image.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/pylab_examples/contour_image.py 2010-07-07 01:41:55.000000000 +0000 @@ -67,7 +67,7 @@ imshow(Z, extent=extent) v = axis() -contour(Z, cset3.levels, hold='on', colors = 'k', +contour(Z, levels, hold='on', colors = 'k', origin='upper', extent=extent) axis(v) title("Image, origin 'upper'") @@ -76,7 +76,7 @@ imshow(Z, origin='lower', extent=extent) v = axis() -contour(Z, cset3.levels, hold='on', colors = 'k', +contour(Z, levels, hold='on', colors = 'k', origin='lower', extent=extent) axis(v) title("Image, origin 'lower'") @@ -91,7 +91,7 @@ # domain that is contoured does not extend beyond these pixel centers. im = imshow(Z, interpolation='nearest', extent=extent) v = axis() -contour(Z, cset3.levels, hold='on', colors = 'k', +contour(Z, levels, hold='on', colors = 'k', origin='image', extent=extent) axis(v) ylim = get(gca(), 'ylim') diff -Nru matplotlib-0.99.3/lib/mpl_examples/pylab_examples/cursor_demo.py matplotlib-1.0.1/lib/mpl_examples/pylab_examples/cursor_demo.py --- matplotlib-0.99.3/lib/mpl_examples/pylab_examples/cursor_demo.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/pylab_examples/cursor_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -15,22 +15,19 @@ class Cursor: def __init__(self, ax): self.ax = ax - self.lx, = ax.plot( (0,0), (0,0), 'k-' ) # the horiz line - self.ly, = ax.plot( (0,0), (0,0), 'k-' ) # the vert line + self.lx = ax.axhline(color='k') # the horiz line + self.ly = ax.axvline(color='k') # the vert line # text location in axes coords self.txt = ax.text( 0.7, 0.9, '', transform=ax.transAxes) def mouse_move(self, event): if not event.inaxes: return - ax = event.inaxes - minx, maxx = ax.get_xlim() - miny, maxy = ax.get_ylim() x, y = event.xdata, event.ydata # update the line positions - self.lx.set_data( (minx, maxx), (y, y) ) - self.ly.set_data( (x, x), (miny, maxy) ) + self.lx.set_ydata(y ) + self.ly.set_xdata(x ) self.txt.set_text( 'x=%1.2f, y=%1.2f'%(x,y) ) draw() @@ -43,8 +40,8 @@ """ def __init__(self, ax, x, y): self.ax = ax - self.lx, = ax.plot( (0,0), (0,0), 'k-' ) # the horiz line - self.ly, = ax.plot( (0,0), (0,0), 'k-' ) # the vert line + self.lx = ax.axhline(color='k') # the horiz line + self.ly = ax.axvline(color='k') # the vert line self.x = x self.y = y # text location in axes coords @@ -53,9 +50,6 @@ def mouse_move(self, event): if not event.inaxes: return - ax = event.inaxes - minx, maxx = ax.get_xlim() - miny, maxy = ax.get_ylim() x, y = event.xdata, event.ydata @@ -63,8 +57,8 @@ x = self.x[indx] y = self.y[indx] # update the line positions - self.lx.set_data( (minx, maxx), (y, y) ) - self.ly.set_data( (x, x), (miny, maxy) ) + self.lx.set_ydata(y ) + self.ly.set_xdata(x ) self.txt.set_text( 'x=%1.2f, y=%1.2f'%(x,y) ) print 'x=%1.2f, y=%1.2f'%(x,y) @@ -81,3 +75,4 @@ ax.plot(t, s, 'o') axis([0,1,-1,1]) show() + diff -Nru matplotlib-0.99.3/lib/mpl_examples/pylab_examples/data_helper.py matplotlib-1.0.1/lib/mpl_examples/pylab_examples/data_helper.py --- matplotlib-0.99.3/lib/mpl_examples/pylab_examples/data_helper.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/pylab_examples/data_helper.py 2010-07-07 01:41:55.000000000 +0000 @@ -2,7 +2,7 @@ # Some functions to load a return data for the plot demos from numpy import fromstring, argsort, take, array, resize - +import matplotlib.cbook as cbook def get_two_stock_data(): """ load stock time and price data for two stocks The return values @@ -10,11 +10,14 @@ and 2 (intc and aapl) """ ticker1, ticker2 = 'INTC', 'AAPL' - M1 = fromstring( file('../data/%s.dat' % ticker1, 'rb').read(), '")) + ax.add_artist(ab) + + offsetbox = TextArea("Test", minimumdescent=False) + + ab = AnnotationBbox(offsetbox, xy, + xybox=(1.02, xy[1]), + xycoords='data', + boxcoords=("axes fraction", "data"), + box_alignment=(0.,0.5), + arrowprops=dict(arrowstyle="->")) + ax.add_artist(ab) + + + from matplotlib.patches import Circle + da = DrawingArea(20, 20, 0, 0) + p = Circle((10, 10), 10) + da.add_artist(p) + + xy = [0.3, 0.55] + ab = AnnotationBbox(da, xy, + xybox=(1.02, xy[1]), + xycoords='data', + boxcoords=("axes fraction", "data"), + box_alignment=(0.,0.5), + arrowprops=dict(arrowstyle="->")) + #arrowprops=None) + + ax.add_artist(ab) + + + arr = np.arange(100).reshape((10,10)) + im = OffsetImage(arr, zoom=2) + + ab = AnnotationBbox(im, xy, + xybox=(-50., 50.), + xycoords='data', + boxcoords="offset points", + pad=0.3, + arrowprops=dict(arrowstyle="->")) + #arrowprops=None) + + ax.add_artist(ab) + + + # another image + + + from matplotlib._png import read_png + fn = get_sample_data("lena.png", asfileobj=False) + arr_lena = read_png(fn) + + imagebox = OffsetImage(arr_lena, zoom=0.2) + + ab = AnnotationBbox(imagebox, xy, + xybox=(120., -80.), + xycoords='data', + boxcoords="offset points", + pad=0.5, + arrowprops=dict(arrowstyle="->", + connectionstyle="angle,angleA=0,angleB=90,rad=3") + ) + + + ax.add_artist(ab) + + ax.set_xlim(0, 1) + ax.set_ylim(0, 1) + + + plt.draw() + plt.show() diff -Nru matplotlib-0.99.3/lib/mpl_examples/pylab_examples/demo_bboximage.py matplotlib-1.0.1/lib/mpl_examples/pylab_examples/demo_bboximage.py --- matplotlib-0.99.3/lib/mpl_examples/pylab_examples/demo_bboximage.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/pylab_examples/demo_bboximage.py 2010-07-07 01:41:55.000000000 +0000 @@ -0,0 +1,62 @@ +import matplotlib.pyplot as plt +import numpy as np +from matplotlib.image import BboxImage +from matplotlib.transforms import Bbox, TransformedBbox + +if __name__ == "__main__": + + fig = plt.figure(1) + ax = plt.subplot(121) + + txt = ax.text(0.5, 0.5, "test", size=30, ha="center", color="w") + kwargs = dict() + + bbox_image = BboxImage(txt.get_window_extent, + norm = None, + origin=None, + clip_on=False, + **kwargs + ) + a = np.arange(256).reshape(1,256)/256. + bbox_image.set_data(a) + ax.add_artist(bbox_image) + + + ax = plt.subplot(122) + a = np.linspace(0, 1, 256).reshape(1,-1) + a = np.vstack((a,a)) + + maps = sorted(m for m in plt.cm.datad if not m.endswith("_r")) + #nmaps = len(maps) + 1 + + #fig.subplots_adjust(top=0.99, bottom=0.01, left=0.2, right=0.99) + + ncol = 2 + nrow = len(maps)//ncol + 1 + + xpad_fraction = 0.3 + dx = 1./(ncol + xpad_fraction*(ncol-1)) + + ypad_fraction = 0.3 + dy = 1./(nrow + ypad_fraction*(nrow-1)) + + for i,m in enumerate(maps): + ix, iy = divmod(i, nrow) + #plt.figimage(a, 10, i*10, cmap=plt.get_cmap(m), origin='lower') + bbox0 = Bbox.from_bounds(ix*dx*(1+xpad_fraction), + 1.-iy*dy*(1+ypad_fraction)-dy, + dx, dy) + bbox = TransformedBbox(bbox0, ax.transAxes) + + bbox_image = BboxImage(bbox, + cmap = plt.get_cmap(m), + norm = None, + origin=None, + **kwargs + ) + + bbox_image.set_data(a) + ax.add_artist(bbox_image) + + plt.draw() + plt.show() diff -Nru matplotlib-0.99.3/lib/mpl_examples/pylab_examples/demo_ribbon_box.py matplotlib-1.0.1/lib/mpl_examples/pylab_examples/demo_ribbon_box.py --- matplotlib-0.99.3/lib/mpl_examples/pylab_examples/demo_ribbon_box.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/pylab_examples/demo_ribbon_box.py 2010-07-07 01:41:55.000000000 +0000 @@ -0,0 +1,141 @@ +import matplotlib.pyplot as plt +import numpy as np +from matplotlib.image import BboxImage + +from matplotlib._png import read_png +import matplotlib.colors +from matplotlib.cbook import get_sample_data + +class RibbonBox(object): + + original_image = read_png(get_sample_data("Minduka_Present_Blue_Pack.png", + asfileobj=False)) + cut_location = 70 + b_and_h = original_image[:,:,2] + color = original_image[:,:,2] - original_image[:,:,0] + alpha = original_image[:,:,3] + nx = original_image.shape[1] + + def __init__(self, color): + rgb = matplotlib.colors.colorConverter.to_rgb(color) + + im = np.empty(self.original_image.shape, + self.original_image.dtype) + + + im[:,:,:3] = self.b_and_h[:,:,np.newaxis] + im[:,:,:3] -= self.color[:,:,np.newaxis]*(1.-np.array(rgb)) + im[:,:,3] = self.alpha + + self.im = im + + + def get_stretched_image(self, stretch_factor): + stretch_factor = max(stretch_factor, 1) + ny, nx, nch = self.im.shape + ny2 = int(ny*stretch_factor) + + stretched_image = np.empty((ny2, nx, nch), + self.im.dtype) + cut = self.im[self.cut_location,:,:] + stretched_image[:,:,:] = cut + stretched_image[:self.cut_location,:,:] = \ + self.im[:self.cut_location,:,:] + stretched_image[-(ny-self.cut_location):,:,:] = \ + self.im[-(ny-self.cut_location):,:,:] + + self._cached_im = stretched_image + return stretched_image + + + +class RibbonBoxImage(BboxImage): + zorder = 1 + + def __init__(self, bbox, color, + cmap = None, + norm = None, + interpolation=None, + origin=None, + filternorm=1, + filterrad=4.0, + resample = False, + **kwargs + ): + + BboxImage.__init__(self, bbox, + cmap = cmap, + norm = norm, + interpolation=interpolation, + origin=origin, + filternorm=filternorm, + filterrad=filterrad, + resample = resample, + **kwargs + ) + + self._ribbonbox = RibbonBox(color) + self._cached_ny = None + + + def draw(self, renderer, *args, **kwargs): + + bbox = self.get_window_extent(renderer) + stretch_factor = bbox.height / bbox.width + + ny = int(stretch_factor*self._ribbonbox.nx) + if self._cached_ny != ny: + arr = self._ribbonbox.get_stretched_image(stretch_factor) + self.set_array(arr) + self._cached_ny = ny + + BboxImage.draw(self, renderer, *args, **kwargs) + + +if 1: + from matplotlib.transforms import Bbox, TransformedBbox + from matplotlib.ticker import ScalarFormatter + + fig = plt.gcf() + fig.clf() + ax = plt.subplot(111) + + years = np.arange(2004, 2009) + box_colors = [(0.8, 0.2, 0.2), + (0.2, 0.8, 0.2), + (0.2, 0.2, 0.8), + (0.7, 0.5, 0.8), + (0.3, 0.8, 0.7), + ] + heights = np.random.random(years.shape) * 7000 + 3000 + + fmt = ScalarFormatter(useOffset=False) + ax.xaxis.set_major_formatter(fmt) + + for year, h, bc in zip(years, heights, box_colors): + bbox0 = Bbox.from_extents(year-0.4, 0., year+0.4, h) + bbox = TransformedBbox(bbox0, ax.transData) + rb_patch = RibbonBoxImage(bbox, bc, interpolation="bicubic") + + ax.add_artist(rb_patch) + + ax.annotate(r"%d" % (int(h/100.)*100), + (year, h), va="bottom", ha="center") + + patch_gradient = BboxImage(ax.bbox, + interpolation="bicubic", + zorder=0.1, + ) + gradient = np.zeros((2, 2, 4), dtype=np.float) + gradient[:,:,:3] = [1, 1, 0.] + gradient[:,:,3] = [[0.1, 0.3],[0.3, 0.5]] # alpha channel + patch_gradient.set_array(gradient) + ax.add_artist(patch_gradient) + + + ax.set_xlim(years[0]-0.5, years[-1]+0.5) + ax.set_ylim(0, 10000) + + fig.savefig('ribbon_box.png') + plt.show() + diff -Nru matplotlib-0.99.3/lib/mpl_examples/pylab_examples/demo_text_path.py matplotlib-1.0.1/lib/mpl_examples/pylab_examples/demo_text_path.py --- matplotlib-0.99.3/lib/mpl_examples/pylab_examples/demo_text_path.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/pylab_examples/demo_text_path.py 2010-11-09 13:28:22.000000000 +0000 @@ -0,0 +1,155 @@ + +# -*- coding: utf-8 -*- + +import matplotlib.pyplot as plt +from matplotlib.image import BboxImage +import numpy as np +from matplotlib.transforms import IdentityTransform + +import matplotlib.patches as mpatches + +from matplotlib.offsetbox import AnnotationBbox,\ + AnchoredOffsetbox, AuxTransformBox + +from matplotlib.cbook import get_sample_data + +from matplotlib.text import TextPath + + +class PathClippedImagePatch(mpatches.PathPatch): + """ + The given image is used to draw the face of the patch. Internally, + it uses BboxImage whose clippath set to the path of the patch. + + FIXME : The result is currently dpi dependent. + """ + def __init__(self, path, bbox_image, **kwargs): + mpatches.PathPatch.__init__(self, path, **kwargs) + self._init_bbox_image(bbox_image) + + def set_facecolor(self, color): + """simply ignore facecolor""" + mpatches.PathPatch.set_facecolor(self, "none") + + def _init_bbox_image(self, im): + + bbox_image = BboxImage(self.get_window_extent, + norm = None, + origin=None, + ) + bbox_image.set_transform(IdentityTransform()) + + bbox_image.set_data(im) + self.bbox_image = bbox_image + + def draw(self, renderer=None): + + + # the clip path must be updated every draw. any solution? -JJ + self.bbox_image.set_clip_path(self._path, self.get_transform()) + self.bbox_image.draw(renderer) + + mpatches.PathPatch.draw(self, renderer) + + +if 1: + + usetex = plt.rcParams["text.usetex"] + + fig = plt.figure(1) + + # EXAMPLE 1 + + ax = plt.subplot(211) + + from matplotlib._png import read_png + fn = get_sample_data("lena.png", asfileobj=False) + arr = read_png(fn) + + text_path = TextPath((0, 0), "!?", size=150) + p = PathClippedImagePatch(text_path, arr, ec="k", + transform=IdentityTransform()) + + #p.set_clip_on(False) + + # make offset box + offsetbox = AuxTransformBox(IdentityTransform()) + offsetbox.add_artist(p) + + # make anchored offset box + ao = AnchoredOffsetbox(loc=2, child=offsetbox, frameon=True, borderpad=0.2) + ax.add_artist(ao) + + # another text + from matplotlib.patches import PathPatch + if usetex: + r = r"\mbox{textpath supports mathtext \& \TeX}" + else: + r = r"textpath supports mathtext & TeX" + + text_path = TextPath((0, 0), r, + size=20, usetex=usetex) + + p1 = PathPatch(text_path, ec="w", lw=3, fc="w", alpha=0.9, + transform=IdentityTransform()) + p2 = PathPatch(text_path, ec="none", fc="k", + transform=IdentityTransform()) + + offsetbox2 = AuxTransformBox(IdentityTransform()) + offsetbox2.add_artist(p1) + offsetbox2.add_artist(p2) + + ab = AnnotationBbox(offsetbox2, (0.95, 0.05), + xycoords='axes fraction', + boxcoords="offset points", + box_alignment=(1.,0.), + frameon=False + ) + ax.add_artist(ab) + + ax.imshow([[0,1,2],[1,2,3]], cmap=plt.cm.gist_gray_r, + interpolation="bilinear", + aspect="auto") + + + + # EXAMPLE 2 + + ax = plt.subplot(212) + + arr = np.arange(256).reshape(1,256)/256. + + if usetex: + s = r"$\displaystyle\left[\sum_{n=1}^\infty\frac{-e^{i\pi}}{2^n}\right]$!" + else: + s = r"$\left[\sum_{n=1}^\infty\frac{-e^{i\pi}}{2^n}\right]$!" + text_path = TextPath((0, 0), s, size=40, usetex=usetex) + text_patch = PathClippedImagePatch(text_path, arr, ec="none", + transform=IdentityTransform()) + + shadow1 = mpatches.Shadow(text_patch, 1, -1, props=dict(fc="none", ec="0.6", lw=3)) + shadow2 = mpatches.Shadow(text_patch, 1, -1, props=dict(fc="0.3", ec="none")) + + + # make offset box + offsetbox = AuxTransformBox(IdentityTransform()) + offsetbox.add_artist(shadow1) + offsetbox.add_artist(shadow2) + offsetbox.add_artist(text_patch) + + # place the anchored offset box using AnnotationBbox + ab = AnnotationBbox(offsetbox, (0.5, 0.5), + xycoords='data', + boxcoords="offset points", + box_alignment=(0.5,0.5), + ) + #text_path.set_size(10) + + ax.add_artist(ab) + + ax.set_xlim(0, 1) + ax.set_ylim(0, 1) + + + plt.draw() + plt.show() diff -Nru matplotlib-0.99.3/lib/mpl_examples/pylab_examples/demo_text_rotation_mode.py matplotlib-1.0.1/lib/mpl_examples/pylab_examples/demo_text_rotation_mode.py --- matplotlib-0.99.3/lib/mpl_examples/pylab_examples/demo_text_rotation_mode.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/pylab_examples/demo_text_rotation_mode.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,11 +1,11 @@ #clf() -from mpl_toolkits.axes_grid.axes_grid import AxesGrid +from mpl_toolkits.axes_grid1.axes_grid import ImageGrid def test_rotation_mode(fig, mode, subplot_location): ha_list = "left center right".split() va_list = "top center baseline bottom".split() - grid = AxesGrid(fig, subplot_location, + grid = ImageGrid(fig, subplot_location, nrows_ncols=(len(va_list), len(ha_list)), share_all=True, aspect=True, #label_mode='1', cbar_mode=None) diff -Nru matplotlib-0.99.3/lib/mpl_examples/pylab_examples/dolphin.py matplotlib-1.0.1/lib/mpl_examples/pylab_examples/dolphin.py --- matplotlib-0.99.3/lib/mpl_examples/pylab_examples/dolphin.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/pylab_examples/dolphin.py 2010-07-07 01:41:55.000000000 +0000 @@ -20,7 +20,7 @@ im = plt.imshow(np.random.random((100, 100)), origin='lower', cmap=cm.winter, interpolation='spline36', - extent=([-1, 1, -1, 1]), zorder=1000) + extent=([-1, 1, -1, 1])) im.set_clip_path(circle) plt.plot(x, y, 'o', color=(0.9, 0.9, 1.0), alpha=0.8) diff -Nru matplotlib-0.99.3/lib/mpl_examples/pylab_examples/errorbar_demo.py matplotlib-1.0.1/lib/mpl_examples/pylab_examples/errorbar_demo.py --- matplotlib-0.99.3/lib/mpl_examples/pylab_examples/errorbar_demo.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/pylab_examples/errorbar_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,46 +1,48 @@ #!/usr/bin/env python -from pylab import * +import numpy as np +import matplotlib.pyplot as plt -t = arange(0.1, 4, 0.1) -s = exp(-t) -e = 0.1*abs(randn(len(s))) -f = 0.1*abs(randn(len(s))) -g = 2*e -h = 2*f +# example data +x = np.arange(0.1, 4, 0.5) +y = np.exp(-x) + +# example variable error bar values +yerr = 0.1 + 0.2*np.sqrt(x) +xerr = 0.1 + yerr + +# First illustrate basic pyplot interface, using defaults where possible. +plt.figure() +plt.errorbar(x, y, xerr=0.2, yerr=0.4) +plt.title("Simplest errorbars, 0.2 in x, 0.4 in y") + +# Now switch to a more OO interface to exercise more features. +fig, axs = plt.subplots(nrows=2, ncols=2, sharex=True) +ax = axs[0,0] +ax.errorbar(x, y, yerr=yerr, fmt='o') +ax.set_title('Vert. symmetric') + +# With 4 subplots, reduce the number of axis ticks to avoid crowding. +ax.locator_params(nbins=4) + +ax = axs[0,1] +ax.errorbar(x, y, xerr=xerr, fmt='o') +ax.set_title('Hor. symmetric') + +ax = axs[1,0] +ax.errorbar(x, y, yerr=[yerr, 2*yerr], xerr=[xerr, 2*xerr], fmt='--o') +ax.set_title('H, V asymmetric') -figure() -errorbar(t, s, e, fmt='o') # vertical symmetric - -figure() -errorbar(t, s, None, f, fmt='o') # horizontal symmetric - -figure() -errorbar(t, s, e, f, fmt='o') # both symmetric - -figure() -errorbar(t, s, [e,g], [f,h], fmt='--o') # both asymmetric - -figure() -errorbar(t, s, [e,g], f, fmt='o', ecolor='g') # both mixed - -figure() -errorbar(t, s, e, [f,h], fmt='o') # both mixed - -figure() -errorbar(t, s, [e,g], fmt='o') # vertical asymmetric +ax = axs[1,1] +ax.set_yscale('log') +# Here we have to be careful to keep all y values positive: +ylower = np.maximum(1e-2, y - yerr) +yerr_lower = y - ylower -figure() -errorbar(t, s, yerr=e, fmt='o') # named +ax.errorbar(x, y, yerr=[yerr_lower, 2*yerr], xerr=xerr, + fmt='o', ecolor='g') +ax.set_title('Mixed sym., log y') -figure() -errorbar(t, s, xerr=f, fmt='o') # named -xlabel('Distance (m)') -ylabel('Height (m)') -title('Mean and standard error as a function of distance') +fig.suptitle('Variable errorbars') -figure() -ax = subplot(111) -ax.set_yscale('log') -errorbar(t, s+2, e, f, fmt='o') # both symmetric +plt.show() -show() diff -Nru matplotlib-0.99.3/lib/mpl_examples/pylab_examples/fancyarrow_demo.py matplotlib-1.0.1/lib/mpl_examples/pylab_examples/fancyarrow_demo.py --- matplotlib-0.99.3/lib/mpl_examples/pylab_examples/fancyarrow_demo.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/pylab_examples/fancyarrow_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -4,7 +4,7 @@ styles = mpatches.ArrowStyle.get_styles() ncol=2 -nrow = len(styles) // ncol + 1 +nrow = (len(styles)+1) // ncol figheight = (nrow+0.5) fig1 = plt.figure(1, (4.*ncol/1.5, figheight/1.5)) fontsize = 0.2 * 70 @@ -15,13 +15,19 @@ ax.set_xlim(0, 4*ncol) ax.set_ylim(0, figheight) +def to_texstring(s): + s = s.replace("<", r"$<$") + s = s.replace(">", r"$>$") + s = s.replace("|", r"$|$") + return s + for i, (stylename, styleclass) in enumerate(sorted(styles.items())): x = 3.2 + (i//nrow)*4 y = (figheight - 0.7 - i%nrow) # /figheight p = mpatches.Circle((x, y), 0.2, fc="w") ax.add_patch(p) - ax.annotate(stylename, (x, y), + ax.annotate(to_texstring(stylename), (x, y), (x-1.2, y), #xycoords="figure fraction", textcoords="figure fraction", ha="right", va="center", diff -Nru matplotlib-0.99.3/lib/mpl_examples/pylab_examples/figimage_demo.py matplotlib-1.0.1/lib/mpl_examples/pylab_examples/figimage_demo.py --- matplotlib-0.99.3/lib/mpl_examples/pylab_examples/figimage_demo.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/pylab_examples/figimage_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,5 +1,6 @@ """ -See pcolor_demo2 for a much faster way of generating pcolor plots +This illustrates placing images directly in the figure, with no axes. + """ import numpy as np import matplotlib @@ -15,13 +16,6 @@ im1 = plt.figimage(Z, xo=50, yo=0, cmap=cm.jet, origin='lower') im2 = plt.figimage(Z, xo=100, yo=100, alpha=.8, cmap=cm.jet, origin='lower') - -if 0: - dpi = 72 - plt.savefig('figimage_%d.png'%dpi, dpi=dpi, facecolor='gray') - plt.savefig('figimage_%d.pdf'%dpi, dpi=dpi, facecolor='gray') - plt.savefig('figimage_%d.svg'%dpi, dpi=dpi, facecolor='gray') - plt.savefig('figimage_%d.eps'%dpi, dpi=dpi, facecolor='gray') plt.show() diff -Nru matplotlib-0.99.3/lib/mpl_examples/pylab_examples/fill_between_demo.py matplotlib-1.0.1/lib/mpl_examples/pylab_examples/fill_between_demo.py --- matplotlib-0.99.3/lib/mpl_examples/pylab_examples/fill_between_demo.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/pylab_examples/fill_between_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -29,16 +29,16 @@ fig = figure() ax = fig.add_subplot(211) ax.plot(x, y1, x, y2, color='black') -ax.fill_between(x, y1, y2, where=y2>=y1, facecolor='green') -ax.fill_between(x, y1, y2, where=y2<=y1, facecolor='red') +ax.fill_between(x, y1, y2, where=y2>=y1, facecolor='green', interpolate=True) +ax.fill_between(x, y1, y2, where=y2<=y1, facecolor='red', interpolate=True) ax.set_title('fill between where') # Test support for masked arrays. y2 = np.ma.masked_greater(y2, 1.0) ax1 = fig.add_subplot(212, sharex=ax) ax1.plot(x, y1, x, y2, color='black') -ax1.fill_between(x, y1, y2, where=y2>=y1, facecolor='green') -ax1.fill_between(x, y1, y2, where=y2<=y1, facecolor='red') +ax1.fill_between(x, y1, y2, where=y2>=y1, facecolor='green', interpolate=True) +ax1.fill_between(x, y1, y2, where=y2<=y1, facecolor='red', interpolate=True) ax1.set_title('Now regions with y2>1 are masked') # This example illustrates a problem; because of the data diff -Nru matplotlib-0.99.3/lib/mpl_examples/pylab_examples/filledmarker_demo.py matplotlib-1.0.1/lib/mpl_examples/pylab_examples/filledmarker_demo.py --- matplotlib-0.99.3/lib/mpl_examples/pylab_examples/filledmarker_demo.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/pylab_examples/filledmarker_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -0,0 +1,38 @@ +import itertools + +import numpy as np +import matplotlib.lines as mlines +import matplotlib.pyplot as plt + +colors = itertools.cycle(['b', 'g', 'r', 'c', 'm', 'y', 'k']) +altcolor = 'lightgreen' + +plt.rcParams['text.usetex'] = False # otherwise, '^' will cause trouble + +y = np.arange(10) +for marker in mlines.Line2D.filled_markers: + f = plt.figure() + f.text(.5,.95, "marker = %r" % marker, ha='center') + for i,fs in enumerate(mlines.Line2D.fillStyles): + color = colors.next() + + ax = f.add_subplot(121) + ax.plot(2*(4-i)+y, c=color, + marker=marker, + markersize=20, + fillstyle=fs, + label=fs) + ax.legend(loc=2) + ax.set_title('fillstyle') + + ax = f.add_subplot(122) + ax.plot(2*(4-i)+y, c=color, + marker=marker, + markersize=20, + markerfacecoloralt=altcolor, + fillstyle=fs, + label=fs) + ax.legend(loc=2) + ax.set_title('fillstyle') + +plt.show() diff -Nru matplotlib-0.99.3/lib/mpl_examples/pylab_examples/finance_demo.py matplotlib-1.0.1/lib/mpl_examples/pylab_examples/finance_demo.py --- matplotlib-0.99.3/lib/mpl_examples/pylab_examples/finance_demo.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/pylab_examples/finance_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,14 +1,13 @@ #!/usr/bin/env python from pylab import * from matplotlib.dates import DateFormatter, WeekdayLocator, HourLocator, \ - DayLocator, MONDAY, timezone + DayLocator, MONDAY from matplotlib.finance import quotes_historical_yahoo, candlestick,\ plot_day_summary, candlestick2 -import datetime - -date1 = datetime.date( 2004, 2, 1) -date2 = datetime.date( 2004, 4, 12 ) +# (Year, month, day) tuples suffice as args for quotes_historical_yahoo +date1 = ( 2004, 2, 1) +date2 = ( 2004, 4, 12 ) mondays = WeekdayLocator(MONDAY) # major ticks on the mondays @@ -16,9 +15,8 @@ weekFormatter = DateFormatter('%b %d') # Eg, Jan 12 dayFormatter = DateFormatter('%d') # Eg, 12 -quotes = quotes_historical_yahoo( - 'INTC', date1, date2) -if not quotes: +quotes = quotes_historical_yahoo('INTC', date1, date2) +if len(quotes) == 0: raise SystemExit fig = figure() diff -Nru matplotlib-0.99.3/lib/mpl_examples/pylab_examples/griddata_demo.py matplotlib-1.0.1/lib/mpl_examples/pylab_examples/griddata_demo.py --- matplotlib-0.99.3/lib/mpl_examples/pylab_examples/griddata_demo.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/pylab_examples/griddata_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -11,15 +11,15 @@ z = x*np.exp(-x**2-y**2) # define grid. xi = np.linspace(-2.1,2.1,100) -yi = np.linspace(-2.1,2.1,100) +yi = np.linspace(-2.1,2.1,200) # grid the data. -zi = griddata(x,y,z,xi,yi) +zi = griddata(x,y,z,xi,yi,interp='linear') # contour the gridded data, plotting dots at the nonuniform data points. CS = plt.contour(xi,yi,zi,15,linewidths=0.5,colors='k') CS = plt.contourf(xi,yi,zi,15,cmap=plt.cm.jet) plt.colorbar() # draw colorbar # plot data points. -plt.scatter(x,y,marker='o',c='b',s=5) +plt.scatter(x,y,marker='o',c='b',s=5,zorder=10) plt.xlim(-2,2) plt.ylim(-2,2) plt.title('griddata test (%d points)' % npts) diff -Nru matplotlib-0.99.3/lib/mpl_examples/pylab_examples/histogram_demo_extended.py matplotlib-1.0.1/lib/mpl_examples/pylab_examples/histogram_demo_extended.py --- matplotlib-0.99.3/lib/mpl_examples/pylab_examples/histogram_demo_extended.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/pylab_examples/histogram_demo_extended.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,4 +1,5 @@ #!/usr/bin/env python +import numpy as np import pylab as P # @@ -63,13 +64,18 @@ # # histogram has the ability to plot multiple data in parallel ... +# Note the new color kwarg, used to override the default, which +# uses the line color cycle. # P.figure() # create a new data-set x = mu + sigma*P.randn(1000,3) -n, bins, patches = P.hist(x, 10, normed=1, histtype='bar') +n, bins, patches = P.hist(x, 10, normed=1, histtype='bar', + color=['crimson', 'burlywood', 'chartreuse'], + label=['Crimson', 'Burlywood', 'Chartreuse']) +P.legend() # # ... or we can stack the data @@ -85,8 +91,20 @@ x1 = mu + sigma*P.randn(7000) x2 = mu + sigma*P.randn(3000) +# and exercise the weights option by arbitrarily giving the first half +# of each series only half the weight of the others: + +w0 = np.ones_like(x0) +w0[:len(x0)/2] = 0.5 +w1 = np.ones_like(x1) +w1[:len(x1)/2] = 0.5 +w2 = np.ones_like(x2) +w0[:len(x2)/2] = 0.5 + + + P.figure() -n, bins, patches = P.hist( [x0,x1,x2], 10, histtype='bar') +n, bins, patches = P.hist( [x0,x1,x2], 10, weights=[w0, w1, w2], histtype='bar') P.show() diff -Nru matplotlib-0.99.3/lib/mpl_examples/pylab_examples/image_demo2.py matplotlib-1.0.1/lib/mpl_examples/pylab_examples/image_demo2.py --- matplotlib-0.99.3/lib/mpl_examples/pylab_examples/image_demo2.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/pylab_examples/image_demo2.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,8 +1,12 @@ #!/usr/bin/env python from pylab import * +import matplotlib.cbook as cbook w, h = 512, 512 -s = file('../data/ct.raw', 'rb').read() + +datafile = cbook.get_sample_data('ct.raw', asfileobj=False) +print 'loading', datafile +s = file(datafile, 'rb').read() A = fromstring(s, uint16).astype(float) A *= 1.0/max(A) A.shape = w, h diff -Nru matplotlib-0.99.3/lib/mpl_examples/pylab_examples/image_demo3.py matplotlib-1.0.1/lib/mpl_examples/pylab_examples/image_demo3.py --- matplotlib-0.99.3/lib/mpl_examples/pylab_examples/image_demo3.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/pylab_examples/image_demo3.py 2010-07-07 01:41:55.000000000 +0000 @@ -5,7 +5,10 @@ except ImportError, exc: raise SystemExit("PIL must be installed to run this example") -lena = Image.open('../data/lena.jpg') +import matplotlib.cbook as cbook + +datafile = cbook.get_sample_data('lena.jpg') +lena = Image.open(datafile) dpi = rcParams['figure.dpi'] figsize = lena.size[0]/dpi, lena.size[1]/dpi diff -Nru matplotlib-0.99.3/lib/mpl_examples/pylab_examples/line_styles.py matplotlib-1.0.1/lib/mpl_examples/pylab_examples/line_styles.py --- matplotlib-0.99.3/lib/mpl_examples/pylab_examples/line_styles.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/pylab_examples/line_styles.py 2010-07-07 01:41:55.000000000 +0000 @@ -17,19 +17,28 @@ except TypeError: pass -styles = linestyles + markers +styles = markers + [ + r'$\lambda$', + r'$\bowtie$', + r'$\circlearrowleft$', + r'$\clubsuit$', + r'$\checkmark$'] colors = ('b', 'g', 'r', 'c', 'm', 'y', 'k') +plt.figure(figsize=(8,8)) axisNum = 0 -for row in range(5): +for row in range(6): for col in range(5): axisNum += 1 - ax = plt.subplot(5, 5, axisNum) - style = styles[axisNum % len(styles) ] - color = colors[axisNum % len(colors) ] - plt.plot(t,s, style + color, markersize=10) + ax = plt.subplot(6, 5, axisNum) + color = colors[axisNum % len(colors)] + if axisNum < len(linestyles): + plt.plot(t, s, linestyles[axisNum], color=color, markersize=10) + else: + style = styles[(axisNum - len(linestyles)) % len(styles)] + plt.plot(t, s, linestyle='None', marker=style, color=color, markersize=10) ax.set_yticklabels([]) ax.set_xticklabels([]) diff -Nru matplotlib-0.99.3/lib/mpl_examples/pylab_examples/load_converter.py matplotlib-1.0.1/lib/mpl_examples/pylab_examples/load_converter.py --- matplotlib-0.99.3/lib/mpl_examples/pylab_examples/load_converter.py 2009-08-03 22:34:34.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/pylab_examples/load_converter.py 2010-07-07 01:41:55.000000000 +0000 @@ -2,9 +2,13 @@ #from matplotlib.mlab import load import numpy as np from pylab import figure, show +import matplotlib.cbook as cbook + +datafile = cbook.get_sample_data('msft.csv', asfileobj=False) +print 'loading', datafile dates, closes = np.loadtxt( - '../data/msft.csv', delimiter=',', + datafile, delimiter=',', converters={0:strpdate2num('%d-%b-%y')}, skiprows=1, usecols=(0,2), unpack=True) diff -Nru matplotlib-0.99.3/lib/mpl_examples/pylab_examples/loadrec.py matplotlib-1.0.1/lib/mpl_examples/pylab_examples/loadrec.py --- matplotlib-0.99.3/lib/mpl_examples/pylab_examples/loadrec.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/pylab_examples/loadrec.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,7 +1,10 @@ from matplotlib import mlab from pylab import figure, show +import matplotlib.cbook as cbook -a = mlab.csv2rec('../data/msft.csv') +datafile = cbook.get_sample_data('msft.csv', asfileobj=False) +print 'loading', datafile +a = mlab.csv2rec(datafile) a.sort() print a.dtype diff -Nru matplotlib-0.99.3/lib/mpl_examples/pylab_examples/logo.py matplotlib-1.0.1/lib/mpl_examples/pylab_examples/logo.py --- matplotlib-0.99.3/lib/mpl_examples/pylab_examples/logo.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/pylab_examples/logo.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,11 +1,13 @@ #!/usr/bin/env python # This file generates the matplotlib web page logo from pylab import * - +import matplotlib.cbook as cbook # convert data to mV -x = 1000*0.1*fromstring( - file('../data/membrane.dat', 'rb').read(), float32) +datafile = cbook.get_sample_data('membrane.dat', asfileobj=False) +print 'loading', datafile + +x = 1000*0.1*fromstring(file(datafile, 'rb').read(), float32) # 0.0005 is the sample interval t = 0.0005*arange(len(x)) figure(1, figsize=(7,1), dpi=100) diff -Nru matplotlib-0.99.3/lib/mpl_examples/pylab_examples/mri_demo.py matplotlib-1.0.1/lib/mpl_examples/pylab_examples/mri_demo.py --- matplotlib-0.99.3/lib/mpl_examples/pylab_examples/mri_demo.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/pylab_examples/mri_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,9 +1,10 @@ #!/usr/bin/env python from pylab import * - +import matplotlib.cbook as cbook # data are 256x256 16 bit integers -dfile = '../data/s1045.ima' -im = fromstring(file(dfile, 'rb').read(), uint16).astype(float) +dfile = cbook.get_sample_data('s1045.ima', asfileobj=False) +print 'loading image', dfile +im = np.fromstring(file(dfile, 'rb').read(), np.uint16).astype(float) im.shape = 256, 256 #imshow(im, ColormapJet(256)) diff -Nru matplotlib-0.99.3/lib/mpl_examples/pylab_examples/mri_with_eeg.py matplotlib-1.0.1/lib/mpl_examples/pylab_examples/mri_with_eeg.py --- matplotlib-0.99.3/lib/mpl_examples/pylab_examples/mri_with_eeg.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/pylab_examples/mri_with_eeg.py 2010-07-07 01:41:55.000000000 +0000 @@ -9,12 +9,13 @@ from matplotlib.pyplot import * from matplotlib.collections import LineCollection - +import matplotlib.cbook as cbook # I use if 1 to break up the different regions of code visually if 1: # load the data # data are 256x256 16 bit integers - dfile = '../data/s1045.ima' + dfile = cbook.get_sample_data('s1045.ima', asfileobj=False) + print 'loading image', dfile im = np.fromstring(file(dfile, 'rb').read(), np.uint16).astype(float) im.shape = 256, 256 @@ -38,7 +39,9 @@ # load the data numSamples, numRows = 800,4 - data = np.fromstring(file('../data/eeg.dat', 'rb').read(), float) + eegfile = cbook.get_sample_data('eeg.dat', asfileobj=False) + print 'loading eeg', eegfile + data = np.fromstring(file(eegfile, 'rb').read(), float) data.shape = numSamples, numRows t = 10.0 * np.arange(numSamples, dtype=float)/numSamples ticklocs = [] diff -Nru matplotlib-0.99.3/lib/mpl_examples/pylab_examples/multicolored_line.py matplotlib-1.0.1/lib/mpl_examples/pylab_examples/multicolored_line.py --- matplotlib-0.99.3/lib/mpl_examples/pylab_examples/multicolored_line.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/pylab_examples/multicolored_line.py 2010-07-07 01:41:55.000000000 +0000 @@ -0,0 +1,53 @@ +#!/usr/bin/env python +''' +Color parts of a line based on its properties, e.g., slope. +''' +import numpy as np +import matplotlib.pyplot as plt +from matplotlib.collections import LineCollection +from matplotlib.colors import ListedColormap, BoundaryNorm + +x = np.linspace(0, 3 * np.pi, 500) +y = np.sin(x) +z = np.cos(0.5 * (x[:-1] + x[1:])) # first derivative + +# Create a colormap for red, green and blue and a norm to color +# f' < -0.5 red, f' > 0.5 blue, and the rest green +cmap = ListedColormap(['r', 'g', 'b']) +norm = BoundaryNorm([-1, -0.5, 0.5, 1], cmap.N) + +# Create a set of line segments so that we can color them individually +# This creates the points as a N x 1 x 2 array so that we can stack points +# together easily to get the segments. The segments array for line collection +# needs to be numlines x points per line x 2 (x and y) +points = np.array([x, y]).T.reshape(-1, 1, 2) +segments = np.concatenate([points[:-1], points[1:]], axis=1) + +# Create the line collection object, setting the colormapping parameters. +# Have to set the actual values used for colormapping separately. +lc = LineCollection(segments, cmap=cmap, norm=norm) +lc.set_array(z) +lc.set_linewidth(3) + +fig1 = plt.figure() +plt.gca().add_collection(lc) +plt.xlim(x.min(), x.max()) +plt.ylim(-1.1, 1.1) + +# Now do a second plot coloring the curve using a continuous colormap +t = np.linspace(0, 10, 200) +x = np.cos(np.pi * t) +y = np.sin(t) +points = np.array([x, y]).T.reshape(-1, 1, 2) +segments = np.concatenate([points[:-1], points[1:]], axis=1) + +lc = LineCollection(segments, cmap=plt.get_cmap('copper'), + norm=plt.Normalize(0, 10)) +lc.set_array(t) +lc.set_linewidth(3) + +fig2 = plt.figure() +plt.gca().add_collection(lc) +plt.xlim(-1, 1) +plt.ylim(-1, 1) +plt.show() diff -Nru matplotlib-0.99.3/lib/mpl_examples/pylab_examples/multi_image.py matplotlib-1.0.1/lib/mpl_examples/pylab_examples/multi_image.py --- matplotlib-0.99.3/lib/mpl_examples/pylab_examples/multi_image.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/pylab_examples/multi_image.py 2010-07-07 01:41:55.000000000 +0000 @@ -5,7 +5,7 @@ It also illustrates colorbar tick labelling with a multiplier. ''' -from matplotlib.pyplot import figure, show, sci +from matplotlib.pyplot import figure, show, axes, sci from matplotlib import cm, colors from matplotlib.font_manager import FontProperties from numpy import amin, amax, ravel @@ -68,9 +68,11 @@ # The colorbar is also based on this master image. fig.colorbar(images[0], cax, orientation='horizontal') -# We need the following only if we want to run this +# We need the following only if we want to run this interactively and +# modify the colormap: -sci(images[0]) +axes(ax[0]) # Return the current axes to the first one, +sci(images[0]) # because the current image must be in current axes. show() diff -Nru matplotlib-0.99.3/lib/mpl_examples/pylab_examples/multipage_pdf.py matplotlib-1.0.1/lib/mpl_examples/pylab_examples/multipage_pdf.py --- matplotlib-0.99.3/lib/mpl_examples/pylab_examples/multipage_pdf.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/pylab_examples/multipage_pdf.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,5 +1,6 @@ # This is a demo of creating a pdf file with several pages. +import datetime import numpy as np import matplotlib from matplotlib.backends.backend_pdf import PdfPages @@ -29,5 +30,14 @@ pdf.savefig(fig) # or you can pass a Figure object to pdf.savefig close() +# We can also set the file's metadata via the PdfPages object: +d = pdf.infodict() +d['Title'] = 'Multipage PDF Example' +d['Author'] = u'Jouni K. Sepp\xe4nen' +d['Subject'] = 'How to create a multipage pdf file and set its metadata' +d['Keywords'] = 'PdfPages multipage keywords author title subject' +d['CreationDate'] = datetime.datetime(2009,11,13) +d['ModDate'] = datetime.datetime.today() + # Remember to close the object - otherwise the file will not be usable pdf.close() diff -Nru matplotlib-0.99.3/lib/mpl_examples/pylab_examples/multiple_yaxis_with_spines.py matplotlib-1.0.1/lib/mpl_examples/pylab_examples/multiple_yaxis_with_spines.py --- matplotlib-0.99.3/lib/mpl_examples/pylab_examples/multiple_yaxis_with_spines.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/pylab_examples/multiple_yaxis_with_spines.py 2010-07-07 01:41:55.000000000 +0000 @@ -0,0 +1,66 @@ +import matplotlib.pyplot as plt + +def make_patch_spines_invisible(ax): + par2.set_frame_on(True) + par2.patch.set_visible(False) + for sp in par2.spines.itervalues(): + sp.set_visible(False) + +def make_spine_invisible(ax, direction): + if direction in ["right", "left"]: + ax.yaxis.set_ticks_position(direction) + ax.yaxis.set_label_position(direction) + elif direction in ["top", "bottom"]: + ax.xaxis.set_ticks_position(direction) + ax.xaxis.set_label_position(direction) + else: + raise ValueError("Unknown Direction : %s" % (direction,)) + + ax.spines[direction].set_visible(True) + + +if 1: + fig = plt.figure(1) + + host = fig.add_subplot(111) + + host.set_xlabel("Distance") + + par1 = host.twinx() + par2 = host.twinx() + + par2.spines["right"].set_position(("axes", 1.2)) + make_patch_spines_invisible(par2) + make_spine_invisible(par2, "right") + + plt.subplots_adjust(right=0.75) + + + p1, = host.plot([0, 1, 2], [0, 1, 2], "b-", label="Density") + p2, = par1.plot([0, 1, 2], [0, 3, 2], "r-", label="Temperature") + p3, = par2.plot([0, 1, 2], [50, 30, 15], "g-", label="Velocity") + + host.set_xlim(0, 2) + host.set_ylim(0, 2) + par1.set_ylim(0, 4) + par2.set_ylim(1, 65) + + host.set_xlabel("Distance") + host.set_ylabel("Density") + par1.set_ylabel("Temperature") + par2.set_ylabel("Velocity") + + host.yaxis.label.set_color(p1.get_color()) + par1.yaxis.label.set_color(p2.get_color()) + par2.yaxis.label.set_color(p3.get_color()) + + tkw = dict(size=4, width=1.5) + host.tick_params(axis='y', colors=p1.get_color(), **tkw) + par1.tick_params(axis='y', colors=p2.get_color(), **tkw) + par2.tick_params(axis='y', colors=p3.get_color(), **tkw) + host.tick_params(axis='x', **tkw) + + lines = [p1, p2, p3] + host.legend(lines, [l.get_label() for l in lines]) + plt.show() + diff -Nru matplotlib-0.99.3/lib/mpl_examples/pylab_examples/patheffect_demo.py matplotlib-1.0.1/lib/mpl_examples/pylab_examples/patheffect_demo.py --- matplotlib-0.99.3/lib/mpl_examples/pylab_examples/patheffect_demo.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/pylab_examples/patheffect_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -0,0 +1,37 @@ +import matplotlib.pyplot as plt +import matplotlib.patheffects as PathEffects +import numpy as np + +if 1: + plt.figure(1, figsize=(8,3)) + ax1 = plt.subplot(131) + ax1.imshow([[1,2],[2,3]]) + txt = ax1.annotate("test", (1., 1.), (0., 0), + arrowprops=dict(arrowstyle="->", + connectionstyle="angle3", lw=2), + size=20, ha="center") + + txt.set_path_effects([PathEffects.withStroke(linewidth=3, + foreground="w")]) + txt.arrow_patch.set_path_effects([PathEffects.Stroke(linewidth=5, + foreground="w"), + PathEffects.Normal()]) + + ax2 = plt.subplot(132) + arr = np.arange(25).reshape((5,5)) + ax2.imshow(arr) + cntr = ax2.contour(arr, colors="k") + clbls = ax2.clabel(cntr, fmt="%2.0f", use_clabeltext=True) + plt.setp(clbls, + path_effects=[PathEffects.withStroke(linewidth=3, + foreground="w")]) + + + # shadow as a path effect + ax3 = plt.subplot(133) + p1, = ax3.plot([0, 1], [0, 1]) + leg = ax3.legend([p1], ["Line 1"], fancybox=True, loc=2) + leg.legendPatch.set_path_effects([PathEffects.withSimplePatchShadow()]) + + plt.show() + diff -Nru matplotlib-0.99.3/lib/mpl_examples/pylab_examples/plotfile_demo.py matplotlib-1.0.1/lib/mpl_examples/pylab_examples/plotfile_demo.py --- matplotlib-0.99.3/lib/mpl_examples/pylab_examples/plotfile_demo.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/pylab_examples/plotfile_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,7 +1,8 @@ from pylab import plotfile, show, gca +import matplotlib.cbook as cbook -fname = '../data/msft.csv' -fname2 = '../data/data_x_x2_x3.csv' +fname = cbook.get_sample_data('msft.csv', asfileobj=False) +fname2 = cbook.get_sample_data('data_x_x2_x3.csv', asfileobj=False) # test 1; use ints plotfile(fname, (0,5,6)) diff -Nru matplotlib-0.99.3/lib/mpl_examples/pylab_examples/polar_demo.py matplotlib-1.0.1/lib/mpl_examples/pylab_examples/polar_demo.py --- matplotlib-0.99.3/lib/mpl_examples/pylab_examples/polar_demo.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/pylab_examples/polar_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -28,7 +28,7 @@ # # you could change the radial bounding box (zoom out) by setting the # ylim (radial coordinate is the second argument to the plot command, -# as in matlab(TM), though this is not advised currently because it is not +# as in MATLAB, though this is not advised currently because it is not # clear to me how the axes should behave in the change of view limits. # Please advise me if you have opinions. Likewise, the pan/zoom # controls probably do not do what you think they do and are better @@ -48,7 +48,7 @@ rc('ytick', labelsize=15) # force square figure and square axes looks better for polar, IMO -width, height = matplotlib.rcParams['figure.figsize'] +width, height = matplotlib.rcParams['figure.figsize'] size = min(width, height) # make a square figure fig = figure(figsize=(size, size)) diff -Nru matplotlib-0.99.3/lib/mpl_examples/pylab_examples/psd_demo3.py matplotlib-1.0.1/lib/mpl_examples/pylab_examples/psd_demo3.py --- matplotlib-0.99.3/lib/mpl_examples/pylab_examples/psd_demo3.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/pylab_examples/psd_demo3.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,6 +1,6 @@ -#This is a ported version of a Matlab example from the signal processing +#This is a ported version of a MATLAB example from the signal processing #toolbox that showed some difference at one time between Matplotlib's and -#MatLab's scaling of the PSD. +#MATLAB's scaling of the PSD. import numpy as np import matplotlib.pyplot as plt diff -Nru matplotlib-0.99.3/lib/mpl_examples/pylab_examples/psd_demo_complex.py matplotlib-1.0.1/lib/mpl_examples/pylab_examples/psd_demo_complex.py --- matplotlib-0.99.3/lib/mpl_examples/pylab_examples/psd_demo_complex.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/pylab_examples/psd_demo_complex.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,6 +1,6 @@ -#This is a ported version of a Matlab example from the signal processing +#This is a ported version of a MATLAB example from the signal processing #toolbox that showed some difference at one time between Matplotlib's and -#MatLab's scaling of the PSD. This differs from psd_demo3.py in that +#MATLAB's scaling of the PSD. This differs from psd_demo3.py in that #this uses a complex signal, so we can see that complex PSD's work properly import numpy as np import matplotlib.pyplot as plt diff -Nru matplotlib-0.99.3/lib/mpl_examples/pylab_examples/psd_demo.py matplotlib-1.0.1/lib/mpl_examples/pylab_examples/psd_demo.py --- matplotlib-0.99.3/lib/mpl_examples/pylab_examples/psd_demo.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/pylab_examples/psd_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -19,7 +19,7 @@ show() """ -% compare with matlab(TM) +% compare with MATLAB dt = 0.01; t = [0:dt:10]; nse = randn(size(t)); diff -Nru matplotlib-0.99.3/lib/mpl_examples/pylab_examples/quadmesh_demo.py matplotlib-1.0.1/lib/mpl_examples/pylab_examples/quadmesh_demo.py --- matplotlib-0.99.3/lib/mpl_examples/pylab_examples/quadmesh_demo.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/pylab_examples/quadmesh_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -11,7 +11,7 @@ from matplotlib import cm, colors from numpy import ma -n = 56 +n = 12 x = np.linspace(-1.5,1.5,n) y = np.linspace(-1.5,1.5,n*2) X,Y = np.meshgrid(x,y); @@ -28,7 +28,7 @@ fig = figure() ax = fig.add_subplot(121) ax.set_axis_bgcolor("#bdb76b") -ax.pcolormesh(Qx,Qz,Z) +ax.pcolormesh(Qx,Qz,Z, shading='gouraud') ax.set_title('Without masked values') ax = fig.add_subplot(122) @@ -38,7 +38,7 @@ #cmap.set_bad('r', 1.0) #ax.pcolormesh(Qx,Qz,Zm, cmap=cmap) # Or use the default, which is transparent: -col = ax.pcolormesh(Qx,Qz,Zm) +col = ax.pcolormesh(Qx,Qz,Zm,shading='gouraud') ax.set_title('With masked values') diff -Nru matplotlib-0.99.3/lib/mpl_examples/pylab_examples/scatter_demo2.py matplotlib-1.0.1/lib/mpl_examples/pylab_examples/scatter_demo2.py --- matplotlib-0.99.3/lib/mpl_examples/pylab_examples/scatter_demo2.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/pylab_examples/scatter_demo2.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,16 +1,17 @@ """ make a scatter plot with varying color and size arguments """ -import matplotlib +import matplotlib import numpy as np import matplotlib.pyplot as plt import matplotlib.mlab as mlab +import matplotlib.cbook as cbook # load a numpy record array from yahoo csv data with fields date, # open, close, volume, adj_close from the mpl-data/example directory. # The record array stores python datetime.date as an object array in # the date column -datafile = matplotlib.get_example_data('goog.npy') +datafile = cbook.get_sample_data('goog.npy') r = np.load(datafile).view(np.recarray) r = r[-250:] # get the most recent 250 trading days diff -Nru matplotlib-0.99.3/lib/mpl_examples/pylab_examples/set_and_get.py matplotlib-1.0.1/lib/mpl_examples/pylab_examples/set_and_get.py --- matplotlib-0.99.3/lib/mpl_examples/pylab_examples/set_and_get.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/pylab_examples/set_and_get.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,6 +1,6 @@ """ -matlab(TM) and pylab allow you to use setp and get to set and get +MATLAB and pylab allow you to use setp and get to set and get object properties, as well as to do introspection on the object set diff -Nru matplotlib-0.99.3/lib/mpl_examples/pylab_examples/shading_example.py matplotlib-1.0.1/lib/mpl_examples/pylab_examples/shading_example.py --- matplotlib-0.99.3/lib/mpl_examples/pylab_examples/shading_example.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/pylab_examples/shading_example.py 2010-07-07 01:41:55.000000000 +0000 @@ -4,14 +4,14 @@ # example showing how to make shaded relief plots # like mathematica -# (http://reference.wolfram.com/mathematica/ref/ReliefPlot.html ) +# (http://reference.wolfram.com/mathematica/ref/ReliefPlot.html) # or Generic Mapping Tools # (http://gmt.soest.hawaii.edu/gmt/doc/gmt/html/GMT_Docs/node145.html) # test data X,Y=np.mgrid[-5:5:0.05,-5:5:0.05] Z=np.sqrt(X**2+Y**2)+np.sin(X**2+Y**2) -# creat light source object. +# create light source object. ls = LightSource(azdeg=0,altdeg=65) # shade data, creating an rgb array. rgb = ls.shade(Z,plt.cm.copper) diff -Nru matplotlib-0.99.3/lib/mpl_examples/pylab_examples/simplification_clipping_test.py matplotlib-1.0.1/lib/mpl_examples/pylab_examples/simplification_clipping_test.py --- matplotlib-0.99.3/lib/mpl_examples/pylab_examples/simplification_clipping_test.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/pylab_examples/simplification_clipping_test.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,72 +0,0 @@ -from pylab import * -import numpy as np -from matplotlib import patches, path -nan = np.nan -Path = path.Path - -t = arange(0.0, 2.0, 0.01) -s = sin(2*pi*t) -plot(t, s, linewidth=1.0) - -ylim((-0.20, -0.28)) - -title('Should see four lines extending from bottom to top') - -figure() - -x = np.array([1.0,2.0,3.0,2.0e5]) -y = np.arange(len(x)) -plot(x,y) -xlim(xmin=2,xmax=6) -title("Should be monotonically increasing") - -figure() - -x = np.array([0.0, 1.0, 0.0, -1.0, 0.0]) -y = np.array([1.0, 0.0, -1.0, 0.0, 1.0]) -plot(x, y) -xlim(xmin=-0.6, xmax=0.6) -ylim(ymin=-0.6, ymax=0.6) -title("Diamond shape, with segments visible in all four corners") - -figure() - -np.random.seed(0) -x = np.random.uniform(size=(5000,)) * 50 - -rcParams['path.simplify'] = True -p1 = plot(x,solid_joinstyle='round',linewidth=2.0) - -path = p1[0].get_path() -transform = p1[0].get_transform() -path = transform.transform_path(path) -simplified = list(path.iter_segments(simplify=(800, 600))) - -title("Original length: %d, simplified length: %d" % (len(path.vertices), len(simplified))) - -figure() - -x = np.sin(np.linspace(0, np.pi * 2.0, 1000)) + np.random.uniform(size=(1000,)) * 0.01 - -rcParams['path.simplify'] = True -p1 = plot(x,solid_joinstyle='round',linewidth=2.0) - -path = p1[0].get_path() -transform = p1[0].get_transform() -path = transform.transform_path(path) -simplified = list(path.iter_segments(simplify=(800, 600))) - -title("Original length: %d, simplified length: %d" % (len(path.vertices), len(simplified))) - -figure() -pp1 = patches.PathPatch( - Path([(0, 0), (1, 0), (1, 1), (nan, 1), (0, 0), (2, 0), (2, 2), (0, 0)], - [Path.MOVETO, Path.CURVE3, Path.CURVE3, Path.CURVE3, Path.CURVE3, Path.CURVE3, Path.CURVE3, Path.CLOSEPOLY]), - fc="none") - -gca().add_patch(pp1) -gca().set_xlim((0, 2)) -gca().set_ylim((0, 2)) -title("Should be one line with two curves below it") - -show() diff -Nru matplotlib-0.99.3/lib/mpl_examples/pylab_examples/spine_placement_demo.py matplotlib-1.0.1/lib/mpl_examples/pylab_examples/spine_placement_demo.py --- matplotlib-0.99.3/lib/mpl_examples/pylab_examples/spine_placement_demo.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/pylab_examples/spine_placement_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -37,6 +37,8 @@ ax.spines['right'].set_color('none') ax.spines['bottom'].set_position('center') ax.spines['top'].set_color('none') +ax.spines['left'].set_smart_bounds(True) +ax.spines['bottom'].set_smart_bounds(True) ax.xaxis.set_ticks_position('bottom') ax.yaxis.set_ticks_position('left') @@ -47,6 +49,8 @@ ax.spines['right'].set_color('none') ax.spines['bottom'].set_position('zero') ax.spines['top'].set_color('none') +ax.spines['left'].set_smart_bounds(True) +ax.spines['bottom'].set_smart_bounds(True) ax.xaxis.set_ticks_position('bottom') ax.yaxis.set_ticks_position('left') @@ -57,6 +61,8 @@ ax.spines['right'].set_color('none') ax.spines['bottom'].set_position(('axes',0.1)) ax.spines['top'].set_color('none') +ax.spines['left'].set_smart_bounds(True) +ax.spines['bottom'].set_smart_bounds(True) ax.xaxis.set_ticks_position('bottom') ax.yaxis.set_ticks_position('left') @@ -67,15 +73,17 @@ ax.spines['right'].set_color('none') ax.spines['bottom'].set_position(('data',2)) ax.spines['top'].set_color('none') +ax.spines['left'].set_smart_bounds(True) +ax.spines['bottom'].set_smart_bounds(True) ax.xaxis.set_ticks_position('bottom') ax.yaxis.set_ticks_position('left') - # ---------------------------------------------------- def adjust_spines(ax,spines): for loc, spine in ax.spines.iteritems(): if loc in spines: spine.set_position(('outward',10)) # outward by 10 points + spine.set_smart_bounds(True) else: spine.set_color('none') # don't draw spine @@ -113,4 +121,37 @@ ax.plot(x,y) adjust_spines(ax,['bottom']) +# ---------------------------------------------------- + +fig = plt.figure() + +x = np.linspace(0,2*np.pi,50) +y = np.sin(x) +y2 = y + 0.1*np.random.normal( size=x.shape ) + +# plot data +ax = fig.add_subplot(1,1,1) +line1,=ax.plot(x,y,'--') +line2,=ax.plot(x,y2,'bo') + +# adjust the spines +adjust_spines(ax,['left','bottom']) + +# set ticks and tick labels +# x +ax.set_xlim((0,2*np.pi)) +ax.set_xticks([0,np.pi,2*np.pi]) +pichr = unichr(0x03C0) +ax.set_xticklabels(['0',pichr,'2 '+pichr]) + +# y +ax.set_yticks([-1,0,1]) + +# disable clipping of data points by axes range +for artist in (line1,line2): + artist.set_clip_on(False) + +# adjust spine to be within ticks +ax.spines['left'].set_bounds( -1, 1 ) + show() diff -Nru matplotlib-0.99.3/lib/mpl_examples/pylab_examples/subplots_demo.py matplotlib-1.0.1/lib/mpl_examples/pylab_examples/subplots_demo.py --- matplotlib-0.99.3/lib/mpl_examples/pylab_examples/subplots_demo.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/pylab_examples/subplots_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -0,0 +1,63 @@ +"""Examples illustrating the use of plt.subplots(). + +This function creates a figure and a grid of subplots with a single call, while +providing reasonable control over how the individual plots are created. For +very refined tuning of subplot creation, you can still use add_subplot() +directly on a new figure. +""" + +import matplotlib.pyplot as plt +import numpy as np + +# Simple data to display in various forms +x = np.linspace(0, 2*np.pi, 400) +y = np.sin(x**2) + +plt.close('all') + +# Just a figure and one subplot +f, ax = plt.subplots() +ax.plot(x, y) +ax.set_title('Simple plot') + +# Two subplots, the axes array is 1-d +f, axarr = plt.subplots(2, sharex=True) +axarr[0].plot(x, y) +axarr[0].set_title('Sharing X axis') +axarr[1].scatter(x, y) + +# Two subplots, unpack the axes array immediately +f, (ax1, ax2) = plt.subplots(1, 2, sharey=True) +ax1.plot(x, y) +ax1.set_title('Sharing Y axis') +ax2.scatter(x, y) + +# Three subplots sharing both x/y axes +f, (ax1, ax2, ax3) = plt.subplots(3, sharex=True, sharey=True) +ax1.plot(x, y) +ax1.set_title('Sharing both axes') +ax2.scatter(x, y) +ax3.scatter(x, 2*y**2-1,color='r') +# Fine-tune figure; make subplots close to each other and hide x ticks for +# all but bottom plot. +f.subplots_adjust(hspace=0) +plt.setp([a.get_xticklabels() for a in f.axes[:-1]], visible=False) + +# Four axes, returned as a 2-d array +f, axarr = plt.subplots(2, 2) +axarr[0,0].plot(x, y) +axarr[0,0].set_title('Axis [0,0]') +axarr[0,1].scatter(x, y) +axarr[0,1].set_title('Axis [0,1]') +axarr[1,0].plot(x, y**2) +axarr[1,0].set_title('Axis [1,0]') +axarr[1,1].scatter(x, y**2) +axarr[1,1].set_title('Axis [1,1]') +# Fine-tune figure; hide x ticks for top plots and y ticks for right plots +plt.setp([a.get_xticklabels() for a in axarr[0,:]], visible=False) +plt.setp([a.get_yticklabels() for a in axarr[:,1]], visible=False) + +# Four polar axes +plt.subplots(2, 2, subplot_kw=dict(polar=True)) + +plt.show() diff -Nru matplotlib-0.99.3/lib/mpl_examples/pylab_examples/tex_demo.py matplotlib-1.0.1/lib/mpl_examples/pylab_examples/tex_demo.py --- matplotlib-0.99.3/lib/mpl_examples/pylab_examples/tex_demo.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/pylab_examples/tex_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -29,5 +29,5 @@ title(r"\TeX\ is Number $\displaystyle\sum_{n=1}^\infty\frac{-e^{i\pi}}{2^n}$!", fontsize=16, color='r') grid(True) - +savefig('tex_demo') show() diff -Nru matplotlib-0.99.3/lib/mpl_examples/pylab_examples/text_handles.py matplotlib-1.0.1/lib/mpl_examples/pylab_examples/text_handles.py --- matplotlib-0.99.3/lib/mpl_examples/pylab_examples/text_handles.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/pylab_examples/text_handles.py 2010-07-07 01:41:55.000000000 +0000 @@ -2,7 +2,7 @@ #Controlling the properties of axis text using handles # See examples/text_themes.py for a more elegant, pythonic way to control -# fonts. After all, if we were slaves to matlab(TM) , we wouldn't be +# fonts. After all, if we were slaves to MATLAB , we wouldn't be # using python! from pylab import * diff -Nru matplotlib-0.99.3/lib/mpl_examples/pylab_examples/to_numeric.py matplotlib-1.0.1/lib/mpl_examples/pylab_examples/to_numeric.py --- matplotlib-0.99.3/lib/mpl_examples/pylab_examples/to_numeric.py 2009-07-31 15:14:48.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/pylab_examples/to_numeric.py 2010-07-07 01:41:55.000000000 +0000 @@ -29,5 +29,5 @@ X.shape = h, w, 3 im = Image.fromstring( "RGB", (w,h), s) -im.show() +# im.show() diff -Nru matplotlib-0.99.3/lib/mpl_examples/pylab_examples/tricontour_demo.py matplotlib-1.0.1/lib/mpl_examples/pylab_examples/tricontour_demo.py --- matplotlib-0.99.3/lib/mpl_examples/pylab_examples/tricontour_demo.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/pylab_examples/tricontour_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -0,0 +1,98 @@ +""" +Contour plots of unstructured triangular grids. +""" +import matplotlib.pyplot as plt +import matplotlib.tri as tri +import numpy as np +import math + +# Creating a Triangulation without specifying the triangles results in the +# Delaunay triangulation of the points. + +# First create the x and y coordinates of the points. +n_angles = 48 +n_radii = 8 +min_radius = 0.25 +radii = np.linspace(min_radius, 0.95, n_radii) + +angles = np.linspace(0, 2*math.pi, n_angles, endpoint=False) +angles = np.repeat(angles[...,np.newaxis], n_radii, axis=1) +angles[:,1::2] += math.pi/n_angles + +x = (radii*np.cos(angles)).flatten() +y = (radii*np.sin(angles)).flatten() +z = (np.cos(radii)*np.cos(angles*3.0)).flatten() + +# Create the Triangulation; no triangles so Delaunay triangulation created. +triang = tri.Triangulation(x, y) + +# Mask off unwanted triangles. +xmid = x[triang.triangles].mean(axis=1) +ymid = y[triang.triangles].mean(axis=1) +mask = np.where(xmid*xmid + ymid*ymid < min_radius*min_radius, 1, 0) +triang.set_mask(mask) + +# pcolor plot. +plt.figure() +plt.gca().set_aspect('equal') +plt.tricontourf(triang, z) +plt.colorbar() +plt.tricontour(triang, z, colors='k') +plt.title('Contour plot of Delaunay triangulation') + +# You can specify your own triangulation rather than perform a Delaunay +# triangulation of the points, where each triangle is given by the indices of +# the three points that make up the triangle, ordered in either a clockwise or +# anticlockwise manner. + +xy = np.asarray([ + [-0.101,0.872],[-0.080,0.883],[-0.069,0.888],[-0.054,0.890],[-0.045,0.897], + [-0.057,0.895],[-0.073,0.900],[-0.087,0.898],[-0.090,0.904],[-0.069,0.907], + [-0.069,0.921],[-0.080,0.919],[-0.073,0.928],[-0.052,0.930],[-0.048,0.942], + [-0.062,0.949],[-0.054,0.958],[-0.069,0.954],[-0.087,0.952],[-0.087,0.959], + [-0.080,0.966],[-0.085,0.973],[-0.087,0.965],[-0.097,0.965],[-0.097,0.975], + [-0.092,0.984],[-0.101,0.980],[-0.108,0.980],[-0.104,0.987],[-0.102,0.993], + [-0.115,1.001],[-0.099,0.996],[-0.101,1.007],[-0.090,1.010],[-0.087,1.021], + [-0.069,1.021],[-0.052,1.022],[-0.052,1.017],[-0.069,1.010],[-0.064,1.005], + [-0.048,1.005],[-0.031,1.005],[-0.031,0.996],[-0.040,0.987],[-0.045,0.980], + [-0.052,0.975],[-0.040,0.973],[-0.026,0.968],[-0.020,0.954],[-0.006,0.947], + [ 0.003,0.935],[ 0.006,0.926],[ 0.005,0.921],[ 0.022,0.923],[ 0.033,0.912], + [ 0.029,0.905],[ 0.017,0.900],[ 0.012,0.895],[ 0.027,0.893],[ 0.019,0.886], + [ 0.001,0.883],[-0.012,0.884],[-0.029,0.883],[-0.038,0.879],[-0.057,0.881], + [-0.062,0.876],[-0.078,0.876],[-0.087,0.872],[-0.030,0.907],[-0.007,0.905], + [-0.057,0.916],[-0.025,0.933],[-0.077,0.990],[-0.059,0.993] ]) +x = xy[:,0]*180/3.14159 +y = xy[:,1]*180/3.14159 +x0 = -5 +y0 = 52 +z = np.exp(-0.01*( (x-x0)*(x-x0) + (y-y0)*(y-y0) )) + +triangles = np.asarray([ + [67,66, 1],[65, 2,66],[ 1,66, 2],[64, 2,65],[63, 3,64],[60,59,57], + [ 2,64, 3],[ 3,63, 4],[ 0,67, 1],[62, 4,63],[57,59,56],[59,58,56], + [61,60,69],[57,69,60],[ 4,62,68],[ 6, 5, 9],[61,68,62],[69,68,61], + [ 9, 5,70],[ 6, 8, 7],[ 4,70, 5],[ 8, 6, 9],[56,69,57],[69,56,52], + [70,10, 9],[54,53,55],[56,55,53],[68,70, 4],[52,56,53],[11,10,12], + [69,71,68],[68,13,70],[10,70,13],[51,50,52],[13,68,71],[52,71,69], + [12,10,13],[71,52,50],[71,14,13],[50,49,71],[49,48,71],[14,16,15], + [14,71,48],[17,19,18],[17,20,19],[48,16,14],[48,47,16],[47,46,16], + [16,46,45],[23,22,24],[21,24,22],[17,16,45],[20,17,45],[21,25,24], + [27,26,28],[20,72,21],[25,21,72],[45,72,20],[25,28,26],[44,73,45], + [72,45,73],[28,25,29],[29,25,31],[43,73,44],[73,43,40],[72,73,39], + [72,31,25],[42,40,43],[31,30,29],[39,73,40],[42,41,40],[72,33,31], + [32,31,33],[39,38,72],[33,72,38],[33,38,34],[37,35,38],[34,38,35], + [35,37,36] ]) + +# Rather than create a Triangulation object, can simply pass x, y and triangles +# arrays to tripcolor directly. It would be better to use a Triangulation object +# if the same triangulation was to be used more than once to save duplicated +# calculations. +plt.figure() +plt.gca().set_aspect('equal') +plt.tricontourf(x, y, triangles, z) +plt.colorbar() +plt.title('Contour plot of user-specified triangulation') +plt.xlabel('Longitude (degrees)') +plt.ylabel('Latitude (degrees)') + +plt.show() diff -Nru matplotlib-0.99.3/lib/mpl_examples/pylab_examples/tricontour_vs_griddata.py matplotlib-1.0.1/lib/mpl_examples/pylab_examples/tricontour_vs_griddata.py --- matplotlib-0.99.3/lib/mpl_examples/pylab_examples/tricontour_vs_griddata.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/pylab_examples/tricontour_vs_griddata.py 2010-07-07 01:41:55.000000000 +0000 @@ -0,0 +1,47 @@ +""" +Comparison of griddata and tricontour for an unstructured triangular grid. +""" +import matplotlib.pyplot as plt +import matplotlib.tri as tri +import numpy as np +from numpy.random import uniform, seed +from matplotlib.mlab import griddata +import time + +seed(0) +npts = 200 +ngridx = 100 +ngridy = 200 +x = uniform(-2,2,npts) +y = uniform(-2,2,npts) +z = x*np.exp(-x**2-y**2) + +# griddata and contour. +start = time.clock() +plt.subplot(211) +xi = np.linspace(-2.1,2.1,ngridx) +yi = np.linspace(-2.1,2.1,ngridy) +zi = griddata(x,y,z,xi,yi,interp='linear') +plt.contour(xi,yi,zi,15,linewidths=0.5,colors='k') +plt.contourf(xi,yi,zi,15,cmap=plt.cm.jet) +plt.colorbar() # draw colorbar +plt.plot(x, y, 'ko', ms=3) +plt.xlim(-2,2) +plt.ylim(-2,2) +plt.title('griddata and contour (%d points, %d grid points)' % (npts, ngridx*ngridy)) +print 'griddata and contour seconds:', time.clock() - start + +# tricontour. +start = time.clock() +plt.subplot(212) +triang = tri.Triangulation(x, y) +plt.tricontour(x, y, z, 15, linewidths=0.5, colors='k') +plt.tricontourf(x, y, z, 15, cmap=plt.cm.jet) +plt.colorbar() +plt.plot(x, y, 'ko', ms=3) +plt.xlim(-2,2) +plt.ylim(-2,2) +plt.title('tricontour (%d points)' % npts) +print 'tricontour seconds:', time.clock() - start + +plt.show() diff -Nru matplotlib-0.99.3/lib/mpl_examples/pylab_examples/tripcolor_demo.py matplotlib-1.0.1/lib/mpl_examples/pylab_examples/tripcolor_demo.py --- matplotlib-0.99.3/lib/mpl_examples/pylab_examples/tripcolor_demo.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/pylab_examples/tripcolor_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -0,0 +1,98 @@ +""" +Pseudocolor plots of unstructured triangular grids. +""" +import matplotlib.pyplot as plt +import matplotlib.tri as tri +import numpy as np +import math + +# Creating a Triangulation without specifying the triangles results in the +# Delaunay triangulation of the points. + +# First create the x and y coordinates of the points. +n_angles = 36 +n_radii = 8 +min_radius = 0.25 +radii = np.linspace(min_radius, 0.95, n_radii) + +angles = np.linspace(0, 2*math.pi, n_angles, endpoint=False) +angles = np.repeat(angles[...,np.newaxis], n_radii, axis=1) +angles[:,1::2] += math.pi/n_angles + +x = (radii*np.cos(angles)).flatten() +y = (radii*np.sin(angles)).flatten() +z = (np.cos(radii)*np.cos(angles*3.0)).flatten() + +# Create the Triangulation; no triangles so Delaunay triangulation created. +triang = tri.Triangulation(x, y) + +# Mask off unwanted triangles. +xmid = x[triang.triangles].mean(axis=1) +ymid = y[triang.triangles].mean(axis=1) +mask = np.where(xmid*xmid + ymid*ymid < min_radius*min_radius, 1, 0) +triang.set_mask(mask) + +# pcolor plot. +plt.figure() +plt.gca().set_aspect('equal') +plt.tripcolor(triang, z, shading='faceted') +plt.colorbar() +plt.title('tripcolor of Delaunay triangulation') + + +# You can specify your own triangulation rather than perform a Delaunay +# triangulation of the points, where each triangle is given by the indices of +# the three points that make up the triangle, ordered in either a clockwise or +# anticlockwise manner. + +xy = np.asarray([ + [-0.101,0.872],[-0.080,0.883],[-0.069,0.888],[-0.054,0.890],[-0.045,0.897], + [-0.057,0.895],[-0.073,0.900],[-0.087,0.898],[-0.090,0.904],[-0.069,0.907], + [-0.069,0.921],[-0.080,0.919],[-0.073,0.928],[-0.052,0.930],[-0.048,0.942], + [-0.062,0.949],[-0.054,0.958],[-0.069,0.954],[-0.087,0.952],[-0.087,0.959], + [-0.080,0.966],[-0.085,0.973],[-0.087,0.965],[-0.097,0.965],[-0.097,0.975], + [-0.092,0.984],[-0.101,0.980],[-0.108,0.980],[-0.104,0.987],[-0.102,0.993], + [-0.115,1.001],[-0.099,0.996],[-0.101,1.007],[-0.090,1.010],[-0.087,1.021], + [-0.069,1.021],[-0.052,1.022],[-0.052,1.017],[-0.069,1.010],[-0.064,1.005], + [-0.048,1.005],[-0.031,1.005],[-0.031,0.996],[-0.040,0.987],[-0.045,0.980], + [-0.052,0.975],[-0.040,0.973],[-0.026,0.968],[-0.020,0.954],[-0.006,0.947], + [ 0.003,0.935],[ 0.006,0.926],[ 0.005,0.921],[ 0.022,0.923],[ 0.033,0.912], + [ 0.029,0.905],[ 0.017,0.900],[ 0.012,0.895],[ 0.027,0.893],[ 0.019,0.886], + [ 0.001,0.883],[-0.012,0.884],[-0.029,0.883],[-0.038,0.879],[-0.057,0.881], + [-0.062,0.876],[-0.078,0.876],[-0.087,0.872],[-0.030,0.907],[-0.007,0.905], + [-0.057,0.916],[-0.025,0.933],[-0.077,0.990],[-0.059,0.993] ]) +x = xy[:,0]*180/3.14159 +y = xy[:,1]*180/3.14159 +x0 = -5 +y0 = 52 +z = np.exp(-0.01*( (x-x0)*(x-x0) + (y-y0)*(y-y0) )) + +triangles = np.asarray([ + [67,66, 1],[65, 2,66],[ 1,66, 2],[64, 2,65],[63, 3,64],[60,59,57], + [ 2,64, 3],[ 3,63, 4],[ 0,67, 1],[62, 4,63],[57,59,56],[59,58,56], + [61,60,69],[57,69,60],[ 4,62,68],[ 6, 5, 9],[61,68,62],[69,68,61], + [ 9, 5,70],[ 6, 8, 7],[ 4,70, 5],[ 8, 6, 9],[56,69,57],[69,56,52], + [70,10, 9],[54,53,55],[56,55,53],[68,70, 4],[52,56,53],[11,10,12], + [69,71,68],[68,13,70],[10,70,13],[51,50,52],[13,68,71],[52,71,69], + [12,10,13],[71,52,50],[71,14,13],[50,49,71],[49,48,71],[14,16,15], + [14,71,48],[17,19,18],[17,20,19],[48,16,14],[48,47,16],[47,46,16], + [16,46,45],[23,22,24],[21,24,22],[17,16,45],[20,17,45],[21,25,24], + [27,26,28],[20,72,21],[25,21,72],[45,72,20],[25,28,26],[44,73,45], + [72,45,73],[28,25,29],[29,25,31],[43,73,44],[73,43,40],[72,73,39], + [72,31,25],[42,40,43],[31,30,29],[39,73,40],[42,41,40],[72,33,31], + [32,31,33],[39,38,72],[33,72,38],[33,38,34],[37,35,38],[34,38,35], + [35,37,36] ]) + +# Rather than create a Triangulation object, can simply pass x, y and triangles +# arrays to tripcolor directly. It would be better to use a Triangulation object +# if the same triangulation was to be used more than once to save duplicated +# calculations. +plt.figure() +plt.gca().set_aspect('equal') +plt.tripcolor(x, y, triangles, z, shading='faceted') +plt.colorbar() +plt.title('tripcolor of user-specified triangulation') +plt.xlabel('Longitude (degrees)') +plt.ylabel('Latitude (degrees)') + +plt.show() diff -Nru matplotlib-0.99.3/lib/mpl_examples/pylab_examples/triplot_demo.py matplotlib-1.0.1/lib/mpl_examples/pylab_examples/triplot_demo.py --- matplotlib-0.99.3/lib/mpl_examples/pylab_examples/triplot_demo.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/pylab_examples/triplot_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -0,0 +1,92 @@ +""" +Creating and plotting unstructured triangular grids. +""" +import matplotlib.pyplot as plt +import matplotlib.tri as tri +import numpy as np +import math + +# Creating a Triangulation without specifying the triangles results in the +# Delaunay triangulation of the points. + +# First create the x and y coordinates of the points. +n_angles = 36 +n_radii = 8 +min_radius = 0.25 +radii = np.linspace(min_radius, 0.95, n_radii) + +angles = np.linspace(0, 2*math.pi, n_angles, endpoint=False) +angles = np.repeat(angles[...,np.newaxis], n_radii, axis=1) +angles[:,1::2] += math.pi/n_angles + +x = (radii*np.cos(angles)).flatten() +y = (radii*np.sin(angles)).flatten() + +# Create the Triangulation; no triangles so Delaunay triangulation created. +triang = tri.Triangulation(x, y) + +# Mask off unwanted triangles. +xmid = x[triang.triangles].mean(axis=1) +ymid = y[triang.triangles].mean(axis=1) +mask = np.where(xmid*xmid + ymid*ymid < min_radius*min_radius, 1, 0) +triang.set_mask(mask) + +# Plot the triangulation. +plt.figure() +plt.gca().set_aspect('equal') +plt.triplot(triang, 'bo-') +plt.title('triplot of Delaunay triangulation') + + +# You can specify your own triangulation rather than perform a Delaunay +# triangulation of the points, where each triangle is given by the indices of +# the three points that make up the triangle, ordered in either a clockwise or +# anticlockwise manner. + +xy = np.asarray([ + [-0.101,0.872],[-0.080,0.883],[-0.069,0.888],[-0.054,0.890],[-0.045,0.897], + [-0.057,0.895],[-0.073,0.900],[-0.087,0.898],[-0.090,0.904],[-0.069,0.907], + [-0.069,0.921],[-0.080,0.919],[-0.073,0.928],[-0.052,0.930],[-0.048,0.942], + [-0.062,0.949],[-0.054,0.958],[-0.069,0.954],[-0.087,0.952],[-0.087,0.959], + [-0.080,0.966],[-0.085,0.973],[-0.087,0.965],[-0.097,0.965],[-0.097,0.975], + [-0.092,0.984],[-0.101,0.980],[-0.108,0.980],[-0.104,0.987],[-0.102,0.993], + [-0.115,1.001],[-0.099,0.996],[-0.101,1.007],[-0.090,1.010],[-0.087,1.021], + [-0.069,1.021],[-0.052,1.022],[-0.052,1.017],[-0.069,1.010],[-0.064,1.005], + [-0.048,1.005],[-0.031,1.005],[-0.031,0.996],[-0.040,0.987],[-0.045,0.980], + [-0.052,0.975],[-0.040,0.973],[-0.026,0.968],[-0.020,0.954],[-0.006,0.947], + [ 0.003,0.935],[ 0.006,0.926],[ 0.005,0.921],[ 0.022,0.923],[ 0.033,0.912], + [ 0.029,0.905],[ 0.017,0.900],[ 0.012,0.895],[ 0.027,0.893],[ 0.019,0.886], + [ 0.001,0.883],[-0.012,0.884],[-0.029,0.883],[-0.038,0.879],[-0.057,0.881], + [-0.062,0.876],[-0.078,0.876],[-0.087,0.872],[-0.030,0.907],[-0.007,0.905], + [-0.057,0.916],[-0.025,0.933],[-0.077,0.990],[-0.059,0.993] ]) +x = xy[:,0]*180/3.14159 +y = xy[:,1]*180/3.14159 + +triangles = np.asarray([ + [67,66, 1],[65, 2,66],[ 1,66, 2],[64, 2,65],[63, 3,64],[60,59,57], + [ 2,64, 3],[ 3,63, 4],[ 0,67, 1],[62, 4,63],[57,59,56],[59,58,56], + [61,60,69],[57,69,60],[ 4,62,68],[ 6, 5, 9],[61,68,62],[69,68,61], + [ 9, 5,70],[ 6, 8, 7],[ 4,70, 5],[ 8, 6, 9],[56,69,57],[69,56,52], + [70,10, 9],[54,53,55],[56,55,53],[68,70, 4],[52,56,53],[11,10,12], + [69,71,68],[68,13,70],[10,70,13],[51,50,52],[13,68,71],[52,71,69], + [12,10,13],[71,52,50],[71,14,13],[50,49,71],[49,48,71],[14,16,15], + [14,71,48],[17,19,18],[17,20,19],[48,16,14],[48,47,16],[47,46,16], + [16,46,45],[23,22,24],[21,24,22],[17,16,45],[20,17,45],[21,25,24], + [27,26,28],[20,72,21],[25,21,72],[45,72,20],[25,28,26],[44,73,45], + [72,45,73],[28,25,29],[29,25,31],[43,73,44],[73,43,40],[72,73,39], + [72,31,25],[42,40,43],[31,30,29],[39,73,40],[42,41,40],[72,33,31], + [32,31,33],[39,38,72],[33,72,38],[33,38,34],[37,35,38],[34,38,35], + [35,37,36] ]) + +# Rather than create a Triangulation object, can simply pass x, y and triangles +# arrays to triplot directly. It would be better to use a Triangulation object +# if the same triangulation was to be used more than once to save duplicated +# calculations. +plt.figure() +plt.gca().set_aspect('equal') +plt.triplot(x, y, triangles, 'go-') +plt.title('triplot of user-specified triangulation') +plt.xlabel('Longitude (degrees)') +plt.ylabel('Latitude (degrees)') + +plt.show() diff -Nru matplotlib-0.99.3/lib/mpl_examples/pylab_examples/usetex_demo.py matplotlib-1.0.1/lib/mpl_examples/pylab_examples/usetex_demo.py --- matplotlib-0.99.3/lib/mpl_examples/pylab_examples/usetex_demo.py 2009-07-31 15:51:41.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/pylab_examples/usetex_demo.py 2010-07-07 01:41:55.000000000 +0000 @@ -41,8 +41,8 @@ pylab.yticks((0, 0.5, 1), ('0', '.5', '1'), color = 'k', size = 20) ## Right Y-axis labels -pylab.text(1.05, 0.5, r"\bf{level set} $\phi$", {'color' : 'g', 'fontsize' : 20}, - horizontalalignment = 'left', +pylab.text(1.05, 0.5, r"\bf{level set} $\phi$", {'color' : 'g', 'fontsize' : 20}, + horizontalalignment = 'left', verticalalignment = 'center', rotation = 90, clip_on = False) diff -Nru matplotlib-0.99.3/lib/mpl_examples/tests/backend_driver.py matplotlib-1.0.1/lib/mpl_examples/tests/backend_driver.py --- matplotlib-0.99.3/lib/mpl_examples/tests/backend_driver.py 2009-08-03 22:34:34.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/tests/backend_driver.py 2010-07-07 01:41:54.000000000 +0000 @@ -181,7 +181,6 @@ 'shared_axis_across_figures.py', 'shared_axis_demo.py', 'simple_plot.py', - 'simplification_clipping_test.py', 'specgram_demo.py', 'spine_placement_demo.py', 'spy_demos.py', @@ -336,7 +335,6 @@ for fullpath in testcases: print ('\tdriving %-40s' % (fullpath)), sys.stdout.flush() - fpath, fname = os.path.split(fullpath) if fname in exclude: @@ -362,6 +360,8 @@ 'import matplotlib\n', 'matplotlib.use("%s")\n' % backend, 'from pylab import savefig\n', + 'import numpy\n', + 'numpy.seterr(invalid="ignore")\n', )) for line in file(fullpath): line_lstrip = line.lstrip() @@ -389,7 +389,7 @@ return failures def parse_options(): - doc = __doc__.split('\n\n') + doc = (__doc__ and __doc__.split('\n\n')) or " " op = OptionParser(description=doc[0].strip(), usage='%prog [options] [--] [backends and switches]', #epilog='\n'.join(doc[1:]) # epilog not supported on my python2.4 machine: JDH diff -Nru matplotlib-0.99.3/lib/mpl_examples/units/date_converter.py matplotlib-1.0.1/lib/mpl_examples/units/date_converter.py --- matplotlib-0.99.3/lib/mpl_examples/units/date_converter.py 2009-07-31 15:14:45.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/units/date_converter.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,20 +0,0 @@ -import date_support # set up the date converters -import datetime -from matplotlib.dates import drange -from pylab import figure, show -import numpy as np - - -xmin = datetime.date(2007,1,1) -xmax = datetime.date.today() -delta = datetime.timedelta(days=1) -xdates = drange(xmin, xmax, delta) - -fig = figure() -fig.subplots_adjust(bottom=0.2) -ax = fig.add_subplot(111) -ax.plot(xdates, np.random.rand(len(xdates)), 'o') -ax.set_xlim(datetime.date(2007,2,1), datetime.date(2007,3,1)) - -fig.autofmt_xdate() -show() diff -Nru matplotlib-0.99.3/lib/mpl_examples/units/date_support.py matplotlib-1.0.1/lib/mpl_examples/units/date_support.py --- matplotlib-0.99.3/lib/mpl_examples/units/date_support.py 2009-07-31 15:14:44.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/units/date_support.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,36 +0,0 @@ -import matplotlib -matplotlib.rcParams['units'] = True -from matplotlib.cbook import iterable, is_numlike -import matplotlib.units as units -import matplotlib.dates as dates -import matplotlib.ticker as ticker -import datetime - -class DateConverter(units.ConversionInterface): - - @staticmethod - def axisinfo(unit, axis): - 'return the unit AxisInfo' - if unit=='date': - majloc = dates.AutoDateLocator() - majfmt = dates.AutoDateFormatter(majloc) - return units.AxisInfo( - majloc = majloc, - majfmt = majfmt, - label='date', - ) - else: return None - - @staticmethod - def convert(value, unit, axis): - if units.ConversionInterface.is_numlike(value): return value - return dates.date2num(value) - - @staticmethod - def default_units(x, axis): - 'return the default unit for x or None' - return 'date' - - -units.registry[datetime.date] = DateConverter() -units.registry[datetime.datetime] = DateConverter() diff -Nru matplotlib-0.99.3/lib/mpl_examples/user_interfaces/embedding_in_wx3.py matplotlib-1.0.1/lib/mpl_examples/user_interfaces/embedding_in_wx3.py --- matplotlib-0.99.3/lib/mpl_examples/user_interfaces/embedding_in_wx3.py 2009-07-31 15:14:44.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/user_interfaces/embedding_in_wx3.py 2010-07-07 01:41:53.000000000 +0000 @@ -27,6 +27,7 @@ import matplotlib matplotlib.use('WXAgg') import matplotlib.cm as cm +import matplotlib.cbook as cbook from matplotlib.backends.backend_wxagg import Toolbar, FigureCanvasWxAgg from matplotlib.figure import Figure import numpy as npy @@ -101,8 +102,9 @@ class MyApp(wx.App): def OnInit(self): - xrcfile = os.path.join(os.path.dirname(__file__),"..","data", - "embedding_in_wx3.xrc") + xrcfile = cbook.get_sample_data('embedding_in_wx3.xrc', asfileobj=False) + print 'loading', xrcfile + self.res = xrc.XmlResource(xrcfile) # main frame and panel --------- diff -Nru matplotlib-0.99.3/lib/mpl_examples/user_interfaces/interactive2.py matplotlib-1.0.1/lib/mpl_examples/user_interfaces/interactive2.py --- matplotlib-0.99.3/lib/mpl_examples/user_interfaces/interactive2.py 2009-07-31 15:14:44.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/user_interfaces/interactive2.py 2010-07-07 01:41:53.000000000 +0000 @@ -25,7 +25,7 @@ Welcome to matplotlib. - help(matplotlib) -- shows a list of all matlab(TM) compatible commands provided + help(matplotlib) -- some general information about matplotlib help(plotting) -- shows a list of plot specific commands """ diff -Nru matplotlib-0.99.3/lib/mpl_examples/user_interfaces/interactive.py matplotlib-1.0.1/lib/mpl_examples/user_interfaces/interactive.py --- matplotlib-0.99.3/lib/mpl_examples/user_interfaces/interactive.py 2009-07-31 15:14:44.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/user_interfaces/interactive.py 2010-07-07 01:41:53.000000000 +0000 @@ -1,6 +1,11 @@ #!/usr/bin/env python """Multithreaded interactive interpreter with GTK and Matplotlib support. +WARNING: +As of 2010/06/25, this is not working, at least on Linux. +I have disabled it as a runnable script. - EF + + Usage: pyint-gtk.py -> starts shell with gtk thread running separately @@ -183,7 +188,7 @@ specific GTK hooks in it.""" def __init__(self,banner=None): - banner = """\nWelcome to matplotlib, a matlab-like python environment. + banner = """\nWelcome to matplotlib, a MATLAB-like python environment. help(matlab) -> help on matlab compatible commands from matplotlib. help(plotting) -> help on plotting commands. """ @@ -221,6 +226,9 @@ matplotlib.interactive(1) # turn on interaction if __name__ == '__main__': + print "This demo is not presently functional, so running" + print "it as a script has been disabled." + sys.exit() # Quick sys.argv hack to extract the option and leave filenames in sys.argv. # For real option handling, use optparse or getopt. if len(sys.argv) > 1 and sys.argv[1]=='-pylab': diff -Nru matplotlib-0.99.3/lib/mpl_examples/user_interfaces/rec_edit_gtk_custom.py matplotlib-1.0.1/lib/mpl_examples/user_interfaces/rec_edit_gtk_custom.py --- matplotlib-0.99.3/lib/mpl_examples/user_interfaces/rec_edit_gtk_custom.py 2009-07-31 15:14:44.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/user_interfaces/rec_edit_gtk_custom.py 2010-07-07 01:41:53.000000000 +0000 @@ -6,9 +6,12 @@ import gtk import numpy as np import matplotlib.mlab as mlab +import matplotlib.cbook as cbook import mpl_toolkits.gtktools as gtktools -r = mlab.csv2rec('data/demodata.csv', converterd={'weekdays':str}) + +datafile = cbook.get_sample_data('demodata.csv', asfileobj=False) +r = mlab.csv2rec(datafile, converterd={'weekdays':str}) formatd = mlab.get_formatd(r) diff -Nru matplotlib-0.99.3/lib/mpl_examples/user_interfaces/rec_edit_gtk_simple.py matplotlib-1.0.1/lib/mpl_examples/user_interfaces/rec_edit_gtk_simple.py --- matplotlib-0.99.3/lib/mpl_examples/user_interfaces/rec_edit_gtk_simple.py 2009-07-31 15:14:44.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/user_interfaces/rec_edit_gtk_simple.py 2010-07-07 01:41:53.000000000 +0000 @@ -5,9 +5,11 @@ import gtk import numpy as np import matplotlib.mlab as mlab +import matplotlib.cbook as cbook import mpl_toolkits.gtktools as gtktools -r = mlab.csv2rec('data/demodata.csv', converterd={'weekdays':str}) +datafile = cbook.get_sample_data('demodata.csv', asfileobj=False) +r = mlab.csv2rec(datafile, converterd={'weekdays':str}) liststore, treeview, win = gtktools.edit_recarray(r) win.set_title('click to edit') diff -Nru matplotlib-0.99.3/lib/mpl_examples/widgets/buttons.py matplotlib-1.0.1/lib/mpl_examples/widgets/buttons.py --- matplotlib-0.99.3/lib/mpl_examples/widgets/buttons.py 2009-07-31 15:14:49.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/widgets/buttons.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,38 +1,40 @@ -from pylab import * + +import numpy as np +import matplotlib.pyplot as plt from matplotlib.widgets import Button -freqs = arange(2,20,3) +freqs = np.arange(2, 20, 3) -ax = subplot(111) -subplots_adjust(bottom=0.2) -t = arange(0.0, 1.0, 0.001) -s = sin(2*pi*freqs[0]*t) -l, = plot(t,s, lw=2) +ax = plt.subplot(111) +plt.subplots_adjust(bottom=0.2) +t = np.arange(0.0, 1.0, 0.001) +s = np.sin(2*np.pi*freqs[0]*t) +l, = plt.plot(t, s, lw=2) class Index: ind = 0 def next(self, event): self.ind += 1 - i = self.ind%len(freqs) - ydata = sin(2*pi*freqs[i]*t) + i = self.ind % len(freqs) + ydata = np.sin(2*np.pi*freqs[i]*t) l.set_ydata(ydata) - draw() + plt.draw() def prev(self, event): self.ind -= 1 - i = self.ind%len(freqs) - ydata = sin(2*pi*freqs[i]*t) + i = self.ind % len(freqs) + ydata = np.sin(2*np.pi*freqs[i]*t) l.set_ydata(ydata) - draw() + plt.draw() callback = Index() -axprev = axes([0.7, 0.05, 0.1, 0.075]) -axnext = axes([0.81, 0.05, 0.1, 0.075]) +axprev = plt.axes([0.7, 0.05, 0.1, 0.075]) +axnext = plt.axes([0.81, 0.05, 0.1, 0.075]) bnext = Button(axnext, 'Next') bnext.on_clicked(callback.next) bprev = Button(axprev, 'Previous') bprev.on_clicked(callback.prev) -show() +plt.show() diff -Nru matplotlib-0.99.3/lib/mpl_examples/widgets/check_buttons.py matplotlib-1.0.1/lib/mpl_examples/widgets/check_buttons.py --- matplotlib-0.99.3/lib/mpl_examples/widgets/check_buttons.py 2009-07-31 15:14:49.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/widgets/check_buttons.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,25 +1,26 @@ -from pylab import * +import numpy as np +import matplotlib.pyplot as plt from matplotlib.widgets import CheckButtons -t = arange(0.0, 2.0, 0.01) -s0 = sin(2*pi*t) -s1 = sin(4*pi*t) -s2 = sin(6*pi*t) +t = np.arange(0.0, 2.0, 0.01) +s0 = np.sin(2*np.pi*t) +s1 = np.sin(4*np.pi*t) +s2 = np.sin(6*np.pi*t) -ax = subplot(111) +ax = plt.subplot(111) l0, = ax.plot(t, s0, visible=False, lw=2) l1, = ax.plot(t, s1, lw=2) l2, = ax.plot(t, s2, lw=2) -subplots_adjust(left=0.2) +plt.subplots_adjust(left=0.2) -rax = axes([0.05, 0.4, 0.1, 0.15]) +rax = plt.axes([0.05, 0.4, 0.1, 0.15]) check = CheckButtons(rax, ('2 Hz', '4 Hz', '6 Hz'), (False, True, True)) def func(label): - if label=='2 Hz': l0.set_visible(not l0.get_visible()) - elif label=='4 Hz': l1.set_visible(not l1.get_visible()) - elif label=='6 Hz': l2.set_visible(not l2.get_visible()) - draw() + if label == '2 Hz': l0.set_visible(not l0.get_visible()) + elif label == '4 Hz': l1.set_visible(not l1.get_visible()) + elif label == '6 Hz': l2.set_visible(not l2.get_visible()) + plt.draw() check.on_clicked(func) -show() +plt.show() diff -Nru matplotlib-0.99.3/lib/mpl_examples/widgets/cursor.py matplotlib-1.0.1/lib/mpl_examples/widgets/cursor.py --- matplotlib-0.99.3/lib/mpl_examples/widgets/cursor.py 2009-07-31 15:14:49.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/widgets/cursor.py 2010-07-07 01:41:55.000000000 +0000 @@ -1,20 +1,19 @@ #!/usr/bin/env python from matplotlib.widgets import Cursor -import pylab +import numpy as np +import matplotlib.pyplot as plt -fig = pylab.figure(figsize=(8,6)) -ax = fig.add_axes([0.075, 0.25, 0.9, 0.725], axisbg='#FFFFCC') -#ax = fig.add_subplot(111, axisbg='#FFFFCC') -canvas = ax.figure.canvas - -x,y = 4*(pylab.rand(2,100)-.5) -ax.plot(x,y,'o') -ax.set_xlim(-2,2) -ax.set_ylim(-2,2) +fig = plt.figure(figsize=(8, 6)) +ax = fig.add_subplot(111, axisbg='#FFFFCC') + +x, y = 4*(np.random.rand(2, 100)-.5) +ax.plot(x, y, 'o') +ax.set_xlim(-2, 2) +ax.set_ylim(-2, 2) # set useblit = True on gtkagg for enhanced performance cursor = Cursor(ax, useblit=True, color='red', linewidth=2 ) -pylab.show() +plt.show() diff -Nru matplotlib-0.99.3/lib/mpl_examples/widgets/menu.py matplotlib-1.0.1/lib/mpl_examples/widgets/menu.py --- matplotlib-0.99.3/lib/mpl_examples/widgets/menu.py 2009-07-31 15:14:49.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/widgets/menu.py 2010-07-07 01:41:55.000000000 +0000 @@ -9,7 +9,8 @@ class ItemProperties: - def __init__(self, fontsize=14, labelcolor='black', bgcolor='yellow', alpha=1.0): + def __init__(self, fontsize=14, labelcolor='black', bgcolor='yellow', + alpha=1.0): self.fontsize = fontsize self.labelcolor = labelcolor self.bgcolor = bgcolor @@ -21,8 +22,9 @@ class MenuItem(artist.Artist): parser = mathtext.MathTextParser("Bitmap") padx = 5 - pady =5 - def __init__(self, fig, labelstr, props=None, hoverprops=None, on_select=None): + pady = 5 + def __init__(self, fig, labelstr, props=None, hoverprops=None, + on_select=None): artist.Artist.__init__(self) self.set_figure(fig) @@ -44,14 +46,15 @@ labelstr, fontsize=props.fontsize, dpi=fig.dpi) if props.fontsize!=hoverprops.fontsize: - raise NotImplementedError('support for different font sizes not implemented') + raise NotImplementedError( + 'support for different font sizes not implemented') self.labelwidth = x.shape[1] self.labelheight = x.shape[0] self.labelArray = np.zeros((x.shape[0], x.shape[1], 4)) - self.labelArray[:,:,-1] = x/255. + self.labelArray[:, :, -1] = x/255. self.label = image.FigureImage(fig, origin='upper') self.label.set_array(self.labelArray) @@ -95,9 +98,9 @@ props = self.props r, g, b = props.labelcolor_rgb - self.labelArray[:,:,0] = r - self.labelArray[:,:,1] = g - self.labelArray[:,:,2] = b + self.labelArray[:, :, 0] = r + self.labelArray[:, :, 1] = g + self.labelArray[:, :, 2] = b self.label.set_array(self.labelArray) self.rect.set(facecolor=props.bgcolor, alpha=props.alpha) @@ -169,12 +172,9 @@ for label in ('open', 'close', 'save', 'save as', 'quit'): def on_select(item): print 'you selected', item.labelstr - item = MenuItem(fig, label, props=props, hoverprops=hoverprops, on_select=on_select) + item = MenuItem(fig, label, props=props, hoverprops=hoverprops, + on_select=on_select) menuitems.append(item) menu = Menu(fig, menuitems) plt.show() - - - - diff -Nru matplotlib-0.99.3/lib/mpl_examples/widgets/rectangle_selector.py matplotlib-1.0.1/lib/mpl_examples/widgets/rectangle_selector.py --- matplotlib-0.99.3/lib/mpl_examples/widgets/rectangle_selector.py 2009-07-31 15:14:49.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_examples/widgets/rectangle_selector.py 2010-07-07 01:41:55.000000000 +0000 @@ -8,27 +8,41 @@ """ from matplotlib.widgets import RectangleSelector -from pylab import subplot, arange, plot, sin, cos, pi, show -def line_select_callback(event1, event2): - 'event1 and event2 are the press and release events' - x1, y1 = event1.xdata, event1.ydata - x2, y2 = event2.xdata, event2.ydata - print "(%3.2f, %3.2f) --> (%3.2f, %3.2f)"%(x1,y1,x2,y2) - print " The button you used were: ",event1.button, event2.button - - -current_ax=subplot(111) # make a new plotingrange -N=100000 # If N is large one can see improvement -x=10.0*arange(N)/(N-1) # by use blitting! - -plot(x,sin(.2*pi*x),lw=3,c='b',alpha=.7) # plot something -plot(x,cos(.2*pi*x),lw=3.5,c='r',alpha=.5) -plot(x,-sin(.2*pi*x),lw=3.5,c='g',alpha=.3) +import numpy as np +import matplotlib.pyplot as plt + +def line_select_callback(eclick, erelease): + 'eclick and erelease are the press and release events' + x1, y1 = eclick.xdata, eclick.ydata + x2, y2 = erelease.xdata, erelease.ydata + print "(%3.2f, %3.2f) --> (%3.2f, %3.2f)" % (x1, y1, x2, y2) + print " The button you used were: ", eclick.button, erelease.button + +def toggle_selector(event): + print ' Key pressed.' + if event.key in ['Q', 'q'] and toggle_selector.RS.active: + print ' RectangleSelector deactivated.' + toggle_selector.RS.set_active(False) + if event.key in ['A', 'a'] and not toggle_selector.RS.active: + print ' RectangleSelector activated.' + toggle_selector.RS.set_active(True) + + +current_ax = plt.subplot(111) # make a new plotingrange +N = 100000 # If N is large one can see +x = np.linspace(0.0, 10.0, N) # improvement by use blitting! + +plt.plot(x, +np.sin(.2*np.pi*x), lw=3.5, c='b', alpha=.7) # plot something +plt.plot(x, +np.cos(.2*np.pi*x), lw=3.5, c='r', alpha=.5) +plt.plot(x, -np.sin(.2*np.pi*x), lw=3.5, c='g', alpha=.3) print "\n click --> release" # drawtype is 'box' or 'line' or 'none' -LS = RectangleSelector(current_ax, line_select_callback, - drawtype='box',useblit=True, - minspanx=5,minspany=5,spancoords='pixels') -show() +toggle_selector.RS = RectangleSelector(current_ax, line_select_callback, + drawtype='box', useblit=True, + button=[1,3], # don't use middle button + minspanx=5, minspany=5, + spancoords='pixels') +plt.connect('key_press_event', toggle_selector) +plt.show() diff -Nru matplotlib-0.99.3/lib/mpl_toolkits/axes_grid/anchored_artists.py matplotlib-1.0.1/lib/mpl_toolkits/axes_grid/anchored_artists.py --- matplotlib-0.99.3/lib/mpl_toolkits/axes_grid/anchored_artists.py 2009-07-31 15:14:32.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_toolkits/axes_grid/anchored_artists.py 2010-07-07 01:41:47.000000000 +0000 @@ -1,95 +1,6 @@ - - -from matplotlib.font_manager import FontProperties -from matplotlib import rcParams -from matplotlib.patches import Rectangle, Ellipse - from matplotlib.offsetbox import AnchoredOffsetbox, AuxTransformBox, VPacker,\ - TextArea, DrawingArea - - -class AnchoredText(AnchoredOffsetbox): - def __init__(self, s, loc, pad=0.4, borderpad=0.5, prop=None, **kwargs): - - self.txt = TextArea(s, textprops=prop, - minimumdescent=False) - fp = self.txt._text.get_fontproperties() - - super(AnchoredText, self).__init__(loc, pad=pad, borderpad=borderpad, - child=self.txt, - prop=fp, - **kwargs) - - - -class AnchoredDrawingArea(AnchoredOffsetbox): - def __init__(self, width, height, xdescent, ydescent, - loc, pad=0.4, borderpad=0.5, prop=None, frameon=True, - **kwargs): - - self.da = DrawingArea(width, height, xdescent, ydescent, clip=True) - self.drawing_area = self.da - - super(AnchoredDrawingArea, self).__init__(loc, pad=pad, borderpad=borderpad, - child=self.da, - prop=None, - frameon=frameon, - **kwargs) - -class AnchoredAuxTransformBox(AnchoredOffsetbox): - def __init__(self, transform, loc, - pad=0.4, borderpad=0.5, prop=None, frameon=True, **kwargs): - - self.drawing_area = AuxTransformBox(transform) - - AnchoredOffsetbox.__init__(self, loc, pad=pad, borderpad=borderpad, - child=self.drawing_area, - prop=prop, - frameon=frameon, - **kwargs) - - -class AnchoredEllipse(AnchoredOffsetbox): - def __init__(self, transform, width, height, angle, loc, - pad=0.1, borderpad=0.1, prop=None, frameon=True, **kwargs): - """ - Draw an ellipse the size in data coordinate of the give axes. - - pad, borderpad in fraction of the legend font size (or prop) - """ - self._box = AuxTransformBox(transform) - self.ellipse = Ellipse((0,0), width, height, angle) - self._box.add_artist(self.ellipse) - - AnchoredOffsetbox.__init__(self, loc, pad=pad, borderpad=borderpad, - child=self._box, - prop=prop, - frameon=frameon, **kwargs) - - - -class AnchoredSizeBar(AnchoredOffsetbox): - def __init__(self, transform, size, label, loc, - pad=0.1, borderpad=0.1, sep=2, prop=None, frameon=True, - **kwargs): - """ - Draw a horizontal bar with the size in data coordinate of the give axes. - A label will be drawn underneath (center-alinged). - - pad, borderpad in fraction of the legend font size (or prop) - sep in points. - """ - self.size_bar = AuxTransformBox(transform) - self.size_bar.add_artist(Rectangle((0,0), size, 0, fc="none")) - - self.txt_label = TextArea(label, minimumdescent=False) - - self._box = VPacker(children=[self.size_bar, self.txt_label], - align="center", - pad=0, sep=sep) - - AnchoredOffsetbox.__init__(self, loc, pad=pad, borderpad=borderpad, - child=self._box, - prop=prop, - frameon=frameon, **kwargs) + TextArea, AnchoredText, DrawingArea, AnnotationBbox +from mpl_toolkits.axes_grid1.anchored_artists import \ + AnchoredDrawingArea, AnchoredAuxTransformBox, \ + AnchoredEllipse, AnchoredSizeBar diff -Nru matplotlib-0.99.3/lib/mpl_toolkits/axes_grid/angle_helper.py matplotlib-1.0.1/lib/mpl_toolkits/axes_grid/angle_helper.py --- matplotlib-0.99.3/lib/mpl_toolkits/axes_grid/angle_helper.py 2009-08-22 21:06:12.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_toolkits/axes_grid/angle_helper.py 2010-07-07 01:41:47.000000000 +0000 @@ -1,345 +1 @@ -from math import floor - -import numpy as np -import math - -A = np.array - -from mpl_toolkits.axes_grid.grid_finder import ExtremeFinderSimple - -def select_step_degree(dv): - - degree_limits_ = [1.5, 3, 7, 13, 20, 40, 70, 120, 270, 520] - degree_steps_ = [ 1, 2, 5, 10, 15, 30, 45, 90, 180, 360] - degree_factors = [1.] * len(degree_steps_) - - minsec_limits_ = [1.5, 2.5, 3.5, 8, 11, 18, 25, 45] - minsec_steps_ = [1, 2, 3, 5, 10, 15, 20, 30] - - minute_limits_ = A(minsec_limits_)*(1./60.) - minute_factors = [60.] * len(minute_limits_) - - second_limits_ = A(minsec_limits_)*(1./3600.) - second_factors = [3600.] * len(second_limits_) - - degree_limits = np.concatenate([second_limits_, - minute_limits_, - degree_limits_]) - - degree_steps = np.concatenate([minsec_steps_, - minsec_steps_, - degree_steps_]) - - degree_factors = np.concatenate([second_factors, - minute_factors, - degree_factors]) - - n = degree_limits.searchsorted(dv) - step = degree_steps[n] - factor = degree_factors[n] - - return step, factor - - - -def select_step_hour(dv): - - hour_limits_ = [1.5, 2.5, 3.5, 5, 7, 10, 15, 21, 36] - hour_steps_ = [1, 2 , 3, 4, 6, 8, 12, 18, 24] - hour_factors = [1.] * len(hour_steps_) - - minsec_limits_ = [1.5, 2.5, 3.5, 4.5, 5.5, 8, 11, 14, 18, 25, 45] - minsec_steps_ = [1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30] - - minute_limits_ = A(minsec_limits_)*(1./60.) - minute_factors = [60.] * len(minute_limits_) - - second_limits_ = A(minsec_limits_)*(1./3600.) - second_factors = [3600.] * len(second_limits_) - - hour_limits = np.concatenate([second_limits_, - minute_limits_, - hour_limits_]) - - hour_steps = np.concatenate([minsec_steps_, - minsec_steps_, - hour_steps_]) - - hour_factors = np.concatenate([second_factors, - minute_factors, - hour_factors]) - - n = hour_limits.searchsorted(dv) - step = hour_steps[n] - factor = hour_factors[n] - - return step, factor - - -def select_step_sub(dv): - - # subarcsec or degree - tmp = 10.**(int(math.log10(dv))-1.) - dv2 = dv/tmp - substep_limits_ = [1.5, 3., 7.] - substep_steps_ = [1. , 2., 5.] - - factor = 1./tmp - - if 1.5*tmp >= dv: - step = 1 - elif 3.*tmp >= dv: - step = 2 - elif 7.*tmp >= dv: - step = 5 - else: - step = 1 - factor = 0.1*factor - - return step, factor - - -def select_step(v1, v2, nv, hour=False): - - if v1 > v2: - v1, v2 = v2, v1 - - A = np.array - - dv = float(v2 - v1) / nv - - if hour: - _select_step = select_step_hour - cycle = 24. - else: - _select_step = select_step_degree - cycle = 360. - - # for degree - if dv > 1./3600.: - #print "degree" - step, factor = _select_step(dv) - else: - step, factor = select_step_sub(dv*3600.) - #print "feac", step, factor - - factor = factor * 3600. - - - f1, f2, fstep = v1*factor, v2*factor, step/factor - levs = np.arange(math.floor(f1/step), math.ceil(f2/step)+0.5, - 1, dtype="i") * step - - # n : number valid levels. If there is a cycle, e.g., [0, 90, 180, - # 270, 360], the a grid line needs to be extend from 0 to 360, so - # we need to return the whole array. However, the last level (360) - # needs to be ignored often. In this case, so we return n=4. - - n = len(levs) - - - # we need to check the range of values - # for example, -90 to 90, 0 to 360, - - - if factor == 1. and (levs[-1] >= levs[0]+cycle): # check for cycle - nv = int(cycle / step) - levs = np.arange(0, nv, 1) * step - n = len(levs) - - return levs, n, factor - - -def select_step24(v1, v2, nv): - v1, v2 = v1/15., v2/15. - levs, n, factor = select_step(v1, v2, nv, hour=True) - return levs*15., n, factor - -def select_step360(v1, v2, nv): - return select_step(v1, v2, nv, hour=False) - - - - -class LocatorHMS(object): - def __init__(self, den): - self.den = den - def __call__(self, v1, v2): - return select_step24(v1, v2, self.den) - - -class LocatorDMS(object): - def __init__(self, den): - self.den = den - def __call__(self, v1, v2): - return select_step360(v1, v2, self.den) - - -class FormatterHMS(object): - def __call__(self, direction, factor, values): # hour - if len(values) == 0: - return [] - ss = [[-1, 1][v>0] for v in values] - values = np.abs(values)/15. - - if factor == 1: - return ["$%d^{\mathrm{h}}$" % (int(v),) for v in values] - elif factor == 60: - return ["$%d^{\mathrm{h}}\,%02d^{\mathrm{m}}$" % (s*floor(v/60.), v%60) \ - for s, v in zip(ss, values)] - elif factor == 3600: - if ss[-1] == -1: - inverse_order = True - values = values[::-1] - else: - inverse_order = False - degree = floor(values[0]/3600.) - hm_fmt = "$%d^{\mathrm{h}}\,%02d^{\mathrm{m}}\," - s_fmt = "%02d^{\mathrm{s}}$" - l_hm_old = "" - r = [] - for v in values-3600*degree: - l_hm = hm_fmt % (ss[0]*degree, floor(v/60.)) - l_s = s_fmt % (v%60,) - if l_hm != l_hm_old: - l_hm_old = l_hm - l = l_hm + l_s - else: - l = "$"+l_s - r.append(l) - if inverse_order: - return r[::-1] - else: - return r - #return [fmt % (ss[0]*degree, floor(v/60.), v%60) \ - # for s, v in zip(ss, values-3600*degree)] - else: # factor > 3600. - return ["$%s$" % (str(v),) for v in values] - - -class FormatterDMS(object): - def __call__(self, direction, factor, values): - if len(values) == 0: - return [] - ss = [[-1, 1][v>0] for v in values] - values = np.abs(values) - if factor == 1: - return ["$%d^{\circ}$" % (s*int(v),) for (s, v) in zip(ss, values)] - elif factor == 60: - return ["$%d^{\circ}\,%02d^{\prime}$" % (s*floor(v/60.), v%60) \ - for s, v in zip(ss, values)] - elif factor == 3600: - if ss[-1] == -1: - inverse_order = True - values = values[::-1] - else: - inverse_order = False - degree = floor(values[0]/3600.) - hm_fmt = "$%d^{\circ}\,%02d^{\prime}\," - s_fmt = "%02d^{\prime\prime}$" - l_hm_old = "" - r = [] - for v in values-3600*degree: - l_hm = hm_fmt % (ss[0]*degree, floor(v/60.)) - l_s = s_fmt % (v%60,) - if l_hm != l_hm_old: - l_hm_old = l_hm - l = l_hm + l_s - else: - l = "$"+l_s - r.append(l) - if inverse_order: - return r[::-1] - else: - return r - #return [fmt % (ss[0]*degree, floor(v/60.), v%60) \ - # for s, v in zip(ss, values-3600*degree)] - else: # factor > 3600. - return ["$%s$" % (str(v),) for v in ss*values] - - - - -class ExtremeFinderCycle(ExtremeFinderSimple): - """ - When there is a cycle, e.g., longitude goes from 0-360. - """ - def __init__(self, - nx, ny, - lon_cycle = 360., - lat_cycle = None, - lon_minmax = None, - lat_minmax = (-90, 90) - ): - #self.transfrom_xy = transform_xy - #self.inv_transfrom_xy = inv_transform_xy - self.nx, self.ny = nx, ny - self.lon_cycle, self.lat_cycle = lon_cycle, lat_cycle - self.lon_minmax = lon_minmax - self.lat_minmax = lat_minmax - - - def __call__(self, transform_xy, x1, y1, x2, y2): - """ - get extreme values. - - x1, y1, x2, y2 in image coordinates (0-based) - nx, ny : number of dvision in each axis - """ - x_, y_ = np.linspace(x1, x2, self.nx), np.linspace(y1, y2, self.ny) - x, y = np.meshgrid(x_, y_) - lon, lat = transform_xy(np.ravel(x), np.ravel(y)) - - # iron out jumps, but algorithm should be improved. - # Tis is just naive way of doing and my fail for some cases. - if self.lon_cycle is not None: - lon0 = np.nanmin(lon) - lon -= 360. * ((lon - lon0) > 180.) - if self.lat_cycle is not None: - lat0 = np.nanmin(lat) - lat -= 360. * ((lat - lat0) > 180.) - - lon_min, lon_max = np.nanmin(lon), np.nanmax(lon) - lat_min, lat_max = np.nanmin(lat), np.nanmax(lat) - - lon_min, lon_max, lat_min, lat_max = \ - self._adjust_extremes(lon_min, lon_max, lat_min, lat_max) - - return lon_min, lon_max, lat_min, lat_max - - - def _adjust_extremes(self, lon_min, lon_max, lat_min, lat_max): - - lon_min, lon_max, lat_min, lat_max = \ - self._add_pad(lon_min, lon_max, lat_min, lat_max) - - # check cycle - if self.lon_cycle: - lon_max = min(lon_max, lon_min + self.lon_cycle) - if self.lat_cycle: - lat_max = min(lat_max, lat_min + self.lat_cycle) - - if self.lon_minmax is not None: - min0 = self.lon_minmax[0] - lon_min = max(min0, lon_min) - max0 = self.lon_minmax[1] - lon_max = min(max0, lon_max) - - if self.lat_minmax is not None: - min0 = self.lat_minmax[0] - lat_min = max(min0, lat_min) - max0 = self.lat_minmax[1] - lat_max = min(max0, lat_max) - - return lon_min, lon_max, lat_min, lat_max - - - - - -if __name__ == "__main__": - #test2() - print select_step360(21.2, 33.3, 5) - print select_step360(20+21.2/60., 21+33.3/60., 5) - print select_step360(20.5+21.2/3600., 20.5+33.3/3600., 5) - print select_step360(20+21.2/60., 20+53.3/60., 5) +from mpl_toolkits.axisartist.angle_helper import * diff -Nru matplotlib-0.99.3/lib/mpl_toolkits/axes_grid/axes_divider.py matplotlib-1.0.1/lib/mpl_toolkits/axes_grid/axes_divider.py --- matplotlib-0.99.3/lib/mpl_toolkits/axes_grid/axes_divider.py 2010-03-09 14:20:19.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_toolkits/axes_grid/axes_divider.py 2010-07-07 01:41:47.000000000 +0000 @@ -1,726 +1,8 @@ -""" -The axes_divider module provide helper classes to adjust the positions of -multiple axes at the drawing time. +#from mpl_toolkits.axes_grid1.axes_divider import * - Divider: this is the class that is used calculates the axes - position. It divides the given renctangular area into several sub - rectangles. You intialize the divider by setting the horizontal - and vertical list of sizes that the division will be based on. You - then use the new_locator method, whose return value is a callable - object that can be used to set the axes_locator of the axes. - -""" - -import matplotlib.transforms as mtransforms - -from matplotlib.axes import SubplotBase - -import new - -import axes_size as Size - - -class Divider(object): - """ - This is the class that is used calculates the axes position. It - divides the given renctangular area into several - sub-rectangles. You intialize the divider by setting the - horizontal and vertical lists of sizes - (:mod:`mpl_toolkits.axes_grid.axes_size`) that the division will - be based on. You then use the new_locator method to create a - callable object that can be used to as the axes_locator of the - axes. - """ - - - def __init__(self, fig, pos, horizontal, vertical, aspect=None, anchor="C"): - """ - :param fig: matplotlib figure - :param pos: position (tuple of 4 floats) of the rectangle that - will be divided. - :param horizontal: list of sizes - (:mod:`~mpl_toolkits.axes_grid.axes_size`) - for horizontal division - :param vertical: list of sizes - (:mod:`~mpl_toolkits.axes_grid.axes_size`) - for vertical division - :param aspect: if True, the overall rectalngular area is reduced - so that the relative part of the horizontal and - vertical scales have same scale. - :param anchor: Detrmine how the reduced rectangle is placed - when aspect is True, - """ - - self._fig = fig - self._pos = pos - self._horizontal = horizontal - self._vertical = vertical - self._anchor = anchor - self._aspect = aspect - self._xrefindex = 0 - self._yrefindex = 0 - - - @staticmethod - def _calc_k(l, total_size, renderer): - - rs_sum, as_sum = 0., 0. - - for s in l: - _rs, _as = s.get_size(renderer) - rs_sum += _rs - as_sum += _as - - if rs_sum != 0.: - k = (total_size - as_sum) / rs_sum - return k - else: - return 0. - - - @staticmethod - def _calc_offsets(l, k, renderer): - - offsets = [0.] - - for s in l: - _rs, _as = s.get_size(renderer) - offsets.append(offsets[-1] + _rs*k + _as) - - return offsets - - - def set_position(self, pos): - """ - set the position of the rectangle. - - :param pos: position (tuple of 4 floats) of the rectangle that - will be divided. - """ - self._pos = pos - - def get_position(self): - "return the position of the rectangle." - return self._pos - - def set_anchor(self, anchor): - """ - :param anchor: anchor position - - ===== ============ - value description - ===== ============ - 'C' Center - 'SW' bottom left - 'S' bottom - 'SE' bottom right - 'E' right - 'NE' top right - 'N' top - 'NW' top left - 'W' left - ===== ============ - - """ - if anchor in mtransforms.Bbox.coefs.keys() or len(anchor) == 2: - self._anchor = anchor - else: - raise ValueError('argument must be among %s' % - ', '.join(mtransforms.BBox.coefs.keys())) - - def get_anchor(self): - "return the anchor" - return self._anchor - - def set_horizontal(self, h): - """ - :param horizontal: list of sizes - (:mod:`~mpl_toolkits.axes_grid.axes_size`) - for horizontal division - """ - self._horizontal = h - - - def get_horizontal(self): - "return horizontal sizes" - return self._horizontal - - def set_vertical(self, v): - """ - :param horizontal: list of sizes - (:mod:`~mpl_toolkits.axes_grid.axes_size`) - for horizontal division - """ - self._vertical = v - - def get_vertical(self): - "return vertical sizes" - return self._vertical - - - def set_aspect(self, aspect=False): - """ - :param anchor: True or False - """ - self._aspect = aspect - - def get_aspect(self): - "return aspect" - return self._aspect - - - def locate(self, nx, ny, nx1=None, ny1=None, renderer=None): - """ - - :param nx, nx1: Integers specifying the column-position of the - cell. When nx1 is None, a single nx-th column is - specified. Otherwise location of columns spanning between nx - to nx1 (but excluding nx1-th column) is specified. - - :param ny, ny1: same as nx and nx1, but for row positions. - """ - - - figW,figH = self._fig.get_size_inches() - x, y, w, h = self.get_position() - - k_h = self._calc_k(self._horizontal, figW*w, renderer) - k_v = self._calc_k(self._vertical, figH*h, renderer) - - if self.get_aspect(): - k = min(k_h, k_v) - ox = self._calc_offsets(self._horizontal, k, renderer) - oy = self._calc_offsets(self._vertical, k, renderer) - - ww = (ox[-1] - ox[0])/figW - hh = (oy[-1] - oy[0])/figH - pb = mtransforms.Bbox.from_bounds(x, y, w, h) - pb1 = mtransforms.Bbox.from_bounds(x, y, ww, hh) - pb1_anchored = pb1.anchored(self.get_anchor(), pb) - x0, y0 = pb1_anchored.x0, pb1_anchored.y0 - - else: - ox = self._calc_offsets(self._horizontal, k_h, renderer) - oy = self._calc_offsets(self._vertical, k_v, renderer) - x0, y0 = x, y - - - if nx1 is None: - nx1=nx+1 - if ny1 is None: - ny1=ny+1 - - x1, w1 = x0 + ox[nx]/figW, (ox[nx1] - ox[nx])/figW - y1, h1 = y0 + oy[ny]/figH, (oy[ny1] - oy[ny])/figH - - return mtransforms.Bbox.from_bounds(x1, y1, w1, h1) - - - def new_locator(self, nx, ny, nx1=None, ny1=None): - """ - returns a new locator - (:class:`mpl_toolkits.axes_grid.axes_divider.AxesLocator`) for - specified cell. - - :param nx, nx1: Integers specifying the column-position of the - cell. When nx1 is None, a single nx-th column is - specified. Otherwise location of columns spanning between nx - to nx1 (but excluding nx1-th column) is specified. - - :param ny, ny1: same as nx and nx1, but for row positions. - """ - return AxesLocator(self, nx, ny, nx1, ny1) - - - -class AxesLocator(object): - """ - A simple callable object, initiallized with AxesDivider class, - returns the position and size of the given cell. - """ - def __init__(self, axes_divider, nx, ny, nx1=None, ny1=None): - """ - :param axes_divider: An instance of AxesDivider class. - - :param nx, nx1: Integers specifying the column-position of the - cell. When nx1 is None, a single nx-th column is - specified. Otherwise location of columns spanning between nx - to nx1 (but excluding nx1-th column) is is specified. - - :param ny, ny1: same as nx and nx1, but for row positions. - """ - self._axes_divider = axes_divider - - _xrefindex = axes_divider._xrefindex - _yrefindex = axes_divider._yrefindex - - self._nx, self._ny = nx - _xrefindex, ny - _yrefindex - - if nx1 is None: - nx1 = nx+1 - if ny1 is None: - ny1 = ny+1 - - self._nx1 = nx1 - _xrefindex - self._ny1 = ny1 - _yrefindex - - - def __call__(self, axes, renderer): - - _xrefindex = self._axes_divider._xrefindex - _yrefindex = self._axes_divider._yrefindex - - return self._axes_divider.locate(self._nx + _xrefindex, - self._ny + _yrefindex, - self._nx1 + _xrefindex, - self._ny1 + _yrefindex, - renderer) - - - -class SubplotDivider(Divider): - """ - The Divider class whose rectangle area is specified as a subplot grometry. - """ - - - def __init__(self, fig, *args, **kwargs): - """ - *fig* is a :class:`matplotlib.figure.Figure` instance. - - *args* is the tuple (*numRows*, *numCols*, *plotNum*), where - the array of subplots in the figure has dimensions *numRows*, - *numCols*, and where *plotNum* is the number of the subplot - being created. *plotNum* starts at 1 in the upper left - corner and increases to the right. - - If *numRows* <= *numCols* <= *plotNum* < 10, *args* can be the - decimal integer *numRows* * 100 + *numCols* * 10 + *plotNum*. - """ - - self.figure = fig - - if len(args)==1: - s = str(args[0]) - if len(s) != 3: - raise ValueError('Argument to subplot must be a 3 digits long') - rows, cols, num = map(int, s) - elif len(args)==3: - rows, cols, num = args - else: - raise ValueError( 'Illegal argument to subplot') - - - total = rows*cols - num -= 1 # convert from matlab to python indexing - # ie num in range(0,total) - if num >= total: - raise ValueError( 'Subplot number exceeds total subplots') - self._rows = rows - self._cols = cols - self._num = num - - self.update_params() - - pos = self.figbox.bounds - horizontal = kwargs.pop("horizontal", []) - vertical = kwargs.pop("vertical", []) - aspect = kwargs.pop("aspect", None) - anchor = kwargs.pop("anchor", "C") - - if kwargs: - raise Exception("") - - Divider.__init__(self, fig, pos, horizontal, vertical, - aspect=aspect, anchor=anchor) - - - def get_position(self): - "return the bounds of the subplot box" - self.update_params() - return self.figbox.bounds - - - def update_params(self): - 'update the subplot position from fig.subplotpars' - - rows = self._rows - cols = self._cols - num = self._num - - pars = self.figure.subplotpars - left = pars.left - right = pars.right - bottom = pars.bottom - top = pars.top - wspace = pars.wspace - hspace = pars.hspace - totWidth = right-left - totHeight = top-bottom - - figH = totHeight/(rows + hspace*(rows-1)) - sepH = hspace*figH - - figW = totWidth/(cols + wspace*(cols-1)) - sepW = wspace*figW - - rowNum, colNum = divmod(num, cols) - - figBottom = top - (rowNum+1)*figH - rowNum*sepH - figLeft = left + colNum*(figW + sepW) - - self.figbox = mtransforms.Bbox.from_bounds(figLeft, figBottom, - figW, figH) - - -class AxesDivider(Divider): - """ - Divider based on the pre-existing axes. - """ - - def __init__(self, axes): - """ - :param axes: axes - """ - self._axes = axes - self._xref = Size.AxesX(axes) - self._yref = Size.AxesY(axes) - Divider.__init__(self, fig=axes.get_figure(), pos=None, - horizontal=[self._xref], vertical=[self._yref], - aspect=None, anchor="C") - - def _get_new_axes(self, **kwargs): - axes = self._axes - - axes_class = kwargs.pop("axes_class", None) - - if axes_class is None: - if isinstance(axes, SubplotBase): - axes_class = axes._axes_class - else: - axes_class = type(axes) - - ax = axes_class(axes.get_figure(), - axes.get_position(original=True), **kwargs) - - return ax - - - def new_horizontal(self, size, pad=None, pack_start=False, **kwargs): - """ - Add a new axes on the right (or left) side of the main axes. - - :param size: A width of the axes. A :mod:`~mpl_toolkits.axes_grid.axes_size` - instance or if float or string is given, *from_any* - fucntion is used to create one, with *ref_size* set to AxesX instance - of the current axes. - :param pad: pad between the axes. It takes same argument as *size*. - :param pack_start: If False, the new axes is appended at the end - of the list, i.e., it became the right-most axes. If True, it is - inseted at the start of the list, and becomes the left-most axes. - - All extra keywords argument is passed to when creating a axes. - if *axes_class* is given, the new axes will be created as an - instance of the given class. Otherwise, the same class of the - main axes will be used. if Not provided - - """ - - if pad: - if not isinstance(pad, Size._Base): - pad = Size.from_any(pad, - fraction_ref=self._xref) - if pack_start: - self._horizontal.insert(0, pad) - self._xrefindex += 1 - else: - self._horizontal.append(pad) - - if not isinstance(size, Size._Base): - size = Size.from_any(size, - fraction_ref=self._xref) - - if pack_start: - self._horizontal.insert(0, size) - self._xrefindex += 1 - locator = self.new_locator(nx=0, ny=0) - else: - self._horizontal.append(size) - locator = self.new_locator(nx=len(self._horizontal)-1, ny=0) - - ax = self._get_new_axes(**kwargs) - ax.set_axes_locator(locator) - - return ax - - def new_vertical(self, size, pad=None, pack_start=False, **kwargs): - """ - Add a new axes on the top (or bottom) side of the main axes. - - :param size: A height of the axes. A :mod:`~mpl_toolkits.axes_grid.axes_size` - instance or if float or string is given, *from_any* - fucntion is used to create one, with *ref_size* set to AxesX instance - of the current axes. - :param pad: pad between the axes. It takes same argument as *size*. - :param pack_start: If False, the new axes is appended at the end - of the list, i.e., it became the top-most axes. If True, it is - inseted at the start of the list, and becomes the bottom-most axes. - - All extra keywords argument is passed to when creating a axes. - if *axes_class* is given, the new axes will be created as an - instance of the given class. Otherwise, the same class of the - main axes will be used. if Not provided - - """ - - if pad: - if not isinstance(pad, Size._Base): - pad = Size.from_any(pad, - fraction_ref=self._yref) - if pack_start: - self._vertical.insert(0, pad) - self._yrefindex += 1 - else: - self._vertical.append(pad) - - if not isinstance(size, Size._Base): - size = Size.from_any(size, - fraction_ref=self._yref) - - if pack_start: - self._vertical.insert(0, size) - self._yrefindex += 1 - locator = self.new_locator(nx=0, ny=0) - else: - self._vertical.append(size) - locator = self.new_locator(nx=0, ny=len(self._vertical)-1) - - ax = self._get_new_axes(**kwargs) - ax.set_axes_locator(locator) - - return ax - - - def get_aspect(self): - if self._aspect is None: - aspect = self._axes.get_aspect() - if aspect == "auto": - return False - else: - return True - else: - return self._aspect - - def get_position(self): - if self._pos is None: - bbox = self._axes.get_position(original=True) - return bbox.bounds - else: - return self._pos - - def get_anchor(self): - if self._anchor is None: - return self._axes.get_anchor() - else: - return self._anchor - - - -class LocatableAxesBase: - def __init__(self, *kl, **kw): - - self._axes_class.__init__(self, *kl, **kw) - - self._locator = None - self._locator_renderer = None - - def set_axes_locator(self, locator): - self._locator = locator - - def get_axes_locator(self): - return self._locator - - def apply_aspect(self, position=None): - - if self.get_axes_locator() is None: - self._axes_class.apply_aspect(self, position) - else: - pos = self.get_axes_locator()(self, self._locator_renderer) - self._axes_class.apply_aspect(self, position=pos) - - - def draw(self, renderer=None, inframe=False): - - self._locator_renderer = renderer - - self._axes_class.draw(self, renderer, inframe) - - - -_locatableaxes_classes = {} -def locatable_axes_factory(axes_class): - - new_class = _locatableaxes_classes.get(axes_class) - if new_class is None: - new_class = new.classobj("Locatable%s" % (axes_class.__name__), - (LocatableAxesBase, axes_class), - {'_axes_class': axes_class}) - _locatableaxes_classes[axes_class] = new_class - - return new_class - -#if hasattr(maxes.Axes, "get_axes_locator"): -# LocatableAxes = maxes.Axes -#else: +from mpl_toolkits.axes_grid1.axes_divider import Divider, AxesLocator, SubplotDivider, \ + AxesDivider, locatable_axes_factory, make_axes_locatable from mpl_toolkits.axes_grid.axislines import Axes LocatableAxes = locatable_axes_factory(Axes) - -def make_axes_locatable(axes): - if not hasattr(axes, "set_axes_locator"): - new_class = locatable_axes_factory(type(axes)) - axes.__class__ = new_class - - divider = AxesDivider(axes) - locator = divider.new_locator(nx=0, ny=0) - axes.set_axes_locator(locator) - - return divider - - -def get_demo_image(): - # prepare image - delta = 0.5 - - extent = (-3,4,-4,3) - import numpy as np - x = np.arange(-3.0, 4.001, delta) - y = np.arange(-4.0, 3.001, delta) - X, Y = np.meshgrid(x, y) - import matplotlib.mlab as mlab - Z1 = mlab.bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0) - Z2 = mlab.bivariate_normal(X, Y, 1.5, 0.5, 1, 1) - Z = (Z1 - Z2) * 10 - - return Z, extent - -def demo_locatable_axes(): - import matplotlib.pyplot as plt - - fig1 = plt.figure(1, (6, 6)) - fig1.clf() - - ## PLOT 1 - # simple image & colorbar - ax = fig1.add_subplot(2, 2, 1) - - Z, extent = get_demo_image() - - im = ax.imshow(Z, extent=extent, interpolation="nearest") - cb = plt.colorbar(im) - plt.setp(cb.ax.get_yticklabels(), visible=False) - - - ## PLOT 2 - # image and colorbar whose location is adjusted in the drawing time. - # a hard way - - divider = SubplotDivider(fig1, 2, 2, 2, aspect=True) - - # axes for image - ax = LocatableAxes(fig1, divider.get_position()) - - # axes for coloarbar - ax_cb = LocatableAxes(fig1, divider.get_position()) - - h = [Size.AxesX(ax), # main axes - Size.Fixed(0.05), # padding, 0.1 inch - Size.Fixed(0.2), # colorbar, 0.3 inch - ] - - v = [Size.AxesY(ax)] - - divider.set_horizontal(h) - divider.set_vertical(v) - - ax.set_axes_locator(divider.new_locator(nx=0, ny=0)) - ax_cb.set_axes_locator(divider.new_locator(nx=2, ny=0)) - - fig1.add_axes(ax) - fig1.add_axes(ax_cb) - - ax_cb.yaxis.set_ticks_position("right") - - Z, extent = get_demo_image() - - im = ax.imshow(Z, extent=extent, interpolation="nearest") - plt.colorbar(im, cax=ax_cb) - plt.setp(ax_cb.get_yticklabels(), visible=False) - - plt.draw() - #plt.colorbar(im, cax=ax_cb) - - - ## PLOT 3 - # image and colorbar whose location is adjusted in the drawing time. - # a easy way - - ax = fig1.add_subplot(2, 2, 3) - divider = make_axes_locatable(ax) - - ax_cb = divider.new_horizontal(size="5%", pad=0.05) - fig1.add_axes(ax_cb) - - im = ax.imshow(Z, extent=extent, interpolation="nearest") - plt.colorbar(im, cax=ax_cb) - plt.setp(ax_cb.get_yticklabels(), visible=False) - - - ## PLOT 4 - # two images side by sied with fixed padding. - - ax = fig1.add_subplot(2, 2, 4) - divider = make_axes_locatable(ax) - - ax2 = divider.new_horizontal(size="100%", pad=0.05) - fig1.add_axes(ax2) - - ax.imshow(Z, extent=extent, interpolation="nearest") - ax2.imshow(Z, extent=extent, interpolation="nearest") - plt.setp(ax2.get_yticklabels(), visible=False) - plt.draw() - plt.show() - - -def demo_fixed_size_axes(): - import matplotlib.pyplot as plt - - fig2 = plt.figure(2, (6, 6)) - - # The first items are for padding and the second items are for the axes. - # sizes are in inch. - h = [Size.Fixed(1.0), Size.Fixed(4.5)] - v = [Size.Fixed(0.7), Size.Fixed(5.)] - - divider = Divider(fig2, (0.0, 0.0, 1., 1.), h, v, aspect=False) - # the width and height of the rectangle is ignored. - - ax = LocatableAxes(fig2, divider.get_position()) - ax.set_axes_locator(divider.new_locator(nx=1, ny=1)) - - fig2.add_axes(ax) - - ax.plot([1,2,3]) - - plt.draw() - plt.show() - #plt.colorbar(im, cax=ax_cb) - - - - - -if __name__ == "__main__": - demo_locatable_axes() - demo_fixed_size_axes() diff -Nru matplotlib-0.99.3/lib/mpl_toolkits/axes_grid/axes_grid.py matplotlib-1.0.1/lib/mpl_toolkits/axes_grid/axes_grid.py --- matplotlib-0.99.3/lib/mpl_toolkits/axes_grid/axes_grid.py 2009-07-31 15:14:32.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_toolkits/axes_grid/axes_grid.py 2010-07-07 01:41:47.000000000 +0000 @@ -1,70 +1,9 @@ -import matplotlib.cbook as cbook -import matplotlib.pyplot as plt -import matplotlib.axes as maxes -import matplotlib.colorbar as mcolorbar -import matplotlib as mpl -import matplotlib.patches as mpatches -import matplotlib.lines as mlines -import matplotlib.ticker as ticker -from axes_divider import Size, SubplotDivider, LocatableAxes, Divider +import mpl_toolkits.axes_grid1.axes_grid as axes_grid_orig +from axes_divider import LocatableAxes - - -def _tick_only(ax, bottom_on, left_on): - bottom_off = not bottom_on - left_off = not left_on - [l.set_visible(bottom_off) for l in ax.get_xticklabels()] - [l.set_visible(left_off) for l in ax.get_yticklabels()] - ax.xaxis.label.set_visible(bottom_off) - ax.yaxis.label.set_visible(left_off) - if hasattr(ax, "_axislines"): - ax._axislines["bottom"].major_ticklabels.set_visible(bottom_off) - ax._axislines["left"].major_ticklabels.set_visible(left_off) - ax._axislines["bottom"].minor_ticklabels.set_visible(bottom_off) - ax._axislines["left"].minor_ticklabels.set_visible(left_off) - ax.axis["bottom"].label.set_visible(bottom_off) - ax.axis["left"].label.set_visible(left_off) - -class Colorbar(mcolorbar.Colorbar): - def _config_axes(self, X, Y): - ''' - Make an axes patch and outline. - ''' - ax = self.ax - ax.set_frame_on(False) - ax.set_navigate(False) - xy = self._outline(X, Y) - ax.update_datalim(xy) - ax.set_xlim(*ax.dataLim.intervalx) - ax.set_ylim(*ax.dataLim.intervaly) - self.outline = mlines.Line2D(xy[:, 0], xy[:, 1], color=mpl.rcParams['axes.edgecolor'], - linewidth=mpl.rcParams['axes.linewidth']) - ax.add_artist(self.outline) - self.outline.set_clip_box(None) - self.outline.set_clip_path(None) - c = mpl.rcParams['axes.facecolor'] - self.patch = mpatches.Polygon(xy, edgecolor=c, - facecolor=c, - linewidth=0.01, - zorder=-1) - ax.add_artist(self.patch) - ticks, ticklabels, offset_string = self._ticker() - - if self.orientation == 'vertical': - ax.set_yticks(ticks) - ax.set_yticklabels(ticklabels) - ax.yaxis.get_major_formatter().set_offset_string(offset_string) - - else: - ax.set_xticks(ticks) - ax.set_xticklabels(ticklabels) - ax.xaxis.get_major_formatter().set_offset_string(offset_string) - - - -class CbarAxes(LocatableAxes): +class CbarAxes(axes_grid_orig.CbarAxesBase, LocatableAxes): def __init__(self, *kl, **kwargs): orientation=kwargs.pop("orientation", None) if orientation is None: @@ -73,691 +12,19 @@ self._default_label_on = False self.locator = None - super(CbarAxes, self).__init__(*kl, **kwargs) - - - def colorbar(self, mappable, **kwargs): - locator=kwargs.pop("locator", None) - if locator is None: - locator = ticker.MaxNLocator(5) - self.locator = locator - - kwargs["ticks"] = locator - - - self.hold(True) - if self.orientation in ["top", "bottom"]: - orientation="horizontal" - else: - orientation="vertical" - - cb = Colorbar(self, mappable, orientation=orientation, **kwargs) - #self._config_axes() - - def on_changed(m): - #print 'calling on changed', m.get_cmap().name - cb.set_cmap(m.get_cmap()) - cb.set_clim(m.get_clim()) - cb.update_bruteforce(m) - - self.cbid = mappable.callbacksSM.connect('changed', on_changed) - mappable.set_colorbar(cb, self) - return cb + super(LocatableAxes, self).__init__(*kl, **kwargs) def cla(self): - super(CbarAxes, self).cla() + super(LocatableAxes, self).cla() self._config_axes() - def _config_axes(self): - ''' - Make an axes patch and outline. - ''' - ax = self - ax.set_navigate(False) - - for axis in ax.axis.values(): - axis.major_ticks.set_visible(False) - axis.minor_ticks.set_visible(False) - axis.major_ticklabels.set_visible(False) - axis.minor_ticklabels.set_visible(False) - axis.label.set_visible(False) - - axis = ax.axis[self.orientation] - axis.major_ticks.set_visible(True) - axis.minor_ticks.set_visible(True) - axis.major_ticklabels.set_size(int(axis.major_ticklabels.get_size()*.9)) - axis.major_tick_pad = 3 - - b = self._default_label_on - axis.major_ticklabels.set_visible(b) - axis.minor_ticklabels.set_visible(b) - axis.label.set_visible(b) - - - def toggle_label(self, b): - self._default_label_on = b - axis = self.axis[self.orientation] - axis.major_ticklabels.set_visible(b) - axis.minor_ticklabels.set_visible(b) - axis.label.set_visible(b) - - - -class Grid(object): - """ - A class that creates a grid of Axes. In matplotlib, the axes - location (and size) is specified in the normalized figure - coordinates. This may not be ideal for images that needs to be - displayed with a given aspect ratio. For example, displaying - images of a same size with some fixed padding between them cannot - be easily done in matplotlib. AxesGrid is used in such case. - """ - - def __init__(self, fig, - rect, - nrows_ncols, - ngrids = None, - direction="row", - axes_pad = 0.02, - add_all=True, - share_all=False, - share_x=True, - share_y=True, - #aspect=True, - label_mode="L", - axes_class=None, - ): - """ - Build an :class:`Grid` instance with a grid nrows*ncols - :class:`~matplotlib.axes.Axes` in - :class:`~matplotlib.figure.Figure` *fig* with - *rect=[left, bottom, width, height]* (in - :class:`~matplotlib.figure.Figure` coordinates) or - the subplot position code (e.g., "121"). - - Optional keyword arguments: - - ================ ======== ========================================= - Keyword Default Description - ================ ======== ========================================= - direction "row" [ "row" | "column" ] - axes_pad 0.02 float| pad betweein axes given in inches - add_all True [ True | False ] - share_all False [ True | False ] - share_x True [ True | False ] - share_y True [ True | False ] - label_mode "L" [ "L" | "1" | "all" ] - axes_class None a type object which must be a subclass - of :class:`~matplotlib.axes.Axes` - ================ ======== ========================================= - """ - self._nrows, self._ncols = nrows_ncols - - if ngrids is None: - ngrids = self._nrows * self._ncols - else: - if (ngrids > self._nrows * self._ncols) or (ngrids <= 0): - raise Exception("") - - self.ngrids = ngrids - - self._init_axes_pad(axes_pad) - - if direction not in ["column", "row"]: - raise Exception("") - - self._direction = direction - - - if axes_class is None: - axes_class = LocatableAxes - axes_class_args = {} - else: - if isinstance(axes_class, maxes.Axes): - axes_class_args = {} - else: - axes_class, axes_class_args = axes_class - - self.axes_all = [] - self.axes_column = [[] for i in range(self._ncols)] - self.axes_row = [[] for i in range(self._nrows)] - - - h = [] - v = [] - if cbook.is_string_like(rect) or cbook.is_numlike(rect): - self._divider = SubplotDivider(fig, rect, horizontal=h, vertical=v, - aspect=False) - elif len(rect) == 3: - kw = dict(horizontal=h, vertical=v, aspect=False) - self._divider = SubplotDivider(fig, *rect, **kw) - elif len(rect) == 4: - self._divider = Divider(fig, rect, horizontal=h, vertical=v, - aspect=False) - else: - raise Exception("") - - - rect = self._divider.get_position() - - # reference axes - self._column_refax = [None for i in range(self._ncols)] - self._row_refax = [None for i in range(self._nrows)] - self._refax = None - - for i in range(self.ngrids): - - col, row = self._get_col_row(i) - - if share_all: - sharex = self._refax - sharey = self._refax - else: - if share_x: - sharex = self._column_refax[col] - else: - sharex = None - - if share_y: - sharey = self._row_refax[row] - else: - sharey = None - - ax = axes_class(fig, rect, sharex=sharex, sharey=sharey, - **axes_class_args) - - if share_all: - if self._refax is None: - self._refax = ax - else: - if sharex is None: - self._column_refax[col] = ax - if sharey is None: - self._row_refax[row] = ax - - self.axes_all.append(ax) - self.axes_column[col].append(ax) - self.axes_row[row].append(ax) - - self.axes_llc = self.axes_column[0][-1] - - self._update_locators() - - if add_all: - for ax in self.axes_all: - fig.add_axes(ax) - - self.set_label_mode(label_mode) - - - def _init_axes_pad(self, axes_pad): - self._axes_pad = axes_pad - - self._horiz_pad_size = Size.Fixed(axes_pad) - self._vert_pad_size = Size.Fixed(axes_pad) - - - def _update_locators(self): - - h = [] - - h_ax_pos = [] - h_cb_pos = [] - - for ax in self._column_refax: - #if h: h.append(Size.Fixed(self._axes_pad)) - if h: h.append(self._horiz_pad_size) - - h_ax_pos.append(len(h)) - - sz = Size.Scaled(1) - h.append(sz) - - v = [] - - v_ax_pos = [] - v_cb_pos = [] - for ax in self._row_refax[::-1]: - #if v: v.append(Size.Fixed(self._axes_pad)) - if v: v.append(self._vert_pad_size) - - v_ax_pos.append(len(v)) - sz = Size.Scaled(1) - v.append(sz) - - - for i in range(self.ngrids): - col, row = self._get_col_row(i) - locator = self._divider.new_locator(nx=h_ax_pos[col], - ny=v_ax_pos[self._nrows -1 - row]) - self.axes_all[i].set_axes_locator(locator) - - self._divider.set_horizontal(h) - self._divider.set_vertical(v) - - - - def _get_col_row(self, n): - if self._direction == "column": - col, row = divmod(n, self._nrows) - else: - row, col = divmod(n, self._ncols) - - return col, row - - - def __getitem__(self, i): - return self.axes_all[i] - - - def get_geometry(self): - """ - get geometry of the grid. Returns a tuple of two integer, - representing number of rows and number of columns. - """ - return self._nrows, self._ncols - - def set_axes_pad(self, axes_pad): - "set axes_pad" - self._axes_pad = axes_pad - - self._horiz_pad_size.fixed_size = axes_pad - self._vert_pad_size.fixed_size = axes_pad - - - def get_axes_pad(self): - "get axes_pad" - return self._axes_pad - - def set_aspect(self, aspect): - "set aspect" - self._divider.set_aspect(aspect) - def get_aspect(self): - "get aspect" - return self._divider.get_aspect() - - def set_label_mode(self, mode): - "set label_mode" - if mode == "all": - for ax in self.axes_all: - _tick_only(ax, False, False) - elif mode == "L": - # left-most axes - for ax in self.axes_column[0][:-1]: - _tick_only(ax, bottom_on=True, left_on=False) - # lower-left axes - ax = self.axes_column[0][-1] - _tick_only(ax, bottom_on=False, left_on=False) - - for col in self.axes_column[1:]: - # axes with no labels - for ax in col[:-1]: - _tick_only(ax, bottom_on=True, left_on=True) - - # bottom - ax = col[-1] - _tick_only(ax, bottom_on=False, left_on=True) - - elif mode == "1": - for ax in self.axes_all: - _tick_only(ax, bottom_on=True, left_on=True) - - ax = self.axes_llc - _tick_only(ax, bottom_on=False, left_on=False) - - -class ImageGrid(Grid): - """ - A class that creates a grid of Axes. In matplotlib, the axes - location (and size) is specified in the normalized figure - coordinates. This may not be ideal for images that needs to be - displayed with a given aspect ratio. For example, displaying - images of a same size with some fixed padding between them cannot - be easily done in matplotlib. ImageGrid is used in such case. - """ - - def __init__(self, fig, - rect, - nrows_ncols, - ngrids = None, - direction="row", - axes_pad = 0.02, - add_all=True, - share_all=False, - aspect=True, - label_mode="L", - cbar_mode=None, - cbar_location="right", - cbar_pad=None, - cbar_size="5%", - axes_class=None, - ): - """ - Build an :class:`ImageGrid` instance with a grid nrows*ncols - :class:`~matplotlib.axes.Axes` in - :class:`~matplotlib.figure.Figure` *fig* with - *rect=[left, bottom, width, height]* (in - :class:`~matplotlib.figure.Figure` coordinates) or - the subplot position code (e.g., "121"). - - Optional keyword arguments: - - ================ ======== ========================================= - Keyword Default Description - ================ ======== ========================================= - direction "row" [ "row" | "column" ] - axes_pad 0.02 float| pad betweein axes given in inches - add_all True [ True | False ] - share_all False [ True | False ] - aspect True [ True | False ] - label_mode "L" [ "L" | "1" | "all" ] - cbar_mode None [ "each" | "single" ] - cbar_location "right" [ "right" | "top" ] - cbar_pad None - cbar_size "5%" - axes_class None a type object which must be a subclass - of :class:`~matplotlib.axes.Axes` - ================ ======== ========================================= - """ - self._nrows, self._ncols = nrows_ncols - - if ngrids is None: - ngrids = self._nrows * self._ncols - else: - if (ngrids > self._nrows * self._ncols) or (ngrids <= 0): - raise Exception("") - - self.ngrids = ngrids - - self._axes_pad = axes_pad - - self._colorbar_mode = cbar_mode - self._colorbar_location = cbar_location - if cbar_pad is None: - self._colorbar_pad = axes_pad - else: - self._colorbar_pad = cbar_pad - - self._colorbar_size = cbar_size - - self._init_axes_pad(axes_pad) - - if direction not in ["column", "row"]: - raise Exception("") - - self._direction = direction - - - if axes_class is None: - axes_class = LocatableAxes - axes_class_args = {} - else: - if isinstance(axes_class, maxes.Axes): - axes_class_args = {} - else: - axes_class, axes_class_args = axes_class - - cbar_axes_class = CbarAxes - - - self.axes_all = [] - self.axes_column = [[] for i in range(self._ncols)] - self.axes_row = [[] for i in range(self._nrows)] - - self.cbar_axes = [] - - h = [] - v = [] - if cbook.is_string_like(rect) or cbook.is_numlike(rect): - self._divider = SubplotDivider(fig, rect, horizontal=h, vertical=v, - aspect=aspect) - elif len(rect) == 3: - kw = dict(horizontal=h, vertical=v, aspect=aspect) - self._divider = SubplotDivider(fig, *rect, **kw) - elif len(rect) == 4: - self._divider = Divider(fig, rect, horizontal=h, vertical=v, - aspect=aspect) - else: - raise Exception("") - - - rect = self._divider.get_position() - - # reference axes - self._column_refax = [None for i in range(self._ncols)] - self._row_refax = [None for i in range(self._nrows)] - self._refax = None - - for i in range(self.ngrids): - - col, row = self._get_col_row(i) - - if share_all: - sharex = self._refax - sharey = self._refax - else: - sharex = self._column_refax[col] - sharey = self._row_refax[row] - - ax = axes_class(fig, rect, sharex=sharex, sharey=sharey, - **axes_class_args) - - if share_all: - if self._refax is None: - self._refax = ax - else: - if sharex is None: - self._column_refax[col] = ax - if sharey is None: - self._row_refax[row] = ax - - self.axes_all.append(ax) - self.axes_column[col].append(ax) - self.axes_row[row].append(ax) - - cax = cbar_axes_class(fig, rect, - orientation=self._colorbar_location) - self.cbar_axes.append(cax) - - self.axes_llc = self.axes_column[0][-1] - - self._update_locators() - - if add_all: - for ax in self.axes_all+self.cbar_axes: - fig.add_axes(ax) - - self.set_label_mode(label_mode) - - - def _update_locators(self): - - h = [] - - h_ax_pos = [] - h_cb_pos = [] - for ax in self._column_refax: - if h: h.append(self._horiz_pad_size) #Size.Fixed(self._axes_pad)) - - h_ax_pos.append(len(h)) - - if ax: - sz = Size.AxesX(ax) - else: - sz = Size.AxesX(self.axes_llc) - h.append(sz) - - if self._colorbar_mode == "each" and self._colorbar_location == "right": - h.append(Size.from_any(self._colorbar_pad, sz)) - h_cb_pos.append(len(h)) - h.append(Size.from_any(self._colorbar_size, sz)) - - - v = [] - - v_ax_pos = [] - v_cb_pos = [] - for ax in self._row_refax[::-1]: - if v: v.append(self._horiz_pad_size) #Size.Fixed(self._axes_pad)) - - v_ax_pos.append(len(v)) - if ax: - sz = Size.AxesY(ax) - else: - sz = Size.AxesY(self.axes_llc) - v.append(sz) - - - if self._colorbar_mode == "each" and self._colorbar_location == "top": - v.append(Size.from_any(self._colorbar_pad, sz)) - v_cb_pos.append(len(v)) - v.append(Size.from_any(self._colorbar_size, sz)) - - - for i in range(self.ngrids): - col, row = self._get_col_row(i) - #locator = self._divider.new_locator(nx=4*col, ny=2*(self._nrows - row - 1)) - locator = self._divider.new_locator(nx=h_ax_pos[col], - ny=v_ax_pos[self._nrows -1 - row]) - self.axes_all[i].set_axes_locator(locator) - - if self._colorbar_mode == "each": - if self._colorbar_location == "right": - locator = self._divider.new_locator(nx=h_cb_pos[col], - ny=v_ax_pos[self._nrows -1 - row]) - elif self._colorbar_location == "top": - locator = self._divider.new_locator(nx=h_ax_pos[col], - ny=v_cb_pos[self._nrows -1 - row]) - self.cbar_axes[i].set_axes_locator(locator) - - - if self._colorbar_mode == "single": - if self._colorbar_location == "right": - #sz = Size.Fraction(Size.AxesX(self.axes_llc), self._nrows) - sz = Size.Fraction(self._nrows, Size.AxesX(self.axes_llc)) - h.append(Size.from_any(self._colorbar_pad, sz)) - h.append(Size.from_any(self._colorbar_size, sz)) - locator = self._divider.new_locator(nx=-2, ny=0, ny1=-1) - elif self._colorbar_location == "top": - #sz = Size.Fraction(Size.AxesY(self.axes_llc), self._ncols) - sz = Size.Fraction(self._ncols, Size.AxesY(self.axes_llc)) - v.append(Size.from_any(self._colorbar_pad, sz)) - v.append(Size.from_any(self._colorbar_size, sz)) - locator = self._divider.new_locator(nx=0, nx1=-1, ny=-2) - for i in range(self.ngrids): - self.cbar_axes[i].set_visible(False) - self.cbar_axes[0].set_axes_locator(locator) - self.cbar_axes[0].set_visible(True) - elif self._colorbar_mode == "each": - for i in range(self.ngrids): - self.cbar_axes[i].set_visible(True) - else: - for i in range(self.ngrids): - self.cbar_axes[i].set_visible(False) - self.cbar_axes[i].set_position([1., 1., 0.001, 0.001], - which="active") - - self._divider.set_horizontal(h) - self._divider.set_vertical(v) +class Grid(axes_grid_orig.Grid): + _defaultLocatableAxesClass = LocatableAxes +class ImageGrid(axes_grid_orig.ImageGrid): + _defaultLocatableAxesClass = LocatableAxes + _defaultCbarAxesClass = CbarAxes AxesGrid = ImageGrid - - -#if __name__ == "__main__": -if 0: - F = plt.figure(1, (7, 6)) - F.clf() - - F.subplots_adjust(left=0.15, right=0.9) - - grid = Grid(F, 111, # similar to subplot(111) - nrows_ncols = (2, 2), - direction="row", - axes_pad = 0.05, - add_all=True, - label_mode = "1", - ) - - - -if __name__ == "__main__": -#if 0: - from axes_divider import get_demo_image - F = plt.figure(1, (9, 3.5)) - F.clf() - - F.subplots_adjust(left=0.05, right=0.98) - - grid = ImageGrid(F, 131, # similar to subplot(111) - nrows_ncols = (2, 2), - direction="row", - axes_pad = 0.05, - add_all=True, - label_mode = "1", - ) - - Z, extent = get_demo_image() - plt.ioff() - for i in range(4): - im = grid[i].imshow(Z, extent=extent, interpolation="nearest") - - # This only affects axes in first column and second row as share_all = False. - grid.axes_llc.set_xticks([-2, 0, 2]) - grid.axes_llc.set_yticks([-2, 0, 2]) - plt.ion() - - - grid = ImageGrid(F, 132, # similar to subplot(111) - nrows_ncols = (2, 2), - direction="row", - axes_pad = 0.0, - add_all=True, - share_all=True, - label_mode = "1", - cbar_mode="single", - ) - - Z, extent = get_demo_image() - plt.ioff() - for i in range(4): - im = grid[i].imshow(Z, extent=extent, interpolation="nearest") - plt.colorbar(im, cax = grid.cbar_axes[0]) - plt.setp(grid.cbar_axes[0].get_yticklabels(), visible=False) - - # This affects all axes as share_all = True. - grid.axes_llc.set_xticks([-2, 0, 2]) - grid.axes_llc.set_yticks([-2, 0, 2]) - - plt.ion() - - - - grid = ImageGrid(F, 133, # similar to subplot(122) - nrows_ncols = (2, 2), - direction="row", - axes_pad = 0.1, - add_all=True, - label_mode = "1", - share_all = True, - cbar_location="top", - cbar_mode="each", - cbar_size="7%", - cbar_pad="2%", - ) - plt.ioff() - for i in range(4): - im = grid[i].imshow(Z, extent=extent, interpolation="nearest") - plt.colorbar(im, cax = grid.cbar_axes[i], - orientation="horizontal") - grid.cbar_axes[i].xaxis.set_ticks_position("top") - plt.setp(grid.cbar_axes[i].get_xticklabels(), visible=False) - - # This affects all axes as share_all = True. - grid.axes_llc.set_xticks([-2, 0, 2]) - grid.axes_llc.set_yticks([-2, 0, 2]) - - plt.ion() - plt.draw() diff -Nru matplotlib-0.99.3/lib/mpl_toolkits/axes_grid/axes_rgb.py matplotlib-1.0.1/lib/mpl_toolkits/axes_grid/axes_rgb.py --- matplotlib-0.99.3/lib/mpl_toolkits/axes_grid/axes_rgb.py 2009-07-31 15:14:32.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_toolkits/axes_grid/axes_rgb.py 2010-07-07 01:41:47.000000000 +0000 @@ -1,147 +1,10 @@ -import numpy as np -from axes_divider import make_axes_locatable, Size, locatable_axes_factory +#from mpl_toolkits.axes_grid1.axes_rgb import * +from mpl_toolkits.axes_grid1.axes_rgb import make_rgb_axes, imshow_rgb, RGBAxesBase -def make_rgb_axes(ax, pad=0.01, axes_class=None, add_all=True): - """ - pad : fraction of the axes height. - """ +#import mpl_toolkits.axes_grid1.axes_rgb as axes_rgb_orig +from axislines import Axes - divider = make_axes_locatable(ax) - - pad_size = Size.Fraction(pad, Size.AxesY(ax)) - - xsize = Size.Fraction((1.-2.*pad)/3., Size.AxesX(ax)) - ysize = Size.Fraction((1.-2.*pad)/3., Size.AxesY(ax)) - - divider.set_horizontal([Size.AxesX(ax), pad_size, xsize]) - divider.set_vertical([ysize, pad_size, ysize, pad_size, ysize]) - - ax.set_axes_locator(divider.new_locator(0, 0, ny1=-1)) - - ax_rgb = [] - if axes_class is None: - try: - axes_class = locatable_axes_factory(ax._axes_class) - except AttributeError: - axes_class = locatable_axes_factory(type(ax)) - - for ny in [4, 2, 0]: - ax1 = axes_class(ax.get_figure(), - ax.get_position(original=True), - sharex=ax, sharey=ax) - locator = divider.new_locator(nx=2, ny=ny) - ax1.set_axes_locator(locator) - for t in ax1.yaxis.get_ticklabels() + ax1.xaxis.get_ticklabels(): - t.set_visible(False) - try: - for axis in ax1.axis.values(): - axis.major_ticklabels.set_visible(False) - except AttributeError: - pass - - ax_rgb.append(ax1) - - if add_all: - fig = ax.get_figure() - for ax1 in ax_rgb: - fig.add_axes(ax1) - - return ax_rgb - -#import matplotlib.axes as maxes -import axislines - -def imshow_rgb(ax, r, g, b, **kwargs): - ny, nx = r.shape - R = np.zeros([ny, nx, 3], dtype="d") - R[:,:,0] = r - G = np.zeros_like(R) - G[:,:,1] = g - B = np.zeros_like(R) - B[:,:,2] = b - - RGB = R + G + B - - im_rgb = ax.imshow(RGB, **kwargs) - - return im_rgb - - -class RGBAxes(object): - def __init__(self, *kl, **kwargs): - pad = kwargs.pop("pad", 0.0) - add_all = kwargs.pop("add_all", True) - axes_class = kwargs.pop("axes_class", None) - - - - - if axes_class is None: - axes_class = axislines.Axes - - ax = axes_class(*kl, **kwargs) - - divider = make_axes_locatable(ax) - - pad_size = Size.Fraction(pad, Size.AxesY(ax)) - - xsize = Size.Fraction((1.-2.*pad)/3., Size.AxesX(ax)) - ysize = Size.Fraction((1.-2.*pad)/3., Size.AxesY(ax)) - - divider.set_horizontal([Size.AxesX(ax), pad_size, xsize]) - divider.set_vertical([ysize, pad_size, ysize, pad_size, ysize]) - - ax.set_axes_locator(divider.new_locator(0, 0, ny1=-1)) - - ax_rgb = [] - for ny in [4, 2, 0]: - ax1 = axes_class(ax.get_figure(), - ax.get_position(original=True), - sharex=ax, sharey=ax, **kwargs) - locator = divider.new_locator(nx=2, ny=ny) - ax1.set_axes_locator(locator) - for t in ax1.yaxis.get_ticklabels() + ax1.xaxis.get_ticklabels(): - t.set_visible(False) - if hasattr(ax1, "_axislines"): - for axisline in ax1._axislines.values(): - axisline.major_ticklabels.set_visible(False) - ax_rgb.append(ax1) - - self.RGB = ax - self.R, self.G, self.B = ax_rgb - - if add_all: - fig = ax.get_figure() - fig.add_axes(ax) - self.add_RGB_to_figure() - - - for ax1 in [self.RGB, self.R, self.G, self.B]: - for axisline in ax1._axislines.values(): - axisline.line.set_color("w") - axisline.major_ticks.set_mec("w") - - - def add_RGB_to_figure(self): - self.RGB.get_figure().add_axes(self.R) - self.RGB.get_figure().add_axes(self.G) - self.RGB.get_figure().add_axes(self.B) - - def imshow_rgb(self, r, g, b, **kwargs): - ny, nx = r.shape - R = np.zeros([ny, nx, 3], dtype="d") - R[:,:,0] = r - G = np.zeros_like(R) - G[:,:,1] = g - B = np.zeros_like(R) - B[:,:,2] = b - - RGB = R + G + B - - im_rgb = self.RGB.imshow(RGB, **kwargs) - im_r = self.R.imshow(R, **kwargs) - im_g = self.G.imshow(G, **kwargs) - im_b = self.B.imshow(B, **kwargs) - - return im_rgb, im_r, im_g, im_b +class RGBAxes(RGBAxesBase): + _defaultAxesClass = Axes + diff -Nru matplotlib-0.99.3/lib/mpl_toolkits/axes_grid/axes_size.py matplotlib-1.0.1/lib/mpl_toolkits/axes_grid/axes_size.py --- matplotlib-0.99.3/lib/mpl_toolkits/axes_grid/axes_size.py 2009-07-31 15:14:32.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_toolkits/axes_grid/axes_size.py 2010-07-07 01:41:47.000000000 +0000 @@ -1,208 +1 @@ - -""" -provides a classese of simlpe units that will be used with AxesDivider -class (or others) to determine the size of each axes. The unit -classes define `get_size` method that returns a tuple of two floats, -meaning relative and absolute sizes, respectively. - -Note that this class is nothing more than a simple tuple of two -floats. Take a look at the Divider class to see how these two -values are used. - -""" - -import matplotlib.cbook as cbook - - -class _Base(object): - "Base class" - pass - -class Fixed(_Base): - "Simple fixed size with absolute part = *fixed_size* and relative part = 0" - def __init__(self, fixed_size): - self.fixed_size = fixed_size - - def get_size(self, renderer): - rel_size = 0. - abs_size = self.fixed_size - return rel_size, abs_size - - -class Scaled(_Base): - "Simple scaled(?) size with absolute part = 0 and relative part = *scalable_size*" - def __init__(self, scalable_size): - self._scalable_size = scalable_size - - def get_size(self, renderer): - rel_size = self._scalable_size - abs_size = 0. - return rel_size, abs_size - -Scalable=Scaled - - -class AxesX(_Base): - """ - Scaled size whose relative part corresponds to the data width - of the *axes* multiplied by the *aspect*. - """ - def __init__(self, axes, aspect=1.): - self._axes = axes - self._aspect = aspect - - def get_size(self, renderer): - l1, l2 = self._axes.get_xlim() - rel_size = abs(l2-l1)*self._aspect - abs_size = 0. - return rel_size, abs_size - -class AxesY(_Base): - """ - Scaled size whose relative part corresponds to the data height - of the *axes* multiplied by the *aspect*. - """ - def __init__(self, axes, aspect=1.): - self._axes = axes - self._aspect = aspect - - def get_size(self, renderer): - l1, l2 = self._axes.get_ylim() - rel_size = abs(l2-l1)*self._aspect - abs_size = 0. - return rel_size, abs_size - - -class MaxExtent(_Base): - """ - Size whose absolute part is the largest width (or height) of - the given *artist_list*. - """ - def __init__(self, artist_list, w_or_h): - self._artist_list = artist_list - - if w_or_h not in ["width", "height"]: - raise ValueError() - - self._w_or_h = w_or_h - - def add_artist(self, a): - self._artist_list.append(a) - - def get_size(self, renderer): - rel_size = 0. - w_list, h_list = [], [] - for a in self._artist_list: - bb = a.get_window_extent(renderer) - w_list.append(bb.width) - h_list.append(bb.height) - dpi = a.get_figure().get_dpi() - if self._w_or_h == "width": - abs_size = max(w_list)/dpi - elif self._w_or_h == "height": - abs_size = max(h_list)/dpi - - return rel_size, abs_size - - -class MaxWidth(_Base): - """ - Size whose absolute part is the largest width of - the given *artist_list*. - """ - def __init__(self, artist_list): - self._artist_list = artist_list - - def add_artist(self, a): - self._artist_list.append(a) - - def get_size(self, renderer): - rel_size = 0. - w_list = [] - for a in self._artist_list: - bb = a.get_window_extent(renderer) - w_list.append(bb.width) - dpi = a.get_figure().get_dpi() - abs_size = max(w_list)/dpi - - return rel_size, abs_size - - - -class MaxHeight(_Base): - """ - Size whose absolute part is the largest height of - the given *artist_list*. - """ - def __init__(self, artist_list): - self._artist_list = artist_list - - def add_artist(self, a): - self._artist_list.append(a) - - def get_size(self, renderer): - rel_size = 0. - h_list = [] - for a in self._artist_list: - bb = a.get_window_extent(renderer) - h_list.append(bb.height) - dpi = a.get_figure().get_dpi() - abs_size = max(h_list)/dpi - - return rel_size, abs_size - - -class Fraction(_Base): - """ - An instance whose size is a *fraction* of the *ref_size*. - - >>> s = Fraction(0.3, AxesX(ax)) - - """ - def __init__(self, fraction, ref_size): - self._fraction_ref = ref_size - self._fraction = fraction - - def get_size(self, renderer): - if self._fraction_ref is None: - return self._fraction, 0. - else: - r, a = self._fraction_ref.get_size(renderer) - rel_size = r*self._fraction - abs_size = a*self._fraction - return rel_size, abs_size - -class Padded(_Base): - """ - Return a instance where the absolute part of *size* is - increase by the amount of *pad*. - """ - def __init__(self, size, pad): - self._size = size - self._pad = pad - - def get_size(self, renderer): - r, a = self._size.get_size(renderer) - rel_size = r - abs_size = a + self._pad - return rel_size, abs_size - -def from_any(size, fraction_ref=None): - """ - Creates Fixed unit when the first argument is a float, or a - Fraction unit if that is a string that ends with %. The second - argument is only meaningful when Fraction unit is created. - - >>> a = Size.from_any(1.2) # => Size.Fixed(1.2) - >>> Size.from_any("50%", a) # => Size.Fraction(0.5, a) - - """ - if cbook.is_numlike(size): - return Fixed(size) - elif cbook.is_string_like(size): - if size[-1] == "%": - return Fraction(float(size[:-1])/100., fraction_ref) - - raise ValueError("Unknown format") - - +from mpl_toolkits.axes_grid1.axes_size import * diff -Nru matplotlib-0.99.3/lib/mpl_toolkits/axes_grid/axis_artist.py matplotlib-1.0.1/lib/mpl_toolkits/axes_grid/axis_artist.py --- matplotlib-0.99.3/lib/mpl_toolkits/axes_grid/axis_artist.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_toolkits/axes_grid/axis_artist.py 2010-07-07 01:41:47.000000000 +0000 @@ -0,0 +1 @@ +from mpl_toolkits.axisartist.axis_artist import * diff -Nru matplotlib-0.99.3/lib/mpl_toolkits/axes_grid/axislines.py matplotlib-1.0.1/lib/mpl_toolkits/axes_grid/axislines.py --- matplotlib-0.99.3/lib/mpl_toolkits/axes_grid/axislines.py 2009-07-31 15:14:32.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_toolkits/axes_grid/axislines.py 2010-07-07 01:41:47.000000000 +0000 @@ -1,1481 +1 @@ -""" -Axislines includes modified implementation of the Axes class. The -biggest difference is that the artists responsible to draw axis line, -ticks, ticklabel and axis labels are separated out from the mpl's Axis -class, which are much more than artists in the original -mpl. Originally, this change was motivated to support curvlinear -grid. Here are a few reasons that I came up with new axes class. - - - * "top" and "bottom" x-axis (or "left" and "right" y-axis) can have - different ticks (tick locations and labels). This is not possible - with the current mpl, although some twin axes trick can help. - - * Curvelinear grid. - - * angled ticks. - -In the new axes class, xaxis and yaxis is set to not visible by -default, and new set of artist (AxisArtist) are defined to draw axis -line, ticks, ticklabels and axis label. Axes.axis attribute serves as -a dictionary of these artists, i.e., ax.axis["left"] is a AxisArtist -instance responsible to draw left y-axis. The default Axes.axis contains -"bottom", "left", "top" and "right". - -AxisArtist can be considered as a container artist and -has following children artists which will draw ticks, labels, etc. - - * line - * major_ticks, major_ticklabels - * minor_ticks, minor_ticklabels - * offsetText - * label - -Note that these are separate artists from Axis class of the -original mpl, thus most of tick-related command in the original mpl -won't work, although some effort has made to work with. For example, -color and markerwidth of the ax.axis["bottom"].major_ticks will follow -those of Axes.xaxis unless explicitly specified. - -In addition to AxisArtist, the Axes will have *gridlines* attribute, -which obviously draws grid lines. The gridlines needs to be separated -from the axis as some gridlines can never pass any axis. - -""" - -import matplotlib.axes as maxes -import matplotlib.artist as martist -import matplotlib.text as mtext -import matplotlib.font_manager as font_manager - -from matplotlib.path import Path -from matplotlib.transforms import Affine2D, ScaledTranslation, \ - IdentityTransform, TransformedPath, Bbox -from matplotlib.collections import LineCollection - -from matplotlib import rcParams - -from matplotlib.artist import allow_rasterization - -import warnings - -import numpy as np - - -import matplotlib.lines as mlines - - - -class BezierPath(mlines.Line2D): - - def __init__(self, path, *kl, **kw): - mlines.Line2D.__init__(self, [], [], *kl, **kw) - self._path = path - self._invalid = False - - def recache(self): - - self._transformed_path = TransformedPath(self._path, self.get_transform()) - - self._invalid = False - - def set_path(self, path): - self._path = path - self._invalid = True - - - def draw(self, renderer): - if self._invalid: - self.recache() - - renderer.open_group('line2d') - - if not self._visible: return - gc = renderer.new_gc() - self._set_gc_clip(gc) - - gc.set_foreground(self._color) - gc.set_antialiased(self._antialiased) - gc.set_linewidth(self._linewidth) - gc.set_alpha(self._alpha) - if self.is_dashed(): - cap = self._dashcapstyle - join = self._dashjoinstyle - else: - cap = self._solidcapstyle - join = self._solidjoinstyle - gc.set_joinstyle(join) - gc.set_capstyle(cap) - - funcname = self._lineStyles.get(self._linestyle, '_draw_nothing') - if funcname != '_draw_nothing': - tpath, affine = self._transformed_path.get_transformed_path_and_affine() - lineFunc = getattr(self, funcname) - lineFunc(renderer, gc, tpath, affine.frozen()) - - gc.restore() - renderer.close_group('line2d') - - - -class UnimplementedException(Exception): - pass - - - -class AxisArtistHelper(object): - """ - AxisArtistHelper should define - following method with given APIs. Note that the first axes argument - will be axes attribute of the caller artist. - - - # LINE (spinal line?) - - def get_line(self, axes): - # path : Path - return path - - def get_line_transform(self, axes): - # ... - # trans : transform - return trans - - # LABEL - - def get_label_pos(self, axes): - # x, y : position - return (x, y), trans - - - def get_label_offset_transform(self, \ - axes, - pad_points, fontprops, renderer, - bboxes, - ): - # va : vertical alignment - # ha : horizontal alignment - # a : angle - return trans, va, ha, a - - # TICK - - def get_tick_transform(self, axes): - return trans - - def get_tick_iterators(self, axes): - # iter : iteratoable object that yields (c, angle, l) where - # c, angle, l is position, tick angle, and label - - return iter_major, iter_minot - - - """ - - class _Base(object): - """ - Base class for axis helper. - """ - def __init__(self, label_direction): - """ - label direction must be one of - ["left", "right", "bottom", "top", - "curved"] - """ - self.label_direction = label_direction - - def update_lim(self, axes): - pass - - _label_angles = dict(left=90, right=90, bottom=0, top=0) - _ticklabel_angles = dict(left=0, right=0, bottom=0, top=0) - - def _get_label_offset_transform(self, pad_points, fontprops, - renderer, bboxes=None): - - """ - Returns (offset-transform, vertical-alignment, horiz-alignment) - of (tick or axis) labels appropriate for the label - direction. - - The offset-transform represents a required pixel offset - from the reference point. For example, x-axis center will - be the referece point for xlabel. - - pad_points : padding from axis line or tick labels (see bboxes) - fontprops : font properties for label - renderer : renderer - bboxes=None : list of bboxes (window extents) of the tick labels. - This only make sense for axis label. - - all the above parameters are used to estimate the offset. - - """ - if renderer: - pad_pixels = renderer.points_to_pixels(pad_points) - font_size_points = fontprops.get_size_in_points() - font_size_pixels = renderer.points_to_pixels(font_size_points) - else: - pad_pixels = pad_points - font_size_points = fontprops.get_size_in_points() - font_size_pixels = font_size_points - - if bboxes: - bbox = Bbox.union(bboxes) - w, h = bbox.width, bbox.height - else: - w, h = 0, 0 - - - tr = Affine2D() - if self.label_direction == "left": - tr.translate(-(pad_pixels+w), 0.) - - return tr, "center", "right" - - elif self.label_direction == "right": - tr.translate(+(pad_pixels+w), 0.) - - return tr, "center", "left" - - elif self.label_direction == "bottom": - tr.translate(0, -(pad_pixels+font_size_pixels+h)) - - return tr, "baseline", "center" - - elif self.label_direction == "top": - tr.translate(0, +(pad_pixels+h)) - - return tr, "baseline", "center" - - elif self.label_direction == "curved": - #tr.translate(0, +(pad_pixels+h)) - - return tr, "baseline", "center" - - else: - raise ValueError("Unknown label direction : %s" \ - % (self.label_direction,)) - - - def get_label_offset_transform(self, axes, - pad_points, fontprops, renderer, - bboxes, - ): - """ - offset transform for axis label. - """ - - tr, va, ha = self._get_label_offset_transform( \ - pad_points, fontprops, renderer, bboxes) - - a = self._label_angles[self.label_direction] - return tr, va, ha, a - - - def get_ticklabel_offset_transform(self, axes, - pad_points, fontprops, - renderer, - ): - """ - offset transform for ticklabels. - """ - - tr, va, ha = self._get_label_offset_transform( \ - pad_points, fontprops, renderer, None) - - a = self._ticklabel_angles[self.label_direction] - return tr, va, ha, a - - - - class Fixed(_Base): - """ - Helper class for a fixed (in the axes coordinate) axis. - """ - - _default_passthru_pt = dict(left=(0, 0), - right=(1, 0), - bottom=(0, 0), - top=(0, 1)) - - def __init__(self, - loc, - label_direction=None): - """ - nth_coord = along which coordinate value varies - in 2d, nth_coord = 0 -> x axis, nth_coord = 1 -> y axis - """ - if loc not in ["left", "right", "bottom", "top"]: - raise ValueError("%s" % loc) - - #if nth_coord is None: - if loc in ["left", "right"]: - nth_coord = 1 - elif loc in ["bottom", "top"]: - nth_coord = 0 - - self.nth_coord = nth_coord - - super(AxisArtistHelper.Fixed, self).__init__(loc) - - self.passthru_pt = self._default_passthru_pt[loc] - if label_direction is None: - label_direction = loc - - - - _verts = np.array([[0., 0.], - [1., 1.]]) - fixed_coord = 1-nth_coord - _verts[:,fixed_coord] = self.passthru_pt[fixed_coord] - - # axis line in transAxes - self._path = Path(_verts) - - - def get_nth_coord(self): - return self.nth_coord - - # LINE - - def get_line(self, axes): - return self._path - - def get_line_transform(self, axes): - return axes.transAxes - - # LABEL - - def get_label_pos(self, axes): - """ - label reference position in transAxes. - - get_label_transform() returns a transform of (transAxes+offset) - """ - _verts = [0.5, 0.5] - nth_coord = self.nth_coord - fixed_coord = 1-nth_coord - _verts[fixed_coord] = self.passthru_pt[fixed_coord] - return _verts, axes.transAxes - - - def get_label_offset_transform(self, axes, - pad_points, fontprops, renderer, - bboxes, - ): - - tr, va, ha = self._get_label_offset_transform( \ - pad_points, fontprops, renderer, bboxes, - ) - - a = self._label_angles[self.label_direction] - - return tr, va, ha, a - - - - # TICK - - def get_tick_transform(self, axes): - trans_tick = [axes.get_xaxis_transform(), - axes.get_yaxis_transform()][self.nth_coord] - - return trans_tick - - - - class Floating(_Base): - def __init__(self, nth_coord, - value, label_direction): - - self.nth_coord = nth_coord - - self._value = value - - super(AxisArtistHelper.Floating, - self).__init__(label_direction) - - - def get_nth_coord(self): - return self.nth_coord - - def get_line(self, axes): - raise RuntimeError("get_line method should be defined by the derived class") - - - - -class AxisArtistHelperRectlinear: - - class Fixed(AxisArtistHelper.Fixed): - - def __init__(self, - axes, loc, #nth_coord=None, - label_direction=None): - """ - nth_coord = along which coordinate value varies - in 2d, nth_coord = 0 -> x axis, nth_coord = 1 -> y axis - """ - - super(AxisArtistHelperRectlinear.Fixed, self).__init__( \ - loc, label_direction) - - self.axis = [axes.xaxis, axes.yaxis][self.nth_coord] - - - - # TICK - - def get_tick_iterators(self, axes): - """tick_loc, tick_angle, tick_label""" - - angle = 0 - 90 * self.nth_coord - if self.passthru_pt[1 - self.nth_coord] > 0.5: - angle = 180+angle - - - # take care the tick direction - if self.nth_coord == 0 and rcParams["xtick.direction"] == "out": - angle += 180 - elif self.nth_coord == 1 and rcParams["ytick.direction"] == "out": - angle += 180 - - major = self.axis.major - majorLocs = major.locator() - major.formatter.set_locs(majorLocs) - majorLabels = [major.formatter(val, i) for i, val in enumerate(majorLocs)] - - minor = self.axis.minor - minorLocs = minor.locator() - minor.formatter.set_locs(minorLocs) - minorLabels = [minor.formatter(val, i) for i, val in enumerate(minorLocs)] - - trans_tick = self.get_tick_transform(axes) - - tr2ax = trans_tick + axes.transAxes.inverted() - - def _f(locs, labels): - for x, l in zip(locs, labels): - - c = list(self.passthru_pt) # copy - c[self.nth_coord] = x - - # check if the tick point is inside axes - c2 = tr2ax.transform_point(c) - delta=0.00001 - if 0. -delta<= c2[self.nth_coord] <= 1.+delta: - yield c, angle, l - - return _f(majorLocs, majorLabels), _f(minorLocs, minorLabels) - - - - class Floating(AxisArtistHelper.Floating): - def __init__(self, axes, nth_coord, - passingthrough_point, label_direction): - - super(AxisArtistHelperRectlinear.Floating, self).__init__( \ - nth_coord, passingthrough_point, label_direction) - - self.axis = [axes.xaxis, axes.yaxis][self.nth_coord] - - - def get_line(self, axes): - _verts = np.array([[0., 0.], - [1., 1.]]) - - fixed_coord = 1-self.nth_coord - trans_passingthrough_point = axes.transData + axes.transAxes.inverted() - p = trans_passingthrough_point.transform_point([self._value, - self._value]) - _verts[:,fixed_coord] = p[fixed_coord] - - return Path(_verts) - - def get_line_transform(self, axes): - return axes.transAxes - - def get_label_pos(self, axes): - _verts = [0.5, 0.5] - - fixed_coord = 1-self.nth_coord - trans_passingthrough_point = axes.transData + axes.transAxes.inverted() - p = trans_passingthrough_point.transform_point([self._value, - self._value]) - _verts[fixed_coord] = p[fixed_coord] - if not (0. <= _verts[fixed_coord] <= 1.): - return None, None - else: - return _verts, axes.transAxes - - def get_label_transform(self, axes, - pad_points, fontprops, renderer, - bboxes, - ): - - tr, va, ha = self._get_label_offset_transform(pad_points, fontprops, - renderer, bboxes) - - a = self._label_angles[self.label_direction] - tr = axes.transAxes + tr - - return tr, va, ha, a - - - def get_tick_transform(self, axes): - return axes.transData - - - def get_tick_iterators(self, axes): - """tick_loc, tick_angle, tick_label""" - - angle = 0 - 90 * self.nth_coord - - major = self.axis.major - majorLocs = major.locator() - major.formatter.set_locs(majorLocs) - majorLabels = [major.formatter(val, i) for i, val in enumerate(majorLocs)] - - minor = self.axis.minor - minorLocs = minor.locator() - minor.formatter.set_locs(minorLocs) - minorLabels = [minor.formatter(val, i) for i, val in enumerate(minorLocs)] - - tr2ax = axes.transData + axes.transAxes.inverted() - - def _f(locs, labels): - for x, l in zip(locs, labels): - - c = [self._value, self._value] - c[self.nth_coord] = x - c1, c2 = tr2ax.transform_point(c) - if 0. <= c1 <= 1. and 0. <= c2 <= 1.: - yield c, angle, l - - return _f(majorLocs, majorLabels), _f(minorLocs, minorLabels) - - - - - -class GridHelperBase(object): - - def __init__(self): - self._force_update = True - self._old_limits = None - super(GridHelperBase, self).__init__() - - - def update_lim(self, axes): - x1, x2 = axes.get_xlim() - y1, y2 = axes.get_ylim() - - if self._force_update or self._old_limits != (x1, x2, y1, y2): - self._update(x1, x2, y1, y2) - self._force_update = False - self._old_limits = (x1, x2, y1, y2) - - - def _update(self, x1, x2, y1, y2): - pass - - - def invalidate(self): - self._force_update = True - - def valid(self): - return not self._force_update - - - def get_gridlines(self): - return [] - - - -class GridHelperRectlinear(GridHelperBase): - - - def __init__(self, axes): - - super(GridHelperRectlinear, self).__init__() - self.axes = axes - - - - def new_fixed_axis(self, loc, - nth_coord=None, - tick_direction="in", - label_direction=None, - offset=None, - axes=None, - ): - - if axes is None: - warnings.warn("'new_fixed_axis' explicitly requires the axes keyword.") - axes = self.axes - - _helper = AxisArtistHelperRectlinear.Fixed(axes, loc, nth_coord) - - axisline = AxisArtist(axes, _helper, offset=offset) - - return axisline - - - def new_floating_axis(self, nth_coord, value, - tick_direction="in", - label_direction=None, - axes=None, - ): - - if axes is None: - warnings.warn("'new_floating_axis' explicitly requires the axes keyword.") - axes = self.axes - - passthrough_point = (value, value) - transform = axes.transData - - _helper = AxisArtistHelperRectlinear.Floating( \ - axes, nth_coord, value, label_direction) - - axisline = AxisArtist(axes, _helper) - - axisline.line.set_clip_on(True) - axisline.line.set_clip_box(axisline.axes.bbox) - return axisline - - - - -from matplotlib.lines import Line2D - -class Ticks(Line2D): - def __init__(self, ticksize, tick_out=False, **kwargs): - """ - ticksize : ticksize - tick_out : tick is directed outside (rotated by 180 degree) if True. default is False. - """ - self.ticksize = ticksize - self.locs_angles = [] - - self.set_tick_out(tick_out) - - self._axis = kwargs.pop("axis", None) - if self._axis is not None: - if "color" not in kwargs: - kwargs["color"] = "auto" - if ("mew" not in kwargs) and ("markeredgewidth" not in kwargs): - kwargs["markeredgewidth"] = "auto" - - super(Ticks, self).__init__([0.], [0.], **kwargs) - self.set_snap(True) - - def set_tick_out(self, b): - """ - set True if tick need to be rotated by 180 degree. - """ - self._tick_out = b - - def get_tick_out(self): - """ - Return True if the tick will be rotated by 180 degree. - """ - return self._tick_out - - def get_color(self): - if self._color == 'auto': - if self._axis is not None: - ticklines = self._axis.get_ticklines() - if ticklines: - color_from_axis = ticklines[0].get_color() - return color_from_axis - return "k" - - return super(Ticks, self).get_color() - - - def get_markeredgecolor(self): - if self._markeredgecolor == 'auto': - return self.get_color() - else: - return self._markeredgecolor - - def get_markeredgewidth(self): - if self._markeredgewidth == 'auto': - if self._axis is not None: - ticklines = self._axis.get_ticklines() - if ticklines: - width_from_axis = ticklines[0].get_markeredgewidth() - return width_from_axis - return .5 - - else: - return self._markeredgewidth - - - def update_ticks(self, locs_angles_labels, renderer): - self.locs_angles_labels = locs_angles_labels - - _tickvert_path = Path([[0., 0.], [0., 1.]]) - - def draw(self, renderer): - if not self.get_visible(): - return - size = self.ticksize - path_trans = self.get_transform() - - # set gc : copied from lines.py -# gc = renderer.new_gc() -# self._set_gc_clip(gc) - -# gc.set_foreground(self.get_color()) -# gc.set_antialiased(self._antialiased) -# gc.set_linewidth(self._linewidth) -# gc.set_alpha(self._alpha) -# if self.is_dashed(): -# cap = self._dashcapstyle -# join = self._dashjoinstyle -# else: -# cap = self._solidcapstyle -# join = self._solidjoinstyle -# gc.set_joinstyle(join) -# gc.set_capstyle(cap) -# gc.set_snap(self.get_snap()) - - - gc = renderer.new_gc() - self._set_gc_clip(gc) - gc.set_foreground(self.get_markeredgecolor()) - gc.set_linewidth(self.get_markeredgewidth()) - gc.set_alpha(self._alpha) - - offset = renderer.points_to_pixels(size) - marker_scale = Affine2D().scale(offset, offset) - - tick_out = self.get_tick_out() - for loc, angle, _ in self.locs_angles_labels: - - if tick_out: - angle += 180 - marker_rotation = Affine2D().rotate_deg(angle) - #marker_rotation.clear().rotate_deg(angle) - marker_transform = marker_scale + marker_rotation - locs = path_trans.transform_non_affine(np.array([loc, loc])) - renderer.draw_markers(gc, self._tickvert_path, marker_transform, - Path(locs), path_trans.get_affine()) - - gc.restore() - - - - -class TickLabels(mtext.Text): - - def __init__(self, size, **kwargs): - self.locs_angles_labels = [] - - self._axis = kwargs.pop("axis", None) - if self._axis is not None: - if "color" not in kwargs: - kwargs["color"] = "auto" - - super(TickLabels, self).__init__(x=0., y=0., text="", - **kwargs - ) - self._rotate_ticklabel = None - - def set_rotate_along_line(self, b): - self._rotate_ticklabel = b - - def get_rotate_along_line(self): - return self._rotate_ticklabel - - def update_ticks(self, locs_angles_labels, renderer): - self.locs_angles_labels = locs_angles_labels - - def get_color(self): - if self._color == 'auto': - if self._axis is not None: - ticklabels = self._axis.get_ticklabels() - if ticklabels: - color_from_axis = ticklabels[0].get_color() - return color_from_axis - return "k" - - return super(TickLabels, self).get_color() - - - def draw(self, renderer): - if not self.get_visible(): return - - if self.get_rotate_along_line(): - # curved axis - - # save original and adjust some properties - tr = self.get_transform() - rm = self.get_rotation_mode() - - self.set_rotation_mode("anchor") - offset_tr = Affine2D() - self.set_transform(tr+offset_tr) - - # estimate pad - dd = 5 + renderer.points_to_pixels(self.get_size()) - - for (x, y), a, l in self.locs_angles_labels: - theta = (a+90.)/180.*np.pi - dx, dy = dd * np.cos(theta), dd * np.sin(theta) - offset_tr.translate(dx, dy) - self.set_rotation(a-180) - self.set_x(x) - self.set_y(y) - self.set_text(l) - super(TickLabels, self).draw(renderer) - offset_tr.clear() - - # restore original properties - self.set_transform(tr) - self.set_rotation_mode(rm) - else: - for (x, y), a, l in self.locs_angles_labels: - self.set_x(x) - self.set_y(y) - self.set_text(l) - super(TickLabels, self).draw(renderer) - - - def get_window_extents(self, renderer): - bboxes = [] - for (x, y), a, l in self.locs_angles_labels: - self.set_x(x) - self.set_y(y) - self.set_text(l) - - bboxes.append(self.get_window_extent()) - - return [b for b in bboxes if b.width!=0 or b.height!=0] - - - - -class AxisLabel(mtext.Text): - def __init__(self, *kl, **kwargs): - self._axis = kwargs.pop("axis", None) - if self._axis is not None: - if "color" not in kwargs: - kwargs["color"] = "auto" - - super(AxisLabel, self).__init__(*kl, **kwargs) - - def get_color(self): - if self._color == 'auto': - if self._axis is not None: - label = self._axis.get_label() - if label: - color_from_axis = label.get_color() - return color_from_axis - return "k" - - return super(AxisLabel, self).get_color() - - def get_text(self): - t = super(AxisLabel, self).get_text() - if t == "__from_axes__": - return self._axis.get_label().get_text() - return self._text - - -class GridlinesCollection(LineCollection): - def __init__(self, *kl, **kwargs): - super(GridlinesCollection, self).__init__(*kl, **kwargs) - self.set_grid_helper(None) - - def set_grid_helper(self, grid_helper): - self._grid_helper = grid_helper - - def draw(self, renderer): - if self._grid_helper is not None: - self._grid_helper.update_lim(self.axes) - gl = self._grid_helper.get_gridlines() - if gl: - self.set_segments([np.transpose(l) for l in gl]) - else: - self.set_segments([]) - super(GridlinesCollection, self).draw(renderer) - - - - -class AxisArtist(martist.Artist): - """ - an artist which draws axis (a line along which the n-th axes coord - is constant) line, ticks, ticklabels, and axis label. - - It requires an AxisArtistHelper instance. - """ - - LABELPAD = 5 - ZORDER=2.5 - - def __init__(self, axes, - helper, - offset=None, - major_tick_size=None, - major_tick_pad=None, - minor_tick_size=None, - minor_tick_pad=None, - **kw): - """ - axes is also used to follow the axis attribute (tick color, etc). - """ - super(AxisArtist, self).__init__(**kw) - - self.axes = axes - - self._axis_artist_helper = helper - - if offset is None: - offset = (0, 0) - self.dpi_transform = Affine2D() - self.offset_transform = ScaledTranslation(offset[0], offset[1], - self.dpi_transform) - - self._label_visible = True - self._majortick_visible = True - self._majorticklabel_visible = True - self._minortick_visible = True - self._minorticklabel_visible = True - - - if self._axis_artist_helper.label_direction in ["left", "right"]: - axis_name = "ytick" - self.axis = axes.yaxis - else: - axis_name = "xtick" - self.axis = axes.xaxis - - - if major_tick_size is None: - self.major_tick_size = rcParams['%s.major.size'%axis_name] - if major_tick_pad is None: - self.major_tick_pad = rcParams['%s.major.pad'%axis_name] - if minor_tick_size is None: - self.minor_tick_size = rcParams['%s.minor.size'%axis_name] - if minor_tick_pad is None: - self.minor_tick_pad = rcParams['%s.minor.pad'%axis_name] - - self._init_line() - self._init_ticks() - self._init_offsetText(self._axis_artist_helper.label_direction) - self._init_label() - - self.set_zorder(self.ZORDER) - - self._rotate_label_along_line = False - - def set_rotate_label_along_line(self, b): - self._rotate_label_along_line = b - - def get_rotate_label_along_line(self): - return self._rotate_label_along_line - - def get_transform(self): - return self.axes.transAxes + self.offset_transform - - def get_helper(self): - return self._axis_artist_helper - - - def _init_line(self): - tran = self._axis_artist_helper.get_line_transform(self.axes) \ - + self.offset_transform - self.line = BezierPath(self._axis_artist_helper.get_line(self.axes), - color=rcParams['axes.edgecolor'], - linewidth=rcParams['axes.linewidth'], - transform=tran) - - def _draw_line(self, renderer): - self.line.set_path(self._axis_artist_helper.get_line(self.axes)) - self.line.draw(renderer) - - - def _init_ticks(self): - - transform=self._axis_artist_helper.get_tick_transform(self.axes) \ - + self.offset_transform - - self.major_ticks = Ticks(self.major_tick_size, - axis=self.axis, - transform=transform) - self.minor_ticks = Ticks(self.minor_tick_size, - axis=self.axis, - transform=transform) - - - size = rcParams['xtick.labelsize'] - - fontprops = font_manager.FontProperties(size=size) - tvhl = self._axis_artist_helper.get_ticklabel_offset_transform( \ - self.axes, self.major_tick_pad, - fontprops=fontprops, renderer=None) - - trans, vert, horiz, label_a = tvhl - trans = transform + trans - - # ignore ticklabel angle during the drawing time (but respect - # during init). Instead, use angle set by the TickLabel - # artist. - - self.major_ticklabels = TickLabels(size, axis=self.axis) - self.minor_ticklabels = TickLabels(size, axis=self.axis) - - - self.major_ticklabels.set(figure = self.axes.figure, - transform=trans, - va=vert, - ha=horiz, - fontproperties=fontprops) - - self.minor_ticklabels.set(figure = self.axes.figure, - transform=trans, - va=vert, - ha=horiz, - fontproperties=fontprops) - - - _offsetText_pos = dict(left=(0, 1, "bottom", "right"), - right=(1, 1, "bottom", "left"), - bottom=(1, 0, "top", "right"), - top=(1, 1, "bottom", "right")) - - def _init_offsetText(self, direction): - - x,y,va,ha = self._offsetText_pos[direction] - - self.offsetText = mtext.Annotation("", - xy=(x,y), xycoords="axes fraction", - xytext=(0,0), textcoords="offset points", - #fontproperties = fp, - color = rcParams['xtick.color'], - verticalalignment=va, - horizontalalignment=ha, - ) - self.offsetText.set_transform(IdentityTransform()) - self.axes._set_artist_props(self.offsetText) - - - def _update_offsetText(self): - self.offsetText.set_text( self.axis.major.formatter.get_offset() ) - self.offsetText.set_size(self.major_ticklabels.get_size()) - offset = self.major_tick_pad + self.major_ticklabels.get_size() + 2. - self.offsetText.xytext= (0, offset) - - - def _draw_offsetText(self, renderer): - self._update_offsetText() - self.offsetText.draw(renderer) - - - def _draw_ticks(self, renderer): - - majortick_iter, minortick_iter = \ - self._axis_artist_helper.get_tick_iterators(self.axes) - - tick_loc_angle_label = list(majortick_iter) - - transform=self._axis_artist_helper.get_tick_transform(self.axes) \ - + self.offset_transform - fontprops = font_manager.FontProperties(size=12) - tvhl = self._axis_artist_helper.get_ticklabel_offset_transform( \ - self.axes, - self.major_tick_pad, - fontprops=fontprops, - renderer=renderer, - ) - - trans, va, ha, a = tvhl - trans = transform + trans - - # ignore va, ha, angle during the drawing time - - self.major_ticklabels.set_transform(trans) - - - self.major_ticks.update_ticks(tick_loc_angle_label, renderer) - self.major_ticklabels.update_ticks(tick_loc_angle_label, renderer) - - self.major_ticks.draw(renderer) - self.major_ticklabels.draw(renderer) - - tick_loc_angle_label = list(minortick_iter) - - self.minor_ticks.update_ticks(tick_loc_angle_label, renderer) - self.minor_ticklabels.update_ticks(tick_loc_angle_label, renderer) - - self.minor_ticks.draw(renderer) - self.minor_ticklabels.draw(renderer) - - if (self.major_ticklabels.get_visible() or self.minor_ticklabels.get_visible()): - self._draw_offsetText(renderer) - - return self.major_ticklabels.get_window_extents(renderer) - - - def _init_label(self): - # x in axes coords, y in display coords (to be updated at draw - # time by _update_label_positions) - - fontprops = font_manager.FontProperties(size=rcParams['axes.labelsize']) - textprops = dict(fontproperties = fontprops, - color = rcParams['axes.labelcolor'], - ) - - self.label = AxisLabel(0, 0, "__from_axes__", - color = "auto", #rcParams['axes.labelcolor'], - fontproperties=fontprops, - axis=self.axis, - ) - - self.label.set_figure(self.axes.figure) - - - def _draw_label(self, renderer, bboxes): - - if not self.label.get_visible(): - return - - fontprops = font_manager.FontProperties(size=rcParams['axes.labelsize']) - - pad_points = self.major_tick_pad - - if self.get_rotate_label_along_line(): - xy, tr, label_a = self._axis_artist_helper.get_label_pos( \ - self.axes, with_angle=True) - if xy is None: return - - x, y = xy - - offset_tr = Affine2D() - if self.major_ticklabels.get_visible(): - dd = renderer.points_to_pixels(self.major_ticklabels.get_size() \ - + pad_points + 2*self.LABELPAD ) - else: - dd = renderer.points_to_pixels(pad_points + 2*self.LABELPAD) - - theta = label_a - 0.5 * np.pi #(label_a)/180.*np.pi - dx, dy = dd * np.cos(theta), dd * np.sin(theta) - offset_tr.translate(dx, dy) - tr2 = (tr+offset_tr) #+ tr2 - - self.label.set(x=x, y=y, - rotation_mode="anchor", - transform=tr2, - va="center", ha="center", - rotation=label_a/np.pi*180.) - else: - xy, tr = self._axis_artist_helper.get_label_pos(self.axes) - if xy is None: return - - x, y = xy - tr2, va, ha, a = self._axis_artist_helper.get_label_offset_transform(\ - self.axes, - pad_points+2*self.LABELPAD, fontprops, - renderer, - bboxes=bboxes, - ) - tr2 = (tr+self.offset_transform) + tr2 - - self.label.set(x=x, y=y, - transform=tr2, - va=va, ha=ha, rotation=a) - - self.label.draw(renderer) - - - def set_label(self, s): - self.label.set_text(s) - - - @allow_rasterization - def draw(self, renderer): - 'Draw the axis lines, tick lines and labels' - - if not self.get_visible(): return - - renderer.open_group(__name__) - - self._axis_artist_helper.update_lim(self.axes) - - dpi_cor = renderer.points_to_pixels(1.) - self.dpi_transform.clear().scale(dpi_cor, dpi_cor) - - - self._draw_line(renderer) - bboxes = self._draw_ticks(renderer) - - #self._draw_offsetText(renderer) - self._draw_label(renderer, bboxes) - - renderer.close_group(__name__) - - def get_ticklabel_extents(self, renderer): - pass - - def toggle(self, all=None, ticks=None, ticklabels=None, label=None): - if all: - _ticks, _ticklabels, _label = True, True, True - elif all is not None: - _ticks, _ticklabels, _label = False, False, False - else: - _ticks, _ticklabels, _label = None, None, None - - if ticks is not None: - _ticks = ticks - if ticklabels is not None: - _ticklabels = ticklabels - if label is not None: - _label = label - - if _ticks is not None: - self.major_ticks.set_visible(_ticks) - self.minor_ticks.set_visible(_ticks) - if _ticklabels is not None: - self.major_ticklabels.set_visible(_ticklabels) - self.minor_ticklabels.set_visible(_ticklabels) - if _label is not None: - self.label.set_visible(_label) - - -class Axes(maxes.Axes): - - class AxisDict(dict): - def __init__(self, axes): - self.axes = axes - super(Axes.AxisDict, self).__init__() - - def __call__(self, *v, **kwargs): - return maxes.Axes.axis(self.axes, *v, **kwargs) - - - def __init__(self, *kl, **kw): - - - helper = kw.pop("grid_helper", None) - - if helper: - self._grid_helper = helper - else: - self._grid_helper = GridHelperRectlinear(self) - - self._axisline_on = True - - super(Axes, self).__init__(*kl, **kw) - - self.toggle_axisline(True) - - - def toggle_axisline(self, b=None): - if b is None: - b = not self._axisline_on - if b: - self._axisline_on = True - for s in self.spines.values(): - s.set_visible(False) - self.xaxis.set_visible(False) - self.yaxis.set_visible(False) - else: - self._axisline_on = False - for s in self.spines.values(): - s.set_visible(True) - self.xaxis.set_visible(True) - self.yaxis.set_visible(True) - - - def _init_axis(self): - super(Axes, self)._init_axis() - - - def _init_axis_artists(self): - self._axislines = self.AxisDict(self) - new_fixed_axis = self.get_grid_helper().new_fixed_axis - for loc in ["bottom", "top", "left", "right"]: - self._axislines[loc] = new_fixed_axis(loc=loc, axes=self) - - for axisline in [self._axislines["top"], self._axislines["right"]]: - axisline.label.set_visible(False) - axisline.major_ticklabels.set_visible(False) - axisline.minor_ticklabels.set_visible(False) - - def _get_axislines(self): - return self._axislines - - axis = property(_get_axislines) - - def _init_gridlines(self, grid_helper=None): - gridlines = GridlinesCollection(None, transform=self.transData, - colors=rcParams['grid.color'], - linestyles=rcParams['grid.linestyle'], - linewidths=rcParams['grid.linewidth']) - self._set_artist_props(gridlines) - if grid_helper is None: - grid_helper = self.get_grid_helper() - gridlines.set_grid_helper(grid_helper) - gridlines.set_clip_on(True) - - self.gridlines = gridlines - - def cla(self): - # gridlines need to b created before cla() since cla calls grid() - self._init_gridlines() - - super(Axes, self).cla() - self._init_axis_artists() - - def get_grid_helper(self): - return self._grid_helper - - - def grid(self, b=None, **kwargs): - if not self._axisline_on: - super(Axes, self).grid(b, **kwargs) - return - - if b is None: - b = not self.gridlines.get_visible() - - self.gridlines.set_visible(b) - - if len(kwargs): - martist.setp(self.gridlines, **kwargs) - - def get_children(self): - if self._axisline_on: - children = self._axislines.values()+[self.gridlines] - else: - children = [] - children.extend(super(Axes, self).get_children()) - return children - - def invalidate_grid_helper(self): - self._grid_helper.invalidate() - - - def new_floating_axis(self, nth_coord, value, - tick_direction="in", - label_direction=None, - ): - gh = self.get_grid_helper() - axis = gh.new_floating_axis(nth_coord, value, - tick_direction=tick_direction, - label_direction=label_direction, - axes=self) - return axis - - - - def draw(self, renderer, inframe=False): - - if not self._axisline_on: - super(Axes, self).draw(renderer, inframe) - return - - orig_artists = self.artists - self.artists = self.artists + list(self._axislines.values()) + [self.gridlines] - - super(Axes, self).draw(renderer, inframe) - - self.artists = orig_artists - - - def get_tightbbox(self, renderer): - - bb0 = super(Axes, self).get_tightbbox(renderer) - - if not self._axisline_on: - return bb0 - - bb = [bb0] - - for axisline in self._axislines.values(): - if not axisline.get_visible(): - continue - - if axisline.label.get_visible(): - bb.append(axisline.label.get_window_extent(renderer)) - - - if axisline.major_ticklabels.get_visible(): - bb.extend(axisline.major_ticklabels.get_window_extents(renderer)) - if axisline.minor_ticklabels.get_visible(): - bb.extend(axisline.minor_ticklabels.get_window_extents(renderer)) - if axisline.major_ticklabels.get_visible() or \ - axisline.minor_ticklabels.get_visible(): - bb.append(axisline.offsetText.get_window_extent(renderer)) - - #bb.extend([c.get_window_extent(renderer) for c in artists \ - # if c.get_visible()]) - - _bbox = Bbox.union([b for b in bb if b.width!=0 or b.height!=0]) - - return _bbox - - - -Subplot = maxes.subplot_class_factory(Axes) - - -class AxesZero(Axes): - def __init__(self, *kl, **kw): - - super(AxesZero, self).__init__(*kl, **kw) - - - def _init_axis_artists(self): - super(AxesZero, self)._init_axis_artists() - - new_floating_axis = self._grid_helper.new_floating_axis - xaxis_zero = new_floating_axis(nth_coord=0, - value=0., - tick_direction="in", - label_direction="bottom", - axes=self) - - xaxis_zero.line.set_clip_path(self.patch) - xaxis_zero.set_visible(False) - self._axislines["xzero"] = xaxis_zero - - yaxis_zero = new_floating_axis(nth_coord=1, - value=0., - tick_direction="in", - label_direction="left", - axes=self) - - - yaxis_zero.line.set_clip_path(self.patch) - yaxis_zero.set_visible(False) - self._axislines["yzero"] = yaxis_zero - -SubplotZero = maxes.subplot_class_factory(AxesZero) - - -if __name__ == "__main__": - import matplotlib.pyplot as plt - - fig = plt.figure(1, (4,3)) - - ax = SubplotZero(fig, 1, 1, 1) - fig.add_subplot(ax) - - ax.axis["xzero"].set_visible(True) - ax.axis["xzero"].label.set_text("Axis Zero") - - for n in ["bottom", "top", "right"]: - ax.axis[n].set_visible(False) - - xx = np.arange(0, 2*np.pi, 0.01) - ax.plot(xx, np.sin(xx)) - ax.set_ylabel("Test") - plt.draw() - plt.show() - - +from mpl_toolkits.axisartist.axislines import * diff -Nru matplotlib-0.99.3/lib/mpl_toolkits/axes_grid/axisline_style.py matplotlib-1.0.1/lib/mpl_toolkits/axes_grid/axisline_style.py --- matplotlib-0.99.3/lib/mpl_toolkits/axes_grid/axisline_style.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_toolkits/axes_grid/axisline_style.py 2010-07-07 01:41:47.000000000 +0000 @@ -0,0 +1 @@ +from mpl_toolkits.axisartist.axisline_style import * diff -Nru matplotlib-0.99.3/lib/mpl_toolkits/axes_grid/clip_path.py matplotlib-1.0.1/lib/mpl_toolkits/axes_grid/clip_path.py --- matplotlib-0.99.3/lib/mpl_toolkits/axes_grid/clip_path.py 2009-07-31 15:14:32.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_toolkits/axes_grid/clip_path.py 2010-07-07 01:41:47.000000000 +0000 @@ -1,125 +1 @@ -import numpy as np -from math import degrees -import math - -def atan2(dy, dx): - if dx == 0 and dx == 0: - print "warning" - return 0 - else: - return math.atan2(dy, dx) - -# FIXME : The current algorithm seems to return incorrect angle when the line -# ends at the boudnary. - -def clip(xlines, ylines, x0, clip="right"): - - clipped_xlines = [] - clipped_ylines = [] - - _pos_angles = [] - - for x, y in zip(xlines, ylines): - - if clip in ["up", "right"]: - b = (x < x0).astype("i") - db = b[1:] - b[:-1] - else: - b = (x > x0).astype("i") - db = b[1:] - b[:-1] - - - if b[0]: - ns = 0 - else: - ns = -1 - segx, segy = [], [] - for (i,) in np.argwhere(db!=0): - c = db[i] - if c == -1: - dx = (x0 - x[i]) - dy = (y[i+1] - y[i]) * (dx/ (x[i+1] - x[i])) - y0 = y[i] + dy - clipped_xlines.append(np.concatenate([segx, x[ns:i+1], [x0]])) - clipped_ylines.append(np.concatenate([segy, y[ns:i+1], [y0]])) - ns = -1 - segx, segy = [], [] - - if dx == 0. and dy == 0: - dx = x[i+1] - x[i] - dy = y[i+1] - y[i] - - a = degrees(atan2(dy, dx)) - _pos_angles.append((x0, y0, a)) - - elif c == 1: - dx = (x0 - x[i]) - dy = (y[i+1] - y[i]) * (dx / (x[i+1] - x[i])) - y0 = y[i] + dy - segx, segy = [x0], [y0] - ns = i+1 - - if dx == 0. and dy == 0: - dx = x[i+1] - x[i] - dy = y[i+1] - y[i] - - a = degrees(atan2(dy, dx)) - _pos_angles.append((x0, y0, a)) - - #print x[i], x[i+1] - - if ns != -1: - clipped_xlines.append(np.concatenate([segx, x[ns:]])) - clipped_ylines.append(np.concatenate([segy, y[ns:]])) - - #clipped_pos_angles.append(_pos_angles) - - - return clipped_xlines, clipped_ylines, _pos_angles - - -def clip_line_to_rect(xline, yline, bbox): - - x0, y0, x1, y1 = bbox.extents - - lx1, ly1, c_right_ = clip([xline], [yline], x1, clip="right") - lx2, ly2, c_left_ = clip(lx1, ly1, x0, clip="left") - ly3, lx3, c_top_ = clip(ly2, lx2, y1, clip="right") - ly4, lx4, c_bottom_ = clip(ly3, lx3, y0, clip="left") - - c_left = [((x, y), (a+90)%180-180) for (x, y, a) in c_left_ \ - if bbox.containsy(y)] - c_bottom = [((x, y), (90 - a)%180-90) for (y, x, a) in c_bottom_ \ - if bbox.containsx(x)] - c_right = [((x, y), (a+90)%180) for (x, y, a) in c_right_ \ - if bbox.containsy(y)] - c_top = [((x, y), (90 - a)%180+90) for (y, x, a) in c_top_ \ - if bbox.containsx(x)] - - return zip(lx4, ly4), [c_left, c_bottom, c_right, c_top] - - -if __name__ == "__main__": - - import matplotlib.pyplot as plt - - x = np.array([-3, -2, -1, 0., 1, 2, 3, 2, 1, 0, -1, -2, -3, 5]) - #x = np.array([-3, -2, -1, 0., 1, 2, 3]) - y = np.arange(len(x)) - #x0 = 2 - - plt.plot(x, y, lw=1) - - from matplotlib.transforms import Bbox - bb = Bbox.from_extents(-2, 3, 2, 12.5) - lxy, ticks = clip_line_to_rect(x, y, bb) - for xx, yy in lxy: - plt.plot(xx, yy, lw=1, color="g") - - ccc = iter(["ro", "go", "rx", "bx"]) - for ttt in ticks: - cc = ccc.next() - for (xx, yy), aa in ttt: - plt.plot([xx], [yy], cc) - - #xlim( +from mpl_toolkits.axisartist.clip_path import * diff -Nru matplotlib-0.99.3/lib/mpl_toolkits/axes_grid/colorbar.py matplotlib-1.0.1/lib/mpl_toolkits/axes_grid/colorbar.py --- matplotlib-0.99.3/lib/mpl_toolkits/axes_grid/colorbar.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_toolkits/axes_grid/colorbar.py 2010-07-07 01:41:47.000000000 +0000 @@ -0,0 +1,816 @@ +''' +Colorbar toolkit with two classes and a function: + + :class:`ColorbarBase` + the base class with full colorbar drawing functionality. + It can be used as-is to make a colorbar for a given colormap; + a mappable object (e.g., image) is not needed. + + :class:`Colorbar` + the derived class for use with images or contour plots. + + :func:`make_axes` + a function for resizing an axes and adding a second axes + suitable for a colorbar + +The :meth:`~matplotlib.figure.Figure.colorbar` method uses :func:`make_axes` +and :class:`Colorbar`; the :func:`~matplotlib.pyplot.colorbar` function +is a thin wrapper over :meth:`~matplotlib.figure.Figure.colorbar`. + +''' + +import numpy as np +import matplotlib as mpl +import matplotlib.colors as colors +import matplotlib.cm as cm +from matplotlib import docstring +import matplotlib.ticker as ticker +import matplotlib.cbook as cbook +import matplotlib.collections as collections +import matplotlib.contour as contour +from matplotlib.path import Path +from matplotlib.patches import PathPatch +from matplotlib.transforms import Bbox + + +make_axes_kw_doc = ''' + + ============= ==================================================== + Property Description + ============= ==================================================== + *orientation* vertical or horizontal + *fraction* 0.15; fraction of original axes to use for colorbar + *pad* 0.05 if vertical, 0.15 if horizontal; fraction + of original axes between colorbar and new image axes + *shrink* 1.0; fraction by which to shrink the colorbar + *aspect* 20; ratio of long to short dimensions + ============= ==================================================== + +''' + +colormap_kw_doc = ''' + + =========== ==================================================== + Property Description + =========== ==================================================== + *extend* [ 'neither' | 'both' | 'min' | 'max' ] + If not 'neither', make pointed end(s) for out-of- + range values. These are set for a given colormap + using the colormap set_under and set_over methods. + *spacing* [ 'uniform' | 'proportional' ] + Uniform spacing gives each discrete color the same + space; proportional makes the space proportional to + the data interval. + *ticks* [ None | list of ticks | Locator object ] + If None, ticks are determined automatically from the + input. + *format* [ None | format string | Formatter object ] + If None, the + :class:`~matplotlib.ticker.ScalarFormatter` is used. + If a format string is given, e.g. '%.3f', that is + used. An alternative + :class:`~matplotlib.ticker.Formatter` object may be + given instead. + *drawedges* [ False | True ] If true, draw lines at color + boundaries. + =========== ==================================================== + + The following will probably be useful only in the context of + indexed colors (that is, when the mappable has norm=NoNorm()), + or other unusual circumstances. + + ============ =================================================== + Property Description + ============ =================================================== + *boundaries* None or a sequence + *values* None or a sequence which must be of length 1 less + than the sequence of *boundaries*. For each region + delimited by adjacent entries in *boundaries*, the + color mapped to the corresponding value in values + will be used. + ============ =================================================== + +''' + +colorbar_doc = ''' + +Add a colorbar to a plot. + +Function signatures for the :mod:`~matplotlib.pyplot` interface; all +but the first are also method signatures for the +:meth:`~matplotlib.figure.Figure.colorbar` method:: + + colorbar(**kwargs) + colorbar(mappable, **kwargs) + colorbar(mappable, cax=cax, **kwargs) + colorbar(mappable, ax=ax, **kwargs) + +arguments: + + *mappable* + the :class:`~matplotlib.image.Image`, + :class:`~matplotlib.contour.ContourSet`, etc. to + which the colorbar applies; this argument is mandatory for the + :meth:`~matplotlib.figure.Figure.colorbar` method but optional for the + :func:`~matplotlib.pyplot.colorbar` function, which sets the + default to the current image. + +keyword arguments: + + *cax* + None | axes object into which the colorbar will be drawn + *ax* + None | parent axes object from which space for a new + colorbar axes will be stolen + + +Additional keyword arguments are of two kinds: + + axes properties: +%s + colorbar properties: +%s + +If *mappable* is a :class:`~matplotlib.contours.ContourSet`, its *extend* +kwarg is included automatically. + +Note that the *shrink* kwarg provides a simple way to keep a vertical +colorbar, for example, from being taller than the axes of the mappable +to which the colorbar is attached; but it is a manual method requiring +some trial and error. If the colorbar is too tall (or a horizontal +colorbar is too wide) use a smaller value of *shrink*. + +For more precise control, you can manually specify the positions of +the axes objects in which the mappable and the colorbar are drawn. In +this case, do not use any of the axes properties kwargs. + +returns: + :class:`~matplotlib.colorbar.Colorbar` instance; see also its base class, + :class:`~matplotlib.colorbar.ColorbarBase`. Call the + :meth:`~matplotlib.colorbar.ColorbarBase.set_label` method + to label the colorbar. + + +The transData of the *cax* is adjusted so that the limits in the +longest axis actually corresponds to the limits in colorbar range. On +the other hand, the shortest axis has a data limits of [1,2], whose +unconventional value is to prevent underflow when log scale is used. +''' % (make_axes_kw_doc, colormap_kw_doc) + +docstring.interpd.update(colorbar_doc=colorbar_doc) + + +class CbarAxesLocator(object): + """ + CbarAxesLocator is a axes_locator for colobar axes. It adjust the + position of the axes to make a room for extended ends, i.e., the + extended ends are located outside the axes area. + """ + + def __init__(self, locator=None, extend="neither", orientation="vertical"): + """ + *locator* : the bbox returned from the locator is used as a + initial axes location. If None, axes.bbox is used. + + *extend* : same as in ColorbarBase + *orientation* : same as in ColorbarBase + + """ + self._locator = locator + self.extesion_fraction = 0.05 + self.extend = extend + self.orientation = orientation + + def get_original_position(self, axes, renderer): + """ + get the original position of the axes. + """ + if self._locator is None: + bbox = axes.get_position(original=True) + else: + bbox = self._locator(axes, renderer) + return bbox + + def get_end_vertices(self): + """ + return a tuple of two vertices for the colorbar extended ends. + The first vertives is for min. end, and the second is for + max. end. + """ + # Note that concatenating two vertices needs to make a + # vertices for the frame. + extesion_fraction = self.extesion_fraction + + corx = extesion_fraction*2. + cory = 1./(1. - corx) + x1, y1, w, h = 0, 0, 1, 1 + x2, y2 = x1 + w, y1 + h + dw, dh = w*extesion_fraction, h*extesion_fraction*cory + + if self.extend in ["min", "both"]: + bottom = [(x1, y1), + (x1+w/2., y1-dh), + (x2, y1)] + else: + bottom = [(x1, y1), + (x2, y1)] + + if self.extend in ["max", "both"]: + top = [(x2, y2), + (x1+w/2., y2+dh), + (x1, y2)] + else: + top = [(x2, y2), + (x1, y2)] + + if self.orientation == "horizontal": + bottom = [(y,x) for (x,y) in bottom] + top = [(y,x) for (x,y) in top] + + return bottom, top + + + def get_path_patch(self): + """ + get the path for axes patch + """ + end1, end2 = self.get_end_vertices() + + verts = [] + end1 + end2 + end1[:1] + + return Path(verts) + + + def get_path_ends(self): + """ + get the paths for extended ends + """ + + end1, end2 = self.get_end_vertices() + + return Path(end1), Path(end2) + + + def __call__(self, axes, renderer): + """ + Return the adjusted position of the axes + """ + bbox0 = self.get_original_position(axes, renderer) + bbox = bbox0 + + x1, y1, w, h = bbox.bounds + extesion_fraction = self.extesion_fraction + dw, dh = w*extesion_fraction, h*extesion_fraction + + if self.extend in ["min", "both"]: + if self.orientation == "horizontal": + x1 = x1 + dw + else: + y1 = y1+dh + + if self.extend in ["max", "both"]: + if self.orientation == "horizontal": + w = w-2*dw + else: + h = h-2*dh + + return Bbox.from_bounds(x1, y1, w, h) + + + +class ColorbarBase(cm.ScalarMappable): + ''' + Draw a colorbar in an existing axes. + + This is a base class for the :class:`Colorbar` class, which is the + basis for the :func:`~matplotlib.pyplot.colorbar` method and pylab + function. + + It is also useful by itself for showing a colormap. If the *cmap* + kwarg is given but *boundaries* and *values* are left as None, + then the colormap will be displayed on a 0-1 scale. To show the + under- and over-value colors, specify the *norm* as:: + + colors.Normalize(clip=False) + + To show the colors versus index instead of on the 0-1 scale, + use:: + + norm=colors.NoNorm. + + Useful attributes: + + :attr:`ax` + the Axes instance in which the colorbar is drawn + + :attr:`lines` + a LineCollection if lines were drawn, otherwise None + + :attr:`dividers` + a LineCollection if *drawedges* is True, otherwise None + + Useful public methods are :meth:`set_label` and :meth:`add_lines`. + + ''' + + def __init__(self, ax, cmap=None, + norm=None, + alpha=1.0, + values=None, + boundaries=None, + orientation='vertical', + extend='neither', + spacing='uniform', # uniform or proportional + ticks=None, + format=None, + drawedges=False, + filled=True, + ): + self.ax = ax + + if cmap is None: cmap = cm.get_cmap() + if norm is None: norm = colors.Normalize() + self.alpha = alpha + cm.ScalarMappable.__init__(self, cmap=cmap, norm=norm) + self.values = values + self.boundaries = boundaries + self.extend = extend + self.spacing = spacing + self.orientation = orientation + self.drawedges = drawedges + self.filled = filled + + # artists + self.solids = None + self.lines = None + self.dividers = None + self.extension_patch1 = None + self.extension_patch2 = None + + if orientation == "vertical": + self.cbar_axis = self.ax.yaxis + else: + self.cbar_axis = self.ax.xaxis + + + if format is None: + if isinstance(self.norm, colors.LogNorm): + # change both axis for proper aspect + self.ax.xaxis.set_scale("log") + self.ax.yaxis.set_scale("log") + self.ax._update_transScale() + self.cbar_axis.set_minor_locator(ticker.NullLocator()) + formatter = ticker.LogFormatter() + else: + formatter = None + elif cbook.is_string_like(format): + formatter = ticker.FormatStrFormatter(format) + else: + formatter = format # Assume it is a Formatter + + if formatter is None: + formatter = self.cbar_axis.get_major_formatter() + else: + self.cbar_axis.set_major_formatter(formatter) + + if cbook.iterable(ticks): + self.cbar_axis.set_ticks(ticks) + elif ticks is not None: + self.cbar_axis.set_major_locator(ticks) + else: + self._select_locator(formatter) + + + self._config_axes() + + self.update_artists() + + self.set_label_text('') + + + def _get_colorbar_limits(self): + """ + initial limits for colorbar range. The returne min, max values + will be used to create colorbar solid(?) and etc. + """ + if self.boundaries is not None: + C = self.boundaries + if self.extend in ["min", "both"]: + C = C[1:] + + if self.extend in ["max", "both"]: + C = C[:-1] + return min(C), max(C) + else: + return self.get_clim() + + + def _config_axes(self): + ''' + Adjust the properties of the axes to be adquate for colorbar display. + ''' + ax = self.ax + + axes_locator = CbarAxesLocator(ax.get_axes_locator(), + extend=self.extend, + orientation=self.orientation) + ax.set_axes_locator(axes_locator) + + # overide the get_data_ratio for the aspect works. + def _f(): + return 1. + ax.get_data_ratio = _f + ax.get_data_ratio_log = _f + + ax.set_frame_on(True) + ax.set_navigate(False) + + self.ax.set_autoscalex_on(False) + self.ax.set_autoscaley_on(False) + + if self.orientation == 'horizontal': + ax.xaxis.set_label_position('bottom') + ax.set_yticks([]) + else: + ax.set_xticks([]) + ax.yaxis.set_label_position('right') + ax.yaxis.set_ticks_position('right') + + + + def update_artists(self): + """ + Update the colorbar associated artists, *filled* and + *ends*. Note that *lines* are not updated. This needs to be + called whenever clim of associated image changes. + """ + self._process_values() + self._add_ends() + + X, Y = self._mesh() + if self.filled: + C = self._values[:,np.newaxis] + self._add_solids(X, Y, C) + + ax = self.ax + vmin, vmax = self._get_colorbar_limits() + if self.orientation == 'horizontal': + ax.set_ylim(1, 2) + ax.set_xlim(vmin, vmax) + else: + ax.set_xlim(1, 2) + ax.set_ylim(vmin, vmax) + + + def _add_ends(self): + """ + Create patches from extended ends and add them to the axes. + """ + + del self.extension_patch1 + del self.extension_patch2 + + path1, path2 = self.ax.get_axes_locator().get_path_ends() + fc=mpl.rcParams['axes.facecolor'] + ec=mpl.rcParams['axes.edgecolor'] + linewidths=0.5*mpl.rcParams['axes.linewidth'] + self.extension_patch1 = PathPatch(path1, + fc=fc, ec=ec, lw=linewidths, + zorder=2., + transform=self.ax.transAxes, + clip_on=False) + self.extension_patch2 = PathPatch(path2, + fc=fc, ec=ec, lw=linewidths, + zorder=2., + transform=self.ax.transAxes, + clip_on=False) + self.ax.add_artist(self.extension_patch1) + self.ax.add_artist(self.extension_patch2) + + + + def _set_label_text(self): + """ + set label. + """ + self.cbar_axis.set_label_text(self._label, **self._labelkw) + + def set_label_text(self, label, **kw): + ''' + Label the long axis of the colorbar + ''' + self._label = label + self._labelkw = kw + self._set_label_text() + + + def _edges(self, X, Y): + ''' + Return the separator line segments; helper for _add_solids. + ''' + N = X.shape[0] + # Using the non-array form of these line segments is much + # simpler than making them into arrays. + if self.orientation == 'vertical': + return [zip(X[i], Y[i]) for i in range(1, N-1)] + else: + return [zip(Y[i], X[i]) for i in range(1, N-1)] + + def _add_solids(self, X, Y, C): + ''' + Draw the colors using :meth:`~matplotlib.axes.Axes.pcolor`; + optionally add separators. + ''' + ## Change to pcolorfast after fixing bugs in some backends... + + if self.extend in ["min", "both"]: + cc = self.to_rgba([C[0][0]]) + self.extension_patch1.set_fc(cc[0]) + X, Y, C = X[1:], Y[1:], C[1:] + + if self.extend in ["max", "both"]: + cc = self.to_rgba([C[-1][0]]) + self.extension_patch2.set_fc(cc[0]) + X, Y, C = X[:-1], Y[:-1], C[:-1] + + if self.orientation == 'vertical': + args = (X, Y, C) + else: + args = (np.transpose(Y), np.transpose(X), np.transpose(C)) + kw = {'cmap':self.cmap, 'norm':self.norm, + 'shading':'flat', 'alpha':self.alpha, + } + + del self.solids + del self.dividers + + col = self.ax.pcolor(*args, **kw) + self.solids = col + if self.drawedges: + self.dividers = collections.LineCollection(self._edges(X,Y), + colors=(mpl.rcParams['axes.edgecolor'],), + linewidths=(0.5*mpl.rcParams['axes.linewidth'],), + ) + self.ax.add_collection(self.dividers) + else: + self.dividers = None + + def add_lines(self, levels, colors, linewidths): + ''' + Draw lines on the colorbar. It deletes preexting lines. + ''' + del self.lines + + N = len(levels) + x = np.array([1.0, 2.0]) + X, Y = np.meshgrid(x,levels) + if self.orientation == 'vertical': + xy = [zip(X[i], Y[i]) for i in range(N)] + else: + xy = [zip(Y[i], X[i]) for i in range(N)] + col = collections.LineCollection(xy, linewidths=linewidths, + ) + self.lines = col + col.set_color(colors) + self.ax.add_collection(col) + + + def _select_locator(self, formatter): + ''' + select a suitable locator + ''' + if self.boundaries is None: + if isinstance(self.norm, colors.NoNorm): + nv = len(self._values) + base = 1 + int(nv/10) + locator = ticker.IndexLocator(base=base, offset=0) + elif isinstance(self.norm, colors.BoundaryNorm): + b = self.norm.boundaries + locator = ticker.FixedLocator(b, nbins=10) + elif isinstance(self.norm, colors.LogNorm): + locator = ticker.LogLocator() + else: + locator = ticker.MaxNLocator(nbins=5) + else: + b = self._boundaries[self._inside] + locator = ticker.FixedLocator(b) #, nbins=10) + + self.cbar_axis.set_major_locator(locator) + + + def _process_values(self, b=None): + ''' + Set the :attr:`_boundaries` and :attr:`_values` attributes + based on the input boundaries and values. Input boundaries + can be *self.boundaries* or the argument *b*. + ''' + if b is None: + b = self.boundaries + if b is not None: + self._boundaries = np.asarray(b, dtype=float) + if self.values is None: + self._values = 0.5*(self._boundaries[:-1] + + self._boundaries[1:]) + if isinstance(self.norm, colors.NoNorm): + self._values = (self._values + 0.00001).astype(np.int16) + return + self._values = np.array(self.values) + return + if self.values is not None: + self._values = np.array(self.values) + if self.boundaries is None: + b = np.zeros(len(self.values)+1, 'd') + b[1:-1] = 0.5*(self._values[:-1] - self._values[1:]) + b[0] = 2.0*b[1] - b[2] + b[-1] = 2.0*b[-2] - b[-3] + self._boundaries = b + return + self._boundaries = np.array(self.boundaries) + return + # Neither boundaries nor values are specified; + # make reasonable ones based on cmap and norm. + if isinstance(self.norm, colors.NoNorm): + b = self._uniform_y(self.cmap.N+1) * self.cmap.N - 0.5 + v = np.zeros((len(b)-1,), dtype=np.int16) + v = np.arange(self.cmap.N, dtype=np.int16) + self._boundaries = b + self._values = v + return + elif isinstance(self.norm, colors.BoundaryNorm): + b = np.array(self.norm.boundaries) + v = np.zeros((len(b)-1,), dtype=float) + bi = self.norm.boundaries + v = 0.5*(bi[:-1] + bi[1:]) + self._boundaries = b + self._values = v + return + else: + b = self._uniform_y(self.cmap.N+1) + + self._process_values(b) + + + def _uniform_y(self, N): + ''' + Return colorbar data coordinates for *N* uniformly + spaced boundaries. + ''' + vmin, vmax = self._get_colorbar_limits() + if isinstance(self.norm, colors.LogNorm): + y = np.logspace(np.log10(vmin), np.log10(vmax), N) + else: + y = np.linspace(vmin, vmax, N) + return y + + def _mesh(self): + ''' + Return X,Y, the coordinate arrays for the colorbar pcolormesh. + These are suitable for a vertical colorbar; swapping and + transposition for a horizontal colorbar are done outside + this function. + ''' + x = np.array([1.0, 2.0]) + if self.spacing == 'uniform': + y = self._uniform_y(len(self._boundaries)) + else: + y = self._boundaries + self._y = y + + X, Y = np.meshgrid(x,y) + return X, Y + + + def set_alpha(self, alpha): + """ + set alpha value. + """ + self.alpha = alpha + + +class Colorbar(ColorbarBase): + def __init__(self, ax, mappable, **kw): + mappable.autoscale_None() # Ensure mappable.norm.vmin, vmax + # are set when colorbar is called, + # even if mappable.draw has not yet + # been called. This will not change + # vmin, vmax if they are already set. + self.mappable = mappable + kw['cmap'] = mappable.cmap + kw['norm'] = mappable.norm + kw['alpha'] = mappable.get_alpha() + if isinstance(mappable, contour.ContourSet): + CS = mappable + kw['boundaries'] = CS._levels + kw['values'] = CS.cvalues + kw['extend'] = CS.extend + #kw['ticks'] = CS._levels + kw.setdefault('ticks', ticker.FixedLocator(CS.levels, nbins=10)) + kw['filled'] = CS.filled + ColorbarBase.__init__(self, ax, **kw) + if not CS.filled: + self.add_lines(CS) + else: + ColorbarBase.__init__(self, ax, **kw) + + + def add_lines(self, CS): + ''' + Add the lines from a non-filled + :class:`~matplotlib.contour.ContourSet` to the colorbar. + ''' + if not isinstance(CS, contour.ContourSet) or CS.filled: + raise ValueError('add_lines is only for a ContourSet of lines') + tcolors = [c[0] for c in CS.tcolors] + tlinewidths = [t[0] for t in CS.tlinewidths] + # The following was an attempt to get the colorbar lines + # to follow subsequent changes in the contour lines, + # but more work is needed: specifically, a careful + # look at event sequences, and at how + # to make one object track another automatically. + #tcolors = [col.get_colors()[0] for col in CS.collections] + #tlinewidths = [col.get_linewidth()[0] for lw in CS.collections] + #print 'tlinewidths:', tlinewidths + ColorbarBase.add_lines(self, CS.levels, tcolors, tlinewidths) + + def update_bruteforce(self, mappable): + """ + Update the colorbar artists to reflect the change of the + assocaited mappable. + """ + self.update_artists() + + if isinstance(mappable, contour.ContourSet): + if not mappable.filled: + self.add_lines(mappable) + +@docstring.Substitution(make_axes_kw_doc) +def make_axes(parent, **kw): + ''' + Resize and reposition a parent axes, and return a child + axes suitable for a colorbar:: + + cax, kw = make_axes(parent, **kw) + + Keyword arguments may include the following (with defaults): + + *orientation* + 'vertical' or 'horizontal' + + %s + + All but the first of these are stripped from the input kw set. + + Returns (cax, kw), the child axes and the reduced kw dictionary. + ''' + orientation = kw.setdefault('orientation', 'vertical') + fraction = kw.pop('fraction', 0.15) + shrink = kw.pop('shrink', 1.0) + aspect = kw.pop('aspect', 20) + #pb = transforms.PBox(parent.get_position()) + pb = parent.get_position(original=True).frozen() + if orientation == 'vertical': + pad = kw.pop('pad', 0.05) + x1 = 1.0-fraction + pb1, pbx, pbcb = pb.splitx(x1-pad, x1) + pbcb = pbcb.shrunk(1.0, shrink).anchored('C', pbcb) + anchor = (0.0, 0.5) + panchor = (1.0, 0.5) + else: + pad = kw.pop('pad', 0.15) + pbcb, pbx, pb1 = pb.splity(fraction, fraction+pad) + pbcb = pbcb.shrunk(shrink, 1.0).anchored('C', pbcb) + aspect = 1.0/aspect + anchor = (0.5, 1.0) + panchor = (0.5, 0.0) + parent.set_position(pb1) + parent.set_anchor(panchor) + fig = parent.get_figure() + cax = fig.add_axes(pbcb) + cax.set_aspect(aspect, anchor=anchor, adjustable='box') + return cax, kw + + +def colorbar(mappable, cax=None, ax=None, **kw): + """ + Create a colorbar for a ScalarMappable instance. + + Documentation for the pylab thin wrapper: + %(colorbar_doc)s + """ + import matplotlib.pyplot as plt + if ax is None: + ax = plt.gca() + if cax is None: + cax, kw = make_axes(ax, **kw) + cax.hold(True) + cb = Colorbar(cax, mappable, **kw) + + def on_changed(m): + cb.set_cmap(m.get_cmap()) + cb.set_clim(m.get_clim()) + cb.update_bruteforce(m) + + cbid = mappable.callbacksSM.connect('changed', on_changed) + mappable.set_colorbar(cb, cax) + ax.figure.sca(ax) + return cb diff -Nru matplotlib-0.99.3/lib/mpl_toolkits/axes_grid/floating_axes.py matplotlib-1.0.1/lib/mpl_toolkits/axes_grid/floating_axes.py --- matplotlib-0.99.3/lib/mpl_toolkits/axes_grid/floating_axes.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_toolkits/axes_grid/floating_axes.py 2010-07-07 01:41:47.000000000 +0000 @@ -0,0 +1 @@ +from mpl_toolkits.axisartist.floating_axes import * diff -Nru matplotlib-0.99.3/lib/mpl_toolkits/axes_grid/grid_finder.py matplotlib-1.0.1/lib/mpl_toolkits/axes_grid/grid_finder.py --- matplotlib-0.99.3/lib/mpl_toolkits/axes_grid/grid_finder.py 2009-07-31 15:14:32.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_toolkits/axes_grid/grid_finder.py 2010-07-07 01:41:47.000000000 +0000 @@ -1,294 +1 @@ -import numpy as np -import matplotlib.cbook as mcbook -from matplotlib.transforms import Bbox -import clip_path -clip_line_to_rect = clip_path.clip_line_to_rect - -import matplotlib.ticker as mticker -from matplotlib.transforms import Transform - - -# extremes finder - -class ExtremeFinderSimple(object): - def __init__(self, nx, ny): - self.nx, self.ny = nx, ny - - def __call__(self, transform_xy, x1, y1, x2, y2): - """ - get extreme values. - - x1, y1, x2, y2 in image coordinates (0-based) - nx, ny : number of dvision in each axis - """ - x_, y_ = np.linspace(x1, x2, self.nx), np.linspace(y1, y2, self.ny) - x, y = np.meshgrid(x_, y_) - lon, lat = transform_xy(np.ravel(x), np.ravel(y)) - - lon_min, lon_max = lon.min(), lon.max() - lat_min, lat_max = lat.min(), lat.max() - - return self._add_pad(lon_min, lon_max, lat_min, lat_max) - - def _add_pad(self, lon_min, lon_max, lat_min, lat_max): - # a small amound of padding is added because the current - # clipping algorithms seems to fail when the gidline ends at - # the bbox boundary. - dlon = (lon_max - lon_min) / self.nx - dlat = (lat_max - lat_min) / self.ny - - lon_min, lon_max = lon_min - dlon, lon_max + dlon - lat_min, lat_max = lat_min - dlat, lat_max + dlat - - return lon_min, lon_max, lat_min, lat_max - - - -class GridFinderBase(object): - def __init__(self, - extreme_finder, - grid_locator1, - grid_locator2, - tick_formatter1=None, - tick_formatter2=None): - """ - the transData of the axes to the world coordinate. - locator1, locator2 : grid locator for 1st and 2nd axis. - - Derived must define "transform_xy, inv_transform_xy" - (may use update_transform) - """ - super(GridFinderBase, self).__init__() - - self.extreme_finder = extreme_finder - self.grid_locator1 = grid_locator1 - self.grid_locator2 = grid_locator2 - self.tick_formatter1 = tick_formatter1 - self.tick_formatter2 = tick_formatter2 - - def get_grid_info(self, - x1, y1, x2, y2): - """ - lon_values, lat_values : list of grid values. if integer is given, - rough number of grids in each direction. - """ - - extremes = self.extreme_finder(self.inv_transform_xy, x1, y1, x2, y2) - - # min & max rage of lat (or lon) for each grid line will be drawn. - # i.e., gridline of lon=0 will be drawn from lat_min to lat_max. - - lon_min, lon_max, lat_min, lat_max = extremes - lon_levs, lon_n, lon_factor = \ - self.grid_locator1(lon_min, lon_max) - lat_levs, lat_n, lat_factor = \ - self.grid_locator2(lat_min, lat_max) - - if lon_factor is None: - lon_values = np.asarray(lon_levs[:lon_n]) - else: - lon_values = np.asarray(lon_levs[:lon_n]/lon_factor) - if lat_factor is None: - lat_values = np.asarray(lat_levs[:lat_n]) - else: - lat_values = np.asarray(lat_levs[:lat_n]/lat_factor) - - - lon_lines, lat_lines = self._get_raw_grid_lines(lon_values, - lat_values, - lon_min, lon_max, - lat_min, lat_max) - - ddx = (x2-x1)*1.e-10 - ddy = (y2-y1)*1.e-10 - bb = Bbox.from_extents(x1-ddx, y1-ddy, x2+ddx, y2+ddy) - - grid_info = {} - grid_info["lon_lines"] = lon_lines - grid_info["lat_lines"] = lat_lines - - grid_info["lon"] = self._clip_grid_lines_and_find_ticks(lon_lines, - lon_values, - lon_levs, - bb) - - grid_info["lat"] = self._clip_grid_lines_and_find_ticks(lat_lines, - lat_values, - lat_levs, - bb) - - tck_labels = grid_info["lon"]["tick_labels"] = dict() - for direction in ["left", "bottom", "right", "top"]: - levs = grid_info["lon"]["tick_levels"][direction] - tck_labels[direction] = self.tick_formatter1(direction, - lon_factor, levs) - - tck_labels = grid_info["lat"]["tick_labels"] = dict() - for direction in ["left", "bottom", "right", "top"]: - levs = grid_info["lat"]["tick_levels"][direction] - tck_labels[direction] = self.tick_formatter2(direction, - lat_factor, levs) - - return grid_info - - - def _get_raw_grid_lines(self, - lon_values, lat_values, - lon_min, lon_max, lat_min, lat_max): - - lons_i = np.linspace(lon_min, lon_max, 100) # for interpolation - lats_i = np.linspace(lat_min, lat_max, 100) - - lon_lines = [self.transform_xy(np.zeros_like(lats_i)+lon, lats_i) \ - for lon in lon_values] - lat_lines = [self.transform_xy(lons_i, np.zeros_like(lons_i)+lat) \ - for lat in lat_values] - - return lon_lines, lat_lines - - - def _clip_grid_lines_and_find_ticks(self, lines, values, levs, bb): - gi = dict() - gi["values"] = [] - gi["levels"] = [] - gi["tick_levels"] = dict(left=[], bottom=[], right=[], top=[]) - gi["tick_locs"] = dict(left=[], bottom=[], right=[], top=[]) - gi["lines"] = [] - - tck_levels = gi["tick_levels"] - tck_locs = gi["tick_locs"] - for (lx, ly), v, lev in zip(lines, values, levs): - xy, tcks = clip_line_to_rect(lx, ly, bb) - if not xy: - continue - gi["levels"].append(v) - gi["lines"].append(xy) - - for tck, direction in zip(tcks, ["left", "bottom", "right", "top"]): - for t in tck: - tck_levels[direction].append(lev) - tck_locs[direction].append(t) - - return gi - - - def update_transform(self, aux_trans): - if isinstance(aux_trans, Transform): - def transform_xy(x, y): - x, y = np.asarray(x), np.asarray(y) - ll1 = np.concatenate((x[:,np.newaxis], y[:,np.newaxis]), 1) - ll2 = aux_trans.transform(ll1) - lon, lat = ll2[:,0], ll2[:,1] - return lon, lat - - def inv_transform_xy(x, y): - x, y = np.asarray(x), np.asarray(y) - ll1 = np.concatenate((x[:,np.newaxis], y[:,np.newaxis]), 1) - ll2 = aux_trans.inverted().transform(ll1) - lon, lat = ll2[:,0], ll2[:,1] - return lon, lat - - else: - transform_xy, inv_transform_xy = aux_trans - - self.transform_xy = transform_xy - self.inv_transform_xy = inv_transform_xy - - - def update(self, **kw): - for k in kw: - if k in ["extreme_finder", - "grid_locator1", - "grid_locator2", - "tick_formatter1", - "tick_formatter2"]: - setattr(self, k, kw[k]) - else: - raise ValueError("unknwonw update property") - - - - -class GridFinder(GridFinderBase): - - def __init__(self, - transform, - extreme_finder=None, - grid_locator1=None, - grid_locator2=None, - tick_formatter1=None, - tick_formatter2=None): - """ - transform : transfrom from the image coordinate (which will be - the transData of the axes to the world coordinate. - - or transform = (transform_xy, inv_transform_xy) - - locator1, locator2 : grid locator for 1st and 2nd axis. - """ - - if extreme_finder is None: - extreme_finder = ExtremeFinderSimple(20, 20) - if grid_locator1 is None: - grid_locator1 = MaxNLocator() - if grid_locator2 is None: - grid_locator2 = MaxNLocator() - if tick_formatter1 is None: - tick_formatter1 = FormatterPrettyPrint() - if tick_formatter2 is None: - tick_formatter2 = FormatterPrettyPrint() - - super(GridFinder, self).__init__( \ - extreme_finder, - grid_locator1, - grid_locator2, - tick_formatter1, - tick_formatter2) - - self.update_transform(transform) - - -class MaxNLocator(mticker.MaxNLocator): - def __init__(self, nbins = 10, steps = None, - trim = True, - integer=False, - symmetric=False, - prune=None): - - mticker.MaxNLocator.__init__(self, nbins, steps, - trim, integer, symmetric, prune) - self.create_dummy_axis() - - - def __call__(self, v1, v2): - self.set_bounds(v1, v2) - locs = mticker.MaxNLocator.__call__(self) - return locs, len(locs), None - - - - - -# Tick Formatter - -class FormatterPrettyPrint(object): - def __init__(self): - self._fmt = mticker.ScalarFormatter() - self._fmt.create_dummy_axis() - - def __call__(self, direction, factor, values): - if factor is None: - factor = 1. - values = [v/factor for v in values] - self._fmt.set_locs(values) - return [self._fmt(v) for v in values] - - - -if __name__ == "__main__": - locator = MaxNLocator() - locs, nloc, factor = locator(0, 100) - - fmt = FormatterPrettyPrint() - - print fmt("left", None, locs) +from mpl_toolkits.axisartist.grid_finder import * diff -Nru matplotlib-0.99.3/lib/mpl_toolkits/axes_grid/grid_helper_curvelinear.py matplotlib-1.0.1/lib/mpl_toolkits/axes_grid/grid_helper_curvelinear.py --- matplotlib-0.99.3/lib/mpl_toolkits/axes_grid/grid_helper_curvelinear.py 2009-07-31 15:14:32.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_toolkits/axes_grid/grid_helper_curvelinear.py 2010-07-07 01:41:47.000000000 +0000 @@ -1,568 +1 @@ -""" -An experimental support for curvelinear grid. -""" - -from itertools import chain -from mpl_toolkits.axes_grid.grid_finder import GridFinder - -from mpl_toolkits.axes_grid.axislines import \ - AxisArtistHelper, GridHelperBase, AxisArtist -from matplotlib.transforms import Affine2D -import numpy as np - -class FixedAxisArtistHelper(AxisArtistHelper.Fixed): - """ - Helper class for a fixed axis. - """ - - def __init__(self, grid_helper, side, nth_coord_ticks=None): - """ - nth_coord = along which coordinate value varies. - nth_coord = 0 -> x axis, nth_coord = 1 -> y axis - """ - - super(FixedAxisArtistHelper, self).__init__( \ - loc=side, - label_direction=None) - - self.grid_helper = grid_helper - if nth_coord_ticks is None: - nth_coord_ticks = self.nth_coord - self.nth_coord_ticks = nth_coord_ticks - - self.side = side - - def update_lim(self, axes): - self.grid_helper.update_lim(axes) - - def change_tick_coord(self, coord_number=None): - if coord_number is None: - self.nth_coord_ticks = 1 - self.nth_coord_ticks - elif coord_number in [0, 1]: - self.nth_coord_ticks = coord_number - else: - raise Exception("wrong coord number") - - - def get_tick_transform(self, axes): - return axes.transData - - def get_tick_iterators(self, axes): - """tick_loc, tick_angle, tick_label""" - - g = self.grid_helper - - ti1 = g.get_tick_iterator(self.nth_coord_ticks, self.side) - ti2 = g.get_tick_iterator(1-self.nth_coord_ticks, self.side, minor=True) - - #ti2 = g.get_tick_iterator(1-self.nth_coord_ticks, self.side, minor=True) - - return chain(ti1, ti2), iter([]) - - -class FloatingAxisArtistHelper(AxisArtistHelper.Floating): - - def __init__(self, grid_helper, nth_coord, value, label_direction=None): - """ - nth_coord = along which coordinate value varies. - nth_coord = 0 -> x axis, nth_coord = 1 -> y axis - """ - - super(FloatingAxisArtistHelper, self).__init__(nth_coord, - value, - label_direction, - ) - self.value = value - self.grid_helper = grid_helper - - - def update_lim(self, axes): - self.grid_helper.update_lim(axes) - - x1, x2 = axes.get_xlim() - y1, y2 = axes.get_ylim() - grid_finder = self.grid_helper.grid_finder - extremes = grid_finder.extreme_finder(grid_finder.inv_transform_xy, - x1, y1, x2, y2) - - grid_info = dict() - lon_min, lon_max, lat_min, lat_max = extremes - lon_levs, lon_n, lon_factor = \ - grid_finder.grid_locator1(lon_min, lon_max) - lat_levs, lat_n, lat_factor = \ - grid_finder.grid_locator2(lat_min, lat_max) - grid_info["extremes"] = extremes - - grid_info["lon_info"] = lon_levs, lon_n, lon_factor - grid_info["lat_info"] = lat_levs, lat_n, lat_factor - - grid_info["lon_labels"] = grid_finder.tick_formatter1("bottom", - lon_factor, - lon_levs) - - grid_info["lat_labels"] = grid_finder.tick_formatter2("bottom", - lat_factor, - lat_levs) - - grid_finder = self.grid_helper.grid_finder - if self.nth_coord == 0: - xx0 = np.linspace(self.value, self.value, 100) - yy0 = np.linspace(extremes[2], extremes[3], 100) - xx, yy = grid_finder.transform_xy(xx0, yy0) - elif self.nth_coord == 1: - xx0 = np.linspace(extremes[0], extremes[1], 100) - yy0 = np.linspace(self.value, self.value, 100) - xx, yy = grid_finder.transform_xy(xx0, yy0) - - grid_info["line_xy"] = xx, yy - self.grid_info = grid_info - - - def get_label_pos(self, axes, with_angle=False): - - extremes = self.grid_info["extremes"] - - if self.nth_coord == 0: - xx0 = self.value - yy0 = (extremes[2]+extremes[3])/2. - dxx, dyy = 0., abs(extremes[2]-extremes[3])/1000. - elif self.nth_coord == 1: - xx0 = (extremes[0]+extremes[1])/2. - yy0 = self.value - dxx, dyy = abs(extremes[0]-extremes[1])/1000., 0. - - grid_finder = self.grid_helper.grid_finder - xx1, yy1 = grid_finder.transform_xy([xx0], [yy0]) - - trans_passingthrough_point = axes.transData + axes.transAxes.inverted() - p = trans_passingthrough_point.transform_point([xx1[0], yy1[0]]) - - - if (0. <= p[0] <= 1.) and (0. <= p[1] <= 1.): - if with_angle: - xx1c, yy1c = axes.transData.transform_point([xx1[0], yy1[0]]) - xx2, yy2 = grid_finder.transform_xy([xx0+dxx], [yy0+dyy]) - xx2c, yy2c = axes.transData.transform_point([xx2[0], yy2[0]]) - - return (xx1c, yy1c), Affine2D(), \ - np.arctan2(yy2c-yy1c, xx2c-xx1c) - else: - return p, axes.transAxes - else: - if with_angle: - return None, None, None - else: - return None, None - - - - - def get_ticklabel_offset_transform(self, axes, - pad_points, fontprops, - renderer, - ): - - tr, va, ha = self._get_label_offset_transform(pad_points, fontprops, - renderer, - None, - ) - - a = self._ticklabel_angles[self.label_direction] - return Affine2D(), "baseline", "center", 0 - - def get_tick_transform(self, axes): - return axes.transData - - def get_tick_iterators(self, axes): - """tick_loc, tick_angle, tick_label""" - - grid_finder = self.grid_helper.grid_finder - - # find angles - if self.nth_coord == 0: - lat_levs, lat_n, lat_factor = self.grid_info["lat_info"] - if lat_factor is not None: - yy0 = lat_levs / lat_factor - dy = 0.01 / lat_factor - else: - yy0 = lat_levs - dy = 0.01 - xx0 = np.empty_like(yy0) - xx0.fill(self.value) - xx1, yy1 = grid_finder.transform_xy(xx0, yy0) - xx2, yy2 = grid_finder.transform_xy(xx0, yy0+dy) - labels = self.grid_info["lat_labels"] - elif self.nth_coord == 1: - lon_levs, lon_n, lon_factor = self.grid_info["lon_info"] - if lon_factor is not None: - xx0 = lon_levs / lon_factor - dx = 0.01 / lon_factor - else: - xx0 = lon_levs - dx = 0.01 - yy0 = np.empty_like(xx0) - yy0.fill(self.value) - xx1, yy1 = grid_finder.transform_xy(xx0, yy0) - xx2, yy2 = grid_finder.transform_xy(xx0+dx, yy0) - labels = self.grid_info["lon_labels"] - - if self.label_direction == "top": - da = 180. - else: - da = 0. - - def f1(): - dd = np.arctan2(yy2-yy1, xx2-xx1) - trans_tick = self.get_tick_transform(axes) - tr2ax = trans_tick + axes.transAxes.inverted() - for x, y, d, lab in zip(xx1, yy1, dd, labels): - c2 = tr2ax.transform_point((x, y)) - delta=0.00001 - if (0. -delta<= c2[0] <= 1.+delta) and \ - (0. -delta<= c2[1] <= 1.+delta): - yield [x, y], d/3.14159*180.+da, lab - - return f1(), iter([]) - - - def get_line_transform(self, axes): - return axes.transData - - def get_line(self, axes): - self.update_lim(axes) - from matplotlib.path import Path - xx, yy = self.grid_info["line_xy"] - - return Path(zip(xx, yy)) - - - - -class GridHelperCurveLinear(GridHelperBase): - - def __init__(self, aux_trans, - extreme_finder=None, - grid_locator1=None, - grid_locator2=None, - tick_formatter1=None, - tick_formatter2=None): - """ - aux_trans : a transform from the source (curved) coordinate to - target (rectlinear) coordinate. An instance of MPL's Transform - (inverse transform should be defined) or a tuple of two callable - objects which defines the transform and its inverse. The callables - need take two arguments of array of source coordinates and - should return two target coordinates: - e.g. x2, y2 = trans(x1, y1) - """ - super(GridHelperCurveLinear, self).__init__() - - self.grid_info = None - self._old_values = None - #self._grid_params = dict() - - self.grid_finder = GridFinder(aux_trans, - extreme_finder, - grid_locator1, - grid_locator2, - tick_formatter1, - tick_formatter2) - - - def update_grid_finder(self, aux_trans=None, **kw): - - if aux_trans is not None: - self.grid_finder.update_transform(aux_trans) - - self.grid_finder.update(**kw) - self.invalidate() - - - def _update(self, x1, x2, y1, y2): - "bbox in 0-based image coordinates" - # update wcsgrid - - if self.valid() and self._old_values == (x1, x2, y1, y2): - return - - self._update_grid(x1, y1, x2, y2) - - self._old_values = (x1, x2, y1, y2) - - self._force_update = False - - - def new_fixed_axis(self, loc, - nth_coord=None, - tick_direction="in", - label_direction=None, - offset=None, - axes=None): - - - if axes is None: - axes = self.axes - - _helper = FixedAxisArtistHelper(self, loc, - #nth_coord, - nth_coord_ticks=nth_coord) - - axisline = AxisArtist(axes, _helper) - - return axisline - - - def new_floating_axis(self, nth_coord, - value, - tick_direction="in", - label_direction=None, - axes=None, - ): - - if label_direction is None: - label_direction = "top" - - _helper = FloatingAxisArtistHelper(self, nth_coord, - value, - label_direction=label_direction, - ) - - axisline = AxisArtist(axes, _helper) - axisline.line.set_clip_on(True) - axisline.line.set_clip_box(axisline.axes.bbox) - #axisline.major_ticklabels.set_visible(True) - #axisline.minor_ticklabels.set_visible(False) - - axisline.major_ticklabels.set_rotate_along_line(True) - axisline.set_rotate_label_along_line(True) - - return axisline - - - def _update_grid(self, x1, y1, x2, y2): - - self.grid_info = self.grid_finder.get_grid_info(x1, y1, x2, y2) - - - def get_gridlines(self): - grid_lines = [] - for gl in self.grid_info["lat"]["lines"]: - grid_lines.extend(gl) - for gl in self.grid_info["lon"]["lines"]: - grid_lines.extend(gl) - - return grid_lines - - - def get_tick_iterator(self, nth_coord, axis_side, minor=False): - - axisnr = dict(left=0, bottom=1, right=2, top=3)[axis_side] - angle = [0, 90, 180, 270][axisnr] - lon_or_lat = ["lon", "lat"][nth_coord] - if not minor: # major ticks - def f(): - for (xy, a), l in zip(self.grid_info[lon_or_lat]["tick_locs"][axis_side], - self.grid_info[lon_or_lat]["tick_labels"][axis_side]): - yield xy, a, l - else: - def f(): - for (xy, a), l in zip(self.grid_info[lon_or_lat]["tick_locs"][axis_side], - self.grid_info[lon_or_lat]["tick_labels"][axis_side]): - yield xy, a, "" - #for xy, a, l in self.grid_info[lon_or_lat]["ticks"][axis_side]: - # yield xy, a, "" - - return f() - - - -def test3(): - - import numpy as np - from matplotlib.transforms import Transform - from matplotlib.path import Path - - class MyTransform(Transform): - input_dims = 2 - output_dims = 2 - is_separable = False - - def __init__(self, resolution): - """ - Create a new Aitoff transform. Resolution is the number of steps - to interpolate between each input line segment to approximate its - path in curved Aitoff space. - """ - Transform.__init__(self) - self._resolution = resolution - - def transform(self, ll): - x = ll[:, 0:1] - y = ll[:, 1:2] - - return np.concatenate((x, y-x), 1) - - transform.__doc__ = Transform.transform.__doc__ - - transform_non_affine = transform - transform_non_affine.__doc__ = Transform.transform_non_affine.__doc__ - - def transform_path(self, path): - vertices = path.vertices - ipath = path.interpolated(self._resolution) - return Path(self.transform(ipath.vertices), ipath.codes) - transform_path.__doc__ = Transform.transform_path.__doc__ - - transform_path_non_affine = transform_path - transform_path_non_affine.__doc__ = Transform.transform_path_non_affine.__doc__ - - def inverted(self): - return MyTransformInv(self._resolution) - inverted.__doc__ = Transform.inverted.__doc__ - - class MyTransformInv(Transform): - input_dims = 2 - output_dims = 2 - is_separable = False - - def __init__(self, resolution): - Transform.__init__(self) - self._resolution = resolution - - def transform(self, ll): - x = ll[:, 0:1] - y = ll[:, 1:2] - - return np.concatenate((x, y+x), 1) - transform.__doc__ = Transform.transform.__doc__ - - def inverted(self): - return MyTransform(self._resolution) - inverted.__doc__ = Transform.inverted.__doc__ - - - - import matplotlib.pyplot as plt - fig = plt.figure(1) - fig.clf() - tr = MyTransform(1) - grid_helper = GridHelperCurveLinear(tr) - from mpl_toolkits.axes_grid.parasite_axes import SubplotHost, \ - ParasiteAxesAuxTrans - ax1 = SubplotHost(fig, 1, 1, 1, grid_helper=grid_helper) - - fig.add_subplot(ax1) - - ax2 = ParasiteAxesAuxTrans(ax1, tr, "equal") - ax1.parasites.append(ax2) - ax2.plot([3, 6], [5.0, 10.]) - - ax1.set_aspect(1.) - ax1.set_xlim(0, 10) - ax1.set_ylim(0, 10) - - ax1.grid(True) - plt.draw() - - - -def curvelinear_test2(fig): - """ - polar projection, but in a rectangular box. - """ - global ax1 - import numpy as np - import mpl_toolkits.axes_grid.angle_helper as angle_helper - from matplotlib.projections import PolarAxes - from matplotlib.transforms import Affine2D - - from mpl_toolkits.axes_grid.parasite_axes import SubplotHost, \ - ParasiteAxesAuxTrans - import matplotlib.cbook as cbook - - # PolarAxes.PolarTransform takes radian. However, we want our coordinate - # system in degree - tr = Affine2D().scale(np.pi/180., 1.) + PolarAxes.PolarTransform() - - # polar projection, which involves cycle, and also has limits in - # its coordinates, needs a special method to find the extremes - # (min, max of the coordinate within the view). - - # 20, 20 : number of sampling points along x, y direction - extreme_finder = angle_helper.ExtremeFinderCycle(20, 20, - lon_cycle = 360, - lat_cycle = None, - lon_minmax = None, - lat_minmax = (0, np.inf), - ) - - grid_locator1 = angle_helper.LocatorDMS(12) - # Find a grid values appropriate for the coordinate (degree, - # minute, second). - - tick_formatter1 = angle_helper.FormatterDMS() - # And also uses an appropriate formatter. Note that,the - # acceptable Locator and Formatter class is a bit different than - # that of mpl's, and you cannot directly use mpl's Locator and - # Formatter here (but may be possible in the future). - - grid_helper = GridHelperCurveLinear(tr, - extreme_finder=extreme_finder, - grid_locator1=grid_locator1, - tick_formatter1=tick_formatter1 - ) - - - ax1 = SubplotHost(fig, 1, 1, 1, grid_helper=grid_helper) - - # make ticklabels of right and top axis visible. - ax1.axis["right"].major_ticklabels.set_visible(True) - ax1.axis["top"].major_ticklabels.set_visible(True) - - # let right axis shows ticklabels for 1st coordinate (angle) - ax1.axis["right"].get_helper().nth_coord_ticks=0 - # let bottom axis shows ticklabels for 2nd coordinate (radius) - ax1.axis["bottom"].get_helper().nth_coord_ticks=1 - - fig.add_subplot(ax1) - - grid_helper = ax1.get_grid_helper() - ax1.axis["lat"] = axis = grid_helper.new_floating_axis(0, 60, axes=ax1) - axis.label.set_text("Test") - axis.label.set_visible(True) - #axis.label.set_text("Test") - #axis.major_ticklabels.set_visible(False) - #axis.major_ticks.set_visible(False) - - ax1.axis["lon"] = axis = grid_helper.new_floating_axis(1, 6, axes=ax1) - #axis.major_ticklabels.set_visible(False) - #axis.major_ticks.set_visible(False) - axis.label.set_text("Test 2") - - # A parasite axes with given transform - ax2 = ParasiteAxesAuxTrans(ax1, tr, "equal") - # note that ax2.transData == tr + ax1.transData - # Anthing you draw in ax2 will match the ticks and grids of ax1. - ax1.parasites.append(ax2) - intp = cbook.simple_linear_interpolation - ax2.plot(intp(np.array([0, 30]), 50), - intp(np.array([10., 10.]), 50)) - - ax1.set_aspect(1.) - ax1.set_xlim(-5, 12) - ax1.set_ylim(-5, 10) - - ax1.grid(True) - -if __name__ == "__main__": - import matplotlib.pyplot as plt - fig = plt.figure(1, figsize=(5, 5)) - fig.clf() - - #curvelinear_test1(fig) - curvelinear_test2(fig) - - plt.draw() - plt.show() - - +from mpl_toolkits.axisartist.grid_helper_curvelinear import * diff -Nru matplotlib-0.99.3/lib/mpl_toolkits/axes_grid/inset_locator.py matplotlib-1.0.1/lib/mpl_toolkits/axes_grid/inset_locator.py --- matplotlib-0.99.3/lib/mpl_toolkits/axes_grid/inset_locator.py 2009-09-21 18:56:13.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_toolkits/axes_grid/inset_locator.py 2010-07-07 01:41:47.000000000 +0000 @@ -1,331 +1,4 @@ -from matplotlib.offsetbox import AnchoredOffsetbox -#from matplotlib.transforms import IdentityTransform - -import matplotlib.transforms as mtrans -from matplotlib.axes import Axes - -from matplotlib.transforms import Bbox, TransformedBbox, IdentityTransform - -from matplotlib.patches import Patch -from matplotlib.path import Path - -from matplotlib.patches import Rectangle - - -class InsetPosition(object): - def __init__(self, parent, lbwh): - self.parent = parent - self.lbwh = lbwh # position of the inset axes in the normalized coordinate of the parent axes - - def __call__(self, ax, renderer): - bbox_parent = self.parent.get_position(original=False) - trans = mtrans.BboxTransformTo(bbox_parent) - bbox_inset = mtrans.Bbox.from_bounds(*self.lbwh) - bb = mtrans.TransformedBbox(bbox_inset, trans) - return bb - - -class AnchoredLocatorBase(AnchoredOffsetbox): - def __init__(self, bbox_to_anchor, offsetbox, loc, - borderpad=0.5, bbox_transform=None): - - super(AnchoredLocatorBase, self).__init__(loc, - pad=0., child=None, - borderpad=borderpad, - bbox_to_anchor=bbox_to_anchor, - bbox_transform=bbox_transform) - - - def draw(self, renderer): - raise RuntimeError("No draw method should be called") - - - def __call__(self, ax, renderer): - - fontsize = renderer.points_to_pixels(self.prop.get_size_in_points()) - self._update_offset_func(renderer, fontsize) - - width, height, xdescent, ydescent = self.get_extent(renderer) - - px, py = self.get_offset(width, height, 0, 0) - bbox_canvas = mtrans.Bbox.from_bounds(px, py, width, height) - tr = ax.figure.transFigure.inverted() - bb = mtrans.TransformedBbox(bbox_canvas, tr) - - return bb - - - - -from mpl_toolkits.axes_grid.axes_divider import Size - -class AnchoredSizeLocator(AnchoredLocatorBase): - def __init__(self, bbox_to_anchor, x_size, y_size, loc, - borderpad=0.5, bbox_transform=None): - - self.axes = None - self.x_size = Size.from_any(x_size) - self.y_size = Size.from_any(y_size) - - super(AnchoredSizeLocator, self).__init__(bbox_to_anchor, None, loc, - borderpad=borderpad, - bbox_transform=bbox_transform) - - def get_extent(self, renderer): - - x, y, w, h = self.get_bbox_to_anchor().bounds - - dpi = renderer.points_to_pixels(72.) - - r, a = self.x_size.get_size(renderer) - width = w*r + a*dpi - - r, a = self.y_size.get_size(renderer) - height = h*r + a*dpi - xd, yd = 0, 0 - - fontsize = renderer.points_to_pixels(self.prop.get_size_in_points()) - pad = self.pad * fontsize - - return width+2*pad, height+2*pad, xd+pad, yd+pad - - - def __call__(self, ax, renderer): - - self.axes = ax - return super(AnchoredSizeLocator, self).__call__(ax, renderer) - - -class AnchoredZoomLocator(AnchoredLocatorBase): - def __init__(self, parent_axes, zoom, loc, - borderpad=0.5, - bbox_to_anchor=None, - bbox_transform=None): - - self.parent_axes = parent_axes - self.zoom = zoom - - if bbox_to_anchor is None: - bbox_to_anchor = parent_axes.bbox - - super(AnchoredZoomLocator, self).__init__(bbox_to_anchor, None, loc, - borderpad=borderpad, - bbox_transform=bbox_transform) - - self.axes = None - - - def get_extent(self, renderer): - - bb = mtrans.TransformedBbox(self.axes.viewLim, self.parent_axes.transData) - - x, y, w, h = bb.bounds - - xd, yd = 0, 0 - - fontsize = renderer.points_to_pixels(self.prop.get_size_in_points()) - pad = self.pad * fontsize - - return w*self.zoom+2*pad, h*self.zoom+2*pad, xd+pad, yd+pad - - - def __call__(self, ax, renderer): - - self.axes = ax - return super(AnchoredZoomLocator, self).__call__(ax, renderer) - - - - - - -class BboxPatch(Patch): - def __init__(self, bbox, **kwargs): - if "transform" in kwargs: - raise ValueError("trnasform should nt be set") - - kwargs["transform"] = IdentityTransform() - Patch.__init__(self, **kwargs) - self.bbox = bbox - - def get_path(self): - x0, y0, x1, y1 = self.bbox.extents - - verts = [(x0, y0), - (x1, y0), - (x1, y1), - (x0, y1), - (x0, y0), - (0,0)] - - codes = [Path.MOVETO, - Path.LINETO, - Path.LINETO, - Path.LINETO, - Path.LINETO, - Path.CLOSEPOLY] - - return Path(verts, codes) - - - - -class BboxConnector(Patch): - - @staticmethod - def get_bbox_edge_pos(bbox, loc): - x0, y0, x1, y1 = bbox.extents - if loc==1: - return x1, y1 - elif loc==2: - return x0, y1 - elif loc==3: - return x0, y0 - elif loc==4: - return x1, y0 - - @staticmethod - def connect_bbox(bbox1, bbox2, loc1, loc2=None): - if isinstance(bbox1, Rectangle): - transform = bbox1.get_transfrom() - bbox1 = Bbox.from_bounds(0, 0, 1, 1) - bbox1 = TransformedBbox(bbox1, transform) - - if isinstance(bbox2, Rectangle): - transform = bbox2.get_transform() - bbox2 = Bbox.from_bounds(0, 0, 1, 1) - bbox2 = TransformedBbox(bbox2, transform) - - if loc2 is None: - loc2 = loc1 - - x1, y1 = BboxConnector.get_bbox_edge_pos(bbox1, loc1) - x2, y2 = BboxConnector.get_bbox_edge_pos(bbox2, loc2) - - verts = [[x1, y1], [x2,y2]] - #Path() - - codes = [Path.MOVETO, Path.LINETO] - - return Path(verts, codes) - - - def __init__(self, bbox1, bbox2, loc1, loc2=None, **kwargs): - """ - *path* is a :class:`matplotlib.path.Path` object. - - Valid kwargs are: - %(Patch)s - - .. seealso:: - - :class:`Patch` - For additional kwargs - - """ - if "transform" in kwargs: - raise ValueError("trnasform should nt be set") - - kwargs["transform"] = IdentityTransform() - Patch.__init__(self, **kwargs) - self.bbox1 = bbox1 - self.bbox2 = bbox2 - self.loc1 = loc1 - self.loc2 = loc2 - - - def get_path(self): - return self.connect_bbox(self.bbox1, self.bbox2, - self.loc1, self.loc2) - - -class BboxConnectorPatch(BboxConnector): - - def __init__(self, bbox1, bbox2, loc1a, loc2a, loc1b, loc2b, **kwargs): - if "transform" in kwargs: - raise ValueError("transform should not be set") - BboxConnector.__init__(self, bbox1, bbox2, loc1a, loc2a, **kwargs) - self.loc1b = loc1b - self.loc2b = loc2b - - def get_path(self): - path1 = self.connect_bbox(self.bbox1, self.bbox2, self.loc1, self.loc2) - path2 = self.connect_bbox(self.bbox2, self.bbox1, self.loc2b, self.loc1b) - path_merged = list(path1.vertices) + list (path2.vertices) + [path1.vertices[0]] - return Path(path_merged) - - - -def _add_inset_axes(parent_axes, inset_axes): - parent_axes.figure.add_axes(inset_axes) - inset_axes.set_navigate(False) - - -def inset_axes(parent_axes, width, height, loc=1, - bbox_to_anchor=None, bbox_transform=None, - axes_class=None, - axes_kwargs=None, - **kwargs): - - if axes_class is None: - axes_class = Axes - - if axes_kwargs is None: - inset_axes = axes_class(parent_axes.figure, parent_axes.get_position()) - else: - inset_axes = axes_class(parent_axes.figure, parent_axes.get_position(), - **axes_kwargs) - - axes_locator = AnchoredSizeLocator(parent_axes.bbox, - width, height, - loc=loc) - - inset_axes.set_axes_locator(axes_locator) - - _add_inset_axes(parent_axes, inset_axes) - - return inset_axes - - -def zoomed_inset_axes(parent_axes, zoom, loc=1, - bbox_to_anchor=None, bbox_transform=None, - axes_class=None, - axes_kwargs=None, - **kwargs): - - if axes_class is None: - axes_class = Axes - - if axes_kwargs is None: - inset_axes = axes_class(parent_axes.figure, parent_axes.get_position()) - else: - inset_axes = axes_class(parent_axes.figure, parent_axes.get_position(), - **axes_kwargs) - - axes_locator = AnchoredZoomLocator(parent_axes, zoom=zoom, loc=loc, - bbox_to_anchor=None, bbox_transform=None, - **kwargs) - inset_axes.set_axes_locator(axes_locator) - - _add_inset_axes(parent_axes, inset_axes) - - return inset_axes - - -def mark_inset(parent_axes, inset_axes, loc1, loc2, **kwargs): - rect = TransformedBbox(inset_axes.viewLim, parent_axes.transData) - - pp = BboxPatch(rect, **kwargs) - parent_axes.add_patch(pp) - - p1 = BboxConnector(inset_axes.bbox, rect, loc1=loc1, **kwargs) - inset_axes.add_patch(p1) - p1.set_clip_on(False) - p2 = BboxConnector(inset_axes.bbox, rect, loc1=loc2, **kwargs) - inset_axes.add_patch(p2) - p2.set_clip_on(False) - - return pp, p1, p2 - - - +from mpl_toolkits.axes_grid1.inset_locator import InsetPosition, \ + AnchoredSizeLocator, \ + AnchoredZoomLocator, BboxPatch, BboxConnector, BboxConnectorPatch, \ + inset_axes, zoomed_inset_axes, mark_inset diff -Nru matplotlib-0.99.3/lib/mpl_toolkits/axes_grid/parasite_axes.py matplotlib-1.0.1/lib/mpl_toolkits/axes_grid/parasite_axes.py --- matplotlib-0.99.3/lib/mpl_toolkits/axes_grid/parasite_axes.py 2009-07-31 15:14:32.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_toolkits/axes_grid/parasite_axes.py 2010-07-07 01:41:47.000000000 +0000 @@ -1,385 +1,16 @@ -import warnings +from mpl_toolkits.axes_grid1.parasite_axes import \ + subplot_class_factory, \ + parasite_axes_class_factory, parasite_axes_auxtrans_class_factory, \ + host_axes_class_factory -import matplotlib -rcParams = matplotlib.rcParams -import matplotlib.artist as martist -import matplotlib.transforms as mtransforms -import matplotlib.collections as mcoll -import matplotlib.legend as mlegend - -from matplotlib.axes import subplot_class_factory from axislines import Axes -import numpy as np - -import matplotlib.cbook as cbook -is_string_like = cbook.is_string_like - - -class ParasiteAxes(Axes): - - def __init__(self, parent_axes, **kargs): - - self._parent_axes = parent_axes - kargs.update(dict(frameon=False)) - super(ParasiteAxes, self).__init__(parent_axes.figure, - parent_axes._position, **kargs) - - - #def apply_aspect(self, position=None): - # pos = self._parent_axes.get_position(original=False) - # self.set_position(pos, "active") - - - def cla(self): - super(ParasiteAxes, self).cla() - - martist.setp(self.get_children(), visible=False) - self._get_lines = self._parent_axes._get_lines - - - def get_images_artists(self): - artists = set([a for a in self.get_children() if a.get_visible()]) - images = set([a for a in self.images if a.get_visible()]) - - return list(images), list(artists - images) - - - -class ParasiteAxesAuxTrans(ParasiteAxes): - - def __init__(self, parent_axes, aux_transform, viewlim_mode=None, - **kwargs): - - self.transAux = aux_transform - - #self._viewlim_mode = viewlim_mode - self.set_viewlim_mode(viewlim_mode) - - super(ParasiteAxesAuxTrans, self).__init__(parent_axes, **kwargs) - - def _set_lim_and_transforms(self): - - self.transAxes = self._parent_axes.transAxes - - self.transData = \ - self.transAux + \ - self._parent_axes.transData - - self._xaxis_transform = mtransforms.blended_transform_factory( - self.transData, self.transAxes) - self._yaxis_transform = mtransforms.blended_transform_factory( - self.transAxes, self.transData) - - def set_viewlim_mode(self, mode): - if mode not in [None, "equal", "transform"]: - raise ValueError("Unknown mode : %s" % (mode,)) - else: - self._viewlim_mode = mode - - def get_viewlim_mode(self): - return self._viewlim_mode - - - def update_viewlim(self): - viewlim = self._parent_axes.viewLim.frozen() - mode = self.get_viewlim_mode() - if mode is None: - pass - elif mode == "equal": - self.axes.viewLim.set(viewlim) - elif mode == "transform": - self.axes.viewLim.set(viewlim.transformed(self.transAux.inverted())) - else: - raise ValueError("Unknown mode : %s" % (self._viewlim_mode,)) - - - def apply_aspect(self, position=None): - self.update_viewlim() - super(ParasiteAxesAuxTrans, self).apply_aspect() - - - - def _pcolor(self, method_name, *XYC, **kwargs): - if len(XYC) == 1: - C = XYC[0] - ny, nx = C.shape - - gx = np.arange(-0.5, nx, 1.) - gy = np.arange(-0.5, ny, 1.) - - X, Y = np.meshgrid(gx, gy) - else: - X, Y, C = XYC - - pcolor_routine = getattr(ParasiteAxes, method_name) - - if kwargs.has_key("transform"): - mesh = pcolor_routine(self, X, Y, C, **kwargs) - else: - orig_shape = X.shape - xy = np.vstack([X.flat, Y.flat]) - xyt=xy.transpose() - wxy = self.transAux.transform(xyt) - gx, gy = wxy[:,0].reshape(orig_shape), wxy[:,1].reshape(orig_shape) - mesh = pcolor_routine(self, gx, gy, C, **kwargs) - mesh.set_transform(self._parent_axes.transData) - - return mesh - - def pcolormesh(self, *XYC, **kwargs): - return self._pcolor("pcolormesh", *XYC, **kwargs) - - def pcolor(self, *XYC, **kwargs): - return self._pcolor("pcolor", *XYC, **kwargs) - - def _contour(self, method_name, *XYCL, **kwargs): - - if len(XYCL) <= 2: - C = XYCL[0] - ny, nx = C.shape - - gx = np.arange(0., nx, 1.) - gy = np.arange(0., ny, 1.) - - X,Y = np.meshgrid(gx, gy) - CL = XYCL - else: - X, Y = XYCL[:2] - CL = XYCL[2:] - - contour_routine = getattr(ParasiteAxes, method_name) - - if kwargs.has_key("transform"): - cont = contour_routine(self, X, Y, *CL, **kwargs) - else: - orig_shape = X.shape - xy = np.vstack([X.flat, Y.flat]) - xyt=xy.transpose() - wxy = self.transAux.transform(xyt) - gx, gy = wxy[:,0].reshape(orig_shape), wxy[:,1].reshape(orig_shape) - cont = contour_routine(self, gx, gy, *CL, **kwargs) - for c in cont.collections: - c.set_transform(self._parent_axes.transData) - - return cont - - def contour(self, *XYCL, **kwargs): - return self._contour("contour", *XYCL, **kwargs) - - def contourf(self, *XYCL, **kwargs): - return self._contour("contourf", *XYCL, **kwargs) +ParasiteAxes = parasite_axes_class_factory(Axes) +ParasiteAxesAuxTrans = parasite_axes_auxtrans_class_factory(axes_class=ParasiteAxes) -def _get_handles(ax): - handles = ax.lines[:] - handles.extend(ax.patches) - handles.extend([c for c in ax.collections - if isinstance(c, mcoll.LineCollection)]) - handles.extend([c for c in ax.collections - if isinstance(c, mcoll.RegularPolyCollection)]) - return handles - - -class HostAxes(Axes): - - def __init__(self, *kl, **kwargs): - - self.parasites = [] - super(HostAxes, self).__init__(*kl, **kwargs) - - - - def legend(self, *args, **kwargs): - - if len(args)==0: - all_handles = _get_handles(self) - for ax in self.parasites: - all_handles.extend(_get_handles(ax)) - handles = [] - labels = [] - for handle in all_handles: - label = handle.get_label() - if (label is not None and - label != '' and not label.startswith('_')): - handles.append(handle) - labels.append(label) - if len(handles) == 0: - warnings.warn("No labeled objects found. " - "Use label='...' kwarg on individual plots.") - return None - - elif len(args)==1: - # LABELS - labels = args[0] - handles = [h for h, label in zip(all_handles, labels)] - - elif len(args)==2: - if is_string_like(args[1]) or isinstance(args[1], int): - # LABELS, LOC - labels, loc = args - handles = [h for h, label in zip(all_handles, labels)] - kwargs['loc'] = loc - else: - # LINES, LABELS - handles, labels = args - - elif len(args)==3: - # LINES, LABELS, LOC - handles, labels, loc = args - kwargs['loc'] = loc - else: - raise TypeError('Invalid arguments to legend') - - - handles = cbook.flatten(handles) - self.legend_ = mlegend.Legend(self, handles, labels, **kwargs) - return self.legend_ - - - def draw(self, renderer): - - orig_artists = list(self.artists) - orig_images = list(self.images) - - if hasattr(self, "get_axes_locator"): - locator = self.get_axes_locator() - if locator: - pos = locator(self, renderer) - self.set_position(pos, which="active") - self.apply_aspect(pos) - else: - self.apply_aspect() - else: - self.apply_aspect() - - rect = self.get_position() - - for ax in self.parasites: - ax.apply_aspect(rect) - images, artists = ax.get_images_artists() - self.images.extend(images) - self.artists.extend(artists) - - super(HostAxes, self).draw(renderer) - self.artists = orig_artists - self.images = orig_images - - def cla(self): - - for ax in self.parasites: - ax.cla() - - super(HostAxes, self).cla() - - - def twinx(self): - """ - call signature:: - - ax2 = ax.twinx() - - create a twin of Axes for generating a plot with a sharex - x-axis but independent y axis. The y-axis of self will have - ticks on left and the returned axes will have ticks on the - right - """ - - ax2 = ParasiteAxes(self, sharex=self, frameon=False) - self.parasites.append(ax2) - - # for normal axes - self.yaxis.tick_left() - ax2.xaxis.set_visible(False) - ax2.yaxis.tick_right() - ax2.yaxis.set_label_position('right') - - # for axisline axes - self._axislines["right"].set_visible(False) - ax2._axislines["left"].set_visible(False) - ax2._axislines["right"].set_visible(True) - ax2._axislines["right"].major_ticklabels.set_visible(True) - ax2._axislines["right"].label.set_visible(True) - - - return ax2 - - def twiny(self): - """ - call signature:: - - ax2 = ax.twiny() - - create a twin of Axes for generating a plot with a shared - y-axis but independent x axis. The x-axis of self will have - ticks on bottom and the returned axes will have ticks on the - top - """ - - ax2 = ParasiteAxes(self, sharey=self, frameon=False) - self.parasites.append(ax2) - - # for normal axes - self.xaxis.tick_bottom() - ax2.yaxis.set_visible(False) - ax2.xaxis.tick_top() - ax2.xaxis.set_label_position('top') - - # for axisline axes - self._axislines["top"].set_visible(False) - ax2._axislines["bottom"].set_visible(False) - ax2._axislines["top"].set_visible(True) - ax2._axislines["top"].major_ticklabels.set_visible(True) - ax2._axislines["top"].label.set_visible(True) - - return ax2 - - def twin(self, aux_trans=None): - """ - call signature:: - - ax2 = ax.twin() - - create a twin of Axes for generating a plot with a sharex - x-axis but independent y axis. The y-axis of self will have - ticks on left and the returned axes will have ticks on the - right - """ - - if aux_trans is None: - ax2 = ParasiteAxesAuxTrans(self, mtransforms.IdentityTransform(), - viewlim_mode="equal", - ) - else: - ax2 = ParasiteAxesAuxTrans(self, aux_trans, - viewlim_mode="transform", - ) - self.parasites.append(ax2) - - - # for normal axes - self.yaxis.tick_left() - self.xaxis.tick_bottom() - ax2.yaxis.tick_right() - ax2.yaxis.set_label_position('right') - ax2.xaxis.tick_top() - ax2.xaxis.set_label_position('top') - - # for axisline axes - self._axislines["right"].set_visible(False) - self._axislines["top"].set_visible(False) - ax2._axislines["left"].set_visible(False) - ax2._axislines["bottom"].set_visible(False) - - ax2._axislines["right"].set_visible(True) - ax2._axislines["top"].set_visible(True) - ax2._axislines["right"].major_ticklabels.set_visible(True) - ax2._axislines["top"].major_ticklabels.set_visible(True) - - return ax2 - +HostAxes = host_axes_class_factory(axes_class=Axes) SubplotHost = subplot_class_factory(HostAxes) - diff -Nru matplotlib-0.99.3/lib/mpl_toolkits/axes_grid1/anchored_artists.py matplotlib-1.0.1/lib/mpl_toolkits/axes_grid1/anchored_artists.py --- matplotlib-0.99.3/lib/mpl_toolkits/axes_grid1/anchored_artists.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_toolkits/axes_grid1/anchored_artists.py 2010-07-07 01:41:47.000000000 +0000 @@ -0,0 +1,160 @@ + +from matplotlib.patches import Rectangle, Ellipse + +import numpy as np + +from matplotlib.offsetbox import AnchoredOffsetbox, AuxTransformBox, VPacker,\ + TextArea, AnchoredText, DrawingArea, AnnotationBbox + + +class AnchoredDrawingArea(AnchoredOffsetbox): + """ + AnchoredOffsetbox with DrawingArea + """ + + def __init__(self, width, height, xdescent, ydescent, + loc, pad=0.4, borderpad=0.5, prop=None, frameon=True, + **kwargs): + """ + *width*, *height*, *xdescent*, *ydescent* : the dimensions of the DrawingArea. + *prop* : font property. this is only used for scaling the paddings. + """ + + self.da = DrawingArea(width, height, xdescent, ydescent, clip=True) + self.drawing_area = self.da + + super(AnchoredDrawingArea, self).__init__(loc, pad=pad, borderpad=borderpad, + child=self.da, + prop=None, + frameon=frameon, + **kwargs) + + +class AnchoredAuxTransformBox(AnchoredOffsetbox): + def __init__(self, transform, loc, + pad=0.4, borderpad=0.5, prop=None, frameon=True, **kwargs): + + self.drawing_area = AuxTransformBox(transform) + + AnchoredOffsetbox.__init__(self, loc, pad=pad, borderpad=borderpad, + child=self.drawing_area, + prop=prop, + frameon=frameon, + **kwargs) + + + +class AnchoredEllipse(AnchoredOffsetbox): + def __init__(self, transform, width, height, angle, loc, + pad=0.1, borderpad=0.1, prop=None, frameon=True, **kwargs): + """ + Draw an ellipse the size in data coordinate of the give axes. + + pad, borderpad in fraction of the legend font size (or prop) + """ + self._box = AuxTransformBox(transform) + self.ellipse = Ellipse((0,0), width, height, angle) + self._box.add_artist(self.ellipse) + + AnchoredOffsetbox.__init__(self, loc, pad=pad, borderpad=borderpad, + child=self._box, + prop=prop, + frameon=frameon, **kwargs) + + + +class AnchoredSizeBar(AnchoredOffsetbox): + def __init__(self, transform, size, label, loc, + pad=0.1, borderpad=0.1, sep=2, prop=None, frameon=True, + **kwargs): + """ + Draw a horizontal bar with the size in data coordinate of the give axes. + A label will be drawn underneath (center-alinged). + + pad, borderpad in fraction of the legend font size (or prop) + sep in points. + """ + self.size_bar = AuxTransformBox(transform) + self.size_bar.add_artist(Rectangle((0,0), size, 0, fc="none")) + + self.txt_label = TextArea(label, minimumdescent=False) + + self._box = VPacker(children=[self.size_bar, self.txt_label], + align="center", + pad=0, sep=sep) + + AnchoredOffsetbox.__init__(self, loc, pad=pad, borderpad=borderpad, + child=self._box, + prop=prop, + frameon=frameon, **kwargs) + + +if __name__ == "__main__": + + import matplotlib.pyplot as plt + + fig = plt.gcf() + fig.clf() + ax = plt.subplot(111) + + offsetbox = AnchoredText("Test", loc=6, pad=0.3, + borderpad=0.3, prop=None) + xy = (0.5, 0.5) + ax.plot([0.5], [0.5], "xk") + ab = AnnotationBbox(offsetbox, xy, + xybox=(1., .5), + xycoords='data', + boxcoords=("axes fraction", "data"), + arrowprops=dict(arrowstyle="->")) + #arrowprops=None) + + ax.add_artist(ab) + + + from matplotlib.patches import Circle + ada = AnchoredDrawingArea(20, 20, 0, 0, + loc=6, pad=0.1, borderpad=0.3, frameon=True) + p = Circle((10, 10), 10) + ada.da.add_artist(p) + + ab = AnnotationBbox(ada, (0.3, 0.4), + xybox=(1., 0.4), + xycoords='data', + boxcoords=("axes fraction", "data"), + arrowprops=dict(arrowstyle="->")) + #arrowprops=None) + + ax.add_artist(ab) + + + arr = np.arange(100).reshape((10,10)) + im = AnchoredImage(arr, + loc=4, + pad=0.5, borderpad=0.2, prop=None, frameon=True, + zoom=1, + cmap = None, + norm = None, + interpolation=None, + origin=None, + extent=None, + filternorm=1, + filterrad=4.0, + resample = False, + ) + + ab = AnnotationBbox(im, (0.5, 0.5), + xybox=(-10., 10.), + xycoords='data', + boxcoords="offset points", + arrowprops=dict(arrowstyle="->")) + #arrowprops=None) + + ax.add_artist(ab) + + ax.set_xlim(0, 1) + ax.set_ylim(0, 1) + + + plt.draw() + plt.show() + diff -Nru matplotlib-0.99.3/lib/mpl_toolkits/axes_grid1/axes_divider.py matplotlib-1.0.1/lib/mpl_toolkits/axes_grid1/axes_divider.py --- matplotlib-0.99.3/lib/mpl_toolkits/axes_grid1/axes_divider.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_toolkits/axes_grid1/axes_divider.py 2010-07-07 01:41:47.000000000 +0000 @@ -0,0 +1,755 @@ +""" +The axes_divider module provide helper classes to adjust the positions of +multiple axes at the drawing time. + + Divider: this is the class that is used calculates the axes + position. It divides the given renctangular area into several sub + rectangles. You intialize the divider by setting the horizontal + and vertical list of sizes that the division will be based on. You + then use the new_locator method, whose return value is a callable + object that can be used to set the axes_locator of the axes. + +""" + +import matplotlib.transforms as mtransforms + +from matplotlib.axes import SubplotBase + +import new + +import axes_size as Size + + +class Divider(object): + """ + This is the class that is used calculates the axes position. It + divides the given renctangular area into several + sub-rectangles. You intialize the divider by setting the + horizontal and vertical lists of sizes + (:mod:`mpl_toolkits.axes_grid.axes_size`) that the division will + be based on. You then use the new_locator method to create a + callable object that can be used to as the axes_locator of the + axes. + """ + + + def __init__(self, fig, pos, horizontal, vertical, aspect=None, anchor="C"): + """ + :param fig: matplotlib figure + :param pos: position (tuple of 4 floats) of the rectangle that + will be divided. + :param horizontal: list of sizes + (:mod:`~mpl_toolkits.axes_grid.axes_size`) + for horizontal division + :param vertical: list of sizes + (:mod:`~mpl_toolkits.axes_grid.axes_size`) + for vertical division + :param aspect: if True, the overall rectalngular area is reduced + so that the relative part of the horizontal and + vertical scales have same scale. + :param anchor: Detrmine how the reduced rectangle is placed + when aspect is True, + """ + + self._fig = fig + self._pos = pos + self._horizontal = horizontal + self._vertical = vertical + self._anchor = anchor + self._aspect = aspect + self._xrefindex = 0 + self._yrefindex = 0 + + + @staticmethod + def _calc_k(l, total_size, renderer): + + rs_sum, as_sum = 0., 0. + + for s in l: + _rs, _as = s.get_size(renderer) + rs_sum += _rs + as_sum += _as + + if rs_sum != 0.: + k = (total_size - as_sum) / rs_sum + return k + else: + return 0. + + + @staticmethod + def _calc_offsets(l, k, renderer): + + offsets = [0.] + + for s in l: + _rs, _as = s.get_size(renderer) + offsets.append(offsets[-1] + _rs*k + _as) + + return offsets + + + def set_position(self, pos): + """ + set the position of the rectangle. + + :param pos: position (tuple of 4 floats) of the rectangle that + will be divided. + """ + self._pos = pos + + def get_position(self): + "return the position of the rectangle." + return self._pos + + def set_anchor(self, anchor): + """ + :param anchor: anchor position + + ===== ============ + value description + ===== ============ + 'C' Center + 'SW' bottom left + 'S' bottom + 'SE' bottom right + 'E' right + 'NE' top right + 'N' top + 'NW' top left + 'W' left + ===== ============ + + """ + if anchor in mtransforms.Bbox.coefs.keys() or len(anchor) == 2: + self._anchor = anchor + else: + raise ValueError('argument must be among %s' % + ', '.join(mtransforms.BBox.coefs.keys())) + + def get_anchor(self): + "return the anchor" + return self._anchor + + def set_horizontal(self, h): + """ + :param horizontal: list of sizes + (:mod:`~mpl_toolkits.axes_grid.axes_size`) + for horizontal division + """ + self._horizontal = h + + + def get_horizontal(self): + "return horizontal sizes" + return self._horizontal + + def set_vertical(self, v): + """ + :param horizontal: list of sizes + (:mod:`~mpl_toolkits.axes_grid.axes_size`) + for horizontal division + """ + self._vertical = v + + def get_vertical(self): + "return vertical sizes" + return self._vertical + + + def set_aspect(self, aspect=False): + """ + :param anchor: True or False + """ + self._aspect = aspect + + def get_aspect(self): + "return aspect" + return self._aspect + + + def locate(self, nx, ny, nx1=None, ny1=None, renderer=None): + """ + + :param nx, nx1: Integers specifying the column-position of the + cell. When nx1 is None, a single nx-th column is + specified. Otherwise location of columns spanning between nx + to nx1 (but excluding nx1-th column) is specified. + + :param ny, ny1: same as nx and nx1, but for row positions. + """ + + + figW,figH = self._fig.get_size_inches() + x, y, w, h = self.get_position() + + k_h = self._calc_k(self._horizontal, figW*w, renderer) + k_v = self._calc_k(self._vertical, figH*h, renderer) + + if self.get_aspect(): + k = min(k_h, k_v) + ox = self._calc_offsets(self._horizontal, k, renderer) + oy = self._calc_offsets(self._vertical, k, renderer) + + ww = (ox[-1] - ox[0])/figW + hh = (oy[-1] - oy[0])/figH + pb = mtransforms.Bbox.from_bounds(x, y, w, h) + pb1 = mtransforms.Bbox.from_bounds(x, y, ww, hh) + pb1_anchored = pb1.anchored(self.get_anchor(), pb) + x0, y0 = pb1_anchored.x0, pb1_anchored.y0 + + else: + ox = self._calc_offsets(self._horizontal, k_h, renderer) + oy = self._calc_offsets(self._vertical, k_v, renderer) + x0, y0 = x, y + + + if nx1 is None: + nx1=nx+1 + if ny1 is None: + ny1=ny+1 + + x1, w1 = x0 + ox[nx]/figW, (ox[nx1] - ox[nx])/figW + y1, h1 = y0 + oy[ny]/figH, (oy[ny1] - oy[ny])/figH + + return mtransforms.Bbox.from_bounds(x1, y1, w1, h1) + + + def new_locator(self, nx, ny, nx1=None, ny1=None): + """ + returns a new locator + (:class:`mpl_toolkits.axes_grid.axes_divider.AxesLocator`) for + specified cell. + + :param nx, nx1: Integers specifying the column-position of the + cell. When nx1 is None, a single nx-th column is + specified. Otherwise location of columns spanning between nx + to nx1 (but excluding nx1-th column) is specified. + + :param ny, ny1: same as nx and nx1, but for row positions. + """ + return AxesLocator(self, nx, ny, nx1, ny1) + + + +class AxesLocator(object): + """ + A simple callable object, initiallized with AxesDivider class, + returns the position and size of the given cell. + """ + def __init__(self, axes_divider, nx, ny, nx1=None, ny1=None): + """ + :param axes_divider: An instance of AxesDivider class. + + :param nx, nx1: Integers specifying the column-position of the + cell. When nx1 is None, a single nx-th column is + specified. Otherwise location of columns spanning between nx + to nx1 (but excluding nx1-th column) is is specified. + + :param ny, ny1: same as nx and nx1, but for row positions. + """ + self._axes_divider = axes_divider + + _xrefindex = axes_divider._xrefindex + _yrefindex = axes_divider._yrefindex + + self._nx, self._ny = nx - _xrefindex, ny - _yrefindex + + if nx1 is None: + nx1 = nx+1 + if ny1 is None: + ny1 = ny+1 + + self._nx1 = nx1 - _xrefindex + self._ny1 = ny1 - _yrefindex + + + def __call__(self, axes, renderer): + + _xrefindex = self._axes_divider._xrefindex + _yrefindex = self._axes_divider._yrefindex + + return self._axes_divider.locate(self._nx + _xrefindex, + self._ny + _yrefindex, + self._nx1 + _xrefindex, + self._ny1 + _yrefindex, + renderer) + + + +class SubplotDivider(Divider): + """ + The Divider class whose rectangle area is specified as a subplot grometry. + """ + + + def __init__(self, fig, *args, **kwargs): + """ + *fig* is a :class:`matplotlib.figure.Figure` instance. + + *args* is the tuple (*numRows*, *numCols*, *plotNum*), where + the array of subplots in the figure has dimensions *numRows*, + *numCols*, and where *plotNum* is the number of the subplot + being created. *plotNum* starts at 1 in the upper left + corner and increases to the right. + + If *numRows* <= *numCols* <= *plotNum* < 10, *args* can be the + decimal integer *numRows* * 100 + *numCols* * 10 + *plotNum*. + """ + + self.figure = fig + + if len(args)==1: + s = str(args[0]) + if len(s) != 3: + raise ValueError('Argument to subplot must be a 3 digits long') + rows, cols, num = map(int, s) + elif len(args)==3: + rows, cols, num = args + else: + raise ValueError( 'Illegal argument to subplot') + + + total = rows*cols + num -= 1 # convert from matlab to python indexing + # ie num in range(0,total) + if num >= total: + raise ValueError( 'Subplot number exceeds total subplots') + self._rows = rows + self._cols = cols + self._num = num + + self.update_params() + + pos = self.figbox.bounds + horizontal = kwargs.pop("horizontal", []) + vertical = kwargs.pop("vertical", []) + aspect = kwargs.pop("aspect", None) + anchor = kwargs.pop("anchor", "C") + + if kwargs: + raise Exception("") + + Divider.__init__(self, fig, pos, horizontal, vertical, + aspect=aspect, anchor=anchor) + + + def get_position(self): + "return the bounds of the subplot box" + self.update_params() + return self.figbox.bounds + + + def update_params(self): + 'update the subplot position from fig.subplotpars' + + rows = self._rows + cols = self._cols + num = self._num + + pars = self.figure.subplotpars + left = pars.left + right = pars.right + bottom = pars.bottom + top = pars.top + wspace = pars.wspace + hspace = pars.hspace + totWidth = right-left + totHeight = top-bottom + + figH = totHeight/(rows + hspace*(rows-1)) + sepH = hspace*figH + + figW = totWidth/(cols + wspace*(cols-1)) + sepW = wspace*figW + + rowNum, colNum = divmod(num, cols) + + figBottom = top - (rowNum+1)*figH - rowNum*sepH + figLeft = left + colNum*(figW + sepW) + + self.figbox = mtransforms.Bbox.from_bounds(figLeft, figBottom, + figW, figH) + + +class AxesDivider(Divider): + """ + Divider based on the pre-existing axes. + """ + + def __init__(self, axes): + """ + :param axes: axes + """ + self._axes = axes + self._xref = Size.AxesX(axes) + self._yref = Size.AxesY(axes) + Divider.__init__(self, fig=axes.get_figure(), pos=None, + horizontal=[self._xref], vertical=[self._yref], + aspect=None, anchor="C") + + def _get_new_axes(self, **kwargs): + axes = self._axes + + axes_class = kwargs.pop("axes_class", None) + + if axes_class is None: + if isinstance(axes, SubplotBase): + axes_class = axes._axes_class + else: + axes_class = type(axes) + + ax = axes_class(axes.get_figure(), + axes.get_position(original=True), **kwargs) + + return ax + + + def new_horizontal(self, size, pad=None, pack_start=False, **kwargs): + """ + Add a new axes on the right (or left) side of the main axes. + + :param size: A width of the axes. A :mod:`~mpl_toolkits.axes_grid.axes_size` + instance or if float or string is given, *from_any* + fucntion is used to create one, with *ref_size* set to AxesX instance + of the current axes. + :param pad: pad between the axes. It takes same argument as *size*. + :param pack_start: If False, the new axes is appended at the end + of the list, i.e., it became the right-most axes. If True, it is + inseted at the start of the list, and becomes the left-most axes. + + All extra keywords argument is passed to when creating a axes. + if *axes_class* is given, the new axes will be created as an + instance of the given class. Otherwise, the same class of the + main axes will be used. if Not provided + + """ + + if pad: + if not isinstance(pad, Size._Base): + pad = Size.from_any(pad, + fraction_ref=self._xref) + if pack_start: + self._horizontal.insert(0, pad) + self._xrefindex += 1 + else: + self._horizontal.append(pad) + + if not isinstance(size, Size._Base): + size = Size.from_any(size, + fraction_ref=self._xref) + + if pack_start: + self._horizontal.insert(0, size) + self._xrefindex += 1 + locator = self.new_locator(nx=0, ny=0) + else: + self._horizontal.append(size) + locator = self.new_locator(nx=len(self._horizontal)-1, ny=0) + + ax = self._get_new_axes(**kwargs) + ax.set_axes_locator(locator) + + return ax + + def new_vertical(self, size, pad=None, pack_start=False, **kwargs): + """ + Add a new axes on the top (or bottom) side of the main axes. + + :param size: A height of the axes. A :mod:`~mpl_toolkits.axes_grid.axes_size` + instance or if float or string is given, *from_any* + fucntion is used to create one, with *ref_size* set to AxesX instance + of the current axes. + :param pad: pad between the axes. It takes same argument as *size*. + :param pack_start: If False, the new axes is appended at the end + of the list, i.e., it became the top-most axes. If True, it is + inseted at the start of the list, and becomes the bottom-most axes. + + All extra keywords argument is passed to when creating a axes. + if *axes_class* is given, the new axes will be created as an + instance of the given class. Otherwise, the same class of the + main axes will be used. if Not provided + + """ + + if pad: + if not isinstance(pad, Size._Base): + pad = Size.from_any(pad, + fraction_ref=self._yref) + if pack_start: + self._vertical.insert(0, pad) + self._yrefindex += 1 + else: + self._vertical.append(pad) + + if not isinstance(size, Size._Base): + size = Size.from_any(size, + fraction_ref=self._yref) + + if pack_start: + self._vertical.insert(0, size) + self._yrefindex += 1 + locator = self.new_locator(nx=0, ny=0) + else: + self._vertical.append(size) + locator = self.new_locator(nx=0, ny=len(self._vertical)-1) + + ax = self._get_new_axes(**kwargs) + ax.set_axes_locator(locator) + + return ax + + + def append_axes(self, position, size, pad=None, add_to_figure=True, + **kwargs): + """ + create an axes at the given *position* with the same height + (or width) of the main axes. + + *position* + ["left"|"right"|"bottom"|"top"] + + *size* and *pad* should be axes_grid.axes_size compatible. + """ + + if position == "left": + ax = self.new_horizontal(size, pad, pack_start=True, **kwargs) + elif position == "right": + ax = self.new_horizontal(size, pad, pack_start=False, **kwargs) + elif position == "bottom": + ax = self.new_vertical(size, pad, pack_start=True, **kwargs) + elif position == "top": + ax = self.new_vertical(size, pad, pack_start=False, **kwargs) + else: + raise ValueError("the position must be one of left, right, bottom, or top") + + if add_to_figure: + self._fig.add_axes(ax) + return ax + + def get_aspect(self): + if self._aspect is None: + aspect = self._axes.get_aspect() + if aspect == "auto": + return False + else: + return True + else: + return self._aspect + + def get_position(self): + if self._pos is None: + bbox = self._axes.get_position(original=True) + return bbox.bounds + else: + return self._pos + + def get_anchor(self): + if self._anchor is None: + return self._axes.get_anchor() + else: + return self._anchor + + + +class LocatableAxesBase: + def __init__(self, *kl, **kw): + + self._axes_class.__init__(self, *kl, **kw) + + self._locator = None + self._locator_renderer = None + + def set_axes_locator(self, locator): + self._locator = locator + + def get_axes_locator(self): + return self._locator + + def apply_aspect(self, position=None): + + if self.get_axes_locator() is None: + self._axes_class.apply_aspect(self, position) + else: + pos = self.get_axes_locator()(self, self._locator_renderer) + self._axes_class.apply_aspect(self, position=pos) + + + def draw(self, renderer=None, inframe=False): + + self._locator_renderer = renderer + + self._axes_class.draw(self, renderer, inframe) + + + +_locatableaxes_classes = {} +def locatable_axes_factory(axes_class): + + new_class = _locatableaxes_classes.get(axes_class) + if new_class is None: + new_class = new.classobj("Locatable%s" % (axes_class.__name__), + (LocatableAxesBase, axes_class), + {'_axes_class': axes_class}) + _locatableaxes_classes[axes_class] = new_class + + return new_class + +#if hasattr(maxes.Axes, "get_axes_locator"): +# LocatableAxes = maxes.Axes +#else: + +def make_axes_locatable(axes): + if not hasattr(axes, "set_axes_locator"): + new_class = locatable_axes_factory(type(axes)) + axes.__class__ = new_class + + divider = AxesDivider(axes) + locator = divider.new_locator(nx=0, ny=0) + axes.set_axes_locator(locator) + + return divider + + +#from matplotlib.axes import Axes +from mpl_axes import Axes +LocatableAxes = locatable_axes_factory(Axes) + + + +def get_demo_image(): + # prepare image + delta = 0.5 + + extent = (-3,4,-4,3) + import numpy as np + x = np.arange(-3.0, 4.001, delta) + y = np.arange(-4.0, 3.001, delta) + X, Y = np.meshgrid(x, y) + import matplotlib.mlab as mlab + Z1 = mlab.bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0) + Z2 = mlab.bivariate_normal(X, Y, 1.5, 0.5, 1, 1) + Z = (Z1 - Z2) * 10 + + return Z, extent + +def demo_locatable_axes(): + import matplotlib.pyplot as plt + + fig1 = plt.figure(1, (6, 6)) + fig1.clf() + + ## PLOT 1 + # simple image & colorbar + ax = fig1.add_subplot(2, 2, 1) + + Z, extent = get_demo_image() + + im = ax.imshow(Z, extent=extent, interpolation="nearest") + cb = plt.colorbar(im) + plt.setp(cb.ax.get_yticklabels(), visible=False) + + + ## PLOT 2 + # image and colorbar whose location is adjusted in the drawing time. + # a hard way + + divider = SubplotDivider(fig1, 2, 2, 2, aspect=True) + + # axes for image + ax = LocatableAxes(fig1, divider.get_position()) + + # axes for coloarbar + ax_cb = LocatableAxes(fig1, divider.get_position()) + + h = [Size.AxesX(ax), # main axes + Size.Fixed(0.05), # padding, 0.1 inch + Size.Fixed(0.2), # colorbar, 0.3 inch + ] + + v = [Size.AxesY(ax)] + + divider.set_horizontal(h) + divider.set_vertical(v) + + ax.set_axes_locator(divider.new_locator(nx=0, ny=0)) + ax_cb.set_axes_locator(divider.new_locator(nx=2, ny=0)) + + fig1.add_axes(ax) + fig1.add_axes(ax_cb) + + ax_cb.yaxis.set_ticks_position("right") + + Z, extent = get_demo_image() + + im = ax.imshow(Z, extent=extent, interpolation="nearest") + plt.colorbar(im, cax=ax_cb) + plt.setp(ax_cb.get_yticklabels(), visible=False) + + plt.draw() + #plt.colorbar(im, cax=ax_cb) + + + ## PLOT 3 + # image and colorbar whose location is adjusted in the drawing time. + # a easy way + + ax = fig1.add_subplot(2, 2, 3) + divider = make_axes_locatable(ax) + + ax_cb = divider.new_horizontal(size="5%", pad=0.05) + fig1.add_axes(ax_cb) + + im = ax.imshow(Z, extent=extent, interpolation="nearest") + plt.colorbar(im, cax=ax_cb) + plt.setp(ax_cb.get_yticklabels(), visible=False) + + + ## PLOT 4 + # two images side by sied with fixed padding. + + ax = fig1.add_subplot(2, 2, 4) + divider = make_axes_locatable(ax) + + ax2 = divider.new_horizontal(size="100%", pad=0.05) + fig1.add_axes(ax2) + + ax.imshow(Z, extent=extent, interpolation="nearest") + ax2.imshow(Z, extent=extent, interpolation="nearest") + plt.setp(ax2.get_yticklabels(), visible=False) + plt.draw() + plt.show() + + +def demo_fixed_size_axes(): + import matplotlib.pyplot as plt + + fig2 = plt.figure(2, (6, 6)) + + # The first items are for padding and the second items are for the axes. + # sizes are in inch. + h = [Size.Fixed(1.0), Size.Fixed(4.5)] + v = [Size.Fixed(0.7), Size.Fixed(5.)] + + divider = Divider(fig2, (0.0, 0.0, 1., 1.), h, v, aspect=False) + # the width and height of the rectangle is ignored. + + ax = LocatableAxes(fig2, divider.get_position()) + ax.set_axes_locator(divider.new_locator(nx=1, ny=1)) + + fig2.add_axes(ax) + + ax.plot([1,2,3]) + + plt.draw() + plt.show() + #plt.colorbar(im, cax=ax_cb) + + + + + +if __name__ == "__main__": + demo_locatable_axes() + demo_fixed_size_axes() diff -Nru matplotlib-0.99.3/lib/mpl_toolkits/axes_grid1/axes_grid.py matplotlib-1.0.1/lib/mpl_toolkits/axes_grid1/axes_grid.py --- matplotlib-0.99.3/lib/mpl_toolkits/axes_grid1/axes_grid.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_toolkits/axes_grid1/axes_grid.py 2010-07-07 01:41:47.000000000 +0000 @@ -0,0 +1,787 @@ +import matplotlib.cbook as cbook + +import matplotlib.pyplot as plt +import matplotlib.axes as maxes +#import matplotlib.colorbar as mcolorbar +import colorbar as mcolorbar +import matplotlib as mpl +import matplotlib.patches as mpatches +import matplotlib.lines as mlines +import matplotlib.ticker as ticker + +from axes_divider import Size, SubplotDivider, LocatableAxes, Divider + +#import numpy as np + +def _tick_only(ax, bottom_on, left_on): + bottom_off = not bottom_on + left_off = not left_on + # [l.set_visible(bottom_off) for l in ax.get_xticklabels()] + # [l.set_visible(left_off) for l in ax.get_yticklabels()] + # ax.xaxis.label.set_visible(bottom_off) + # ax.yaxis.label.set_visible(left_off) + ax.axis["bottom"].toggle(ticklabels=bottom_off, label=bottom_off) + ax.axis["left"].toggle(ticklabels=left_off, label=left_off) + +class Colorbar(mcolorbar.Colorbar): + def _config_axes_deprecated(self, X, Y): + ''' + Make an axes patch and outline. + ''' + ax = self.ax + ax.set_frame_on(False) + ax.set_navigate(False) + xy = self._outline(X, Y) + ax.update_datalim(xy) + ax.set_xlim(*ax.dataLim.intervalx) + ax.set_ylim(*ax.dataLim.intervaly) + self.outline = mlines.Line2D(xy[:, 0], xy[:, 1], color=mpl.rcParams['axes.edgecolor'], + linewidth=mpl.rcParams['axes.linewidth']) + ax.add_artist(self.outline) + self.outline.set_clip_box(None) + self.outline.set_clip_path(None) + c = mpl.rcParams['axes.facecolor'] + self.patch = mpatches.Polygon(xy, edgecolor=c, + facecolor=c, + linewidth=0.01, + zorder=-1) + ax.add_artist(self.patch) + ticks, ticklabels, offset_string = self._ticker() + + if self.orientation == 'vertical': + ax.set_yticks(ticks) + ax.set_yticklabels(ticklabels) + ax.yaxis.get_major_formatter().set_offset_string(offset_string) + + else: + ax.set_xticks(ticks) + ax.set_xticklabels(ticklabels) + ax.xaxis.get_major_formatter().set_offset_string(offset_string) + + + +class CbarAxesBase(object): + + def colorbar(self, mappable, **kwargs): + locator=kwargs.pop("locator", None) + if locator is None: + locator = ticker.MaxNLocator(5) + self.locator = locator + + kwargs["ticks"] = locator + + + self.hold(True) + if self.orientation in ["top", "bottom"]: + orientation="horizontal" + else: + orientation="vertical" + + cb = Colorbar(self, mappable, orientation=orientation, **kwargs) + self._config_axes() + + def on_changed(m): + #print 'calling on changed', m.get_cmap().name + cb.set_cmap(m.get_cmap()) + cb.set_clim(m.get_clim()) + cb.update_bruteforce(m) + + self.cbid = mappable.callbacksSM.connect('changed', on_changed) + mappable.set_colorbar(cb, self) + return cb + + def _config_axes(self): + ''' + Make an axes patch and outline. + ''' + ax = self + ax.set_navigate(False) + + ax.axis[:].toggle(all=False) + b = self._default_label_on + ax.axis[self.orientation].toggle(all=b) + + # for axis in ax.axis.values(): + # axis.major_ticks.set_visible(False) + # axis.minor_ticks.set_visible(False) + # axis.major_ticklabels.set_visible(False) + # axis.minor_ticklabels.set_visible(False) + # axis.label.set_visible(False) + + # axis = ax.axis[self.orientation] + # axis.major_ticks.set_visible(True) + # axis.minor_ticks.set_visible(True) + + + #axis.major_ticklabels.set_size(int(axis.major_ticklabels.get_size()*.9)) + #axis.major_tick_pad = 3 + + # axis.major_ticklabels.set_visible(b) + # axis.minor_ticklabels.set_visible(b) + # axis.label.set_visible(b) + + + def toggle_label(self, b): + self._default_label_on = b + axis = self.axis[self.orientation] + axis.toggle(ticklabels=b, label=b) + #axis.major_ticklabels.set_visible(b) + #axis.minor_ticklabels.set_visible(b) + #axis.label.set_visible(b) + + + +class CbarAxes(CbarAxesBase, LocatableAxes): + def __init__(self, *kl, **kwargs): + orientation=kwargs.pop("orientation", None) + if orientation is None: + raise ValueError("orientation must be specified") + self.orientation = orientation + self._default_label_on = True + self.locator = None + + super(LocatableAxes, self).__init__(*kl, **kwargs) + + def cla(self): + super(LocatableAxes, self).cla() + self._config_axes() + + +class Grid(object): + """ + A class that creates a grid of Axes. In matplotlib, the axes + location (and size) is specified in the normalized figure + coordinates. This may not be ideal for images that needs to be + displayed with a given aspect ratio. For example, displaying + images of a same size with some fixed padding between them cannot + be easily done in matplotlib. AxesGrid is used in such case. + """ + + _defaultLocatableAxesClass = LocatableAxes + + def __init__(self, fig, + rect, + nrows_ncols, + ngrids = None, + direction="row", + axes_pad = 0.02, + add_all=True, + share_all=False, + share_x=True, + share_y=True, + #aspect=True, + label_mode="L", + axes_class=None, + ): + """ + Build an :class:`Grid` instance with a grid nrows*ncols + :class:`~matplotlib.axes.Axes` in + :class:`~matplotlib.figure.Figure` *fig* with + *rect=[left, bottom, width, height]* (in + :class:`~matplotlib.figure.Figure` coordinates) or + the subplot position code (e.g., "121"). + + Optional keyword arguments: + + ================ ======== ========================================= + Keyword Default Description + ================ ======== ========================================= + direction "row" [ "row" | "column" ] + axes_pad 0.02 float| pad betweein axes given in inches + add_all True [ True | False ] + share_all False [ True | False ] + share_x True [ True | False ] + share_y True [ True | False ] + label_mode "L" [ "L" | "1" | "all" ] + axes_class None a type object which must be a subclass + of :class:`~matplotlib.axes.Axes` + ================ ======== ========================================= + """ + self._nrows, self._ncols = nrows_ncols + + if ngrids is None: + ngrids = self._nrows * self._ncols + else: + if (ngrids > self._nrows * self._ncols) or (ngrids <= 0): + raise Exception("") + + self.ngrids = ngrids + + self._init_axes_pad(axes_pad) + + if direction not in ["column", "row"]: + raise Exception("") + + self._direction = direction + + + if axes_class is None: + axes_class = self._defaultLocatableAxesClass + axes_class_args = {} + else: + if (type(axes_class)) == type and \ + issubclass(axes_class, self._defaultLocatableAxesClass.Axes): + axes_class_args = {} + else: + axes_class, axes_class_args = axes_class + + self.axes_all = [] + self.axes_column = [[] for i in range(self._ncols)] + self.axes_row = [[] for i in range(self._nrows)] + + + h = [] + v = [] + if cbook.is_string_like(rect) or cbook.is_numlike(rect): + self._divider = SubplotDivider(fig, rect, horizontal=h, vertical=v, + aspect=False) + elif len(rect) == 3: + kw = dict(horizontal=h, vertical=v, aspect=False) + self._divider = SubplotDivider(fig, *rect, **kw) + elif len(rect) == 4: + self._divider = Divider(fig, rect, horizontal=h, vertical=v, + aspect=False) + else: + raise Exception("") + + + rect = self._divider.get_position() + + # reference axes + self._column_refax = [None for i in range(self._ncols)] + self._row_refax = [None for i in range(self._nrows)] + self._refax = None + + for i in range(self.ngrids): + + col, row = self._get_col_row(i) + + if share_all: + sharex = self._refax + sharey = self._refax + else: + if share_x: + sharex = self._column_refax[col] + else: + sharex = None + + if share_y: + sharey = self._row_refax[row] + else: + sharey = None + + ax = axes_class(fig, rect, sharex=sharex, sharey=sharey, + **axes_class_args) + + if share_all: + if self._refax is None: + self._refax = ax + else: + if sharex is None: + self._column_refax[col] = ax + if sharey is None: + self._row_refax[row] = ax + + self.axes_all.append(ax) + self.axes_column[col].append(ax) + self.axes_row[row].append(ax) + + self.axes_llc = self.axes_column[0][-1] + + self._update_locators() + + if add_all: + for ax in self.axes_all: + fig.add_axes(ax) + + self.set_label_mode(label_mode) + + + def _init_axes_pad(self, axes_pad): + self._axes_pad = axes_pad + + self._horiz_pad_size = Size.Fixed(axes_pad) + self._vert_pad_size = Size.Fixed(axes_pad) + + + def _update_locators(self): + + h = [] + + h_ax_pos = [] + h_cb_pos = [] + + for ax in self._column_refax: + #if h: h.append(Size.Fixed(self._axes_pad)) + if h: h.append(self._horiz_pad_size) + + h_ax_pos.append(len(h)) + + sz = Size.Scaled(1) + h.append(sz) + + v = [] + + v_ax_pos = [] + v_cb_pos = [] + for ax in self._row_refax[::-1]: + #if v: v.append(Size.Fixed(self._axes_pad)) + if v: v.append(self._vert_pad_size) + + v_ax_pos.append(len(v)) + sz = Size.Scaled(1) + v.append(sz) + + + for i in range(self.ngrids): + col, row = self._get_col_row(i) + locator = self._divider.new_locator(nx=h_ax_pos[col], + ny=v_ax_pos[self._nrows -1 - row]) + self.axes_all[i].set_axes_locator(locator) + + self._divider.set_horizontal(h) + self._divider.set_vertical(v) + + + + def _get_col_row(self, n): + if self._direction == "column": + col, row = divmod(n, self._nrows) + else: + row, col = divmod(n, self._ncols) + + return col, row + + + def __getitem__(self, i): + return self.axes_all[i] + + + def get_geometry(self): + """ + get geometry of the grid. Returns a tuple of two integer, + representing number of rows and number of columns. + """ + return self._nrows, self._ncols + + def set_axes_pad(self, axes_pad): + "set axes_pad" + self._axes_pad = axes_pad + + self._horiz_pad_size.fixed_size = axes_pad + self._vert_pad_size.fixed_size = axes_pad + + + def get_axes_pad(self): + "get axes_pad" + return self._axes_pad + + def set_aspect(self, aspect): + "set aspect" + self._divider.set_aspect(aspect) + + def get_aspect(self): + "get aspect" + return self._divider.get_aspect() + + def set_label_mode(self, mode): + "set label_mode" + if mode == "all": + for ax in self.axes_all: + _tick_only(ax, False, False) + elif mode == "L": + # left-most axes + for ax in self.axes_column[0][:-1]: + _tick_only(ax, bottom_on=True, left_on=False) + # lower-left axes + ax = self.axes_column[0][-1] + _tick_only(ax, bottom_on=False, left_on=False) + + for col in self.axes_column[1:]: + # axes with no labels + for ax in col[:-1]: + _tick_only(ax, bottom_on=True, left_on=True) + + # bottom + ax = col[-1] + _tick_only(ax, bottom_on=False, left_on=True) + + elif mode == "1": + for ax in self.axes_all: + _tick_only(ax, bottom_on=True, left_on=True) + + ax = self.axes_llc + _tick_only(ax, bottom_on=False, left_on=False) + + +class ImageGrid(Grid): + """ + A class that creates a grid of Axes. In matplotlib, the axes + location (and size) is specified in the normalized figure + coordinates. This may not be ideal for images that needs to be + displayed with a given aspect ratio. For example, displaying + images of a same size with some fixed padding between them cannot + be easily done in matplotlib. ImageGrid is used in such case. + """ + + _defaultCbarAxesClass = CbarAxes + + def __init__(self, fig, + rect, + nrows_ncols, + ngrids = None, + direction="row", + axes_pad = 0.02, + add_all=True, + share_all=False, + aspect=True, + label_mode="L", + cbar_mode=None, + cbar_location="right", + cbar_pad=None, + cbar_size="5%", + cbar_set_cax=True, + axes_class=None, + ): + """ + Build an :class:`ImageGrid` instance with a grid nrows*ncols + :class:`~matplotlib.axes.Axes` in + :class:`~matplotlib.figure.Figure` *fig* with + *rect=[left, bottom, width, height]* (in + :class:`~matplotlib.figure.Figure` coordinates) or + the subplot position code (e.g., "121"). + + Optional keyword arguments: + + ================ ======== ========================================= + Keyword Default Description + ================ ======== ========================================= + direction "row" [ "row" | "column" ] + axes_pad 0.02 float| pad betweein axes given in inches + add_all True [ True | False ] + share_all False [ True | False ] + aspect True [ True | False ] + label_mode "L" [ "L" | "1" | "all" ] + cbar_mode None [ "each" | "single" ] + cbar_location "right" [ "right" | "top" ] + cbar_pad None + cbar_size "5%" + cbar_set_cax True [ True | False ] + axes_class None a type object which must be a subclass + of :class:`~matplotlib.axes.Axes` + ================ ======== ========================================= + + *cbar_set_cax* : if True, each axes in the grid has a cax + attribute that is bind to associated cbar_axes. + """ + self._nrows, self._ncols = nrows_ncols + + if ngrids is None: + ngrids = self._nrows * self._ncols + else: + if (ngrids > self._nrows * self._ncols) or (ngrids <= 0): + raise Exception("") + + self.ngrids = ngrids + + self._axes_pad = axes_pad + + self._colorbar_mode = cbar_mode + self._colorbar_location = cbar_location + if cbar_pad is None: + self._colorbar_pad = axes_pad + else: + self._colorbar_pad = cbar_pad + + self._colorbar_size = cbar_size + + self._init_axes_pad(axes_pad) + + if direction not in ["column", "row"]: + raise Exception("") + + self._direction = direction + + + if axes_class is None: + axes_class = self._defaultLocatableAxesClass + axes_class_args = {} + else: + if isinstance(axes_class, maxes.Axes): + axes_class_args = {} + else: + axes_class, axes_class_args = axes_class + + + + self.axes_all = [] + self.axes_column = [[] for i in range(self._ncols)] + self.axes_row = [[] for i in range(self._nrows)] + + self.cbar_axes = [] + + h = [] + v = [] + if cbook.is_string_like(rect) or cbook.is_numlike(rect): + self._divider = SubplotDivider(fig, rect, horizontal=h, vertical=v, + aspect=aspect) + elif len(rect) == 3: + kw = dict(horizontal=h, vertical=v, aspect=aspect) + self._divider = SubplotDivider(fig, *rect, **kw) + elif len(rect) == 4: + self._divider = Divider(fig, rect, horizontal=h, vertical=v, + aspect=aspect) + else: + raise Exception("") + + + rect = self._divider.get_position() + + # reference axes + self._column_refax = [None for i in range(self._ncols)] + self._row_refax = [None for i in range(self._nrows)] + self._refax = None + + for i in range(self.ngrids): + + col, row = self._get_col_row(i) + + if share_all: + sharex = self._refax + sharey = self._refax + else: + sharex = self._column_refax[col] + sharey = self._row_refax[row] + + ax = axes_class(fig, rect, sharex=sharex, sharey=sharey, + **axes_class_args) + + if share_all: + if self._refax is None: + self._refax = ax + else: + if sharex is None: + self._column_refax[col] = ax + if sharey is None: + self._row_refax[row] = ax + + self.axes_all.append(ax) + self.axes_column[col].append(ax) + self.axes_row[row].append(ax) + + cax = self._defaultCbarAxesClass(fig, rect, + orientation=self._colorbar_location) + self.cbar_axes.append(cax) + + self.axes_llc = self.axes_column[0][-1] + + self._update_locators() + + if add_all: + for ax in self.axes_all+self.cbar_axes: + fig.add_axes(ax) + + if cbar_set_cax: + if self._colorbar_mode == "single": + for ax in self.axes_all: + ax.cax = self.cbar_axes[0] + else: + for ax, cax in zip(self.axes_all, self.cbar_axes): + ax.cax = cax + + self.set_label_mode(label_mode) + + + + def _update_locators(self): + + h = [] + + h_ax_pos = [] + h_cb_pos = [] + for ax in self._column_refax: + if h: h.append(self._horiz_pad_size) #Size.Fixed(self._axes_pad)) + + h_ax_pos.append(len(h)) + + if ax: + sz = Size.AxesX(ax) + else: + sz = Size.AxesX(self.axes_llc) + h.append(sz) + + if self._colorbar_mode == "each" and self._colorbar_location == "right": + h.append(Size.from_any(self._colorbar_pad, sz)) + h_cb_pos.append(len(h)) + h.append(Size.from_any(self._colorbar_size, sz)) + + + v = [] + + v_ax_pos = [] + v_cb_pos = [] + for ax in self._row_refax[::-1]: + if v: v.append(self._horiz_pad_size) #Size.Fixed(self._axes_pad)) + + v_ax_pos.append(len(v)) + if ax: + sz = Size.AxesY(ax) + else: + sz = Size.AxesY(self.axes_llc) + v.append(sz) + + + if self._colorbar_mode == "each" and self._colorbar_location == "top": + v.append(Size.from_any(self._colorbar_pad, sz)) + v_cb_pos.append(len(v)) + v.append(Size.from_any(self._colorbar_size, sz)) + + + for i in range(self.ngrids): + col, row = self._get_col_row(i) + #locator = self._divider.new_locator(nx=4*col, ny=2*(self._nrows - row - 1)) + locator = self._divider.new_locator(nx=h_ax_pos[col], + ny=v_ax_pos[self._nrows -1 - row]) + self.axes_all[i].set_axes_locator(locator) + + if self._colorbar_mode == "each": + if self._colorbar_location == "right": + locator = self._divider.new_locator(nx=h_cb_pos[col], + ny=v_ax_pos[self._nrows -1 - row]) + elif self._colorbar_location == "top": + locator = self._divider.new_locator(nx=h_ax_pos[col], + ny=v_cb_pos[self._nrows -1 - row]) + self.cbar_axes[i].set_axes_locator(locator) + + + if self._colorbar_mode == "single": + if self._colorbar_location == "right": + #sz = Size.Fraction(Size.AxesX(self.axes_llc), self._nrows) + sz = Size.Fraction(self._nrows, Size.AxesX(self.axes_llc)) + h.append(Size.from_any(self._colorbar_pad, sz)) + h.append(Size.from_any(self._colorbar_size, sz)) + locator = self._divider.new_locator(nx=-2, ny=0, ny1=-1) + elif self._colorbar_location == "top": + #sz = Size.Fraction(Size.AxesY(self.axes_llc), self._ncols) + sz = Size.Fraction(self._ncols, Size.AxesY(self.axes_llc)) + v.append(Size.from_any(self._colorbar_pad, sz)) + v.append(Size.from_any(self._colorbar_size, sz)) + locator = self._divider.new_locator(nx=0, nx1=-1, ny=-2) + for i in range(self.ngrids): + self.cbar_axes[i].set_visible(False) + self.cbar_axes[0].set_axes_locator(locator) + self.cbar_axes[0].set_visible(True) + elif self._colorbar_mode == "each": + for i in range(self.ngrids): + self.cbar_axes[i].set_visible(True) + else: + for i in range(self.ngrids): + self.cbar_axes[i].set_visible(False) + self.cbar_axes[i].set_position([1., 1., 0.001, 0.001], + which="active") + + self._divider.set_horizontal(h) + self._divider.set_vertical(v) + + +AxesGrid = ImageGrid + + + +#if __name__ == "__main__": +if 0: + F = plt.figure(1, (7, 6)) + F.clf() + + F.subplots_adjust(left=0.15, right=0.9) + + grid = Grid(F, 111, # similar to subplot(111) + nrows_ncols = (2, 2), + direction="row", + axes_pad = 0.05, + add_all=True, + label_mode = "1", + ) + + + +#if __name__ == "__main__": +if 0: + from axes_divider import get_demo_image + F = plt.figure(1, (9, 3.5)) + F.clf() + + F.subplots_adjust(left=0.05, right=0.98) + + grid = ImageGrid(F, 131, # similar to subplot(111) + nrows_ncols = (2, 2), + direction="row", + axes_pad = 0.05, + add_all=True, + label_mode = "1", + ) + + Z, extent = get_demo_image() + plt.ioff() + for i in range(4): + im = grid[i].imshow(Z, extent=extent, interpolation="nearest") + + # This only affects axes in first column and second row as share_all = False. + grid.axes_llc.set_xticks([-2, 0, 2]) + grid.axes_llc.set_yticks([-2, 0, 2]) + plt.ion() + + + grid = ImageGrid(F, 132, # similar to subplot(111) + nrows_ncols = (2, 2), + direction="row", + axes_pad = 0.0, + add_all=True, + share_all=True, + label_mode = "1", + cbar_mode="single", + ) + + Z, extent = get_demo_image() + plt.ioff() + for i in range(4): + im = grid[i].imshow(Z, extent=extent, interpolation="nearest") + plt.colorbar(im, cax = grid.cbar_axes[0]) + plt.setp(grid.cbar_axes[0].get_yticklabels(), visible=False) + + # This affects all axes as share_all = True. + grid.axes_llc.set_xticks([-2, 0, 2]) + grid.axes_llc.set_yticks([-2, 0, 2]) + + plt.ion() + + + + grid = ImageGrid(F, 133, # similar to subplot(122) + nrows_ncols = (2, 2), + direction="row", + axes_pad = 0.1, + add_all=True, + label_mode = "1", + share_all = True, + cbar_location="top", + cbar_mode="each", + cbar_size="7%", + cbar_pad="2%", + ) + plt.ioff() + for i in range(4): + im = grid[i].imshow(Z, extent=extent, interpolation="nearest") + plt.colorbar(im, cax = grid.cbar_axes[i], + orientation="horizontal") + grid.cbar_axes[i].xaxis.set_ticks_position("top") + plt.setp(grid.cbar_axes[i].get_xticklabels(), visible=False) + + # This affects all axes as share_all = True. + grid.axes_llc.set_xticks([-2, 0, 2]) + grid.axes_llc.set_yticks([-2, 0, 2]) + + plt.ion() + plt.draw() + + diff -Nru matplotlib-0.99.3/lib/mpl_toolkits/axes_grid1/axes_rgb.py matplotlib-1.0.1/lib/mpl_toolkits/axes_grid1/axes_rgb.py --- matplotlib-0.99.3/lib/mpl_toolkits/axes_grid1/axes_rgb.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_toolkits/axes_grid1/axes_rgb.py 2010-07-07 01:41:47.000000000 +0000 @@ -0,0 +1,162 @@ +import numpy as np +from axes_divider import make_axes_locatable, Size, locatable_axes_factory + +def make_rgb_axes(ax, pad=0.01, axes_class=None, add_all=True): + """ + pad : fraction of the axes height. + """ + + divider = make_axes_locatable(ax) + + pad_size = Size.Fraction(pad, Size.AxesY(ax)) + + xsize = Size.Fraction((1.-2.*pad)/3., Size.AxesX(ax)) + ysize = Size.Fraction((1.-2.*pad)/3., Size.AxesY(ax)) + + divider.set_horizontal([Size.AxesX(ax), pad_size, xsize]) + divider.set_vertical([ysize, pad_size, ysize, pad_size, ysize]) + + ax.set_axes_locator(divider.new_locator(0, 0, ny1=-1)) + + ax_rgb = [] + if axes_class is None: + try: + axes_class = locatable_axes_factory(ax._axes_class) + except AttributeError: + axes_class = locatable_axes_factory(type(ax)) + + for ny in [4, 2, 0]: + ax1 = axes_class(ax.get_figure(), + ax.get_position(original=True), + sharex=ax, sharey=ax) + locator = divider.new_locator(nx=2, ny=ny) + ax1.set_axes_locator(locator) + for t in ax1.yaxis.get_ticklabels() + ax1.xaxis.get_ticklabels(): + t.set_visible(False) + try: + for axis in ax1.axis.values(): + axis.major_ticklabels.set_visible(False) + except AttributeError: + pass + + ax_rgb.append(ax1) + + if add_all: + fig = ax.get_figure() + for ax1 in ax_rgb: + fig.add_axes(ax1) + + return ax_rgb + +#import matplotlib.axes as maxes + + +def imshow_rgb(ax, r, g, b, **kwargs): + ny, nx = r.shape + R = np.zeros([ny, nx, 3], dtype="d") + R[:,:,0] = r + G = np.zeros_like(R) + G[:,:,1] = g + B = np.zeros_like(R) + B[:,:,2] = b + + RGB = R + G + B + + im_rgb = ax.imshow(RGB, **kwargs) + + return im_rgb + + +from mpl_axes import Axes + +class RGBAxesBase(object): + + def __init__(self, *kl, **kwargs): + pad = kwargs.pop("pad", 0.0) + add_all = kwargs.pop("add_all", True) + axes_class = kwargs.pop("axes_class", None) + + + + + if axes_class is None: + axes_class = self._defaultAxesClass + + ax = axes_class(*kl, **kwargs) + + divider = make_axes_locatable(ax) + + pad_size = Size.Fraction(pad, Size.AxesY(ax)) + + xsize = Size.Fraction((1.-2.*pad)/3., Size.AxesX(ax)) + ysize = Size.Fraction((1.-2.*pad)/3., Size.AxesY(ax)) + + divider.set_horizontal([Size.AxesX(ax), pad_size, xsize]) + divider.set_vertical([ysize, pad_size, ysize, pad_size, ysize]) + + ax.set_axes_locator(divider.new_locator(0, 0, ny1=-1)) + + ax_rgb = [] + for ny in [4, 2, 0]: + ax1 = axes_class(ax.get_figure(), + ax.get_position(original=True), + sharex=ax, sharey=ax, **kwargs) + locator = divider.new_locator(nx=2, ny=ny) + ax1.set_axes_locator(locator) + ax1.axis[:].toggle(ticklabels=False) + #for t in ax1.yaxis.get_ticklabels() + ax1.xaxis.get_ticklabels(): + # t.set_visible(False) + #if hasattr(ax1, "_axislines"): + # for axisline in ax1._axislines.values(): + # axisline.major_ticklabels.set_visible(False) + ax_rgb.append(ax1) + + self.RGB = ax + self.R, self.G, self.B = ax_rgb + + if add_all: + fig = ax.get_figure() + fig.add_axes(ax) + self.add_RGB_to_figure() + + self._config_axes() + + def _config_axes(self): + for ax1 in [self.RGB, self.R, self.G, self.B]: + #for sp1 in ax1.spines.values(): + # sp1.set_color("w") + ax1.axis[:].line.set_color("w") + ax1.axis[:].major_ticks.set_mec("w") + # for tick in ax1.xaxis.get_major_ticks() + ax1.yaxis.get_major_ticks(): + # tick.tick1line.set_mec("w") + # tick.tick2line.set_mec("w") + + + + def add_RGB_to_figure(self): + self.RGB.get_figure().add_axes(self.R) + self.RGB.get_figure().add_axes(self.G) + self.RGB.get_figure().add_axes(self.B) + + def imshow_rgb(self, r, g, b, **kwargs): + ny, nx = r.shape + R = np.zeros([ny, nx, 3], dtype="d") + R[:,:,0] = r + G = np.zeros_like(R) + G[:,:,1] = g + B = np.zeros_like(R) + B[:,:,2] = b + + RGB = R + G + B + + im_rgb = self.RGB.imshow(RGB, **kwargs) + im_r = self.R.imshow(R, **kwargs) + im_g = self.G.imshow(G, **kwargs) + im_b = self.B.imshow(B, **kwargs) + + return im_rgb, im_r, im_g, im_b + + +class RGBAxes(RGBAxesBase): + _defaultAxesClass = Axes + diff -Nru matplotlib-0.99.3/lib/mpl_toolkits/axes_grid1/axes_size.py matplotlib-1.0.1/lib/mpl_toolkits/axes_grid1/axes_size.py --- matplotlib-0.99.3/lib/mpl_toolkits/axes_grid1/axes_size.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_toolkits/axes_grid1/axes_size.py 2010-07-07 01:41:47.000000000 +0000 @@ -0,0 +1,208 @@ + +""" +provides a classese of simlpe units that will be used with AxesDivider +class (or others) to determine the size of each axes. The unit +classes define `get_size` method that returns a tuple of two floats, +meaning relative and absolute sizes, respectively. + +Note that this class is nothing more than a simple tuple of two +floats. Take a look at the Divider class to see how these two +values are used. + +""" + +import matplotlib.cbook as cbook + + +class _Base(object): + "Base class" + pass + +class Fixed(_Base): + "Simple fixed size with absolute part = *fixed_size* and relative part = 0" + def __init__(self, fixed_size): + self.fixed_size = fixed_size + + def get_size(self, renderer): + rel_size = 0. + abs_size = self.fixed_size + return rel_size, abs_size + + +class Scaled(_Base): + "Simple scaled(?) size with absolute part = 0 and relative part = *scalable_size*" + def __init__(self, scalable_size): + self._scalable_size = scalable_size + + def get_size(self, renderer): + rel_size = self._scalable_size + abs_size = 0. + return rel_size, abs_size + +Scalable=Scaled + + +class AxesX(_Base): + """ + Scaled size whose relative part corresponds to the data width + of the *axes* multiplied by the *aspect*. + """ + def __init__(self, axes, aspect=1.): + self._axes = axes + self._aspect = aspect + + def get_size(self, renderer): + l1, l2 = self._axes.get_xlim() + rel_size = abs(l2-l1)*self._aspect + abs_size = 0. + return rel_size, abs_size + +class AxesY(_Base): + """ + Scaled size whose relative part corresponds to the data height + of the *axes* multiplied by the *aspect*. + """ + def __init__(self, axes, aspect=1.): + self._axes = axes + self._aspect = aspect + + def get_size(self, renderer): + l1, l2 = self._axes.get_ylim() + rel_size = abs(l2-l1)*self._aspect + abs_size = 0. + return rel_size, abs_size + + +class MaxExtent(_Base): + """ + Size whose absolute part is the largest width (or height) of + the given *artist_list*. + """ + def __init__(self, artist_list, w_or_h): + self._artist_list = artist_list + + if w_or_h not in ["width", "height"]: + raise ValueError() + + self._w_or_h = w_or_h + + def add_artist(self, a): + self._artist_list.append(a) + + def get_size(self, renderer): + rel_size = 0. + w_list, h_list = [], [] + for a in self._artist_list: + bb = a.get_window_extent(renderer) + w_list.append(bb.width) + h_list.append(bb.height) + dpi = a.get_figure().get_dpi() + if self._w_or_h == "width": + abs_size = max(w_list)/dpi + elif self._w_or_h == "height": + abs_size = max(h_list)/dpi + + return rel_size, abs_size + + +class MaxWidth(_Base): + """ + Size whose absolute part is the largest width of + the given *artist_list*. + """ + def __init__(self, artist_list): + self._artist_list = artist_list + + def add_artist(self, a): + self._artist_list.append(a) + + def get_size(self, renderer): + rel_size = 0. + w_list = [] + for a in self._artist_list: + bb = a.get_window_extent(renderer) + w_list.append(bb.width) + dpi = a.get_figure().get_dpi() + abs_size = max(w_list)/dpi + + return rel_size, abs_size + + + +class MaxHeight(_Base): + """ + Size whose absolute part is the largest height of + the given *artist_list*. + """ + def __init__(self, artist_list): + self._artist_list = artist_list + + def add_artist(self, a): + self._artist_list.append(a) + + def get_size(self, renderer): + rel_size = 0. + h_list = [] + for a in self._artist_list: + bb = a.get_window_extent(renderer) + h_list.append(bb.height) + dpi = a.get_figure().get_dpi() + abs_size = max(h_list)/dpi + + return rel_size, abs_size + + +class Fraction(_Base): + """ + An instance whose size is a *fraction* of the *ref_size*. + + >>> s = Fraction(0.3, AxesX(ax)) + + """ + def __init__(self, fraction, ref_size): + self._fraction_ref = ref_size + self._fraction = fraction + + def get_size(self, renderer): + if self._fraction_ref is None: + return self._fraction, 0. + else: + r, a = self._fraction_ref.get_size(renderer) + rel_size = r*self._fraction + abs_size = a*self._fraction + return rel_size, abs_size + +class Padded(_Base): + """ + Return a instance where the absolute part of *size* is + increase by the amount of *pad*. + """ + def __init__(self, size, pad): + self._size = size + self._pad = pad + + def get_size(self, renderer): + r, a = self._size.get_size(renderer) + rel_size = r + abs_size = a + self._pad + return rel_size, abs_size + +def from_any(size, fraction_ref=None): + """ + Creates Fixed unit when the first argument is a float, or a + Fraction unit if that is a string that ends with %. The second + argument is only meaningful when Fraction unit is created. + + >>> a = Size.from_any(1.2) # => Size.Fixed(1.2) + >>> Size.from_any("50%", a) # => Size.Fraction(0.5, a) + + """ + if cbook.is_numlike(size): + return Fixed(size) + elif cbook.is_string_like(size): + if size[-1] == "%": + return Fraction(float(size[:-1])/100., fraction_ref) + + raise ValueError("Unknown format") + + diff -Nru matplotlib-0.99.3/lib/mpl_toolkits/axes_grid1/colorbar.py matplotlib-1.0.1/lib/mpl_toolkits/axes_grid1/colorbar.py --- matplotlib-0.99.3/lib/mpl_toolkits/axes_grid1/colorbar.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_toolkits/axes_grid1/colorbar.py 2010-08-03 14:22:40.000000000 +0000 @@ -0,0 +1,818 @@ +''' +Colorbar toolkit with two classes and a function: + + :class:`ColorbarBase` + the base class with full colorbar drawing functionality. + It can be used as-is to make a colorbar for a given colormap; + a mappable object (e.g., image) is not needed. + + :class:`Colorbar` + the derived class for use with images or contour plots. + + :func:`make_axes` + a function for resizing an axes and adding a second axes + suitable for a colorbar + +The :meth:`~matplotlib.figure.Figure.colorbar` method uses :func:`make_axes` +and :class:`Colorbar`; the :func:`~matplotlib.pyplot.colorbar` function +is a thin wrapper over :meth:`~matplotlib.figure.Figure.colorbar`. + +''' + +import numpy as np +import matplotlib as mpl +import matplotlib.colors as colors +import matplotlib.cm as cm +from matplotlib import docstring +import matplotlib.ticker as ticker +import matplotlib.cbook as cbook +import matplotlib.collections as collections +import matplotlib.contour as contour +from matplotlib.path import Path +from matplotlib.patches import PathPatch +from matplotlib.transforms import Bbox + + +make_axes_kw_doc = ''' + + ============= ==================================================== + Property Description + ============= ==================================================== + *orientation* vertical or horizontal + *fraction* 0.15; fraction of original axes to use for colorbar + *pad* 0.05 if vertical, 0.15 if horizontal; fraction + of original axes between colorbar and new image axes + *shrink* 1.0; fraction by which to shrink the colorbar + *aspect* 20; ratio of long to short dimensions + ============= ==================================================== + +''' + +colormap_kw_doc = ''' + + =========== ==================================================== + Property Description + =========== ==================================================== + *extend* [ 'neither' | 'both' | 'min' | 'max' ] + If not 'neither', make pointed end(s) for out-of- + range values. These are set for a given colormap + using the colormap set_under and set_over methods. + *spacing* [ 'uniform' | 'proportional' ] + Uniform spacing gives each discrete color the same + space; proportional makes the space proportional to + the data interval. + *ticks* [ None | list of ticks | Locator object ] + If None, ticks are determined automatically from the + input. + *format* [ None | format string | Formatter object ] + If None, the + :class:`~matplotlib.ticker.ScalarFormatter` is used. + If a format string is given, e.g. '%.3f', that is + used. An alternative + :class:`~matplotlib.ticker.Formatter` object may be + given instead. + *drawedges* [ False | True ] If true, draw lines at color + boundaries. + =========== ==================================================== + + The following will probably be useful only in the context of + indexed colors (that is, when the mappable has norm=NoNorm()), + or other unusual circumstances. + + ============ =================================================== + Property Description + ============ =================================================== + *boundaries* None or a sequence + *values* None or a sequence which must be of length 1 less + than the sequence of *boundaries*. For each region + delimited by adjacent entries in *boundaries*, the + color mapped to the corresponding value in values + will be used. + ============ =================================================== + +''' + +colorbar_doc = ''' + +Add a colorbar to a plot. + +Function signatures for the :mod:`~matplotlib.pyplot` interface; all +but the first are also method signatures for the +:meth:`~matplotlib.figure.Figure.colorbar` method:: + + colorbar(**kwargs) + colorbar(mappable, **kwargs) + colorbar(mappable, cax=cax, **kwargs) + colorbar(mappable, ax=ax, **kwargs) + +arguments: + + *mappable* + the :class:`~matplotlib.image.Image`, + :class:`~matplotlib.contour.ContourSet`, etc. to + which the colorbar applies; this argument is mandatory for the + :meth:`~matplotlib.figure.Figure.colorbar` method but optional for the + :func:`~matplotlib.pyplot.colorbar` function, which sets the + default to the current image. + +keyword arguments: + + *cax* + None | axes object into which the colorbar will be drawn + *ax* + None | parent axes object from which space for a new + colorbar axes will be stolen + + +Additional keyword arguments are of two kinds: + + axes properties: +%s + colorbar properties: +%s + +If *mappable* is a :class:`~matplotlib.contours.ContourSet`, its *extend* +kwarg is included automatically. + +Note that the *shrink* kwarg provides a simple way to keep a vertical +colorbar, for example, from being taller than the axes of the mappable +to which the colorbar is attached; but it is a manual method requiring +some trial and error. If the colorbar is too tall (or a horizontal +colorbar is too wide) use a smaller value of *shrink*. + +For more precise control, you can manually specify the positions of +the axes objects in which the mappable and the colorbar are drawn. In +this case, do not use any of the axes properties kwargs. + +returns: + :class:`~matplotlib.colorbar.Colorbar` instance; see also its base class, + :class:`~matplotlib.colorbar.ColorbarBase`. Call the + :meth:`~matplotlib.colorbar.ColorbarBase.set_label` method + to label the colorbar. + + +The transData of the *cax* is adjusted so that the limits in the +longest axis actually corresponds to the limits in colorbar range. On +the other hand, the shortest axis has a data limits of [1,2], whose +unconventional value is to prevent underflow when log scale is used. +''' % (make_axes_kw_doc, colormap_kw_doc) + +docstring.interpd.update(colorbar_doc=colorbar_doc) + + +class CbarAxesLocator(object): + """ + CbarAxesLocator is a axes_locator for colobar axes. It adjust the + position of the axes to make a room for extended ends, i.e., the + extended ends are located outside the axes area. + """ + + def __init__(self, locator=None, extend="neither", orientation="vertical"): + """ + *locator* : the bbox returned from the locator is used as a + initial axes location. If None, axes.bbox is used. + + *extend* : same as in ColorbarBase + *orientation* : same as in ColorbarBase + + """ + self._locator = locator + self.extesion_fraction = 0.05 + self.extend = extend + self.orientation = orientation + + def get_original_position(self, axes, renderer): + """ + get the original position of the axes. + """ + if self._locator is None: + bbox = axes.get_position(original=True) + else: + bbox = self._locator(axes, renderer) + return bbox + + def get_end_vertices(self): + """ + return a tuple of two vertices for the colorbar extended ends. + The first vertives is for min. end, and the second is for + max. end. + """ + # Note that concatenating two vertices needs to make a + # vertices for the frame. + extesion_fraction = self.extesion_fraction + + corx = extesion_fraction*2. + cory = 1./(1. - corx) + x1, y1, w, h = 0, 0, 1, 1 + x2, y2 = x1 + w, y1 + h + dw, dh = w*extesion_fraction, h*extesion_fraction*cory + + if self.extend in ["min", "both"]: + bottom = [(x1, y1), + (x1+w/2., y1-dh), + (x2, y1)] + else: + bottom = [(x1, y1), + (x2, y1)] + + if self.extend in ["max", "both"]: + top = [(x2, y2), + (x1+w/2., y2+dh), + (x1, y2)] + else: + top = [(x2, y2), + (x1, y2)] + + if self.orientation == "horizontal": + bottom = [(y,x) for (x,y) in bottom] + top = [(y,x) for (x,y) in top] + + return bottom, top + + + def get_path_patch(self): + """ + get the path for axes patch + """ + end1, end2 = self.get_end_vertices() + + verts = [] + end1 + end2 + end1[:1] + + return Path(verts) + + + def get_path_ends(self): + """ + get the paths for extended ends + """ + + end1, end2 = self.get_end_vertices() + + return Path(end1), Path(end2) + + + def __call__(self, axes, renderer): + """ + Return the adjusted position of the axes + """ + bbox0 = self.get_original_position(axes, renderer) + bbox = bbox0 + + x1, y1, w, h = bbox.bounds + extesion_fraction = self.extesion_fraction + dw, dh = w*extesion_fraction, h*extesion_fraction + + if self.extend in ["min", "both"]: + if self.orientation == "horizontal": + x1 = x1 + dw + else: + y1 = y1+dh + + if self.extend in ["max", "both"]: + if self.orientation == "horizontal": + w = w-2*dw + else: + h = h-2*dh + + return Bbox.from_bounds(x1, y1, w, h) + + + +class ColorbarBase(cm.ScalarMappable): + ''' + Draw a colorbar in an existing axes. + + This is a base class for the :class:`Colorbar` class, which is the + basis for the :func:`~matplotlib.pyplot.colorbar` method and pylab + function. + + It is also useful by itself for showing a colormap. If the *cmap* + kwarg is given but *boundaries* and *values* are left as None, + then the colormap will be displayed on a 0-1 scale. To show the + under- and over-value colors, specify the *norm* as:: + + colors.Normalize(clip=False) + + To show the colors versus index instead of on the 0-1 scale, + use:: + + norm=colors.NoNorm. + + Useful attributes: + + :attr:`ax` + the Axes instance in which the colorbar is drawn + + :attr:`lines` + a LineCollection if lines were drawn, otherwise None + + :attr:`dividers` + a LineCollection if *drawedges* is True, otherwise None + + Useful public methods are :meth:`set_label` and :meth:`add_lines`. + + ''' + + def __init__(self, ax, cmap=None, + norm=None, + alpha=1.0, + values=None, + boundaries=None, + orientation='vertical', + extend='neither', + spacing='uniform', # uniform or proportional + ticks=None, + format=None, + drawedges=False, + filled=True, + ): + self.ax = ax + + if cmap is None: cmap = cm.get_cmap() + if norm is None: norm = colors.Normalize() + self.alpha = alpha + cm.ScalarMappable.__init__(self, cmap=cmap, norm=norm) + self.values = values + self.boundaries = boundaries + self.extend = extend + self.spacing = spacing + self.orientation = orientation + self.drawedges = drawedges + self.filled = filled + + # artists + self.solids = None + self.lines = None + self.dividers = None + self.extension_patch1 = None + self.extension_patch2 = None + + if orientation == "vertical": + self.cbar_axis = self.ax.yaxis + else: + self.cbar_axis = self.ax.xaxis + + + if format is None: + if isinstance(self.norm, colors.LogNorm): + # change both axis for proper aspect + self.ax.xaxis.set_scale("log") + self.ax.yaxis.set_scale("log") + self.ax._update_transScale() + self.cbar_axis.set_minor_locator(ticker.NullLocator()) + formatter = ticker.LogFormatter() + else: + formatter = None + elif cbook.is_string_like(format): + formatter = ticker.FormatStrFormatter(format) + else: + formatter = format # Assume it is a Formatter + + if formatter is None: + formatter = self.cbar_axis.get_major_formatter() + else: + self.cbar_axis.set_major_formatter(formatter) + + if cbook.iterable(ticks): + self.cbar_axis.set_ticks(ticks) + elif ticks is not None: + self.cbar_axis.set_major_locator(ticks) + else: + self._select_locator(formatter) + + + self._config_axes() + + self.update_artists() + + self.set_label_text('') + + + def _get_colorbar_limits(self): + """ + initial limits for colorbar range. The returne min, max values + will be used to create colorbar solid(?) and etc. + """ + if self.boundaries is not None: + C = self.boundaries + if self.extend in ["min", "both"]: + C = C[1:] + + if self.extend in ["max", "both"]: + C = C[:-1] + return min(C), max(C) + else: + return self.get_clim() + + + def _config_axes(self): + ''' + Adjust the properties of the axes to be adquate for colorbar display. + ''' + ax = self.ax + + axes_locator = CbarAxesLocator(ax.get_axes_locator(), + extend=self.extend, + orientation=self.orientation) + ax.set_axes_locator(axes_locator) + + # overide the get_data_ratio for the aspect works. + def _f(): + return 1. + ax.get_data_ratio = _f + ax.get_data_ratio_log = _f + + ax.set_frame_on(True) + ax.set_navigate(False) + + self.ax.set_autoscalex_on(False) + self.ax.set_autoscaley_on(False) + + if self.orientation == 'horizontal': + ax.xaxis.set_label_position('bottom') + ax.set_yticks([]) + else: + ax.set_xticks([]) + ax.yaxis.set_label_position('right') + ax.yaxis.set_ticks_position('right') + + + + def update_artists(self): + """ + Update the colorbar associated artists, *filled* and + *ends*. Note that *lines* are not updated. This needs to be + called whenever clim of associated image changes. + """ + self._process_values() + self._add_ends() + + X, Y = self._mesh() + if self.filled: + C = self._values[:,np.newaxis] + self._add_solids(X, Y, C) + + ax = self.ax + vmin, vmax = self._get_colorbar_limits() + if self.orientation == 'horizontal': + ax.set_ylim(1, 2) + ax.set_xlim(vmin, vmax) + else: + ax.set_xlim(1, 2) + ax.set_ylim(vmin, vmax) + + + def _add_ends(self): + """ + Create patches from extended ends and add them to the axes. + """ + + del self.extension_patch1 + del self.extension_patch2 + + path1, path2 = self.ax.get_axes_locator().get_path_ends() + fc=mpl.rcParams['axes.facecolor'] + ec=mpl.rcParams['axes.edgecolor'] + linewidths=0.5*mpl.rcParams['axes.linewidth'] + self.extension_patch1 = PathPatch(path1, + fc=fc, ec=ec, lw=linewidths, + zorder=2., + transform=self.ax.transAxes, + clip_on=False) + self.extension_patch2 = PathPatch(path2, + fc=fc, ec=ec, lw=linewidths, + zorder=2., + transform=self.ax.transAxes, + clip_on=False) + self.ax.add_artist(self.extension_patch1) + self.ax.add_artist(self.extension_patch2) + + + + def _set_label_text(self): + """ + set label. + """ + self.cbar_axis.set_label_text(self._label, **self._labelkw) + + def set_label_text(self, label, **kw): + ''' + Label the long axis of the colorbar + ''' + self._label = label + self._labelkw = kw + self._set_label_text() + + + def _edges(self, X, Y): + ''' + Return the separator line segments; helper for _add_solids. + ''' + N = X.shape[0] + # Using the non-array form of these line segments is much + # simpler than making them into arrays. + if self.orientation == 'vertical': + return [zip(X[i], Y[i]) for i in range(1, N-1)] + else: + return [zip(Y[i], X[i]) for i in range(1, N-1)] + + def _add_solids(self, X, Y, C): + ''' + Draw the colors using :meth:`~matplotlib.axes.Axes.pcolor`; + optionally add separators. + ''' + ## Change to pcolorfast after fixing bugs in some backends... + + if self.extend in ["min", "both"]: + cc = self.to_rgba([C[0][0]]) + self.extension_patch1.set_fc(cc[0]) + X, Y, C = X[1:], Y[1:], C[1:] + + if self.extend in ["max", "both"]: + cc = self.to_rgba([C[-1][0]]) + self.extension_patch2.set_fc(cc[0]) + X, Y, C = X[:-1], Y[:-1], C[:-1] + + if self.orientation == 'vertical': + args = (X, Y, C) + else: + args = (np.transpose(Y), np.transpose(X), np.transpose(C)) + kw = {'cmap':self.cmap, 'norm':self.norm, + 'shading':'flat', 'alpha':self.alpha, + } + + del self.solids + del self.dividers + + col = self.ax.pcolor(*args, **kw) + col.set_antialiased(False) # This is to suppress artifacts. We + # may use pcolormesh instead. + self.solids = col + if self.drawedges: + self.dividers = collections.LineCollection(self._edges(X,Y), + colors=(mpl.rcParams['axes.edgecolor'],), + linewidths=(0.5*mpl.rcParams['axes.linewidth'],), + ) + self.ax.add_collection(self.dividers) + else: + self.dividers = None + + def add_lines(self, levels, colors, linewidths): + ''' + Draw lines on the colorbar. It deletes preexting lines. + ''' + del self.lines + + N = len(levels) + x = np.array([1.0, 2.0]) + X, Y = np.meshgrid(x,levels) + if self.orientation == 'vertical': + xy = [zip(X[i], Y[i]) for i in range(N)] + else: + xy = [zip(Y[i], X[i]) for i in range(N)] + col = collections.LineCollection(xy, linewidths=linewidths, + ) + self.lines = col + col.set_color(colors) + self.ax.add_collection(col) + + + def _select_locator(self, formatter): + ''' + select a suitable locator + ''' + if self.boundaries is None: + if isinstance(self.norm, colors.NoNorm): + nv = len(self._values) + base = 1 + int(nv/10) + locator = ticker.IndexLocator(base=base, offset=0) + elif isinstance(self.norm, colors.BoundaryNorm): + b = self.norm.boundaries + locator = ticker.FixedLocator(b, nbins=10) + elif isinstance(self.norm, colors.LogNorm): + locator = ticker.LogLocator() + else: + locator = ticker.MaxNLocator(nbins=5) + else: + b = self._boundaries[self._inside] + locator = ticker.FixedLocator(b) #, nbins=10) + + self.cbar_axis.set_major_locator(locator) + + + def _process_values(self, b=None): + ''' + Set the :attr:`_boundaries` and :attr:`_values` attributes + based on the input boundaries and values. Input boundaries + can be *self.boundaries* or the argument *b*. + ''' + if b is None: + b = self.boundaries + if b is not None: + self._boundaries = np.asarray(b, dtype=float) + if self.values is None: + self._values = 0.5*(self._boundaries[:-1] + + self._boundaries[1:]) + if isinstance(self.norm, colors.NoNorm): + self._values = (self._values + 0.00001).astype(np.int16) + return + self._values = np.array(self.values) + return + if self.values is not None: + self._values = np.array(self.values) + if self.boundaries is None: + b = np.zeros(len(self.values)+1, 'd') + b[1:-1] = 0.5*(self._values[:-1] - self._values[1:]) + b[0] = 2.0*b[1] - b[2] + b[-1] = 2.0*b[-2] - b[-3] + self._boundaries = b + return + self._boundaries = np.array(self.boundaries) + return + # Neither boundaries nor values are specified; + # make reasonable ones based on cmap and norm. + if isinstance(self.norm, colors.NoNorm): + b = self._uniform_y(self.cmap.N+1) * self.cmap.N - 0.5 + v = np.zeros((len(b)-1,), dtype=np.int16) + v = np.arange(self.cmap.N, dtype=np.int16) + self._boundaries = b + self._values = v + return + elif isinstance(self.norm, colors.BoundaryNorm): + b = np.array(self.norm.boundaries) + v = np.zeros((len(b)-1,), dtype=float) + bi = self.norm.boundaries + v = 0.5*(bi[:-1] + bi[1:]) + self._boundaries = b + self._values = v + return + else: + b = self._uniform_y(self.cmap.N+1) + + self._process_values(b) + + + def _uniform_y(self, N): + ''' + Return colorbar data coordinates for *N* uniformly + spaced boundaries. + ''' + vmin, vmax = self._get_colorbar_limits() + if isinstance(self.norm, colors.LogNorm): + y = np.logspace(np.log10(vmin), np.log10(vmax), N) + else: + y = np.linspace(vmin, vmax, N) + return y + + def _mesh(self): + ''' + Return X,Y, the coordinate arrays for the colorbar pcolormesh. + These are suitable for a vertical colorbar; swapping and + transposition for a horizontal colorbar are done outside + this function. + ''' + x = np.array([1.0, 2.0]) + if self.spacing == 'uniform': + y = self._uniform_y(len(self._boundaries)) + else: + y = self._boundaries + self._y = y + + X, Y = np.meshgrid(x,y) + return X, Y + + + def set_alpha(self, alpha): + """ + set alpha value. + """ + self.alpha = alpha + + +class Colorbar(ColorbarBase): + def __init__(self, ax, mappable, **kw): + mappable.autoscale_None() # Ensure mappable.norm.vmin, vmax + # are set when colorbar is called, + # even if mappable.draw has not yet + # been called. This will not change + # vmin, vmax if they are already set. + self.mappable = mappable + kw['cmap'] = mappable.cmap + kw['norm'] = mappable.norm + kw['alpha'] = mappable.get_alpha() + if isinstance(mappable, contour.ContourSet): + CS = mappable + kw['boundaries'] = CS._levels + kw['values'] = CS.cvalues + kw['extend'] = CS.extend + #kw['ticks'] = CS._levels + kw.setdefault('ticks', ticker.FixedLocator(CS.levels, nbins=10)) + kw['filled'] = CS.filled + ColorbarBase.__init__(self, ax, **kw) + if not CS.filled: + self.add_lines(CS) + else: + ColorbarBase.__init__(self, ax, **kw) + + + def add_lines(self, CS): + ''' + Add the lines from a non-filled + :class:`~matplotlib.contour.ContourSet` to the colorbar. + ''' + if not isinstance(CS, contour.ContourSet) or CS.filled: + raise ValueError('add_lines is only for a ContourSet of lines') + tcolors = [c[0] for c in CS.tcolors] + tlinewidths = [t[0] for t in CS.tlinewidths] + # The following was an attempt to get the colorbar lines + # to follow subsequent changes in the contour lines, + # but more work is needed: specifically, a careful + # look at event sequences, and at how + # to make one object track another automatically. + #tcolors = [col.get_colors()[0] for col in CS.collections] + #tlinewidths = [col.get_linewidth()[0] for lw in CS.collections] + #print 'tlinewidths:', tlinewidths + ColorbarBase.add_lines(self, CS.levels, tcolors, tlinewidths) + + def update_bruteforce(self, mappable): + """ + Update the colorbar artists to reflect the change of the + assocaited mappable. + """ + self.update_artists() + + if isinstance(mappable, contour.ContourSet): + if not mappable.filled: + self.add_lines(mappable) + +@docstring.Substitution(make_axes_kw_doc) +def make_axes(parent, **kw): + ''' + Resize and reposition a parent axes, and return a child + axes suitable for a colorbar:: + + cax, kw = make_axes(parent, **kw) + + Keyword arguments may include the following (with defaults): + + *orientation* + 'vertical' or 'horizontal' + + %s + + All but the first of these are stripped from the input kw set. + + Returns (cax, kw), the child axes and the reduced kw dictionary. + ''' + orientation = kw.setdefault('orientation', 'vertical') + fraction = kw.pop('fraction', 0.15) + shrink = kw.pop('shrink', 1.0) + aspect = kw.pop('aspect', 20) + #pb = transforms.PBox(parent.get_position()) + pb = parent.get_position(original=True).frozen() + if orientation == 'vertical': + pad = kw.pop('pad', 0.05) + x1 = 1.0-fraction + pb1, pbx, pbcb = pb.splitx(x1-pad, x1) + pbcb = pbcb.shrunk(1.0, shrink).anchored('C', pbcb) + anchor = (0.0, 0.5) + panchor = (1.0, 0.5) + else: + pad = kw.pop('pad', 0.15) + pbcb, pbx, pb1 = pb.splity(fraction, fraction+pad) + pbcb = pbcb.shrunk(shrink, 1.0).anchored('C', pbcb) + aspect = 1.0/aspect + anchor = (0.5, 1.0) + panchor = (0.5, 0.0) + parent.set_position(pb1) + parent.set_anchor(panchor) + fig = parent.get_figure() + cax = fig.add_axes(pbcb) + cax.set_aspect(aspect, anchor=anchor, adjustable='box') + return cax, kw + + +def colorbar(mappable, cax=None, ax=None, **kw): + """ + Create a colorbar for a ScalarMappable instance. + + Documentation for the pylab thin wrapper: + %(colorbar_doc)s + """ + import matplotlib.pyplot as plt + if ax is None: + ax = plt.gca() + if cax is None: + cax, kw = make_axes(ax, **kw) + cax.hold(True) + cb = Colorbar(cax, mappable, **kw) + + def on_changed(m): + cb.set_cmap(m.get_cmap()) + cb.set_clim(m.get_clim()) + cb.update_bruteforce(m) + + cbid = mappable.callbacksSM.connect('changed', on_changed) + mappable.set_colorbar(cb, cax) + ax.figure.sca(ax) + return cb diff -Nru matplotlib-0.99.3/lib/mpl_toolkits/axes_grid1/__init__.py matplotlib-1.0.1/lib/mpl_toolkits/axes_grid1/__init__.py --- matplotlib-0.99.3/lib/mpl_toolkits/axes_grid1/__init__.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_toolkits/axes_grid1/__init__.py 2010-07-07 01:41:47.000000000 +0000 @@ -0,0 +1,7 @@ +import axes_size as Size +from axes_divider import Divider, SubplotDivider, LocatableAxes, \ + make_axes_locatable +from axes_grid import Grid, ImageGrid, AxesGrid +#from axes_divider import make_axes_locatable + +from parasite_axes import host_subplot, host_axes diff -Nru matplotlib-0.99.3/lib/mpl_toolkits/axes_grid1/inset_locator.py matplotlib-1.0.1/lib/mpl_toolkits/axes_grid1/inset_locator.py --- matplotlib-0.99.3/lib/mpl_toolkits/axes_grid1/inset_locator.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_toolkits/axes_grid1/inset_locator.py 2010-07-07 01:41:47.000000000 +0000 @@ -0,0 +1,337 @@ +from matplotlib.offsetbox import AnchoredOffsetbox +#from matplotlib.transforms import IdentityTransform + +import matplotlib.transforms as mtrans +#from matplotlib.axes import Axes +from mpl_axes import Axes + +from matplotlib.transforms import Bbox, TransformedBbox, IdentityTransform + +from matplotlib.patches import Patch +from matplotlib.path import Path + +from matplotlib.patches import Rectangle + + +class InsetPosition(object): + def __init__(self, parent, lbwh): + self.parent = parent + self.lbwh = lbwh # position of the inset axes in the normalized coordinate of the parent axes + + def __call__(self, ax, renderer): + bbox_parent = self.parent.get_position(original=False) + trans = mtrans.BboxTransformTo(bbox_parent) + bbox_inset = mtrans.Bbox.from_bounds(*self.lbwh) + bb = mtrans.TransformedBbox(bbox_inset, trans) + return bb + + +class AnchoredLocatorBase(AnchoredOffsetbox): + def __init__(self, bbox_to_anchor, offsetbox, loc, + borderpad=0.5, bbox_transform=None): + + super(AnchoredLocatorBase, self).__init__(loc, + pad=0., child=None, + borderpad=borderpad, + bbox_to_anchor=bbox_to_anchor, + bbox_transform=bbox_transform) + + + def draw(self, renderer): + raise RuntimeError("No draw method should be called") + + + def __call__(self, ax, renderer): + + fontsize = renderer.points_to_pixels(self.prop.get_size_in_points()) + self._update_offset_func(renderer, fontsize) + + width, height, xdescent, ydescent = self.get_extent(renderer) + + px, py = self.get_offset(width, height, 0, 0, renderer) + bbox_canvas = mtrans.Bbox.from_bounds(px, py, width, height) + tr = ax.figure.transFigure.inverted() + bb = mtrans.TransformedBbox(bbox_canvas, tr) + + return bb + + + + +import axes_size as Size + +class AnchoredSizeLocator(AnchoredLocatorBase): + def __init__(self, bbox_to_anchor, x_size, y_size, loc, + borderpad=0.5, bbox_transform=None): + + self.axes = None + self.x_size = Size.from_any(x_size) + self.y_size = Size.from_any(y_size) + + super(AnchoredSizeLocator, self).__init__(bbox_to_anchor, None, loc, + borderpad=borderpad, + bbox_transform=bbox_transform) + + def get_extent(self, renderer): + + x, y, w, h = self.get_bbox_to_anchor().bounds + + dpi = renderer.points_to_pixels(72.) + + r, a = self.x_size.get_size(renderer) + width = w*r + a*dpi + + r, a = self.y_size.get_size(renderer) + height = h*r + a*dpi + xd, yd = 0, 0 + + fontsize = renderer.points_to_pixels(self.prop.get_size_in_points()) + pad = self.pad * fontsize + + return width+2*pad, height+2*pad, xd+pad, yd+pad + + + def __call__(self, ax, renderer): + + self.axes = ax + return super(AnchoredSizeLocator, self).__call__(ax, renderer) + + +class AnchoredZoomLocator(AnchoredLocatorBase): + def __init__(self, parent_axes, zoom, loc, + borderpad=0.5, + bbox_to_anchor=None, + bbox_transform=None): + + self.parent_axes = parent_axes + self.zoom = zoom + + if bbox_to_anchor is None: + bbox_to_anchor = parent_axes.bbox + + super(AnchoredZoomLocator, self).__init__(bbox_to_anchor, None, loc, + borderpad=borderpad, + bbox_transform=bbox_transform) + + self.axes = None + + + def get_extent(self, renderer): + + bb = mtrans.TransformedBbox(self.axes.viewLim, self.parent_axes.transData) + + x, y, w, h = bb.bounds + + xd, yd = 0, 0 + + fontsize = renderer.points_to_pixels(self.prop.get_size_in_points()) + pad = self.pad * fontsize + + return w*self.zoom+2*pad, h*self.zoom+2*pad, xd+pad, yd+pad + + + def __call__(self, ax, renderer): + + self.axes = ax + return super(AnchoredZoomLocator, self).__call__(ax, renderer) + + + + + + +class BboxPatch(Patch): + def __init__(self, bbox, **kwargs): + if "transform" in kwargs: + raise ValueError("trnasform should nt be set") + + kwargs["transform"] = IdentityTransform() + Patch.__init__(self, **kwargs) + self.bbox = bbox + + def get_path(self): + x0, y0, x1, y1 = self.bbox.extents + + verts = [(x0, y0), + (x1, y0), + (x1, y1), + (x0, y1), + (x0, y0), + (0,0)] + + codes = [Path.MOVETO, + Path.LINETO, + Path.LINETO, + Path.LINETO, + Path.LINETO, + Path.CLOSEPOLY] + + return Path(verts, codes) + + + + +class BboxConnector(Patch): + + @staticmethod + def get_bbox_edge_pos(bbox, loc): + x0, y0, x1, y1 = bbox.extents + if loc==1: + return x1, y1 + elif loc==2: + return x0, y1 + elif loc==3: + return x0, y0 + elif loc==4: + return x1, y0 + + @staticmethod + def connect_bbox(bbox1, bbox2, loc1, loc2=None): + if isinstance(bbox1, Rectangle): + transform = bbox1.get_transfrom() + bbox1 = Bbox.from_bounds(0, 0, 1, 1) + bbox1 = TransformedBbox(bbox1, transform) + + if isinstance(bbox2, Rectangle): + transform = bbox2.get_transform() + bbox2 = Bbox.from_bounds(0, 0, 1, 1) + bbox2 = TransformedBbox(bbox2, transform) + + if loc2 is None: + loc2 = loc1 + + x1, y1 = BboxConnector.get_bbox_edge_pos(bbox1, loc1) + x2, y2 = BboxConnector.get_bbox_edge_pos(bbox2, loc2) + + verts = [[x1, y1], [x2,y2]] + #Path() + + codes = [Path.MOVETO, Path.LINETO] + + return Path(verts, codes) + + + def __init__(self, bbox1, bbox2, loc1, loc2=None, **kwargs): + """ + *path* is a :class:`matplotlib.path.Path` object. + + Valid kwargs are: + %(Patch)s + + .. seealso:: + + :class:`Patch` + For additional kwargs + + """ + if "transform" in kwargs: + raise ValueError("trnasform should nt be set") + + kwargs["transform"] = IdentityTransform() + Patch.__init__(self, **kwargs) + self.bbox1 = bbox1 + self.bbox2 = bbox2 + self.loc1 = loc1 + self.loc2 = loc2 + + + def get_path(self): + return self.connect_bbox(self.bbox1, self.bbox2, + self.loc1, self.loc2) + + +class BboxConnectorPatch(BboxConnector): + + def __init__(self, bbox1, bbox2, loc1a, loc2a, loc1b, loc2b, **kwargs): + if "transform" in kwargs: + raise ValueError("transform should not be set") + BboxConnector.__init__(self, bbox1, bbox2, loc1a, loc2a, **kwargs) + self.loc1b = loc1b + self.loc2b = loc2b + + def get_path(self): + path1 = self.connect_bbox(self.bbox1, self.bbox2, self.loc1, self.loc2) + path2 = self.connect_bbox(self.bbox2, self.bbox1, self.loc2b, self.loc1b) + path_merged = list(path1.vertices) + list (path2.vertices) + [path1.vertices[0]] + return Path(path_merged) + + + +def _add_inset_axes(parent_axes, inset_axes): + parent_axes.figure.add_axes(inset_axes) + inset_axes.set_navigate(False) + + +def inset_axes(parent_axes, width, height, loc=1, + bbox_to_anchor=None, bbox_transform=None, + axes_class=None, + axes_kwargs=None, + **kwargs): + + if axes_class is None: + axes_class = Axes + + if axes_kwargs is None: + inset_axes = axes_class(parent_axes.figure, parent_axes.get_position()) + else: + inset_axes = axes_class(parent_axes.figure, parent_axes.get_position(), + **axes_kwargs) + + if bbox_to_anchor is None: + bbox_to_anchor = parent_axes.bbox + + axes_locator = AnchoredSizeLocator(bbox_to_anchor, + width, height, + loc=loc, + bbox_transform=bbox_transform, + **kwargs) + + inset_axes.set_axes_locator(axes_locator) + + _add_inset_axes(parent_axes, inset_axes) + + return inset_axes + + +def zoomed_inset_axes(parent_axes, zoom, loc=1, + bbox_to_anchor=None, bbox_transform=None, + axes_class=None, + axes_kwargs=None, + **kwargs): + + if axes_class is None: + axes_class = Axes + + if axes_kwargs is None: + inset_axes = axes_class(parent_axes.figure, parent_axes.get_position()) + else: + inset_axes = axes_class(parent_axes.figure, parent_axes.get_position(), + **axes_kwargs) + + axes_locator = AnchoredZoomLocator(parent_axes, zoom=zoom, loc=loc, + bbox_to_anchor=None, bbox_transform=None, + **kwargs) + inset_axes.set_axes_locator(axes_locator) + + _add_inset_axes(parent_axes, inset_axes) + + return inset_axes + + +def mark_inset(parent_axes, inset_axes, loc1, loc2, **kwargs): + rect = TransformedBbox(inset_axes.viewLim, parent_axes.transData) + + pp = BboxPatch(rect, **kwargs) + parent_axes.add_patch(pp) + + p1 = BboxConnector(inset_axes.bbox, rect, loc1=loc1, **kwargs) + inset_axes.add_patch(p1) + p1.set_clip_on(False) + p2 = BboxConnector(inset_axes.bbox, rect, loc1=loc2, **kwargs) + inset_axes.add_patch(p2) + p2.set_clip_on(False) + + return pp, p1, p2 + + + diff -Nru matplotlib-0.99.3/lib/mpl_toolkits/axes_grid1/mpl_axes.py matplotlib-1.0.1/lib/mpl_toolkits/axes_grid1/mpl_axes.py --- matplotlib-0.99.3/lib/mpl_toolkits/axes_grid1/mpl_axes.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_toolkits/axes_grid1/mpl_axes.py 2010-07-07 01:41:47.000000000 +0000 @@ -0,0 +1,155 @@ +import warnings + +import matplotlib.axes as maxes +from matplotlib.artist import Artist +from matplotlib.axis import XAxis, YAxis + +class SimpleChainedObjects(object): + def __init__(self, objects): + self._objects = objects + + def __getattr__(self, k): + _a = SimpleChainedObjects([getattr(a, k) for a in self._objects]) + return _a + + def __call__(self, *kl, **kwargs): + for m in self._objects: + m(*kl, **kwargs) + + +class Axes(maxes.Axes): + def toggle_axisline(self, b): + warnings.warn("toggle_axisline is not necessary and deprecated in axes_grid1") + + class AxisDict(dict): + def __init__(self, axes): + self.axes = axes + super(Axes.AxisDict, self).__init__() + + def __getitem__(self, k): + if isinstance(k, tuple): + r = SimpleChainedObjects([dict.__getitem__(self, k1) for k1 in k]) + return r + elif isinstance(k, slice): + if k.start == None and k.stop == None and k.step == None: + r = SimpleChainedObjects(self.values()) + return r + else: + raise ValueError("Unsupported slice") + else: + return dict.__getitem__(self, k) + + def __call__(self, *v, **kwargs): + return maxes.Axes.axis(self.axes, *v, **kwargs) + + + def __init__(self, *kl, **kw): + super(Axes, self).__init__(*kl, **kw) + + + + def _init_axis_artists(self, axes=None): + if axes is None: + axes = self + + self._axislines = self.AxisDict(self) + + self._axislines["bottom"] = SimpleAxisArtist(self.xaxis, 1, self.spines["bottom"]) + self._axislines["top"] = SimpleAxisArtist(self.xaxis, 2, self.spines["top"]) + self._axislines["left"] = SimpleAxisArtist(self.yaxis, 1, self.spines["left"]) + self._axislines["right"] = SimpleAxisArtist(self.yaxis, 2, self.spines["right"]) + + + def _get_axislines(self): + return self._axislines + + axis = property(_get_axislines) + + def cla(self): + + super(Axes, self).cla() + self._init_axis_artists() + + +class SimpleAxisArtist(Artist): + def __init__(self, axis, axisnum, spine): + self._axis = axis + self._axisnum = axisnum + self.line = spine + + if isinstance(axis, XAxis): + self._axis_direction = ["bottom", "top"][axisnum-1] + elif isinstance(axis, YAxis): + self._axis_direction = ["left", "right"][axisnum-1] + else: + raise ValueError("axis must be instance of XAxis or YAxis : %s is provided" % (axis,)) + Artist.__init__(self) + + + def _get_major_ticks(self): + tickline = "tick%dline" % self._axisnum + return SimpleChainedObjects([getattr(tick, tickline) for tick \ + in self._axis.get_major_ticks()]) + + def _get_major_ticklabels(self): + label = "label%d" % self._axisnum + return SimpleChainedObjects([getattr(tick, label) for tick \ + in self._axis.get_major_ticks()]) + + def _get_label(self): + return self._axis.label + + major_ticks = property(_get_major_ticks) + major_ticklabels = property(_get_major_ticklabels) + label = property(_get_label) + + def set_visible(self, b): + self.toggle(all=b) + self.line.set_visible(b) + self._axis.set_visible(True) + Artist.set_visible(self, b) + + def set_label(self, txt): + self._axis.set_label_text(txt) + + def toggle(self, all=None, ticks=None, ticklabels=None, label=None): + + if all: + _ticks, _ticklabels, _label = True, True, True + elif all is not None: + _ticks, _ticklabels, _label = False, False, False + else: + _ticks, _ticklabels, _label = None, None, None + + if ticks is not None: + _ticks = ticks + if ticklabels is not None: + _ticklabels = ticklabels + if label is not None: + _label = label + + tickOn = "tick%dOn" % self._axisnum + labelOn = "label%dOn" % self._axisnum + + if _ticks is not None: + for tick in self._axis.get_major_ticks(): + setattr(tick, tickOn, _ticks) + if _ticklabels is not None: + for tick in self._axis.get_major_ticks(): + setattr(tick, labelOn, _ticklabels) + + if _label is not None: + pos = self._axis.get_label_position() + if (pos == self._axis_direction) and not _label: + self._axis.label.set_visible(False) + elif _label: + self._axis.label.set_visible(True) + self._axis.set_label_position(self._axis_direction) + + +if __name__ == '__main__': + fig = figure() + ax = Axes(fig, [0.1, 0.1, 0.8, 0.8]) + fig.add_axes(ax) + ax.cla() + diff -Nru matplotlib-0.99.3/lib/mpl_toolkits/axes_grid1/parasite_axes.py matplotlib-1.0.1/lib/mpl_toolkits/axes_grid1/parasite_axes.py --- matplotlib-0.99.3/lib/mpl_toolkits/axes_grid1/parasite_axes.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_toolkits/axes_grid1/parasite_axes.py 2010-07-07 01:41:47.000000000 +0000 @@ -0,0 +1,534 @@ +import warnings + +import matplotlib +rcParams = matplotlib.rcParams +import matplotlib.artist as martist +import matplotlib.transforms as mtransforms +import matplotlib.collections as mcoll +import matplotlib.legend as mlegend + +from matplotlib.axes import subplot_class_factory +from mpl_axes import Axes + +from matplotlib.transforms import Bbox + +import numpy as np + +import matplotlib.cbook as cbook +is_string_like = cbook.is_string_like + + +class ParasiteAxesBase: + + def get_images_artists(self): + artists = set([a for a in self.get_children() if a.get_visible()]) + images = set([a for a in self.images if a.get_visible()]) + + return list(images), list(artists - images) + + def __init__(self, parent_axes, **kargs): + + self._parent_axes = parent_axes + kargs.update(dict(frameon=False)) + self._get_base_axes_attr("__init__")(self, parent_axes.figure, + parent_axes._position, **kargs) + + def cla(self): + self._get_base_axes_attr("cla")(self) + + martist.setp(self.get_children(), visible=False) + self._get_lines = self._parent_axes._get_lines + + # In mpl's Axes, zorders of x- and y-axis are originally set + # within Axes.draw(). + if self._axisbelow: + self.xaxis.set_zorder(0.5) + self.yaxis.set_zorder(0.5) + else: + self.xaxis.set_zorder(2.5) + self.yaxis.set_zorder(2.5) + + +_parasite_axes_classes = {} +def parasite_axes_class_factory(axes_class=None): + if axes_class is None: + axes_class = Axes + + new_class = _parasite_axes_classes.get(axes_class) + if new_class is None: + import new + def _get_base_axes_attr(self, attrname): + return getattr(axes_class, attrname) + + new_class = new.classobj("%sParasite" % (axes_class.__name__), + (ParasiteAxesBase, axes_class), + {'_get_base_axes_attr': _get_base_axes_attr}) + _parasite_axes_classes[axes_class] = new_class + + return new_class + +ParasiteAxes = parasite_axes_class_factory() + +# #class ParasiteAxes(ParasiteAxesBase, Axes): + +# @classmethod +# def _get_base_axes_attr(cls, attrname): +# return getattr(Axes, attrname) + + + +class ParasiteAxesAuxTransBase: + def __init__(self, parent_axes, aux_transform, viewlim_mode=None, + **kwargs): + + self.transAux = aux_transform + self.set_viewlim_mode(viewlim_mode) + + self._parasite_axes_class.__init__(self, parent_axes, **kwargs) + + def _set_lim_and_transforms(self): + + self.transAxes = self._parent_axes.transAxes + + self.transData = \ + self.transAux + \ + self._parent_axes.transData + + self._xaxis_transform = mtransforms.blended_transform_factory( + self.transData, self.transAxes) + self._yaxis_transform = mtransforms.blended_transform_factory( + self.transAxes, self.transData) + + def set_viewlim_mode(self, mode): + if mode not in [None, "equal", "transform"]: + raise ValueError("Unknown mode : %s" % (mode,)) + else: + self._viewlim_mode = mode + + def get_viewlim_mode(self): + return self._viewlim_mode + + + def update_viewlim(self): + viewlim = self._parent_axes.viewLim.frozen() + mode = self.get_viewlim_mode() + if mode is None: + pass + elif mode == "equal": + self.axes.viewLim.set(viewlim) + elif mode == "transform": + self.axes.viewLim.set(viewlim.transformed(self.transAux.inverted())) + else: + raise ValueError("Unknown mode : %s" % (self._viewlim_mode,)) + + + def _pcolor(self, method_name, *XYC, **kwargs): + if len(XYC) == 1: + C = XYC[0] + ny, nx = C.shape + + gx = np.arange(-0.5, nx, 1.) + gy = np.arange(-0.5, ny, 1.) + + X, Y = np.meshgrid(gx, gy) + else: + X, Y, C = XYC + + pcolor_routine = self._get_base_axes_attr(method_name) + + if kwargs.has_key("transform"): + mesh = pcolor_routine(self, X, Y, C, **kwargs) + else: + orig_shape = X.shape + xy = np.vstack([X.flat, Y.flat]) + xyt=xy.transpose() + wxy = self.transAux.transform(xyt) + gx, gy = wxy[:,0].reshape(orig_shape), wxy[:,1].reshape(orig_shape) + mesh = pcolor_routine(self, gx, gy, C, **kwargs) + mesh.set_transform(self._parent_axes.transData) + + return mesh + + def pcolormesh(self, *XYC, **kwargs): + return self._pcolor("pcolormesh", *XYC, **kwargs) + + def pcolor(self, *XYC, **kwargs): + return self._pcolor("pcolor", *XYC, **kwargs) + + + def _contour(self, method_name, *XYCL, **kwargs): + + if len(XYCL) <= 2: + C = XYCL[0] + ny, nx = C.shape + + gx = np.arange(0., nx, 1.) + gy = np.arange(0., ny, 1.) + + X,Y = np.meshgrid(gx, gy) + CL = XYCL + else: + X, Y = XYCL[:2] + CL = XYCL[2:] + + contour_routine = self._get_base_axes_attr(method_name) + + if kwargs.has_key("transform"): + cont = contour_routine(self, X, Y, *CL, **kwargs) + else: + orig_shape = X.shape + xy = np.vstack([X.flat, Y.flat]) + xyt=xy.transpose() + wxy = self.transAux.transform(xyt) + gx, gy = wxy[:,0].reshape(orig_shape), wxy[:,1].reshape(orig_shape) + cont = contour_routine(self, gx, gy, *CL, **kwargs) + for c in cont.collections: + c.set_transform(self._parent_axes.transData) + + return cont + + def contour(self, *XYCL, **kwargs): + return self._contour("contour", *XYCL, **kwargs) + + def contourf(self, *XYCL, **kwargs): + return self._contour("contourf", *XYCL, **kwargs) + + def apply_aspect(self, position=None): + self.update_viewlim() + self._get_base_axes_attr("apply_aspect")(self) + #ParasiteAxes.apply_aspect() + + + +_parasite_axes_auxtrans_classes = {} +def parasite_axes_auxtrans_class_factory(axes_class=None): + if axes_class is None: + parasite_axes_class = ParasiteAxes + elif not issubclass(axes_class, ParasiteAxesBase): + parasite_axes_class = parasite_axes_class_factory(axes_class) + else: + parasite_axes_class = axes_class + + new_class = _parasite_axes_auxtrans_classes.get(parasite_axes_class) + if new_class is None: + import new + new_class = new.classobj("%sParasiteAuxTrans" % (parasite_axes_class.__name__), + (ParasiteAxesAuxTransBase, parasite_axes_class), + {'_parasite_axes_class': parasite_axes_class}) + _parasite_axes_auxtrans_classes[parasite_axes_class] = new_class + + return new_class + + +ParasiteAxesAuxTrans = parasite_axes_auxtrans_class_factory(axes_class=ParasiteAxes) + + + + +def _get_handles(ax): + handles = ax.lines[:] + handles.extend(ax.patches) + handles.extend([c for c in ax.collections + if isinstance(c, mcoll.LineCollection)]) + handles.extend([c for c in ax.collections + if isinstance(c, mcoll.RegularPolyCollection)]) + return handles + + +class HostAxesBase: + def __init__(self, *args, **kwargs): + + self.parasites = [] + self._get_base_axes_attr("__init__")(self, *args, **kwargs) + + + def get_aux_axes(self, tr, viewlim_mode="equal", axes_class=None): + parasite_axes_class = parasite_axes_auxtrans_class_factory(axes_class) + ax2 = parasite_axes_class(self, tr, viewlim_mode) + # note that ax2.transData == tr + ax1.transData + # Anthing you draw in ax2 will match the ticks and grids of ax1. + self.parasites.append(ax2) + return ax2 + + def legend(self, *args, **kwargs): + + if len(args)==0: + all_handles = _get_handles(self) + for ax in self.parasites: + all_handles.extend(_get_handles(ax)) + handles = [] + labels = [] + for handle in all_handles: + label = handle.get_label() + if (label is not None and + label != '' and not label.startswith('_')): + handles.append(handle) + labels.append(label) + if len(handles) == 0: + warnings.warn("No labeled objects found. " + "Use label='...' kwarg on individual plots.") + return None + + elif len(args)==1: + # LABELS + labels = args[0] + handles = [h for h, label in zip(all_handles, labels)] + + elif len(args)==2: + if is_string_like(args[1]) or isinstance(args[1], int): + # LABELS, LOC + labels, loc = args + handles = [h for h, label in zip(all_handles, labels)] + kwargs['loc'] = loc + else: + # LINES, LABELS + handles, labels = args + + elif len(args)==3: + # LINES, LABELS, LOC + handles, labels, loc = args + kwargs['loc'] = loc + else: + raise TypeError('Invalid arguments to legend') + + + handles = cbook.flatten(handles) + self.legend_ = mlegend.Legend(self, handles, labels, **kwargs) + return self.legend_ + + + def draw(self, renderer): + + orig_artists = list(self.artists) + orig_images = list(self.images) + + if hasattr(self, "get_axes_locator"): + locator = self.get_axes_locator() + if locator: + pos = locator(self, renderer) + self.set_position(pos, which="active") + self.apply_aspect(pos) + else: + self.apply_aspect() + else: + self.apply_aspect() + + rect = self.get_position() + + for ax in self.parasites: + ax.apply_aspect(rect) + images, artists = ax.get_images_artists() + self.images.extend(images) + self.artists.extend(artists) + + self._get_base_axes_attr("draw")(self, renderer) + self.artists = orig_artists + self.images = orig_images + + + def cla(self): + + for ax in self.parasites: + ax.cla() + + self._get_base_axes_attr("cla")(self) + #super(HostAxes, self).cla() + + + def twinx(self, axes_class=None): + """ + call signature:: + + ax2 = ax.twinx() + + create a twin of Axes for generating a plot with a sharex + x-axis but independent y axis. The y-axis of self will have + ticks on left and the returned axes will have ticks on the + right + """ + + if axes_class is None: + axes_class = self._get_base_axes() + + parasite_axes_class = parasite_axes_class_factory(axes_class) + + ax2 = parasite_axes_class(self, sharex=self, frameon=False) + self.parasites.append(ax2) + + # for normal axes + + self.axis["right"].toggle(all=False) + self.axis["right"].line.set_visible(False) + + ax2.axis["right"].set_visible(True) + ax2.axis["left","top", "bottom"].toggle(all=False) + ax2.axis["left","top", "bottom"].line.set_visible(False) + + ax2.axis["right"].toggle(all=True) + ax2.axis["right"].line.set_visible(True) + + return ax2 + + def twiny(self, axes_class=None): + """ + call signature:: + + ax2 = ax.twiny() + + create a twin of Axes for generating a plot with a shared + y-axis but independent x axis. The x-axis of self will have + ticks on bottom and the returned axes will have ticks on the + top + """ + + if axes_class is None: + axes_class = self._get_base_axes() + + parasite_axes_class = parasite_axes_class_factory(axes_class) + + ax2 = parasite_axes_class(self, sharey=self, frameon=False) + self.parasites.append(ax2) + + self.axis["top"].toggle(all=False) + self.axis["top"].line.set_visible(False) + + ax2.axis["top"].set_visible(True) + ax2.axis["left","right", "bottom"].toggle(all=False) + ax2.axis["left","right", "bottom"].line.set_visible(False) + + ax2.axis["top"].toggle(all=True) + ax2.axis["top"].line.set_visible(True) + + return ax2 + + + def twin(self, aux_trans=None, axes_class=None): + """ + call signature:: + + ax2 = ax.twin() + + create a twin of Axes for generating a plot with a sharex + x-axis but independent y axis. The y-axis of self will have + ticks on left and the returned axes will have ticks on the + right + """ + + if axes_class is None: + axes_class = self._get_base_axes() + + parasite_axes_auxtrans_class = parasite_axes_auxtrans_class_factory(axes_class) + + if aux_trans is None: + ax2 = parasite_axes_auxtrans_class(self, mtransforms.IdentityTransform(), + viewlim_mode="equal", + ) + else: + ax2 = parasite_axes_auxtrans_class(self, aux_trans, + viewlim_mode="transform", + ) + self.parasites.append(ax2) + + + # for normal axes + #self.yaxis.tick_left() + #self.xaxis.tick_bottom() + #ax2.yaxis.tick_right() + #ax2.xaxis.set_visible(True) + #ax2.yaxis.set_visible(True) + + #ax2.yaxis.set_label_position('right') + ##ax2.xaxis.tick_top() + #ax2.xaxis.set_label_position('top') + + + self.axis["top","right"].toggle(all=False) + self.axis["top","right"].line.set_visible(False) + #self.axis["left","bottom"].toggle(label=True) + + ax2.axis["top","right"].set_visible(True) + + ax2.axis["bottom","left"].toggle(all=False) + ax2.axis["bottom","left"].line.set_visible(False) + + ax2.axis["top","right"].toggle(all=True) + ax2.axis["top","right"].line.set_visible(True) + + + # # for axisline axes + # self._axislines["right"].set_visible(False) + # self._axislines["top"].set_visible(False) + # ax2._axislines["left"].set_visible(False) + # ax2._axislines["bottom"].set_visible(False) + + # ax2._axislines["right"].set_visible(True) + # ax2._axislines["top"].set_visible(True) + # ax2._axislines["right"].major_ticklabels.set_visible(True) + # ax2._axislines["top"].major_ticklabels.set_visible(True) + + return ax2 + + def get_tightbbox(self, renderer): + + bbs = [ax.get_tightbbox(renderer) for ax in self.parasites] + get_tightbbox = self._get_base_axes_attr("get_tightbbox") + bbs.append(get_tightbbox(self, renderer)) + + _bbox = Bbox.union([b for b in bbs if b.width!=0 or b.height!=0]) + + return _bbox + + + +_host_axes_classes = {} +def host_axes_class_factory(axes_class=None): + if axes_class is None: + axes_class = Axes + + new_class = _host_axes_classes.get(axes_class) + if new_class is None: + import new + + def _get_base_axes(self): + return axes_class + + def _get_base_axes_attr(self, attrname): + return getattr(axes_class, attrname) + + new_class = new.classobj("%sHostAxes" % (axes_class.__name__), + (HostAxesBase, axes_class), + {'_get_base_axes_attr': _get_base_axes_attr, + '_get_base_axes': _get_base_axes}) + + _host_axes_classes[axes_class] = new_class + + return new_class + +def host_subplot_class_factory(axes_class): + host_axes_class = host_axes_class_factory(axes_class=axes_class) + subplot_host_class = subplot_class_factory(host_axes_class) + return subplot_host_class + +HostAxes = host_axes_class_factory(axes_class=Axes) +SubplotHost = subplot_class_factory(HostAxes) + + +def host_axes(*args, **kwargs): + import matplotlib.pyplot as plt + axes_class = kwargs.pop("axes_class", None) + host_axes_class = host_axes_class_factory(axes_class) + fig = plt.gcf() + ax = host_axes_class(fig, *args, **kwargs) + fig.add_axes(ax) + plt.draw_if_interactive() + return ax + +def host_subplot(*args, **kwargs): + import matplotlib.pyplot as plt + axes_class = kwargs.pop("axes_class", None) + host_subplot_class = host_subplot_class_factory(axes_class) + fig = plt.gcf() + ax = host_subplot_class(fig, *args, **kwargs) + fig.add_subplot(ax) + plt.draw_if_interactive() + return ax diff -Nru matplotlib-0.99.3/lib/mpl_toolkits/axisartist/angle_helper.py matplotlib-1.0.1/lib/mpl_toolkits/axisartist/angle_helper.py --- matplotlib-0.99.3/lib/mpl_toolkits/axisartist/angle_helper.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_toolkits/axisartist/angle_helper.py 2010-07-07 01:41:47.000000000 +0000 @@ -0,0 +1,349 @@ +from math import floor + +import numpy as np +import math + +A = np.array + +from grid_finder import ExtremeFinderSimple + +def select_step_degree(dv): + + degree_limits_ = [1.5, 3, 7, 13, 20, 40, 70, 120, 270, 520] + degree_steps_ = [ 1, 2, 5, 10, 15, 30, 45, 90, 180, 360] + degree_factors = [1.] * len(degree_steps_) + + minsec_limits_ = [1.5, 2.5, 3.5, 8, 11, 18, 25, 45] + minsec_steps_ = [1, 2, 3, 5, 10, 15, 20, 30] + + minute_limits_ = A(minsec_limits_)*(1./60.) + minute_factors = [60.] * len(minute_limits_) + + second_limits_ = A(minsec_limits_)*(1./3600.) + second_factors = [3600.] * len(second_limits_) + + degree_limits = np.concatenate([second_limits_, + minute_limits_, + degree_limits_]) + + degree_steps = np.concatenate([minsec_steps_, + minsec_steps_, + degree_steps_]) + + degree_factors = np.concatenate([second_factors, + minute_factors, + degree_factors]) + + n = degree_limits.searchsorted(dv) + step = degree_steps[n] + factor = degree_factors[n] + + return step, factor + + + +def select_step_hour(dv): + + hour_limits_ = [1.5, 2.5, 3.5, 5, 7, 10, 15, 21, 36] + hour_steps_ = [1, 2 , 3, 4, 6, 8, 12, 18, 24] + hour_factors = [1.] * len(hour_steps_) + + minsec_limits_ = [1.5, 2.5, 3.5, 4.5, 5.5, 8, 11, 14, 18, 25, 45] + minsec_steps_ = [1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30] + + minute_limits_ = A(minsec_limits_)*(1./60.) + minute_factors = [60.] * len(minute_limits_) + + second_limits_ = A(minsec_limits_)*(1./3600.) + second_factors = [3600.] * len(second_limits_) + + hour_limits = np.concatenate([second_limits_, + minute_limits_, + hour_limits_]) + + hour_steps = np.concatenate([minsec_steps_, + minsec_steps_, + hour_steps_]) + + hour_factors = np.concatenate([second_factors, + minute_factors, + hour_factors]) + + n = hour_limits.searchsorted(dv) + step = hour_steps[n] + factor = hour_factors[n] + + return step, factor + + +def select_step_sub(dv): + + # subarcsec or degree + tmp = 10.**(int(math.log10(dv))-1.) + dv2 = dv/tmp + substep_limits_ = [1.5, 3., 7.] + substep_steps_ = [1. , 2., 5.] + + factor = 1./tmp + + if 1.5*tmp >= dv: + step = 1 + elif 3.*tmp >= dv: + step = 2 + elif 7.*tmp >= dv: + step = 5 + else: + step = 1 + factor = 0.1*factor + + return step, factor + + +def select_step(v1, v2, nv, hour=False): + + if v1 > v2: + v1, v2 = v2, v1 + + A = np.array + + dv = float(v2 - v1) / nv + + if hour: + _select_step = select_step_hour + cycle = 24. + else: + _select_step = select_step_degree + cycle = 360. + + # for degree + if dv > 1./3600.: + #print "degree" + step, factor = _select_step(dv) + else: + step, factor = select_step_sub(dv*3600.) + #print "feac", step, factor + + factor = factor * 3600. + + + f1, f2, fstep = v1*factor, v2*factor, step/factor + levs = np.arange(math.floor(f1/step), math.ceil(f2/step)+0.5, + 1, dtype="i") * step + + # n : number valid levels. If there is a cycle, e.g., [0, 90, 180, + # 270, 360], the a grid line needs to be extend from 0 to 360, so + # we need to return the whole array. However, the last level (360) + # needs to be ignored often. In this case, so we return n=4. + + n = len(levs) + + + # we need to check the range of values + # for example, -90 to 90, 0 to 360, + + + if factor == 1. and (levs[-1] >= levs[0]+cycle): # check for cycle + nv = int(cycle / step) + levs = np.arange(0, nv, 1) * step + n = len(levs) + + return np.array(levs), n, factor + + +def select_step24(v1, v2, nv): + v1, v2 = v1/15., v2/15. + levs, n, factor = select_step(v1, v2, nv, hour=True) + return levs*15., n, factor + +def select_step360(v1, v2, nv): + return select_step(v1, v2, nv, hour=False) + + + + +class LocatorHMS(object): + def __init__(self, den): + self.den = den + def __call__(self, v1, v2): + return select_step24(v1, v2, self.den) + + +class LocatorDMS(object): + def __init__(self, den): + self.den = den + def __call__(self, v1, v2): + return select_step360(v1, v2, self.den) + + +class FormatterHMS(object): + def __call__(self, direction, factor, values): # hour + if len(values) == 0: + return [] + #ss = [[-1, 1][v>0] for v in values] #not py24 compliant + values = np.asarray(values) + ss = np.where(values>0, 1, -1) + values = np.abs(values)/15. + + if factor == 1: + return ["$%d^{\mathrm{h}}$" % (int(v),) for v in values] + elif factor == 60: + return ["$%d^{\mathrm{h}}\,%02d^{\mathrm{m}}$" % (s*floor(v/60.), v%60) \ + for s, v in zip(ss, values)] + elif factor == 3600: + if ss[-1] == -1: + inverse_order = True + values = values[::-1] + else: + inverse_order = False + degree = floor(values[0]/3600.) + hm_fmt = "$%d^{\mathrm{h}}\,%02d^{\mathrm{m}}\," + s_fmt = "%02d^{\mathrm{s}}$" + l_hm_old = "" + r = [] + for v in values-3600*degree: + l_hm = hm_fmt % (ss[0]*degree, floor(v/60.)) + l_s = s_fmt % (v%60,) + if l_hm != l_hm_old: + l_hm_old = l_hm + l = l_hm + l_s + else: + l = "$"+l_s + r.append(l) + if inverse_order: + return r[::-1] + else: + return r + #return [fmt % (ss[0]*degree, floor(v/60.), v%60) \ + # for s, v in zip(ss, values-3600*degree)] + else: # factor > 3600. + return [r"$%s^{\mathrm{h}}$" % (str(v),) for v in ss*values] + + +class FormatterDMS(object): + def __call__(self, direction, factor, values): + if len(values) == 0: + return [] + #ss = [[-1, 1][v>0] for v in values] #not py24 compliant + values = np.asarray(values) + ss = np.where(values>0, 1, -1) + values = np.abs(values) + if factor == 1: + return ["$%d^{\circ}$" % (s*int(v),) for (s, v) in zip(ss, values)] + elif factor == 60: + return ["$%d^{\circ}\,%02d^{\prime}$" % (s*floor(v/60.), v%60) \ + for s, v in zip(ss, values)] + elif factor == 3600: + if ss[-1] == -1: + inverse_order = True + values = values[::-1] + else: + inverse_order = False + degree = floor(values[0]/3600.) + hm_fmt = "$%d^{\circ}\,%02d^{\prime}\," + s_fmt = "%02d^{\prime\prime}$" + l_hm_old = "" + r = [] + for v in values-3600*degree: + l_hm = hm_fmt % (ss[0]*degree, floor(v/60.)) + l_s = s_fmt % (v%60,) + if l_hm != l_hm_old: + l_hm_old = l_hm + l = l_hm + l_s + else: + l = "$"+l_s + r.append(l) + if inverse_order: + return r[::-1] + else: + return r + #return [fmt % (ss[0]*degree, floor(v/60.), v%60) \ + # for s, v in zip(ss, values-3600*degree)] + else: # factor > 3600. + return [r"$%s^{\circ}$" % (str(v),) for v in ss*values] + + + + +class ExtremeFinderCycle(ExtremeFinderSimple): + """ + When there is a cycle, e.g., longitude goes from 0-360. + """ + def __init__(self, + nx, ny, + lon_cycle = 360., + lat_cycle = None, + lon_minmax = None, + lat_minmax = (-90, 90) + ): + #self.transfrom_xy = transform_xy + #self.inv_transfrom_xy = inv_transform_xy + self.nx, self.ny = nx, ny + self.lon_cycle, self.lat_cycle = lon_cycle, lat_cycle + self.lon_minmax = lon_minmax + self.lat_minmax = lat_minmax + + + def __call__(self, transform_xy, x1, y1, x2, y2): + """ + get extreme values. + + x1, y1, x2, y2 in image coordinates (0-based) + nx, ny : number of dvision in each axis + """ + x_, y_ = np.linspace(x1, x2, self.nx), np.linspace(y1, y2, self.ny) + x, y = np.meshgrid(x_, y_) + lon, lat = transform_xy(np.ravel(x), np.ravel(y)) + + # iron out jumps, but algorithm should be improved. + # Tis is just naive way of doing and my fail for some cases. + if self.lon_cycle is not None: + lon0 = np.nanmin(lon) + lon -= 360. * ((lon - lon0) > 180.) + if self.lat_cycle is not None: + lat0 = np.nanmin(lat) + lat -= 360. * ((lat - lat0) > 180.) + + lon_min, lon_max = np.nanmin(lon), np.nanmax(lon) + lat_min, lat_max = np.nanmin(lat), np.nanmax(lat) + + lon_min, lon_max, lat_min, lat_max = \ + self._adjust_extremes(lon_min, lon_max, lat_min, lat_max) + + return lon_min, lon_max, lat_min, lat_max + + + def _adjust_extremes(self, lon_min, lon_max, lat_min, lat_max): + + lon_min, lon_max, lat_min, lat_max = \ + self._add_pad(lon_min, lon_max, lat_min, lat_max) + + # check cycle + if self.lon_cycle: + lon_max = min(lon_max, lon_min + self.lon_cycle) + if self.lat_cycle: + lat_max = min(lat_max, lat_min + self.lat_cycle) + + if self.lon_minmax is not None: + min0 = self.lon_minmax[0] + lon_min = max(min0, lon_min) + max0 = self.lon_minmax[1] + lon_max = min(max0, lon_max) + + if self.lat_minmax is not None: + min0 = self.lat_minmax[0] + lat_min = max(min0, lat_min) + max0 = self.lat_minmax[1] + lat_max = min(max0, lat_max) + + return lon_min, lon_max, lat_min, lat_max + + + + + +if __name__ == "__main__": + #test2() + print select_step360(21.2, 33.3, 5) + print select_step360(20+21.2/60., 21+33.3/60., 5) + print select_step360(20.5+21.2/3600., 20.5+33.3/3600., 5) + print select_step360(20+21.2/60., 20+53.3/60., 5) diff -Nru matplotlib-0.99.3/lib/mpl_toolkits/axisartist/axis_artist.py matplotlib-1.0.1/lib/mpl_toolkits/axisartist/axis_artist.py --- matplotlib-0.99.3/lib/mpl_toolkits/axisartist/axis_artist.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_toolkits/axisartist/axis_artist.py 2010-09-23 19:54:48.000000000 +0000 @@ -0,0 +1,1505 @@ +""" +axis_artist.py module provides axis-related artists. They are + + * axis line + * tick lines + * tick labels + * axis label + * grid lines + +The main artist class is a AxisArtist and a GridlinesCollection. The +GridlinesCollection is responsible for drawing grid lines and the +AxisArtist is responsible for all other artists. The AxisArtist class +has attributest that are associated with each type of artists. + + * line : axis line + * major_ticks : major tick lines + * major_ticklabels : major tick labels + * minor_ticks : minor tick lines + * minor_ticklabels : minor tick labels + * label : axis label + +Typically, the AxisArtist associated with a axes will be accessed with +the *axis* dictionary of the axes, i.e., the AxisArtist for the bottom +axis is + + ax.axis["bottom"] + +where *ax* is an instance of axes (mpl_toolkits.axislines.Axes). +Thus, ax.axis["bottom"].line is an artist associated with the axis line, and ax.axis["bottom"].major_ticks is an artist associated with the major tick lines. + +You can change the colors, fonts, line widths, etc. of these artists +by calling sutable set method. For example, to change the color of the major ticks of the bottom axis to red, + + ax.axis["bottom"].major_ticks.set_color("r") + +However, things like the locations of ticks, and their ticklabels need +to be changed from the side of the grid_helper. + +axis_direction +-------------- + +AxisArtist, AxisLabel, TickLabels have *axis_drection* attribute, +which adjusts the location, angle, etc.,. The *axis_direction* must be +one of [left, right, bottom, top] and they follow the matplotlib +convention for the rectangle axis. + +For example, for the *bottom* axis (the left and right is relative to +the direction of the increasing coordinate), + + * ticklabels and axislabel are on the right + * ticklabels and axislabel have text angle of 0 + * ticklabels are baseline, center-aligned + * axislabel is top, center-aligned + + +The text angles are actually relative to (90 + angle of the direction +to the ticklabel), which gives 0 for bottom axis. + + left bottom right top + ticklabels location left right right left + axislabel location left right right left + ticklabels angle 90 0 -90 180 + axislabel angle 180 0 0 180 + ticklabel va center baseline center baseline + axislabel va center top center btoom + ticklabel ha right center right center + axislabel ha right center right center + + +Ticks are by default direct opposite side of the ticklabels. To make +ticks to the same side of the ticklabels, + + ax.axis["bottom"].major_ticks.set_ticks_out(True) + + +Following attributes can be customized (use set_xxx method) + + * Ticks : ticksize, tick_out + * TickLabels : pad + * AxisLabel : pad + +""" + + +# FIXME : + +# * : angles are given in data coordinate - need to convert it to canvas coordinate + + +import matplotlib.axes as maxes +import matplotlib.artist as martist +import matplotlib.text as mtext +import matplotlib.font_manager as font_manager + +from matplotlib.path import Path +from matplotlib.transforms import Affine2D, ScaledTranslation, \ + IdentityTransform, TransformedPath, Bbox +from matplotlib.collections import LineCollection + +from matplotlib import rcParams + +from matplotlib.artist import allow_rasterization + +import warnings + +import numpy as np + + +import matplotlib.lines as mlines +from axisline_style import AxislineStyle + + +class BezierPath(mlines.Line2D): + + def __init__(self, path, *kl, **kw): + mlines.Line2D.__init__(self, [], [], *kl, **kw) + self._path = path + self._invalid = False + + def recache(self): + + self._transformed_path = TransformedPath(self._path, self.get_transform()) + + self._invalid = False + + def set_path(self, path): + self._path = path + self._invalid = True + + + def draw(self, renderer): + if self._invalid: + self.recache() + + if not self._visible: return + renderer.open_group('line2d') + + gc = renderer.new_gc() + self._set_gc_clip(gc) + + gc.set_foreground(self._color) + gc.set_antialiased(self._antialiased) + gc.set_linewidth(self._linewidth) + gc.set_alpha(self._alpha) + if self.is_dashed(): + cap = self._dashcapstyle + join = self._dashjoinstyle + else: + cap = self._solidcapstyle + join = self._solidjoinstyle + gc.set_joinstyle(join) + gc.set_capstyle(cap) + + funcname = self._lineStyles.get(self._linestyle, '_draw_nothing') + if funcname != '_draw_nothing': + tpath, affine = self._transformed_path.get_transformed_path_and_affine() + lineFunc = getattr(self, funcname) + lineFunc(renderer, gc, tpath, affine.frozen()) + + gc.restore() + renderer.close_group('line2d') + + + +class UnimplementedException(Exception): + pass + +from matplotlib.artist import Artist + +class AttributeCopier(object): + def __init__(self, ref_artist, klass=Artist): + self._klass = klass + self._ref_artist = ref_artist + super(AttributeCopier, self).__init__() + + def set_ref_artist(self, artist): + self._ref_artist = artist + + def get_ref_artist(self): + raise RuntimeError("get_ref_artist must overriden") + #return self._ref_artist + + def get_attribute_from_ref_artist(self, attr_name, default_value): + get_attr_method_name = "get_"+attr_name + c = getattr(self._klass, get_attr_method_name)(self) + if c == 'auto': + ref_artist = self.get_ref_artist() + if ref_artist: + attr = getattr(ref_artist, + get_attr_method_name)() + return attr + else: + return default_value + + return c + + +from matplotlib.lines import Line2D + +class Ticks(Line2D, AttributeCopier): + """ + Ticks are derived from Line2D, and note that ticks themselves + are markers. Thus, you should use set_mec, set_mew, etc. + + To change the tick size (length), you need to use + set_ticksize. To change the direction of the ticks (ticks are + in opposite direction of ticklabels by default), use + set_tick_out(False). + """ + + def __init__(self, ticksize, tick_out=False, **kwargs): + self._ticksize = ticksize + self.locs_angles_labels = [] + + self.set_tick_out(tick_out) + + self._axis = kwargs.pop("axis", None) + if self._axis is not None: + if "color" not in kwargs: + kwargs["color"] = "auto" + if ("mew" not in kwargs) and ("markeredgewidth" not in kwargs): + kwargs["markeredgewidth"] = "auto" + + Line2D.__init__(self, [0.], [0.], **kwargs) + AttributeCopier.__init__(self, self._axis, klass=Line2D) + self.set_snap(True) + + def get_ref_artist(self): + #return self._ref_artist.get_ticklines()[0] + return self._ref_artist.majorTicks[0].tick1line + + def get_color(self): + return self.get_attribute_from_ref_artist("color", "k") + + def get_markeredgecolor(self): + if self._markeredgecolor == 'auto': + return self.get_color() + else: + return self._markeredgecolor + + def get_markeredgewidth(self): + return self.get_attribute_from_ref_artist("markeredgewidth", .5) + + + def set_tick_out(self, b): + """ + set True if tick need to be rotated by 180 degree. + """ + self._tick_out = b + + def get_tick_out(self): + """ + Return True if the tick will be rotated by 180 degree. + """ + return self._tick_out + + + def set_ticksize(self, ticksize): + """ + set lenth of the ticks in points. + """ + self._ticksize = ticksize + + + def get_ticksize(self): + """ + Return length of the ticks in points. + """ + return self._ticksize + + def set_locs_angles(self, locs_angles): + self.locs_angles = locs_angles + + + def _update(self, renderer): + pass + + _tickvert_path = Path([[0., 0.], [1., 0.]]) + + def draw(self, renderer): + if not self.get_visible(): + return + + self._update(renderer) # update the tick + + size = self._ticksize + path_trans = self.get_transform() + + # set gc : copied from lines.py +# gc = renderer.new_gc() +# self._set_gc_clip(gc) + +# gc.set_foreground(self.get_color()) +# gc.set_antialiased(self._antialiased) +# gc.set_linewidth(self._linewidth) +# gc.set_alpha(self._alpha) +# if self.is_dashed(): +# cap = self._dashcapstyle +# join = self._dashjoinstyle +# else: +# cap = self._solidcapstyle +# join = self._solidjoinstyle +# gc.set_joinstyle(join) +# gc.set_capstyle(cap) +# gc.set_snap(self.get_snap()) + + + gc = renderer.new_gc() + self._set_gc_clip(gc) + gc.set_foreground(self.get_markeredgecolor()) + gc.set_linewidth(self.get_markeredgewidth()) + gc.set_alpha(self._alpha) + + offset = renderer.points_to_pixels(size) + marker_scale = Affine2D().scale(offset, offset) + + if self.get_tick_out(): + add_angle = 180 + else: + add_angle = 0 + + marker_rotation = Affine2D() + marker_transform = marker_scale + marker_rotation + + for loc, angle in self.locs_angles: + marker_rotation.rotate_deg(angle+add_angle) + locs = path_trans.transform_non_affine(np.array([loc, loc])) + renderer.draw_markers(gc, self._tickvert_path, marker_transform, + Path(locs), path_trans.get_affine()) + marker_rotation.clear() + + gc.restore() + + +def test_ticks(): + import matplotlib.pyplot as plt + fig = plt.figure(1) + fig.clf() + ax = fig.add_subplot(111) + ax.xaxis.set_visible(False) + ax.yaxis.set_visible(False) + ticks = Ticks(ticksize=10, axis=ax.xaxis) + ax.add_artist(ticks) + locs_angles = [((0.2, 0.), 90), + ((0.4, 0.), 120)] + ticks.set_locs_angles(locs_angles) + plt.draw() + + + + +class LabelBase(mtext.Text): + """ + A base class for AxisLabel and TickLabels. The position and angle + of the text are calculated by to offset_ref_angle, + text_ref_angle, and offset_radius attributes. + """ + + def __init__(self, *kl, **kwargs): + self.locs_angles_labels = [] + self._ref_angle = 0 + self._offset_radius = 0. + + super(LabelBase, self).__init__(*kl, + **kwargs) + + self.set_rotation_mode("anchor") + self._text_follow_ref_angle = True + #self._offset_ref_angle = 0 + + def _set_ref_angle(self, a): + self._ref_angle = a + + def _get_ref_angle(self): + return self._ref_angle + + def _get_text_ref_angle(self): + if self._text_follow_ref_angle: + return self._get_ref_angle()+90 + else: + return 0 #self.get_ref_angle() + + def _get_offset_ref_angle(self): + return self._get_ref_angle() + + def _set_offset_radius(self, offset_radius): + self._offset_radius = offset_radius + + def _get_offset_radius(self): + return self._offset_radius + + + _get_opposite_direction = {"left":"right", + "right":"left", + "top":"bottom", + "bottom":"top"}.__getitem__ + + + def _update(self, renderer): + pass + + def draw(self, renderer): + if not self.get_visible(): return + + self._update(renderer) + + # save original and adjust some properties + tr = self.get_transform() + angle_orig = self.get_rotation() + + offset_tr = Affine2D() + self.set_transform(tr+offset_tr) + + text_ref_angle = self._get_text_ref_angle() + offset_ref_angle = self._get_offset_ref_angle() + + theta = (offset_ref_angle)/180.*np.pi + dd = self._get_offset_radius() + dx, dy = dd * np.cos(theta), dd * np.sin(theta) + offset_tr.translate(dx, dy) + self.set_rotation(text_ref_angle+angle_orig) + super(LabelBase, self).draw(renderer) + offset_tr.clear() + + + # restore original properties + self.set_transform(tr) + self.set_rotation(angle_orig) + + + def get_window_extent(self, renderer): + + self._update(renderer) + + # save original and adjust some properties + tr = self.get_transform() + angle_orig = self.get_rotation() + + offset_tr = Affine2D() + self.set_transform(tr+offset_tr) + + text_ref_angle = self._get_text_ref_angle() + offset_ref_angle = self._get_offset_ref_angle() + + theta = (offset_ref_angle)/180.*np.pi + dd = self._get_offset_radius() + dx, dy = dd * np.cos(theta), dd * np.sin(theta) + offset_tr.translate(dx, dy) + self.set_rotation(text_ref_angle+angle_orig) + + bbox = super(LabelBase, self).get_window_extent(renderer) + + offset_tr.clear() + + + # restore original properties + self.set_transform(tr) + self.set_rotation(angle_orig) + + return bbox + + + +def test_labelbase(): + import matplotlib.pyplot as plt + fig = plt.figure(1) + fig.clf() + ax = fig.add_subplot(111) + + ax.plot([0.5], [0.5], "o") + label = LabelBase(0.5, 0.5, "Test") + + a = -90 + label._set_ref_angle(a) + label._set_offset_radius(offset_radius=50) + label.set_rotation(-90) + label.set(ha="center", va="top") + + ax.add_artist(label) + plt.draw() + + + + + + + + + +class AxisLabel(LabelBase, AttributeCopier): + """ + Axis Label. Derived from Text. The position of the text is updated + in the fly, so chaning text position has no effect. Otherwise, the + properties can be changed as a normal Text. + + To change the pad between ticklabels and axis label, use set_pad. + """ + + def __init__(self, *kl, **kwargs): + + axis_direction = kwargs.pop("axis_direction", "bottom") + self._axis = kwargs.pop("axis", None) + #super(AxisLabel, self).__init__(*kl, **kwargs) + LabelBase.__init__(self, *kl, **kwargs) + AttributeCopier.__init__(self, self._axis, klass=LabelBase) + + self.set_axis_direction(axis_direction) + self._pad = 5 + self._extra_pad = 0 + + def set_pad(self, pad): + """ + Set the pad in points. Note that the actual pad will be the + sum of the internal pad and the external pad (that are set + automatically by the AxisArtist), and it only set the internal + pad + """ + self._pad = pad + + def get_pad(self): + """ + return pad in points. See set_pad for more details. + """ + return self._pad + + + def _set_external_pad(self, p): + """ + Set external pad IN PIXELS. This is intended to be set by the + AxisArtist, bot by user.. + """ + self._extra_pad = p + + def _get_external_pad(self): + """ + Get external pad. + """ + return self._extra_pad + + + def get_ref_artist(self): + return self._axis.get_label() + + + def get_text(self): + t = super(AxisLabel, self).get_text() + if t == "__from_axes__": + return self._axis.get_label().get_text() + return self._text + + _default_alignments = dict(left=("bottom", "center"), + right=("top", "center"), + bottom=("top", "center"), + top=("bottom", "center")) + + + + def set_default_alignment(self, d): + if d not in ["left", "right", "top", "bottom"]: + raise ValueError('direction must be on of "left", "right", "top", "bottom"') + + va, ha = self._default_alignments[d] + self.set_va(va) + self.set_ha(ha) + + + _default_angles = dict(left=180, + right=0, + bottom=0, + top=180) + + + def set_default_angle(self, d): + if d not in ["left", "right", "top", "bottom"]: + raise ValueError('direction must be on of "left", "right", "top", "bottom"') + + self.set_rotation(self._default_angles[d]) + + + def set_axis_direction(self, d): + """ + Adjust the text angle and text alignment of axis label + according to the matplotlib convention. + + + ===================== ========== ========= ========== ========== + property left bottom right top + ===================== ========== ========= ========== ========== + axislabel angle 180 0 0 180 + axislabel va center top center btoom + axislabel ha right center right center + ===================== ========== ========= ========== ========== + + Note that the text angles are actually relative to (90 + angle + of the direction to the ticklabel), which gives 0 for bottom + axis. + + """ + if d not in ["left", "right", "top", "bottom"]: + raise ValueError('direction must be on of "left", "right", "top", "bottom"') + + self.set_default_alignment(d) + self.set_default_angle(d) + + def get_color(self): + return self.get_attribute_from_ref_artist("color", "k") + + def draw(self, renderer): + if not self.get_visible(): + return + + pad = renderer.points_to_pixels(self.get_pad()) + r = self._get_external_pad() + pad + self._set_offset_radius(r) + + super(AxisLabel, self).draw(renderer) + + +class TickLabels(AxisLabel, AttributeCopier): # mtext.Text + """ + Tick Labels. While derived from Text, this single artist draws all + ticklabels. As in AxisLabel, the position of the text is updated + in the fly, so changing text position has no effect. Otherwise, + the properties can be changed as a normal Text. Unlike the + ticklabels of the mainline matplotlib, properties of single + ticklabel alone cannot modified. + + To change the pad between ticks and ticklabels, use set_pad. + """ + + def __init__(self, **kwargs): + + axis_direction = kwargs.pop("axis_direction", "bottom") + AxisLabel.__init__(self, **kwargs) + self.set_axis_direction(axis_direction) + #self._axis_direction = axis_direction + self._axislabel_pad = 0 + #self._extra_pad = 0 + + + # attribute copier + def get_ref_artist(self): + return self._axis.get_ticklabels()[0] + + def set_axis_direction(self, label_direction): + """ + Adjust the text angle and text alignment of ticklabels + according to the matplotlib convention. + + The *label_direction* must be one of [left, right, bottom, + top]. + + ===================== ========== ========= ========== ========== + property left bottom right top + ===================== ========== ========= ========== ========== + ticklabels angle 90 0 -90 180 + ticklabel va center baseline center baseline + ticklabel ha right center right center + ===================== ========== ========= ========== ========== + + + Note that the text angles are actually relative to (90 + angle + of the direction to the ticklabel), which gives 0 for bottom + axis. + + """ + + if label_direction not in ["left", "right", "top", "bottom"]: + raise ValueError('direction must be one of "left", "right", "top", "bottom"') + + self._axis_direction = label_direction + self.set_default_alignment(label_direction) + self.set_default_angle(label_direction) + + + def invert_axis_direction(self): + label_direction = self._get_opposite_direction(self._axis_direction) + self.set_axis_direction(label_direction) + + def _get_ticklabels_offsets(self, renderer, label_direction): + """ + Calculates the offsets of the ticklabels from the tick and + their total heights. The offset only takes account the offset + due to the vertical alignment of the ticklabels, i.e.,if axis + direction is bottom and va is ;top', it will return 0. if va + is 'baseline', it will return (height-descent). + """ + whd_list = self.get_texts_widths_heights_descents(renderer) + + if not whd_list: + return 0, 0 + + r = 0 + va, ha = self.get_va(), self.get_ha() + + if label_direction == "left": + pad = max([w for (w, h, d) in whd_list]) + if ha == "left": + r = pad + elif ha == "center": + r = .5 * pad + elif label_direction == "right": + pad = max([w for (w, h, d) in whd_list]) + if ha == "right": + r = pad + elif ha == "center": + r = .5 * pad + elif label_direction == "bottom": + pad = max([h for (w, h, d) in whd_list]) + if va == "bottom": + r = pad + elif va == "center": + r =.5 * pad + elif va == "baseline": + max_ascent = max([(h-d) for (w, h, d) in whd_list]) + max_descent = max([d for (w, h, d) in whd_list]) + r = max_ascent + pad = max_ascent + max_descent + elif label_direction == "top": + pad = max([h for (w, h, d) in whd_list]) + if va == "top": + r = pad + elif va == "center": + r =.5 * pad + elif va == "baseline": + max_ascent = max([(h-d) for (w, h, d) in whd_list]) + max_descent = max([d for (w, h, d) in whd_list]) + r = max_descent + pad = max_ascent + max_descent + + #tick_pad = renderer.points_to_pixels(self.get_pad()) + + # r : offset + + # pad : total height of the ticklabels. This will be used to + # calculate the pad for the axislabel. + return r, pad + + + + _default_alignments = dict(left=("center", "right"), + right=("center", "left"), + bottom=("baseline", "center"), + top=("baseline", "center")) + + + + # set_default_alignments(self, d) + + _default_angles = dict(left=90, + right=-90, + bottom=0, + top=180) + + + def draw(self, renderer): + if not self.get_visible(): + self._axislabel_pad = self._get_external_pad() + return + + r, total_width = self._get_ticklabels_offsets(renderer, + self._axis_direction) + + #self._set_external_pad(r+self._get_external_pad()) + pad = self._get_external_pad() + \ + renderer.points_to_pixels(self.get_pad()) + self._set_offset_radius(r+pad) + + #self._set_offset_radius(r) + + for (x, y), a, l in self._locs_angles_labels: + if not l.strip(): continue + self._set_ref_angle(a) #+ add_angle + self.set_x(x) + self.set_y(y) + self.set_text(l) + LabelBase.draw(self, renderer) + + self._axislabel_pad = total_width \ + + pad # the value saved will be used to draw axislabel. + + + def set_locs_angles_labels(self, locs_angles_labels): + self._locs_angles_labels = locs_angles_labels + + def get_window_extents(self, renderer): + + bboxes = [] + + r, total_width = self._get_ticklabels_offsets(renderer, + self._axis_direction) + + pad = self._get_external_pad() + \ + renderer.points_to_pixels(self.get_pad()) + self._set_offset_radius(r+pad) + + + for (x, y), a, l in self._locs_angles_labels: + self._set_ref_angle(a) #+ add_angle + self.set_x(x) + self.set_y(y) + self.set_text(l) + bb = LabelBase.get_window_extent(self, renderer) + bboxes.append(bb) + + return bboxes + + + def get_texts_widths_heights_descents(self, renderer): + """ + return a list of width, height, descent for ticklaels. + """ + whd_list = [] + for (x, y), a, l in self._locs_angles_labels: + if not l.strip(): continue + clean_line, ismath = self.is_math_text(l) + whd = renderer.get_text_width_height_descent( + clean_line, self._fontproperties, ismath=ismath) + whd_list.append(whd) + + return whd_list + + + +def test_ticklabels(): + import matplotlib.pyplot as plt + fig = plt.figure(1) + fig.clf() + ax = fig.add_subplot(111) + ax.xaxis.set_visible(False) + ax.yaxis.set_visible(False) + ax.plot([0.2, 0.4], [0.5, 0.5], "o") + ticks = Ticks(ticksize=10, axis=ax.xaxis) + ax.add_artist(ticks) + locs_angles_labels = [((0.2, 0.5), -90, "0.2"), + ((0.4, 0.5), -120, "0.4")] + tick_locs_angles = [(xy, a+180) for xy, a, l in locs_angles_labels] + ticks.set_locs_angles(tick_locs_angles) + + + ax.plot([0.5], [0.5], ",") + axislabel = AxisLabel(0.5, 0.5, "Test") + axislabel._set_offset_radius(20) + axislabel._set_ref_angle(0) + axislabel.set_axis_direction("bottom") + #axislabel._text_follow_ref_angle = True + #axislabel.set(va="center", ha="right") + ax.add_artist(axislabel) + + if 1: + ticklabels = TickLabels(axis_direction="left") + ticklabels._locs_angles_labels = locs_angles_labels + #ticklabels.set_rotation(90) + ticklabels.set_pad(10) + + ax.add_artist(ticklabels) + + ax.set_xlim(0, 1); ax.set_ylim(0, 1) + + plt.draw() + + + + +class GridlinesCollection(LineCollection): + def __init__(self, *kl, **kwargs): + super(GridlinesCollection, self).__init__(*kl, **kwargs) + self.set_grid_helper(None) + + def set_grid_helper(self, grid_helper): + self._grid_helper = grid_helper + + def draw(self, renderer): + if self._grid_helper is not None: + self._grid_helper.update_lim(self.axes) + gl = self._grid_helper.get_gridlines() + if gl: + self.set_segments([np.transpose(l) for l in gl]) + else: + self.set_segments([]) + super(GridlinesCollection, self).draw(renderer) + + + + +class AxisArtist(martist.Artist): + """ + An artist which draws axis (a line along which the n-th axes coord + is constant) line, ticks, ticklabels, and axis label. + """ + + ZORDER=2.5 + + # LABELPAD : as property + def _set_labelpad(self, v): + return self.label.set_pad(v) + + def _get_labelpad(self): + return self.label.get_pad() + + LABELPAD = property(_get_labelpad, _set_labelpad) + + def __init__(self, axes, + helper, + offset=None, + axis_direction="bottom", + **kw): + """ + *axes* : axes + *helper* : an AxisArtistHelper instance. + """ + #axes is also used to follow the axis attribute (tick color, etc). + + super(AxisArtist, self).__init__(**kw) + + self.axes = axes + + self._axis_artist_helper = helper + + if offset is None: + offset = (0, 0) + self.dpi_transform = Affine2D() + self.offset_transform = ScaledTranslation(offset[0], offset[1], + self.dpi_transform) + + self._label_visible = True + self._majortick_visible = True + self._majorticklabel_visible = True + self._minortick_visible = True + self._minorticklabel_visible = True + + + #if self._axis_artist_helper._loc in ["left", "right"]: + if axis_direction in ["left", "right"]: + axis_name = "ytick" + self.axis = axes.yaxis + else: + axis_name = "xtick" + self.axis = axes.xaxis + + + self._axisline_style = None + + + self._axis_direction = axis_direction + + + self._init_line() + self._init_ticks(axis_name, **kw) + self._init_offsetText(axis_direction) + self._init_label() + + self.set_zorder(self.ZORDER) + + self._rotate_label_along_line = False + + # axis direction + self._tick_add_angle = 180. + self._ticklabel_add_angle = 0. + self._axislabel_add_angle = 0. + self.set_axis_direction(axis_direction) + + + # axis direction + + def set_axis_direction(self, axis_direction): + """ + Adjust the direction, text angle, text alignment of + ticklabels, labels following the matplotlib convention for + the rectangle axes. + + The *axis_direction* must be one of [left, right, bottom, + top]. + + ===================== ========== ========= ========== ========== + property left bottom right top + ===================== ========== ========= ========== ========== + ticklabels location "-" "+" "+" "-" + axislabel location "-" "+" "+" "-" + ticklabels angle 90 0 -90 180 + ticklabel va center baseline center baseline + ticklabel ha right center right center + axislabel angle 180 0 0 180 + axislabel va center top center btoom + axislabel ha right center right center + ===================== ========== ========= ========== ========== + + + Note that the direction "+" and "-" are relative to the direction of + the increasing coordinate. Also, the text angles are actually + relative to (90 + angle of the direction to the ticklabel), + which gives 0 for bottom axis. + + """ + + if axis_direction not in ["left", "right", "top", "bottom"]: + raise ValueError('direction must be on of "left", "right", "top", "bottom"') + self._axis_direction = axis_direction + if axis_direction in ["left", "top"]: + #self._set_tick_direction("+") + self.set_ticklabel_direction("-") + self.set_axislabel_direction("-") + else: + #self._set_tick_direction("-") + self.set_ticklabel_direction("+") + self.set_axislabel_direction("+") + + self.major_ticklabels.set_axis_direction(axis_direction) + self.label.set_axis_direction(axis_direction) + + # def _set_tick_direction(self, d): + # if d not in ["+", "-"]: + # raise ValueError('direction must be on of "in", "out"') + + # if d == "+": + # self._tick_add_angle = 0 #get_helper()._extremes=0, 10 + # else: + # self._tick_add_angle = 180 #get_helper()._extremes=0, 10 + + def set_ticklabel_direction(self, tick_direction): + """ + Adjust the direction of the ticklabel. + + ACCEPTS: [ "+" | "-" ] + + Note that the label_direction '+' and '-' are relative to the + direction of the increasing coordinate. + """ + + if tick_direction not in ["+", "-"]: + raise ValueError('direction must be one of "+", "-"') + + if tick_direction == "-": + self._ticklabel_add_angle = 180 + else: + self._ticklabel_add_angle = 0 + + def invert_ticklabel_direction(self): + self._ticklabel_add_angle = (self._ticklabel_add_angle + 180) % 360 + self.major_ticklabels.invert_axis_direction() + self.minor_ticklabels.invert_axis_direction() + + # def invert_ticks_direction(self): + # self.major_ticks.set_tick_out(not self.major_ticks.get_tick_out()) + # self.minor_ticks.set_tick_out(not self.minor_ticks.get_tick_out()) + + def set_axislabel_direction(self, label_direction): + """ + Adjust the direction of the axislabel. + + ACCEPTS: [ "+" | "-" ] + + Note that the label_direction '+' and '-' are relative to the + direction of the increasing coordinate. + """ + if label_direction not in ["+", "-"]: + raise ValueError('direction must be one of "+", "-"') + + if label_direction == "-": + self._axislabel_add_angle = 180 + else: + self._axislabel_add_angle = 0 + + + + def get_transform(self): + return self.axes.transAxes + self.offset_transform + + def get_helper(self): + """ + Return axis artist helper instance. + """ + return self._axis_artist_helper + + + def set_axisline_style(self, axisline_style=None, **kw): + """ + Set the axisline style. + + *axisline_style* can be a string with axisline style name with optional + comma-separated attributes. Alternatively, the attrs can + be provided as keywords. + + set_arrowstyle("->,size=1.5") + set_arrowstyle("->", size=1.5) + + Old attrs simply are forgotten. + + Without argument (or with arrowstyle=None), return + available styles as a list of strings. + """ + + if axisline_style==None: + return AxislineStyle.pprint_styles() + + if isinstance(axisline_style, AxislineStyle._Base): + self._axisline_style = axisline_style + else: + self._axisline_style = AxislineStyle(axisline_style, **kw) + + + self._init_line() + + + def get_axisline_style(self): + """ + return the current axisline style. + """ + return self._axisline_style + + def _init_line(self): + """ + Initialize the *line* artist that is responsible to draw the axis line. + """ + tran = self._axis_artist_helper.get_line_transform(self.axes) \ + + self.offset_transform + + axisline_style = self.get_axisline_style() + if axisline_style is None: + self.line = BezierPath(self._axis_artist_helper.get_line(self.axes), + color=rcParams['axes.edgecolor'], + linewidth=rcParams['axes.linewidth'], + transform=tran) + else: + self.line = axisline_style(self, transform=tran) + + def _draw_line(self, renderer): + self.line.set_path(self._axis_artist_helper.get_line(self.axes)) + if self.get_axisline_style() is not None: + self.line.set_line_mutation_scale(self.major_ticklabels.get_size()) + self.line.draw(renderer) + + + def _init_ticks(self, axis_name, **kw): + + trans=self._axis_artist_helper.get_tick_transform(self.axes) \ + + self.offset_transform + + + major_tick_size = kw.get("major_tick_size", + rcParams['%s.major.size'%axis_name]) + major_tick_pad = kw.get("major_tick_pad", + rcParams['%s.major.pad'%axis_name]) + minor_tick_size = kw.get("minor_tick_size", + rcParams['%s.minor.size'%axis_name]) + minor_tick_pad = kw.get("minor_tick_pad", + rcParams['%s.minor.pad'%axis_name]) + + self.major_ticks = Ticks(major_tick_size, + axis=self.axis, + transform=trans) + self.minor_ticks = Ticks(minor_tick_size, + axis=self.axis, + transform=trans) + + if axis_name == "xaxis": + size = rcParams['xtick.labelsize'] + else: + size = rcParams['ytick.labelsize'] + + + fontprops = font_manager.FontProperties(size=size) + + self.major_ticklabels = TickLabels(size=size, axis=self.axis, + axis_direction=self._axis_direction) + self.minor_ticklabels = TickLabels(size=size, axis=self.axis, + axis_direction=self._axis_direction) + + + self.major_ticklabels.set(figure = self.axes.figure, + transform=trans, + fontproperties=fontprops) + self.major_ticklabels.set_pad(major_tick_pad) + + self.minor_ticklabels.set(figure = self.axes.figure, + transform=trans, + fontproperties=fontprops) + self.minor_ticklabels.set_pad(minor_tick_pad) + + + + def _get_tick_info(self, tick_iter): + """ + return ticks_loc_angle, ticklabels_loc_angle_label + + ticks_loc_angle : list of locs and angles for ticks + ticklabels_loc_angle_label : list of locs, angles and labels for tickslabels + """ + ticks_loc_angle = [] + ticklabels_loc_angle_label = [] + + tick_add_angle = self._tick_add_angle + ticklabel_add_angle = self._ticklabel_add_angle + + for loc, angle_normal, angle_tangent, label in tick_iter: + angle_label = angle_tangent - 90 + angle_label += ticklabel_add_angle + + if np.cos((angle_label - angle_normal)/180.*np.pi) < 0.: + angle_tick = angle_normal + else: + angle_tick = angle_normal + 180 + + ticks_loc_angle.append([loc, angle_tick]) + ticklabels_loc_angle_label.append([loc, angle_label, label]) + + return ticks_loc_angle, ticklabels_loc_angle_label + + + def _draw_ticks(self, renderer): + + + # set extra pad for major and minor ticklabels: + # use ticksize of majorticks even for minor ticks. not clear what is best. + + dpi_cor = renderer.points_to_pixels(1.) + if self.major_ticks.get_visible() and self.major_ticks.get_tick_out(): + self.major_ticklabels._set_external_pad(self.major_ticks._ticksize*dpi_cor) + self.minor_ticklabels._set_external_pad(self.major_ticks._ticksize*dpi_cor) + else: + self.major_ticklabels._set_external_pad(0) + self.minor_ticklabels._set_external_pad(0) + + + majortick_iter, minortick_iter = \ + self._axis_artist_helper.get_tick_iterators(self.axes) + + tick_loc_angle, ticklabel_loc_angle_label \ + = self._get_tick_info(majortick_iter) + + self.major_ticks.set_locs_angles(tick_loc_angle) + self.major_ticklabels.set_locs_angles_labels(ticklabel_loc_angle_label) + + self.major_ticks.draw(renderer) + self.major_ticklabels.draw(renderer) + + + # minor ticks + tick_loc_angle, ticklabel_loc_angle_label \ + = self._get_tick_info(minortick_iter) + + self.minor_ticks.set_locs_angles(tick_loc_angle) + self.minor_ticklabels.set_locs_angles_labels(ticklabel_loc_angle_label) + + self.minor_ticks.draw(renderer) + self.minor_ticklabels.draw(renderer) + + + if (self.major_ticklabels.get_visible() or self.minor_ticklabels.get_visible()): + self._draw_offsetText(renderer) + + return self.major_ticklabels.get_window_extents(renderer) + + + + + _offsetText_pos = dict(left=(0, 1, "bottom", "right"), + right=(1, 1, "bottom", "left"), + bottom=(1, 0, "top", "right"), + top=(1, 1, "bottom", "right")) + + def _init_offsetText(self, direction): + + x,y,va,ha = self._offsetText_pos[direction] + + self.offsetText = mtext.Annotation("", + xy=(x,y), xycoords="axes fraction", + xytext=(0,0), textcoords="offset points", + #fontproperties = fp, + color = rcParams['xtick.color'], + verticalalignment=va, + horizontalalignment=ha, + ) + self.offsetText.set_transform(IdentityTransform()) + self.axes._set_artist_props(self.offsetText) + + + def _update_offsetText(self): + self.offsetText.set_text( self.axis.major.formatter.get_offset() ) + self.offsetText.set_size(self.major_ticklabels.get_size()) + offset = self.major_ticklabels.get_pad() + self.major_ticklabels.get_size() + 2. + self.offsetText.xytext= (0, offset) + + + def _draw_offsetText(self, renderer): + self._update_offsetText() + self.offsetText.draw(renderer) + + + + def _init_label(self, **kw): + # x in axes coords, y in display coords (to be updated at draw + # time by _update_label_positions) + + labelsize = kw.get("labelsize", + rcParams['axes.labelsize']) + #labelcolor = kw.get("labelcolor", + # rcParams['axes.labelcolor']) + fontprops = font_manager.FontProperties(size=labelsize) + textprops = dict(fontproperties = fontprops) + #color = labelcolor) + + tr = self._axis_artist_helper.get_axislabel_transform(self.axes) \ + + self.offset_transform + + self.label = AxisLabel(0, 0, "__from_axes__", + color = "auto", #rcParams['axes.labelcolor'], + fontproperties=fontprops, + axis=self.axis, + transform=tr, + axis_direction=self._axis_direction, + ) + + self.label.set_figure(self.axes.figure) + + labelpad = kw.get("labelpad", 5) + self.label.set_pad(labelpad) + + def _draw_label(self, renderer): + + if not self.label.get_visible(): + return + + fontprops = font_manager.FontProperties(size=rcParams['axes.labelsize']) + + #pad_points = self.major_tick_pad + + #print self._ticklabel_add_angle - self._axislabel_add_angle + #if abs(self._ticklabel_add_angle - self._axislabel_add_angle)%360 > 90: + if self._ticklabel_add_angle != self._axislabel_add_angle: + if (self.major_ticks.get_visible() and not self.major_ticks.get_tick_out()) \ + or \ + (self.minor_ticks.get_visible() and not self.major_ticks.get_tick_out()): + axislabel_pad = self.major_ticks._ticksize + else: + axislabel_pad = 0 + else: + axislabel_pad = max([self.major_ticklabels._axislabel_pad, + self.minor_ticklabels._axislabel_pad]) + + + #label_offset = axislabel_pad + self.LABELPAD + + #self.label._set_offset_radius(label_offset) + self.label._set_external_pad(axislabel_pad) + + xy, angle_tangent = self._axis_artist_helper.get_axislabel_pos_angle(self.axes) + if xy is None: return + + angle_label = angle_tangent - 90 + + + x, y = xy + self.label._set_ref_angle(angle_label+self._axislabel_add_angle) + self.label.set(x=x, y=y) + self.label.draw(renderer) + + + + def set_label(self, s): + self.label.set_text(s) + + + @allow_rasterization + def draw(self, renderer): + 'Draw the axis lines, tick lines and labels' + + if not self.get_visible(): return + + renderer.open_group(__name__) + + self._axis_artist_helper.update_lim(self.axes) + + dpi_cor = renderer.points_to_pixels(1.) + self.dpi_transform.clear().scale(dpi_cor, dpi_cor) + + + self._draw_line(renderer) + + self._draw_ticks(renderer) + + #self._draw_offsetText(renderer) + self._draw_label(renderer) + + renderer.close_group(__name__) + + #def get_ticklabel_extents(self, renderer): + # pass + + def toggle(self, all=None, ticks=None, ticklabels=None, label=None): + """ + Toggle visibility of ticks, ticklabels, and (axis) label. + To turn all off, :: + + axis.toggle(all=False) + + To turn all off but ticks on :: + + axis.toggle(all=False, ticks=True) + + To turn all on but (axis) label off :: + + axis.toggle(all=True, label=False)) + + """ + if all: + _ticks, _ticklabels, _label = True, True, True + elif all is not None: + _ticks, _ticklabels, _label = False, False, False + else: + _ticks, _ticklabels, _label = None, None, None + + if ticks is not None: + _ticks = ticks + if ticklabels is not None: + _ticklabels = ticklabels + if label is not None: + _label = label + + if _ticks is not None: + self.major_ticks.set_visible(_ticks) + self.minor_ticks.set_visible(_ticks) + if _ticklabels is not None: + self.major_ticklabels.set_visible(_ticklabels) + self.minor_ticklabels.set_visible(_ticklabels) + if _label is not None: + self.label.set_visible(_label) + + + + + +def test_axis_artist(): + global axisline + + #self._axislines[loc] = new_fixed_axis(loc=loc, axes=axes) + from mpl_toolkits.axisartist import AxisArtistHelperRectlinear + fig = plt.figure(1) + fig.clf() + ax=fig.add_subplot(111) + ax.xaxis.set_visible(False) + ax.yaxis.set_visible(False) + + if 1: + + _helper = AxisArtistHelperRectlinear.Fixed(ax, loc="left") + axisline = AxisArtist(ax, _helper, offset=None, axis_direction="left") + ax.add_artist(axisline) + _helper = AxisArtistHelperRectlinear.Fixed(ax, loc="right") + axisline = AxisArtist(ax, _helper, offset=None, axis_direction="right") + ax.add_artist(axisline) + + _helper = AxisArtistHelperRectlinear.Fixed(ax, loc="bottom") + axisline = AxisArtist(ax, _helper, offset=None, axis_direction="bottom") + axisline.set_label("TTT") + #axisline.label.set_visible(False) + ax.add_artist(axisline) + + #axisline.major_ticklabels.set_axis_direction("bottom") + axisline.major_ticks.set_tick_out(False) + + ax.set_ylabel("Test") + + axisline.label.set_pad(5) + + + plt.draw() + +def test_axis_artist2(): + global axisline + + #self._axislines[loc] = new_fixed_axis(loc=loc, axes=axes) + from mpl_toolkits.axislines import AxisArtistHelperRectlinear + fig = plt.figure(1) + fig.clf() + ax=fig.add_subplot(111) + ax.xaxis.set_visible(False) + ax.yaxis.set_visible(False) + + + _helper = AxisArtistHelperRectlinear.Fixed(ax, loc="bottom") + axisline = AxisArtist(ax, _helper, offset=None, axis_direction="bottom") + axisline.set_label("TTT") + ax.add_artist(axisline) + + #axisline.major_ticklabels.set_axis_direction("bottom") + axisline.major_ticks.set_tick_out(False) + + + ax.set_ylabel("Test") + + plt.draw() + +if __name__ == "__main__": + #test_labelbase() + #test_ticklabels() + test_axis_artist() + #test_axis_artist2() + + +# DONE +# *. ticks, ticklabels, axislabels +# *. workon axisartist + +# TODO diff -Nru matplotlib-0.99.3/lib/mpl_toolkits/axisartist/axislines.py matplotlib-1.0.1/lib/mpl_toolkits/axisartist/axislines.py --- matplotlib-0.99.3/lib/mpl_toolkits/axisartist/axislines.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_toolkits/axisartist/axislines.py 2010-08-03 14:22:40.000000000 +0000 @@ -0,0 +1,848 @@ +""" +Axislines includes modified implementation of the Axes class. The +biggest difference is that the artists responsible to draw axis line, +ticks, ticklabel and axis labels are separated out from the mpl's Axis +class, which are much more than artists in the original +mpl. Originally, this change was motivated to support curvlinear +grid. Here are a few reasons that I came up with new axes class. + + + * "top" and "bottom" x-axis (or "left" and "right" y-axis) can have + different ticks (tick locations and labels). This is not possible + with the current mpl, although some twin axes trick can help. + + * Curvelinear grid. + + * angled ticks. + +In the new axes class, xaxis and yaxis is set to not visible by +default, and new set of artist (AxisArtist) are defined to draw axis +line, ticks, ticklabels and axis label. Axes.axis attribute serves as +a dictionary of these artists, i.e., ax.axis["left"] is a AxisArtist +instance responsible to draw left y-axis. The default Axes.axis contains +"bottom", "left", "top" and "right". + +AxisArtist can be considered as a container artist and +has following children artists which will draw ticks, labels, etc. + + * line + * major_ticks, major_ticklabels + * minor_ticks, minor_ticklabels + * offsetText + * label + +Note that these are separate artists from Axis class of the +original mpl, thus most of tick-related command in the original mpl +won't work, although some effort has made to work with. For example, +color and markerwidth of the ax.axis["bottom"].major_ticks will follow +those of Axes.xaxis unless explicitly specified. + +In addition to AxisArtist, the Axes will have *gridlines* attribute, +which obviously draws grid lines. The gridlines needs to be separated +from the axis as some gridlines can never pass any axis. + +""" + +import matplotlib.axes as maxes +import matplotlib.artist as martist +import matplotlib.text as mtext +import matplotlib.font_manager as font_manager + +from matplotlib.path import Path +from matplotlib.transforms import Affine2D, ScaledTranslation, \ + IdentityTransform, TransformedPath, Bbox +from matplotlib.collections import LineCollection + +from matplotlib import rcParams + +from matplotlib.artist import allow_rasterization + +import warnings + +import numpy as np + + +import matplotlib.lines as mlines +from axisline_style import AxislineStyle + + +from axis_artist import AxisArtist, GridlinesCollection + +class AxisArtistHelper(object): + """ + AxisArtistHelper should define + following method with given APIs. Note that the first axes argument + will be axes attribute of the caller artist. + + + # LINE (spinal line?) + + def get_line(self, axes): + # path : Path + return path + + def get_line_transform(self, axes): + # ... + # trans : transform + return trans + + # LABEL + + def get_label_pos(self, axes): + # x, y : position + return (x, y), trans + + + def get_label_offset_transform(self, \ + axes, + pad_points, fontprops, renderer, + bboxes, + ): + # va : vertical alignment + # ha : horizontal alignment + # a : angle + return trans, va, ha, a + + # TICK + + def get_tick_transform(self, axes): + return trans + + def get_tick_iterators(self, axes): + # iter : iteratoable object that yields (c, angle, l) where + # c, angle, l is position, tick angle, and label + + return iter_major, iter_minor + + + """ + + class _Base(object): + """ + Base class for axis helper. + """ + def __init__(self): + """ + """ + self.delta1, self.delta2 = 0.00001, 0.00001 + + def update_lim(self, axes): + pass + + + class Fixed(_Base): + """ + Helper class for a fixed (in the axes coordinate) axis. + """ + + _default_passthru_pt = dict(left=(0, 0), + right=(1, 0), + bottom=(0, 0), + top=(0, 1)) + + def __init__(self, + loc, nth_coord=None, + ): + """ + nth_coord = along which coordinate value varies + in 2d, nth_coord = 0 -> x axis, nth_coord = 1 -> y axis + """ + + self._loc = loc + + if loc not in ["left", "right", "bottom", "top"]: + raise ValueError("%s" % loc) + + if nth_coord is None: + if loc in ["left", "right"]: + nth_coord = 1 + elif loc in ["bottom", "top"]: + nth_coord = 0 + + self.nth_coord = nth_coord + + super(AxisArtistHelper.Fixed, self).__init__() + + self.passthru_pt = self._default_passthru_pt[loc] + + + + _verts = np.array([[0., 0.], + [1., 1.]]) + fixed_coord = 1-nth_coord + _verts[:,fixed_coord] = self.passthru_pt[fixed_coord] + + # axis line in transAxes + self._path = Path(_verts) + + + def get_nth_coord(self): + return self.nth_coord + + # LINE + + def get_line(self, axes): + return self._path + + def get_line_transform(self, axes): + return axes.transAxes + + # LABEL + + def get_axislabel_transform(self, axes): + return axes.transAxes + + def get_axislabel_pos_angle(self, axes): + """ + label reference position in transAxes. + + get_label_transform() returns a transform of (transAxes+offset) + """ + loc = self._loc + pos, angle_tangent = dict(left=((0., 0.5), 90), + right=((1., 0.5), 90), + bottom=((0.5, 0.), 0), + top=((0.5, 1.), 0))[loc] + + return pos, angle_tangent + + + + # TICK + + def get_tick_transform(self, axes): + trans_tick = [axes.get_xaxis_transform(), + axes.get_yaxis_transform()][self.nth_coord] + + return trans_tick + + + + class Floating(_Base): + def __init__(self, nth_coord, + value): + + self.nth_coord = nth_coord + + self._value = value + + super(AxisArtistHelper.Floating, + self).__init__() + + + def get_nth_coord(self): + return self.nth_coord + + def get_line(self, axes): + raise RuntimeError("get_line method should be defined by the derived class") + + + + +class AxisArtistHelperRectlinear: + + class Fixed(AxisArtistHelper.Fixed): + + def __init__(self, + axes, loc, nth_coord=None, + ): + """ + nth_coord = along which coordinate value varies + in 2d, nth_coord = 0 -> x axis, nth_coord = 1 -> y axis + """ + + super(AxisArtistHelperRectlinear.Fixed, self).__init__( \ + loc, nth_coord) + + self.axis = [axes.xaxis, axes.yaxis][self.nth_coord] + + + + # TICK + + def get_tick_iterators(self, axes): + """tick_loc, tick_angle, tick_label""" + + loc = self._loc + + if loc in ["bottom", "top"]: + angle_normal, angle_tangent = 90, 0 + else: + angle_normal, angle_tangent = 0, 90 + + major = self.axis.major + majorLocs = major.locator() + major.formatter.set_locs(majorLocs) + majorLabels = [major.formatter(val, i) for i, val in enumerate(majorLocs)] + + minor = self.axis.minor + minorLocs = minor.locator() + minor.formatter.set_locs(minorLocs) + minorLabels = [minor.formatter(val, i) for i, val in enumerate(minorLocs)] + + trans_tick = self.get_tick_transform(axes) + + tr2ax = trans_tick + axes.transAxes.inverted() + + def _f(locs, labels): + for x, l in zip(locs, labels): + + c = list(self.passthru_pt) # copy + c[self.nth_coord] = x + + # check if the tick point is inside axes + c2 = tr2ax.transform_point(c) + #delta=0.00001 + if 0. -self.delta1<= c2[self.nth_coord] <= 1.+self.delta2: + yield c, angle_normal, angle_tangent, l + + return _f(majorLocs, majorLabels), _f(minorLocs, minorLabels) + + + + class Floating(AxisArtistHelper.Floating): + def __init__(self, axes, nth_coord, + passingthrough_point, axis_direction="bottom"): + + super(AxisArtistHelperRectlinear.Floating, self).__init__( \ + nth_coord, passingthrough_point) + self._axis_direction = axis_direction + + self.axis = [axes.xaxis, axes.yaxis][self.nth_coord] + + + def get_line(self, axes): + _verts = np.array([[0., 0.], + [1., 1.]]) + + fixed_coord = 1-self.nth_coord + trans_passingthrough_point = axes.transData + axes.transAxes.inverted() + p = trans_passingthrough_point.transform_point([self._value, + self._value]) + _verts[:,fixed_coord] = p[fixed_coord] + + return Path(_verts) + + def get_line_transform(self, axes): + return axes.transAxes + + def get_axislabel_transform(self, axes): + return axes.transAxes + + def get_axislabel_pos_angle(self, axes): + """ + label reference position in transAxes. + + get_label_transform() returns a transform of (transAxes+offset) + """ + loc = self._axis_direction + #angle = dict(left=0, + # right=0, + # bottom=.5*np.pi, + # top=.5*np.pi)[loc] + + if self.nth_coord == 0: + angle = 0 + else: + angle = 90 + + _verts = [0.5, 0.5] + + fixed_coord = 1-self.nth_coord + trans_passingthrough_point = axes.transData + axes.transAxes.inverted() + p = trans_passingthrough_point.transform_point([self._value, + self._value]) + _verts[fixed_coord] = p[fixed_coord] + if not (0. <= _verts[fixed_coord] <= 1.): + return None, None + else: + return _verts, angle + + + + def get_tick_transform(self, axes): + return axes.transData + + + def get_tick_iterators(self, axes): + """tick_loc, tick_angle, tick_label""" + + loc = self._axis_direction + + if loc in ["bottom", "top"]: + angle_normal, angle_tangent = 90, 0 + else: + angle_normal, angle_tangent = 0, 90 + + if self.nth_coord == 0: + angle_normal, angle_tangent = 90, 0 + else: + angle_normal, angle_tangent = 0, 90 + + #angle = 90 - 90 * self.nth_coord + + major = self.axis.major + majorLocs = major.locator() + major.formatter.set_locs(majorLocs) + majorLabels = [major.formatter(val, i) for i, val in enumerate(majorLocs)] + + minor = self.axis.minor + minorLocs = minor.locator() + minor.formatter.set_locs(minorLocs) + minorLabels = [minor.formatter(val, i) for i, val in enumerate(minorLocs)] + + tr2ax = axes.transData + axes.transAxes.inverted() + + def _f(locs, labels): + for x, l in zip(locs, labels): + + c = [self._value, self._value] + c[self.nth_coord] = x + c1, c2 = tr2ax.transform_point(c) + if 0. <= c1 <= 1. and 0. <= c2 <= 1.: + if 0. - self.delta1 <= [c1, c2][self.nth_coord] <= 1. + self.delta2: + yield c, angle_normal, angle_tangent, l + + return _f(majorLocs, majorLabels), _f(minorLocs, minorLabels) + + + + + +class GridHelperBase(object): + + def __init__(self): + self._force_update = True + self._old_limits = None + super(GridHelperBase, self).__init__() + + + def update_lim(self, axes): + x1, x2 = axes.get_xlim() + y1, y2 = axes.get_ylim() + + if self._force_update or self._old_limits != (x1, x2, y1, y2): + self._update(x1, x2, y1, y2) + self._force_update = False + self._old_limits = (x1, x2, y1, y2) + + + def _update(self, x1, x2, y1, y2): + pass + + + def invalidate(self): + self._force_update = True + + def valid(self): + return not self._force_update + + + def get_gridlines(self): + return [] + + + +class GridHelperRectlinear(GridHelperBase): + + + def __init__(self, axes): + + super(GridHelperRectlinear, self).__init__() + self.axes = axes + + + + def new_fixed_axis(self, loc, + nth_coord=None, + axis_direction=None, + offset=None, + axes=None, + ): + + if axes is None: + warnings.warn("'new_fixed_axis' explicitly requires the axes keyword.") + axes = self.axes + + _helper = AxisArtistHelperRectlinear.Fixed(axes, loc, nth_coord) + + if axis_direction is None: + axis_direction = loc + axisline = AxisArtist(axes, _helper, offset=offset, + axis_direction=axis_direction, + ) + + return axisline + + + def new_floating_axis(self, nth_coord, value, + axis_direction="bottom", + axes=None, + ): + + if axes is None: + warnings.warn("'new_floating_axis' explicitly requires the axes keyword.") + axes = self.axes + + passthrough_point = (value, value) + transform = axes.transData + + _helper = AxisArtistHelperRectlinear.Floating( \ + axes, nth_coord, value, axis_direction) + + axisline = AxisArtist(axes, _helper) + + axisline.line.set_clip_on(True) + axisline.line.set_clip_box(axisline.axes.bbox) + return axisline + + + def get_gridlines(self): + """ + return list of gridline coordinates in data coordinates. + """ + + gridlines = [] + + locs = [] + y1, y2 = self.axes.get_ylim() + if self.axes.xaxis._gridOnMajor: + locs.extend(self.axes.xaxis.major.locator()) + if self.axes.xaxis._gridOnMinor: + locs.extend(self.axes.xaxis.minor.locator()) + + for x in locs: + gridlines.append([[x, x], [y1, y2]]) + + + x1, x2 = self.axes.get_xlim() + locs = [] + if self.axes.yaxis._gridOnMajor: + locs.extend(self.axes.yaxis.major.locator()) + if self.axes.yaxis._gridOnMinor: + locs.extend(self.axes.yaxis.minor.locator()) + + for y in locs: + gridlines.append([[x1, x2], [y, y]]) + + return gridlines + + + + + + +class SimpleChainedObjects(object): + def __init__(self, objects): + self._objects = objects + + def __getattr__(self, k): + _a = SimpleChainedObjects([getattr(a, k) for a in self._objects]) + return _a + + def __call__(self, *kl, **kwargs): + for m in self._objects: + m(*kl, **kwargs) + + +class Axes(maxes.Axes): + + class AxisDict(dict): + def __init__(self, axes): + self.axes = axes + super(Axes.AxisDict, self).__init__() + + def __getitem__(self, k): + if isinstance(k, tuple): + r = SimpleChainedObjects([dict.__getitem__(self, k1) for k1 in k]) + return r + elif isinstance(k, slice): + if k.start == None and k.stop == None and k.step == None: + r = SimpleChainedObjects(self.values()) + return r + else: + raise ValueError("Unsupported slice") + else: + return dict.__getitem__(self, k) + + def __call__(self, *v, **kwargs): + return maxes.Axes.axis(self.axes, *v, **kwargs) + + + def __init__(self, *kl, **kw): + + + helper = kw.pop("grid_helper", None) + + self._axisline_on = True + + if helper: + self._grid_helper = helper + else: + self._grid_helper = GridHelperRectlinear(self) + + super(Axes, self).__init__(*kl, **kw) + + self.toggle_axisline(True) + + + def toggle_axisline(self, b=None): + if b is None: + b = not self._axisline_on + if b: + self._axisline_on = True + for s in self.spines.values(): + s.set_visible(False) + self.xaxis.set_visible(False) + self.yaxis.set_visible(False) + else: + self._axisline_on = False + for s in self.spines.values(): + s.set_visible(True) + self.xaxis.set_visible(True) + self.yaxis.set_visible(True) + + + def _init_axis(self): + super(Axes, self)._init_axis() + + + def _init_axis_artists(self, axes=None): + if axes is None: + axes = self + + self._axislines = self.AxisDict(self) + new_fixed_axis = self.get_grid_helper().new_fixed_axis + for loc in ["bottom", "top", "left", "right"]: + self._axislines[loc] = new_fixed_axis(loc=loc, axes=axes, + axis_direction=loc) + + for axisline in [self._axislines["top"], self._axislines["right"]]: + axisline.label.set_visible(False) + axisline.major_ticklabels.set_visible(False) + axisline.minor_ticklabels.set_visible(False) + + def _get_axislines(self): + return self._axislines + + axis = property(_get_axislines) + + def _init_gridlines(self, grid_helper=None): + gridlines = GridlinesCollection(None, transform=self.transData, + colors=rcParams['grid.color'], + linestyles=rcParams['grid.linestyle'], + linewidths=rcParams['grid.linewidth']) + self._set_artist_props(gridlines) + if grid_helper is None: + grid_helper = self.get_grid_helper() + gridlines.set_grid_helper(grid_helper) + + self.axes._set_artist_props(gridlines) + # gridlines.set_clip_path(self.axes.patch) + # set_clip_path need to be defered after Axes.cla is completed. + # It is done inside the cla. + + self.gridlines = gridlines + + def cla(self): + # gridlines need to b created before cla() since cla calls grid() + + self._init_gridlines() + super(Axes, self).cla() + + # the clip_path should be set after Axes.cla() since that's + # when a patch is created. + self.gridlines.set_clip_path(self.axes.patch) + + self._init_axis_artists() + + def get_grid_helper(self): + return self._grid_helper + + + def grid(self, b=None, which='major', **kwargs): + """ + Toggel the gridlines, and optionally set the properties of the lines. + """ + # their are some discrepancy between the behavior of grid in + # axes_grid and the original mpl's grid, because axes_grid + # explicitly set the visibility of the gridlines. + + super(Axes, self).grid(b, **kwargs) + if not self._axisline_on: + return + + if b is None: + + if self.axes.xaxis._gridOnMinor or self.axes.xaxis._gridOnMajor or \ + self.axes.yaxis._gridOnMinor or self.axes.yaxis._gridOnMajor: + b=True + else: + b=False + + self.gridlines.set_visible(b) + + if len(kwargs): + martist.setp(self.gridlines, **kwargs) + + def get_children(self): + if self._axisline_on: + children = self._axislines.values()+[self.gridlines] + else: + children = [] + children.extend(super(Axes, self).get_children()) + return children + + def invalidate_grid_helper(self): + self._grid_helper.invalidate() + + + def new_fixed_axis(self, loc, offset=None): + gh = self.get_grid_helper() + axis = gh.new_fixed_axis(loc, + nth_coord=None, + axis_direction=None, + offset=offset, + axes=self, + ) + return axis + + + def new_floating_axis(self, nth_coord, value, + axis_direction="bottom", + ): + gh = self.get_grid_helper() + axis = gh.new_floating_axis(nth_coord, value, + axis_direction=axis_direction, + axes=self) + return axis + + + + def draw(self, renderer, inframe=False): + + if not self._axisline_on: + super(Axes, self).draw(renderer, inframe) + return + + orig_artists = self.artists + self.artists = self.artists + list(self._axislines.values()) + [self.gridlines] + + super(Axes, self).draw(renderer, inframe) + + self.artists = orig_artists + + + def get_tightbbox(self, renderer): + + bb0 = super(Axes, self).get_tightbbox(renderer) + + if not self._axisline_on: + return bb0 + + bb = [bb0] + + for axisline in self._axislines.values(): + if not axisline.get_visible(): + continue + + if axisline.label.get_visible(): + bb.append(axisline.label.get_window_extent(renderer)) + + + if axisline.major_ticklabels.get_visible(): + bb.extend(axisline.major_ticklabels.get_window_extents(renderer)) + if axisline.minor_ticklabels.get_visible(): + bb.extend(axisline.minor_ticklabels.get_window_extents(renderer)) + if axisline.major_ticklabels.get_visible() or \ + axisline.minor_ticklabels.get_visible(): + bb.append(axisline.offsetText.get_window_extent(renderer)) + + #bb.extend([c.get_window_extent(renderer) for c in artists \ + # if c.get_visible()]) + + _bbox = Bbox.union([b for b in bb if b.width!=0 or b.height!=0]) + + return _bbox + + + +Subplot = maxes.subplot_class_factory(Axes) + +class AxesZero(Axes): + def __init__(self, *kl, **kw): + + super(AxesZero, self).__init__(*kl, **kw) + + + def _init_axis_artists(self): + super(AxesZero, self)._init_axis_artists() + + new_floating_axis = self._grid_helper.new_floating_axis + xaxis_zero = new_floating_axis(nth_coord=0, + value=0., + axis_direction="bottom", + axes=self) + + xaxis_zero.line.set_clip_path(self.patch) + xaxis_zero.set_visible(False) + self._axislines["xzero"] = xaxis_zero + + yaxis_zero = new_floating_axis(nth_coord=1, + value=0., + axis_direction="left", + axes=self) + + + yaxis_zero.line.set_clip_path(self.patch) + yaxis_zero.set_visible(False) + self._axislines["yzero"] = yaxis_zero + +SubplotZero = maxes.subplot_class_factory(AxesZero) + + +if 0: +#if __name__ == "__main__": + import matplotlib.pyplot as plt + + fig = plt.figure(1, (4,3)) + + ax = SubplotZero(fig, 1, 1, 1) + fig.add_subplot(ax) + + ax.axis["xzero"].set_visible(True) + ax.axis["xzero"].label.set_text("Axis Zero") + + for n in ["top", "right"]: + ax.axis[n].set_visible(False) + + xx = np.arange(0, 2*np.pi, 0.01) + ax.plot(xx, np.sin(xx)) + ax.set_ylabel("Test") + plt.draw() + plt.show() + + +if __name__ == "__main__": +#if 1: + import matplotlib.pyplot as plt + + fig = plt.figure(1, (4,3)) + + ax = Subplot(fig, 1, 1, 1) + fig.add_subplot(ax) + + xx = np.arange(0, 2*np.pi, 0.01) + ax.plot(xx, np.sin(xx)) + ax.set_ylabel("Test") + + ax.axis["top"].major_ticks.set_tick_out(True) #set_tick_direction("out") + ax.axis["bottom"].major_ticks.set_tick_out(True) #set_tick_direction("out") + #ax.axis["bottom"].set_tick_direction("in") + + ax.axis["bottom"].set_label("Tk0") + + plt.draw() + plt.show() + + diff -Nru matplotlib-0.99.3/lib/mpl_toolkits/axisartist/axisline_style.py matplotlib-1.0.1/lib/mpl_toolkits/axisartist/axisline_style.py --- matplotlib-0.99.3/lib/mpl_toolkits/axisartist/axisline_style.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_toolkits/axisartist/axisline_style.py 2010-07-07 01:41:47.000000000 +0000 @@ -0,0 +1,164 @@ +from matplotlib.patches import _Style, FancyArrowPatch +from matplotlib.transforms import IdentityTransform +from matplotlib.path import Path +import numpy as np + +class _FancyAxislineStyle: + class SimpleArrow(FancyArrowPatch): + """ + The artist class that will be returend for SimpleArrow style. + """ + _ARROW_STYLE = "->" + + def __init__(self, axis_artist, line_path, transform, + line_mutation_scale): + self._axis_artist = axis_artist + self._line_transform = transform + self._line_path = line_path + self._line_mutation_scale = line_mutation_scale + + FancyArrowPatch.__init__(self, + path=self._line_path, + arrowstyle=self._ARROW_STYLE, + arrow_transmuter=None, + patchA=None, + patchB=None, + shrinkA=0., + shrinkB=0., + mutation_scale=line_mutation_scale, + mutation_aspect=None, + transform=IdentityTransform(), + ) + + def set_line_mutation_scale(self, scale): + self.set_mutation_scale(scale*self._line_mutation_scale) + + def _extend_path(self, path, mutation_size=10): + """ + Extend the path to make a room for drawing arrow. + """ + from matplotlib.bezier import get_cos_sin + + x0, y0 = path.vertices[-2] + x1, y1 = path.vertices[-1] + cost, sint = get_cos_sin(x0, y0, x1, y1) + + d = mutation_size * 1. + x2, y2 = x1 + cost*d, y1+sint*d + + if path.codes is None: + _path = Path(np.concatenate([path.vertices, [[x2, y2]]])) + else: + _path = Path(np.concatenate([path.vertices, [[x2, y2]]]), + np.concatenate([path.codes, [Path.LINETO]])) + + return _path + + def set_path(self, path): + self._line_path = path + + def draw(self, renderer): + """ + Draw the axis line. + 1) transform the path to the display cooridnate. + 2) extend the path to make a room for arrow + 3) update the path of the FancyArrowPatch. + 4) draw + """ + path_in_disp = self._line_transform.transform_path(self._line_path) + mutation_size = self.get_mutation_scale() #line_mutation_scale() + extented_path = self._extend_path(path_in_disp, + mutation_size=mutation_size) + + self._path_original = extented_path + FancyArrowPatch.draw(self, renderer) + + class FilledArrow(SimpleArrow): + """ + The artist class that will be returend for SimpleArrow style. + """ + _ARROW_STYLE = "-|>" + + +class AxislineStyle(_Style): + """ + :class:`AxislineStyle` is a container class which defines style classes + for AxisArtists. + + An instance of any axisline style class is an callable object, + whose call signature is :: + + __call__(self, axis_artist, path, transform) + + When called, this should return a mpl artist with following + methods implemented. :: + + def set_path(self, path): + # set the path for axisline. + + def set_line_mutation_scale(self, scale): + # set the scale + + def draw(self, renderer): + # draw + + + """ + + _style_list = {} + + + class _Base(object): + # The derived classes are required to be able to be initialized + # w/o arguments, i.e., all its argument (except self) must have + # the default values. + + def __init__(self): + """ + initializtion. + """ + super(AxislineStyle._Base, self).__init__() + + + + + def __call__(self, axis_artist, transform): + """ + Given the AxisArtist instance, and transform for the path + (set_path method), return the mpl artist for drawing the axis line. + """ + + return self.new_line(axis_artist, transform) + + + class SimpleArrow(_Base): + """ + A simple arrow. + """ + + ArrowAxisClass = _FancyAxislineStyle.SimpleArrow + + def __init__(self, size=1): + """ + *size* + size of the arrow as a fraction of the ticklabel size. + """ + + self.size = size + super(AxislineStyle.SimpleArrow, self).__init__() + + def new_line(self, axis_artist, transform): + + linepath = Path([(0,0), (0, 1)]) + axisline = self.ArrowAxisClass(axis_artist, linepath, transform, + line_mutation_scale=self.size) + return axisline + + + _style_list["->"] = SimpleArrow + + class FilledArrow(SimpleArrow): + ArrowAxisClass = _FancyAxislineStyle.FilledArrow + + _style_list["-|>"] = FilledArrow + diff -Nru matplotlib-0.99.3/lib/mpl_toolkits/axisartist/clip_path.py matplotlib-1.0.1/lib/mpl_toolkits/axisartist/clip_path.py --- matplotlib-0.99.3/lib/mpl_toolkits/axisartist/clip_path.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_toolkits/axisartist/clip_path.py 2010-07-07 01:41:47.000000000 +0000 @@ -0,0 +1,127 @@ +import numpy as np +from math import degrees +import math + +def atan2(dy, dx): + if dx == 0 and dx == 0: + print "warning" + return 0 + else: + return math.atan2(dy, dx) + +# FIXME : The current algorithm seems to return incorrect angle when the line +# ends at the boudnary. + +def clip(xlines, ylines, x0, clip="right"): + + clipped_xlines = [] + clipped_ylines = [] + + _pos_angles = [] + + for x, y in zip(xlines, ylines): + + if clip in ["up", "right"]: + b = (x < x0).astype("i") + db = b[1:] - b[:-1] + else: + b = (x > x0).astype("i") + db = b[1:] - b[:-1] + + + if b[0]: + ns = 0 + else: + ns = -1 + segx, segy = [], [] + for (i,) in np.argwhere(db!=0): + c = db[i] + if c == -1: + dx = (x0 - x[i]) + dy = (y[i+1] - y[i]) * (dx/ (x[i+1] - x[i])) + y0 = y[i] + dy + clipped_xlines.append(np.concatenate([segx, x[ns:i+1], [x0]])) + clipped_ylines.append(np.concatenate([segy, y[ns:i+1], [y0]])) + ns = -1 + segx, segy = [], [] + + if dx == 0. and dy == 0: + dx = x[i+1] - x[i] + dy = y[i+1] - y[i] + + a = degrees(atan2(dy, dx)) + _pos_angles.append((x0, y0, a)) + + elif c == 1: + dx = (x0 - x[i]) + dy = (y[i+1] - y[i]) * (dx / (x[i+1] - x[i])) + y0 = y[i] + dy + segx, segy = [x0], [y0] + ns = i+1 + + if dx == 0. and dy == 0: + dx = x[i+1] - x[i] + dy = y[i+1] - y[i] + + a = degrees(atan2(dy, dx)) + _pos_angles.append((x0, y0, a)) + + #print x[i], x[i+1] + + if ns != -1: + clipped_xlines.append(np.concatenate([segx, x[ns:]])) + clipped_ylines.append(np.concatenate([segy, y[ns:]])) + + #clipped_pos_angles.append(_pos_angles) + + + return clipped_xlines, clipped_ylines, _pos_angles + + +def clip_line_to_rect(xline, yline, bbox): + + x0, y0, x1, y1 = bbox.extents + + lx1, ly1, c_right_ = clip([xline], [yline], x1, clip="right") + lx2, ly2, c_left_ = clip(lx1, ly1, x0, clip="left") + ly3, lx3, c_top_ = clip(ly2, lx2, y1, clip="right") + ly4, lx4, c_bottom_ = clip(ly3, lx3, y0, clip="left") + + #c_left = [((x, y), (a+90)%180-180) for (x, y, a) in c_left_ \ + # if bbox.containsy(y)] + c_left = [((x, y), (a+90)%180-90) for (x, y, a) in c_left_ \ + if bbox.containsy(y)] + c_bottom = [((x, y), (90 - a)%180) for (y, x, a) in c_bottom_ \ + if bbox.containsx(x)] + c_right = [((x, y), (a+90)%180+90) for (x, y, a) in c_right_ \ + if bbox.containsy(y)] + c_top = [((x, y), (90 - a)%180+180) for (y, x, a) in c_top_ \ + if bbox.containsx(x)] + + return zip(lx4, ly4), [c_left, c_bottom, c_right, c_top] + + +if __name__ == "__main__": + + import matplotlib.pyplot as plt + + x = np.array([-3, -2, -1, 0., 1, 2, 3, 2, 1, 0, -1, -2, -3, 5]) + #x = np.array([-3, -2, -1, 0., 1, 2, 3]) + y = np.arange(len(x)) + #x0 = 2 + + plt.plot(x, y, lw=1) + + from matplotlib.transforms import Bbox + bb = Bbox.from_extents(-2, 3, 2, 12.5) + lxy, ticks = clip_line_to_rect(x, y, bb) + for xx, yy in lxy: + plt.plot(xx, yy, lw=1, color="g") + + ccc = iter(["ro", "go", "rx", "bx"]) + for ttt in ticks: + cc = ccc.next() + for (xx, yy), aa in ttt: + plt.plot([xx], [yy], cc) + + #xlim( diff -Nru matplotlib-0.99.3/lib/mpl_toolkits/axisartist/floating_axes.py matplotlib-1.0.1/lib/mpl_toolkits/axisartist/floating_axes.py --- matplotlib-0.99.3/lib/mpl_toolkits/axisartist/floating_axes.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_toolkits/axisartist/floating_axes.py 2010-07-07 01:41:47.000000000 +0000 @@ -0,0 +1,721 @@ +""" +An experimental support for curvelinear grid. +""" + + +# TODO : + +# *. see if tick_iterator method can be simplified by reusing the parent method. + +from itertools import chain +from grid_finder import GridFinder + +from axislines import AxisArtistHelper, GridHelperBase +from axis_artist import AxisArtist +from matplotlib.transforms import Affine2D, IdentityTransform +import numpy as np + + +import grid_helper_curvelinear + +class FloatingAxisArtistHelper(grid_helper_curvelinear.FloatingAxisArtistHelper): + pass + +class FixedAxisArtistHelper(grid_helper_curvelinear.FloatingAxisArtistHelper): + + + def __init__(self, grid_helper, side, nth_coord_ticks=None): + """ + nth_coord = along which coordinate value varies. + nth_coord = 0 -> x axis, nth_coord = 1 -> y axis + """ + + value, nth_coord = grid_helper.get_data_boundary(side) # return v= 0 , nth=1, extremes of the other coordinate. + super(FixedAxisArtistHelper, self).__init__(grid_helper, + nth_coord, + value, + axis_direction=side, + ) + #self.grid_helper = grid_helper + if nth_coord_ticks is None: + nth_coord_ticks = nth_coord + self.nth_coord_ticks = nth_coord_ticks + + self.value = value + self.grid_helper = grid_helper + self._side = side + + + def update_lim(self, axes): + self.grid_helper.update_lim(axes) + + self.grid_info = self.grid_helper.grid_info + + + + def get_axislabel_pos_angle(self, axes): + + extremes = self.grid_info["extremes"] + + if self.nth_coord == 0: + xx0 = self.value + yy0 = (extremes[2]+extremes[3])/2. + dxx, dyy = 0., abs(extremes[2]-extremes[3])/1000. + elif self.nth_coord == 1: + xx0 = (extremes[0]+extremes[1])/2. + yy0 = self.value + dxx, dyy = abs(extremes[0]-extremes[1])/1000., 0. + + grid_finder = self.grid_helper.grid_finder + xx1, yy1 = grid_finder.transform_xy([xx0], [yy0]) + + trans_passingthrough_point = axes.transData + axes.transAxes.inverted() + p = trans_passingthrough_point.transform_point([xx1[0], yy1[0]]) + + + if (0. <= p[0] <= 1.) and (0. <= p[1] <= 1.): + xx1c, yy1c = axes.transData.transform_point([xx1[0], yy1[0]]) + xx2, yy2 = grid_finder.transform_xy([xx0+dxx], [yy0+dyy]) + xx2c, yy2c = axes.transData.transform_point([xx2[0], yy2[0]]) + + return (xx1c, yy1c), np.arctan2(yy2c-yy1c, xx2c-xx1c)/np.pi*180. + else: + return None, None + + + + def get_tick_transform(self, axes): + return IdentityTransform() #axes.transData + + def get_tick_iterators(self, axes): + """tick_loc, tick_angle, tick_label, (optionally) tick_label""" + + + grid_finder = self.grid_helper.grid_finder + + lat_levs, lat_n, lat_factor = self.grid_info["lat_info"] + lon_levs, lon_n, lon_factor = self.grid_info["lon_info"] + + lon_levs, lat_levs = np.asarray(lon_levs), np.asarray(lat_levs) + if lat_factor is not None: + yy0 = lat_levs / lat_factor + dy = 0.001 / lat_factor + else: + yy0 = lat_levs + dy = 0.001 + + if lon_factor is not None: + xx0 = lon_levs / lon_factor + dx = 0.001 / lon_factor + else: + xx0 = lon_levs + dx = 0.001 + + _extremes = self.grid_helper._extremes + xmin, xmax = sorted(_extremes[:2]) + ymin, ymax = sorted(_extremes[2:]) + if self.nth_coord == 0: + mask = (ymin <= yy0) & (yy0 <= ymax) + yy0 = yy0[mask] + elif self.nth_coord == 1: + mask = (xmin <= xx0) & (xx0 <= xmax) + xx0 = xx0[mask] + + def transform_xy(x, y): + x1, y1 = grid_finder.transform_xy(x, y) + x2y2 = axes.transData.transform(np.array([x1, y1]).transpose()) + x2, y2 = x2y2.transpose() + return x2, y2 + + # find angles + if self.nth_coord == 0: + xx0 = np.empty_like(yy0) + xx0.fill(self.value) + + #yy0_ = yy0.copy() + + xx1, yy1 = transform_xy(xx0, yy0) + + xx00 = xx0.copy() + xx00[xx0+dx>xmax] -= dx + xx1a, yy1a = transform_xy(xx00, yy0) + xx1b, yy1b = transform_xy(xx00+dx, yy0) + + yy00 = yy0.copy() + yy00[yy0+dy>ymax] -= dy + xx2a, yy2a = transform_xy(xx0, yy00) + xx2b, yy2b = transform_xy(xx0, yy00+dy) + + labels = self.grid_info["lat_labels"] + labels = [l for l, m in zip(labels, mask) if m] + + elif self.nth_coord == 1: + yy0 = np.empty_like(xx0) + yy0.fill(self.value) + + #xx0_ = xx0.copy() + xx1, yy1 = transform_xy(xx0, yy0) + + + yy00 = yy0.copy() + yy00[yy0+dy>ymax] -= dy + xx1a, yy1a = transform_xy(xx0, yy00) + xx1b, yy1b = transform_xy(xx0, yy00+dy) + + xx00 = xx0.copy() + xx00[xx0+dx>xmax] -= dx + xx2a, yy2a = transform_xy(xx00, yy0) + xx2b, yy2b = transform_xy(xx00+dx, yy0) + + labels = self.grid_info["lon_labels"] + labels = [l for l, m in zip(labels, mask) if m] + + + def f1(): + dd = np.arctan2(yy1b-yy1a, xx1b-xx1a) # angle normal + dd2 = np.arctan2(yy2b-yy2a, xx2b-xx2a) # angle tangent + mm = ((yy1b-yy1a)==0.) & ((xx1b-xx1a)==0.) # mask where dd1 is not defined + dd[mm] = dd2[mm]+3.14159/2. + + #dd += 3.14159 + #dd = np.arctan2(xx2-xx1, angle_tangent-yy1) + trans_tick = self.get_tick_transform(axes) + tr2ax = trans_tick + axes.transAxes.inverted() + for x, y, d, d2, lab in zip(xx1, yy1, dd, dd2, labels): + c2 = tr2ax.transform_point((x, y)) + delta=0.00001 + if (0. -delta<= c2[0] <= 1.+delta) and \ + (0. -delta<= c2[1] <= 1.+delta): + d1 = d/3.14159*180. + d2 = d2/3.14159*180. + #_mod = (d2-d1+180)%360 + #if _mod < 180: + # d1 += 180 + ##_div, _mod = divmod(d2-d1, 360) + yield [x, y], d1, d2, lab + #, d2/3.14159*180.+da) + + return f1(), iter([]) + + def get_line_transform(self, axes): + return axes.transData + + def get_line(self, axes): + + self.update_lim(axes) + from matplotlib.path import Path + k, v = dict(left=("lon_lines0", 0), + right=("lon_lines0", 1), + bottom=("lat_lines0", 0), + top=("lat_lines0", 1))[self._side] + + xx, yy = self.grid_info[k][v] + return Path(zip(xx, yy)) + + + +from grid_finder import ExtremeFinderSimple + +class ExtremeFinderFixed(ExtremeFinderSimple): + def __init__(self, extremes): + self._extremes = extremes + + def __call__(self, transform_xy, x1, y1, x2, y2): + """ + get extreme values. + + x1, y1, x2, y2 in image coordinates (0-based) + nx, ny : number of dvision in each axis + """ + #lon_min, lon_max, lat_min, lat_max = self._extremes + return self._extremes + + + +class GridHelperCurveLinear(grid_helper_curvelinear.GridHelperCurveLinear): + + def __init__(self, aux_trans, extremes, + grid_locator1=None, + grid_locator2=None, + tick_formatter1=None, + tick_formatter2=None): + """ + aux_trans : a transform from the source (curved) coordinate to + target (rectlinear) coordinate. An instance of MPL's Transform + (inverse transform should be defined) or a tuple of two callable + objects which defines the transform and its inverse. The callables + need take two arguments of array of source coordinates and + should return two target coordinates: + e.g. x2, y2 = trans(x1, y1) + """ + + self._old_values = None + + self._extremes = extremes + extreme_finder = ExtremeFinderFixed(extremes) + + super(GridHelperCurveLinear, self).__init__(aux_trans, + extreme_finder, + grid_locator1=grid_locator1, + grid_locator2=grid_locator2, + tick_formatter1=tick_formatter1, + tick_formatter2=tick_formatter2) + + + # def update_grid_finder(self, aux_trans=None, **kw): + + # if aux_trans is not None: + # self.grid_finder.update_transform(aux_trans) + + # self.grid_finder.update(**kw) + # self.invalidate() + + + # def _update(self, x1, x2, y1, y2): + # "bbox in 0-based image coordinates" + # # update wcsgrid + + # if self.valid() and self._old_values == (x1, x2, y1, y2): + # return + + # self._update_grid(x1, y1, x2, y2) + + # self._old_values = (x1, x2, y1, y2) + + # self._force_update = False + + + def get_data_boundary(self, side): + """ + return v= 0 , nth=1 + """ + lon1, lon2, lat1, lat2 = self._extremes + return dict(left=(lon1, 0), + right=(lon2, 0), + bottom=(lat1, 1), + top=(lat2, 1))[side] + + + def new_fixed_axis(self, loc, + nth_coord=None, + axis_direction=None, + offset=None, + axes=None): + + if axes is None: + axes = self.axes + + if axis_direction is None: + axis_direction = loc + + _helper = FixedAxisArtistHelper(self, loc, + nth_coord_ticks=nth_coord) + + + axisline = AxisArtist(axes, _helper, axis_direction=axis_direction) + axisline.line.set_clip_on(True) + axisline.line.set_clip_box(axisline.axes.bbox) + + + return axisline + + + # new_floating_axis will inheirt the grid_helper's extremes. + + # def new_floating_axis(self, nth_coord, + # value, + # axes=None, + # axis_direction="bottom" + # ): + + # axis = super(GridHelperCurveLinear, + # self).new_floating_axis(nth_coord, + # value, axes=axes, + # axis_direction=axis_direction) + + # # set extreme values of the axis helper + # if nth_coord == 1: + # axis.get_helper().set_extremes(*self._extremes[:2]) + # elif nth_coord == 0: + # axis.get_helper().set_extremes(*self._extremes[2:]) + + # return axis + + + def _update_grid(self, x1, y1, x2, y2): + + #self.grid_info = self.grid_finder.get_grid_info(x1, y1, x2, y2) + + if self.grid_info is None: + self.grid_info = dict() + + grid_info = self.grid_info + + grid_finder = self.grid_finder + extremes = grid_finder.extreme_finder(grid_finder.inv_transform_xy, + x1, y1, x2, y2) + + lon_min, lon_max = sorted(extremes[:2]) + lat_min, lat_max = sorted(extremes[2:]) + lon_levs, lon_n, lon_factor = \ + grid_finder.grid_locator1(lon_min, lon_max) + lat_levs, lat_n, lat_factor = \ + grid_finder.grid_locator2(lat_min, lat_max) + grid_info["extremes"] = lon_min, lon_max, lat_min, lat_max #extremes + + grid_info["lon_info"] = lon_levs, lon_n, lon_factor + grid_info["lat_info"] = lat_levs, lat_n, lat_factor + + grid_info["lon_labels"] = grid_finder.tick_formatter1("bottom", + lon_factor, + lon_levs) + + grid_info["lat_labels"] = grid_finder.tick_formatter2("bottom", + lat_factor, + lat_levs) + + if lon_factor is None: + lon_values = np.asarray(lon_levs[:lon_n]) + else: + lon_values = np.asarray(lon_levs[:lon_n]/lon_factor) + if lat_factor is None: + lat_values = np.asarray(lat_levs[:lat_n]) + else: + lat_values = np.asarray(lat_levs[:lat_n]/lat_factor) + + lon_values0 = lon_values[(lon_min x axis, nth_coord = 1 -> y axis + """ + + super(FixedAxisArtistHelper, self).__init__( \ + loc=side, + ) + + self.grid_helper = grid_helper + if nth_coord_ticks is None: + nth_coord_ticks = self.nth_coord + self.nth_coord_ticks = nth_coord_ticks + + self.side = side + + def update_lim(self, axes): + self.grid_helper.update_lim(axes) + + def change_tick_coord(self, coord_number=None): + if coord_number is None: + self.nth_coord_ticks = 1 - self.nth_coord_ticks + elif coord_number in [0, 1]: + self.nth_coord_ticks = coord_number + else: + raise Exception("wrong coord number") + + + def get_tick_transform(self, axes): + return axes.transData + + def get_tick_iterators(self, axes): + """tick_loc, tick_angle, tick_label""" + + g = self.grid_helper + + ti1 = g.get_tick_iterator(self.nth_coord_ticks, self.side) + ti2 = g.get_tick_iterator(1-self.nth_coord_ticks, self.side, minor=True) + + #ti2 = g.get_tick_iterator(1-self.nth_coord_ticks, self.side, minor=True) + + return chain(ti1, ti2), iter([]) + + +class FloatingAxisArtistHelper(AxisArtistHelper.Floating): + + def __init__(self, grid_helper, nth_coord, value, axis_direction=None): + """ + nth_coord = along which coordinate value varies. + nth_coord = 0 -> x axis, nth_coord = 1 -> y axis + """ + + super(FloatingAxisArtistHelper, self).__init__(nth_coord, + value, + ) + self.value = value + self.grid_helper = grid_helper + self._extremes = None, None + + + def set_extremes(self, e1, e2): + self._extremes = e1, e2 + + def update_lim(self, axes): + self.grid_helper.update_lim(axes) + + x1, x2 = axes.get_xlim() + y1, y2 = axes.get_ylim() + grid_finder = self.grid_helper.grid_finder + extremes = grid_finder.extreme_finder(grid_finder.inv_transform_xy, + x1, y1, x2, y2) + + extremes = list(extremes) + e1, e2 = self._extremes # ranges of other coordinates + if self.nth_coord == 0: + if e1 is not None: + extremes[2] = max(e1, extremes[2]) + if e2 is not None: + extremes[3] = min(e2, extremes[3]) + elif self.nth_coord == 1: + if e1 is not None: + extremes[0] = max(e1, extremes[0]) + if e2 is not None: + extremes[1] = min(e2, extremes[1]) + + grid_info = dict() + lon_min, lon_max, lat_min, lat_max = extremes + lon_levs, lon_n, lon_factor = \ + grid_finder.grid_locator1(lon_min, lon_max) + lat_levs, lat_n, lat_factor = \ + grid_finder.grid_locator2(lat_min, lat_max) + grid_info["extremes"] = extremes + + grid_info["lon_info"] = lon_levs, lon_n, lon_factor + grid_info["lat_info"] = lat_levs, lat_n, lat_factor + + grid_info["lon_labels"] = grid_finder.tick_formatter1("bottom", + lon_factor, + lon_levs) + + grid_info["lat_labels"] = grid_finder.tick_formatter2("bottom", + lat_factor, + lat_levs) + + grid_finder = self.grid_helper.grid_finder + + #e1, e2 = self._extremes # ranges of other coordinates + if self.nth_coord == 0: + xx0 = np.linspace(self.value, self.value, 100) + yy0 = np.linspace(extremes[2], extremes[3], 100) + xx, yy = grid_finder.transform_xy(xx0, yy0) + elif self.nth_coord == 1: + xx0 = np.linspace(extremes[0], extremes[1], 100) + yy0 = np.linspace(self.value, self.value, 100) + xx, yy = grid_finder.transform_xy(xx0, yy0) + + grid_info["line_xy"] = xx, yy + self.grid_info = grid_info + + def get_axislabel_transform(self, axes): + return Affine2D() #axes.transData + + def get_axislabel_pos_angle(self, axes): + + extremes = self.grid_info["extremes"] + + if self.nth_coord == 0: + xx0 = self.value + yy0 = (extremes[2]+extremes[3])/2. + dxx, dyy = 0., abs(extremes[2]-extremes[3])/1000. + elif self.nth_coord == 1: + xx0 = (extremes[0]+extremes[1])/2. + yy0 = self.value + dxx, dyy = abs(extremes[0]-extremes[1])/1000., 0. + + grid_finder = self.grid_helper.grid_finder + xx1, yy1 = grid_finder.transform_xy([xx0], [yy0]) + + trans_passingthrough_point = axes.transData + axes.transAxes.inverted() + p = trans_passingthrough_point.transform_point([xx1[0], yy1[0]]) + + + if (0. <= p[0] <= 1.) and (0. <= p[1] <= 1.): + xx1c, yy1c = axes.transData.transform_point([xx1[0], yy1[0]]) + xx2, yy2 = grid_finder.transform_xy([xx0+dxx], [yy0+dyy]) + xx2c, yy2c = axes.transData.transform_point([xx2[0], yy2[0]]) + + return (xx1c, yy1c), np.arctan2(yy2c-yy1c, xx2c-xx1c)/np.pi*180. + else: + return None, None + + + + + def get_tick_transform(self, axes): + return IdentityTransform() #axes.transData + + def get_tick_iterators(self, axes): + """tick_loc, tick_angle, tick_label, (optionally) tick_label""" + + grid_finder = self.grid_helper.grid_finder + + lat_levs, lat_n, lat_factor = self.grid_info["lat_info"] + lat_levs = np.asarray(lat_levs) + if lat_factor is not None: + yy0 = lat_levs / lat_factor + dy = 0.01 / lat_factor + else: + yy0 = lat_levs + dy = 0.01 + + lon_levs, lon_n, lon_factor = self.grid_info["lon_info"] + lon_levs = np.asarray(lon_levs) + if lon_factor is not None: + xx0 = lon_levs / lon_factor + dx = 0.01 / lon_factor + else: + xx0 = lon_levs + dx = 0.01 + + e0, e1 = sorted(self._extremes) + if e0 is None: + e0 = -np.inf + if e1 is None: + e1 = np.inf + + if self.nth_coord == 0: + mask = (e0 <= yy0) & (yy0 <= e1) + #xx0, yy0 = xx0[mask], yy0[mask] + yy0 = yy0[mask] + elif self.nth_coord == 1: + mask = (e0 <= xx0) & (xx0 <= e1) + #xx0, yy0 = xx0[mask], yy0[mask] + xx0 = xx0[mask] + + def transform_xy(x, y): + x1, y1 = grid_finder.transform_xy(x, y) + x2y2 = axes.transData.transform(np.array([x1, y1]).transpose()) + x2, y2 = x2y2.transpose() + return x2, y2 + + # find angles + if self.nth_coord == 0: + xx0 = np.empty_like(yy0) + xx0.fill(self.value) + + xx1, yy1 = transform_xy(xx0, yy0) + + xx00 = xx0.copy() + xx00[xx0+dx>e1] -= dx + xx1a, yy1a = transform_xy(xx00, yy0) + xx1b, yy1b = transform_xy(xx00+dx, yy0) + + xx2a, yy2a = transform_xy(xx0, yy0) + xx2b, yy2b = transform_xy(xx0, yy0+dy) + + labels = self.grid_info["lat_labels"] + labels = [l for l, m in zip(labels, mask) if m] + + elif self.nth_coord == 1: + yy0 = np.empty_like(xx0) + yy0.fill(self.value) + + xx1, yy1 = transform_xy(xx0, yy0) + + xx1a, yy1a = transform_xy(xx0, yy0) + xx1b, yy1b = transform_xy(xx0, yy0+dy) + + xx00 = xx0.copy() + xx00[xx0+dx>e1] -= dx + xx2a, yy2a = transform_xy(xx00, yy0) + xx2b, yy2b = transform_xy(xx00+dx, yy0) + + labels = self.grid_info["lon_labels"] + labels = [l for l, m in zip(labels, mask) if m] + + + def f1(): + dd = np.arctan2(yy1b-yy1a, xx1b-xx1a) # angle normal + dd2 = np.arctan2(yy2b-yy2a, xx2b-xx2a) # angle tangent + mm = ((yy1b-yy1a)==0.) & ((xx1b-xx1a)==0.) # mask where dd1 is not defined + dd[mm] = dd2[mm]+3.14159/2. + #dd = np.arctan2(yy2-yy1, xx2-xx1) # angle normal + #dd2 = np.arctan2(yy3-yy1, xx3-xx1) # angle tangent + #mm = ((yy2-yy1)==0.) & ((xx2-xx1)==0.) # mask where dd1 is not defined + #dd[mm] = dd2[mm]+3.14159/2. + + #dd += 3.14159 + + #dd = np.arctan2(xx2-xx1, angle_tangent-yy1) + trans_tick = self.get_tick_transform(axes) + tr2ax = trans_tick + axes.transAxes.inverted() + for x, y, d, d2, lab in zip(xx1, yy1, dd, dd2, labels): + c2 = tr2ax.transform_point((x, y)) + delta=0.00001 + if (0. -delta<= c2[0] <= 1.+delta) and \ + (0. -delta<= c2[1] <= 1.+delta): + d1 = d/3.14159*180. + d2 = d2/3.14159*180. + yield [x, y], d1, d2, lab + + return f1(), iter([]) + + def get_line_transform(self, axes): + return axes.transData + + def get_line(self, axes): + self.update_lim(axes) + from matplotlib.path import Path + xx, yy = self.grid_info["line_xy"] + + return Path(zip(xx, yy)) + + + + +class GridHelperCurveLinear(GridHelperBase): + + def __init__(self, aux_trans, + extreme_finder=None, + grid_locator1=None, + grid_locator2=None, + tick_formatter1=None, + tick_formatter2=None): + """ + aux_trans : a transform from the source (curved) coordinate to + target (rectlinear) coordinate. An instance of MPL's Transform + (inverse transform should be defined) or a tuple of two callable + objects which defines the transform and its inverse. The callables + need take two arguments of array of source coordinates and + should return two target coordinates: + e.g. x2, y2 = trans(x1, y1) + """ + super(GridHelperCurveLinear, self).__init__() + + self.grid_info = None + self._old_values = None + #self._grid_params = dict() + self._aux_trans = aux_trans + + self.grid_finder = GridFinder(aux_trans, + extreme_finder, + grid_locator1, + grid_locator2, + tick_formatter1, + tick_formatter2) + + + def update_grid_finder(self, aux_trans=None, **kw): + + if aux_trans is not None: + self.grid_finder.update_transform(aux_trans) + + self.grid_finder.update(**kw) + self.invalidate() + + + def _update(self, x1, x2, y1, y2): + "bbox in 0-based image coordinates" + # update wcsgrid + + if self.valid() and self._old_values == (x1, x2, y1, y2): + return + + self._update_grid(x1, y1, x2, y2) + + self._old_values = (x1, x2, y1, y2) + + self._force_update = False + + + def new_fixed_axis(self, loc, + nth_coord=None, + axis_direction=None, + offset=None, + axes=None): + + + if axes is None: + axes = self.axes + + if axis_direction is None: + axis_direction = loc + _helper = FixedAxisArtistHelper(self, loc, + #nth_coord, + nth_coord_ticks=nth_coord, + ) + + axisline = AxisArtist(axes, _helper, axis_direction=axis_direction) + + return axisline + + + def new_floating_axis(self, nth_coord, + value, + axes=None, + axis_direction="bottom" + ): + + if axes is None: + axes = self.axes + + _helper = FloatingAxisArtistHelper( \ + self, nth_coord, value, axis_direction) + + axisline = AxisArtist(axes, _helper) + + #_helper = FloatingAxisArtistHelper(self, nth_coord, + # value, + # label_direction=label_direction, + # ) + + #axisline = AxisArtistFloating(axes, _helper, + # axis_direction=axis_direction) + axisline.line.set_clip_on(True) + axisline.line.set_clip_box(axisline.axes.bbox) + #axisline.major_ticklabels.set_visible(True) + #axisline.minor_ticklabels.set_visible(False) + + #axisline.major_ticklabels.set_rotate_along_line(True) + #axisline.set_rotate_label_along_line(True) + + return axisline + + + def _update_grid(self, x1, y1, x2, y2): + + self.grid_info = self.grid_finder.get_grid_info(x1, y1, x2, y2) + + + def get_gridlines(self): + grid_lines = [] + for gl in self.grid_info["lat"]["lines"]: + grid_lines.extend(gl) + for gl in self.grid_info["lon"]["lines"]: + grid_lines.extend(gl) + + return grid_lines + + + def get_tick_iterator(self, nth_coord, axis_side, minor=False): + + #axisnr = dict(left=0, bottom=1, right=2, top=3)[axis_side] + angle_tangent = dict(left=90, right=90, bottom=0, top=0)[axis_side] + #angle = [0, 90, 180, 270][axisnr] + lon_or_lat = ["lon", "lat"][nth_coord] + if not minor: # major ticks + def f(): + for (xy, a), l in zip(self.grid_info[lon_or_lat]["tick_locs"][axis_side], + self.grid_info[lon_or_lat]["tick_labels"][axis_side]): + angle_normal = a + yield xy, angle_normal, angle_tangent, l + else: + def f(): + for (xy, a), l in zip(self.grid_info[lon_or_lat]["tick_locs"][axis_side], + self.grid_info[lon_or_lat]["tick_labels"][axis_side]): + angle_normal = a + yield xy, angle_normal, angle_tangent, "" + #for xy, a, l in self.grid_info[lon_or_lat]["ticks"][axis_side]: + # yield xy, a, "" + + return f() + + + +def test3(): + + import numpy as np + from matplotlib.transforms import Transform + from matplotlib.path import Path + + class MyTransform(Transform): + input_dims = 2 + output_dims = 2 + is_separable = False + + def __init__(self, resolution): + """ + Create a new Aitoff transform. Resolution is the number of steps + to interpolate between each input line segment to approximate its + path in curved Aitoff space. + """ + Transform.__init__(self) + self._resolution = resolution + + def transform(self, ll): + x = ll[:, 0:1] + y = ll[:, 1:2] + + return np.concatenate((x, y-x), 1) + + transform.__doc__ = Transform.transform.__doc__ + + transform_non_affine = transform + transform_non_affine.__doc__ = Transform.transform_non_affine.__doc__ + + def transform_path(self, path): + vertices = path.vertices + ipath = path.interpolated(self._resolution) + return Path(self.transform(ipath.vertices), ipath.codes) + transform_path.__doc__ = Transform.transform_path.__doc__ + + transform_path_non_affine = transform_path + transform_path_non_affine.__doc__ = Transform.transform_path_non_affine.__doc__ + + def inverted(self): + return MyTransformInv(self._resolution) + inverted.__doc__ = Transform.inverted.__doc__ + + class MyTransformInv(Transform): + input_dims = 2 + output_dims = 2 + is_separable = False + + def __init__(self, resolution): + Transform.__init__(self) + self._resolution = resolution + + def transform(self, ll): + x = ll[:, 0:1] + y = ll[:, 1:2] + + return np.concatenate((x, y+x), 1) + transform.__doc__ = Transform.transform.__doc__ + + def inverted(self): + return MyTransform(self._resolution) + inverted.__doc__ = Transform.inverted.__doc__ + + + + import matplotlib.pyplot as plt + fig = plt.figure(1) + fig.clf() + tr = MyTransform(1) + grid_helper = GridHelperCurveLinear(tr) + + + from mpl_toolkits.axes_grid1.parasite_axes import host_subplot_class_factory + from axislines import Axes + + SubplotHost = host_subplot_class_factory(Axes) + + ax1 = SubplotHost(fig, 1, 1, 1, grid_helper=grid_helper) + + fig.add_subplot(ax1) + + ax2 = ParasiteAxesAuxTrans(ax1, tr, "equal") + ax1.parasites.append(ax2) + ax2.plot([3, 6], [5.0, 10.]) + + ax1.set_aspect(1.) + ax1.set_xlim(0, 10) + ax1.set_ylim(0, 10) + + ax1.grid(True) + plt.draw() + + + +def curvelinear_test2(fig): + """ + polar projection, but in a rectangular box. + """ + global ax1 + import numpy as np + import angle_helper + from matplotlib.projections import PolarAxes + from matplotlib.transforms import Affine2D + + from mpl_toolkits.axes_grid.parasite_axes import SubplotHost, \ + ParasiteAxesAuxTrans + import matplotlib.cbook as cbook + + # PolarAxes.PolarTransform takes radian. However, we want our coordinate + # system in degree + tr = Affine2D().scale(np.pi/180., 1.) + PolarAxes.PolarTransform() + + # polar projection, which involves cycle, and also has limits in + # its coordinates, needs a special method to find the extremes + # (min, max of the coordinate within the view). + + # 20, 20 : number of sampling points along x, y direction + extreme_finder = angle_helper.ExtremeFinderCycle(20, 20, + lon_cycle = 360, + lat_cycle = None, + lon_minmax = None, + lat_minmax = (0, np.inf), + ) + + grid_locator1 = angle_helper.LocatorDMS(5) + # Find a grid values appropriate for the coordinate (degree, + # minute, second). + + tick_formatter1 = angle_helper.FormatterDMS() + # And also uses an appropriate formatter. Note that,the + # acceptable Locator and Formatter class is a bit different than + # that of mpl's, and you cannot directly use mpl's Locator and + # Formatter here (but may be possible in the future). + + grid_helper = GridHelperCurveLinear(tr, + extreme_finder=extreme_finder, + grid_locator1=grid_locator1, + tick_formatter1=tick_formatter1 + ) + + + ax1 = SubplotHost(fig, 1, 1, 1, grid_helper=grid_helper) + + # make ticklabels of right and top axis visible. + ax1.axis["right"].major_ticklabels.set_visible(True) + ax1.axis["top"].major_ticklabels.set_visible(True) + + # let right axis shows ticklabels for 1st coordinate (angle) + ax1.axis["right"].get_helper().nth_coord_ticks=0 + # let bottom axis shows ticklabels for 2nd coordinate (radius) + ax1.axis["bottom"].get_helper().nth_coord_ticks=1 + + fig.add_subplot(ax1) + + grid_helper = ax1.get_grid_helper() + ax1.axis["lat"] = axis = grid_helper.new_floating_axis(0, 60, axes=ax1) + axis.label.set_text("Test") + axis.label.set_visible(True) + #axis._extremes = 2, 10 + #axis.label.set_text("Test") + #axis.major_ticklabels.set_visible(False) + #axis.major_ticks.set_visible(False) + axis.get_helper()._extremes=2, 10 + + ax1.axis["lon"] = axis = grid_helper.new_floating_axis(1, 6, axes=ax1) + #axis.major_ticklabels.set_visible(False) + #axis.major_ticks.set_visible(False) + axis.label.set_text("Test 2") + axis.get_helper()._extremes=-180, 90 + + # A parasite axes with given transform + ax2 = ParasiteAxesAuxTrans(ax1, tr, "equal") + # note that ax2.transData == tr + ax1.transData + # Anthing you draw in ax2 will match the ticks and grids of ax1. + ax1.parasites.append(ax2) + intp = cbook.simple_linear_interpolation + ax2.plot(intp(np.array([0, 30]), 50), + intp(np.array([10., 10.]), 50)) + + ax1.set_aspect(1.) + ax1.set_xlim(-5, 12) + ax1.set_ylim(-5, 10) + + ax1.grid(True) + + +def curvelinear_test3(fig): + """ + polar projection, but in a rectangular box. + """ + global ax1, axis + import numpy as np + import angle_helper + from matplotlib.projections import PolarAxes + from matplotlib.transforms import Affine2D + + from mpl_toolkits.axes_grid.parasite_axes import SubplotHost + + # PolarAxes.PolarTransform takes radian. However, we want our coordinate + # system in degree + tr = Affine2D().scale(np.pi/180., 1.) + PolarAxes.PolarTransform() + + # polar projection, which involves cycle, and also has limits in + # its coordinates, needs a special method to find the extremes + # (min, max of the coordinate within the view). + + # 20, 20 : number of sampling points along x, y direction + extreme_finder = angle_helper.ExtremeFinderCycle(20, 20, + lon_cycle = 360, + lat_cycle = None, + lon_minmax = None, + lat_minmax = (0, np.inf), + ) + + grid_locator1 = angle_helper.LocatorDMS(12) + # Find a grid values appropriate for the coordinate (degree, + # minute, second). + + tick_formatter1 = angle_helper.FormatterDMS() + # And also uses an appropriate formatter. Note that,the + # acceptable Locator and Formatter class is a bit different than + # that of mpl's, and you cannot directly use mpl's Locator and + # Formatter here (but may be possible in the future). + + grid_helper = GridHelperCurveLinear(tr, + extreme_finder=extreme_finder, + grid_locator1=grid_locator1, + tick_formatter1=tick_formatter1 + ) + + + ax1 = SubplotHost(fig, 1, 1, 1, grid_helper=grid_helper) + + for axis in ax1.axis.itervalues(): + axis.set_visible(False) + + fig.add_subplot(ax1) + + grid_helper = ax1.get_grid_helper() + ax1.axis["lat1"] = axis = grid_helper.new_floating_axis(0, 130, + axes=ax1, + axis_direction="left" + ) + axis.label.set_text("Test") + axis.label.set_visible(True) + axis.get_helper()._extremes=0.001, 10 + + + + grid_helper = ax1.get_grid_helper() + ax1.axis["lat2"] = axis = grid_helper.new_floating_axis(0, 50, axes=ax1, + axis_direction="right") + axis.label.set_text("Test") + axis.label.set_visible(True) + axis.get_helper()._extremes=0.001, 10 + + ax1.axis["lon"] = axis = grid_helper.new_floating_axis(1, 10, + axes=ax1, + axis_direction="bottom") + axis.label.set_text("Test 2") + axis.get_helper()._extremes= 50, 130 + axis.major_ticklabels.set_axis_direction("top") + axis.label.set_axis_direction("top") + + grid_helper.grid_finder.grid_locator1.den = 5 + grid_helper.grid_finder.grid_locator2._nbins = 5 + + +# # A parasite axes with given transform +# ax2 = ParasiteAxesAuxTrans(ax1, tr, "equal") +# # note that ax2.transData == tr + ax1.transData +# # Anthing you draw in ax2 will match the ticks and grids of ax1. +# ax1.parasites.append(ax2) +# intp = cbook.simple_linear_interpolation +# ax2.plot(intp(np.array([0, 30]), 50), +# intp(np.array([10., 10.]), 50)) + + ax1.set_aspect(1.) + ax1.set_xlim(-5, 12) + ax1.set_ylim(-5, 10) + + ax1.grid(True) + +if __name__ == "__main__": + import matplotlib.pyplot as plt + fig = plt.figure(1, figsize=(5, 5)) + fig.clf() + + #test3() + #curvelinear_test2(fig) + curvelinear_test3(fig) + + #plt.draw() + plt.show() + + diff -Nru matplotlib-0.99.3/lib/mpl_toolkits/axisartist/__init__.py matplotlib-1.0.1/lib/mpl_toolkits/axisartist/__init__.py --- matplotlib-0.99.3/lib/mpl_toolkits/axisartist/__init__.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_toolkits/axisartist/__init__.py 2010-07-07 01:41:47.000000000 +0000 @@ -0,0 +1,22 @@ +from axislines import Axes, Subplot, AxesZero, SubplotZero, GridHelperRectlinear, \ + AxisArtistHelperRectlinear, AxisArtistHelper, GridHelperBase, AxisArtist +from axis_artist import AxisArtist, GridlinesCollection + +from grid_helper_curvelinear import GridHelperCurveLinear + +from floating_axes import FloatingAxes, FloatingSubplot + +from mpl_toolkits.axes_grid1.parasite_axes import \ + subplot_class_factory, \ + parasite_axes_class_factory, parasite_axes_auxtrans_class_factory, \ + host_axes_class_factory + +ParasiteAxes = parasite_axes_class_factory(Axes) + +ParasiteAxesAuxTrans = parasite_axes_auxtrans_class_factory(axes_class=ParasiteAxes) + +HostAxes = host_axes_class_factory(axes_class=Axes) + +SubplotHost = subplot_class_factory(HostAxes) + + diff -Nru matplotlib-0.99.3/lib/mpl_toolkits/mplot3d/art3d.py matplotlib-1.0.1/lib/mpl_toolkits/mplot3d/art3d.py --- matplotlib-0.99.3/lib/mpl_toolkits/mplot3d/art3d.py 2010-03-09 14:20:19.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_toolkits/mplot3d/art3d.py 2010-07-07 01:41:47.000000000 +0000 @@ -1,6 +1,7 @@ #!/usr/bin/python # art3d.py, original mplot3d version by John Porter # Parts rewritten by Reinier Heeres +# Minor additions by Ben Axelrod ''' Module containing 3D artist code and functions to convert 2D @@ -15,6 +16,7 @@ from matplotlib.colors import Normalize from matplotlib.cbook import iterable +import warnings import numpy as np import math import proj3d @@ -52,8 +54,15 @@ Text object with 3D position and (in the future) direction. ''' - def __init__(self, x=0, y=0, z=0, text='', zdir='z'): - mtext.Text.__init__(self, x, y, text) + def __init__(self, x=0, y=0, z=0, text='', zdir='z', **kwargs): + ''' + *x*, *y*, *z* Position of text + *text* Text string to display + *zdir* Direction of text + + Keyword arguments are passed onto :func:`~matplotlib.text.Text`. + ''' + mtext.Text.__init__(self, x, y, text, **kwargs) self.set_3d_properties(z, zdir) def set_3d_properties(self, z=0, zdir='z'): @@ -86,6 +95,9 @@ ''' def __init__(self, xs, ys, zs, *args, **kwargs): + ''' + Keyword arguments are passed onto :func:`~matplotlib.lines.Line2D`. + ''' lines.Line2D.__init__(self, [], [], *args, **kwargs) self._verts3d = xs, ys, zs @@ -145,6 +157,9 @@ ''' def __init__(self, segments, *args, **kwargs): + ''' + Keyword arguments are passed onto :func:`~matplotlib.collections.LineCollection`. + ''' LineCollection.__init__(self, segments, *args, **kwargs) def set_segments(self, segments): @@ -217,6 +232,31 @@ def draw(self, renderer): Patch.draw(self, renderer) + +class PathPatch3D(Patch3D): + ''' + 3D PathPatch object. + ''' + + def __init__(self, path, **kwargs): + zs = kwargs.pop('zs', []) + zdir = kwargs.pop('zdir', 'z') + Patch.__init__(self, **kwargs) + self.set_3d_properties(path, zs, zdir) + + def set_3d_properties(self, path, zs=0, zdir='z'): + Patch3D.set_3d_properties(self, path.vertices, zs=zs, zdir=zdir) + self._code3d = path.codes + + def do_3d_projection(self, renderer): + s = self._segment3d + xs, ys, zs = zip(*s) + vxs, vys,vzs, vis = proj3d.proj_transform_clip(xs, ys, zs, renderer.M) + self._path2d = mpath.Path(zip(vxs, vys), self._code3d) + # FIXME: coloring + self._facecolor2d = self._facecolor3d + return min(vzs) + def get_patch_verts(patch): """Return a list of vertices for the path of a patch.""" trans = patch.get_patch_transform() @@ -233,6 +273,15 @@ patch.__class__ = Patch3D patch.set_3d_properties(verts, z, zdir) +def pathpatch_2d_to_3d(pathpatch, z=0, zdir='z'): + """Convert a PathPatch to a PathPatch3D object.""" + path = pathpatch.get_path() + trans = pathpatch.get_patch_transform() + + mpath = trans.transform_path(path) + pathpatch.__class__ = PathPatch3D + pathpatch.set_3d_properties(mpath, z, zdir) + class Patch3DCollection(PatchCollection): ''' A collection of 3D patches. @@ -283,13 +332,44 @@ *verts* should contain 3D coordinates. + Keyword arguments: + zsort, see set_zsort for options. + Note that this class does a bit of magic with the _facecolors and _edgecolors properties. ''' + self.set_zsort(kwargs.pop('zsort', True)) + PolyCollection.__init__(self, verts, *args, **kwargs) - self._zsort = 1 + + _zsort_functions = { + 'average': np.average, + 'min': np.min, + 'max': np.max, + } + + def set_zsort(self, zsort): + ''' + Set z-sorting behaviour: + boolean: if True use default 'average' + string: 'average', 'min' or 'max' + ''' + + if zsort is True: + zsort = 'average' + + if zsort is not False: + if zsort in self._zsort_functions: + zsortfunc = self._zsort_functions[zsort] + else: + return False + else: + zsortfunc = None + + self._zsort = zsort self._sort_zpos = None + self._zsortfunc = zsortfunc def get_vector(self, segments3d): """Optimize points for projection""" @@ -314,12 +394,13 @@ PolyCollection.set_verts(self, [], closed) def set_3d_properties(self): - self._zsort = 1 self._sort_zpos = None + self.set_zsort(True) self._facecolors3d = PolyCollection.get_facecolors(self) self._edgecolors3d = PolyCollection.get_edgecolors(self) - def set_sort_zpos(self, val): + def set_sort_zpos(self,val): + '''Set the position to use for z-sorting.''' self._sort_zpos = val def do_3d_projection(self, renderer): @@ -347,7 +428,7 @@ # if required sort by depth (furthest drawn first) if self._zsort: - z_segments_2d = [(np.average(zs), zip(xs, ys), fc, ec) for + z_segments_2d = [(self._zsortfunc(zs), zip(xs, ys), fc, ec) for (xs, ys, zs), fc, ec in zip(xyzlist, cface, cedge)] z_segments_2d.sort(cmp=lambda x, y: cmp(y[0], x[0])) else: @@ -400,20 +481,48 @@ def juggle_axes(xs, ys, zs, zdir): """ - Reorder coordinates so that zdir + Reorder coordinates so that 2D xs, ys can be plotted in the plane + orthogonal to zdir. zdir is normally x, y or z. However, if zdir + starts with a '-' it is interpreted as a compensation for rotate_axes. """ if zdir == 'x': return zs, xs, ys elif zdir == 'y': return xs, zs, ys + elif zdir[0] == '-': + return rotate_axes(xs, ys, zs, zdir) + else: + return xs, ys, zs + +def rotate_axes(xs, ys, zs, zdir): + """ + Reorder coordinates so that the axes are rotated with zdir along + the original z axis. Prepending the axis with a '-' does the + inverse transform, so zdir can be x, -x, y, -y, z or -z + """ + if zdir == 'x': + return ys, zs, xs + elif zdir == '-x': + return zs, xs, ys + + elif zdir == 'y': + return zs, xs, ys + elif zdir == '-y': + return ys, zs, xs + else: return xs, ys, zs def iscolor(c): try: - return (len(c) == 4 or len(c) == 3) and hasattr(c[0], '__float__') - except (IndexError): + if len(c) == 4 or len(c) == 3: + if iterable(c[0]): + return False + if hasattr(c[0], '__float__'): + return True + except: return False + return False def get_colors(c, num): """Stretch the color argument to provide the required number num""" @@ -427,6 +536,8 @@ return c elif iscolor(c): return [c] * num + elif len(c) == 0: #if edgecolor or facecolor is specified as 'none' + return [[0,0,0,0]] * num elif iscolor(c[0]): return [c[0]] * num else: diff -Nru matplotlib-0.99.3/lib/mpl_toolkits/mplot3d/axes3d.py matplotlib-1.0.1/lib/mpl_toolkits/mplot3d/axes3d.py --- matplotlib-0.99.3/lib/mpl_toolkits/mplot3d/axes3d.py 2009-08-22 21:06:12.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_toolkits/mplot3d/axes3d.py 2010-08-03 14:22:39.000000000 +0000 @@ -2,18 +2,20 @@ # axes3d.py, original mplot3d version by John Porter # Created: 23 Sep 2005 # Parts fixed by Reinier Heeres +# Minor additions by Ben Axelrod """ Module containing Axes3D, an object which can plot 3D objects on a 2D matplotlib figure. """ +import warnings from matplotlib.axes import Axes, rcParams from matplotlib import cbook from matplotlib.transforms import Bbox from matplotlib import collections import numpy as np -from matplotlib.colors import Normalize, colorConverter +from matplotlib.colors import Normalize, colorConverter, LightSource import art3d import proj3d @@ -35,23 +37,40 @@ """ 3D axes object. """ + name = '3d' def __init__(self, fig, rect=None, *args, **kwargs): + ''' + Build an :class:`Axes3D` instance in + :class:`~matplotlib.figure.Figure` *fig* with + *rect=[left, bottom, width, height]* in + :class:`~matplotlib.figure.Figure` coordinates + + Optional keyword arguments: + + ================ ========================================= + Keyword Description + ================ ========================================= + *azim* Azimuthal viewing angle (default -60) + *elev* Elevation viewing angle (default 30) + ================ ========================================= + ''' + if rect is None: rect = [0.0, 0.0, 1.0, 1.0] self.fig = fig - self.cids = [] + self._cids = [] - azim = kwargs.pop('azim', -60) - elev = kwargs.pop('elev', 30) + self.initial_azim = kwargs.pop('azim', -60) + self.initial_elev = kwargs.pop('elev', 30) self.xy_viewLim = unit_bbox() self.zz_viewLim = unit_bbox() self.xy_dataLim = unit_bbox() self.zz_dataLim = unit_bbox() - # inihibit autoscale_view until the axises are defined + # inihibit autoscale_view until the axes are defined # they can't be defined until Axes.__init__ has been called - self.view_init(elev, azim) + self.view_init(self.initial_elev, self.initial_azim) self._ready = 0 Axes.__init__(self, self.fig, rect, frameon=True, @@ -75,8 +94,8 @@ ydwl = (0.95/self.dist) ydw = (0.9/self.dist) - Axes.set_xlim(self, -xdwl, xdw) - Axes.set_ylim(self, -ydwl, ydw) + Axes.set_xlim(self, -xdwl, xdw, auto=None) + Axes.set_ylim(self, -ydwl, ydw, auto=None) def create_axes(self): self.w_xaxis = axis3d.XAxis('x', self.xy_viewLim.intervalx, @@ -132,7 +151,7 @@ # Calculate projection of collections and zorder them zlist = [(col.do_3d_projection(renderer), col) \ - for col in self.collections] + for col in self.collections] zlist.sort() zlist.reverse() for i, (z, col) in enumerate(zlist): @@ -146,9 +165,12 @@ for i, (z, patch) in enumerate(zlist): patch.zorder = i - self.w_xaxis.draw(renderer) - self.w_yaxis.draw(renderer) - self.w_zaxis.draw(renderer) + axes = (self.w_xaxis, self.w_yaxis, self.w_zaxis) + for ax in axes: + ax.draw_pane(renderer) + for ax in axes: + ax.draw(renderer) + Axes.draw(self, renderer) def get_axis_position(self): @@ -181,7 +203,7 @@ # Let autoscale_view figure out how to use this data. self.autoscale_view() - def autoscale_view(self, scalex=True, scaley=True, scalez=True): + def autoscale_view(self, scalex=True, scaley=True, scalez=True, **kw): # This method looks at the rectanglular volume (see above) # of data and decides how to scale the view portal to fit it. @@ -252,10 +274,30 @@ def panpy(self, numsteps): print 'numsteps', numsteps - def view_init(self, elev, azim): + def view_init(self, elev=None, azim=None): + """ + Set the elevation and azimuth of the axes. + + This can be used to rotate the axes programatically. + + 'elev' stores the elevation angle in the z plane. + 'azim' stores the azimuth angle in the x,y plane. + + if elev or azim are None (default), then the initial value + is used which was specified in the :class:`Axes3D` constructor. + """ + self.dist = 10 - self.elev = elev - self.azim = azim + + if elev is None: + self.elev = self.initial_elev + else: + self.elev = elev + + if azim is None: + self.azim = self.initial_azim + else: + self.azim = azim def get_proj(self): """Create the projection matrix from the current viewing @@ -304,26 +346,57 @@ M = np.dot(perspM, M0) return M - def mouse_init(self): + def mouse_init(self, rotate_btn=1, zoom_btn=3): + """Initializes mouse button callbacks to enable 3D rotation of + the axes. Also optionally sets the mouse buttons for 3D rotation + and zooming. + + ============ ======================================================= + Argument Description + ============ ======================================================= + *rotate_btn* The integer or list of integers specifying which mouse + button or buttons to use for 3D rotation of the axes. + Default = 1. + + *zoom_btn* The integer or list of integers specifying which mouse + button or buttons to use to zoom the 3D axes. + Default = 3. + ============ ======================================================= + + """ self.button_pressed = None canv = self.figure.canvas if canv != None: c1 = canv.mpl_connect('motion_notify_event', self._on_move) c2 = canv.mpl_connect('button_press_event', self._button_press) c3 = canv.mpl_connect('button_release_event', self._button_release) - self.cids = [c1, c2, c3] + self._cids = [c1, c2, c3] + else: + warnings.warn('Axes3D.figure.canvas is \'None\', mouse rotation disabled. Set canvas then call Axes3D.mouse_init().') + + self._rotate_btn = np.atleast_1d(rotate_btn) + self._zoom_btn = np.atleast_1d(zoom_btn) def cla(self): - # Disconnect the various events we set. - for cid in self.cids: - self.figure.canvas.mpl_disconnect(cid) - self.cids = [] + """Clear axes and disable mouse button callbacks. + """ + self.disable_mouse_rotation() Axes.cla(self) self.grid(rcParams['axes3d.grid']) + def disable_mouse_rotation(self): + """Disable mouse button callbacks. + """ + # Disconnect the various events we set. + for cid in self._cids: + self.figure.canvas.mpl_disconnect(cid) + + self._cids = [] + def _button_press(self, event): - self.button_pressed = event.button - self.sx, self.sy = event.xdata, event.ydata + if event.inaxes == self: + self.button_pressed = event.button + self.sx, self.sy = event.xdata, event.ydata def _button_release(self, event): self.button_pressed = None @@ -374,7 +447,7 @@ if self.M is None: return '' - if self.button_pressed == 1: + if self.button_pressed in self._rotate_btn: return 'azimuth=%d deg, elevation=%d deg ' % (self.azim, self.elev) # ignore xd and yd and display angles instead @@ -407,9 +480,10 @@ def _on_move(self, event): """Mouse moving - button-1 rotates - button-3 zooms + button-1 rotates by default. Can be set explicitly in mouse_init(). + button-3 zooms by default. Can be set explicitly in mouse_init(). """ + if not self.button_pressed: return @@ -428,7 +502,8 @@ h = (y1-y0) self.sx, self.sy = x, y - if self.button_pressed == 1: + # Rotation + if self.button_pressed in self._rotate_btn: # rotate viewing point # get the x and y pixel coords if dx == 0 and dy == 0: @@ -437,12 +512,15 @@ self.azim = art3d.norm_angle(self.azim - (dx/w)*180) self.get_proj() self.figure.canvas.draw() - elif self.button_pressed == 2: + +# elif self.button_pressed == 2: # pan view # project xv,yv,zv -> xw,yw,zw # pan - pass - elif self.button_pressed == 3: +# pass + + # Zoom + elif self.button_pressed in self._zoom_btn: # zoom view # hmmm..this needs some help from clipping.... minx, maxx, miny, maxy, minz, maxz = self.get_w_lims() @@ -457,7 +535,7 @@ self.figure.canvas.draw() def set_xlabel(self, xlabel, fontdict=None, **kwargs): - '''Set xlabel. ''' + '''Set xlabel.''' label = self.w_xaxis.get_label() label.set_text(xlabel) @@ -492,13 +570,18 @@ ''' self._draw_grid = on - def text(self, x, y, z, s, zdir=None): - '''Add text to the plot.''' - text = Axes.text(self, x, y, s) + def text(self, x, y, z, s, zdir=None, **kwargs): + ''' + Add text to the plot. kwargs will be passed on to Axes.text, + except for the `zdir` keyword, which sets the direction to be + used as the z direction. + ''' + text = Axes.text(self, x, y, s, **kwargs) art3d.text_2d_to_3d(text, z, zdir) return text text3D = text + text2D = Axes.text def plot(self, xs, ys, *args, **kwargs): ''' @@ -556,16 +639,23 @@ but it also supports color mapping by supplying the *cmap* argument. - ========== ================================================ - Argument Description - ========== ================================================ - *X*, *Y*, Data values as numpy.arrays - *Z* - *rstride* Array row stride (step size) - *cstride* Array column stride (step size) - *color* Color of the surface patches - *cmap* A colormap for the surface patches. - ========== ================================================ + ============= ================================================ + Argument Description + ============= ================================================ + *X*, *Y*, *Z* Data values as numpy.arrays + *rstride* Array row stride (step size) + *cstride* Array column stride (step size) + *color* Color of the surface patches + *cmap* A colormap for the surface patches. + *facecolors* Face colors for the individual patches + *norm* An instance of Normalize to map values to colors + *vmin* Minimum value to map + *vmax* Maximum value to map + *shade* Whether to shade the facecolors + ============= ================================================ + + Other arguments are passed on to + :func:`~mpl_toolkits.mplot3d.art3d.Poly3DCollection.__init__` ''' had_data = self.has_data() @@ -575,13 +665,28 @@ rstride = kwargs.pop('rstride', 10) cstride = kwargs.pop('cstride', 10) - color = kwargs.pop('color', 'b') - color = np.array(colorConverter.to_rgba(color)) + if 'facecolors' in kwargs: + fcolors = kwargs.pop('facecolors') + else: + color = np.array(colorConverter.to_rgba(kwargs.pop('color', 'b'))) + fcolors = None + cmap = kwargs.get('cmap', None) + norm = kwargs.pop('norm', None) + vmin = kwargs.pop('vmin', None) + vmax = kwargs.pop('vmax', None) + linewidth = kwargs.get('linewidth', None) + shade = kwargs.pop('shade', cmap is None) + lightsource = kwargs.pop('lightsource', None) + + # Shade the data + if shade and cmap is not None and fcolors is not None: + fcolors = self._shade_colors_lightsource(Z, cmap, lightsource) polys = [] normals = [] - avgz = [] + #colset contains the data for coloring: either average z or the facecolor + colset = [] for rs in np.arange(0, rows-1, rstride): for cs in np.arange(0, cols-1, cstride): ps = [] @@ -609,19 +714,38 @@ lastp = p avgzsum += p[2] polys.append(ps2) - avgz.append(avgzsum / len(ps2)) - v1 = np.array(ps2[0]) - np.array(ps2[1]) - v2 = np.array(ps2[2]) - np.array(ps2[0]) - normals.append(np.cross(v1, v2)) + if fcolors is not None: + colset.append(fcolors[rs][cs]) + else: + colset.append(avgzsum / len(ps2)) + + # Only need vectors to shade if no cmap + if cmap is None and shade: + v1 = np.array(ps2[0]) - np.array(ps2[1]) + v2 = np.array(ps2[2]) - np.array(ps2[0]) + normals.append(np.cross(v1, v2)) polyc = art3d.Poly3DCollection(polys, *args, **kwargs) - if cmap is not None: - polyc.set_array(np.array(avgz)) - polyc.set_linewidth(0) + + if fcolors is not None: + if shade: + colset = self._shade_colors(colset, normals) + polyc.set_facecolors(colset) + polyc.set_edgecolors(colset) + elif cmap: + colset = np.array(colset) + polyc.set_array(colset) + if vmin is not None or vmax is not None: + polyc.set_clim(vmin, vmax) + if norm is not None: + polyc.set_norm(norm) else: - colors = self._shade_colors(color, normals) - polyc.set_facecolors(colors) + if shade: + colset = self._shade_colors(color, normals) + else: + colset = color + polyc.set_facecolors(colset) self.add_collection(polyc) self.auto_scale_xyz(X, Y, Z, had_data) @@ -643,24 +767,39 @@ return normals def _shade_colors(self, color, normals): + ''' + Shade *color* using normal vectors given by *normals*. + *color* can also be an array of the same length as *normals*. + ''' + shade = [] for n in normals: - n = n / proj3d.mod(n) * 5 + n = n / proj3d.mod(n) shade.append(np.dot(n, [-1, -1, 0.5])) shade = np.array(shade) mask = ~np.isnan(shade) - if len(shade[mask]) > 0: - norm = Normalize(min(shade[mask]), max(shade[mask])) - color = color.copy() - color[3] = 1 - colors = [color * (0.5 + norm(v) * 0.5) for v in shade] + if len(shade[mask]) > 0: + norm = Normalize(min(shade[mask]), max(shade[mask])) + if art3d.iscolor(color): + color = color.copy() + color[3] = 1 + colors = [color * (0.5 + norm(v) * 0.5) for v in shade] + else: + colors = [np.array(colorConverter.to_rgba(c)) * \ + (0.5 + norm(v) * 0.5) \ + for c, v in zip(color, shade)] else: - colors = color.copy() + colors = color.copy() return colors + def _shade_colors_lightsource(self, data, cmap, lightsource): + if lightsource is None: + lightsource = LightSource(azdeg=135, altdeg=55) + return lightsource.shade(data, cmap) + def plot_wireframe(self, X, Y, Z, *args, **kwargs): ''' Plot a 3D wireframe. @@ -748,15 +887,16 @@ colors = self._shade_colors(color, normals) colors2 = self._shade_colors(color, normals) - polycol = art3d.Poly3DCollection(polyverts, facecolors=colors, - edgecolors=colors2) + polycol = art3d.Poly3DCollection(polyverts, + facecolors=colors, + edgecolors=colors2) polycol.set_sort_zpos(z) self.add_collection3d(polycol) for col in colls: self.collections.remove(col) - def contour(self, X, Y, Z, levels=10, **kwargs): + def contour(self, X, Y, Z, *args, **kwargs): ''' Create a 3D contour plot. @@ -765,28 +905,37 @@ ========== ================================================ *X*, *Y*, Data values as numpy.arrays *Z* - *levels* Number of levels to use, defaults to 10. Can - also be a tuple of specific levels. *extend3d* Whether to extend contour in 3D (default: False) *stride* Stride (step size) for extending contour + *zdir* The direction to use: x, y or z (default) + *offset* If specified plot a projection of the contour + lines on this position in plane normal to zdir ========== ================================================ - Other keyword arguments are passed on to + The positional and other keyword arguments are passed on to :func:`~matplotlib.axes.Axes.contour` + + Returns a :class:`~matplotlib.axes.Axes.contour` ''' extend3d = kwargs.pop('extend3d', False) stride = kwargs.pop('stride', 5) - nlevels = kwargs.pop('nlevels', 15) + zdir = kwargs.pop('zdir', 'z') + offset = kwargs.pop('offset', None) had_data = self.has_data() - cset = Axes.contour(self, X, Y, Z, levels, **kwargs) + jX, jY, jZ = art3d.rotate_axes(X, Y, Z, zdir) + cset = Axes.contour(self, jX, jY, jZ, *args, **kwargs) + + zdir = '-' + zdir if extend3d: self._3d_extend_contour(cset, stride) else: for z, linec in zip(cset.levels, cset.collections): - art3d.line_collection_2d_to_3d(linec, z) + if offset is not None: + z = offset + art3d.line_collection_2d_to_3d(linec, z, zdir=zdir) self.auto_scale_xyz(X, Y, Z, had_data) return cset @@ -799,8 +948,10 @@ *X*, *Y*, *Z*: data points. - Keyword arguments are passed on to - :func:`~matplotlib.axes.Axes.contour` + The positional and keyword arguments are passed on to + :func:`~matplotlib.axes.Axes.contourf` + + Returns a :class:`~matplotlib.axes.Axes.contourf` ''' had_data = self.has_data() @@ -924,24 +1075,65 @@ return patches - def bar3d(self, x, y, z, dx, dy, dz, color='b'): + def bar3d(self, x, y, z, dx, dy, dz, color='b', + zsort='average', *args, **kwargs): ''' Generate a 3D bar, or multiple bars. When generating multiple bars, x, y, z have to be arrays. - dx, dy, dz can still be scalars. - ''' + dx, dy, dz can be arrays or scalars. + + *color* can be: + + - A single color value, to color all bars the same color. + + - An array of colors of length N bars, to color each bar + independently. + - An array of colors of length 6, to color the faces of the + bars similarly. + + - An array of colors of length 6 * N bars, to color each face + independently. + + When coloring the faces of the boxes specifically, this is + the order of the coloring: + + 1. -Z (bottom of box) + 2. +Z (top of box) + 3. -Y + 4. +Y + 5. -X + 6. +X + + Keyword arguments are passed onto + :func:`~mpl_toolkits.mplot3d.art3d.Poly3DCollection` + ''' had_data = self.has_data() if not cbook.iterable(x): - x, y, z = [x], [y], [z] + x = [x] + if not cbook.iterable(y): + y = [y] + if not cbook.iterable(z): + z = [z] + if not cbook.iterable(dx): - dx, dy, dz = [dx], [dy], [dz] + dx = [dx] + if not cbook.iterable(dy): + dy = [dy] + if not cbook.iterable(dz): + dz = [dz] + if len(dx) == 1: dx = dx * len(x) - dy = dy * len(x) - dz = dz * len(x) + if len(dy) == 1: + dy = dy * len(y) + if len(dz) == 1: + dz = dz * len(z) + + if len(x) != len(y) or len(x) != len(z): + warnings.warn('x, y, and z must be the same length.') minx, miny, minz = 1e20, 1e20, 1e20 maxx, maxy, maxz = -1e20, -1e20, -1e20 @@ -972,15 +1164,35 @@ (xi + dxi, yi + dyi, zi + dzi), (xi + dxi, yi, zi + dzi)), ]) - color = np.array(colorConverter.to_rgba(color)) - normals = self._generate_normals(polys) - colors = self._shade_colors(color, normals) + facecolors = [] + if color is None: + # no color specified + facecolors = [None] * len(x) + elif len(color) == len(x): + # bar colors specified, need to expand to number of faces + for c in color: + facecolors.extend([c] * 6) + else: + # a single color specified, or face colors specified explicitly + facecolors = list(colorConverter.to_rgba_array(color)) + if len(facecolors) < len(x): + facecolors *= (6 * len(x)) - col = art3d.Poly3DCollection(polys, facecolor=colors) + normals = self._generate_normals(polys) + sfacecolors = self._shade_colors(facecolors, normals) + col = art3d.Poly3DCollection(polys, + zsort=zsort, + facecolor=sfacecolors, + *args, **kwargs) self.add_collection(col) self.auto_scale_xyz((minx, maxx), (miny, maxy), (minz, maxz), had_data) + def set_title(self, label, fontdict=None, **kwargs): + Axes.set_title(self, label, fontdict, **kwargs) + (x, y) = self.title.get_position() + self.title.set_y(0.92 * y) + def get_test_data(delta=0.05): ''' Return a tuple X, Y, Z with a test data set. @@ -999,3 +1211,11 @@ Z = Z * 500 return X, Y, Z + + +######################################################## +# Register Axes3D as a 'projection' object available +# for use just like any other axes +######################################################## +import matplotlib.projections as proj +proj.projection_registry.register(Axes3D) diff -Nru matplotlib-0.99.3/lib/mpl_toolkits/mplot3d/axis3d.py matplotlib-1.0.1/lib/mpl_toolkits/mplot3d/axis3d.py --- matplotlib-0.99.3/lib/mpl_toolkits/mplot3d/axis3d.py 2009-08-22 21:06:12.000000000 +0000 +++ matplotlib-1.0.1/lib/mpl_toolkits/mplot3d/axis3d.py 2010-12-13 15:27:29.000000000 +0000 @@ -57,11 +57,11 @@ # Some properties for the axes _AXINFO = { - 'x': {'i': 0, 'tickdir': 1, + 'x': {'i': 0, 'tickdir': 1, 'juggled': (1, 0, 2), 'color': (0.95, 0.95, 0.95, 0.5)}, - 'y': {'i': 1, 'tickdir': 0, + 'y': {'i': 1, 'tickdir': 0, 'juggled': (0, 1, 2), 'color': (0.90, 0.90, 0.90, 0.5)}, - 'z': {'i': 2, 'tickdir': 0, + 'z': {'i': 2, 'tickdir': 0, 'juggled': (0, 2, 1), 'color': (0.925, 0.925, 0.925, 0.5)}, } @@ -75,7 +75,7 @@ maxis.XAxis.__init__(self, axes, *args, **kwargs) self.line = mlines.Line2D(xdata=(0, 0), ydata=(0, 0), linewidth=0.75, - color=(0,0, 0,0), + color=(0, 0, 0, 1), antialiased=True, ) @@ -91,6 +91,7 @@ self.gridlines = art3d.Line3DCollection([], ) self.axes._set_artist_props(self.gridlines) self.axes._set_artist_props(self.label) + # Need to be able to place the label at the correct location self.label._transform = self.axes.transData self.set_rotate_label(kwargs.get('rotate_label', None)) @@ -100,8 +101,8 @@ majorLabels = [self.major.formatter(val, i) for i, val in enumerate(majorLocs)] return majorLabels, majorLocs - def get_major_ticks(self): - ticks = maxis.XAxis.get_major_ticks(self) + def get_major_ticks(self, numticks=None): + ticks = maxis.XAxis.get_major_ticks(self, numticks) for t in ticks: t.tick1line.set_transform(self.axes.transData) t.tick2line.set_transform(self.axes.transData) @@ -132,23 +133,7 @@ else: return len(text) > 4 - def draw(self, renderer): - self.label._transform = self.axes.transData - renderer.open_group('axis3d') - - # code from XAxis - majorTicks = self.get_major_ticks() - majorLocs = self.major.locator() - - # filter locations here so that no extra grid lines are drawn - interval = self.get_view_interval() - majorLocs = [loc for loc in majorLocs if \ - interval[0] < loc < interval[1]] - self.major.formatter.set_locs(majorLocs) - majorLabels = [self.major.formatter(val, i) - for i, val in enumerate(majorLocs)] - - # Determine bounds + def _get_coord_info(self, renderer): minx, maxx, miny, maxy, minz, maxz = self.axes.get_w_lims() mins = np.array((minx, miny, minz)) maxs = np.array((maxx, maxy, maxz)) @@ -157,15 +142,19 @@ mins = mins - deltas / 4. maxs = maxs + deltas / 4. - # Determine which planes should be visible by the avg z value vals = mins[0], maxs[0], mins[1], maxs[1], mins[2], maxs[2] tc = self.axes.tunit_cube(vals, renderer.M) - #raise RuntimeError('WTF: p1=%s'%p1) avgz = [tc[p1][2] + tc[p2][2] + tc[p3][2] + tc[p4][2] for \ p1, p2, p3, p4 in self._PLANES] highs = np.array([avgz[2*i] < avgz[2*i+1] for i in range(3)]) - # Draw plane + return mins, maxs, centers, deltas, tc, highs + + def draw_pane(self, renderer): + renderer.open_group('pane3d') + + mins, maxs, centers, deltas, tc, highs = self._get_coord_info(renderer) + info = self._AXINFO[self.adir] index = info['i'] if not highs[index]: @@ -176,11 +165,34 @@ self.set_pane(xys, info['color']) self.pane.draw(renderer) + renderer.close_group('pane3d') + + def draw(self, renderer): + self.label._transform = self.axes.transData + renderer.open_group('axis3d') + + # code from XAxis + majorTicks = self.get_major_ticks() + majorLocs = self.major.locator() + + info = self._AXINFO[self.adir] + index = info['i'] + + # filter locations here so that no extra grid lines are drawn + interval = self.get_view_interval() + majorLocs = [loc for loc in majorLocs if \ + interval[0] <= loc <= interval[1]] + self.major.formatter.set_locs(majorLocs) + majorLabels = [self.major.formatter(val, i) + for i, val in enumerate(majorLocs)] + + mins, maxs, centers, deltas, tc, highs = self._get_coord_info(renderer) + # Determine grid lines minmax = np.where(highs, maxs, mins) # Draw main axis line - juggled = art3d.juggle_axes(0, 2, 1, self.adir) + juggled = info['juggled'] edgep1 = minmax.copy() edgep1[juggled[0]] = get_flip_min_max(edgep1, juggled[0], mins, maxs) @@ -198,13 +210,23 @@ xyz0.append(coord) # Draw labels - dy = pep[1][1] - pep[1][0] - dx = pep[0][1] - pep[0][0] + peparray = np.asanyarray(pep) + # The transAxes transform is used because the Text object + # rotates the text relative to the display coordinate system. + # Therefore, if we want the labels to remain parallel to the + # axis regardless of the aspect ratio, we need to convert the + # edge points of the plane to display coordinates and calculate + # an angle from that. + # TODO: Maybe Text objects should handle this themselves? + dx, dy = (self.axes.transAxes.transform(peparray[0:2, 1]) - + self.axes.transAxes.transform(peparray[0:2, 0])) lxyz = 0.5*(edgep1 + edgep2) labeldeltas = 1.3 * deltas - lxyz = move_from_center(lxyz, centers, labeldeltas) + axmask = [True, True, True] + axmask[index] = False + lxyz = move_from_center(lxyz, centers, labeldeltas, axmask) tlx, tly, tlz = proj3d.proj_transform(lxyz[0], lxyz[1], lxyz[2], \ renderer.M) self.label.set_position((tlx, tly)) @@ -212,6 +234,7 @@ angle = art3d.norm_text_angle(math.degrees(math.atan2(dy, dx))) self.label.set_rotation(angle) self.label.set_va('center') + self.label.set_ha('center') self.label.draw(renderer) # Grid points at end of one plane diff -Nru matplotlib-0.99.3/lib/pytz/CHANGES.txt matplotlib-1.0.1/lib/pytz/CHANGES.txt --- matplotlib-0.99.3/lib/pytz/CHANGES.txt 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/pytz/CHANGES.txt 2010-07-07 01:41:49.000000000 +0000 @@ -0,0 +1,50 @@ +2004-07-25 + + - Improved localtime handling, and added a localize() method enabling + correct creation of local times. + +2005-02-16 + + - Made available under the Zope Public Licence 2.1 (ZPL) and checked + into the Zope3 project. pytz may now be used and redistributed + under either the original MIT license or the ZPL 2.1. + +2005-05-13 + + - Move UTC into the top level pytz module and provide special + case pickle support for this singleton. + +2005-08-14 + + - Ensure all tzinfo instances are efficiently picklable. + +2005-12-31 + + - Add fixed offset timezone classes required by Zope 3 + - Generate and distribute a PO template file listing all timezone + names. Translations are not yet available. + +2007-03-03 + + - Import work by James Henstridge, making pytz load timezone + information from zic compiled binaries at runtime rather than + processing them into Python classes. + +2007-03-26 + + - Update database to version 2007d + - Fix windows incompatibilities, working around limitations on that + platform. + - Fix 2.3 incompatibilities. Installation now requires distutils. + - Passing an invalid timezone name to timezone() now raises an + UnknownTimezoneError, which is a KeyError subclass for backwards + compatibility. + +2007-03-27 + + - Ensure API can accept Unicode strings (Bug #96957) + +2009-09-29 + + - Fix test_zdump tests and bugs the fixed tests picked up, including + the fix for Bug #427444. diff -Nru matplotlib-0.99.3/lib/pytz/__init__.py matplotlib-1.0.1/lib/pytz/__init__.py --- matplotlib-0.99.3/lib/pytz/__init__.py 2009-07-31 15:14:34.000000000 +0000 +++ matplotlib-1.0.1/lib/pytz/__init__.py 2011-01-05 15:59:56.000000000 +0000 @@ -8,29 +8,33 @@ on how to use these modules. ''' -# The Olson database has historically been updated about 4 times a year -OLSON_VERSION = '2008c' +# The Olson database is updated several times a year. +OLSON_VERSION = '2010o' VERSION = OLSON_VERSION +# Version format for a patch release - only one so far. #VERSION = OLSON_VERSION + '.2' __version__ = OLSON_VERSION OLSEN_VERSION = OLSON_VERSION # Old releases had this misspelling __all__ = [ - 'timezone', 'utc', 'country_timezones', - 'AmbiguousTimeError', 'UnknownTimeZoneError', + 'timezone', 'utc', 'country_timezones', 'country_names', + 'AmbiguousTimeError', 'InvalidTimeError', + 'NonExistentTimeError', 'UnknownTimeZoneError', 'all_timezones', 'all_timezones_set', 'common_timezones', 'common_timezones_set', ] import sys, datetime, os.path, gettext +from UserDict import DictMixin try: from pkg_resources import resource_stream except ImportError: resource_stream = None -from tzinfo import AmbiguousTimeError, unpickler +from tzinfo import AmbiguousTimeError, InvalidTimeError, NonExistentTimeError +from tzinfo import unpickler from tzfile import build_tzinfo # Use 2.3 sets module implementation if set builtin is not available @@ -43,19 +47,31 @@ def open_resource(name): """Open a resource from the zoneinfo subdir for reading. - Uses the pkg_resources module if available. + Uses the pkg_resources module if available and no standard file + found at the calculated location. """ - if resource_stream is not None: + name_parts = name.lstrip('/').split('/') + for part in name_parts: + if part == os.path.pardir or os.path.sep in part: + raise ValueError('Bad path segment: %r' % part) + filename = os.path.join(os.path.dirname(__file__), + 'zoneinfo', *name_parts) + if not os.path.exists(filename) and resource_stream is not None: + # http://bugs.launchpad.net/bugs/383171 - we avoid using this + # unless absolutely necessary to help when a broken version of + # pkg_resources is installed. return resource_stream(__name__, 'zoneinfo/' + name) - else: - name_parts = name.lstrip('/').split('/') - for part in name_parts: - if part == os.path.pardir or os.path.sep in part: - raise ValueError('Bad path segment: %r' % part) - filename = os.path.join(os.path.dirname(__file__), - 'zoneinfo', *name_parts) - return open(filename, 'rb') - + return open(filename, 'rb') + + +def resource_exists(name): + """Return true if the given resource exists""" + try: + open_resource(name) + return True + except IOError: + return False + # Enable this when we get some translations? # We want an i18n API that is useful to programs using Python's gettext @@ -92,7 +108,7 @@ def timezone(zone): r''' Return a datetime.tzinfo implementation for the given timezone - + >>> from datetime import datetime, timedelta >>> utc = timezone('UTC') >>> eastern = timezone('US/Eastern') @@ -139,7 +155,7 @@ _tzinfo_cache[zone] = build_tzinfo(zone, open_resource(zone)) else: raise UnknownTimeZoneError(zone) - + return _tzinfo_cache[zone] @@ -154,7 +170,7 @@ class UTC(datetime.tzinfo): """UTC - + Identical to the reference UTC implementation given in Python docs except that it unpickles using the single module global instance defined beneath this class declaration. @@ -164,6 +180,10 @@ """ zone = "UTC" + _utcoffset = ZERO + _dst = ZERO + _tzname = zone + def utcoffset(self, dt): return ZERO @@ -172,7 +192,7 @@ def dst(self, dt): return ZERO - + def __reduce__(self): return _UTC, () @@ -200,14 +220,14 @@ def _UTC(): """Factory function for utc unpickling. - + Makes sure that unpickling a utc instance always returns the same module global. - + These examples belong in the UTC class above, but it is obscured; or in the README.txt, but we are not depending on Python 2.4 so integrating the README.txt examples with the unit tests is not trivial. - + >>> import datetime, pickle >>> dt = datetime.datetime(2005, 3, 1, 14, 13, 21, tzinfo=utc) >>> naive = dt.replace(tzinfo=None) @@ -240,36 +260,83 @@ return unpickler(*args) _p.__safe_for_unpickling__ = True -_country_timezones_cache = {} -def country_timezones(iso3166_code): - """Return a list of timezones used in a particular country. +class _LazyDict(DictMixin): + """Dictionary populated on first use.""" + data = None + def __getitem__(self, key): + if self.data is None: + self._fill() + return self.data[key.upper()] + + def keys(self): + if self.data is None: + self._fill() + return self.data.keys() + + +class _CountryTimezoneDict(_LazyDict): + """Map ISO 3166 country code to a list of timezone names commonly used + in that country. iso3166_code is the two letter code used to identify the country. - >>> country_timezones('ch') + >>> country_timezones['ch'] ['Europe/Zurich'] - >>> country_timezones('CH') + >>> country_timezones['CH'] ['Europe/Zurich'] - >>> country_timezones(u'ch') + >>> country_timezones[u'ch'] ['Europe/Zurich'] - >>> country_timezones('XXX') + >>> country_timezones['XXX'] Traceback (most recent call last): ... KeyError: 'XXX' + + Previously, this information was exposed as a function rather than a + dictionary. This is still supported:: + + >>> country_timezones('nz') + ['Pacific/Auckland', 'Pacific/Chatham'] """ - iso3166_code = iso3166_code.upper() - if not _country_timezones_cache: + def __call__(self, iso3166_code): + """Backwards compatibility.""" + return self[iso3166_code] + + def _fill(self): + data = {} zone_tab = open_resource('zone.tab') for line in zone_tab: if line.startswith('#'): continue code, coordinates, zone = line.split(None, 4)[:3] + if zone not in all_timezones_set: + continue try: - _country_timezones_cache[code].append(zone) + data[code].append(zone) except KeyError: - _country_timezones_cache[code] = [zone] - return _country_timezones_cache[iso3166_code] + data[code] = [zone] + self.data = data + +country_timezones = _CountryTimezoneDict() + + +class _CountryNameDict(_LazyDict): + '''Dictionary proving ISO3166 code -> English name. + + >>> country_names['au'] + 'Australia' + ''' + def _fill(self): + data = {} + zone_tab = open_resource('iso3166.tab') + for line in zone_tab.readlines(): + if line.startswith('#'): + continue + code, name = line.split(None, 1) + data[code] = name.strip() + self.data = data + +country_names = _CountryNameDict() # Time-zone info based solely on fixed offsets @@ -291,8 +358,8 @@ return FixedOffset, (self._minutes, ) def dst(self, dt): - return None - + return ZERO + def tzname(self, dt): return None @@ -314,19 +381,23 @@ def FixedOffset(offset, _tzinfos = {}): """return a fixed-offset timezone based off a number of minutes. - + >>> one = FixedOffset(-330) >>> one pytz.FixedOffset(-330) >>> one.utcoffset(datetime.datetime.now()) datetime.timedelta(-1, 66600) + >>> one.dst(datetime.datetime.now()) + datetime.timedelta(0) >>> two = FixedOffset(1380) >>> two pytz.FixedOffset(1380) >>> two.utcoffset(datetime.datetime.now()) datetime.timedelta(0, 82800) - + >>> two.dst(datetime.datetime.now()) + datetime.timedelta(0) + The datetime.timedelta must be between the range of -1 and 1 day, non-inclusive. @@ -347,7 +418,7 @@ There should always be only one instance of a FixedOffset per timedelta. This should be true for multiple creation calls. - + >>> FixedOffset(-330) is one True >>> FixedOffset(1380) is two @@ -386,7 +457,7 @@ if __name__ == '__main__': _test() -common_timezones = \ +all_timezones = \ ['Africa/Abidjan', 'Africa/Accra', 'Africa/Addis_Ababa', @@ -445,11 +516,25 @@ 'America/Anguilla', 'America/Antigua', 'America/Araguaina', + 'America/Argentina/Buenos_Aires', + 'America/Argentina/Catamarca', + 'America/Argentina/ComodRivadavia', + 'America/Argentina/Cordoba', + 'America/Argentina/Jujuy', + 'America/Argentina/La_Rioja', + 'America/Argentina/Mendoza', + 'America/Argentina/Rio_Gallegos', + 'America/Argentina/Salta', + 'America/Argentina/San_Juan', + 'America/Argentina/San_Luis', + 'America/Argentina/Tucuman', + 'America/Argentina/Ushuaia', 'America/Aruba', 'America/Asuncion', 'America/Atikokan', 'America/Atka', 'America/Bahia', + 'America/Bahia_Banderas', 'America/Barbados', 'America/Belem', 'America/Belize', @@ -496,12 +581,22 @@ 'America/Halifax', 'America/Havana', 'America/Hermosillo', + 'America/Indiana/Indianapolis', + 'America/Indiana/Knox', + 'America/Indiana/Marengo', + 'America/Indiana/Petersburg', + 'America/Indiana/Tell_City', + 'America/Indiana/Vevay', + 'America/Indiana/Vincennes', + 'America/Indiana/Winamac', 'America/Indianapolis', 'America/Inuvik', 'America/Iqaluit', 'America/Jamaica', 'America/Jujuy', 'America/Juneau', + 'America/Kentucky/Louisville', + 'America/Kentucky/Monticello', 'America/Knox_IN', 'America/La_Paz', 'America/Lima', @@ -512,6 +607,7 @@ 'America/Manaus', 'America/Marigot', 'America/Martinique', + 'America/Matamoros', 'America/Mazatlan', 'America/Mendoza', 'America/Menominee', @@ -528,6 +624,9 @@ 'America/Nipigon', 'America/Nome', 'America/Noronha', + 'America/North_Dakota/Center', + 'America/North_Dakota/New_Salem', + 'America/Ojinaga', 'America/Panama', 'America/Pangnirtung', 'America/Paramaribo', @@ -544,6 +643,8 @@ 'America/Resolute', 'America/Rio_Branco', 'America/Rosario', + 'America/Santa_Isabel', + 'America/Santarem', 'America/Santiago', 'America/Santo_Domingo', 'America/Sao_Paulo', @@ -571,6 +672,7 @@ 'Antarctica/Casey', 'Antarctica/Davis', 'Antarctica/DumontDUrville', + 'Antarctica/Macquarie', 'Antarctica/Mawson', 'Antarctica/McMurdo', 'Antarctica/Palmer', @@ -619,6 +721,7 @@ 'Asia/Kamchatka', 'Asia/Karachi', 'Asia/Kashgar', + 'Asia/Kathmandu', 'Asia/Katmandu', 'Asia/Kolkata', 'Asia/Krasnoyarsk', @@ -632,6 +735,7 @@ 'Asia/Manila', 'Asia/Muscat', 'Asia/Nicosia', + 'Asia/Novokuznetsk', 'Asia/Novosibirsk', 'Asia/Omsk', 'Asia/Oral', @@ -704,6 +808,8 @@ 'Brazil/DeNoronha', 'Brazil/East', 'Brazil/West', + 'CET', + 'CST6CDT', 'Canada/Atlantic', 'Canada/Central', 'Canada/East-Saskatchewan', @@ -715,6 +821,47 @@ 'Canada/Yukon', 'Chile/Continental', 'Chile/EasterIsland', + 'Cuba', + 'EET', + 'EST', + 'EST5EDT', + 'Egypt', + 'Eire', + 'Etc/GMT', + 'Etc/GMT+0', + 'Etc/GMT+1', + 'Etc/GMT+10', + 'Etc/GMT+11', + 'Etc/GMT+12', + 'Etc/GMT+2', + 'Etc/GMT+3', + 'Etc/GMT+4', + 'Etc/GMT+5', + 'Etc/GMT+6', + 'Etc/GMT+7', + 'Etc/GMT+8', + 'Etc/GMT+9', + 'Etc/GMT-0', + 'Etc/GMT-1', + 'Etc/GMT-10', + 'Etc/GMT-11', + 'Etc/GMT-12', + 'Etc/GMT-13', + 'Etc/GMT-14', + 'Etc/GMT-2', + 'Etc/GMT-3', + 'Etc/GMT-4', + 'Etc/GMT-5', + 'Etc/GMT-6', + 'Etc/GMT-7', + 'Etc/GMT-8', + 'Etc/GMT-9', + 'Etc/GMT0', + 'Etc/Greenwich', + 'Etc/UCT', + 'Etc/UTC', + 'Etc/Universal', + 'Etc/Zulu', 'Europe/Amsterdam', 'Europe/Andorra', 'Europe/Athens', @@ -773,7 +920,16 @@ 'Europe/Zagreb', 'Europe/Zaporozhye', 'Europe/Zurich', + 'GB', + 'GB-Eire', 'GMT', + 'GMT+0', + 'GMT-0', + 'GMT0', + 'Greenwich', + 'HST', + 'Hongkong', + 'Iceland', 'Indian/Antananarivo', 'Indian/Chagos', 'Indian/Christmas', @@ -785,12 +941,27 @@ 'Indian/Mauritius', 'Indian/Mayotte', 'Indian/Reunion', + 'Iran', + 'Israel', + 'Jamaica', + 'Japan', + 'Kwajalein', + 'Libya', + 'MET', + 'MST', + 'MST7MDT', 'Mexico/BajaNorte', 'Mexico/BajaSur', 'Mexico/General', + 'NZ', + 'NZ-CHAT', + 'Navajo', + 'PRC', + 'PST8PDT', 'Pacific/Apia', 'Pacific/Auckland', 'Pacific/Chatham', + 'Pacific/Chuuk', 'Pacific/Easter', 'Pacific/Efate', 'Pacific/Enderbury', @@ -816,6 +987,7 @@ 'Pacific/Pago_Pago', 'Pacific/Palau', 'Pacific/Pitcairn', + 'Pacific/Pohnpei', 'Pacific/Ponape', 'Pacific/Port_Moresby', 'Pacific/Rarotonga', @@ -828,6 +1000,13 @@ 'Pacific/Wake', 'Pacific/Wallis', 'Pacific/Yap', + 'Poland', + 'Portugal', + 'ROC', + 'ROK', + 'Singapore', + 'Turkey', + 'UCT', 'US/Alaska', 'US/Aleutian', 'US/Arizona', @@ -841,16 +1020,21 @@ 'US/Pacific', 'US/Pacific-New', 'US/Samoa', - 'UTC'] -common_timezones_set = set(common_timezones) - -all_timezones = \ + 'UTC', + 'Universal', + 'W-SU', + 'WET', + 'Zulu'] +all_timezones = [ + tz for tz in all_timezones if resource_exists(tz)] + +all_timezones_set = set(all_timezones) +common_timezones = \ ['Africa/Abidjan', 'Africa/Accra', 'Africa/Addis_Ababa', 'Africa/Algiers', 'Africa/Asmara', - 'Africa/Asmera', 'Africa/Bamako', 'Africa/Bangui', 'Africa/Banjul', @@ -894,7 +1078,6 @@ 'Africa/Ouagadougou', 'Africa/Porto-Novo', 'Africa/Sao_Tome', - 'Africa/Timbuktu', 'Africa/Tripoli', 'Africa/Tunis', 'Africa/Windhoek', @@ -905,12 +1088,12 @@ 'America/Araguaina', 'America/Argentina/Buenos_Aires', 'America/Argentina/Catamarca', - 'America/Argentina/ComodRivadavia', 'America/Argentina/Cordoba', 'America/Argentina/Jujuy', 'America/Argentina/La_Rioja', 'America/Argentina/Mendoza', 'America/Argentina/Rio_Gallegos', + 'America/Argentina/Salta', 'America/Argentina/San_Juan', 'America/Argentina/San_Luis', 'America/Argentina/Tucuman', @@ -918,8 +1101,8 @@ 'America/Aruba', 'America/Asuncion', 'America/Atikokan', - 'America/Atka', 'America/Bahia', + 'America/Bahia_Banderas', 'America/Barbados', 'America/Belem', 'America/Belize', @@ -927,18 +1110,14 @@ 'America/Boa_Vista', 'America/Bogota', 'America/Boise', - 'America/Buenos_Aires', 'America/Cambridge_Bay', 'America/Campo_Grande', 'America/Cancun', 'America/Caracas', - 'America/Catamarca', 'America/Cayenne', 'America/Cayman', 'America/Chicago', 'America/Chihuahua', - 'America/Coral_Harbour', - 'America/Cordoba', 'America/Costa_Rica', 'America/Cuiaba', 'America/Curacao', @@ -951,8 +1130,6 @@ 'America/Edmonton', 'America/Eirunepe', 'America/El_Salvador', - 'America/Ensenada', - 'America/Fort_Wayne', 'America/Fortaleza', 'America/Glace_Bay', 'America/Godthab', @@ -974,26 +1151,22 @@ 'America/Indiana/Vevay', 'America/Indiana/Vincennes', 'America/Indiana/Winamac', - 'America/Indianapolis', 'America/Inuvik', 'America/Iqaluit', 'America/Jamaica', - 'America/Jujuy', 'America/Juneau', 'America/Kentucky/Louisville', 'America/Kentucky/Monticello', - 'America/Knox_IN', 'America/La_Paz', 'America/Lima', 'America/Los_Angeles', - 'America/Louisville', 'America/Maceio', 'America/Managua', 'America/Manaus', 'America/Marigot', 'America/Martinique', + 'America/Matamoros', 'America/Mazatlan', - 'America/Mendoza', 'America/Menominee', 'America/Merida', 'America/Mexico_City', @@ -1010,13 +1183,13 @@ 'America/Noronha', 'America/North_Dakota/Center', 'America/North_Dakota/New_Salem', + 'America/Ojinaga', 'America/Panama', 'America/Pangnirtung', 'America/Paramaribo', 'America/Phoenix', 'America/Port-au-Prince', 'America/Port_of_Spain', - 'America/Porto_Acre', 'America/Porto_Velho', 'America/Puerto_Rico', 'America/Rainy_River', @@ -1025,7 +1198,8 @@ 'America/Regina', 'America/Resolute', 'America/Rio_Branco', - 'America/Rosario', + 'America/Santa_Isabel', + 'America/Santarem', 'America/Santiago', 'America/Santo_Domingo', 'America/Sao_Paulo', @@ -1045,7 +1219,6 @@ 'America/Toronto', 'America/Tortola', 'America/Vancouver', - 'America/Virgin', 'America/Whitehorse', 'America/Winnipeg', 'America/Yakutat', @@ -1053,6 +1226,7 @@ 'Antarctica/Casey', 'Antarctica/Davis', 'Antarctica/DumontDUrville', + 'Antarctica/Macquarie', 'Antarctica/Mawson', 'Antarctica/McMurdo', 'Antarctica/Palmer', @@ -1068,7 +1242,6 @@ 'Asia/Aqtau', 'Asia/Aqtobe', 'Asia/Ashgabat', - 'Asia/Ashkhabad', 'Asia/Baghdad', 'Asia/Bahrain', 'Asia/Baku', @@ -1076,12 +1249,9 @@ 'Asia/Beirut', 'Asia/Bishkek', 'Asia/Brunei', - 'Asia/Calcutta', 'Asia/Choibalsan', 'Asia/Chongqing', - 'Asia/Chungking', 'Asia/Colombo', - 'Asia/Dacca', 'Asia/Damascus', 'Asia/Dhaka', 'Asia/Dili', @@ -1093,7 +1263,6 @@ 'Asia/Hong_Kong', 'Asia/Hovd', 'Asia/Irkutsk', - 'Asia/Istanbul', 'Asia/Jakarta', 'Asia/Jayapura', 'Asia/Jerusalem', @@ -1101,19 +1270,19 @@ 'Asia/Kamchatka', 'Asia/Karachi', 'Asia/Kashgar', - 'Asia/Katmandu', + 'Asia/Kathmandu', 'Asia/Kolkata', 'Asia/Krasnoyarsk', 'Asia/Kuala_Lumpur', 'Asia/Kuching', 'Asia/Kuwait', - 'Asia/Macao', 'Asia/Macau', 'Asia/Magadan', 'Asia/Makassar', 'Asia/Manila', 'Asia/Muscat', 'Asia/Nicosia', + 'Asia/Novokuznetsk', 'Asia/Novosibirsk', 'Asia/Omsk', 'Asia/Oral', @@ -1124,7 +1293,6 @@ 'Asia/Qyzylorda', 'Asia/Rangoon', 'Asia/Riyadh', - 'Asia/Saigon', 'Asia/Sakhalin', 'Asia/Samarkand', 'Asia/Seoul', @@ -1134,13 +1302,9 @@ 'Asia/Tashkent', 'Asia/Tbilisi', 'Asia/Tehran', - 'Asia/Tel_Aviv', - 'Asia/Thimbu', 'Asia/Thimphu', 'Asia/Tokyo', - 'Asia/Ujung_Pandang', 'Asia/Ulaanbaatar', - 'Asia/Ulan_Bator', 'Asia/Urumqi', 'Asia/Vientiane', 'Asia/Vladivostok', @@ -1151,99 +1315,33 @@ 'Atlantic/Bermuda', 'Atlantic/Canary', 'Atlantic/Cape_Verde', - 'Atlantic/Faeroe', 'Atlantic/Faroe', - 'Atlantic/Jan_Mayen', 'Atlantic/Madeira', 'Atlantic/Reykjavik', 'Atlantic/South_Georgia', 'Atlantic/St_Helena', 'Atlantic/Stanley', - 'Australia/ACT', 'Australia/Adelaide', 'Australia/Brisbane', 'Australia/Broken_Hill', - 'Australia/Canberra', 'Australia/Currie', 'Australia/Darwin', 'Australia/Eucla', 'Australia/Hobart', - 'Australia/LHI', 'Australia/Lindeman', 'Australia/Lord_Howe', 'Australia/Melbourne', - 'Australia/NSW', - 'Australia/North', 'Australia/Perth', - 'Australia/Queensland', - 'Australia/South', 'Australia/Sydney', - 'Australia/Tasmania', - 'Australia/Victoria', - 'Australia/West', - 'Australia/Yancowinna', - 'Brazil/Acre', - 'Brazil/DeNoronha', - 'Brazil/East', - 'Brazil/West', - 'CET', - 'CST6CDT', 'Canada/Atlantic', 'Canada/Central', - 'Canada/East-Saskatchewan', 'Canada/Eastern', 'Canada/Mountain', 'Canada/Newfoundland', 'Canada/Pacific', - 'Canada/Saskatchewan', - 'Canada/Yukon', - 'Chile/Continental', - 'Chile/EasterIsland', - 'Cuba', - 'EET', - 'EST', - 'EST5EDT', - 'Egypt', - 'Eire', - 'Etc/GMT', - 'Etc/GMT+0', - 'Etc/GMT+1', - 'Etc/GMT+10', - 'Etc/GMT+11', - 'Etc/GMT+12', - 'Etc/GMT+2', - 'Etc/GMT+3', - 'Etc/GMT+4', - 'Etc/GMT+5', - 'Etc/GMT+6', - 'Etc/GMT+7', - 'Etc/GMT+8', - 'Etc/GMT+9', - 'Etc/GMT-0', - 'Etc/GMT-1', - 'Etc/GMT-10', - 'Etc/GMT-11', - 'Etc/GMT-12', - 'Etc/GMT-13', - 'Etc/GMT-14', - 'Etc/GMT-2', - 'Etc/GMT-3', - 'Etc/GMT-4', - 'Etc/GMT-5', - 'Etc/GMT-6', - 'Etc/GMT-7', - 'Etc/GMT-8', - 'Etc/GMT-9', - 'Etc/GMT0', - 'Etc/Greenwich', - 'Etc/UCT', - 'Etc/UTC', - 'Etc/Universal', - 'Etc/Zulu', 'Europe/Amsterdam', 'Europe/Andorra', 'Europe/Athens', - 'Europe/Belfast', 'Europe/Belgrade', 'Europe/Berlin', 'Europe/Bratislava', @@ -1271,7 +1369,6 @@ 'Europe/Minsk', 'Europe/Monaco', 'Europe/Moscow', - 'Europe/Nicosia', 'Europe/Oslo', 'Europe/Paris', 'Europe/Podgorica', @@ -1287,7 +1384,6 @@ 'Europe/Stockholm', 'Europe/Tallinn', 'Europe/Tirane', - 'Europe/Tiraspol', 'Europe/Uzhgorod', 'Europe/Vaduz', 'Europe/Vatican', @@ -1298,16 +1394,7 @@ 'Europe/Zagreb', 'Europe/Zaporozhye', 'Europe/Zurich', - 'GB', - 'GB-Eire', 'GMT', - 'GMT+0', - 'GMT-0', - 'GMT0', - 'Greenwich', - 'HST', - 'Hongkong', - 'Iceland', 'Indian/Antananarivo', 'Indian/Chagos', 'Indian/Christmas', @@ -1319,26 +1406,10 @@ 'Indian/Mauritius', 'Indian/Mayotte', 'Indian/Reunion', - 'Iran', - 'Israel', - 'Jamaica', - 'Japan', - 'Kwajalein', - 'Libya', - 'MET', - 'MST', - 'MST7MDT', - 'Mexico/BajaNorte', - 'Mexico/BajaSur', - 'Mexico/General', - 'NZ', - 'NZ-CHAT', - 'Navajo', - 'PRC', - 'PST8PDT', 'Pacific/Apia', 'Pacific/Auckland', 'Pacific/Chatham', + 'Pacific/Chuuk', 'Pacific/Easter', 'Pacific/Efate', 'Pacific/Enderbury', @@ -1364,42 +1435,24 @@ 'Pacific/Pago_Pago', 'Pacific/Palau', 'Pacific/Pitcairn', - 'Pacific/Ponape', + 'Pacific/Pohnpei', 'Pacific/Port_Moresby', 'Pacific/Rarotonga', 'Pacific/Saipan', - 'Pacific/Samoa', 'Pacific/Tahiti', 'Pacific/Tarawa', 'Pacific/Tongatapu', - 'Pacific/Truk', 'Pacific/Wake', 'Pacific/Wallis', - 'Pacific/Yap', - 'Poland', - 'Portugal', - 'ROC', - 'ROK', - 'Singapore', - 'Turkey', - 'UCT', 'US/Alaska', - 'US/Aleutian', 'US/Arizona', 'US/Central', - 'US/East-Indiana', 'US/Eastern', 'US/Hawaii', - 'US/Indiana-Starke', - 'US/Michigan', 'US/Mountain', 'US/Pacific', - 'US/Pacific-New', - 'US/Samoa', - 'UTC', - 'Universal', - 'W-SU', - 'WET', - 'Zulu', - 'posixrules'] -all_timezones_set = set(all_timezones) + 'UTC'] +common_timezones = [ + tz for tz in common_timezones if tz in all_timezones] + +common_timezones_set = set(common_timezones) diff -Nru matplotlib-0.99.3/lib/pytz/LICENSE.txt matplotlib-1.0.1/lib/pytz/LICENSE.txt --- matplotlib-0.99.3/lib/pytz/LICENSE.txt 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/pytz/LICENSE.txt 2010-07-07 01:41:49.000000000 +0000 @@ -0,0 +1,19 @@ +Copyright (c) 2003-2009 Stuart Bishop + +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. diff -Nru matplotlib-0.99.3/lib/pytz/README.txt matplotlib-1.0.1/lib/pytz/README.txt --- matplotlib-0.99.3/lib/pytz/README.txt 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/pytz/README.txt 2010-07-07 01:41:49.000000000 +0000 @@ -0,0 +1,543 @@ +pytz - World Timezone Definitions for Python +============================================ + +:Author: Stuart Bishop + +Introduction +~~~~~~~~~~~~ + +pytz brings the Olson tz database into Python. This library allows +accurate and cross platform timezone calculations using Python 2.3 +or higher. It also solves the issue of ambiguous times at the end +of daylight savings, which you can read more about in the Python +Library Reference (``datetime.tzinfo``). + +Amost all of the Olson timezones are supported. + +Note that this library differs from the documented Python API for +tzinfo implementations; if you want to create local wallclock +times you need to use the ``localize()`` method documented in this +document. In addition, if you perform date arithmetic on local +times that cross DST boundaries, the results may be in an incorrect +timezone (ie. subtract 1 minute from 2002-10-27 1:00 EST and you get +2002-10-27 0:59 EST instead of the correct 2002-10-27 1:59 EDT). A +``normalize()`` method is provided to correct this. Unfortunatly these +issues cannot be resolved without modifying the Python datetime +implementation. + + +Installation +~~~~~~~~~~~~ + +This package can either be installed from a .egg file using setuptools, +or from the tarball using the standard Python distutils. + +If you are installing from a tarball, run the following command as an +administrative user:: + + python setup.py install + +If you are installing using setuptools, you don't even need to download +anything as the latest version will be downloaded for you +from the Python package index:: + + easy_install --upgrade pytz + +If you already have the .egg file, you can use that too:: + + easy_install pytz-2008g-py2.6.egg + + +Example & Usage +~~~~~~~~~~~~~~~ + +Localized times and date arithmetic +----------------------------------- + +>>> from datetime import datetime, timedelta +>>> from pytz import timezone +>>> import pytz +>>> utc = pytz.utc +>>> utc.zone +'UTC' +>>> eastern = timezone('US/Eastern') +>>> eastern.zone +'US/Eastern' +>>> amsterdam = timezone('Europe/Amsterdam') +>>> fmt = '%Y-%m-%d %H:%M:%S %Z%z' + +This library only supports two ways of building a localized time. The +first is to use the ``localize()`` method provided by the pytz library. +This is used to localize a naive datetime (datetime with no timezone +information): + +>>> loc_dt = eastern.localize(datetime(2002, 10, 27, 6, 0, 0)) +>>> print loc_dt.strftime(fmt) +2002-10-27 06:00:00 EST-0500 + +The second way of building a localized time is by converting an existing +localized time using the standard ``astimezone()`` method: + +>>> ams_dt = loc_dt.astimezone(amsterdam) +>>> ams_dt.strftime(fmt) +'2002-10-27 12:00:00 CET+0100' + +Unfortunately using the tzinfo argument of the standard datetime +constructors ''does not work'' with pytz for many timezones. + +>>> datetime(2002, 10, 27, 12, 0, 0, tzinfo=amsterdam).strftime(fmt) +'2002-10-27 12:00:00 AMT+0020' + +It is safe for timezones without daylight savings trasitions though, such +as UTC: + +>>> datetime(2002, 10, 27, 12, 0, 0, tzinfo=pytz.utc).strftime(fmt) +'2002-10-27 12:00:00 UTC+0000' + +The preferred way of dealing with times is to always work in UTC, +converting to localtime only when generating output to be read +by humans. + +>>> utc_dt = datetime(2002, 10, 27, 6, 0, 0, tzinfo=utc) +>>> loc_dt = utc_dt.astimezone(eastern) +>>> loc_dt.strftime(fmt) +'2002-10-27 01:00:00 EST-0500' + +This library also allows you to do date arithmetic using local +times, although it is more complicated than working in UTC as you +need to use the ``normalize()`` method to handle daylight savings time +and other timezone transitions. In this example, ``loc_dt`` is set +to the instant when daylight savings time ends in the US/Eastern +timezone. + +>>> before = loc_dt - timedelta(minutes=10) +>>> before.strftime(fmt) +'2002-10-27 00:50:00 EST-0500' +>>> eastern.normalize(before).strftime(fmt) +'2002-10-27 01:50:00 EDT-0400' +>>> after = eastern.normalize(before + timedelta(minutes=20)) +>>> after.strftime(fmt) +'2002-10-27 01:10:00 EST-0500' + +Creating localtimes is also tricky, and the reason why working with +local times is not recommended. Unfortunately, you cannot just pass +a ``tzinfo`` argument when constructing a datetime (see the next +section for more details) + +>>> dt = datetime(2002, 10, 27, 1, 30, 0) +>>> dt1 = eastern.localize(dt, is_dst=True) +>>> dt1.strftime(fmt) +'2002-10-27 01:30:00 EDT-0400' +>>> dt2 = eastern.localize(dt, is_dst=False) +>>> dt2.strftime(fmt) +'2002-10-27 01:30:00 EST-0500' + +Converting between timezones also needs special attention. This also +needs to use the ``normalize()`` method to ensure the conversion is +correct. + +>>> utc_dt = utc.localize(datetime.utcfromtimestamp(1143408899)) +>>> utc_dt.strftime(fmt) +'2006-03-26 21:34:59 UTC+0000' +>>> au_tz = timezone('Australia/Sydney') +>>> au_dt = au_tz.normalize(utc_dt.astimezone(au_tz)) +>>> au_dt.strftime(fmt) +'2006-03-27 08:34:59 EST+1100' +>>> utc_dt2 = utc.normalize(au_dt.astimezone(utc)) +>>> utc_dt2.strftime(fmt) +'2006-03-26 21:34:59 UTC+0000' + +You can take shortcuts when dealing with the UTC side of timezone +conversions. ``normalize()`` and ``localize()`` are not really +necessary when there are no daylight savings time transitions to +deal with. + +>>> utc_dt = datetime.utcfromtimestamp(1143408899).replace(tzinfo=utc) +>>> utc_dt.strftime(fmt) +'2006-03-26 21:34:59 UTC+0000' +>>> au_tz = timezone('Australia/Sydney') +>>> au_dt = au_tz.normalize(utc_dt.astimezone(au_tz)) +>>> au_dt.strftime(fmt) +'2006-03-27 08:34:59 EST+1100' +>>> utc_dt2 = au_dt.astimezone(utc) +>>> utc_dt2.strftime(fmt) +'2006-03-26 21:34:59 UTC+0000' + + +``tzinfo`` API +-------------- + +The ``tzinfo`` instances returned by the ``timezone()`` function have +been extended to cope with ambiguous times by adding an ``is_dst`` +parameter to the ``utcoffset()``, ``dst()`` && ``tzname()`` methods. + +>>> tz = timezone('America/St_Johns') + +>>> normal = datetime(2009, 9, 1) +>>> ambiguous = datetime(2009, 10, 31, 23, 30) + +the ``is_dst`` parameter is ignormed for most timestamps, but +is used to resolve the ambiguity during ambiguous periods caused +to DST transitions. + +>>> tz.utcoffset(normal, is_dst=True) +datetime.timedelta(-1, 77400) +>>> tz.dst(normal, is_dst=True) +datetime.timedelta(0, 3600) +>>> tz.tzname(normal, is_dst=True) +'NDT' + +>>> tz.utcoffset(ambiguous, is_dst=True) +datetime.timedelta(-1, 77400) +>>> tz.dst(ambiguous, is_dst=True) +datetime.timedelta(0, 3600) +>>> tz.tzname(ambiguous, is_dst=True) +'NDT' + +>>> tz.utcoffset(normal, is_dst=False) +datetime.timedelta(-1, 77400) +>>> tz.dst(normal, is_dst=False) +datetime.timedelta(0, 3600) +>>> tz.tzname(normal, is_dst=False) +'NDT' + +>>> tz.utcoffset(ambiguous, is_dst=False) +datetime.timedelta(-1, 73800) +>>> tz.dst(ambiguous, is_dst=False) +datetime.timedelta(0) +>>> tz.tzname(ambiguous, is_dst=False) +'NST' + +If ``is_dst`` is not specified, ambiguous timestamps will raise +an ``AmbiguousTimeError`` exception. + +>>> tz.utcoffset(normal) +datetime.timedelta(-1, 77400) +>>> tz.dst(normal) +datetime.timedelta(0, 3600) +>>> tz.tzname(normal) +'NDT' + +>>> tz.utcoffset(ambiguous) +Traceback (most recent call last): +[...] +AmbiguousTimeError: 2009-10-31 23:30:00 +>>> tz.dst(ambiguous) +Traceback (most recent call last): +[...] +AmbiguousTimeError: 2009-10-31 23:30:00 +>>> tz.tzname(ambiguous) +Traceback (most recent call last): +[...] +AmbiguousTimeError: 2009-10-31 23:30:00 + + +Problems with Localtime +~~~~~~~~~~~~~~~~~~~~~~~ + +The major problem we have to deal with is that certain datetimes +may occur twice in a year. For example, in the US/Eastern timezone +on the last Sunday morning in October, the following sequence +happens: + + - 01:00 EDT occurs + - 1 hour later, instead of 2:00am the clock is turned back 1 hour + and 01:00 happens again (this time 01:00 EST) + +In fact, every instant between 01:00 and 02:00 occurs twice. This means +that if you try and create a time in the 'US/Eastern' timezone using +the standard datetime syntax, there is no way to specify if you meant +before of after the end-of-daylight-savings-time transition. + +>>> loc_dt = datetime(2002, 10, 27, 1, 30, 00, tzinfo=eastern) +>>> loc_dt.strftime(fmt) +'2002-10-27 01:30:00 EST-0500' + +As you can see, the system has chosen one for you and there is a 50% +chance of it being out by one hour. For some applications, this does +not matter. However, if you are trying to schedule meetings with people +in different timezones or analyze log files it is not acceptable. + +The best and simplest solution is to stick with using UTC. The pytz +package encourages using UTC for internal timezone representation by +including a special UTC implementation based on the standard Python +reference implementation in the Python documentation. This timezone +unpickles to be the same instance, and pickles to a relatively small +size. The UTC implementation can be obtained as pytz.utc, pytz.UTC, +or pytz.timezone('UTC'). + +>>> import pickle, pytz +>>> dt = datetime(2005, 3, 1, 14, 13, 21, tzinfo=utc) +>>> naive = dt.replace(tzinfo=None) +>>> p = pickle.dumps(dt, 1) +>>> naive_p = pickle.dumps(naive, 1) +>>> len(p), len(naive_p), len(p) - len(naive_p) +(60, 43, 17) +>>> new = pickle.loads(p) +>>> new == dt +True +>>> new is dt +False +>>> new.tzinfo is dt.tzinfo +True +>>> pytz.utc is pytz.UTC is pytz.timezone('UTC') +True + +Note that this instance is not the same instance (or implementation) as +other timezones with the same meaning (GMT, Greenwich, Universal, etc.). + +>>> utc is pytz.timezone('GMT') +False + +If you insist on working with local times, this library provides a +facility for constructing them unambiguously: + +>>> loc_dt = datetime(2002, 10, 27, 1, 30, 00) +>>> est_dt = eastern.localize(loc_dt, is_dst=True) +>>> edt_dt = eastern.localize(loc_dt, is_dst=False) +>>> print est_dt.strftime(fmt), '/', edt_dt.strftime(fmt) +2002-10-27 01:30:00 EDT-0400 / 2002-10-27 01:30:00 EST-0500 + +If you pass None as the is_dst flag to localize(), pytz will refuse to +guess and raise exceptions if you try to build ambiguous or non-existent +times. + +For example, 1:30am on 27th Oct 2002 happened twice in the US/Eastern +timezone when the clocks where put back at the end of Daylight Savings +Time: + +>>> eastern.localize(datetime(2002, 10, 27, 1, 30, 00), is_dst=None) +Traceback (most recent call last): +... +AmbiguousTimeError: 2002-10-27 01:30:00 + +Similarly, 2:30am on 7th April 2002 never happened at all in the +US/Eastern timezone, as the clocks where put forward at 2:00am skipping +the entire hour: + +>>> eastern.localize(datetime(2002, 4, 7, 2, 30, 00), is_dst=None) +Traceback (most recent call last): +... +NonExistentTimeError: 2002-04-07 02:30:00 + +Both of these exceptions share a common base class to make error handling +easier: + +>>> isinstance(pytz.AmbiguousTimeError(), pytz.InvalidTimeError) +True +>>> isinstance(pytz.NonExistentTimeError(), pytz.InvalidTimeError) +True + +Although ``localize()`` handles many cases, it is still not possible +to handle all. In cases where countries change their timezone definitions, +cases like the end-of-daylight-savings-time occur with no way of resolving +the ambiguity. For example, in 1915 Warsaw switched from Warsaw time to +Central European time. So at the stroke of midnight on August 5th 1915 +the clocks were wound back 24 minutes creating an ambiguous time period +that cannot be specified without referring to the timezone abbreviation +or the actual UTC offset. In this case midnight happened twice, neither +time during a daylight savings time period: + +>>> warsaw = pytz.timezone('Europe/Warsaw') +>>> loc_dt1 = warsaw.localize(datetime(1915, 8, 4, 23, 59, 59), is_dst=False) +>>> loc_dt1.strftime(fmt) +'1915-08-04 23:59:59 WMT+0124' +>>> loc_dt2 = warsaw.localize(datetime(1915, 8, 5, 00, 00, 00), is_dst=False) +>>> loc_dt2.strftime(fmt) +'1915-08-05 00:00:00 CET+0100' +>>> str(loc_dt2 - loc_dt1) +'0:24:01' + +The only way of creating a time during the missing 24 minutes is +converting from another timezone - because neither of the timezones +involved where in daylight savings mode the API simply provides no way +to express it: + +>>> utc_dt = datetime(1915, 8, 4, 22, 36, tzinfo=pytz.utc) +>>> utc_dt.astimezone(warsaw).strftime(fmt) +'1915-08-04 23:36:00 CET+0100' + +The standard Python way of handling all these ambiguities is not to +handle them, such as demonstrated in this example using the US/Eastern +timezone definition from the Python documentation (Note that this +implementation only works for dates between 1987 and 2006 - it is +included for tests only!): + +>>> from pytz.reference import Eastern # pytz.reference only for tests +>>> dt = datetime(2002, 10, 27, 0, 30, tzinfo=Eastern) +>>> str(dt) +'2002-10-27 00:30:00-04:00' +>>> str(dt + timedelta(hours=1)) +'2002-10-27 01:30:00-05:00' +>>> str(dt + timedelta(hours=2)) +'2002-10-27 02:30:00-05:00' +>>> str(dt + timedelta(hours=3)) +'2002-10-27 03:30:00-05:00' + +Notice the first two results? At first glance you might think they are +correct, but taking the UTC offset into account you find that they are +actually two hours appart instead of the 1 hour we asked for. + +>>> from pytz.reference import UTC # pytz.reference only for tests +>>> str(dt.astimezone(UTC)) +'2002-10-27 04:30:00+00:00' +>>> str((dt + timedelta(hours=1)).astimezone(UTC)) +'2002-10-27 06:30:00+00:00' + + +Country Information +~~~~~~~~~~~~~~~~~~~ + +A mechanism is provided to access the timezones commonly in use +for a particular country, looked up using the ISO 3166 country code. +It returns a list of strings that can be used to retrieve the relevant +tzinfo instance using ``pytz.timezone()``: + +>>> pytz.country_timezones['nz'] +['Pacific/Auckland', 'Pacific/Chatham'] + +The Olson database comes with a ISO 3166 country code to English country +name mapping that pytz exposes as a dictionary: + +>>> pytz.country_names['nz'] +'New Zealand' + + +What is UTC +~~~~~~~~~~~ + +'UTC' is Universal Time, also known as Greenwich Mean Time or GMT +in the United Kingdom. All other timezones are given as offsets from +UTC. No daylight savings time occurs in UTC, making it a useful timezone +to perform date arithmetic without worrying about the confusion and +ambiguities caused by daylight savings time transitions, your country +changing its timezone, or mobile computers that move roam through +multiple timezones. + + +Helpers +~~~~~~~ + +There are two lists of timezones provided. + +``all_timezones`` is the exhaustive list of the timezone names that can +be used. + +>>> from pytz import all_timezones +>>> len(all_timezones) >= 500 +True +>>> 'Etc/Greenwich' in all_timezones +True + +``common_timezones`` is a list of useful, current timezones. It doesn't +contain deprecated zones or historical zones, except for a few I've +deemed in common usage, such as US/Eastern (open a bug report if you +think other timezones are deserving of being included here). It is also +a sequence of strings. + +>>> from pytz import common_timezones +>>> len(common_timezones) < len(all_timezones) +True +>>> 'Etc/Greenwich' in common_timezones +False +>>> 'Australia/Melbourne' in common_timezones +True +>>> 'US/Eastern' in common_timezones +True +>>> 'Canada/Eastern' in common_timezones +True +>>> 'US/Pacific-New' in all_timezones +True +>>> 'US/Pacific-New' in common_timezones +False + +Both ``common_timezones`` and ``all_timezones`` are alphabetically +sorted: + +>>> common_timezones_dupe = common_timezones[:] +>>> common_timezones_dupe.sort() +>>> common_timezones == common_timezones_dupe +True +>>> all_timezones_dupe = all_timezones[:] +>>> all_timezones_dupe.sort() +>>> all_timezones == all_timezones_dupe +True + +``all_timezones`` and ``common_timezones`` are also available as sets. + +>>> from pytz import all_timezones_set, common_timezones_set +>>> 'US/Eastern' in all_timezones_set +True +>>> 'US/Eastern' in common_timezones_set +True +>>> 'Australia/Victoria' in common_timezones_set +False + +You can also retrieve lists of timezones used by particular countries +using the ``country_timezones()`` function. It requires an ISO-3166 +two letter country code. + +>>> from pytz import country_timezones +>>> country_timezones('ch') +['Europe/Zurich'] +>>> country_timezones('CH') +['Europe/Zurich'] + + +License +~~~~~~~ + +MIT license. + +This code is also available as part of Zope 3 under the Zope Public +License, Version 2.1 (ZPL). + +I'm happy to relicense this code if necessary for inclusion in other +open source projects. + + +Latest Versions +~~~~~~~~~~~~~~~ + +This package will be updated after releases of the Olson timezone +database. The latest version can be downloaded from the `Python Package +Index `_. The code that is used +to generate this distribution is hosted on launchpad.net and available +using the `Bazaar version control system `_ +using:: + + bzr branch lp:pytz + + +Bugs, Feature Requests & Patches +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Bugs can be reported using `Launchpad `_. + + +Issues & Limitations +~~~~~~~~~~~~~~~~~~~~ + +- Offsets from UTC are rounded to the nearest whole minute, so timezones + such as Europe/Amsterdam pre 1937 will be up to 30 seconds out. This + is a limitation of the Python datetime library. + +- If you think a timezone definition is incorrect, I probably can't fix + it. pytz is a direct translation of the Olson timezone database, and + changes to the timezone definitions need to be made to this source. + If you find errors they should be reported to the time zone mailing + list, linked from http://www.twinsun.com/tz/tz-link.htm + + +Further Reading +~~~~~~~~~~~~~~~ + +More info than you want to know about timezones: +http://www.twinsun.com/tz/tz-link.htm + + +Contact +~~~~~~~ + +Stuart Bishop + diff -Nru matplotlib-0.99.3/lib/pytz/tests/test_docs.py matplotlib-1.0.1/lib/pytz/tests/test_docs.py --- matplotlib-0.99.3/lib/pytz/tests/test_docs.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/pytz/tests/test_docs.py 2010-07-07 01:41:47.000000000 +0000 @@ -0,0 +1,35 @@ +# -*- coding: ascii -*- + +import unittest, os, os.path, sys +from doctest import DocTestSuite + +# We test the documentation this way instead of using DocFileSuite so +# we can run the tests under Python 2.3 +def test_README(): + pass + +this_dir = os.path.dirname(__file__) +locs = [ + os.path.join(this_dir, os.pardir, 'README.txt'), + os.path.join(this_dir, os.pardir, os.pardir, 'README.txt'), + ] +for loc in locs: + if os.path.exists(loc): + test_README.__doc__ = open(loc).read() + break +if test_README.__doc__ is None: + raise RuntimeError('README.txt not found') + + +def test_suite(): + "For the Z3 test runner" + return DocTestSuite() + + +if __name__ == '__main__': + sys.path.insert(0, os.path.abspath(os.path.join( + this_dir, os.pardir, os.pardir + ))) + unittest.main(defaultTest='test_suite') + + diff -Nru matplotlib-0.99.3/lib/pytz/tests/test_tzinfo.py matplotlib-1.0.1/lib/pytz/tests/test_tzinfo.py --- matplotlib-0.99.3/lib/pytz/tests/test_tzinfo.py 1970-01-01 00:00:00.000000000 +0000 +++ matplotlib-1.0.1/lib/pytz/tests/test_tzinfo.py 2011-01-05 15:59:55.000000000 +0000 @@ -0,0 +1,680 @@ +# -*- coding: ascii -*- + +import sys, os, os.path +import unittest, doctest +import cPickle as pickle +from datetime import datetime, time, timedelta, tzinfo + +if __name__ == '__main__': + # Only munge path if invoked as a script. Testrunners should have setup + # the paths already + sys.path.insert(0, os.path.abspath(os.path.join(os.pardir, os.pardir))) + +import pytz +from pytz import reference +from pytz.tzinfo import StaticTzInfo + +# I test for expected version to ensure the correct version of pytz is +# actually being tested. +EXPECTED_VERSION='2010o' + +fmt = '%Y-%m-%d %H:%M:%S %Z%z' + +NOTIME = timedelta(0) + +# GMT is a tzinfo.StaticTzInfo--the class we primarily want to test--while +# UTC is reference implementation. They both have the same timezone meaning. +UTC = pytz.timezone('UTC') +GMT = pytz.timezone('GMT') +assert isinstance(GMT, StaticTzInfo), 'GMT is no longer a StaticTzInfo' + + +def prettydt(dt): + """datetime as a string using a known format. + + We don't use strftime as it doesn't handle years earlier than 1900 + per http://bugs.python.org/issue1777412 + """ + if dt.utcoffset() >= timedelta(0): + offset = '+%s' % (dt.utcoffset(),) + else: + offset = '-%s' % (-1 * dt.utcoffset(),) + return '%04d-%02d-%02d %02d:%02d:%02d %s %s' % ( + dt.year, dt.month, dt.day, + dt.hour, dt.minute, dt.second, + dt.tzname(), offset) + + +class BasicTest(unittest.TestCase): + + def testVersion(self): + # Ensuring the correct version of pytz has been loaded + self.failUnlessEqual(EXPECTED_VERSION, pytz.__version__, + 'Incorrect pytz version loaded. Import path is stuffed ' + 'or this test needs updating. (Wanted %s, got %s)' + % (EXPECTED_VERSION, pytz.__version__) + ) + + def testGMT(self): + now = datetime.now(tz=GMT) + self.failUnless(now.utcoffset() == NOTIME) + self.failUnless(now.dst() == NOTIME) + self.failUnless(now.timetuple() == now.utctimetuple()) + self.failUnless(now==now.replace(tzinfo=UTC)) + + def testReferenceUTC(self): + now = datetime.now(tz=UTC) + self.failUnless(now.utcoffset() == NOTIME) + self.failUnless(now.dst() == NOTIME) + self.failUnless(now.timetuple() == now.utctimetuple()) + + def testUnknownOffsets(self): + # This tzinfo behavior is required to make + # datetime.time.{utcoffset, dst, tzname} work as documented. + + dst_tz = pytz.timezone('US/Eastern') + + # This information is not known when we don't have a date, + # so return None per API. + self.failUnless(dst_tz.utcoffset(None) is None) + self.failUnless(dst_tz.dst(None) is None) + # We don't know the abbreviation, but this is still a valid + # tzname per the Python documentation. + self.failUnlessEqual(dst_tz.tzname(None), 'US/Eastern') + + +class PicklingTest(unittest.TestCase): + + def _roundtrip_tzinfo(self, tz): + p = pickle.dumps(tz) + unpickled_tz = pickle.loads(p) + self.failUnless(tz is unpickled_tz, '%s did not roundtrip' % tz.zone) + + def _roundtrip_datetime(self, dt): + # Ensure that the tzinfo attached to a datetime instance + # is identical to the one returned. This is important for + # DST timezones, as some state is stored in the tzinfo. + tz = dt.tzinfo + p = pickle.dumps(dt) + unpickled_dt = pickle.loads(p) + unpickled_tz = unpickled_dt.tzinfo + self.failUnless(tz is unpickled_tz, '%s did not roundtrip' % tz.zone) + + def testDst(self): + tz = pytz.timezone('Europe/Amsterdam') + dt = datetime(2004, 2, 1, 0, 0, 0) + + for localized_tz in tz._tzinfos.values(): + self._roundtrip_tzinfo(localized_tz) + self._roundtrip_datetime(dt.replace(tzinfo=localized_tz)) + + def testRoundtrip(self): + dt = datetime(2004, 2, 1, 0, 0, 0) + for zone in pytz.all_timezones: + tz = pytz.timezone(zone) + self._roundtrip_tzinfo(tz) + + def testDatabaseFixes(self): + # Hack the pickle to make it refer to a timezone abbreviation + # that does not match anything. The unpickler should be able + # to repair this case + tz = pytz.timezone('Australia/Melbourne') + p = pickle.dumps(tz) + tzname = tz._tzname + hacked_p = p.replace(tzname, '???') + self.failIfEqual(p, hacked_p) + unpickled_tz = pickle.loads(hacked_p) + self.failUnless(tz is unpickled_tz) + + # Simulate a database correction. In this case, the incorrect + # data will continue to be used. + p = pickle.dumps(tz) + new_utcoffset = tz._utcoffset.seconds + 42 + hacked_p = p.replace(str(tz._utcoffset.seconds), str(new_utcoffset)) + self.failIfEqual(p, hacked_p) + unpickled_tz = pickle.loads(hacked_p) + self.failUnlessEqual(unpickled_tz._utcoffset.seconds, new_utcoffset) + self.failUnless(tz is not unpickled_tz) + + def testOldPickles(self): + # Ensure that applications serializing pytz instances as pickles + # have no troubles upgrading to a new pytz release. These pickles + # where created with pytz2006j + east1 = pickle.loads( + "cpytz\n_p\np1\n(S'US/Eastern'\np2\nI-18000\n" + "I0\nS'EST'\np3\ntRp4\n." + ) + east2 = pytz.timezone('US/Eastern') + self.failUnless(east1 is east2) + + # Confirm changes in name munging between 2006j and 2007c cause + # no problems. + pap1 = pickle.loads( + "cpytz\n_p\np1\n(S'America/Port_minus_au_minus_Prince'" + "\np2\nI-17340\nI0\nS'PPMT'\np3\ntRp4\n." + ) + pap2 = pytz.timezone('America/Port-au-Prince') + self.failUnless(pap1 is pap2) + + gmt1 = pickle.loads("cpytz\n_p\np1\n(S'Etc/GMT_plus_10'\np2\ntRp3\n.") + gmt2 = pytz.timezone('Etc/GMT+10') + self.failUnless(gmt1 is gmt2) + + +class USEasternDSTStartTestCase(unittest.TestCase): + tzinfo = pytz.timezone('US/Eastern') + + # 24 hours before DST changeover + transition_time = datetime(2002, 4, 7, 7, 0, 0, tzinfo=UTC) + + # Increase for 'flexible' DST transitions due to 1 minute granularity + # of Python's datetime library + instant = timedelta(seconds=1) + + # before transition + before = { + 'tzname': 'EST', + 'utcoffset': timedelta(hours = -5), + 'dst': timedelta(hours = 0), + } + + # after transition + after = { + 'tzname': 'EDT', + 'utcoffset': timedelta(hours = -4), + 'dst': timedelta(hours = 1), + } + + def _test_tzname(self, utc_dt, wanted): + tzname = wanted['tzname'] + dt = utc_dt.astimezone(self.tzinfo) + self.failUnlessEqual(dt.tzname(), tzname, + 'Expected %s as tzname for %s. Got %s' % ( + tzname, str(utc_dt), dt.tzname() + ) + ) + + def _test_utcoffset(self, utc_dt, wanted): + utcoffset = wanted['utcoffset'] + dt = utc_dt.astimezone(self.tzinfo) + self.failUnlessEqual( + dt.utcoffset(), wanted['utcoffset'], + 'Expected %s as utcoffset for %s. Got %s' % ( + utcoffset, utc_dt, dt.utcoffset() + ) + ) + + def _test_dst(self, utc_dt, wanted): + dst = wanted['dst'] + dt = utc_dt.astimezone(self.tzinfo) + self.failUnlessEqual(dt.dst(),dst, + 'Expected %s as dst for %s. Got %s' % ( + dst, utc_dt, dt.dst() + ) + ) + + def test_arithmetic(self): + utc_dt = self.transition_time + + for days in range(-420, 720, 20): + delta = timedelta(days=days) + + # Make sure we can get back where we started + dt = utc_dt.astimezone(self.tzinfo) + dt2 = dt + delta + dt2 = dt2 - delta + self.failUnlessEqual(dt, dt2) + + # Make sure arithmetic crossing DST boundaries ends + # up in the correct timezone after normalization + utc_plus_delta = (utc_dt + delta).astimezone(self.tzinfo) + local_plus_delta = self.tzinfo.normalize(dt + delta) + self.failUnlessEqual( + prettydt(utc_plus_delta), + prettydt(local_plus_delta), + 'Incorrect result for delta==%d days. Wanted %r. Got %r'%( + days, + prettydt(utc_plus_delta), + prettydt(local_plus_delta), + ) + ) + + def _test_all(self, utc_dt, wanted): + self._test_utcoffset(utc_dt, wanted) + self._test_tzname(utc_dt, wanted) + self._test_dst(utc_dt, wanted) + + def testDayBefore(self): + self._test_all( + self.transition_time - timedelta(days=1), self.before + ) + + def testTwoHoursBefore(self): + self._test_all( + self.transition_time - timedelta(hours=2), self.before + ) + + def testHourBefore(self): + self._test_all( + self.transition_time - timedelta(hours=1), self.before + ) + + def testInstantBefore(self): + self._test_all( + self.transition_time - self.instant, self.before + ) + + def testTransition(self): + self._test_all( + self.transition_time, self.after + ) + + def testInstantAfter(self): + self._test_all( + self.transition_time + self.instant, self.after + ) + + def testHourAfter(self): + self._test_all( + self.transition_time + timedelta(hours=1), self.after + ) + + def testTwoHoursAfter(self): + self._test_all( + self.transition_time + timedelta(hours=1), self.after + ) + + def testDayAfter(self): + self._test_all( + self.transition_time + timedelta(days=1), self.after + ) + + +class USEasternDSTEndTestCase(USEasternDSTStartTestCase): + tzinfo = pytz.timezone('US/Eastern') + transition_time = datetime(2002, 10, 27, 6, 0, 0, tzinfo=UTC) + before = { + 'tzname': 'EDT', + 'utcoffset': timedelta(hours = -4), + 'dst': timedelta(hours = 1), + } + after = { + 'tzname': 'EST', + 'utcoffset': timedelta(hours = -5), + 'dst': timedelta(hours = 0), + } + + +class USEasternEPTStartTestCase(USEasternDSTStartTestCase): + transition_time = datetime(1945, 8, 14, 23, 0, 0, tzinfo=UTC) + before = { + 'tzname': 'EWT', + 'utcoffset': timedelta(hours = -4), + 'dst': timedelta(hours = 1), + } + after = { + 'tzname': 'EPT', + 'utcoffset': timedelta(hours = -4), + 'dst': timedelta(hours = 1), + } + + +class USEasternEPTEndTestCase(USEasternDSTStartTestCase): + transition_time = datetime(1945, 9, 30, 6, 0, 0, tzinfo=UTC) + before = { + 'tzname': 'EPT', + 'utcoffset': timedelta(hours = -4), + 'dst': timedelta(hours = 1), + } + after = { + 'tzname': 'EST', + 'utcoffset': timedelta(hours = -5), + 'dst': timedelta(hours = 0), + } + + +class WarsawWMTEndTestCase(USEasternDSTStartTestCase): + # In 1915, Warsaw changed from Warsaw to Central European time. + # This involved the clocks being set backwards, causing a end-of-DST + # like situation without DST being involved. + tzinfo = pytz.timezone('Europe/Warsaw') + transition_time = datetime(1915, 8, 4, 22, 36, 0, tzinfo=UTC) + before = { + 'tzname': 'WMT', + 'utcoffset': timedelta(hours=1, minutes=24), + 'dst': timedelta(0), + } + after = { + 'tzname': 'CET', + 'utcoffset': timedelta(hours=1), + 'dst': timedelta(0), + } + + +class VilniusWMTEndTestCase(USEasternDSTStartTestCase): + # At the end of 1916, Vilnius changed timezones putting its clock + # forward by 11 minutes 35 seconds. Neither timezone was in DST mode. + tzinfo = pytz.timezone('Europe/Vilnius') + instant = timedelta(seconds=31) + transition_time = datetime(1916, 12, 31, 22, 36, 00, tzinfo=UTC) + before = { + 'tzname': 'WMT', + 'utcoffset': timedelta(hours=1, minutes=24), + 'dst': timedelta(0), + } + after = { + 'tzname': 'KMT', + 'utcoffset': timedelta(hours=1, minutes=36), # Really 1:35:36 + 'dst': timedelta(0), + } + + +class VilniusCESTStartTestCase(USEasternDSTStartTestCase): + # In 1941, Vilnius changed from MSG to CEST, switching to summer + # time while simultaneously reducing its UTC offset by two hours, + # causing the clocks to go backwards for this summer time + # switchover. + tzinfo = pytz.timezone('Europe/Vilnius') + transition_time = datetime(1941, 6, 23, 21, 00, 00, tzinfo=UTC) + before = { + 'tzname': 'MSK', + 'utcoffset': timedelta(hours=3), + 'dst': timedelta(0), + } + after = { + 'tzname': 'CEST', + 'utcoffset': timedelta(hours=2), + 'dst': timedelta(hours=1), + } + + +class LondonHistoryStartTestCase(USEasternDSTStartTestCase): + # The first known timezone transition in London was in 1847 when + # clocks where synchronized to GMT. However, we currently only + # understand v1 format tzfile(5) files which does handle years + # this far in the past, so our earliest known transition is in + # 1916. + tzinfo = pytz.timezone('Europe/London') + # transition_time = datetime(1847, 12, 1, 1, 15, 00, tzinfo=UTC) + # before = { + # 'tzname': 'LMT', + # 'utcoffset': timedelta(minutes=-75), + # 'dst': timedelta(0), + # } + # after = { + # 'tzname': 'GMT', + # 'utcoffset': timedelta(0), + # 'dst': timedelta(0), + # } + transition_time = datetime(1916, 5, 21, 2, 00, 00, tzinfo=UTC) + before = { + 'tzname': 'GMT', + 'utcoffset': timedelta(0), + 'dst': timedelta(0), + } + after = { + 'tzname': 'BST', + 'utcoffset': timedelta(hours=1), + 'dst': timedelta(hours=1), + } + + +class LondonHistoryEndTestCase(USEasternDSTStartTestCase): + # Timezone switchovers are projected into the future, even + # though no official statements exist or could be believed even + # if they did exist. We currently only check the last known + # transition in 2037, as we are still using v1 format tzfile(5) + # files. + tzinfo = pytz.timezone('Europe/London') + # transition_time = datetime(2499, 10, 25, 1, 0, 0, tzinfo=UTC) + transition_time = datetime(2037, 10, 25, 1, 0, 0, tzinfo=UTC) + before = { + 'tzname': 'BST', + 'utcoffset': timedelta(hours=1), + 'dst': timedelta(hours=1), + } + after = { + 'tzname': 'GMT', + 'utcoffset': timedelta(0), + 'dst': timedelta(0), + } + + +class NoumeaHistoryStartTestCase(USEasternDSTStartTestCase): + # Noumea adopted a whole hour offset in 1912. Previously + # it was 11 hours, 5 minutes and 48 seconds off UTC. However, + # due to limitations of the Python datetime library, we need + # to round that to 11 hours 6 minutes. + tzinfo = pytz.timezone('Pacific/Noumea') + transition_time = datetime(1912, 1, 12, 12, 54, 12, tzinfo=UTC) + before = { + 'tzname': 'LMT', + 'utcoffset': timedelta(hours=11, minutes=6), + 'dst': timedelta(0), + } + after = { + 'tzname': 'NCT', + 'utcoffset': timedelta(hours=11), + 'dst': timedelta(0), + } + + +class NoumeaDSTEndTestCase(USEasternDSTStartTestCase): + # Noumea dropped DST in 1997. + tzinfo = pytz.timezone('Pacific/Noumea') + transition_time = datetime(1997, 3, 1, 15, 00, 00, tzinfo=UTC) + before = { + 'tzname': 'NCST', + 'utcoffset': timedelta(hours=12), + 'dst': timedelta(hours=1), + } + after = { + 'tzname': 'NCT', + 'utcoffset': timedelta(hours=11), + 'dst': timedelta(0), + } + + +class NoumeaNoMoreDSTTestCase(NoumeaDSTEndTestCase): + # Noumea dropped DST in 1997. Here we test that it stops occuring. + transition_time = ( + NoumeaDSTEndTestCase.transition_time + timedelta(days=365*10)) + before = NoumeaDSTEndTestCase.after + after = NoumeaDSTEndTestCase.after + + +class TahitiTestCase(USEasternDSTStartTestCase): + # Tahiti has had a single transition in its history. + tzinfo = pytz.timezone('Pacific/Tahiti') + transition_time = datetime(1912, 10, 1, 9, 58, 16, tzinfo=UTC) + before = { + 'tzname': 'LMT', + 'utcoffset': timedelta(hours=-9, minutes=-58), + 'dst': timedelta(0), + } + after = { + 'tzname': 'TAHT', + 'utcoffset': timedelta(hours=-10), + 'dst': timedelta(0), + } + + +class ReferenceUSEasternDSTStartTestCase(USEasternDSTStartTestCase): + tzinfo = reference.Eastern + def test_arithmetic(self): + # Reference implementation cannot handle this + pass + + +class ReferenceUSEasternDSTEndTestCase(USEasternDSTEndTestCase): + tzinfo = reference.Eastern + + def testHourBefore(self): + # Python's datetime library has a bug, where the hour before + # a daylight savings transition is one hour out. For example, + # at the end of US/Eastern daylight savings time, 01:00 EST + # occurs twice (once at 05:00 UTC and once at 06:00 UTC), + # whereas the first should actually be 01:00 EDT. + # Note that this bug is by design - by accepting this ambiguity + # for one hour one hour per year, an is_dst flag on datetime.time + # became unnecessary. + self._test_all( + self.transition_time - timedelta(hours=1), self.after + ) + + def testInstantBefore(self): + self._test_all( + self.transition_time - timedelta(seconds=1), self.after + ) + + def test_arithmetic(self): + # Reference implementation cannot handle this + pass + + +class LocalTestCase(unittest.TestCase): + def testLocalize(self): + loc_tz = pytz.timezone('Europe/Amsterdam') + + loc_time = loc_tz.localize(datetime(1930, 5, 10, 0, 0, 0)) + # Actually +00:19:32, but Python datetime rounds this + self.failUnlessEqual(loc_time.strftime('%Z%z'), 'AMT+0020') + + loc_time = loc_tz.localize(datetime(1930, 5, 20, 0, 0, 0)) + # Actually +00:19:32, but Python datetime rounds this + self.failUnlessEqual(loc_time.strftime('%Z%z'), 'NST+0120') + + loc_time = loc_tz.localize(datetime(1940, 5, 10, 0, 0, 0)) + self.failUnlessEqual(loc_time.strftime('%Z%z'), 'NET+0020') + + loc_time = loc_tz.localize(datetime(1940, 5, 20, 0, 0, 0)) + self.failUnlessEqual(loc_time.strftime('%Z%z'), 'CEST+0200') + + loc_time = loc_tz.localize(datetime(2004, 2, 1, 0, 0, 0)) + self.failUnlessEqual(loc_time.strftime('%Z%z'), 'CET+0100') + + loc_time = loc_tz.localize(datetime(2004, 4, 1, 0, 0, 0)) + self.failUnlessEqual(loc_time.strftime('%Z%z'), 'CEST+0200') + + tz = pytz.timezone('Europe/Amsterdam') + loc_time = loc_tz.localize(datetime(1943, 3, 29, 1, 59, 59)) + self.failUnlessEqual(loc_time.strftime('%Z%z'), 'CET+0100') + + + # Switch to US + loc_tz = pytz.timezone('US/Eastern') + + # End of DST ambiguity check + loc_time = loc_tz.localize(datetime(1918, 10, 27, 1, 59, 59), is_dst=1) + self.failUnlessEqual(loc_time.strftime('%Z%z'), 'EDT-0400') + + loc_time = loc_tz.localize(datetime(1918, 10, 27, 1, 59, 59), is_dst=0) + self.failUnlessEqual(loc_time.strftime('%Z%z'), 'EST-0500') + + self.failUnlessRaises(pytz.AmbiguousTimeError, + loc_tz.localize, datetime(1918, 10, 27, 1, 59, 59), is_dst=None + ) + + # Start of DST non-existent times + loc_time = loc_tz.localize(datetime(1918, 3, 31, 2, 0, 0), is_dst=0) + self.failUnlessEqual(loc_time.strftime('%Z%z'), 'EST-0500') + + loc_time = loc_tz.localize(datetime(1918, 3, 31, 2, 0, 0), is_dst=1) + self.failUnlessEqual(loc_time.strftime('%Z%z'), 'EDT-0400') + + self.failUnlessRaises(pytz.NonExistentTimeError, + loc_tz.localize, datetime(1918, 3, 31, 2, 0, 0), is_dst=None + ) + + # Weird changes - war time and peace time both is_dst==True + + loc_time = loc_tz.localize(datetime(1942, 2, 9, 3, 0, 0)) + self.failUnlessEqual(loc_time.strftime('%Z%z'), 'EWT-0400') + + loc_time = loc_tz.localize(datetime(1945, 8, 14, 19, 0, 0)) + self.failUnlessEqual(loc_time.strftime('%Z%z'), 'EPT-0400') + + loc_time = loc_tz.localize(datetime(1945, 9, 30, 1, 0, 0), is_dst=1) + self.failUnlessEqual(loc_time.strftime('%Z%z'), 'EPT-0400') + + loc_time = loc_tz.localize(datetime(1945, 9, 30, 1, 0, 0), is_dst=0) + self.failUnlessEqual(loc_time.strftime('%Z%z'), 'EST-0500') + + def testNormalize(self): + tz = pytz.timezone('US/Eastern') + dt = datetime(2004, 4, 4, 7, 0, 0, tzinfo=UTC).astimezone(tz) + dt2 = dt - timedelta(minutes=10) + self.failUnlessEqual( + dt2.strftime('%Y-%m-%d %H:%M:%S %Z%z'), + '2004-04-04 02:50:00 EDT-0400' + ) + + dt2 = tz.normalize(dt2) + self.failUnlessEqual( + dt2.strftime('%Y-%m-%d %H:%M:%S %Z%z'), + '2004-04-04 01:50:00 EST-0500' + ) + + def testPartialMinuteOffsets(self): + # utcoffset in Amsterdam was not a whole minute until 1937 + # However, we fudge this by rounding them, as the Python + # datetime library + tz = pytz.timezone('Europe/Amsterdam') + utc_dt = datetime(1914, 1, 1, 13, 40, 28, tzinfo=UTC) # correct + utc_dt = utc_dt.replace(second=0) # But we need to fudge it + loc_dt = utc_dt.astimezone(tz) + self.failUnlessEqual( + loc_dt.strftime('%Y-%m-%d %H:%M:%S %Z%z'), + '1914-01-01 14:00:00 AMT+0020' + ) + + # And get back... + utc_dt = loc_dt.astimezone(UTC) + self.failUnlessEqual( + utc_dt.strftime('%Y-%m-%d %H:%M:%S %Z%z'), + '1914-01-01 13:40:00 UTC+0000' + ) + + def no_testCreateLocaltime(self): + # It would be nice if this worked, but it doesn't. + tz = pytz.timezone('Europe/Amsterdam') + dt = datetime(2004, 10, 31, 2, 0, 0, tzinfo=tz) + self.failUnlessEqual( + dt.strftime(fmt), + '2004-10-31 02:00:00 CET+0100' + ) + + +class CommonTimezonesTestCase(unittest.TestCase): + def test_bratislava(self): + # Bratislava is the default timezone for Slovakia, but our + # heuristics where not adding it to common_timezones. Ideally, + # common_timezones should be populated from zone.tab at runtime, + # but I'm hesitant to pay the startup cost as loading the list + # on demand whilst remaining backwards compatible seems + # difficult. + self.failUnless('Europe/Bratislava' in pytz.common_timezones) + self.failUnless('Europe/Bratislava' in pytz.common_timezones_set) + + def test_us_eastern(self): + self.failUnless('US/Eastern' in pytz.common_timezones) + self.failUnless('US/Eastern' in pytz.common_timezones_set) + + def test_belfast(self): + # Belfast uses London time. + self.failUnless('Europe/Belfast' in pytz.all_timezones_set) + self.failIf('Europe/Belfast' in pytz.common_timezones) + self.failIf('Europe/Belfast' in pytz.common_timezones_set) + +def test_suite(): + suite = unittest.TestSuite() + suite.addTest(doctest.DocTestSuite('pytz')) + suite.addTest(doctest.DocTestSuite('pytz.tzinfo')) + import test_tzinfo + suite.addTest(unittest.defaultTestLoader.loadTestsFromModule(test_tzinfo)) + return suite + + +if __name__ == '__main__': + unittest.main(defaultTest='test_suite') + diff -Nru matplotlib-0.99.3/lib/pytz/tzfile.py matplotlib-1.0.1/lib/pytz/tzfile.py --- matplotlib-0.99.3/lib/pytz/tzfile.py 2009-07-31 15:14:34.000000000 +0000 +++ matplotlib-1.0.1/lib/pytz/tzfile.py 2010-07-07 01:41:49.000000000 +0000 @@ -12,12 +12,12 @@ def build_tzinfo(zone, fp): - head_fmt = '>4s 16x 6l' + head_fmt = '>4s c 15x 6l' head_size = calcsize(head_fmt) - (magic,ttisgmtcnt,ttisstdcnt,leapcnt, - timecnt,typecnt,charcnt) = unpack(head_fmt, fp.read(head_size)) - - # Make sure it is a tzinfo(5) file + (magic, format, ttisgmtcnt, ttisstdcnt,leapcnt, timecnt, + typecnt, charcnt) = unpack(head_fmt, fp.read(head_size)) + + # Make sure it is a tzfile(5) file assert magic == 'TZif' # Read out the transition times, localtime indices and ttinfo structures. @@ -83,6 +83,15 @@ if not prev_inf[1]: break dst = inf[0] - prev_inf[0] # dst offset + + if dst <= 0: # Bad dst? Look further. + for j in range(i+1, len(transitions)): + stdinf = ttinfo[lindexes[j]] + if not stdinf[1]: + dst = inf[0] - stdinf[0] + if dst > 0: + break # Found a useful std time. + tzname = inf[2] # Round utcoffset and dst to the nearest minute or the diff -Nru matplotlib-0.99.3/lib/pytz/tzinfo.py matplotlib-1.0.1/lib/pytz/tzinfo.py --- matplotlib-0.99.3/lib/pytz/tzinfo.py 2009-07-31 15:14:34.000000000 +0000 +++ matplotlib-1.0.1/lib/pytz/tzinfo.py 2010-07-07 01:41:49.000000000 +0000 @@ -68,23 +68,35 @@ class StaticTzInfo(BaseTzInfo): '''A timezone that has a constant offset from UTC - These timezones are rare, as most regions have changed their - offset from UTC at some point in their history + These timezones are rare, as most locations have changed their + offset at some point in their history ''' def fromutc(self, dt): '''See datetime.tzinfo.fromutc''' return (dt + self._utcoffset).replace(tzinfo=self) - def utcoffset(self,dt): - '''See datetime.tzinfo.utcoffset''' + def utcoffset(self, dt, is_dst=None): + '''See datetime.tzinfo.utcoffset + + is_dst is ignored for StaticTzInfo, and exists only to + retain compatibility with DstTzInfo. + ''' return self._utcoffset - def dst(self,dt): - '''See datetime.tzinfo.dst''' + def dst(self, dt, is_dst=None): + '''See datetime.tzinfo.dst + + is_dst is ignored for StaticTzInfo, and exists only to + retain compatibility with DstTzInfo. + ''' return _notime - def tzname(self,dt): - '''See datetime.tzinfo.tzname''' + def tzname(self, dt, is_dst=None): + '''See datetime.tzinfo.tzname + + is_dst is ignored for StaticTzInfo, and exists only to + retain compatibility with DstTzInfo. + ''' return self._tzname def localize(self, dt, is_dst=False): @@ -104,7 +116,7 @@ def __reduce__(self): # Special pickle to zone remains a singleton and to cope with - # database changes. + # database changes. return pytz._p, (self.zone,) @@ -114,7 +126,6 @@ The offset might change if daylight savings time comes into effect, or at a point in history when the region decides to change their timezone definition. - ''' # Overridden in subclass _utc_transition_times = None # Sorted list of DST transition times in UTC @@ -136,7 +147,7 @@ self._utcoffset, self._dst, self._tzname = self._transition_info[0] _tzinfos[self._transition_info[0]] = self for inf in self._transition_info[1:]: - if inf not in _tzinfos: + if not _tzinfos.has_key(inf): _tzinfos[inf] = self.__class__(inf, _tzinfos) def fromutc(self, dt): @@ -180,7 +191,6 @@ >>> before = eastern.normalize(before) >>> before.strftime(fmt) '2002-10-27 01:50:00 EDT (-0400)' - ''' if dt.tzinfo is None: raise ValueError, 'Naive time - no tzinfo set' @@ -217,12 +227,6 @@ Use is_dst=None to raise an AmbiguousTimeError for ambiguous times at the end of daylight savings - >>> try: - ... loc_dt1 = amdam.localize(dt, is_dst=None) - ... except AmbiguousTimeError: - ... print 'Oops' - Oops - >>> loc_dt1 = amdam.localize(dt, is_dst=None) Traceback (most recent call last): [...] @@ -233,16 +237,39 @@ >>> amdam.localize(dt) == amdam.localize(dt, False) True + is_dst is also used to determine the correct timezone in the + wallclock times jumped over at the start of daylight savings time. + + >>> pacific = timezone('US/Pacific') + >>> dt = datetime(2008, 3, 9, 2, 0, 0) + >>> ploc_dt1 = pacific.localize(dt, is_dst=True) + >>> ploc_dt2 = pacific.localize(dt, is_dst=False) + >>> ploc_dt1.strftime(fmt) + '2008-03-09 02:00:00 PDT (-0700)' + >>> ploc_dt2.strftime(fmt) + '2008-03-09 02:00:00 PST (-0800)' + >>> str(ploc_dt2 - ploc_dt1) + '1:00:00' + + Use is_dst=None to raise a NonExistentTimeError for these skipped + times. + + >>> loc_dt1 = pacific.localize(dt, is_dst=None) + Traceback (most recent call last): + [...] + NonExistentTimeError: 2008-03-09 02:00:00 ''' if dt.tzinfo is not None: raise ValueError, 'Not naive datetime (tzinfo is already set)' - # Find the possibly correct timezones. We probably just have one, - # but we might end up with two if we are in the end-of-DST - # transition period. Or possibly more in some particularly confused - # location... + # Find the two best possibilities. possible_loc_dt = set() - for tzinfo in self._tzinfos.values(): + for delta in [timedelta(days=-1), timedelta(days=1)]: + loc_dt = dt + delta + idx = max(0, bisect_right( + self._utc_transition_times, loc_dt) - 1) + inf = self._transition_info[idx] + tzinfo = self._tzinfos[inf] loc_dt = tzinfo.normalize(dt.replace(tzinfo=tzinfo)) if loc_dt.replace(tzinfo=None) == dt: possible_loc_dt.add(loc_dt) @@ -250,6 +277,31 @@ if len(possible_loc_dt) == 1: return possible_loc_dt.pop() + # If there are no possibly correct timezones, we are attempting + # to convert a time that never happened - the time period jumped + # during the start-of-DST transition period. + if len(possible_loc_dt) == 0: + # If we refuse to guess, raise an exception. + if is_dst is None: + raise NonExistentTimeError(dt) + + # If we are forcing the pre-DST side of the DST transition, we + # obtain the correct timezone by winding the clock forward a few + # hours. + elif is_dst: + return self.localize( + dt + timedelta(hours=6), is_dst=True) - timedelta(hours=6) + + # If we are forcing the post-DST side of the DST transition, we + # obtain the correct timezone by winding the clock back. + else: + return self.localize( + dt - timedelta(hours=6), is_dst=False) + timedelta(hours=6) + + + # If we get this far, we have multiple possible timezones - this + # is an ambiguous case occuring during the end-of-DST transition. + # If told to be strict, raise an exception since we have an # ambiguous case if is_dst is None: @@ -285,17 +337,108 @@ filtered_possible_loc_dt.sort(mycmp) return filtered_possible_loc_dt[0] - def utcoffset(self, dt): - '''See datetime.tzinfo.utcoffset''' - return self._utcoffset + def utcoffset(self, dt, is_dst=None): + '''See datetime.tzinfo.utcoffset - def dst(self, dt): - '''See datetime.tzinfo.dst''' - return self._dst + The is_dst parameter may be used to remove ambiguity during DST + transitions. - def tzname(self, dt): - '''See datetime.tzinfo.tzname''' - return self._tzname + >>> from pytz import timezone + >>> tz = timezone('America/St_Johns') + >>> ambiguous = datetime(2009, 10, 31, 23, 30) + + >>> tz.utcoffset(ambiguous, is_dst=False) + datetime.timedelta(-1, 73800) + + >>> tz.utcoffset(ambiguous, is_dst=True) + datetime.timedelta(-1, 77400) + + >>> tz.utcoffset(ambiguous) + Traceback (most recent call last): + [...] + AmbiguousTimeError: 2009-10-31 23:30:00 + ''' + if dt is None: + return None + elif dt.tzinfo is not self: + dt = self.localize(dt, is_dst) + return dt.tzinfo._utcoffset + else: + return self._utcoffset + + def dst(self, dt, is_dst=None): + '''See datetime.tzinfo.dst + + The is_dst parameter may be used to remove ambiguity during DST + transitions. + + >>> from pytz import timezone + >>> tz = timezone('America/St_Johns') + + >>> normal = datetime(2009, 9, 1) + + >>> tz.dst(normal) + datetime.timedelta(0, 3600) + >>> tz.dst(normal, is_dst=False) + datetime.timedelta(0, 3600) + >>> tz.dst(normal, is_dst=True) + datetime.timedelta(0, 3600) + + >>> ambiguous = datetime(2009, 10, 31, 23, 30) + + >>> tz.dst(ambiguous, is_dst=False) + datetime.timedelta(0) + >>> tz.dst(ambiguous, is_dst=True) + datetime.timedelta(0, 3600) + >>> tz.dst(ambiguous) + Traceback (most recent call last): + [...] + AmbiguousTimeError: 2009-10-31 23:30:00 + ''' + if dt is None: + return None + elif dt.tzinfo is not self: + dt = self.localize(dt, is_dst) + return dt.tzinfo._dst + else: + return self._dst + + def tzname(self, dt, is_dst=None): + '''See datetime.tzinfo.tzname + + The is_dst parameter may be used to remove ambiguity during DST + transitions. + + >>> from pytz import timezone + >>> tz = timezone('America/St_Johns') + + >>> normal = datetime(2009, 9, 1) + + >>> tz.tzname(normal) + 'NDT' + >>> tz.tzname(normal, is_dst=False) + 'NDT' + >>> tz.tzname(normal, is_dst=True) + 'NDT' + + >>> ambiguous = datetime(2009, 10, 31, 23, 30) + + >>> tz.tzname(ambiguous, is_dst=False) + 'NST' + >>> tz.tzname(ambiguous, is_dst=True) + 'NDT' + >>> tz.tzname(ambiguous) + Traceback (most recent call last): + [...] + AmbiguousTimeError: 2009-10-31 23:30:00 + ''' + if dt is None: + return self.zone + elif dt.tzinfo is not self: + dt = self.localize(dt, is_dst) + return dt.tzinfo._tzname + else: + return self._tzname def __repr__(self): if self._dst: @@ -322,7 +465,11 @@ ) -class AmbiguousTimeError(Exception): +class InvalidTimeError(Exception): + '''Base class for invalid time exceptions.''' + + +class AmbiguousTimeError(InvalidTimeError): '''Exception raised when attempting to create an ambiguous wallclock time. At the end of a DST transition period, a particular wallclock time will @@ -333,6 +480,15 @@ ''' +class NonExistentTimeError(InvalidTimeError): + '''Exception raised when attempting to create a wallclock time that + cannot exist. + + At the start of a DST transition period, the wallclock time jumps forward. + The instants jumped over never occur. + ''' + + def unpickler(zone, utcoffset=None, dstoffset=None, tzname=None): """Factory function for unpickling pytz tzinfo instances. Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Africa/Bamako and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Africa/Bamako differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Africa/Cairo and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Africa/Cairo differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Africa/Casablanca and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Africa/Casablanca differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Africa/Conakry and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Africa/Conakry differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Africa/Dar_es_Salaam and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Africa/Dar_es_Salaam differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Africa/Kampala and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Africa/Kampala differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Africa/Mogadishu and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Africa/Mogadishu differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Africa/Nairobi and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Africa/Nairobi differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Africa/Nouakchott and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Africa/Nouakchott differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Africa/Timbuktu and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Africa/Timbuktu differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Africa/Tunis and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Africa/Tunis differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/America/Argentina/Buenos_Aires and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/America/Argentina/Buenos_Aires differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/America/Argentina/Catamarca and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/America/Argentina/Catamarca differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/America/Argentina/ComodRivadavia and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/America/Argentina/ComodRivadavia differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/America/Argentina/Cordoba and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/America/Argentina/Cordoba differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/America/Argentina/Jujuy and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/America/Argentina/Jujuy differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/America/Argentina/La_Rioja and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/America/Argentina/La_Rioja differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/America/Argentina/Mendoza and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/America/Argentina/Mendoza differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/America/Argentina/Rio_Gallegos and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/America/Argentina/Rio_Gallegos differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/America/Argentina/Salta and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/America/Argentina/Salta differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/America/Argentina/San_Juan and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/America/Argentina/San_Juan differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/America/Argentina/San_Luis and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/America/Argentina/San_Luis differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/America/Argentina/Tucuman and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/America/Argentina/Tucuman differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/America/Argentina/Ushuaia and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/America/Argentina/Ushuaia differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/America/Asuncion and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/America/Asuncion differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/America/Buenos_Aires and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/America/Buenos_Aires differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/America/Cambridge_Bay and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/America/Cambridge_Bay differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/America/Campo_Grande and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/America/Campo_Grande differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/America/Cancun and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/America/Cancun differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/America/Caracas and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/America/Caracas differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/America/Catamarca and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/America/Catamarca differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/America/Chicago and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/America/Chicago differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/America/Chihuahua and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/America/Chihuahua differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/America/Cordoba and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/America/Cordoba differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/America/Cuiaba and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/America/Cuiaba differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/America/Eirunepe and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/America/Eirunepe differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/America/Ensenada and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/America/Ensenada differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/America/Goose_Bay and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/America/Goose_Bay differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/America/Havana and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/America/Havana differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/America/Hermosillo and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/America/Hermosillo differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/America/Indiana/Knox and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/America/Indiana/Knox differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/America/Indiana/Tell_City and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/America/Indiana/Tell_City differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/America/Iqaluit and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/America/Iqaluit differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/America/Jujuy and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/America/Jujuy differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/America/Knox_IN and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/America/Knox_IN differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/America/Managua and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/America/Managua differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/America/Matamoros and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/America/Matamoros differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/America/Mazatlan and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/America/Mazatlan differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/America/Mendoza and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/America/Mendoza differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/America/Menominee and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/America/Menominee differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/America/Merida and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/America/Merida differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/America/Montevideo and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/America/Montevideo differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/America/Ojinaga and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/America/Ojinaga differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/America/Pangnirtung and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/America/Pangnirtung differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/America/Porto_Acre and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/America/Porto_Acre differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/America/Rankin_Inlet and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/America/Rankin_Inlet differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/America/Resolute and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/America/Resolute differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/America/Rio_Branco and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/America/Rio_Branco differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/America/Rosario and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/America/Rosario differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/America/Santa_Isabel and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/America/Santa_Isabel differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/America/Santarem and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/America/Santarem differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/America/Santiago and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/America/Santiago differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/America/Sao_Paulo and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/America/Sao_Paulo differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/America/St_Johns and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/America/St_Johns differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/America/Tijuana and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/America/Tijuana differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Antarctica/Casey and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Antarctica/Casey differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Antarctica/Davis and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Antarctica/Davis differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Antarctica/Macquarie and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Antarctica/Macquarie differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Antarctica/Mawson and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Antarctica/Mawson differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Asia/Amman and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Asia/Amman differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Asia/Anadyr and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Asia/Anadyr differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Asia/Aqtau and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Asia/Aqtau differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Asia/Colombo and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Asia/Colombo differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Asia/Dacca and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Asia/Dacca differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Asia/Damascus and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Asia/Damascus differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Asia/Dhaka and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Asia/Dhaka differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Asia/Dili and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Asia/Dili differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Asia/Gaza and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Asia/Gaza differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Asia/Harbin and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Asia/Harbin differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Asia/Ho_Chi_Minh and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Asia/Ho_Chi_Minh differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Asia/Hong_Kong and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Asia/Hong_Kong differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Asia/Irkutsk and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Asia/Irkutsk differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Asia/Jayapura and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Asia/Jayapura differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Asia/Jerusalem and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Asia/Jerusalem differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Asia/Kamchatka and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Asia/Kamchatka differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Asia/Karachi and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Asia/Karachi differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Asia/Kathmandu and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Asia/Kathmandu differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Asia/Krasnoyarsk and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Asia/Krasnoyarsk differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Asia/Magadan and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Asia/Magadan differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Asia/Makassar and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Asia/Makassar differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Asia/Manila and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Asia/Manila differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Asia/Novokuznetsk and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Asia/Novokuznetsk differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Asia/Omsk and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Asia/Omsk differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Asia/Phnom_Penh and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Asia/Phnom_Penh differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Asia/Pyongyang and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Asia/Pyongyang differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Asia/Riyadh87 and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Asia/Riyadh87 differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Asia/Riyadh88 and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Asia/Riyadh88 differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Asia/Riyadh89 and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Asia/Riyadh89 differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Asia/Saigon and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Asia/Saigon differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Asia/Seoul and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Asia/Seoul differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Asia/Taipei and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Asia/Taipei differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Asia/Tbilisi and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Asia/Tbilisi differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Asia/Tehran and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Asia/Tehran differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Asia/Tel_Aviv and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Asia/Tel_Aviv differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Asia/Ujung_Pandang and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Asia/Ujung_Pandang differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Asia/Vientiane and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Asia/Vientiane differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Asia/Vladivostok and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Asia/Vladivostok differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Asia/Yakutsk and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Asia/Yakutsk differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Atlantic/Stanley and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Atlantic/Stanley differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Brazil/Acre and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Brazil/Acre differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Brazil/East and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Brazil/East differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Canada/Newfoundland and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Canada/Newfoundland differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/CET and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/CET differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Chile/Continental and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Chile/Continental differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Chile/EasterIsland and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Chile/EasterIsland differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Cuba and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Cuba differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Egypt and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Egypt differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Europe/Belgrade and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Europe/Belgrade differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Europe/Berlin and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Europe/Berlin differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Europe/Budapest and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Europe/Budapest differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Europe/Helsinki and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Europe/Helsinki differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Europe/Ljubljana and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Europe/Ljubljana differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Europe/Mariehamn and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Europe/Mariehamn differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Europe/Moscow and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Europe/Moscow differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Europe/Podgorica and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Europe/Podgorica differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Europe/Samara and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Europe/Samara differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Europe/Sarajevo and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Europe/Sarajevo differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Europe/Skopje and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Europe/Skopje differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Europe/Sofia and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Europe/Sofia differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Europe/Zagreb and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Europe/Zagreb differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Europe/Zurich and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Europe/Zurich differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Hongkong and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Hongkong differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Indian/Mauritius and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Indian/Mauritius differ Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Iran and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Iran differ diff -Nru matplotlib-0.99.3/lib/pytz/zoneinfo/iso3166.tab matplotlib-1.0.1/lib/pytz/zoneinfo/iso3166.tab --- matplotlib-0.99.3/lib/pytz/zoneinfo/iso3166.tab 2009-07-31 15:14:34.000000000 +0000 +++ matplotlib-1.0.1/lib/pytz/zoneinfo/iso3166.tab 2010-07-07 01:41:49.000000000 +0000 @@ -1,7 +1,9 @@ +#
    +# @(#)iso3166.tab	8.6
    +# This file is in the public domain, so clarified as of
    +# 2009-05-17 by Arthur David Olson.
     # ISO 3166 alpha-2 country codes
     #
    -# @(#)iso3166.tab	8.5
    -#
     # From Paul Eggert (2006-09-27):
     #
     # This file contains a table with the following columns:
    Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Israel and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Israel differ
    Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/localtime and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/localtime differ
    Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/MET and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/MET differ
    Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Mexico/BajaNorte and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Mexico/BajaNorte differ
    Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Mexico/BajaSur and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Mexico/BajaSur differ
    Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Mideast/Riyadh87 and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Mideast/Riyadh87 differ
    Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Mideast/Riyadh88 and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Mideast/Riyadh88 differ
    Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Mideast/Riyadh89 and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Mideast/Riyadh89 differ
    Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Pacific/Apia and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Pacific/Apia differ
    Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Pacific/Easter and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Pacific/Easter differ
    Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Pacific/Fiji and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Pacific/Fiji differ
    Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Pacific/Kosrae and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Pacific/Kosrae differ
    Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Pacific/Truk and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Pacific/Truk differ
    Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/Pacific/Yap and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/Pacific/Yap differ
    Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/ROC and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/ROC differ
    Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/ROK and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/ROK differ
    Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/US/Central and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/US/Central differ
    Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/US/Indiana-Starke and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/US/Indiana-Starke differ
    Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/lib/pytz/zoneinfo/W-SU and /tmp/GJbvHcIw6l/matplotlib-1.0.1/lib/pytz/zoneinfo/W-SU differ
    diff -Nru matplotlib-0.99.3/lib/pytz/zoneinfo/zone.tab matplotlib-1.0.1/lib/pytz/zoneinfo/zone.tab
    --- matplotlib-0.99.3/lib/pytz/zoneinfo/zone.tab	2009-07-31 15:14:34.000000000 +0000
    +++ matplotlib-1.0.1/lib/pytz/zoneinfo/zone.tab	2011-01-05 15:59:56.000000000 +0000
    @@ -1,4 +1,7 @@
    -# @(#)zone.tab	8.16
    +# 
    +# @(#)zone.tab	8.38
    +# This file is in the public domain, so clarified as of
    +# 2009-05-17 by Arthur David Olson.
     #
     # TZ zone descriptions
     #
    @@ -38,18 +41,20 @@
     AQ	-6736+06253	Antarctica/Mawson	Mawson Station, Holme Bay
     AQ	-6835+07758	Antarctica/Davis	Davis Station, Vestfold Hills
     AQ	-6617+11031	Antarctica/Casey	Casey Station, Bailey Peninsula
    -AQ	-7824+10654	Antarctica/Vostok	Vostok Station, S Magnetic Pole
    +AQ	-7824+10654	Antarctica/Vostok	Vostok Station, Lake Vostok
     AQ	-6640+14001	Antarctica/DumontDUrville	Dumont-d'Urville Station, Terre Adelie
     AQ	-690022+0393524	Antarctica/Syowa	Syowa Station, E Ongul I
    +AQ	-5430+15857	Antarctica/Macquarie	Macquarie Island Station, Macquarie Island
     AR	-3436-05827	America/Argentina/Buenos_Aires	Buenos Aires (BA, CF)
    -AR	-3124-06411	America/Argentina/Cordoba	most locations (CB, CC, CN, ER, FM, LP, MN, NQ, RN, SA, SE, SF)
    -AR	-3319-06621	America/Argentina/San_Luis	San Luis (SL)
    +AR	-3124-06411	America/Argentina/Cordoba	most locations (CB, CC, CN, ER, FM, MN, SE, SF)
    +AR	-2447-06525	America/Argentina/Salta	(SA, LP, NQ, RN)
     AR	-2411-06518	America/Argentina/Jujuy	Jujuy (JY)
     AR	-2649-06513	America/Argentina/Tucuman	Tucuman (TM)
     AR	-2828-06547	America/Argentina/Catamarca	Catamarca (CT), Chubut (CH)
     AR	-2926-06651	America/Argentina/La_Rioja	La Rioja (LR)
     AR	-3132-06831	America/Argentina/San_Juan	San Juan (SJ)
     AR	-3253-06849	America/Argentina/Mendoza	Mendoza (MZ)
    +AR	-3319-06621	America/Argentina/San_Luis	San Luis (SL)
     AR	-5138-06913	America/Argentina/Rio_Gallegos	Santa Cruz (SC)
     AR	-5448-06818	America/Argentina/Ushuaia	Tierra del Fuego (TF)
     AS	-1416-17042	Pacific/Pago_Pago
    @@ -92,14 +97,15 @@
     BR	-2332-04637	America/Sao_Paulo	S & SE Brazil (GO, DF, MG, ES, RJ, SP, PR, SC, RS)
     BR	-2027-05437	America/Campo_Grande	Mato Grosso do Sul
     BR	-1535-05605	America/Cuiaba	Mato Grosso
    -BR	-0846-06354	America/Porto_Velho	W Para, Rondonia
    +BR	-0226-05452	America/Santarem	W Para
    +BR	-0846-06354	America/Porto_Velho	Rondonia
     BR	+0249-06040	America/Boa_Vista	Roraima
     BR	-0308-06001	America/Manaus	E Amazonas
     BR	-0640-06952	America/Eirunepe	W Amazonas
     BR	-0958-06748	America/Rio_Branco	Acre
     BS	+2505-07721	America/Nassau
     BT	+2728+08939	Asia/Thimphu
    -BW	-2545+02555	Africa/Gaborone
    +BW	-2439+02555	Africa/Gaborone
     BY	+5354+02734	Europe/Minsk
     BZ	+1730-08812	America/Belize
     CA	+4734-05243	America/St_Johns	Newfoundland Time, including SE Labrador
    @@ -114,7 +120,7 @@
     CA	+4823-08915	America/Thunder_Bay	Eastern Time - Thunder Bay, Ontario
     CA	+6344-06828	America/Iqaluit	Eastern Time - east Nunavut - most locations
     CA	+6608-06544	America/Pangnirtung	Eastern Time - Pangnirtung, Nunavut
    -CA	+744144-0944945	America/Resolute	Eastern Time - Resolute, Nunavut
    +CA	+744144-0944945	America/Resolute	Eastern Standard Time - Resolute, Nunavut
     CA	+484531-0913718	America/Atikokan	Eastern Standard Time - Atikokan, Ontario and Southampton I, Nunavut
     CA	+624900-0920459	America/Rankin_Inlet	Central Time - central Nunavut
     CA	+4953-09709	America/Winnipeg	Central Time - Manitoba & west Ontario
    @@ -171,8 +177,8 @@
     FI	+6010+02458	Europe/Helsinki
     FJ	-1808+17825	Pacific/Fiji
     FK	-5142-05751	Atlantic/Stanley
    -FM	+0725+15147	Pacific/Truk	Truk (Chuuk) and Yap
    -FM	+0658+15813	Pacific/Ponape	Ponape (Pohnpei)
    +FM	+0725+15147	Pacific/Chuuk	Chuuk (Truk) and Yap
    +FM	+0658+15813	Pacific/Pohnpei	Pohnpei (Ponape)
     FM	+0519+16259	Pacific/Kosrae	Kosrae
     FO	+6201-00646	Atlantic/Faroe
     FR	+4852+00220	Europe/Paris
    @@ -274,25 +280,29 @@
     MX	+1924-09909	America/Mexico_City	Central Time - most locations
     MX	+2105-08646	America/Cancun	Central Time - Quintana Roo
     MX	+2058-08937	America/Merida	Central Time - Campeche, Yucatan
    -MX	+2540-10019	America/Monterrey	Central Time - Coahuila, Durango, Nuevo Leon, Tamaulipas
    +MX	+2540-10019	America/Monterrey	Mexican Central Time - Coahuila, Durango, Nuevo Leon, Tamaulipas away from US border
    +MX	+2550-09730	America/Matamoros	US Central Time - Coahuila, Durango, Nuevo Leon, Tamaulipas near US border
     MX	+2313-10625	America/Mazatlan	Mountain Time - S Baja, Nayarit, Sinaloa
    -MX	+2838-10605	America/Chihuahua	Mountain Time - Chihuahua
    +MX	+2838-10605	America/Chihuahua	Mexican Mountain Time - Chihuahua away from US border
    +MX	+2934-10425	America/Ojinaga	US Mountain Time - Chihuahua near US border
     MX	+2904-11058	America/Hermosillo	Mountain Standard Time - Sonora
    -MX	+3232-11701	America/Tijuana	Pacific Time
    +MX	+3232-11701	America/Tijuana	US Pacific Time - Baja California near US border
    +MX	+3018-11452	America/Santa_Isabel	Mexican Pacific Time - Baja California away from US border
    +MX	+2048-10515	America/Bahia_Banderas	Mexican Central Time - Bahia de Banderas
     MY	+0310+10142	Asia/Kuala_Lumpur	peninsular Malaysia
     MY	+0133+11020	Asia/Kuching	Sabah & Sarawak
     MZ	-2558+03235	Africa/Maputo
     NA	-2234+01706	Africa/Windhoek
    -NC	-2216+16530	Pacific/Noumea
    +NC	-2216+16627	Pacific/Noumea
     NE	+1331+00207	Africa/Niamey
     NF	-2903+16758	Pacific/Norfolk
     NG	+0627+00324	Africa/Lagos
     NI	+1209-08617	America/Managua
     NL	+5222+00454	Europe/Amsterdam
     NO	+5955+01045	Europe/Oslo
    -NP	+2743+08519	Asia/Katmandu
    +NP	+2743+08519	Asia/Kathmandu
     NR	-0031+16655	Pacific/Nauru
    -NU	-1901+16955	Pacific/Niue
    +NU	-1901-16955	Pacific/Niue
     NZ	-3652+17446	Pacific/Auckland	most locations
     NZ	-4357-17633	Pacific/Chatham	Chatham Islands
     OM	+2336+05835	Asia/Muscat
    @@ -321,18 +331,19 @@
     RU	+5443+02030	Europe/Kaliningrad	Moscow-01 - Kaliningrad
     RU	+5545+03735	Europe/Moscow	Moscow+00 - west Russia
     RU	+4844+04425	Europe/Volgograd	Moscow+00 - Caspian Sea
    -RU	+5312+05009	Europe/Samara	Moscow+01 - Samara, Udmurtia
    +RU	+5312+05009	Europe/Samara	Moscow - Samara, Udmurtia
     RU	+5651+06036	Asia/Yekaterinburg	Moscow+02 - Urals
     RU	+5500+07324	Asia/Omsk	Moscow+03 - west Siberia
     RU	+5502+08255	Asia/Novosibirsk	Moscow+03 - Novosibirsk
    +RU	+5345+08707	Asia/Novokuznetsk	Moscow+03 - Novokuznetsk
     RU	+5601+09250	Asia/Krasnoyarsk	Moscow+04 - Yenisei River
     RU	+5216+10420	Asia/Irkutsk	Moscow+05 - Lake Baikal
     RU	+6200+12940	Asia/Yakutsk	Moscow+06 - Lena River
     RU	+4310+13156	Asia/Vladivostok	Moscow+07 - Amur River
     RU	+4658+14242	Asia/Sakhalin	Moscow+07 - Sakhalin Island
     RU	+5934+15048	Asia/Magadan	Moscow+08 - Magadan
    -RU	+5301+15839	Asia/Kamchatka	Moscow+09 - Kamchatka
    -RU	+6445+17729	Asia/Anadyr	Moscow+10 - Bering Sea
    +RU	+5301+15839	Asia/Kamchatka	Moscow+08 - Kamchatka
    +RU	+6445+17729	Asia/Anadyr	Moscow+08 - Bering Sea
     RW	-0157+03004	Africa/Kigali
     SA	+2438+04643	Asia/Riyadh
     SB	-0932+16012	Pacific/Guadalcanal
    @@ -363,7 +374,7 @@
     TL	-0833+12535	Asia/Dili
     TM	+3757+05823	Asia/Ashgabat
     TN	+3648+01011	Africa/Tunis
    -TO	-2110+17510	Pacific/Tongatapu
    +TO	-2110-17510	Pacific/Tongatapu
     TR	+4101+02858	Europe/Istanbul
     TT	+1039-06131	America/Port_of_Spain
     TV	-0831+17913	Pacific/Funafuti
    @@ -383,13 +394,13 @@
     US	+364947-0845057	America/Kentucky/Monticello	Eastern Time - Kentucky - Wayne County
     US	+394606-0860929	America/Indiana/Indianapolis	Eastern Time - Indiana - most locations
     US	+384038-0873143	America/Indiana/Vincennes	Eastern Time - Indiana - Daviess, Dubois, Knox & Martin Counties
    -US	+411745-0863730	America/Indiana/Knox	Eastern Time - Indiana - Starke County
     US	+410305-0863611	America/Indiana/Winamac	Eastern Time - Indiana - Pulaski County
     US	+382232-0862041	America/Indiana/Marengo	Eastern Time - Indiana - Crawford County
    +US	+382931-0871643	America/Indiana/Petersburg	Eastern Time - Indiana - Pike County
     US	+384452-0850402	America/Indiana/Vevay	Eastern Time - Indiana - Switzerland County
     US	+415100-0873900	America/Chicago	Central Time
     US	+375711-0864541	America/Indiana/Tell_City	Central Time - Indiana - Perry County
    -US	+382931-0871643	America/Indiana/Petersburg	Central Time - Indiana - Pike County
    +US	+411745-0863730	America/Indiana/Knox	Central Time - Indiana - Starke County
     US	+450628-0873651	America/Menominee	Central Time - Michigan - Dickinson, Gogebic, Iron & Menominee Counties
     US	+470659-1011757	America/North_Dakota/Center	Central Time - North Dakota - Oliver County
     US	+465042-1012439	America/North_Dakota/New_Salem	Central Time - North Dakota - Morton County (except Mandan area)
    @@ -407,7 +418,7 @@
     UY	-3453-05611	America/Montevideo
     UZ	+3940+06648	Asia/Samarkand	west Uzbekistan
     UZ	+4120+06918	Asia/Tashkent	east Uzbekistan
    -VA	+4154+01227	Europe/Vatican
    +VA	+415408+0122711	Europe/Vatican
     VC	+1309-06114	America/St_Vincent
     VE	+1030-06656	America/Caracas
     VG	+1827-06437	America/Tortola
    diff -Nru matplotlib-0.99.3/license/LICENSE_QT4_EDITOR matplotlib-1.0.1/license/LICENSE_QT4_EDITOR
    --- matplotlib-0.99.3/license/LICENSE_QT4_EDITOR	1970-01-01 00:00:00.000000000 +0000
    +++ matplotlib-1.0.1/license/LICENSE_QT4_EDITOR	2010-07-07 01:41:45.000000000 +0000
    @@ -0,0 +1,30 @@
    +
    +Module creating PyQt4 form dialogs/layouts to edit various type of parameters
    +
    +
    +formlayout License Agreement (MIT License)
    +------------------------------------------
    +
    +Copyright (c) 2009 Pierre Raybaut
    +
    +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.
    +"""
    diff -Nru matplotlib-0.99.3/make.osx matplotlib-1.0.1/make.osx
    --- matplotlib-0.99.3/make.osx	2010-03-09 14:45:01.000000000 +0000
    +++ matplotlib-1.0.1/make.osx	2010-07-07 01:41:55.000000000 +0000
    @@ -10,7 +10,6 @@
     OSX_SDK_VER=10.6
     ARCH_FLAGS="-arch i386-arch x86_64"
     
    -
     ## You shouldn't need to configure past this point
     
     #PKG_CONFIG_PATH="${PREFIX}/lib/pkgconfig"
    @@ -30,9 +29,10 @@
     	build
     
     
    +
     fetch:
    -	${PYTHON} -c 'import urllib; urllib.urlretrieve("http://www.zlib.net/zlib-${ZLIBVERSION}.tar.gz", "zlib-${ZLIBVERSION}.tar.gz")'  &&\
    -	${PYTHON} -c 'import urllib; urllib.urlretrieve("http://downloads.sourceforge.net/project/libpng/libpng-stable/${PNGVERSION}/libpng-${PNGVERSION}.tar.gz", "libpng-${PNGVERSION}.tar.gz")' &&\
    +	${PYTHON} -c 'import urllib; urllib.urlretrieve("http://superb-sea2.dl.sourceforge.net/project/libpng/zlib/${ZLIBVERSION}/zlib-${ZLIBVERSION}.tar.gz", "zlib-${ZLIBVERSION}.tar.gz")'  &&\
    +	${PYTHON} -c 'import urllib; urllib.urlretrieve("http://sourceforge.net/projects/libpng/files/libpng-stable/${PNGVERSION}/libpng-${PNGVERSION}.tar.gz/download", "libpng-${PNGVERSION}.tar.gz")' &&\
     	${PYTHON} -c 'import urllib; urllib.urlretrieve("http://download.savannah.gnu.org/releases/freetype/freetype-${FREETYPEVERSION}.tar.bz2", "freetype-${FREETYPEVERSION}.tar.bz2")'
     
     
    @@ -41,7 +41,7 @@
     zlib:
     	export PKG_CONFIG_PATH=${PKG_CONFIG_PATH} &&\
     	rm -rf zlib-${ZLIBVERSION} &&\
    -	tar xvfj zlib-${ZLIBVERSION}.tar.gz &&\
    +	tar xvfz zlib-${ZLIBVERSION}.tar.gz &&\
     	cd zlib-${ZLIBVERSION} &&\
     	export MACOSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET} &&\
     	export CFLAGS=${CFLAGS} &&\
    @@ -86,7 +86,7 @@
     	export MACOSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET} &&\
     	export CFLAGS=${CFLAGS} &&\
     	export LDFLAGS=${LDFLAGS} &&\
    -        ${PYTHON} setup.py build
    +	${PYTHON} setup.py build
     
     mpl_install:
     	export PKG_CONFIG_PATH=${PKG_CONFIG_PATH} &&\
    diff -Nru matplotlib-0.99.3/matplotlibrc.template matplotlib-1.0.1/matplotlibrc.template
    --- matplotlib-0.99.3/matplotlibrc.template	2009-07-31 15:14:51.000000000 +0000
    +++ matplotlib-1.0.1/matplotlibrc.template	2010-12-13 15:27:29.000000000 +0000
    @@ -63,10 +63,10 @@
     # circles.  See
     # http://matplotlib.sourceforge.net/api/artist_api.html#module-matplotlib.patches
     # information on patch properties
    -#patch.linewidth   	: 1.0     # edge width in points
    -#patch.facecolor  	: blue
    -#patch.edgecolor  	: black
    -#patch.antialiased 	: True    # render patches in antialised (no jaggies)
    +#patch.linewidth        : 1.0     # edge width in points
    +#patch.facecolor        : blue
    +#patch.edgecolor        : black
    +#patch.antialiased      : True    # render patches in antialised (no jaggies)
     
     ### FONT
     #
    @@ -158,14 +158,8 @@
                                  # correction off.  None will try and
                                  # guess based on your dvipng version
     
    -#text.markup         : 'plain'  # Affects how text, such as titles and labels, are
    -                                # interpreted by default.
    -                                # 'plain': As plain, unformatted text
    -				# 'tex': As TeX-like text.  Text between $'s will be
    -				# formatted as a TeX math expression.
    -				# This setting has no effect when text.usetex is True.
    -				# In that case, all text will be sent to TeX for
    -				# processing.
    +#text.hinting : True # If True, text will be hinted, otherwise not.  This only
    +                     # affects the Agg backend.
     
     # The following settings allow you to select the fonts in math mode.
     # They map from a TeX font name to a fontconfig font pattern.
    @@ -181,8 +175,8 @@
     #mathtext.fontset : cm # Should be 'cm' (Computer Modern), 'stix',
                            # 'stixsans' or 'custom'
     #mathtext.fallback_to_cm : True  # When True, use symbols from the Computer Modern
    -			         # fonts when a symbol can not be found in one of
    -				 # the custom math fonts.
    +                                 # fonts when a symbol can not be found in one of
    +                                 # the custom math fonts.
     
     #mathtext.default : it # The default font to use for math.
                            # Can be any of the LaTeX font names, including
    @@ -208,6 +202,10 @@
                                    # first or larger than the second
     #axes.unicode_minus  : True    # use unicode for the minus symbol
                                    # rather than hypen.  See http://en.wikipedia.org/wiki/Plus_sign#Plus_sign
    +#axes.color_cycle    : b, g, r, c, m, y, k  # color cycle for plot lines
    +                                            # as list of string colorspecs:
    +                                            # single letter, long name, or
    +                                            # web-style hex
     
     #polaraxes.grid      : True    # display grid on polar axes
     #axes3d.grid         : True    # display grid on 3d axes
    @@ -261,12 +259,12 @@
     
     # The figure subplot parameters.  All dimensions are fraction of the
     # figure width or height
    -#figure.subplot.left	: 0.125  # the left side of the subplots of the figure
    -#figure.subplot.right	: 0.9    # the right side of the subplots of the figure
    -#figure.subplot.bottom	: 0.1    # the bottom of the subplots of the figure
    -#figure.subplot.top	: 0.9    # the top of the subplots of the figure
    -#figure.subplot.wspace	: 0.2    # the amount of width reserved for blank space between subplots
    -#figure.subplot.hspace	: 0.2    # the amount of height reserved for white space between subplots
    +#figure.subplot.left    : 0.125  # the left side of the subplots of the figure
    +#figure.subplot.right   : 0.9    # the right side of the subplots of the figure
    +#figure.subplot.bottom  : 0.1    # the bottom of the subplots of the figure
    +#figure.subplot.top     : 0.9    # the top of the subplots of the figure
    +#figure.subplot.wspace  : 0.2    # the amount of width reserved for blank space between subplots
    +#figure.subplot.hspace  : 0.2    # the amount of height reserved for white space between subplots
     
     ### IMAGES
     #image.aspect : equal             # equal | auto | a number
    @@ -290,12 +288,15 @@
                                       # A value of 20000 is probably a good
                                       # starting point.
     ### SAVING FIGURES
    -#path.simplify : False  # When True, simplify paths by removing "invisible" 
    +#path.simplify : True   # When True, simplify paths by removing "invisible"
                             # points to reduce file size and increase rendering
                             # speed
     #path.simplify_threshold : 0.1  # The threshold of similarity below which
                                     # vertices will be removed in the simplification
                                     # process
    +#path.snap : True # When True, rectilinear axis-aligned paths will be snapped to
    +                  # the nearest pixel when certain criteria are met.  When False,
    +                  # paths will never be snapped.
     
     # the default savefig params can be different from the display params
     # Eg, you may want a higher resolution, or to make the figure
    @@ -303,12 +304,12 @@
     #savefig.dpi       : 100      # figure dots per inch
     #savefig.facecolor : white    # figure facecolor when saving
     #savefig.edgecolor : white    # figure edgecolor when saving
    +#savefig.extension : auto     # what extension to use for savefig('foo'), or 'auto'
     
     #cairo.format      : png      # png, ps, pdf, svg
     
     # tk backend params
     #tk.window_focus   : False    # Maintain shell focus for TkAgg
    -#tk.pythoninspect  : False    # tk sets PYTHONINSEPCT
     
     # ps backend params
     #ps.papersize      : letter   # auto, letter, legal, ledger, A0-A10, B0-B10
    @@ -352,3 +353,29 @@
     #   from matplotlib import verbose.
     #verbose.level  : silent      # one of silent, helpful, debug, debug-annoying
     #verbose.fileo  : sys.stdout  # a log filename, sys.stdout or sys.stderr
    +
    +# Event keys to interact with figures/plots via keyboard.
    +# Customize these settings according to your needs.
    +# Leave the field(s) empty if you don't need a key-map. (i.e., fullscreen : '')
    +
    +#keymap.fullscreen : f               # toggling
    +#keymap.home : h, r, home            # home or reset mnemonic
    +#keymap.back : left, c, backspace    # forward / backward keys to enable
    +#keymap.forward : right, v           #   left handed quick navigation
    +#keymap.pan : p                      # pan mnemonic
    +#keymap.zoom : o                     # zoom mnemonic
    +#keymap.save : s                     # saving current figure
    +#keymap.grid : g                     # switching on/off a grid in current axes
    +#keymap.yscale : l                   # toggle scaling of y-axes ('log'/'linear')
    +#keymap.xscale : L, k                # toggle scaling of x-axes ('log'/'linear')
    +#keymap.all_axes : a                 # enable all axes
    +
    +# Control downloading of example data. Various examples download some
    +# data from the Matplotlib svn repository to avoid distributing extra
    +# files, but sometimes you want to avoid that. In that case set
    +# examples.download to False and examples.directory to the directory
    +# where you have a checkout of
    +# https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/trunk/sample_data
    +
    +#examples.download : True  # False to bypass downloading mechanism
    +#examples.directory : ''   # directory to look in if download is false
    diff -Nru matplotlib-0.99.3/PKG-INFO matplotlib-1.0.1/PKG-INFO
    --- matplotlib-0.99.3/PKG-INFO	2010-05-30 20:34:03.000000000 +0000
    +++ matplotlib-1.0.1/PKG-INFO	2011-01-06 13:53:02.000000000 +0000
    @@ -1,16 +1,16 @@
     Metadata-Version: 1.0
     Name: matplotlib
    -Version: 0.99.3
    +Version: 1.0.1
     Summary: Python plotting package
     Home-page: http://matplotlib.sourceforge.net
     Author: John D. Hunter
     Author-email: jdh2358@gmail.com
     License: UNKNOWN
     Description: 
    -        matplotlib strives to produce publication quality 2D graphics
    -        for interactive graphing, scientific publishing, user interface
    -        development and web application servers targeting multiple user
    -        interfaces and hardcopy output formats.  There is a 'pylab' mode
    -        which emulates matlab graphics
    -        
    +              matplotlib strives to produce publication quality 2D graphics
    +              for interactive graphing, scientific publishing, user interface
    +              development and web application servers targeting multiple user
    +              interfaces and hardcopy output formats.  There is a 'pylab' mode
    +              which emulates matlab graphics
    +              
     Platform: any
    diff -Nru matplotlib-0.99.3/sampledata/aapl.csv matplotlib-1.0.1/sampledata/aapl.csv
    --- matplotlib-0.99.3/sampledata/aapl.csv	1970-01-01 00:00:00.000000000 +0000
    +++ matplotlib-1.0.1/sampledata/aapl.csv	2009-09-06 12:32:28.000000000 +0000
    @@ -0,0 +1,6082 @@
    +Date,Open,High,Low,Close,Volume,Adj Close
    +2008-10-14,116.26,116.40,103.14,104.08,70749800,104.08
    +2008-10-13,104.55,110.53,101.02,110.26,54967000,110.26
    +2008-10-10,85.70,100.00,85.00,96.80,79260700,96.80
    +2008-10-09,93.35,95.80,86.60,88.74,57763700,88.74
    +2008-10-08,85.91,96.33,85.68,89.79,78847900,89.79
    +2008-10-07,100.48,101.50,88.95,89.16,67099000,89.16
    +2008-10-06,91.96,98.78,87.54,98.14,75264900,98.14
    +2008-10-03,104.00,106.50,94.65,97.07,81942800,97.07
    +2008-10-02,108.01,108.79,100.00,100.10,57477300,100.10
    +2008-10-01,111.92,112.36,107.39,109.12,46303000,109.12
    +2008-09-30,108.25,115.00,106.30,113.66,58095800,113.66
    +2008-09-29,119.62,119.68,100.59,105.26,93581400,105.26
    +2008-09-26,124.91,129.80,123.00,128.24,40208700,128.24
    +2008-09-25,129.80,134.79,128.52,131.93,35865600,131.93
    +2008-09-24,127.27,130.95,125.15,128.71,37393400,128.71
    +2008-09-23,131.85,135.80,126.66,126.84,45727300,126.84
    +2008-09-22,139.94,140.25,130.66,131.05,30577300,131.05
    +2008-09-19,142.60,144.20,136.31,140.91,51102700,140.91
    +2008-09-18,130.57,135.43,120.68,134.09,59819300,134.09
    +2008-09-17,138.49,138.51,127.83,127.83,42847200,127.83
    +2008-09-16,133.86,142.50,132.15,139.88,42804800,139.88
    +2008-09-15,142.03,147.69,140.36,140.36,32852600,140.36
    +2008-09-12,150.91,150.91,146.50,148.94,28322400,148.94
    +2008-09-11,148.18,152.99,146.00,152.65,34666800,152.65
    +2008-09-10,152.32,154.99,148.80,151.61,34755100,151.61
    +2008-09-09,156.86,159.96,149.79,151.68,44442500,151.68
    +2008-09-08,164.57,164.89,151.46,157.92,37356400,157.92
    +2008-09-05,158.59,162.40,157.65,160.18,28083800,160.18
    +2008-09-04,165.86,167.91,160.81,161.22,26549500,161.22
    +2008-09-03,166.84,168.68,164.00,166.96,26244100,166.96
    +2008-09-02,172.40,173.50,165.00,166.19,27884400,166.19
    +2008-08-29,172.96,173.50,169.04,169.53,21403200,169.53
    +2008-08-28,175.28,176.25,172.75,173.74,15394500,173.74
    +2008-08-27,173.31,175.76,172.19,174.67,17045900,174.67
    +2008-08-26,172.76,174.88,172.61,173.64,15912500,173.64
    +2008-08-25,176.15,176.23,171.66,172.55,17300900,172.55
    +2008-08-22,175.82,177.50,175.57,176.79,15700400,176.79
    +2008-08-21,174.47,175.45,171.89,174.29,19276600,174.29
    +2008-08-20,174.77,176.94,173.61,175.84,18105400,175.84
    +2008-08-19,174.54,177.07,171.81,173.53,21997000,173.53
    +2008-08-18,175.57,177.81,173.82,175.39,19691200,175.39
    +2008-08-15,179.04,179.75,175.05,175.74,25294700,175.74
    +2008-08-14,178.33,180.45,177.84,179.32,25393200,179.32
    +2008-08-13,177.98,180.00,175.90,179.30,30083800,179.30
    +2008-08-12,173.52,179.29,173.51,176.73,29867100,176.73
    +2008-08-11,170.07,176.50,169.67,173.56,31821100,173.56
    +2008-08-08,163.86,169.65,163.75,169.55,25499900,169.55
    +2008-08-07,162.71,166.15,161.50,163.57,24013300,163.57
    +2008-08-06,159.97,167.40,158.00,164.19,28264600,164.19
    +2008-08-05,155.42,160.80,154.82,160.64,24584700,160.64
    +2008-08-04,156.60,157.90,152.91,153.23,21161700,153.23
    +2008-08-01,159.90,159.99,155.75,156.66,19451400,156.66
    +2008-07-31,157.54,162.20,156.98,158.95,22767800,158.95
    +2008-07-30,157.78,160.49,156.08,159.88,25899400,159.88
    +2008-07-29,155.41,159.45,153.65,157.08,24431100,157.08
    +2008-07-28,162.34,162.47,154.02,154.40,27882600,154.40
    +2008-07-25,160.40,163.00,158.65,162.12,22629900,162.12
    +2008-07-24,164.32,165.26,158.45,159.03,29986400,159.03
    +2008-07-23,164.99,168.37,161.56,166.26,37920300,166.26
    +2008-07-22,149.00,162.76,146.53,162.02,67128300,162.02
    +2008-07-21,166.90,167.50,161.12,166.29,48588200,166.29
    +2008-07-18,168.52,169.65,165.00,165.15,31014800,165.15
    +2008-07-17,174.10,174.98,171.39,171.81,27054500,171.81
    +2008-07-16,170.20,172.93,168.60,172.81,26706800,172.81
    +2008-07-15,172.48,173.74,166.39,169.64,37144400,169.64
    +2008-07-14,179.24,179.30,173.08,173.88,31644800,173.88
    +2008-07-11,175.47,177.11,171.00,172.58,33214700,172.58
    +2008-07-10,174.92,177.34,171.37,176.63,30024600,176.63
    +2008-07-09,180.20,180.91,174.14,174.25,31992000,174.25
    +2008-07-08,175.40,179.70,172.74,179.55,31726800,179.55
    +2008-07-07,173.16,177.13,171.90,175.16,29299700,175.16
    +2008-07-03,169.59,172.17,165.75,170.12,18691500,170.12
    +2008-07-02,175.20,177.45,168.18,168.18,29911400,168.18
    +2008-07-01,164.23,174.72,164.00,174.68,39688600,174.68
    +2008-06-30,170.19,172.00,166.62,167.44,24435600,167.44
    +2008-06-27,166.51,170.57,164.15,170.09,37223200,170.09
    +2008-06-26,174.07,174.84,168.01,168.26,31057500,168.26
    +2008-06-25,174.61,178.83,173.88,177.39,23016100,177.39
    +2008-06-24,172.37,175.78,171.63,173.25,22212400,173.25
    +2008-06-23,174.74,175.88,171.56,173.16,23063600,173.16
    +2008-06-20,179.35,181.00,175.00,175.27,31727400,175.27
    +2008-06-19,178.55,182.34,176.80,180.90,28283900,180.90
    +2008-06-18,181.12,182.20,177.35,178.75,28981000,178.75
    +2008-06-17,178.10,181.99,177.41,181.43,32130600,181.43
    +2008-06-16,171.30,177.90,169.07,176.84,37561800,176.84
    +2008-06-13,171.64,174.16,165.31,172.37,48069900,172.37
    +2008-06-12,181.49,182.60,171.20,173.26,46726200,173.26
    +2008-06-11,184.34,186.00,179.59,180.81,34341100,180.81
    +2008-06-10,180.51,186.78,179.02,185.64,40728600,185.64
    +2008-06-09,184.79,184.94,175.75,181.61,67442600,181.61
    +2008-06-06,188.00,189.95,185.55,185.64,34438700,185.64
    +2008-06-05,186.34,189.84,185.70,189.43,26980200,189.43
    +2008-06-04,184.02,187.09,183.23,185.19,25963700,185.19
    +2008-06-03,186.86,188.20,182.34,185.37,26804300,185.37
    +2008-06-02,188.60,189.65,184.53,186.10,24280000,186.10
    +2008-05-30,187.45,189.54,187.38,188.75,21792300,188.75
    +2008-05-29,186.76,188.20,185.50,186.69,23113800,186.69
    +2008-05-28,187.41,187.95,183.72,187.01,26570700,187.01
    +2008-05-27,182.75,186.43,181.84,186.43,28210900,186.43
    +2008-05-23,180.77,181.99,177.80,181.17,32389900,181.17
    +2008-05-22,179.26,181.33,172.00,177.05,43097700,177.05
    +2008-05-21,185.67,187.95,176.25,178.19,41344900,178.19
    +2008-05-20,181.82,186.16,180.12,185.90,34637500,185.90
    +2008-05-19,187.86,188.69,181.30,183.60,33779300,183.60
    +2008-05-16,190.11,190.30,187.00,187.62,27348900,187.62
    +2008-05-15,186.81,189.90,184.20,189.73,31186000,189.73
    +2008-05-14,191.23,192.24,185.57,186.26,32743700,186.26
    +2008-05-13,188.61,191.45,187.86,189.96,29401300,189.96
    +2008-05-12,185.21,188.87,182.85,188.16,29234400,188.16
    +2008-05-09,183.16,184.25,181.37,183.45,24038300,183.45
    +2008-05-08,183.77,186.50,183.07,185.06,32110200,185.06
    +2008-05-07,186.05,188.20,180.54,182.59,41326200,182.59
    +2008-05-06,184.66,187.12,182.18,186.66,32816800,186.66
    +2008-05-05,181.92,185.31,181.05,184.73,30519900,184.73
    +2008-05-02,180.19,181.92,178.55,180.94,35931500,180.94
    +2008-05-01,174.96,180.00,174.86,180.00,32270600,180.00
    +2008-04-30,176.19,180.00,172.92,173.95,40697300,173.95
    +2008-04-29,171.11,175.66,170.25,175.05,32981300,175.05
    +2008-04-28,169.75,173.75,169.13,172.24,28114800,172.24
    +2008-04-25,170.70,171.10,166.42,169.73,35445500,169.73
    +2008-04-24,165.34,169.98,159.19,168.94,60573800,168.94
    +2008-04-23,164.05,164.84,161.08,162.89,53721100,162.89
    +2008-04-22,167.40,168.00,158.09,160.20,51413300,160.20
    +2008-04-21,162.21,168.50,161.76,168.16,37112600,168.16
    +2008-04-18,159.12,162.26,158.38,161.04,36670200,161.04
    +2008-04-17,154.17,156.00,153.35,154.49,25152400,154.49
    +2008-04-16,151.72,154.10,150.62,153.70,28420500,153.70
    +2008-04-15,149.40,149.72,145.72,148.38,24929900,148.38
    +2008-04-14,146.77,149.25,144.54,147.78,30181700,147.78
    +2008-04-11,152.72,153.30,146.40,147.14,43217000,147.14
    +2008-04-10,151.13,155.42,150.60,154.55,34134400,154.55
    +2008-04-09,153.31,153.89,150.46,151.44,31192800,151.44
    +2008-04-08,153.55,156.45,152.32,152.84,36224800,152.84
    +2008-04-07,156.13,159.69,155.11,155.89,41368800,155.89
    +2008-04-04,152.19,154.71,150.75,153.08,30514900,153.08
    +2008-04-03,147.06,153.63,147.00,151.61,37556000,151.61
    +2008-04-02,148.78,151.20,145.85,147.49,37320300,147.49
    +2008-04-01,146.30,149.66,143.61,149.53,36877400,149.53
    +2008-03-31,143.27,145.71,142.52,143.50,27430900,143.50
    +2008-03-28,141.80,144.65,141.60,143.01,25521800,143.01
    +2008-03-27,144.95,145.31,139.99,140.25,35708200,140.25
    +2008-03-26,140.87,145.74,140.64,145.06,42217300,145.06
    +2008-03-25,139.96,143.10,137.33,140.98,37585400,140.98
    +2008-03-24,134.01,140.85,133.64,139.53,38104300,139.53
    +2008-03-20,131.12,133.29,129.18,133.27,32456700,133.27
    +2008-03-19,133.12,134.29,129.67,129.67,36090600,129.67
    +2008-03-18,129.18,133.00,128.67,132.82,43040000,132.82
    +2008-03-17,122.55,128.59,122.55,126.73,38307100,126.73
    +2008-03-14,129.88,130.30,124.20,126.61,41308600,126.61
    +2008-03-13,124.10,129.50,123.00,127.94,45075100,127.94
    +2008-03-12,127.04,128.68,125.17,126.03,37843900,126.03
    +2008-03-11,124.10,127.48,122.00,127.35,41569400,127.35
    +2008-03-10,121.98,123.46,119.37,119.69,35699600,119.69
    +2008-03-07,120.41,122.98,119.05,122.25,43945100,122.25
    +2008-03-06,124.61,127.50,120.81,120.93,52632100,120.93
    +2008-03-05,123.58,125.14,122.25,124.49,43637000,124.49
    +2008-03-04,121.99,124.88,120.40,124.62,63763700,124.62
    +2008-03-03,124.44,125.98,118.00,121.73,56894400,121.73
    +2008-02-29,129.29,130.21,124.80,125.02,44838600,125.02
    +2008-02-28,127.20,132.20,125.77,129.91,57794800,129.91
    +2008-02-27,118.23,123.05,118.09,122.96,52683500,122.96
    +2008-02-26,117.64,121.09,115.44,119.15,53746000,119.15
    +2008-02-25,118.59,120.17,116.66,119.74,44884800,119.74
    +2008-02-22,122.48,122.51,115.87,119.46,54638500,119.46
    +2008-02-21,126.05,126.47,120.86,121.54,33504100,121.54
    +2008-02-20,122.20,124.60,121.68,123.82,34551400,123.82
    +2008-02-19,125.99,126.75,121.44,122.18,35894500,122.18
    +2008-02-15,126.27,127.08,124.06,124.63,32189300,124.63
    +2008-02-14,129.40,130.80,127.01,127.46,34074900,127.46
    +2008-02-13,126.68,129.78,125.63,129.40,34590500,129.40
    +2008-02-12,130.70,131.00,123.62,124.86,43785000,124.86
    +2008-02-11,128.01,129.98,127.20,129.45,42908300,129.45
    +2008-02-08,122.08,125.70,121.60,125.48,48427600,125.48
    +2008-02-07,119.97,124.78,117.27,121.24,74404700,121.24
    +2008-02-06,130.83,131.92,121.77,122.00,56188300,122.00
    +2008-02-05,130.43,134.00,128.90,129.36,40751500,129.36
    +2008-02-04,134.21,135.90,131.42,131.65,32115500,131.65
    +2008-02-01,136.24,136.59,132.18,133.75,36098000,133.75
    +2008-01-31,129.45,136.65,129.40,135.36,48059800,135.36
    +2008-01-30,131.37,135.45,130.00,132.18,44394700,132.18
    +2008-01-29,131.15,132.79,129.05,131.54,39285100,131.54
    +2008-01-28,128.16,133.20,126.45,130.01,52673000,130.01
    +2008-01-25,138.99,139.09,129.61,130.01,55526400,130.01
    +2008-01-24,139.99,140.70,132.01,135.60,71638100,135.60
    +2008-01-23,136.19,140.00,126.14,139.07,120463200,139.07
    +2008-01-22,148.06,159.98,146.00,155.64,86955500,155.64
    +2008-01-18,161.71,165.75,159.61,161.36,61583700,161.36
    +2008-01-17,161.51,165.36,158.42,160.89,62780700,160.89
    +2008-01-16,165.23,169.01,156.70,159.64,79065900,159.64
    +2008-01-15,177.72,179.22,164.66,169.04,83688500,169.04
    +2008-01-14,177.52,179.42,175.17,178.78,39301800,178.78
    +2008-01-11,176.00,177.85,170.00,172.69,44010200,172.69
    +2008-01-10,177.58,181.00,175.41,178.02,52963400,178.02
    +2008-01-09,171.30,179.50,168.30,179.40,64781500,179.40
    +2008-01-08,180.14,182.46,170.80,171.25,54422000,171.25
    +2008-01-07,181.25,183.60,170.23,177.64,74006900,177.64
    +2008-01-04,191.45,193.00,178.89,180.05,51994000,180.05
    +2008-01-03,195.41,197.39,192.69,194.93,30073800,194.93
    +2008-01-02,199.27,200.26,192.55,194.84,38542100,194.84
    +2007-12-31,199.50,200.50,197.75,198.08,19261900,198.08
    +2007-12-28,200.59,201.56,196.88,199.83,24987400,199.83
    +2007-12-27,198.95,202.96,197.80,198.57,28411700,198.57
    +2007-12-26,199.01,200.96,196.82,198.95,25133300,198.95
    +2007-12-24,195.03,199.33,194.79,198.80,17150100,198.80
    +2007-12-21,190.12,193.91,189.89,193.91,35498600,193.91
    +2007-12-20,185.43,187.83,183.33,187.21,27644900,187.21
    +2007-12-19,182.98,184.64,180.90,183.12,29552800,183.12
    +2007-12-18,186.52,187.33,178.60,182.98,43664400,182.98
    +2007-12-17,190.72,192.65,182.98,184.40,36596200,184.40
    +2007-12-14,190.37,193.20,189.54,190.39,24082600,190.39
    +2007-12-13,190.19,192.12,187.82,191.83,30879200,191.83
    +2007-12-12,193.44,194.48,185.76,190.86,43773600,190.86
    +2007-12-11,194.75,196.83,187.39,188.54,39675900,188.54
    +2007-12-10,193.59,195.66,192.69,194.21,25799200,194.21
    +2007-12-07,190.54,194.99,188.04,194.30,38073800,194.30
    +2007-12-06,186.19,190.10,186.12,189.95,32136100,189.95
    +2007-12-05,182.89,186.00,182.41,185.50,31871500,185.50
    +2007-12-04,177.15,180.90,176.99,179.81,27635700,179.81
    +2007-12-03,181.86,184.14,177.70,178.86,34338200,178.86
    +2007-11-30,187.34,187.70,179.70,182.22,42421500,182.22
    +2007-11-29,179.43,185.17,179.15,184.29,37533100,184.29
    +2007-11-28,176.82,180.60,175.35,180.22,41104000,180.22
    +2007-11-27,175.22,175.79,170.01,174.81,47036800,174.81
    +2007-11-26,173.59,177.27,172.35,172.54,46634100,172.54
    +2007-11-23,172.00,172.05,169.75,171.54,16634200,171.54
    +2007-11-21,165.84,172.35,164.67,168.46,43493200,168.46
    +2007-11-20,165.67,171.79,163.53,168.85,55130100,168.85
    +2007-11-19,166.10,168.20,162.10,163.95,41196800,163.95
    +2007-11-16,165.30,167.02,159.33,166.39,49391300,166.39
    +2007-11-15,166.39,169.59,160.30,164.30,53095600,164.30
    +2007-11-14,177.16,177.57,163.74,166.11,51695400,166.11
    +2007-11-13,160.85,170.98,153.76,169.96,62034100,169.96
    +2007-11-12,165.28,167.70,150.63,153.76,63057700,153.76
    +2007-11-09,171.15,175.12,165.21,165.37,54458700,165.37
    +2007-11-08,186.67,186.90,167.77,175.47,67458500,175.47
    +2007-11-07,190.61,192.68,186.13,186.30,35473400,186.30
    +2007-11-06,187.05,192.00,185.27,191.79,34097400,191.79
    +2007-11-05,185.29,188.96,184.24,186.18,28720600,186.18
    +2007-11-02,189.21,189.44,183.49,187.87,35789800,187.87
    +2007-11-01,188.60,190.10,180.00,187.44,28751300,187.44
    +2007-10-31,187.63,190.12,184.95,189.95,29761100,189.95
    +2007-10-30,186.18,189.37,184.73,187.00,33550500,187.00
    +2007-10-29,185.45,186.59,184.70,185.09,19305500,185.09
    +2007-10-26,185.29,185.37,182.88,184.70,25219800,184.70
    +2007-10-25,184.87,185.90,181.66,182.78,34771500,182.78
    +2007-10-24,185.81,187.21,179.24,185.93,46017200,185.93
    +2007-10-23,188.56,188.60,182.76,186.16,64113000,186.16
    +2007-10-22,170.35,174.90,169.96,174.36,58910700,174.36
    +2007-10-19,174.24,174.63,170.00,170.42,46135000,170.42
    +2007-10-18,171.50,174.19,171.05,173.50,29417000,173.50
    +2007-10-17,172.69,173.04,169.18,172.75,40271900,172.75
    +2007-10-16,165.54,170.18,165.15,169.58,38136800,169.58
    +2007-10-15,167.98,169.57,163.50,166.98,38497500,166.98
    +2007-10-12,163.01,167.28,161.80,167.25,35292000,167.25
    +2007-10-11,169.49,171.88,153.21,162.23,58714000,162.23
    +2007-10-10,167.55,167.88,165.60,166.79,23842500,166.79
    +2007-10-09,170.20,171.11,166.68,167.86,39438800,167.86
    +2007-10-08,163.49,167.91,162.97,167.91,29854600,167.91
    +2007-10-05,158.37,161.58,157.70,161.45,33695400,161.45
    +2007-10-04,158.00,158.08,153.50,156.24,23462800,156.24
    +2007-10-03,157.78,159.18,157.01,157.92,24732800,157.92
    +2007-10-02,156.55,158.59,155.89,158.45,28288200,158.45
    +2007-10-01,154.63,157.41,152.93,156.34,29895300,156.34
    +2007-09-28,153.44,154.60,152.75,153.47,21967900,153.47
    +2007-09-27,153.77,154.52,152.32,154.50,23507100,154.50
    +2007-09-26,154.47,155.00,151.25,152.77,34831000,152.77
    +2007-09-25,146.84,153.22,146.82,153.18,42591100,153.18
    +2007-09-24,146.73,149.85,146.65,148.28,37577200,148.28
    +2007-09-21,141.14,144.65,140.31,144.15,40674300,144.15
    +2007-09-20,140.15,141.79,139.32,140.31,24708600,140.31
    +2007-09-19,143.02,143.16,139.40,140.77,36674300,140.77
    +2007-09-18,139.06,142.85,137.83,140.92,38003200,140.92
    +2007-09-17,138.99,140.59,137.60,138.41,28334700,138.41
    +2007-09-14,136.57,138.98,136.20,138.81,21690000,138.81
    +2007-09-13,138.83,139.00,136.65,137.20,23434400,137.20
    +2007-09-12,135.99,139.40,135.75,136.85,36527500,136.85
    +2007-09-11,137.90,138.30,133.75,135.49,34710200,135.49
    +2007-09-10,136.99,138.04,133.95,136.71,53137100,136.71
    +2007-09-07,132.01,132.30,130.00,131.77,51092000,131.77
    +2007-09-06,135.56,137.57,132.71,135.01,67902200,135.01
    +2007-09-05,144.97,145.84,136.10,136.76,83150800,136.76
    +2007-09-04,139.94,145.73,139.84,144.16,47030100,144.16
    +2007-08-31,139.49,139.65,137.41,138.48,31317400,138.48
    +2007-08-30,132.67,138.25,132.30,136.25,51270800,136.25
    +2007-08-29,129.88,134.18,129.54,134.08,41673600,134.08
    +2007-08-28,130.99,132.41,126.63,126.82,42120200,126.82
    +2007-08-27,133.39,134.66,132.10,132.25,25265700,132.25
    +2007-08-24,130.53,135.37,129.81,135.30,32565500,135.30
    +2007-08-23,133.09,133.34,129.76,131.07,30958500,131.07
    +2007-08-22,131.22,132.75,130.33,132.51,37920200,132.51
    +2007-08-21,122.21,128.96,121.00,127.57,46537400,127.57
    +2007-08-20,123.96,124.50,120.50,122.22,28689900,122.22
    +2007-08-17,122.01,123.50,119.82,122.06,42680800,122.06
    +2007-08-16,117.01,118.50,111.62,117.05,66667500,117.05
    +2007-08-15,122.74,124.86,119.65,119.90,35459000,119.90
    +2007-08-14,128.29,128.30,123.71,124.03,26393100,124.03
    +2007-08-13,128.32,129.35,126.50,127.79,26889700,127.79
    +2007-08-10,123.12,127.75,120.30,125.00,50383900,125.00
    +2007-08-09,131.11,133.00,125.09,126.39,40192700,126.39
    +2007-08-08,136.76,136.86,132.00,134.01,28860600,134.01
    +2007-08-07,134.94,137.24,132.63,135.03,33926300,135.03
    +2007-08-06,132.90,135.27,128.30,135.25,33041800,135.25
    +2007-08-03,135.26,135.95,131.50,131.85,24256700,131.85
    +2007-08-02,136.65,136.96,134.15,136.49,30451600,136.49
    +2007-08-01,133.64,135.38,127.77,135.00,62505600,135.00
    +2007-07-31,142.97,143.48,131.52,131.76,62942600,131.76
    +2007-07-30,144.33,145.45,139.57,141.43,39535300,141.43
    +2007-07-27,146.19,148.92,143.78,143.85,41467800,143.85
    +2007-07-26,145.91,148.50,136.96,146.00,78093900,146.00
    +2007-07-25,137.35,138.36,135.00,137.26,53435100,137.26
    +2007-07-24,138.88,141.00,134.15,134.89,64117600,134.89
    +2007-07-23,143.31,145.22,140.93,143.70,37017500,143.70
    +2007-07-20,141.65,144.18,140.00,143.75,41706200,143.75
    +2007-07-19,140.30,140.81,139.65,140.00,26174700,140.00
    +2007-07-18,138.19,138.44,136.04,138.12,27030600,138.12
    +2007-07-17,138.30,139.60,137.50,138.91,25355700,138.91
    +2007-07-16,138.39,139.98,137.50,138.10,33432600,138.10
    +2007-07-13,135.03,137.85,134.52,137.73,32414500,137.73
    +2007-07-12,133.85,134.24,132.39,134.07,25164600,134.07
    +2007-07-11,132.07,133.70,131.31,132.39,29349000,132.39
    +2007-07-10,128.88,134.50,128.81,132.35,44821700,132.35
    +2007-07-09,132.38,132.90,129.18,130.33,35565000,130.33
    +2007-07-06,133.13,133.34,130.40,132.30,31239100,132.30
    +2007-07-05,128.80,132.97,128.69,132.75,51894700,132.75
    +2007-07-03,122.00,127.40,121.50,127.17,41517200,127.17
    +2007-07-02,121.05,122.09,119.30,121.26,35530800,121.26
    +2007-06-29,121.97,124.00,121.09,122.04,40637200,122.04
    +2007-06-28,122.36,122.49,120.00,120.56,29933700,120.56
    +2007-06-27,120.61,122.04,119.26,121.89,34810600,121.89
    +2007-06-26,123.98,124.00,118.72,119.65,48035900,119.65
    +2007-06-25,124.19,125.09,121.06,122.34,34478700,122.34
    +2007-06-22,123.85,124.45,122.38,123.00,22567000,123.00
    +2007-06-21,121.70,124.29,120.72,123.90,30965900,123.90
    +2007-06-20,123.87,124.66,121.50,121.55,32054000,121.55
    +2007-06-19,124.69,125.01,122.91,123.66,33679500,123.66
    +2007-06-18,123.28,125.18,122.54,125.09,32521600,125.09
    +2007-06-15,120.62,120.67,119.86,120.50,28972100,120.50
    +2007-06-14,117.20,119.45,116.42,118.75,34759500,118.75
    +2007-06-13,121.15,121.19,115.40,117.50,61476900,117.50
    +2007-06-12,119.35,121.71,118.31,120.38,50948800,120.38
    +2007-06-11,126.00,126.15,119.54,120.19,66937800,120.19
    +2007-06-08,125.82,125.83,122.29,124.49,44345800,124.49
    +2007-06-07,124.99,127.61,123.19,124.07,68395700,124.07
    +2007-06-06,122.30,124.05,121.95,123.64,39722900,123.64
    +2007-06-05,121.41,122.69,120.50,122.67,32885200,122.67
    +2007-06-04,118.63,121.73,117.90,121.33,31666900,121.33
    +2007-06-01,121.10,121.19,118.29,118.40,31616500,118.40
    +2007-05-31,120.07,122.17,119.54,121.19,46323800,121.19
    +2007-05-30,114.30,118.88,113.53,118.77,52801600,118.77
    +2007-05-29,114.45,114.86,112.69,114.35,23060500,114.35
    +2007-05-25,112.00,113.78,111.50,113.62,22605700,113.62
    +2007-05-24,112.81,114.46,110.37,110.69,31691500,110.69
    +2007-05-23,114.02,115.00,112.59,112.89,32549100,112.89
    +2007-05-22,112.49,113.75,112.01,113.54,20443200,113.54
    +2007-05-21,110.31,112.45,110.05,111.98,22853300,111.98
    +2007-05-18,110.23,110.64,109.77,110.02,22190900,110.02
    +2007-05-17,107.15,109.87,107.15,109.44,26260400,109.44
    +2007-05-16,108.53,108.83,103.42,107.34,40241700,107.34
    +2007-05-15,109.57,110.20,106.48,107.52,34089800,107.52
    +2007-05-14,109.62,110.00,108.25,109.36,23283800,109.36
    +2007-05-11,107.74,109.13,106.78,108.74,23346300,108.74
    +2007-05-10,106.63,108.84,105.92,107.34,42759200,107.34
    +2007-05-09,104.91,106.96,104.89,106.88,25634200,106.88
    +2007-05-08,103.47,105.15,103.42,105.06,27999900,105.06
    +2007-05-07,101.08,104.35,101.01,103.92,30769900,103.92
    +2007-05-04,100.80,101.60,100.50,100.81,13642400,100.81
    +2007-05-03,100.73,101.45,100.01,100.40,20574200,100.40
    +2007-05-02,99.65,100.54,99.47,100.39,18040900,100.39
    +2007-05-01,99.59,100.35,98.55,99.47,19018700,99.47
    +2007-04-30,100.09,101.00,99.67,99.80,22018200,99.80
    +2007-04-27,98.18,99.95,97.69,99.92,24978700,99.92
    +2007-04-26,101.58,102.50,98.30,98.84,62063500,98.84
    +2007-04-25,94.23,95.40,93.80,95.35,42398000,95.35
    +2007-04-24,93.96,96.39,91.30,93.24,37687600,93.24
    +2007-04-23,91.59,93.80,91.42,93.51,27867500,93.51
    +2007-04-20,90.89,91.18,90.55,90.97,18670700,90.97
    +2007-04-19,90.19,91.25,89.83,90.27,15211200,90.27
    +2007-04-18,90.16,90.85,89.60,90.40,16573000,90.40
    +2007-04-17,92.00,92.30,89.70,90.35,26854300,90.35
    +2007-04-16,90.57,91.50,90.25,91.43,21751200,91.43
    +2007-04-13,90.90,91.40,90.06,90.24,25712200,90.24
    +2007-04-12,92.04,92.31,90.72,92.19,23452700,92.19
    +2007-04-11,93.90,93.95,92.33,92.59,19607800,92.59
    +2007-04-10,93.67,94.26,93.41,94.25,12588100,94.25
    +2007-04-09,95.21,95.30,93.04,93.65,14762200,93.65
    +2007-04-05,94.12,94.68,93.52,94.68,12697000,94.68
    +2007-04-04,94.94,95.14,94.13,94.27,17028000,94.27
    +2007-04-03,94.14,95.23,93.76,94.50,20854800,94.50
    +2007-04-02,94.14,94.25,93.02,93.65,17928300,93.65
    +2007-03-30,94.28,94.68,92.75,92.91,21448500,92.91
    +2007-03-29,94.19,94.19,92.23,93.75,25918700,93.75
    +2007-03-28,94.88,95.40,93.15,93.24,33654900,93.24
    +2007-03-27,95.71,96.83,95.00,95.46,33287600,95.46
    +2007-03-26,93.99,95.90,93.30,95.85,30892400,95.85
    +2007-03-23,93.35,94.07,93.30,93.52,16103000,93.52
    +2007-03-22,93.73,94.36,93.00,93.96,20053300,93.96
    +2007-03-21,91.99,94.00,91.65,93.87,24532000,93.87
    +2007-03-20,91.35,91.84,91.06,91.48,17461300,91.48
    +2007-03-19,90.24,91.55,89.59,91.13,25462900,91.13
    +2007-03-16,89.54,89.99,89.32,89.59,20418000,89.59
    +2007-03-15,89.96,90.36,89.31,89.57,19982100,89.57
    +2007-03-14,88.60,90.00,87.92,90.00,28449500,90.00
    +2007-03-13,89.41,90.60,88.40,88.40,30996100,88.40
    +2007-03-12,88.07,89.99,87.99,89.87,26050300,89.87
    +2007-03-09,88.80,88.85,87.40,87.97,16137000,87.97
    +2007-03-08,88.59,88.72,87.46,88.00,18250400,88.00
    +2007-03-07,88.05,88.97,87.45,87.72,22367300,87.72
    +2007-03-06,87.80,88.31,87.40,88.19,25828100,88.19
    +2007-03-05,85.89,88.65,85.76,86.32,29960700,86.32
    +2007-03-02,86.77,87.54,85.21,85.41,30714300,85.41
    +2007-03-01,84.03,88.31,83.75,87.06,50554600,87.06
    +2007-02-28,83.00,85.60,83.00,84.61,32838400,84.61
    +2007-02-27,86.30,87.08,83.41,83.93,40921900,83.93
    +2007-02-26,89.84,90.00,87.61,88.51,21994600,88.51
    +2007-02-23,89.16,90.34,88.85,89.07,18496200,89.07
    +2007-02-22,90.80,90.81,88.53,89.51,29936600,89.51
    +2007-02-21,85.98,89.49,85.96,89.20,41261200,89.20
    +2007-02-20,84.65,86.16,84.16,85.90,22060800,85.90
    +2007-02-16,85.25,85.41,84.66,84.83,14281000,84.83
    +2007-02-15,85.44,85.62,84.78,85.21,12987900,85.21
    +2007-02-14,84.63,85.64,84.57,85.30,18142200,85.30
    +2007-02-13,85.16,85.29,84.30,84.70,20749500,84.70
    +2007-02-12,84.43,85.18,83.63,84.88,25859700,84.88
    +2007-02-09,85.88,86.20,83.21,83.27,30733600,83.27
    +2007-02-08,85.43,86.51,85.41,86.18,24251100,86.18
    +2007-02-07,84.48,86.38,83.55,86.15,38100900,86.15
    +2007-02-06,84.45,84.47,82.86,84.15,30871200,84.15
    +2007-02-05,84.30,85.23,83.94,83.94,20673300,83.94
    +2007-02-02,84.12,85.25,83.70,84.75,22197500,84.75
    +2007-02-01,86.23,86.27,84.74,84.74,23726500,84.74
    +2007-01-31,84.86,86.00,84.35,85.73,30573900,85.73
    +2007-01-30,86.43,86.49,85.25,85.55,20641800,85.55
    +2007-01-29,86.30,86.65,85.53,85.94,32202300,85.94
    +2007-01-26,87.11,87.37,84.99,85.38,35245500,85.38
    +2007-01-25,87.11,88.50,86.03,86.25,32356200,86.25
    +2007-01-24,86.68,87.15,86.08,86.70,33136200,86.70
    +2007-01-23,85.73,87.51,85.51,85.70,43122300,85.70
    +2007-01-22,89.14,89.16,85.65,86.79,51929500,86.79
    +2007-01-19,88.63,89.65,88.12,88.50,48731200,88.50
    +2007-01-18,92.10,92.11,89.05,89.07,84450200,89.07
    +2007-01-17,97.56,97.60,94.82,94.95,58795000,94.95
    +2007-01-16,95.68,97.25,95.45,97.10,44431300,97.10
    +2007-01-12,94.59,95.06,93.23,94.62,46881800,94.62
    +2007-01-11,95.94,96.78,95.10,95.80,51437600,95.80
    +2007-01-10,94.75,97.80,93.45,97.00,105460000,97.00
    +2007-01-09,86.45,92.98,85.15,92.57,119617800,92.57
    +2007-01-08,85.96,86.53,85.28,85.47,28468100,85.47
    +2007-01-05,85.77,86.20,84.40,85.05,29812200,85.05
    +2007-01-04,84.05,85.95,83.82,85.66,30259300,85.66
    +2007-01-03,86.29,86.58,81.90,83.80,44225700,83.80
    +2006-12-29,83.95,85.40,83.36,84.84,38443900,84.84
    +2006-12-28,80.22,81.25,79.65,80.87,39995600,80.87
    +2006-12-27,78.15,82.00,76.77,81.52,69134100,81.52
    +2006-12-26,82.15,82.57,80.89,81.51,17524600,81.51
    +2006-12-22,83.46,84.04,81.60,82.20,21903700,82.20
    +2006-12-21,84.70,85.48,82.20,82.90,32271400,82.90
    +2006-12-20,86.47,86.67,84.74,84.76,20274700,84.76
    +2006-12-19,84.73,86.68,83.62,86.31,32550200,86.31
    +2006-12-18,87.63,88.00,84.59,85.47,25770600,85.47
    +2006-12-15,89.02,89.22,87.33,87.72,26426400,87.72
    +2006-12-14,89.05,90.00,88.26,88.55,29726100,88.55
    +2006-12-13,87.95,89.07,87.15,89.05,30609000,89.05
    +2006-12-12,88.61,88.84,85.53,86.14,36665000,86.14
    +2006-12-11,88.90,89.30,88.05,88.75,17849300,88.75
    +2006-12-08,87.23,89.39,87.00,88.26,28009900,88.26
    +2006-12-07,90.03,90.50,86.90,87.04,35886700,87.04
    +2006-12-06,90.64,91.39,89.67,89.83,22792300,89.83
    +2006-12-05,91.65,92.33,90.87,91.27,23672800,91.27
    +2006-12-04,91.88,92.05,90.50,91.12,25340600,91.12
    +2006-12-01,91.80,92.33,90.10,91.32,28395700,91.32
    +2006-11-30,92.21,92.68,91.06,91.66,31088800,91.66
    +2006-11-29,93.00,93.15,90.25,91.80,41324400,91.80
    +2006-11-28,90.36,91.97,89.91,91.81,37006200,91.81
    +2006-11-27,92.51,93.16,89.50,89.54,38387000,89.54
    +2006-11-24,89.53,93.08,89.50,91.63,18524200,91.63
    +2006-11-22,88.99,90.75,87.85,90.31,23997900,90.31
    +2006-11-21,87.42,88.60,87.11,88.60,22238100,88.60
    +2006-11-20,85.40,87.00,85.20,86.47,20385500,86.47
    +2006-11-17,85.14,85.94,85.00,85.85,16658000,85.85
    +2006-11-16,84.87,86.30,84.62,85.61,24783600,85.61
    +2006-11-15,85.05,85.90,84.00,84.05,23404400,84.05
    +2006-11-14,84.80,85.00,83.90,85.00,21034100,85.00
    +2006-11-13,83.22,84.45,82.64,84.35,16095500,84.35
    +2006-11-10,83.55,83.60,82.50,83.12,13352300,83.12
    +2006-11-09,82.90,84.69,82.12,83.34,32966200,83.34
    +2006-11-08,80.02,82.69,79.89,82.45,24675600,82.45
    +2006-11-07,80.45,81.00,80.13,80.51,18783300,80.51
    +2006-11-06,78.95,80.06,78.43,79.71,15520600,79.71
    +2006-11-03,79.36,79.53,77.79,78.29,15424600,78.29
    +2006-11-02,78.92,79.32,78.50,78.98,16624400,78.98
    +2006-11-01,81.10,81.38,78.36,79.16,21828300,79.16
    +2006-10-31,81.45,81.68,80.23,81.08,17909800,81.08
    +2006-10-30,79.99,80.90,79.50,80.42,17854200,80.42
    +2006-10-27,81.75,82.45,80.01,80.41,21248800,80.41
    +2006-10-26,81.90,82.60,81.13,82.19,15455600,82.19
    +2006-10-25,81.35,82.00,81.01,81.68,17329100,81.68
    +2006-10-24,81.21,81.68,80.20,81.05,16543300,81.05
    +2006-10-23,79.99,81.90,79.75,81.46,29732400,81.46
    +2006-10-20,78.97,79.99,78.67,79.95,22836200,79.95
    +2006-10-19,79.26,79.95,78.16,78.99,54034900,78.99
    +2006-10-18,74.75,75.37,73.91,74.53,40496700,74.53
    +2006-10-17,75.04,75.27,74.04,74.29,17175900,74.29
    +2006-10-16,75.19,75.88,74.79,75.40,18167600,75.40
    +2006-10-13,75.63,76.88,74.74,75.02,24435600,75.02
    +2006-10-12,73.61,75.39,73.60,75.26,21173400,75.26
    +2006-10-11,73.42,73.98,72.60,73.23,20423400,73.23
    +2006-10-10,74.54,74.58,73.08,73.81,18985300,73.81
    +2006-10-09,73.80,75.08,73.53,74.63,15650800,74.63
    +2006-10-06,74.42,75.04,73.81,74.22,16677100,74.22
    +2006-10-05,74.53,76.16,74.13,74.83,24424400,74.83
    +2006-10-04,74.10,75.46,73.16,75.38,29610100,75.38
    +2006-10-03,74.45,74.95,73.19,74.08,28239600,74.08
    +2006-10-02,75.10,75.87,74.30,74.86,25451400,74.86
    +2006-09-29,77.11,77.52,76.68,76.98,14493300,76.98
    +2006-09-28,77.02,77.48,75.95,77.01,25843200,77.01
    +2006-09-27,77.17,77.47,75.82,76.41,28941900,76.41
    +2006-09-26,76.18,77.78,76.10,77.61,39391000,77.61
    +2006-09-25,73.81,75.86,73.72,75.75,30678300,75.75
    +2006-09-22,74.30,74.34,72.58,73.00,23754000,73.00
    +2006-09-21,75.25,76.06,74.02,74.65,28361600,74.65
    +2006-09-20,74.38,75.68,74.22,75.26,29385400,75.26
    +2006-09-19,74.10,74.36,72.80,73.77,25358900,73.77
    +2006-09-18,73.80,74.86,73.30,73.89,25188500,73.89
    +2006-09-15,74.60,74.98,73.29,74.10,35066200,74.10
    +2006-09-14,73.72,74.67,73.46,74.17,28633200,74.17
    +2006-09-13,72.85,74.32,72.30,74.20,40933500,74.20
    +2006-09-12,72.81,73.45,71.45,72.63,60167400,72.63
    +2006-09-11,72.43,73.73,71.42,72.50,33897300,72.50
    +2006-09-08,73.37,73.57,71.91,72.52,31997200,72.52
    +2006-09-07,70.60,73.48,70.25,72.80,45284200,72.80
    +2006-09-06,71.08,71.69,69.70,70.03,34789400,70.03
    +2006-09-05,68.97,71.50,68.55,71.48,36159200,71.48
    +2006-09-01,68.48,68.65,67.82,68.38,14589100,68.38
    +2006-08-31,67.28,68.30,66.66,67.85,20524900,67.85
    +2006-08-30,67.34,67.82,66.68,66.96,24290800,66.96
    +2006-08-29,66.99,67.26,65.12,66.48,33833300,66.48
    +2006-08-28,68.50,68.61,66.68,66.98,26362900,66.98
    +2006-08-25,67.34,69.05,67.31,68.75,19427100,68.75
    +2006-08-24,67.89,68.19,66.27,67.81,23399700,67.81
    +2006-08-23,68.00,68.65,66.94,67.31,19152100,67.31
    +2006-08-22,66.68,68.32,66.50,67.62,20606000,67.62
    +2006-08-21,67.30,67.31,66.15,66.56,18793800,66.56
    +2006-08-18,67.71,68.40,67.26,67.91,19155500,67.91
    +2006-08-17,68.00,68.66,67.18,67.59,20755300,67.59
    +2006-08-16,67.10,68.07,66.33,67.98,27903000,67.98
    +2006-08-15,65.34,66.50,64.80,66.45,30762600,66.45
    +2006-08-14,64.05,65.22,63.60,63.94,25629300,63.94
    +2006-08-11,63.23,64.13,62.58,63.65,27768900,63.65
    +2006-08-10,63.25,64.81,62.70,64.07,24920000,64.07
    +2006-08-09,65.43,65.60,63.40,63.59,34137100,63.59
    +2006-08-08,67.09,67.11,64.51,64.78,35638000,64.78
    +2006-08-07,67.72,69.60,66.31,67.21,44482600,67.21
    +2006-08-04,67.05,68.61,64.96,68.30,66173800,68.30
    +2006-08-03,67.91,70.00,67.81,69.59,30037300,69.59
    +2006-08-02,67.65,68.68,67.51,68.16,19670300,68.16
    +2006-08-01,67.22,67.93,65.94,67.18,25420200,67.18
    +2006-07-31,66.83,68.63,66.28,67.96,31887200,67.96
    +2006-07-28,63.94,65.68,63.50,65.59,24696700,65.59
    +2006-07-27,64.50,65.02,62.86,63.40,26251600,63.40
    +2006-07-26,62.00,64.64,61.68,63.87,32086700,63.87
    +2006-07-25,61.78,62.09,60.78,61.93,21038200,61.93
    +2006-07-24,61.26,62.10,60.43,61.42,25816300,61.42
    +2006-07-21,59.82,61.15,59.64,60.72,31853300,60.72
    +2006-07-20,60.96,61.59,59.72,60.50,70433800,60.50
    +2006-07-19,52.96,55.08,52.36,54.10,49669400,54.10
    +2006-07-18,53.16,53.85,51.85,52.90,35730300,52.90
    +2006-07-17,51.73,53.11,51.65,52.37,36590800,52.37
    +2006-07-14,52.50,52.89,50.16,50.67,35465600,50.67
    +2006-07-13,52.03,54.12,51.41,52.25,44639500,52.25
    +2006-07-12,55.17,55.24,52.92,52.96,33118900,52.96
    +2006-07-11,55.11,55.99,54.53,55.65,29465100,55.65
    +2006-07-10,55.70,56.49,54.50,55.00,18905200,55.00
    +2006-07-07,55.48,56.55,54.67,55.40,28548600,55.40
    +2006-07-06,57.09,57.40,55.61,55.77,22614600,55.77
    +2006-07-05,57.15,57.60,56.56,57.00,18508600,57.00
    +2006-07-03,57.52,58.18,57.34,57.95,6956100,57.95
    +2006-06-30,57.59,57.75,56.50,57.27,26417700,57.27
    +2006-06-29,56.76,59.09,56.39,58.97,31192800,58.97
    +2006-06-28,57.29,57.30,55.41,56.02,30382300,56.02
    +2006-06-27,59.09,59.22,57.40,57.43,19664700,57.43
    +2006-06-26,59.17,59.20,58.37,58.99,16662000,58.99
    +2006-06-23,59.72,60.17,58.73,58.83,23578700,58.83
    +2006-06-22,58.20,59.75,58.07,59.58,34486900,59.58
    +2006-06-21,57.74,58.71,57.30,57.86,30832000,57.86
    +2006-06-20,57.61,58.35,57.29,57.47,24034800,57.47
    +2006-06-19,57.83,58.18,57.00,57.20,25163400,57.20
    +2006-06-16,58.96,59.19,57.52,57.56,29932200,57.56
    +2006-06-15,57.30,59.74,56.75,59.38,42513700,59.38
    +2006-06-14,58.28,58.78,56.69,57.61,31362000,57.61
    +2006-06-13,57.61,59.10,57.36,58.33,38594400,58.33
    +2006-06-12,59.40,59.73,56.96,57.00,25635200,57.00
    +2006-06-09,61.18,61.56,59.10,59.24,27708500,59.24
    +2006-06-08,58.44,60.93,57.15,60.76,49910100,60.76
    +2006-06-07,60.10,60.40,58.35,58.56,26803800,58.56
    +2006-06-06,60.22,60.63,58.91,59.72,25929900,59.72
    +2006-06-05,61.15,61.15,59.97,60.00,21635200,60.00
    +2006-06-02,62.99,63.10,60.88,61.66,24492400,61.66
    +2006-06-01,59.85,62.28,59.52,62.17,33661000,62.17
    +2006-05-31,61.76,61.79,58.69,59.77,45749200,59.77
    +2006-05-30,63.29,63.30,61.22,61.22,20121500,61.22
    +2006-05-26,64.31,64.56,63.14,63.55,15462500,63.55
    +2006-05-25,64.26,64.45,63.29,64.33,16549000,64.33
    +2006-05-24,62.99,63.65,61.56,63.34,32715400,63.34
    +2006-05-23,64.86,65.19,63.00,63.15,24800500,63.15
    +2006-05-22,63.87,63.99,62.77,63.38,25677700,63.38
    +2006-05-19,63.26,64.88,62.82,64.51,35209500,64.51
    +2006-05-18,65.68,66.26,63.12,63.18,23515800,63.18
    +2006-05-17,64.71,65.70,64.07,65.26,26935500,65.26
    +2006-05-16,68.10,68.25,64.75,64.98,33455000,64.98
    +2006-05-15,67.37,68.38,67.12,67.79,18899200,67.79
    +2006-05-12,67.85,68.69,66.86,67.70,22920500,67.70
    +2006-05-11,70.79,70.84,67.55,68.15,29024600,68.15
    +2006-05-10,71.29,71.33,69.61,70.60,16424600,70.60
    +2006-05-09,71.82,72.56,70.62,71.03,18988100,71.03
    +2006-05-08,72.99,73.80,71.72,71.89,21244700,71.89
    +2006-05-05,71.86,72.25,71.15,71.89,20139700,71.89
    +2006-05-04,71.22,72.89,70.46,71.13,30729300,71.13
    +2006-05-03,71.83,71.95,70.18,71.14,24535400,71.14
    +2006-05-02,70.15,71.98,70.11,71.62,27559400,71.62
    +2006-05-01,70.77,71.54,69.16,69.60,26799300,69.60
    +2006-04-28,69.38,71.30,69.20,70.39,27144200,70.39
    +2006-04-27,67.73,69.86,67.35,69.36,30212400,69.36
    +2006-04-26,66.65,68.28,66.40,68.15,25388800,68.15
    +2006-04-25,65.96,66.59,65.56,66.17,18895100,66.17
    +2006-04-24,66.85,66.92,65.50,65.75,25251000,65.75
    +2006-04-21,68.19,68.64,66.47,67.04,28178100,67.04
    +2006-04-20,69.51,70.00,66.20,67.63,59535100,67.63
    +2006-04-19,66.82,67.00,65.47,65.65,38786900,65.65
    +2006-04-18,65.04,66.47,64.79,66.22,28387300,66.22
    +2006-04-17,66.51,66.84,64.35,64.81,25783500,64.81
    +2006-04-13,66.34,67.44,65.81,66.47,26238500,66.47
    +2006-04-12,68.01,68.17,66.30,66.71,26424800,66.71
    +2006-04-11,68.99,69.30,67.07,67.99,33547000,67.99
    +2006-04-10,70.29,70.93,68.45,68.67,32268400,68.67
    +2006-04-07,70.93,71.21,68.47,69.79,55187100,69.79
    +2006-04-06,68.30,72.05,68.20,71.24,95134600,71.24
    +2006-04-05,64.71,67.21,64.15,67.21,79764600,67.21
    +2006-04-04,62.10,62.22,61.05,61.17,33283000,61.17
    +2006-04-03,63.67,64.12,62.61,62.65,29135400,62.65
    +2006-03-31,63.25,63.61,62.24,62.72,29119900,62.72
    +2006-03-30,62.82,63.30,61.53,62.75,49666100,62.75
    +2006-03-29,59.13,62.52,57.67,62.33,83815500,62.33
    +2006-03-28,59.63,60.14,58.25,58.71,48940100,58.71
    +2006-03-27,60.35,61.38,59.40,59.51,39574000,59.51
    +2006-03-24,60.25,60.94,59.03,59.96,38285000,59.96
    +2006-03-23,61.82,61.90,59.61,60.16,50993800,60.16
    +2006-03-22,62.16,63.25,61.27,61.67,48067700,61.67
    +2006-03-21,64.29,64.34,61.39,61.81,47991700,61.81
    +2006-03-20,65.22,65.46,63.87,63.99,21622900,63.99
    +2006-03-17,64.75,65.54,64.11,64.66,29001500,64.66
    +2006-03-16,66.85,66.90,64.30,64.31,26772800,64.31
    +2006-03-15,67.71,68.04,65.52,66.23,31857000,66.23
    +2006-03-14,65.77,67.32,65.50,67.32,22929300,67.32
    +2006-03-13,65.05,66.28,64.79,65.68,30756700,65.68
    +2006-03-10,64.05,64.49,62.45,63.19,37255100,63.19
    +2006-03-09,65.98,66.47,63.81,63.93,28546600,63.93
    +2006-03-08,66.29,67.20,65.35,65.66,23330400,65.66
    +2006-03-07,65.76,66.90,65.08,66.31,31174200,66.31
    +2006-03-06,67.69,67.72,64.94,65.48,32595200,65.48
    +2006-03-03,69.40,69.91,67.53,67.72,26345300,67.72
    +2006-03-02,68.99,69.99,68.67,69.61,22331200,69.61
    +2006-03-01,68.84,69.49,68.02,69.10,27279200,69.10
    +2006-02-28,71.58,72.40,68.10,68.49,45249300,68.49
    +2006-02-27,71.99,72.12,70.65,70.99,28258600,70.99
    +2006-02-24,72.14,72.89,71.20,71.46,19098000,71.46
    +2006-02-23,71.79,73.00,71.43,71.75,30604200,71.75
    +2006-02-22,69.00,71.67,68.00,71.32,34937100,71.32
    +2006-02-21,70.59,70.80,68.68,69.08,27843100,69.08
    +2006-02-17,70.30,70.89,69.61,70.29,20571400,70.29
    +2006-02-16,69.91,71.01,69.48,70.57,33863400,70.57
    +2006-02-15,67.16,69.62,66.75,69.22,41420400,69.22
    +2006-02-14,65.10,68.10,65.00,67.64,41462100,67.64
    +2006-02-13,66.63,66.75,64.64,64.71,31553500,64.71
    +2006-02-10,65.18,67.67,62.90,67.31,62874200,67.31
    +2006-02-09,69.10,69.23,64.53,64.95,41063000,64.95
    +2006-02-08,68.49,69.08,66.00,68.81,34039800,68.81
    +2006-02-07,68.27,69.48,66.68,67.60,49601100,67.60
    +2006-02-06,72.02,72.51,66.74,67.30,58991700,67.30
    +2006-02-03,72.24,72.79,71.04,71.85,24718700,71.85
    +2006-02-02,75.10,75.36,72.05,72.10,25261500,72.10
    +2006-02-01,74.95,76.46,74.64,75.42,18613800,75.42
    +2006-01-31,75.50,76.34,73.75,75.51,32626500,75.51
    +2006-01-30,71.17,76.60,70.87,75.00,49942900,75.00
    +2006-01-27,72.95,73.60,71.10,72.03,34066600,72.03
    +2006-01-26,74.53,75.43,71.93,72.33,42192400,72.33
    +2006-01-25,77.39,77.50,73.25,74.20,45563800,74.20
    +2006-01-24,78.76,79.42,75.77,76.04,40794800,76.04
    +2006-01-23,76.10,79.56,76.00,77.67,37847500,77.67
    +2006-01-20,79.28,80.04,75.83,76.09,40527100,76.09
    +2006-01-19,81.25,81.66,78.74,79.04,60566000,79.04
    +2006-01-18,83.08,84.05,81.85,82.49,42879900,82.49
    +2006-01-17,85.70,86.38,83.87,84.71,29843700,84.71
    +2006-01-13,84.99,86.01,84.60,85.59,27725200,85.59
    +2006-01-12,84.97,86.40,83.62,84.29,45743200,84.29
    +2006-01-11,83.84,84.80,82.59,83.90,53349800,83.90
    +2006-01-10,76.25,81.89,75.83,80.86,81423900,80.86
    +2006-01-09,76.73,77.20,75.74,76.05,24108600,76.05
    +2006-01-06,75.25,76.70,74.55,76.30,25159200,76.30
    +2006-01-05,74.83,74.90,73.75,74.38,16050800,74.38
    +2006-01-04,75.13,75.98,74.50,74.97,22128700,74.97
    +2006-01-03,72.38,74.75,72.25,74.75,28829800,74.75
    +2005-12-30,70.91,72.43,70.34,71.89,22295100,71.89
    +2005-12-29,73.78,73.82,71.42,71.45,17500900,71.45
    +2005-12-28,74.47,74.76,73.32,73.57,14218400,73.57
    +2005-12-27,74.00,75.18,73.95,74.23,21092500,74.23
    +2005-12-23,74.17,74.26,73.30,73.35,8209200,73.35
    +2005-12-22,73.91,74.49,73.60,74.02,13236100,74.02
    +2005-12-21,72.60,73.61,72.54,73.50,16990600,73.50
    +2005-12-20,71.63,72.38,71.12,72.11,17111000,72.11
    +2005-12-19,71.11,72.60,71.04,71.38,18903400,71.38
    +2005-12-16,72.14,72.30,71.06,71.11,23970400,71.11
    +2005-12-15,72.68,72.86,71.35,72.18,20041500,72.18
    +2005-12-14,72.53,73.30,70.27,72.01,51811300,72.01
    +2005-12-13,74.85,75.46,74.21,74.98,17636300,74.98
    +2005-12-12,74.87,75.35,74.56,74.91,18749800,74.91
    +2005-12-09,74.21,74.59,73.35,74.33,19835800,74.33
    +2005-12-08,73.20,74.17,72.60,74.08,28231500,74.08
    +2005-12-07,74.23,74.46,73.12,73.95,24266600,73.95
    +2005-12-06,73.93,74.83,73.35,74.05,30608200,74.05
    +2005-12-05,71.95,72.53,71.49,71.82,20845400,71.82
    +2005-12-02,72.27,72.74,70.70,72.63,31991500,72.63
    +2005-12-01,68.95,71.73,68.81,71.60,29031900,71.60
    +2005-11-30,68.43,68.85,67.52,67.82,21274100,67.82
    +2005-11-29,69.99,70.30,67.35,68.10,31836900,68.10
    +2005-11-28,70.72,71.07,69.07,69.66,36375700,69.66
    +2005-11-25,67.66,69.54,67.50,69.34,14107600,69.34
    +2005-11-23,66.88,67.98,66.69,67.11,17351900,67.11
    +2005-11-22,64.84,66.76,64.52,66.52,19295800,66.52
    +2005-11-21,64.82,65.19,63.72,64.96,18275400,64.96
    +2005-11-18,65.31,65.43,64.37,64.56,18748700,64.56
    +2005-11-17,65.59,65.88,64.25,64.52,24150200,64.52
    +2005-11-16,63.15,65.06,63.09,64.95,28018400,64.95
    +2005-11-15,61.60,63.08,61.46,62.28,19172900,62.28
    +2005-11-14,61.54,61.98,60.91,61.45,13211900,61.45
    +2005-11-11,61.54,62.11,61.34,61.54,15194600,61.54
    +2005-11-10,60.64,61.20,59.01,61.18,23762300,61.18
    +2005-11-09,60.00,61.21,60.00,60.11,19747500,60.11
    +2005-11-08,59.95,60.38,59.10,59.90,16920200,59.90
    +2005-11-07,60.85,61.67,60.14,60.23,22815400,60.23
    +2005-11-04,60.35,61.24,59.62,61.15,31358400,61.15
    +2005-11-03,60.26,62.32,60.07,61.85,31585100,61.85
    +2005-11-02,57.72,60.00,57.60,59.95,30609300,59.95
    +2005-11-01,57.24,58.14,56.87,57.50,26774500,57.50
    +2005-10-31,55.20,57.98,54.75,57.59,33601600,57.59
    +2005-10-28,56.04,56.43,54.17,54.47,27492400,54.47
    +2005-10-27,56.99,57.01,55.41,55.41,14697900,55.41
    +2005-10-26,56.28,57.56,55.92,57.03,22556900,57.03
    +2005-10-25,56.40,56.85,55.69,56.10,16611700,56.10
    +2005-10-24,55.25,56.79,55.09,56.79,21776900,56.79
    +2005-10-21,56.84,56.98,55.36,55.66,28454500,55.66
    +2005-10-20,54.47,56.50,54.35,56.14,48491500,56.14
    +2005-10-19,52.07,54.96,51.21,54.94,36024400,54.94
    +2005-10-18,53.25,53.95,52.20,52.21,21771000,52.21
    +2005-10-17,53.98,54.23,52.68,53.44,22029800,53.44
    +2005-10-14,54.03,54.35,52.79,54.00,36984000,54.00
    +2005-10-13,49.44,53.95,49.27,53.74,66627700,53.74
    +2005-10-12,48.65,50.30,47.87,49.25,96338800,49.25
    +2005-10-11,51.23,51.87,50.40,51.59,43781600,51.59
    +2005-10-10,51.76,51.91,50.28,50.37,18125200,50.37
    +2005-10-07,51.72,51.93,50.55,51.30,24210100,51.30
    +2005-10-06,53.20,53.49,50.87,51.70,27054900,51.70
    +2005-10-05,54.33,54.36,52.75,52.78,21813200,52.78
    +2005-10-04,54.95,55.35,53.64,53.75,19266400,53.75
    +2005-10-03,54.16,54.54,53.68,54.44,18126900,54.44
    +2005-09-30,52.33,53.65,51.88,53.61,18986900,53.61
    +2005-09-29,51.23,52.59,50.81,52.34,22744500,52.34
    +2005-09-28,53.07,53.11,50.59,51.08,40198000,51.08
    +2005-09-27,53.92,54.24,53.43,53.44,12203700,53.44
    +2005-09-26,54.03,54.56,53.32,53.84,19520100,53.84
    +2005-09-23,52.10,53.50,51.84,53.20,19944900,53.20
    +2005-09-22,51.88,52.47,51.32,51.90,16561700,51.90
    +2005-09-21,52.96,53.05,51.86,52.11,15526700,52.11
    +2005-09-20,52.99,53.81,52.92,53.19,29279600,53.19
    +2005-09-19,51.05,52.89,51.05,52.64,27990400,52.64
    +2005-09-16,50.23,51.21,49.95,51.21,21107300,51.21
    +2005-09-15,50.00,50.18,49.33,49.87,14827000,49.87
    +2005-09-14,51.06,51.19,49.46,49.61,16943800,49.61
    +2005-09-13,51.02,51.29,50.32,50.82,17603000,50.82
    +2005-09-12,51.10,51.63,50.58,51.40,16171300,51.40
    +2005-09-09,50.07,51.35,49.79,51.31,21987200,51.31
    +2005-09-08,49.35,50.12,49.14,49.78,25094300,49.78
    +2005-09-07,49.05,49.40,47.92,48.68,34395500,48.68
    +2005-09-06,46.70,48.88,46.55,48.80,29236400,48.80
    +2005-09-02,46.30,46.80,46.12,46.22,7942100,46.22
    +2005-09-01,47.00,47.17,46.09,46.26,12727400,46.26
    +2005-08-31,46.86,47.03,46.27,46.89,14391300,46.89
    +2005-08-30,45.99,46.79,45.92,46.57,18527200,46.57
    +2005-08-29,45.27,46.03,45.26,45.84,9153400,45.84
    +2005-08-26,46.12,46.34,45.36,45.74,9323500,45.74
    +2005-08-25,46.12,46.49,45.81,46.06,9866200,46.06
    +2005-08-24,45.60,47.12,45.59,45.77,20431100,45.77
    +2005-08-23,45.85,46.10,45.32,45.74,10557300,45.74
    +2005-08-22,46.15,46.75,45.26,45.87,13847600,45.87
    +2005-08-19,46.28,46.70,45.77,45.83,13448900,45.83
    +2005-08-18,46.91,47.00,45.75,46.30,15805700,46.30
    +2005-08-17,46.40,47.44,46.37,47.15,17847300,47.15
    +2005-08-16,47.39,47.50,46.21,46.25,19200800,46.25
    +2005-08-15,46.48,48.33,46.45,47.68,38811700,47.68
    +2005-08-12,43.46,46.22,43.36,46.10,32715600,46.10
    +2005-08-11,43.39,44.12,43.25,44.00,9713700,44.00
    +2005-08-10,44.00,44.39,43.31,43.38,12890900,43.38
    +2005-08-09,42.93,43.89,42.91,43.82,13601400,43.82
    +2005-08-08,43.00,43.25,42.61,42.65,6299400,42.65
    +2005-08-05,42.49,43.36,42.02,42.99,8640400,42.99
    +2005-08-04,42.89,43.00,42.29,42.71,9618000,42.71
    +2005-08-03,43.19,43.31,42.77,43.22,9225800,43.22
    +2005-08-02,42.89,43.50,42.61,43.19,10602700,43.19
    +2005-08-01,42.57,43.08,42.08,42.75,11223200,42.75
    +2005-07-29,43.56,44.38,42.26,42.65,20074300,42.65
    +2005-07-28,43.85,44.00,43.30,43.80,8975400,43.80
    +2005-07-27,43.83,44.07,42.67,43.99,10133900,43.99
    +2005-07-26,44.01,44.11,43.36,43.63,9592600,43.63
    +2005-07-25,43.99,44.28,43.73,43.81,10522400,43.81
    +2005-07-22,43.44,44.00,43.39,44.00,10753800,44.00
    +2005-07-21,43.70,44.04,42.90,43.29,14438000,43.29
    +2005-07-20,42.86,43.80,42.65,43.63,16192700,43.63
    +2005-07-19,41.52,43.23,41.07,43.19,23966500,43.19
    +2005-07-18,41.41,42.10,41.37,41.49,20939200,41.49
    +2005-07-15,40.97,41.57,40.46,41.55,24560100,41.55
    +2005-07-14,40.79,42.01,40.23,40.75,74859300,40.75
    +2005-07-13,38.29,38.50,37.90,38.35,24458400,38.35
    +2005-07-12,38.23,38.40,37.91,38.24,13822800,38.24
    +2005-07-11,38.37,38.65,37.78,38.10,13885300,38.10
    +2005-07-08,37.87,38.28,37.47,38.25,10383400,38.25
    +2005-07-07,36.81,37.76,36.80,37.63,13704400,37.63
    +2005-07-06,37.71,38.16,37.20,37.39,14093800,37.39
    +2005-07-05,36.55,38.15,36.50,37.98,16223900,37.98
    +2005-07-01,36.83,36.97,36.29,36.50,8928600,36.50
    +2005-06-30,36.61,37.16,36.31,36.81,14942500,36.81
    +2005-06-29,37.23,37.29,36.12,36.37,16012800,36.37
    +2005-06-28,37.49,37.59,37.17,37.31,12510700,37.31
    +2005-06-27,36.84,38.10,36.68,37.10,21434700,37.10
    +2005-06-24,39.09,39.12,37.68,37.76,14668200,37.76
    +2005-06-23,38.83,39.78,38.65,38.89,24080500,38.89
    +2005-06-22,38.26,38.60,38.14,38.55,15175900,38.55
    +2005-06-21,37.72,38.19,37.38,37.86,13233100,37.86
    +2005-06-20,37.85,38.09,37.45,37.61,11561300,37.61
    +2005-06-17,38.47,38.54,37.83,38.31,21290200,38.31
    +2005-06-16,37.19,38.08,36.82,37.98,19559800,37.98
    +2005-06-15,36.87,37.30,36.30,37.13,20119400,37.13
    +2005-06-14,35.92,36.15,35.75,36.00,12423100,36.00
    +2005-06-13,35.89,36.61,35.82,35.90,15563300,35.90
    +2005-06-10,37.40,37.40,35.52,35.81,24247600,35.81
    +2005-06-09,37.00,37.94,36.82,37.65,13937700,37.65
    +2005-06-08,36.63,37.25,36.57,36.92,14428800,36.92
    +2005-06-07,37.60,37.73,36.45,36.54,26616600,36.54
    +2005-06-06,38.33,38.63,37.56,37.92,28998800,37.92
    +2005-06-03,38.16,38.58,37.77,38.24,34173900,38.24
    +2005-06-02,40.05,40.32,39.60,40.04,13356200,40.04
    +2005-06-01,39.89,40.76,39.86,40.30,16207600,40.30
    +2005-05-31,40.66,40.74,39.58,39.76,14435900,39.76
    +2005-05-27,40.64,40.79,40.01,40.56,11286000,40.56
    +2005-05-26,39.94,40.94,39.94,40.74,18768600,40.74
    +2005-05-25,39.50,39.95,39.32,39.78,14143100,39.78
    +2005-05-24,39.45,39.99,39.03,39.70,21195000,39.70
    +2005-05-23,37.85,39.90,37.85,39.76,37234800,39.76
    +2005-05-20,37.25,37.65,37.19,37.55,16166100,37.55
    +2005-05-19,35.78,37.68,35.78,37.55,28327200,37.55
    +2005-05-18,35.45,37.56,34.99,35.84,22740100,35.84
    +2005-05-17,35.14,35.46,34.54,35.36,21012300,35.36
    +2005-05-16,34.56,35.70,34.53,35.55,16939100,35.55
    +2005-05-13,34.20,35.23,34.07,34.77,25096900,34.77
    +2005-05-12,35.42,35.59,34.00,34.13,34651500,34.13
    +2005-05-11,35.20,35.67,33.11,35.61,72927900,35.61
    +2005-05-10,36.75,37.25,36.33,36.42,15723700,36.42
    +2005-05-09,37.28,37.45,36.75,36.97,12703400,36.97
    +2005-05-06,36.89,37.33,36.79,37.24,11651700,37.24
    +2005-05-05,37.25,37.27,36.47,36.68,13834500,36.68
    +2005-05-04,36.11,37.20,36.10,37.15,16006300,37.15
    +2005-05-03,36.40,36.74,36.03,36.21,17740700,36.21
    +2005-05-02,36.21,36.65,36.02,36.43,16640000,36.43
    +2005-04-29,36.15,36.23,35.22,36.06,23986800,36.06
    +2005-04-28,36.29,36.34,35.24,35.54,20539500,35.54
    +2005-04-27,35.89,36.36,35.51,35.95,21924600,35.95
    +2005-04-26,36.78,37.51,36.12,36.19,28946700,36.19
    +2005-04-25,36.49,37.02,36.11,36.98,26659300,36.98
    +2005-04-22,36.84,37.00,34.90,35.50,29968900,35.50
    +2005-04-21,36.40,37.21,35.90,37.18,27128300,37.18
    +2005-04-20,37.66,37.74,35.44,35.51,33754700,35.51
    +2005-04-19,36.60,37.44,35.87,37.09,38630100,37.09
    +2005-04-18,35.00,36.30,34.00,35.62,47399200,35.62
    +2005-04-15,36.62,37.25,35.28,35.35,61717400,35.35
    +2005-04-14,38.81,39.56,36.84,37.26,98328300,37.26
    +2005-04-13,42.95,42.99,40.39,41.04,48998100,41.04
    +2005-04-12,42.49,43.19,42.01,42.66,35037900,42.66
    +2005-04-11,44.15,44.25,41.91,41.92,29345100,41.92
    +2005-04-08,43.70,44.45,43.54,43.74,23212500,43.74
    +2005-04-07,42.33,43.75,42.25,43.56,18106700,43.56
    +2005-04-06,42.40,42.81,42.15,42.33,14815200,42.33
    +2005-04-05,41.22,42.24,41.09,41.89,19865700,41.89
    +2005-04-04,40.99,41.31,40.16,41.09,20714800,41.09
    +2005-04-01,42.09,42.18,40.57,40.89,22903000,40.89
    +2005-03-31,42.45,42.52,41.59,41.67,22719100,41.67
    +2005-03-30,42.07,42.80,41.82,42.80,14105700,42.80
    +2005-03-29,42.56,42.83,41.50,41.75,16477000,41.75
    +2005-03-28,42.75,42.96,42.47,42.53,9836100,42.53
    +2005-03-24,42.91,43.00,42.50,42.50,12596600,42.50
    +2005-03-23,42.45,43.40,42.02,42.55,21779400,42.55
    +2005-03-22,43.71,43.96,42.68,42.83,19693400,42.83
    +2005-03-21,43.29,43.97,42.86,43.70,19326000,43.70
    +2005-03-18,43.33,43.44,42.50,42.96,33576800,42.96
    +2005-03-17,41.53,42.88,41.32,42.25,28640000,42.25
    +2005-03-16,41.21,42.31,40.78,41.18,24921900,41.18
    +2005-03-15,40.64,41.14,40.25,40.96,18164600,40.96
    +2005-03-14,40.52,40.79,39.52,40.32,21620900,40.32
    +2005-03-11,40.21,40.59,39.80,40.27,22601100,40.27
    +2005-03-10,39.53,40.26,39.10,39.83,27753900,39.83
    +2005-03-09,39.64,40.28,38.83,39.35,47230900,39.35
    +2005-03-08,41.90,42.16,40.10,40.53,36480400,40.53
    +2005-03-07,42.80,43.25,42.35,42.75,16094000,42.75
    +2005-03-04,42.76,43.01,41.85,42.81,27022100,42.81
    +2005-03-03,44.37,44.41,41.22,41.79,50416200,41.79
    +2005-03-02,44.25,44.89,44.08,44.12,16362900,44.12
    +2005-03-01,44.99,45.11,44.16,44.50,16721000,44.50
    +2005-02-28,44.68,45.14,43.96,44.86,23271800,44.86
    +2005-02-25,89.62,89.91,88.19,88.99,32696800,44.49
    +2005-02-24,88.48,89.31,87.73,88.93,54251000,44.47
    +2005-02-23,86.72,88.45,85.55,88.23,48042200,44.12
    +2005-02-22,86.30,88.30,85.29,85.29,43546200,42.65
    +2005-02-18,87.74,87.86,86.25,86.81,41544800,43.40
    +2005-02-17,90.65,90.88,87.45,87.81,54231200,43.90
    +2005-02-16,88.15,90.20,87.35,90.13,58544400,45.06
    +2005-02-15,86.66,89.08,86.00,88.41,82579200,44.21
    +2005-02-14,82.73,84.79,82.05,84.63,45409400,42.31
    +2005-02-11,79.86,81.76,78.94,81.21,42894800,40.60
    +2005-02-10,78.72,79.28,76.66,78.36,39036400,39.18
    +2005-02-09,81.04,81.99,78.10,78.74,42552000,39.37
    +2005-02-08,79.07,81.38,78.79,80.90,31786400,40.45
    +2005-02-07,78.93,79.35,77.50,78.94,18730600,39.47
    +2005-02-04,77.87,78.93,77.53,78.84,20127000,39.42
    +2005-02-03,79.10,79.43,77.33,77.81,26130400,38.90
    +2005-02-02,77.95,79.91,77.69,79.63,36430800,39.81
    +2005-02-01,77.05,77.77,76.58,77.53,24228400,38.76
    +2005-01-31,74.58,77.89,74.51,76.90,60039200,38.45
    +2005-01-28,72.62,73.98,72.44,73.98,28629000,36.99
    +2005-01-27,72.16,72.92,71.55,72.64,17722400,36.32
    +2005-01-26,72.66,72.75,71.22,72.25,26410600,36.12
    +2005-01-25,71.37,72.84,70.94,72.05,34615400,36.03
    +2005-01-24,70.98,71.78,70.55,70.76,30058200,35.38
    +2005-01-21,71.31,71.60,70.00,70.49,32547600,35.24
    +2005-01-20,69.65,71.27,69.47,70.46,32675800,35.23
    +2005-01-19,70.49,71.46,69.75,69.88,26853400,34.94
    +2005-01-18,69.85,70.70,67.75,70.65,35945000,35.33
    +2005-01-14,70.25,71.72,69.19,70.20,63240800,35.10
    +2005-01-13,73.71,74.42,69.73,69.80,113025600,34.90
    +2005-01-12,65.45,65.90,63.30,65.46,68560800,32.73
    +2005-01-11,68.25,69.15,64.14,64.56,93272400,32.28
    +2005-01-10,69.83,70.70,67.88,68.96,61618200,34.48
    +2005-01-07,65.00,69.63,64.75,69.25,79551800,34.62
    +2005-01-06,64.67,64.91,63.33,64.55,25198400,32.28
    +2005-01-05,64.46,65.25,64.05,64.50,24301200,32.25
    +2005-01-04,63.79,65.47,62.97,63.94,39171800,31.97
    +2005-01-03,64.78,65.11,62.60,63.29,24714000,31.65
    +2004-12-31,64.89,65.00,64.03,64.40,9949600,32.20
    +2004-12-30,64.81,65.03,64.22,64.80,12333600,32.40
    +2004-12-29,63.81,64.98,63.57,64.44,16055800,32.22
    +2004-12-28,63.30,64.25,62.05,64.18,21848400,32.09
    +2004-12-27,64.80,65.15,62.88,63.16,19981800,31.58
    +2004-12-23,63.75,64.25,63.60,64.01,8783200,32.01
    +2004-12-22,63.66,64.36,63.40,63.75,20208200,31.88
    +2004-12-21,63.56,63.77,61.60,63.69,38014800,31.84
    +2004-12-20,65.47,66.00,61.76,62.72,41718800,31.36
    +2004-12-17,66.84,67.04,64.90,64.99,27982000,32.49
    +2004-12-16,66.15,67.50,66.05,66.60,40218400,33.30
    +2004-12-15,65.24,65.46,64.66,65.26,14227200,32.63
    +2004-12-14,65.40,65.88,65.02,65.29,14847200,32.65
    +2004-12-13,65.62,65.90,64.60,64.91,14108600,32.46
    +2004-12-10,65.03,66.05,64.70,65.15,27706200,32.58
    +2004-12-09,62.81,64.40,62.07,63.99,26482200,32.00
    +2004-12-08,63.08,64.43,62.05,63.28,24710800,31.64
    +2004-12-07,65.93,66.73,62.56,62.89,37746400,31.44
    +2004-12-06,64.25,66.24,62.95,65.78,44568600,32.89
    +2004-12-03,64.53,65.00,61.75,62.68,44244600,31.34
    +2004-12-02,66.13,66.90,64.66,65.21,35265800,32.60
    +2004-12-01,67.79,67.95,66.27,67.79,28591200,33.90
    +2004-11-30,68.79,68.79,67.05,67.05,36732800,33.53
    +2004-11-29,68.95,69.57,67.41,68.44,61175600,34.22
    +2004-11-26,65.35,65.76,64.34,64.55,19648000,32.28
    +2004-11-24,61.69,65.20,61.55,64.05,49671000,32.03
    +2004-11-23,62.30,62.45,61.05,61.27,32551800,30.64
    +2004-11-22,61.80,64.00,57.90,61.35,91721800,30.67
    +2004-11-19,55.49,56.91,54.50,55.17,27331400,27.58
    +2004-11-18,54.30,55.45,54.29,55.39,16398200,27.69
    +2004-11-17,55.19,55.45,54.22,54.90,14205400,27.45
    +2004-11-16,55.16,55.20,54.48,54.94,10539400,27.47
    +2004-11-15,55.20,55.46,54.34,55.24,13430200,27.62
    +2004-11-12,55.01,55.69,54.84,55.50,14132200,27.75
    +2004-11-11,54.95,55.43,54.23,55.30,14546400,27.65
    +2004-11-10,53.95,55.39,53.91,54.75,18167000,27.38
    +2004-11-09,54.23,54.55,53.38,54.05,16991600,27.02
    +2004-11-08,54.27,55.45,53.86,54.38,18818600,27.19
    +2004-11-05,54.86,55.00,52.04,54.72,43037400,27.36
    +2004-11-04,55.03,55.55,54.37,54.45,33165200,27.23
    +2004-11-03,54.37,56.11,53.99,55.31,43006200,27.66
    +2004-11-02,52.40,54.08,52.40,53.50,26071000,26.75
    +2004-11-01,52.50,53.26,52.04,52.45,21501800,26.23
    +2004-10-29,51.84,53.20,51.80,52.40,28936400,26.20
    +2004-10-28,49.98,52.22,49.50,52.19,30866600,26.09
    +2004-10-27,48.51,50.62,48.17,50.30,42624800,25.15
    +2004-10-26,47.45,48.05,46.97,47.97,21227200,23.99
    +2004-10-25,47.20,47.84,47.07,47.55,14023000,23.77
    +2004-10-22,47.54,47.67,47.02,47.41,17252400,23.70
    +2004-10-21,47.48,48.13,47.36,47.94,25875200,23.97
    +2004-10-20,47.18,47.60,46.65,47.47,21611000,23.74
    +2004-10-19,48.10,48.35,47.31,47.42,28642600,23.71
    +2004-10-18,44.70,47.75,44.70,47.75,42884000,23.88
    +2004-10-15,44.88,45.61,44.19,45.50,36826000,22.75
    +2004-10-14,43.19,45.75,42.55,44.98,98872400,22.49
    +2004-10-13,38.87,39.76,38.74,39.75,41536000,19.88
    +2004-10-12,38.50,38.58,37.65,38.29,16435400,19.15
    +2004-10-11,38.80,39.06,38.20,38.59,11566800,19.30
    +2004-10-08,39.56,39.77,38.84,39.06,12829600,19.53
    +2004-10-07,40.54,40.93,39.46,39.62,15219600,19.81
    +2004-10-06,39.50,40.76,39.47,40.64,15939400,20.32
    +2004-10-05,38.56,39.67,38.40,39.37,14505800,19.68
    +2004-10-04,39.18,39.18,38.75,38.79,20503000,19.40
    +2004-10-01,39.12,39.19,38.58,38.67,16621600,19.33
    +2004-09-30,39.00,39.27,38.45,38.75,15179000,19.38
    +2004-09-29,37.93,38.86,37.82,38.68,9768200,19.34
    +2004-09-28,37.46,38.29,37.45,38.04,12613800,19.02
    +2004-09-27,36.95,37.98,36.83,37.53,14197000,18.76
    +2004-09-24,37.45,38.00,37.15,37.29,13196000,18.65
    +2004-09-23,37.04,37.50,36.93,37.27,14193000,18.64
    +2004-09-22,38.10,38.14,36.81,36.92,14346000,18.46
    +2004-09-21,37.75,38.87,37.46,38.01,13809000,19.00
    +2004-09-20,36.88,37.98,36.87,37.71,8750000,18.85
    +2004-09-17,36.55,37.38,36.40,37.14,17939600,18.57
    +2004-09-16,35.20,36.76,35.08,36.35,17925600,18.17
    +2004-09-15,35.36,35.48,34.80,35.20,8309600,17.60
    +2004-09-14,35.24,35.55,34.78,35.49,9100800,17.75
    +2004-09-13,35.88,36.07,35.32,35.59,10070600,17.80
    +2004-09-10,35.66,36.23,35.46,35.87,11714800,17.93
    +2004-09-09,36.10,36.30,35.28,35.70,16476400,17.85
    +2004-09-08,35.70,36.57,35.68,36.35,12268800,18.17
    +2004-09-07,35.40,36.19,35.23,35.76,10784200,17.88
    +2004-09-03,35.01,35.92,35.01,35.23,10481000,17.61
    +2004-09-02,35.50,35.81,34.83,35.66,14511600,17.83
    +2004-09-01,34.30,35.99,34.19,35.86,18418800,17.93
    +2004-08-31,34.07,34.95,34.00,34.49,13448600,17.25
    +2004-08-30,34.00,34.72,33.96,34.12,7790800,17.06
    +2004-08-27,34.68,34.76,34.00,34.35,13886200,17.17
    +2004-08-26,33.04,35.18,32.74,34.66,34137800,17.33
    +2004-08-25,31.87,33.15,31.73,33.05,18057800,16.52
    +2004-08-24,31.26,31.95,31.19,31.95,13362000,15.98
    +2004-08-23,30.86,31.27,30.60,31.08,9095000,15.54
    +2004-08-20,30.71,30.99,30.49,30.80,11313600,15.40
    +2004-08-19,31.51,31.86,30.36,30.71,13890000,15.35
    +2004-08-18,30.51,31.85,30.49,31.74,13023400,15.87
    +2004-08-17,30.58,31.13,30.35,30.87,11536400,15.44
    +2004-08-16,31.00,31.72,30.64,30.78,15559800,15.39
    +2004-08-13,30.60,31.28,30.40,30.84,11716000,15.42
    +2004-08-12,30.45,30.85,30.28,30.37,8078600,15.19
    +2004-08-11,31.10,31.13,30.26,31.01,11514000,15.51
    +2004-08-10,30.39,31.54,30.35,31.52,12537000,15.76
    +2004-08-09,29.85,30.45,29.81,30.30,10387400,15.15
    +2004-08-06,30.90,31.10,29.70,29.78,17581800,14.89
    +2004-08-05,31.81,32.30,31.25,31.39,8732200,15.69
    +2004-08-04,31.19,32.12,31.17,31.79,9874600,15.90
    +2004-08-03,31.45,31.72,31.15,31.29,7558200,15.65
    +2004-08-02,31.18,32.20,31.13,31.58,13039000,15.79
    +2004-07-30,32.65,33.00,32.00,32.34,8679400,16.17
    +2004-07-29,32.47,32.82,32.13,32.64,7934200,16.32
    +2004-07-28,32.31,32.41,31.16,32.27,10180400,16.14
    +2004-07-27,31.80,32.75,31.57,32.43,15178800,16.22
    +2004-07-26,30.85,31.45,30.78,31.26,14069000,15.63
    +2004-07-23,31.53,31.75,30.48,30.70,9770400,15.35
    +2004-07-22,31.25,31.73,31.06,31.68,11932800,15.84
    +2004-07-21,32.42,32.71,31.34,31.62,10759200,15.81
    +2004-07-20,31.95,32.20,31.55,32.20,11562400,16.10
    +2004-07-19,32.01,32.22,31.66,31.97,19041800,15.98
    +2004-07-16,32.80,32.92,32.12,32.20,17442200,16.10
    +2004-07-15,32.66,33.63,32.11,32.93,63133000,16.47
    +2004-07-14,28.86,29.97,28.74,29.58,29850000,14.79
    +2004-07-13,29.25,29.60,29.02,29.22,11292000,14.61
    +2004-07-12,30.02,30.04,28.93,29.14,18272200,14.57
    +2004-07-09,30.27,30.50,30.03,30.03,7459400,15.02
    +2004-07-08,30.13,30.68,29.95,30.14,8335000,15.07
    +2004-07-07,30.85,31.36,30.13,30.39,14214000,15.19
    +2004-07-06,31.27,31.42,30.80,30.95,12463600,15.48
    +2004-07-02,30.48,31.18,29.73,31.08,32524400,15.54
    +2004-07-01,32.10,32.48,31.90,32.30,12212200,16.15
    +2004-06-30,32.56,32.97,31.89,32.54,13323000,16.27
    +2004-06-29,32.07,32.99,31.41,32.50,21091200,16.25
    +2004-06-28,34.18,34.19,32.21,32.49,18610600,16.25
    +2004-06-25,33.07,33.70,33.00,33.70,11551000,16.85
    +2004-06-24,33.51,33.70,32.98,33.18,9018400,16.59
    +2004-06-23,33.00,33.83,32.89,33.70,13959600,16.85
    +2004-06-22,32.30,33.09,32.29,33.00,12875400,16.50
    +2004-06-21,33.12,33.50,32.12,32.33,13936200,16.17
    +2004-06-18,32.66,33.41,32.43,32.91,14509000,16.45
    +2004-06-17,32.56,33.13,32.21,32.81,19690000,16.41
    +2004-06-16,30.66,33.32,30.53,32.74,32487200,16.37
    +2004-06-15,30.54,31.14,30.26,30.69,15879800,15.35
    +2004-06-14,30.65,30.68,29.50,30.12,8713800,15.06
    +2004-06-10,30.20,30.97,30.20,30.74,9199200,15.37
    +2004-06-09,30.09,30.71,30.00,30.20,12471600,15.10
    +2004-06-08,29.99,30.44,29.83,30.35,14843600,15.18
    +2004-06-07,29.04,29.98,28.81,29.81,10567000,14.90
    +2004-06-04,28.56,29.25,28.51,28.78,14254000,14.39
    +2004-06-03,28.72,28.99,28.29,28.40,8961800,14.20
    +2004-06-02,28.03,29.17,27.80,28.92,11382600,14.46
    +2004-06-01,27.79,28.20,27.61,28.06,6504800,14.03
    +2004-05-28,28.08,28.27,27.80,28.06,5204200,14.03
    +2004-05-27,28.46,28.60,27.82,28.17,8427600,14.09
    +2004-05-26,28.33,28.78,28.00,28.51,11506000,14.26
    +2004-05-25,27.50,28.51,27.29,28.41,11427800,14.20
    +2004-05-24,27.29,27.90,27.11,27.34,8414400,13.67
    +2004-05-21,26.90,27.20,26.73,27.11,6424800,13.56
    +2004-05-20,26.63,27.00,26.47,26.71,7010600,13.35
    +2004-05-19,27.40,27.50,26.42,26.47,13414000,13.23
    +2004-05-18,26.97,27.29,26.80,27.06,7359400,13.53
    +2004-05-17,26.70,27.06,26.36,26.64,10730200,13.32
    +2004-05-14,27.25,27.32,26.45,27.06,9207200,13.53
    +2004-05-13,27.10,27.72,26.90,27.19,8209000,13.60
    +2004-05-12,26.79,27.34,26.24,27.30,8765000,13.65
    +2004-05-11,26.40,27.19,26.40,27.14,10899000,13.57
    +2004-05-10,26.27,26.60,25.94,26.28,8927800,13.14
    +2004-05-07,26.55,27.57,26.55,26.67,14965600,13.34
    +2004-05-06,26.40,26.75,25.90,26.58,9412800,13.29
    +2004-05-05,26.20,26.75,25.96,26.65,8503800,13.32
    +2004-05-04,25.97,26.55,25.50,26.14,9999400,13.07
    +2004-05-03,26.00,26.33,25.74,26.07,10629800,13.03
    +2004-04-30,26.71,26.96,25.49,25.78,16660800,12.89
    +2004-04-29,26.45,27.00,25.98,26.77,16456800,13.39
    +2004-04-28,26.82,27.01,26.34,26.45,8256000,13.23
    +2004-04-27,27.24,27.44,26.69,26.94,10138000,13.47
    +2004-04-26,27.58,27.64,27.00,27.13,8254600,13.56
    +2004-04-23,27.70,28.00,27.05,27.70,11279600,13.85
    +2004-04-22,27.56,28.18,27.11,27.78,12306600,13.89
    +2004-04-21,27.60,28.12,27.37,27.73,11638400,13.86
    +2004-04-20,28.21,28.41,27.56,27.73,12661400,13.86
    +2004-04-19,28.12,28.75,27.83,28.35,25441200,14.18
    +2004-04-16,29.15,29.31,28.50,29.18,14390400,14.59
    +2004-04-15,28.82,29.58,28.16,29.30,62908800,14.65
    +2004-04-14,26.74,27.07,26.31,26.64,22847600,13.32
    +2004-04-13,27.98,28.03,26.84,26.93,15585600,13.47
    +2004-04-12,27.50,28.10,27.49,28.04,8233600,14.02
    +2004-04-08,27.88,28.00,27.20,27.53,8604200,13.77
    +2004-04-07,27.61,27.70,26.92,27.31,9111400,13.65
    +2004-04-06,27.71,28.15,27.43,27.83,9214000,13.91
    +2004-04-05,27.48,28.37,27.44,28.32,13774000,14.16
    +2004-04-02,27.75,27.93,27.23,27.50,9802800,13.75
    +2004-04-01,26.89,27.27,26.62,27.11,11369000,13.56
    +2004-03-31,27.92,27.98,26.95,27.04,13956200,13.52
    +2004-03-30,27.74,27.95,27.34,27.92,12845600,13.96
    +2004-03-29,27.37,27.99,27.20,27.91,12526000,13.95
    +2004-03-26,27.00,27.36,26.91,27.04,14996200,13.52
    +2004-03-25,26.14,26.91,25.89,26.87,20230200,13.44
    +2004-03-24,25.27,25.75,25.27,25.50,15293400,12.75
    +2004-03-23,25.88,26.00,25.22,25.29,13768400,12.65
    +2004-03-22,25.37,26.17,25.25,25.86,14965400,12.93
    +2004-03-19,25.56,26.94,25.54,25.86,14592000,12.93
    +2004-03-18,25.94,26.06,25.59,25.67,11467200,12.84
    +2004-03-17,25.96,26.38,25.78,26.19,14694000,13.10
    +2004-03-16,26.55,26.61,25.39,25.82,21622600,12.91
    +2004-03-15,27.03,27.35,26.26,26.45,17204200,13.23
    +2004-03-12,27.32,27.78,27.17,27.56,11758000,13.78
    +2004-03-11,27.27,28.04,27.09,27.15,21280400,13.57
    +2004-03-10,27.04,28.14,26.94,27.68,35963000,13.84
    +2004-03-09,25.90,27.23,25.75,27.10,22084400,13.55
    +2004-03-08,26.62,26.79,25.80,26.00,18674000,13.00
    +2004-03-05,24.95,27.49,24.90,26.74,55021400,13.37
    +2004-03-04,23.93,25.22,23.91,25.16,23579400,12.58
    +2004-03-03,23.60,24.19,23.60,23.92,8040400,11.96
    +2004-03-02,24.00,24.10,23.77,23.81,9167400,11.90
    +2004-03-01,24.10,24.30,23.87,24.02,11488600,12.01
    +2004-02-27,22.96,24.02,22.95,23.92,16744200,11.96
    +2004-02-26,22.88,23.18,22.80,23.04,7086000,11.52
    +2004-02-25,22.28,22.90,22.21,22.81,9867000,11.40
    +2004-02-24,22.14,22.74,22.00,22.36,9252000,11.18
    +2004-02-23,22.34,22.46,21.89,22.19,6931400,11.10
    +2004-02-20,22.50,22.51,22.21,22.40,9914400,11.20
    +2004-02-19,23.33,23.64,22.41,22.47,11538600,11.23
    +2004-02-18,23.18,23.44,23.05,23.26,5058400,11.63
    +2004-02-17,23.10,23.49,23.10,23.16,6105600,11.58
    +2004-02-13,23.85,24.10,22.83,23.00,11285000,11.50
    +2004-02-12,23.61,23.99,23.60,23.73,6571000,11.86
    +2004-02-11,23.09,23.87,23.05,23.80,12448000,11.90
    +2004-02-10,22.62,23.12,22.44,22.98,9119400,11.49
    +2004-02-09,22.62,22.86,22.50,22.67,6723600,11.34
    +2004-02-06,22.45,22.89,22.40,22.71,6905000,11.35
    +2004-02-05,21.82,22.91,21.81,22.42,12601600,11.21
    +2004-02-04,22.00,22.09,21.70,21.79,10912600,10.90
    +2004-02-03,22.30,22.40,22.00,22.26,6457600,11.13
    +2004-02-02,22.46,22.81,22.08,22.32,10265400,11.16
    +2004-01-30,22.65,22.87,22.42,22.56,6617800,11.28
    +2004-01-29,22.63,22.80,22.19,22.68,7596400,11.34
    +2004-01-28,22.84,23.38,22.41,22.52,9835800,11.26
    +2004-01-27,23.04,23.25,22.80,23.07,10966800,11.53
    +2004-01-26,22.46,23.06,22.43,23.01,9688200,11.51
    +2004-01-23,22.42,22.74,22.25,22.56,8113200,11.28
    +2004-01-22,22.56,22.83,22.18,22.18,7321600,11.09
    +2004-01-21,22.70,22.97,22.43,22.61,8095000,11.31
    +2004-01-20,22.67,22.80,22.25,22.73,11283800,11.36
    +2004-01-16,22.89,23.04,22.61,22.72,13315000,11.36
    +2004-01-15,22.91,23.40,22.50,22.85,36364600,11.43
    +2004-01-14,24.40,24.54,23.78,24.20,22144400,12.10
    +2004-01-13,24.70,24.84,23.86,24.12,24250600,12.06
    +2004-01-12,23.25,24.00,23.10,23.73,17412400,11.86
    +2004-01-09,23.23,24.13,22.79,23.00,15266400,11.50
    +2004-01-08,22.84,23.73,22.65,23.36,16439400,11.68
    +2004-01-07,22.10,22.83,21.93,22.59,20959800,11.30
    +2004-01-06,22.25,22.42,21.71,22.09,18191000,11.05
    +2004-01-05,21.42,22.39,21.42,22.17,14107800,11.09
    +2004-01-02,21.55,21.75,21.18,21.28,5165800,10.64
    +2003-12-31,21.35,21.53,21.18,21.37,6230400,10.69
    +2003-12-30,21.18,21.50,21.15,21.28,7316200,10.64
    +2003-12-29,20.91,21.16,20.86,21.15,8337800,10.57
    +2003-12-26,20.35,20.91,20.34,20.78,3703400,10.39
    +2003-12-24,19.72,20.59,19.65,20.41,6338400,10.20
    +2003-12-23,19.92,19.95,19.60,19.81,11017800,9.90
    +2003-12-22,19.65,19.89,19.25,19.85,13466600,9.93
    +2003-12-19,20.19,20.42,19.62,19.70,16198600,9.85
    +2003-12-18,19.90,20.18,19.90,20.04,11818400,10.02
    +2003-12-17,20.08,20.13,19.79,19.88,9795000,9.94
    +2003-12-16,20.19,20.49,20.01,20.12,13355600,10.06
    +2003-12-15,21.49,21.49,20.07,20.17,13889600,10.09
    +2003-12-12,21.32,21.32,20.70,20.89,6881200,10.44
    +2003-12-11,20.25,21.34,20.21,21.21,6540600,10.60
    +2003-12-10,20.45,20.61,19.96,20.38,9690600,10.19
    +2003-12-09,21.17,21.25,20.40,20.45,4826600,10.23
    +2003-12-08,20.78,21.08,20.41,21.05,5294200,10.52
    +2003-12-05,20.90,21.15,20.73,20.85,6649200,10.43
    +2003-12-04,20.94,21.17,20.77,21.15,6355000,10.57
    +2003-12-03,21.54,21.84,20.96,21.03,6832000,10.52
    +2003-12-02,21.60,21.90,21.41,21.54,7332000,10.77
    +2003-12-01,21.04,21.85,21.00,21.71,12912000,10.85
    +2003-11-28,20.78,21.07,20.52,20.91,2717800,10.45
    +2003-11-26,20.89,21.15,20.25,20.72,8754600,10.36
    +2003-11-25,21.23,21.25,20.61,20.68,9594800,10.34
    +2003-11-24,20.50,21.27,20.45,21.15,13636600,10.57
    +2003-11-21,20.34,20.58,19.85,20.28,8637000,10.14
    +2003-11-20,20.10,21.08,20.10,20.38,8556800,10.19
    +2003-11-19,20.56,20.65,20.26,20.42,12306600,10.21
    +2003-11-18,21.21,21.34,20.35,20.41,9542600,10.20
    +2003-11-17,21.35,21.37,20.95,21.13,8152000,10.56
    +2003-11-14,22.48,22.61,21.28,21.46,8466000,10.73
    +2003-11-13,22.07,22.56,21.92,22.42,7599000,11.21
    +2003-11-12,21.48,22.72,21.48,22.33,10714400,11.16
    +2003-11-11,21.90,22.02,21.48,21.54,7681200,10.77
    +2003-11-10,22.45,22.65,21.84,21.90,8367000,10.95
    +2003-11-07,23.19,23.24,22.45,22.50,7505200,11.25
    +2003-11-06,22.91,23.15,22.65,23.12,14181200,11.56
    +2003-11-05,22.82,23.13,22.47,23.03,11516800,11.52
    +2003-11-04,23.07,23.10,22.59,22.91,8901200,11.45
    +2003-11-03,22.83,23.30,22.78,23.15,10815800,11.57
    +2003-10-31,23.30,23.35,22.78,22.89,7791200,11.44
    +2003-10-30,23.99,24.00,22.87,23.09,9305600,11.55
    +2003-10-29,23.51,23.90,23.34,23.69,9538600,11.85
    +2003-10-28,22.56,23.77,22.40,23.72,8989800,11.86
    +2003-10-27,22.75,22.89,22.49,22.60,5786200,11.30
    +2003-10-24,22.56,22.85,22.23,22.60,7852000,11.30
    +2003-10-23,22.73,23.15,22.59,22.99,5900400,11.49
    +2003-10-22,22.94,23.20,22.68,22.76,5771400,11.38
    +2003-10-21,23.31,23.40,22.75,23.18,6302200,11.59
    +2003-10-20,22.60,23.34,22.38,23.22,9969000,11.61
    +2003-10-17,23.38,23.49,22.43,22.75,12850400,11.38
    +2003-10-16,23.80,23.84,22.41,23.25,34845800,11.62
    +2003-10-15,24.85,25.01,24.58,24.82,21789400,12.41
    +2003-10-14,24.32,24.74,24.19,24.55,9836400,12.27
    +2003-10-13,23.73,24.41,23.72,24.35,9995200,12.18
    +2003-10-10,23.50,23.81,23.37,23.68,6244200,11.84
    +2003-10-09,23.30,23.67,22.79,23.45,12419600,11.73
    +2003-10-08,23.25,23.54,22.73,23.06,15309600,11.53
    +2003-10-07,22.05,23.41,21.91,23.22,14934800,11.61
    +2003-10-06,21.67,22.33,21.58,22.29,9583200,11.15
    +2003-10-03,20.99,21.86,20.88,21.69,10700000,10.85
    +2003-10-02,20.80,20.80,20.28,20.57,7287800,10.28
    +2003-10-01,20.71,21.10,20.19,20.79,8432600,10.40
    +2003-09-30,21.09,21.22,20.44,20.72,10193800,10.36
    +2003-09-29,21.49,21.67,20.65,21.30,13060800,10.65
    +2003-09-26,20.30,21.70,20.15,20.69,12401800,10.35
    +2003-09-25,21.34,21.37,20.25,20.43,20513600,10.22
    +2003-09-24,22.21,22.31,21.08,21.32,10760200,10.66
    +2003-09-23,22.02,22.46,21.88,22.43,4730400,11.22
    +2003-09-22,22.18,22.50,21.92,22.08,6422200,11.04
    +2003-09-19,22.88,23.05,22.43,22.58,7355600,11.29
    +2003-09-18,22.10,22.99,21.95,22.88,9032400,11.44
    +2003-09-17,22.37,22.38,21.85,22.12,10335600,11.06
    +2003-09-16,22.21,22.69,22.20,22.36,9607400,11.18
    +2003-09-15,22.81,22.90,22.12,22.21,8101600,11.10
    +2003-09-12,22.51,23.14,22.31,23.10,6428200,11.55
    +2003-09-11,22.25,22.79,22.10,22.56,7631600,11.28
    +2003-09-10,22.25,22.61,22.11,22.18,8031800,11.09
    +2003-09-09,22.53,22.67,22.12,22.37,6441800,11.19
    +2003-09-08,22.48,22.79,22.47,22.74,5973000,11.37
    +2003-09-05,22.73,23.15,22.41,22.50,8576200,11.25
    +2003-09-04,23.16,23.25,22.77,22.83,7135000,11.41
    +2003-09-03,22.80,23.32,22.76,22.95,9601000,11.48
    +2003-09-02,22.66,22.90,22.40,22.85,8647600,11.43
    +2003-08-29,22.20,22.85,22.05,22.61,9398400,11.31
    +2003-08-28,21.33,22.22,21.33,22.19,11415200,11.10
    +2003-08-27,20.91,21.48,20.66,21.48,8060800,10.74
    +2003-08-26,20.75,21.07,20.35,21.05,5891400,10.52
    +2003-08-25,20.78,20.91,20.49,20.86,4920800,10.43
    +2003-08-22,21.81,22.00,20.64,20.88,8938000,10.44
    +2003-08-21,21.03,21.71,20.95,21.68,9118800,10.84
    +2003-08-20,20.18,21.27,20.14,21.01,9757600,10.51
    +2003-08-19,20.37,20.45,20.00,20.32,4774600,10.16
    +2003-08-18,19.86,20.41,19.72,20.34,6884800,10.17
    +2003-08-15,20.02,20.07,19.66,19.71,4495200,9.85
    +2003-08-14,20.21,20.33,19.94,19.97,6885000,9.98
    +2003-08-13,19.86,20.34,19.58,20.18,10146400,10.09
    +2003-08-12,19.76,19.80,19.46,19.70,5872800,9.85
    +2003-08-11,19.82,19.93,19.51,19.66,4901000,9.83
    +2003-08-08,20.11,20.13,19.60,19.64,4916400,9.82
    +2003-08-07,19.73,20.09,19.42,19.93,6227800,9.97
    +2003-08-06,20.06,20.17,19.50,19.63,8766600,9.81
    +2003-08-05,21.35,21.40,20.10,20.38,8908600,10.19
    +2003-08-04,20.53,21.50,20.28,21.21,8218400,10.60
    +2003-08-01,21.00,21.27,20.64,20.73,5343000,10.36
    +2003-07-31,20.74,21.35,20.57,21.08,10766600,10.54
    +2003-07-30,20.77,20.90,20.17,20.28,6199800,10.14
    +2003-07-29,20.99,21.08,20.52,20.72,7040000,10.36
    +2003-07-28,21.50,21.50,20.86,20.99,6084200,10.49
    +2003-07-25,20.41,21.57,20.40,21.54,7738800,10.77
    +2003-07-24,21.04,21.50,20.38,20.51,8187000,10.26
    +2003-07-23,20.95,20.96,20.46,20.79,5108400,10.40
    +2003-07-22,20.87,20.96,20.50,20.80,7086600,10.40
    +2003-07-21,20.69,20.80,20.30,20.61,6564600,10.31
    +2003-07-18,20.90,21.18,20.40,20.86,10672800,10.43
    +2003-07-17,20.19,20.95,20.13,20.90,26829000,10.45
    +2003-07-16,19.97,20.00,19.38,19.87,8961800,9.94
    +2003-07-15,20.02,20.24,19.43,19.61,7380200,9.81
    +2003-07-14,20.01,20.40,19.87,19.90,6728800,9.95
    +2003-07-11,19.66,20.00,19.53,19.85,4887800,9.93
    +2003-07-10,19.88,19.94,19.37,19.58,6104800,9.79
    +2003-07-09,20.21,20.45,19.89,19.89,7630200,9.94
    +2003-07-08,19.52,20.50,19.49,20.40,9169200,10.20
    +2003-07-07,19.27,20.18,19.13,19.87,10224000,9.94
    +2003-07-03,19.00,19.55,18.98,19.13,4920400,9.56
    +2003-07-02,19.03,19.40,19.02,19.27,11617800,9.64
    +2003-07-01,18.87,19.18,18.51,19.09,6464000,9.55
    +2003-06-30,18.68,19.21,18.59,19.06,7934000,9.53
    +2003-06-27,19.30,19.31,18.48,18.73,13064000,9.36
    +2003-06-26,18.70,19.32,18.70,19.29,5775200,9.65
    +2003-06-25,18.86,19.40,18.71,19.09,11779000,9.55
    +2003-06-24,19.47,19.67,18.72,18.78,18370800,9.39
    +2003-06-23,19.30,19.69,18.75,19.06,10977200,9.53
    +2003-06-20,19.35,19.58,18.90,19.20,12733800,9.60
    +2003-06-19,19.36,19.61,18.77,19.14,13626000,9.57
    +2003-06-18,18.45,19.48,18.31,19.12,16249400,9.56
    +2003-06-17,18.41,18.50,17.99,18.19,6338000,9.10
    +2003-06-16,17.60,18.27,17.45,18.27,8518800,9.14
    +2003-06-13,17.75,17.95,17.13,17.42,6830200,8.71
    +2003-06-12,17.55,17.88,17.45,17.77,9021000,8.89
    +2003-06-11,17.15,17.51,16.81,17.45,8039800,8.73
    +2003-06-10,16.89,17.29,16.75,17.18,6308800,8.59
    +2003-06-09,16.94,17.04,16.63,16.79,9284000,8.40
    +2003-06-06,17.74,18.04,17.14,17.15,8621000,8.57
    +2003-06-05,17.45,17.74,17.33,17.64,7339200,8.82
    +2003-06-04,17.30,17.79,17.14,17.60,9685800,8.80
    +2003-06-03,17.44,17.67,17.02,17.31,12887800,8.65
    +2003-06-02,18.10,18.29,17.27,17.45,14949600,8.73
    +2003-05-30,18.12,18.18,17.53,17.95,13669600,8.98
    +2003-05-29,18.29,18.50,17.90,18.10,11920200,9.05
    +2003-05-28,18.50,18.66,18.15,18.28,12131400,9.14
    +2003-05-27,17.96,18.90,17.91,18.88,10361800,9.44
    +2003-05-23,18.21,18.46,17.96,18.32,7382800,9.16
    +2003-05-22,17.89,18.40,17.74,18.24,6373600,9.12
    +2003-05-21,17.79,18.09,17.67,17.85,10893200,8.93
    +2003-05-20,18.10,18.16,17.60,17.79,14865000,8.90
    +2003-05-19,18.53,18.65,18.06,18.10,15924600,9.05
    +2003-05-16,18.59,19.01,18.28,18.80,12201000,9.40
    +2003-05-15,18.60,18.85,18.47,18.73,10178400,9.36
    +2003-05-14,18.83,18.84,18.43,18.55,12696000,9.27
    +2003-05-13,18.43,18.97,17.95,18.67,15957000,9.34
    +2003-05-12,18.15,18.74,18.13,18.56,14977600,9.28
    +2003-05-09,18.33,18.40,17.88,18.30,21013800,9.15
    +2003-05-08,17.70,18.07,17.29,18.00,24562000,9.00
    +2003-05-07,17.33,18.24,17.11,17.65,37656400,8.82
    +2003-05-06,16.12,17.90,16.10,17.50,54089000,8.75
    +2003-05-05,14.77,16.88,14.75,16.09,55561000,8.05
    +2003-05-02,14.46,14.59,14.34,14.45,11470800,7.22
    +2003-05-01,14.25,14.39,14.00,14.36,12241400,7.18
    +2003-04-30,13.93,14.35,13.85,14.22,16363400,7.11
    +2003-04-29,13.98,14.16,13.58,14.06,16365600,7.03
    +2003-04-28,13.48,13.96,13.43,13.86,22742800,6.93
    +2003-04-25,13.46,13.58,13.23,13.35,7332800,6.68
    +2003-04-24,13.52,13.61,13.00,13.44,11611000,6.72
    +2003-04-23,13.53,13.63,13.36,13.58,7488600,6.79
    +2003-04-22,13.18,13.62,13.09,13.51,10734600,6.76
    +2003-04-21,13.13,13.19,12.98,13.14,5440000,6.57
    +2003-04-17,13.20,13.25,12.72,13.12,22009200,6.56
    +2003-04-16,12.99,13.67,12.92,13.24,36292000,6.62
    +2003-04-15,13.59,13.60,13.30,13.39,10856000,6.70
    +2003-04-14,13.71,13.75,13.50,13.58,17962800,6.79
    +2003-04-11,14.05,14.44,12.93,13.20,49739600,6.60
    +2003-04-10,14.20,14.39,14.20,14.37,3825000,7.18
    +2003-04-09,14.52,14.62,14.14,14.19,5240200,7.09
    +2003-04-08,14.51,14.65,14.36,14.45,4604800,7.22
    +2003-04-07,14.85,14.95,14.41,14.49,7030800,7.24
    +2003-04-04,14.52,14.67,14.39,14.41,5215000,7.20
    +2003-04-03,14.56,14.70,14.35,14.46,5204000,7.23
    +2003-04-02,14.36,14.69,14.27,14.60,6120400,7.30
    +2003-04-01,14.20,14.31,14.07,14.16,5512200,7.08
    +2003-03-31,14.33,14.53,14.04,14.14,9166400,7.07
    +2003-03-28,14.40,14.62,14.37,14.57,5189400,7.28
    +2003-03-27,14.32,14.70,14.32,14.49,4371200,7.24
    +2003-03-26,14.55,14.56,14.30,14.41,6369400,7.20
    +2003-03-25,14.41,14.83,14.37,14.55,5989200,7.28
    +2003-03-24,14.67,14.80,14.35,14.37,5753600,7.18
    +2003-03-21,15.09,15.15,14.82,15.00,10641000,7.50
    +2003-03-20,14.93,14.99,14.60,14.91,5827800,7.45
    +2003-03-19,15.07,15.15,14.79,14.95,5047000,7.47
    +2003-03-18,15.00,15.09,14.82,15.00,8213600,7.50
    +2003-03-17,14.89,15.07,14.71,15.01,14282600,7.51
    +2003-03-14,14.68,15.01,14.64,14.78,5467800,7.39
    +2003-03-13,14.47,14.80,14.17,14.72,11980200,7.36
    +2003-03-12,14.17,14.39,14.06,14.22,7948600,7.11
    +2003-03-11,14.36,14.49,14.12,14.23,5756800,7.11
    +2003-03-10,14.51,14.67,14.30,14.37,4806200,7.18
    +2003-03-07,14.47,14.71,14.31,14.53,7178000,7.26
    +2003-03-06,14.58,14.60,14.40,14.56,3566400,7.28
    +2003-03-05,14.61,14.80,14.52,14.62,4524400,7.31
    +2003-03-04,14.74,14.81,14.44,14.56,4514800,7.28
    +2003-03-03,15.01,15.16,14.55,14.65,7277200,7.32
    +2003-02-28,14.86,15.09,14.77,15.01,6967800,7.51
    +2003-02-27,14.57,15.00,14.51,14.86,5512200,7.43
    +2003-02-26,14.99,15.02,14.48,14.50,7753400,7.25
    +2003-02-25,14.68,15.08,14.58,15.02,6737200,7.51
    +2003-02-24,14.86,15.03,13.80,14.74,6437600,7.37
    +2003-02-21,14.82,15.06,14.65,15.00,5623000,7.50
    +2003-02-20,14.85,14.96,14.71,14.77,8012600,7.39
    +2003-02-19,15.07,15.15,14.68,14.85,8584600,7.43
    +2003-02-18,14.75,15.30,14.72,15.27,10389200,7.64
    +2003-02-14,14.61,14.72,14.35,14.67,8689200,7.34
    +2003-02-13,14.41,14.64,14.24,14.54,7446200,7.27
    +2003-02-12,14.27,14.60,14.27,14.39,8167400,7.20
    +2003-02-11,14.50,14.63,14.20,14.35,5885000,7.18
    +2003-02-10,14.26,14.57,14.06,14.35,5996000,7.18
    +2003-02-07,14.55,14.60,14.07,14.15,9632200,7.07
    +2003-02-06,14.36,14.59,14.22,14.43,6398200,7.22
    +2003-02-05,14.71,14.93,14.44,14.45,7914800,7.22
    +2003-02-04,14.45,14.65,14.31,14.60,11336200,7.30
    +2003-02-03,14.41,14.91,14.35,14.66,9456600,7.33
    +2003-01-31,14.19,14.55,14.05,14.36,12186600,7.18
    +2003-01-30,14.98,15.07,14.29,14.32,14537800,7.16
    +2003-01-29,14.55,15.10,14.30,14.93,13323000,7.47
    +2003-01-28,14.24,14.69,14.16,14.58,10223400,7.29
    +2003-01-27,13.68,14.50,13.65,14.13,13978800,7.07
    +2003-01-24,14.24,14.24,13.56,13.80,10909600,6.90
    +2003-01-23,14.05,14.36,13.95,14.17,8152000,7.09
    +2003-01-22,13.98,14.15,13.80,13.88,7683600,6.94
    +2003-01-21,14.21,14.41,14.00,14.02,9052000,7.01
    +2003-01-17,14.56,14.56,14.08,14.10,9527200,7.05
    +2003-01-16,14.21,14.76,14.21,14.62,19966800,7.31
    +2003-01-15,14.59,14.70,14.26,14.43,13254600,7.22
    +2003-01-14,14.69,14.82,14.49,14.61,6673600,7.30
    +2003-01-13,14.90,14.90,14.36,14.63,6390800,7.32
    +2003-01-10,14.58,14.82,14.49,14.72,6253600,7.36
    +2003-01-09,14.62,14.92,14.50,14.68,7687600,7.34
    +2003-01-08,14.58,14.71,14.44,14.55,8201600,7.28
    +2003-01-07,14.79,15.00,14.47,14.85,12226600,7.43
    +2003-01-06,15.03,15.38,14.88,14.90,13947600,7.45
    +2003-01-03,14.80,14.93,14.59,14.90,5266200,7.45
    +2003-01-02,14.36,14.92,14.35,14.80,6479600,7.40
    +2002-12-31,14.00,14.36,13.95,14.33,7168800,7.16
    +2002-12-30,14.08,14.15,13.84,14.07,5537200,7.03
    +2002-12-27,14.31,14.38,14.01,14.06,2858400,7.03
    +2002-12-26,14.42,14.81,14.28,14.40,3050800,7.20
    +2002-12-24,14.44,14.47,14.30,14.36,1405000,7.18
    +2002-12-23,14.16,14.55,14.12,14.49,4493800,7.24
    +2002-12-20,14.29,14.56,13.78,14.14,11360600,7.07
    +2002-12-19,14.53,14.92,14.10,14.20,12411400,7.10
    +2002-12-18,14.80,14.86,14.50,14.57,5382200,7.28
    +2002-12-17,14.85,15.19,14.66,15.08,7952200,7.54
    +2002-12-16,14.81,15.10,14.61,14.85,8986600,7.43
    +2002-12-13,15.14,15.15,14.65,14.79,5885000,7.39
    +2002-12-12,15.51,15.55,15.01,15.19,5333600,7.59
    +2002-12-11,15.30,15.49,15.08,15.49,9053600,7.74
    +2002-12-10,14.75,15.45,14.73,15.28,11021800,7.64
    +2002-12-09,14.94,14.95,14.67,14.75,8431600,7.38
    +2002-12-06,14.65,15.19,14.52,14.95,8762800,7.47
    +2002-12-05,15.03,15.08,14.53,14.63,8692800,7.32
    +2002-12-04,15.18,15.19,14.50,14.97,11634200,7.49
    +2002-12-03,15.20,15.34,15.10,15.16,8138200,7.58
    +2002-12-02,15.90,16.10,15.01,15.18,14240800,7.59
    +2002-11-29,15.79,15.88,15.41,15.50,5122600,7.75
    +2002-11-27,15.60,15.86,15.45,15.72,10242800,7.86
    +2002-11-26,15.85,15.90,15.27,15.41,8580800,7.70
    +2002-11-25,16.03,16.14,15.71,15.97,7122400,7.99
    +2002-11-22,16.09,16.30,15.90,16.01,8137800,8.01
    +2002-11-21,15.90,16.44,15.75,16.35,14945800,8.18
    +2002-11-20,15.30,15.70,15.25,15.53,7455000,7.76
    +2002-11-19,15.55,15.75,15.01,15.27,7534000,7.64
    +2002-11-18,16.19,16.20,15.52,15.65,5877800,7.82
    +2002-11-15,16.23,16.24,15.76,15.95,5749800,7.97
    +2002-11-14,15.90,16.41,15.78,16.30,5061200,8.15
    +2002-11-13,15.50,16.07,15.28,15.59,8276400,7.80
    +2002-11-12,15.32,16.04,15.28,15.64,7992600,7.82
    +2002-11-11,15.74,15.89,15.12,15.16,5463400,7.58
    +2002-11-08,16.01,16.20,15.52,15.84,6788000,7.92
    +2002-11-07,16.94,17.10,15.81,16.00,12006400,8.00
    +2002-11-06,17.08,17.32,16.70,17.22,7728200,8.61
    +2002-11-05,16.75,16.96,16.35,16.90,7524800,8.45
    +2002-11-04,16.50,17.38,16.35,16.89,13457800,8.44
    +2002-11-01,15.94,16.50,15.89,16.36,6779600,8.18
    +2002-10-31,15.99,16.44,15.92,16.07,10565600,8.03
    +2002-10-30,15.49,16.37,15.48,15.98,9667000,7.99
    +2002-10-29,15.57,15.88,14.96,15.44,9256400,7.72
    +2002-10-28,15.55,15.95,15.25,15.61,12475000,7.80
    +2002-10-25,14.69,15.45,14.59,15.42,9966800,7.71
    +2002-10-24,15.02,15.21,14.55,14.69,6241000,7.34
    +2002-10-23,14.63,14.98,14.50,14.88,7465600,7.44
    +2002-10-22,14.47,14.88,14.26,14.70,7791000,7.35
    +2002-10-21,14.26,14.63,14.00,14.56,8518600,7.28
    +2002-10-18,14.00,14.35,13.93,14.34,10296400,7.17
    +2002-10-17,14.21,14.38,13.98,14.11,16760600,7.05
    +2002-10-16,14.86,15.13,13.90,14.56,10986600,7.28
    +2002-10-15,15.22,15.25,14.78,15.16,14482800,7.58
    +2002-10-14,14.55,14.98,14.44,14.77,6943000,7.39
    +2002-10-11,14.25,14.78,14.10,14.51,10524200,7.26
    +2002-10-10,13.63,14.22,13.58,14.11,11484800,7.05
    +2002-10-09,13.54,13.85,13.41,13.59,12738800,6.80
    +2002-10-08,13.90,13.96,13.36,13.68,16201600,6.84
    +2002-10-07,13.97,14.21,13.76,13.77,8739200,6.89
    +2002-10-04,14.36,14.40,13.99,14.03,6815200,7.01
    +2002-10-03,14.18,14.60,14.06,14.30,7782000,7.15
    +2002-10-02,14.33,14.63,14.10,14.17,8191000,7.09
    +2002-10-01,14.59,14.60,14.00,14.51,12229400,7.26
    +2002-09-30,14.40,14.57,14.14,14.50,8489200,7.25
    +2002-09-27,14.49,14.85,14.48,14.72,7362600,7.36
    +2002-09-26,15.10,15.19,14.55,14.70,7451600,7.35
    +2002-09-25,14.69,15.17,14.65,14.93,9095800,7.47
    +2002-09-24,14.40,14.82,14.40,14.64,8952200,7.32
    +2002-09-23,14.76,14.96,14.45,14.85,9418200,7.43
    +2002-09-20,14.62,14.94,14.52,14.87,12599600,7.43
    +2002-09-19,14.75,14.80,14.48,14.58,7355200,7.29
    +2002-09-18,14.69,15.09,14.52,15.02,11737200,7.51
    +2002-09-17,14.57,15.03,14.57,14.80,15285600,7.40
    +2002-09-16,14.14,14.61,14.12,14.50,10237200,7.25
    +2002-09-13,14.13,14.34,14.05,14.17,10105400,7.09
    +2002-09-12,14.20,14.51,14.12,14.14,9636800,7.07
    +2002-09-11,14.34,14.60,14.15,14.29,7229000,7.14
    +2002-09-10,14.41,14.49,14.12,14.33,8909600,7.16
    +2002-09-09,14.28,14.53,14.15,14.37,5651600,7.18
    +2002-09-06,14.51,14.65,14.23,14.38,6485400,7.19
    +2002-09-05,14.22,14.36,14.05,14.18,8077800,7.09
    +2002-09-04,14.20,14.78,14.17,14.48,15023600,7.24
    +2002-09-03,14.49,14.55,14.05,14.05,9890600,7.03
    +2002-08-30,14.73,15.14,14.58,14.75,6911400,7.38
    +2002-08-29,14.65,15.08,14.51,14.70,5863200,7.35
    +2002-08-28,14.80,15.12,14.65,14.70,8856200,7.35
    +2002-08-27,15.71,15.74,14.71,14.85,9365400,7.43
    +2002-08-26,15.95,15.95,15.16,15.53,6784600,7.76
    +2002-08-23,15.90,15.93,15.45,15.73,5830200,7.86
    +2002-08-22,16.20,16.25,15.66,15.97,9225400,7.99
    +2002-08-21,16.01,16.24,15.45,16.12,7229600,8.06
    +2002-08-20,15.97,16.09,15.53,15.91,6665200,7.95
    +2002-08-19,15.78,16.25,15.72,15.98,7734200,7.99
    +2002-08-16,15.45,16.10,15.28,15.81,8758000,7.91
    +2002-08-15,15.25,15.75,15.01,15.61,11502800,7.80
    +2002-08-14,14.67,15.35,14.54,15.17,14253000,7.59
    +2002-08-13,14.90,15.21,14.55,14.59,9638200,7.30
    +2002-08-12,14.90,15.02,14.69,14.99,6420200,7.49
    +2002-08-09,15.25,15.25,14.75,15.00,7347000,7.50
    +2002-08-08,14.77,15.38,14.77,15.30,8119600,7.65
    +2002-08-07,15.09,15.36,14.35,15.03,11909800,7.51
    +2002-08-06,14.21,15.23,14.08,14.74,9716200,7.37
    +2002-08-05,14.51,14.70,13.97,13.99,7286600,6.99
    +2002-08-02,14.74,15.00,14.25,14.45,6395000,7.22
    +2002-08-01,15.11,15.42,14.73,14.80,8177000,7.40
    +2002-07-31,15.40,15.42,14.90,15.26,11096400,7.63
    +2002-07-30,14.85,15.51,14.56,15.43,12672800,7.72
    +2002-07-29,14.48,15.10,14.37,15.02,9820000,7.51
    +2002-07-26,14.46,14.53,13.80,14.34,7418000,7.17
    +2002-07-25,14.93,14.95,14.01,14.36,17119800,7.18
    +2002-07-24,14.33,15.22,14.25,15.20,14521200,7.60
    +2002-07-23,14.90,15.13,14.44,14.47,14281800,7.24
    +2002-07-22,14.75,15.19,14.61,14.92,15389200,7.46
    +2002-07-19,14.70,15.17,14.53,14.96,13757400,7.48
    +2002-07-18,15.50,15.56,14.75,14.99,19980800,7.49
    +2002-07-17,16.13,16.20,15.19,15.63,43410200,7.82
    +2002-07-16,18.15,18.57,17.61,17.86,15956000,8.93
    +2002-07-15,17.43,18.60,16.81,18.23,10571200,9.11
    +2002-07-12,18.55,18.79,17.26,17.51,15839000,8.76
    +2002-07-11,17.26,18.35,16.97,18.30,13345600,9.15
    +2002-07-10,17.71,18.17,17.25,17.32,7388600,8.66
    +2002-07-09,18.09,18.29,17.46,17.53,8098200,8.77
    +2002-07-08,18.52,18.61,17.68,18.01,7543000,9.01
    +2002-07-05,17.71,18.75,17.71,18.74,5773200,9.37
    +2002-07-03,16.81,17.68,16.75,17.55,7108200,8.77
    +2002-07-02,17.03,17.16,16.83,16.94,10899600,8.47
    +2002-07-01,17.71,17.88,17.05,17.06,7953200,8.53
    +2002-06-28,17.10,17.82,17.00,17.72,9637800,8.86
    +2002-06-27,16.79,17.27,16.42,17.06,8987800,8.53
    +2002-06-26,16.80,17.29,15.98,16.55,19962600,8.27
    +2002-06-25,17.40,17.68,16.86,17.14,10757200,8.57
    +2002-06-24,16.77,17.73,16.70,17.27,15426200,8.64
    +2002-06-21,16.97,17.49,16.79,16.85,15899200,8.43
    +2002-06-20,17.17,17.60,16.85,17.11,14165600,8.56
    +2002-06-19,17.37,17.60,16.88,17.12,61052400,8.56
    +2002-06-18,20.42,20.59,19.98,20.15,12620000,10.07
    +2002-06-17,20.24,20.63,19.85,20.54,11593200,10.27
    +2002-06-14,19.24,20.36,18.11,20.10,15175000,10.05
    +2002-06-13,20.02,20.05,19.38,19.54,12574400,9.77
    +2002-06-12,20.41,20.75,19.94,20.09,18882800,10.05
    +2002-06-11,21.64,21.70,20.41,20.46,12482000,10.23
    +2002-06-10,21.48,21.84,21.34,21.48,9913400,10.74
    +2002-06-07,21.76,21.94,20.93,21.40,21870600,10.70
    +2002-06-06,22.96,23.23,22.04,22.16,9285600,11.08
    +2002-06-05,22.83,22.83,22.35,22.72,9895800,11.36
    +2002-06-04,22.88,23.04,22.18,22.78,12422200,11.39
    +2002-06-03,23.39,23.45,22.58,22.91,8396800,11.45
    +2002-05-31,24.09,24.25,23.28,23.30,13053400,11.65
    +2002-05-30,23.77,24.38,23.51,24.20,7013400,12.10
    +2002-05-29,23.92,24.44,23.45,23.98,7921200,11.99
    +2002-05-28,23.69,24.20,23.43,23.98,5347000,11.99
    +2002-05-24,24.99,24.99,23.96,24.15,5934800,12.07
    +2002-05-23,24.45,25.24,24.07,25.18,13192800,12.59
    +2002-05-22,23.37,24.37,23.32,24.32,10388400,12.16
    +2002-05-21,24.83,25.00,23.40,23.46,10035400,11.73
    +2002-05-20,24.57,24.93,24.53,24.74,9639800,12.37
    +2002-05-17,25.49,25.78,24.61,25.01,8446200,12.51
    +2002-05-16,25.06,25.45,24.75,25.21,8109000,12.60
    +2002-05-15,25.37,25.98,24.84,25.28,11993800,12.64
    +2002-05-14,24.45,25.68,24.22,25.61,18803800,12.81
    +2002-05-13,23.52,24.09,22.94,23.94,9486000,11.97
    +2002-05-10,24.29,24.29,22.98,23.32,8407000,11.66
    +2002-05-09,24.25,24.35,23.80,24.19,8022000,12.10
    +2002-05-08,23.20,24.52,23.04,24.37,15595800,12.19
    +2002-05-07,22.94,22.95,22.14,22.47,8669600,11.23
    +2002-05-06,23.35,23.50,22.46,22.65,8916600,11.32
    +2002-05-03,23.57,24.02,23.43,23.51,8242200,11.76
    +2002-05-02,23.81,24.34,23.60,23.69,8548000,11.85
    +2002-05-01,24.29,24.29,23.36,23.98,7668000,11.99
    +2002-04-30,23.89,24.38,23.75,24.27,10034400,12.14
    +2002-04-29,23.16,24.06,23.09,23.96,9724600,11.98
    +2002-04-26,24.28,24.37,23.00,23.01,10892200,11.51
    +2002-04-25,23.56,24.34,23.55,24.12,6935800,12.06
    +2002-04-24,24.30,24.50,23.68,23.77,5016000,11.89
    +2002-04-23,24.54,24.78,24.09,24.25,8338200,12.12
    +2002-04-22,24.84,24.93,24.23,24.53,9622400,12.27
    +2002-04-19,25.49,25.49,24.93,24.98,13407400,12.49
    +2002-04-18,25.50,25.52,24.88,25.41,14346800,12.70
    +2002-04-17,25.93,26.17,25.38,26.11,14151800,13.06
    +2002-04-16,25.15,25.99,25.12,25.74,21949200,12.87
    +2002-04-15,25.06,25.15,24.80,25.00,10691800,12.50
    +2002-04-12,25.01,25.17,24.57,25.06,11437200,12.53
    +2002-04-11,25.03,25.20,24.75,24.86,14544800,12.43
    +2002-04-10,24.21,24.95,24.01,24.66,8035000,12.33
    +2002-04-09,24.59,25.00,24.01,24.10,6840400,12.05
    +2002-04-08,24.16,24.68,23.78,24.56,9339800,12.28
    +2002-04-05,24.95,25.19,24.10,24.74,9941000,12.37
    +2002-04-04,23.67,25.05,23.67,24.90,12089200,12.45
    +2002-04-03,24.05,24.49,23.60,23.75,7661800,11.88
    +2002-04-02,24.00,24.30,23.87,24.07,7278400,12.03
    +2002-04-01,23.38,24.70,23.28,24.46,7108800,12.23
    +2002-03-28,23.70,23.88,23.46,23.67,3873400,11.84
    +2002-03-27,23.35,23.72,23.26,23.47,4560800,11.73
    +2002-03-26,23.20,23.64,23.00,23.46,9208600,11.73
    +2002-03-25,24.07,24.09,23.24,23.35,9386800,11.68
    +2002-03-22,24.22,24.56,23.87,24.09,7221200,12.05
    +2002-03-21,23.86,24.30,23.26,24.27,22012600,12.14
    +2002-03-20,24.66,25.14,24.50,24.92,10511400,12.46
    +2002-03-19,24.69,25.30,24.30,24.85,8655200,12.43
    +2002-03-18,24.95,25.05,24.32,24.74,10877000,12.37
    +2002-03-15,24.46,24.96,24.25,24.95,8603600,12.48
    +2002-03-14,24.30,24.60,23.87,24.43,7760600,12.22
    +2002-03-13,24.37,24.85,24.15,24.49,7170200,12.24
    +2002-03-12,24.51,24.74,24.10,24.72,9073400,12.36
    +2002-03-11,24.60,25.14,24.10,25.06,9385200,12.53
    +2002-03-08,24.74,25.09,24.30,24.66,9634800,12.33
    +2002-03-07,24.06,24.53,23.61,24.38,9223200,12.19
    +2002-03-06,23.48,24.34,22.93,24.07,8078800,12.03
    +2002-03-05,24.15,24.43,23.40,23.53,9810800,11.77
    +2002-03-04,23.26,24.58,22.76,24.29,12437800,12.15
    +2002-03-01,21.93,23.50,21.82,23.45,12464000,11.73
    +2002-02-28,22.15,22.59,21.35,21.70,16319200,10.85
    +2002-02-27,23.94,24.25,20.94,21.96,36791400,10.98
    +2002-02-26,23.91,24.37,23.25,23.67,9290400,11.84
    +2002-02-25,22.85,24.72,22.36,23.81,15244600,11.90
    +2002-02-22,21.66,22.95,21.50,22.74,14517000,11.37
    +2002-02-21,22.92,23.00,21.45,21.50,15955400,10.75
    +2002-02-20,22.77,23.20,22.35,23.13,10194400,11.56
    +2002-02-19,23.76,23.87,22.48,22.62,13937800,11.31
    +2002-02-15,24.53,24.98,23.85,23.90,9292400,11.95
    +2002-02-14,25.05,25.23,24.38,24.60,9291800,12.30
    +2002-02-13,24.73,25.24,24.65,25.01,11174000,12.51
    +2002-02-12,24.66,25.04,24.45,24.71,8010000,12.35
    +2002-02-11,23.93,25.00,23.74,24.98,14235800,12.49
    +2002-02-08,24.40,24.64,23.37,24.03,12690400,12.02
    +2002-02-07,24.65,25.29,24.08,24.30,12422600,12.15
    +2002-02-06,25.60,25.98,24.15,24.67,21342000,12.34
    +2002-02-05,25.09,25.98,25.08,25.45,16317400,12.73
    +2002-02-04,24.32,25.52,24.20,25.35,18656200,12.68
    +2002-02-01,24.34,24.96,24.34,24.41,14225200,12.20
    +2002-01-31,24.16,24.73,24.11,24.72,16730200,12.36
    +2002-01-30,23.07,24.14,22.94,24.09,16842000,12.05
    +2002-01-29,23.22,23.54,22.85,23.07,8583000,11.53
    +2002-01-28,23.40,23.55,22.72,23.27,6658800,11.64
    +2002-01-25,22.89,23.42,22.66,23.25,6639800,11.62
    +2002-01-24,22.91,23.51,22.90,23.21,12285800,11.60
    +2002-01-23,21.80,23.04,21.59,23.02,15831400,11.51
    +2002-01-22,22.27,22.37,21.82,21.82,11689800,10.91
    +2002-01-18,22.00,22.60,21.96,22.17,12100400,11.09
    +2002-01-17,21.96,22.74,21.87,22.48,23592000,11.24
    +2002-01-16,21.41,21.41,20.50,20.78,20246200,10.39
    +2002-01-15,21.32,21.76,21.21,21.70,10368600,10.85
    +2002-01-14,21.01,21.40,20.90,21.15,14857000,10.57
    +2002-01-11,21.39,21.84,20.60,21.05,12457200,10.52
    +2002-01-10,21.22,21.46,20.25,21.23,16169200,10.61
    +2002-01-09,22.80,22.93,21.28,21.65,11708400,10.82
    +2002-01-08,22.75,23.05,22.46,22.61,16072800,11.31
    +2002-01-07,23.72,24.00,22.75,22.90,15878000,11.45
    +2002-01-04,23.34,23.95,22.99,23.69,14642000,11.85
    +2002-01-03,23.00,23.75,22.77,23.58,21857400,11.79
    +2002-01-02,22.05,23.30,21.96,23.30,18910600,11.65
    +2001-12-31,22.51,22.66,21.83,21.90,4920800,10.95
    +2001-12-28,21.97,23.00,21.96,22.43,10683000,11.22
    +2001-12-27,21.58,22.25,21.58,22.07,6839600,11.03
    +2001-12-26,21.35,22.30,21.14,21.49,5228600,10.74
    +2001-12-24,20.90,21.45,20.90,21.36,1808200,10.68
    +2001-12-21,21.01,21.54,20.80,21.00,9154800,10.50
    +2001-12-20,21.40,21.47,20.62,20.67,7888000,10.34
    +2001-12-19,20.58,21.68,20.47,21.62,10355600,10.81
    +2001-12-18,20.89,21.33,20.22,21.01,8401400,10.51
    +2001-12-17,20.40,21.00,20.19,20.62,6204000,10.31
    +2001-12-14,20.73,20.83,20.09,20.39,6781600,10.19
    +2001-12-13,21.49,21.55,20.50,21.00,7065800,10.50
    +2001-12-12,21.87,21.92,21.25,21.49,6873600,10.74
    +2001-12-11,22.67,22.85,21.65,21.78,7338400,10.89
    +2001-12-10,22.29,22.99,22.23,22.54,6071800,11.27
    +2001-12-07,22.46,22.71,22.00,22.54,7268400,11.27
    +2001-12-06,23.48,23.50,22.14,22.78,12104800,11.39
    +2001-12-05,22.36,24.03,22.17,23.76,20306400,11.88
    +2001-12-04,21.05,22.56,20.72,22.40,13586400,11.20
    +2001-12-03,21.06,21.28,20.60,21.05,6470200,10.52
    +2001-11-30,20.47,21.44,20.25,21.30,10854000,10.65
    +2001-11-29,20.60,20.70,20.19,20.42,7241600,10.21
    +2001-11-28,20.85,21.21,20.41,20.53,8950400,10.27
    +2001-11-27,21.20,21.52,20.50,21.00,9591200,10.50
    +2001-11-26,19.94,21.55,19.88,21.37,16453200,10.69
    +2001-11-23,19.71,19.95,19.57,19.84,2143000,9.92
    +2001-11-21,19.61,19.80,19.26,19.68,7199400,9.84
    +2001-11-20,19.82,20.20,19.50,19.53,9878000,9.77
    +2001-11-19,19.00,20.05,18.96,20.00,11878200,10.00
    +2001-11-16,19.27,19.29,18.40,18.97,8238000,9.48
    +2001-11-15,19.45,19.90,19.23,19.45,7608200,9.73
    +2001-11-14,19.59,19.90,19.15,19.61,7898200,9.81
    +2001-11-13,19.08,19.39,18.71,19.37,8024000,9.69
    +2001-11-12,18.66,19.17,17.96,18.75,7196400,9.38
    +2001-11-09,18.60,19.25,18.55,18.71,4796200,9.35
    +2001-11-08,19.63,19.89,18.57,18.71,12219400,9.35
    +2001-11-07,19.46,20.13,19.33,19.59,13678200,9.80
    +2001-11-06,18.96,19.62,18.53,19.57,11286400,9.78
    +2001-11-05,18.84,19.25,18.61,19.07,8421200,9.53
    +2001-11-02,18.52,18.86,18.16,18.57,7043000,9.28
    +2001-11-01,17.65,18.78,17.25,18.59,11178400,9.30
    +2001-10-31,17.73,18.40,17.44,17.56,9776800,8.78
    +2001-10-30,17.38,18.00,17.06,17.60,9884400,8.80
    +2001-10-29,18.57,18.67,17.60,17.63,8542200,8.81
    +2001-10-26,18.86,19.25,18.62,18.67,9963000,9.34
    +2001-10-25,18.44,19.25,18.16,19.19,9105400,9.60
    +2001-10-24,18.06,19.09,17.75,18.95,13372400,9.48
    +2001-10-23,19.12,19.42,17.87,18.14,24463600,9.07
    +2001-10-22,18.21,19.07,18.09,19.02,13997800,9.51
    +2001-10-19,17.94,18.40,17.88,18.30,5956800,9.15
    +2001-10-18,17.29,18.23,17.29,18.00,21877600,9.00
    +2001-10-17,18.34,18.41,16.96,16.99,10197800,8.49
    +2001-10-16,18.09,18.20,17.77,18.01,7248200,9.01
    +2001-10-15,17.95,18.38,17.95,17.99,11384000,8.99
    +2001-10-12,17.31,18.08,16.86,18.01,10279000,9.01
    +2001-10-11,16.92,17.74,16.85,17.74,11934400,8.87
    +2001-10-10,16.10,16.85,15.95,16.82,10991400,8.41
    +2001-10-09,16.05,16.20,15.63,16.00,6215200,8.00
    +2001-10-08,15.57,16.35,15.50,16.20,7428000,8.10
    +2001-10-05,15.40,16.15,14.99,16.14,12238800,8.07
    +2001-10-04,15.35,16.25,14.99,15.88,14325800,7.94
    +2001-10-03,14.95,15.36,14.83,14.98,24394400,7.49
    +2001-10-02,15.43,15.83,14.88,15.05,8424400,7.53
    +2001-10-01,15.49,15.99,15.23,15.54,7436000,7.77
    +2001-09-28,15.71,15.91,15.39,15.51,13039600,7.76
    +2001-09-27,15.25,15.75,15.20,15.51,11508600,7.76
    +2001-09-26,15.81,15.89,14.93,15.15,17635600,7.57
    +2001-09-25,16.14,16.22,15.35,15.54,13371600,7.77
    +2001-09-24,16.11,16.84,15.95,16.45,10519200,8.23
    +2001-09-21,14.80,16.25,14.68,15.73,20375600,7.86
    +2001-09-20,16.29,16.95,15.50,15.68,14684800,7.84
    +2001-09-19,16.50,17.10,15.60,17.02,13332800,8.51
    +2001-09-18,16.90,17.72,16.17,16.28,11682200,8.14
    +2001-09-17,16.00,17.07,15.73,16.99,16357400,8.49
    +2001-09-10,17.00,17.50,16.92,17.37,11030200,8.69
    +2001-09-07,17.50,18.10,17.20,17.28,8636800,8.64
    +2001-09-06,18.40,18.93,17.65,17.72,10084600,8.86
    +2001-09-05,18.24,18.95,18.12,18.55,12859200,9.27
    +2001-09-04,18.50,19.08,18.18,18.25,12436200,9.12
    +2001-08-31,17.73,18.60,17.65,18.55,7746600,9.27
    +2001-08-30,17.74,18.18,17.28,17.83,13167600,8.91
    +2001-08-29,18.44,18.83,17.83,17.83,8570400,8.91
    +2001-08-28,18.90,19.14,18.40,18.40,6133400,9.20
    +2001-08-27,18.60,19.30,18.16,18.92,6273000,9.46
    +2001-08-24,18.00,18.62,17.65,18.57,10369000,9.28
    +2001-08-23,18.20,18.34,17.58,17.81,7752800,8.90
    +2001-08-22,17.94,18.25,17.61,18.21,6213400,9.10
    +2001-08-21,18.14,18.14,17.70,17.92,6632200,8.96
    +2001-08-20,18.14,18.23,17.81,18.12,9010800,9.06
    +2001-08-17,18.00,18.45,17.99,18.07,7443800,9.03
    +2001-08-16,18.27,18.75,17.97,18.65,10289000,9.32
    +2001-08-15,18.76,18.94,18.20,18.44,10331400,9.22
    +2001-08-14,19.20,19.36,18.67,18.73,8176800,9.36
    +2001-08-13,19.10,19.33,18.76,19.09,5285600,9.55
    +2001-08-10,19.04,19.32,18.59,19.02,6677200,9.51
    +2001-08-09,18.96,19.15,18.72,19.05,7166600,9.52
    +2001-08-08,19.26,19.70,18.54,18.90,9863200,9.45
    +2001-08-07,19.33,19.67,18.98,19.25,6019600,9.62
    +2001-08-06,19.04,19.66,19.00,19.13,3559000,9.56
    +2001-08-03,19.89,19.90,19.00,19.50,6644800,9.75
    +2001-08-02,19.65,19.87,19.26,19.82,9003200,9.91
    +2001-08-01,19.01,19.78,18.95,19.06,10862000,9.53
    +2001-07-31,19.27,19.42,18.51,18.79,8393800,9.40
    +2001-07-30,19.12,19.36,18.51,18.93,8691400,9.47
    +2001-07-27,18.75,19.25,18.50,18.96,11933400,9.48
    +2001-07-26,18.48,18.80,17.85,18.59,13183600,9.30
    +2001-07-25,19.12,19.30,17.97,18.47,15852800,9.23
    +2001-07-24,19.39,19.92,18.73,19.09,12442000,9.55
    +2001-07-23,20.09,20.50,19.51,19.54,8620000,9.77
    +2001-07-20,19.70,20.06,19.49,19.98,15878000,9.99
    +2001-07-19,21.23,21.42,19.75,19.96,30755000,9.98
    +2001-07-18,21.78,22.78,20.42,20.79,40607600,10.40
    +2001-07-17,23.98,25.22,23.01,25.10,23136800,12.55
    +2001-07-16,24.88,25.10,23.91,23.96,9952400,11.98
    +2001-07-13,24.13,25.01,23.84,24.85,16240800,12.43
    +2001-07-12,23.30,24.81,23.30,24.36,21957200,12.18
    +2001-07-11,21.03,22.55,21.00,22.54,16803800,11.27
    +2001-07-10,22.95,23.07,20.84,21.14,14116800,10.57
    +2001-07-09,22.09,23.00,21.68,22.70,12052400,11.35
    +2001-07-06,22.76,22.96,21.72,22.03,10818600,11.02
    +2001-07-05,23.60,23.77,23.01,23.19,5439000,11.60
    +2001-07-03,23.51,24.18,23.50,23.84,4019400,11.92
    +2001-07-02,23.64,24.23,23.14,23.90,8216000,11.95
    +2001-06-29,23.66,25.10,23.20,23.25,18406800,11.62
    +2001-06-28,23.05,23.91,22.94,23.54,12443200,11.77
    +2001-06-27,23.83,24.00,22.50,23.34,13361800,11.67
    +2001-06-26,23.34,23.77,23.01,23.75,9742200,11.88
    +2001-06-25,22.50,24.00,22.45,23.99,15698200,11.99
    +2001-06-22,22.48,23.00,21.76,22.26,10215200,11.13
    +2001-06-21,21.55,23.00,21.10,22.49,12190400,11.24
    +2001-06-20,20.00,21.85,19.98,21.67,15415000,10.84
    +2001-06-19,20.85,21.40,20.01,20.19,11467400,10.10
    +2001-06-18,20.41,20.85,20.00,20.33,12354000,10.16
    +2001-06-15,20.10,20.75,19.35,20.44,16236600,10.22
    +2001-06-14,20.04,20.45,19.77,19.88,10619600,9.94
    +2001-06-13,21.42,21.73,20.06,20.47,18267400,10.23
    +2001-06-12,19.77,20.69,19.76,20.31,10849800,10.15
    +2001-06-11,21.05,21.07,19.95,20.04,10500000,10.02
    +2001-06-08,21.65,21.65,20.71,21.32,12236600,10.66
    +2001-06-07,20.71,21.70,20.45,21.66,11613600,10.83
    +2001-06-06,20.93,20.93,20.33,20.73,7970600,10.36
    +2001-06-05,20.80,21.10,20.35,20.94,16849800,10.47
    +2001-06-04,21.08,21.11,20.46,20.66,10068600,10.33
    +2001-06-01,20.13,21.09,19.98,20.89,16288400,10.44
    +2001-05-31,19.80,20.24,19.49,19.95,15817600,9.98
    +2001-05-30,20.76,20.76,19.30,19.78,27752800,9.89
    +2001-05-29,22.32,22.50,20.81,21.47,18428200,10.73
    +2001-05-25,23.20,23.29,22.50,22.76,5669400,11.38
    +2001-05-24,23.29,23.30,22.62,23.20,9705600,11.60
    +2001-05-23,23.75,23.75,22.86,23.23,10037200,11.61
    +2001-05-22,24.00,24.13,23.40,23.50,14747000,11.75
    +2001-05-21,23.63,23.91,23.05,23.56,16464200,11.78
    +2001-05-18,23.36,23.64,23.12,23.53,5680400,11.77
    +2001-05-17,24.23,24.33,23.25,23.55,11861400,11.77
    +2001-05-16,23.26,24.50,22.85,24.10,11511800,12.05
    +2001-05-15,23.37,25.50,23.04,23.18,8465200,11.59
    +2001-05-14,22.89,23.68,22.75,23.29,11043600,11.65
    +2001-05-11,23.01,23.49,22.76,22.85,7251600,11.43
    +2001-05-10,24.21,24.50,22.95,23.00,10320600,11.50
    +2001-05-09,24.14,24.55,23.67,23.98,11603200,11.99
    +2001-05-08,25.35,25.45,23.95,24.57,11265600,12.28
    +2001-05-07,25.62,25.76,24.84,24.96,9876800,12.48
    +2001-05-04,24.24,25.85,23.96,25.75,10037600,12.88
    +2001-05-03,25.97,26.25,24.73,24.96,10769400,12.48
    +2001-05-02,26.34,26.70,25.76,26.59,13161600,13.30
    +2001-05-01,25.41,26.50,25.20,25.93,15259000,12.97
    +2001-04-30,26.70,27.12,24.87,25.49,17670600,12.74
    +2001-04-27,25.20,26.29,24.75,26.20,16179000,13.10
    +2001-04-26,25.17,26.10,24.68,24.69,28560600,12.35
    +2001-04-25,24.21,24.86,23.57,24.72,11813600,12.36
    +2001-04-24,24.33,24.75,23.51,24.03,13469200,12.02
    +2001-04-23,24.34,25.00,24.00,24.25,19340200,12.12
    +2001-04-20,24.93,25.63,24.60,25.04,24764400,12.52
    +2001-04-19,25.55,25.75,23.60,25.72,66916800,12.86
    +2001-04-18,21.57,24.08,21.08,22.79,39315800,11.40
    +2001-04-17,21.20,21.21,19.60,20.40,24471400,10.20
    +2001-04-16,22.09,22.40,20.86,21.44,10186600,10.72
    +2001-04-12,21.42,23.02,21.15,22.42,10676200,11.21
    +2001-04-11,22.98,23.00,21.28,21.80,11932000,10.90
    +2001-04-10,20.90,22.70,20.78,22.04,16334800,11.02
    +2001-04-09,20.69,21.34,20.06,20.54,9520800,10.27
    +2001-04-06,20.80,21.04,19.90,20.59,11603200,10.30
    +2001-04-05,20.60,22.50,20.00,20.87,15955800,10.44
    +2001-04-04,19.76,20.25,18.75,19.50,24481600,9.75
    +2001-04-03,21.36,21.40,20.13,20.24,13167400,10.12
    +2001-04-02,22.09,22.66,21.40,21.59,12175400,10.80
    +2001-03-30,22.55,22.72,21.34,22.07,14298200,11.03
    +2001-03-29,21.77,23.45,21.50,22.53,21895200,11.27
    +2001-03-28,22.08,22.50,21.50,22.17,20880800,11.09
    +2001-03-27,21.94,23.05,21.90,22.87,19422200,11.44
    +2001-03-26,23.13,23.75,21.13,21.78,26230400,10.89
    +2001-03-23,22.06,23.56,22.00,23.00,33749400,11.50
    +2001-03-22,20.37,21.75,20.19,21.62,25839000,10.81
    +2001-03-21,19.78,20.87,19.37,20.12,13265400,10.06
    +2001-03-20,20.72,20.94,19.69,19.69,17833800,9.85
    +2001-03-19,19.75,20.62,19.50,20.56,12722800,10.28
    +2001-03-16,19.00,20.31,18.87,19.62,16806600,9.81
    +2001-03-15,20.87,21.37,19.69,19.69,18906600,9.85
    +2001-03-14,18.50,20.50,18.44,20.44,17065400,10.22
    +2001-03-13,18.87,19.56,18.19,19.56,15840600,9.78
    +2001-03-12,19.69,19.87,18.12,18.62,13967800,9.31
    +2001-03-09,20.62,20.69,20.00,20.25,10685400,10.12
    +2001-03-08,20.69,21.12,20.44,20.81,7325600,10.40
    +2001-03-07,21.31,21.62,20.75,21.25,14985600,10.62
    +2001-03-06,20.72,22.06,20.69,21.50,26144600,10.75
    +2001-03-05,19.37,20.50,19.25,20.37,11587600,10.19
    +2001-03-02,18.31,20.44,18.25,19.25,14511200,9.62
    +2001-03-01,17.81,18.75,17.19,18.75,11803400,9.38
    +2001-02-28,19.37,19.44,18.12,18.25,18157600,9.12
    +2001-02-27,19.28,19.44,18.69,19.37,12451000,9.69
    +2001-02-26,19.06,19.69,18.56,19.50,7380000,9.75
    +2001-02-23,18.62,18.87,18.25,18.81,10503800,9.40
    +2001-02-22,19.06,19.37,18.00,18.81,15431200,9.40
    +2001-02-21,18.25,19.94,18.25,18.87,13947800,9.44
    +2001-02-20,19.19,19.44,18.19,18.31,11249600,9.15
    +2001-02-16,19.00,19.50,18.75,19.00,9428400,9.50
    +2001-02-15,19.69,20.56,19.69,20.06,11123200,10.03
    +2001-02-14,19.19,19.62,18.50,19.50,11040000,9.75
    +2001-02-13,19.94,20.44,19.00,19.12,8470600,9.56
    +2001-02-12,19.06,20.00,18.81,19.69,9795600,9.85
    +2001-02-09,20.50,20.81,18.69,19.12,21082600,9.56
    +2001-02-08,20.56,21.06,20.19,20.75,21585000,10.38
    +2001-02-07,20.66,20.87,19.81,20.75,14071600,10.38
    +2001-02-06,20.16,21.39,20.00,21.12,16528400,10.56
    +2001-02-05,20.50,20.56,19.75,20.19,10228800,10.10
    +2001-02-02,21.12,21.94,20.50,20.62,15263400,10.31
    +2001-02-01,20.69,21.50,20.50,21.12,13205400,10.56
    +2001-01-31,21.50,22.50,21.44,21.62,26106000,10.81
    +2001-01-30,21.56,22.00,20.87,21.75,24734600,10.88
    +2001-01-29,19.56,21.75,19.56,21.69,30562800,10.85
    +2001-01-26,19.50,19.81,19.06,19.56,17245600,9.78
    +2001-01-25,20.56,20.56,19.75,19.94,17495000,9.97
    +2001-01-24,20.62,20.69,19.56,20.50,25616200,10.25
    +2001-01-23,19.31,20.94,19.06,20.50,31418400,10.25
    +2001-01-22,19.06,19.62,18.44,19.25,18551600,9.62
    +2001-01-19,19.44,19.56,18.69,19.50,27748200,9.75
    +2001-01-18,17.81,18.75,17.62,18.69,43822800,9.35
    +2001-01-17,17.56,17.56,16.50,16.81,30037600,8.40
    +2001-01-16,17.44,18.25,17.00,17.12,10940000,8.56
    +2001-01-12,17.87,18.00,17.06,17.19,15121000,8.60
    +2001-01-11,16.25,18.50,16.25,18.00,28707600,9.00
    +2001-01-10,16.69,17.00,16.06,16.56,20743400,8.28
    +2001-01-09,16.81,17.64,16.56,17.19,21040600,8.60
    +2001-01-08,16.94,16.98,15.94,16.56,13350000,8.28
    +2001-01-05,16.94,17.37,16.06,16.37,14731000,8.19
    +2001-01-04,18.14,18.50,16.81,17.06,26411000,8.53
    +2001-01-03,14.50,16.69,14.44,16.37,29181800,8.19
    +2001-01-02,14.88,15.25,14.56,14.88,16161800,7.44
    +2000-12-29,14.69,15.00,14.50,14.88,22518800,7.44
    +2000-12-28,14.38,14.94,14.31,14.81,10910000,7.41
    +2000-12-27,14.34,14.81,14.19,14.81,11626000,7.41
    +2000-12-26,14.88,15.00,14.25,14.69,7745400,7.34
    +2000-12-22,14.13,15.00,14.13,15.00,11369600,7.50
    +2000-12-21,14.25,15.00,13.88,14.06,13102600,7.03
    +2000-12-20,13.78,14.63,13.63,14.38,20196200,7.19
    +2000-12-19,14.38,15.25,14.00,14.00,13367200,7.00
    +2000-12-18,14.56,14.63,13.94,14.25,11645000,7.12
    +2000-12-15,14.56,14.69,14.00,14.06,18363800,7.03
    +2000-12-14,15.03,15.25,14.44,14.44,9406600,7.22
    +2000-12-13,15.56,15.56,14.88,15.00,12327200,7.50
    +2000-12-12,15.25,16.00,15.00,15.38,13803400,7.69
    +2000-12-11,15.19,15.38,14.88,15.19,11884000,7.59
    +2000-12-08,14.81,15.31,14.44,15.06,15568200,7.53
    +2000-12-07,14.44,14.88,14.00,14.31,14606600,7.16
    +2000-12-06,14.63,15.00,14.00,14.31,49092400,7.16
    +2000-12-05,16.94,17.44,16.37,17.00,21932200,8.50
    +2000-12-04,17.19,17.19,16.44,16.69,13273400,8.35
    +2000-12-01,17.00,17.50,16.81,17.06,13783800,8.53
    +2000-11-30,16.69,17.00,16.12,16.50,28922200,8.25
    +2000-11-29,18.09,18.31,17.25,17.56,17586200,8.78
    +2000-11-28,18.69,19.00,17.94,18.03,9618200,9.02
    +2000-11-27,19.87,19.94,18.50,18.69,9244000,9.35
    +2000-11-24,18.86,19.50,18.81,19.31,5751800,9.65
    +2000-11-22,18.81,19.12,18.37,18.50,10029600,9.25
    +2000-11-21,19.19,19.50,18.75,18.81,10786200,9.40
    +2000-11-20,18.59,19.50,18.25,18.94,14581600,9.47
    +2000-11-17,19.19,19.25,18.25,18.50,15943400,9.25
    +2000-11-16,19.50,19.81,18.87,19.00,8554000,9.50
    +2000-11-15,20.03,20.19,19.25,19.87,10086600,9.94
    +2000-11-14,19.94,20.50,19.56,20.25,14611200,10.12
    +2000-11-13,18.75,20.00,18.25,19.37,15423200,9.69
    +2000-11-10,19.36,19.87,19.06,19.06,15080600,9.53
    +2000-11-09,19.87,20.50,19.06,20.19,17035400,10.10
    +2000-11-08,21.37,21.44,19.81,20.06,15082800,10.03
    +2000-11-07,21.50,21.81,20.81,21.31,10786800,10.65
    +2000-11-06,22.44,22.62,20.87,21.44,14060000,10.72
    +2000-11-03,23.00,23.00,21.94,22.25,18423400,11.12
    +2000-11-02,21.12,22.44,21.06,22.31,21105400,11.15
    +2000-11-01,19.44,20.87,19.44,20.50,20553800,10.25
    +2000-10-31,19.75,20.25,19.25,19.56,31649000,9.78
    +2000-10-30,19.12,19.94,18.75,19.31,22832800,9.65
    +2000-10-27,18.87,19.19,17.87,18.56,26594600,9.28
    +2000-10-26,18.81,18.87,17.50,18.50,25780600,9.25
    +2000-10-25,19.06,19.19,18.44,18.50,23720600,9.25
    +2000-10-24,20.69,20.87,18.81,18.87,28736200,9.44
    +2000-10-23,20.27,20.56,19.44,20.37,19694000,10.19
    +2000-10-20,19.06,20.37,18.94,19.50,28270400,9.75
    +2000-10-19,19.16,19.81,18.31,18.94,53818200,9.47
    +2000-10-18,19.44,21.06,18.75,20.12,29803800,10.06
    +2000-10-17,21.69,21.94,19.69,20.12,21495600,10.06
    +2000-10-16,22.31,23.25,21.37,21.50,29298800,10.75
    +2000-10-13,20.25,22.12,20.00,22.06,44564000,11.03
    +2000-10-12,20.31,20.81,19.50,20.00,42548200,10.00
    +2000-10-11,20.12,21.00,19.12,19.62,42801200,9.81
    +2000-10-10,21.62,22.44,20.50,20.87,24683400,10.44
    +2000-10-09,22.62,22.87,21.12,21.75,21342600,10.88
    +2000-10-06,22.69,22.94,21.00,22.19,21881000,11.10
    +2000-10-05,23.50,24.50,22.00,22.06,31189400,11.03
    +2000-10-04,22.37,23.75,21.87,23.62,52368200,11.81
    +2000-10-03,24.94,25.00,22.19,22.31,72795600,11.15
    +2000-10-02,26.69,26.75,23.50,24.25,86610600,12.12
    +2000-09-29,28.19,29.00,25.37,25.75,265069000,12.88
    +2000-09-28,49.31,53.81,48.13,53.50,34988200,26.75
    +2000-09-27,51.75,52.75,48.25,48.94,14370000,24.47
    +2000-09-26,53.31,54.75,51.38,51.44,10396600,25.72
    +2000-09-25,52.75,55.50,52.06,53.50,15564000,26.75
    +2000-09-22,50.31,52.44,50.00,52.19,25961200,26.09
    +2000-09-21,58.50,59.63,55.25,56.69,18238400,28.34
    +2000-09-20,59.41,61.44,58.56,61.05,8121600,30.52
    +2000-09-19,59.75,60.50,58.56,59.94,9706200,29.97
    +2000-09-18,55.25,60.75,55.06,60.66,15163200,30.33
    +2000-09-15,57.75,58.19,54.25,55.23,14095400,27.61
    +2000-09-14,58.56,59.63,56.81,56.86,15241800,28.43
    +2000-09-13,56.75,59.50,56.75,58.00,10932600,29.00
    +2000-09-12,57.34,60.06,57.00,57.75,6722200,28.88
    +2000-09-11,58.69,60.38,58.13,58.44,6699000,29.22
    +2000-09-08,61.63,61.63,58.50,58.88,6984400,29.44
    +2000-09-07,59.13,62.56,58.25,62.00,7770400,31.00
    +2000-09-06,61.38,62.38,57.75,58.44,12700400,29.22
    +2000-09-05,62.66,64.12,62.25,62.44,10669000,31.22
    +2000-09-01,61.31,63.63,61.13,63.44,9181800,31.72
    +2000-08-31,58.97,61.50,58.94,60.94,14988800,30.47
    +2000-08-30,59.00,60.00,58.70,59.50,10199600,29.75
    +2000-08-29,57.88,59.44,57.69,59.19,9546200,29.59
    +2000-08-28,57.25,59.00,57.06,58.06,12822600,29.03
    +2000-08-25,56.50,57.50,56.38,56.81,11947800,28.41
    +2000-08-24,54.67,56.63,53.38,56.11,11109400,28.06
    +2000-08-23,51.47,54.75,51.06,54.31,8470400,27.16
    +2000-08-22,50.63,52.81,50.38,51.69,9889000,25.84
    +2000-08-21,50.25,51.56,49.63,50.50,4803800,25.25
    +2000-08-18,51.38,51.81,49.88,50.00,6798800,25.00
    +2000-08-17,48.38,52.44,48.31,51.44,9683400,25.72
    +2000-08-16,46.88,49.00,46.81,48.50,5137600,24.25
    +2000-08-15,47.25,47.94,46.50,46.69,4089000,23.34
    +2000-08-14,47.59,47.69,46.31,47.06,5603400,23.53
    +2000-08-11,46.84,48.00,45.56,47.69,8503200,23.84
    +2000-08-10,48.00,48.44,47.38,47.56,8995400,23.78
    +2000-08-09,48.13,48.44,47.25,47.50,13569000,23.75
    +2000-08-08,47.94,48.00,46.31,46.75,6315400,23.38
    +2000-08-07,47.88,49.06,47.19,47.94,6697200,23.97
    +2000-08-04,49.47,51.25,46.31,47.38,9406800,23.69
    +2000-08-03,45.56,48.06,44.25,48.00,12150000,24.00
    +2000-08-02,49.00,49.94,47.19,47.25,5808800,23.62
    +2000-08-01,50.31,51.16,49.25,49.31,4904600,24.66
    +2000-07-31,49.16,51.63,48.75,50.81,5550000,25.41
    +2000-07-28,52.28,52.50,46.88,48.31,8505400,24.16
    +2000-07-27,50.00,53.25,49.88,52.00,10543800,26.00
    +2000-07-26,49.84,51.25,49.25,50.06,7526200,25.03
    +2000-07-25,50.31,50.63,49.06,50.06,7567200,25.03
    +2000-07-24,52.56,52.88,47.50,48.69,14720600,24.34
    +2000-07-21,54.36,55.63,52.94,53.56,7013200,26.78
    +2000-07-20,55.00,57.06,54.13,55.13,16631800,27.57
    +2000-07-19,55.19,56.81,51.75,52.69,16359600,26.34
    +2000-07-18,58.50,58.88,56.88,57.25,11378200,28.62
    +2000-07-17,58.25,58.81,57.13,58.31,9289000,29.16
    +2000-07-14,57.13,59.00,56.88,57.69,6804400,28.84
    +2000-07-13,58.50,60.63,54.75,56.50,15925600,28.25
    +2000-07-12,58.13,58.94,56.38,58.88,8057600,29.44
    +2000-07-11,57.00,59.25,55.44,56.94,12783200,28.47
    +2000-07-10,54.09,58.25,53.75,57.13,14211000,28.57
    +2000-07-07,52.59,54.81,52.13,54.44,9422600,27.22
    +2000-07-06,52.50,52.94,49.63,51.81,11063800,25.91
    +2000-07-05,53.25,55.19,50.75,51.63,9478800,25.82
    +2000-07-03,52.13,54.31,52.13,53.31,2535000,26.66
    +2000-06-30,52.81,54.94,51.69,52.38,11550000,26.19
    +2000-06-29,53.06,53.94,51.06,51.25,7281200,25.62
    +2000-06-28,53.31,55.38,51.50,54.44,10235000,27.22
    +2000-06-27,53.78,55.50,51.63,51.75,7270600,25.88
    +2000-06-26,52.50,54.75,52.13,54.13,6631000,27.07
    +2000-06-23,53.78,54.63,50.81,51.69,7320400,25.84
    +2000-06-22,55.75,57.63,53.56,53.75,16706200,26.88
    +2000-06-21,50.50,56.94,50.31,55.63,17500000,27.82
    +2000-06-20,98.50,103.94,98.37,101.25,17922000,25.31
    +2000-06-19,90.56,97.87,89.81,96.62,14089200,24.16
    +2000-06-16,93.50,93.75,89.06,91.19,10842400,22.80
    +2000-06-15,91.25,93.37,89.00,92.37,8898800,23.09
    +2000-06-14,94.69,96.25,90.12,90.44,9925200,22.61
    +2000-06-13,91.19,94.69,88.19,94.50,12570000,23.62
    +2000-06-12,96.37,96.44,90.87,91.19,10374400,22.80
    +2000-06-09,96.75,97.94,94.37,95.75,9020000,23.94
    +2000-06-08,97.62,98.50,93.12,94.81,8540800,23.70
    +2000-06-07,93.62,97.00,91.62,96.56,12056800,24.14
    +2000-06-06,91.97,96.75,90.31,92.87,18771200,23.22
    +2000-06-05,93.31,95.25,89.69,91.31,11582000,22.83
    +2000-06-02,93.75,99.75,89.00,92.56,28336400,23.14
    +2000-06-01,81.75,89.56,80.37,89.12,32280000,22.28
    +2000-05-31,86.87,91.25,83.81,84.00,15483600,21.00
    +2000-05-30,87.62,88.12,81.75,87.56,25481200,21.89
    +2000-05-26,88.00,89.87,85.25,86.37,6486400,21.59
    +2000-05-25,88.50,92.66,86.00,87.27,14530800,21.82
    +2000-05-24,86.19,89.75,83.00,87.69,24248000,21.92
    +2000-05-23,90.50,93.37,85.62,85.81,18488000,21.45
    +2000-05-22,93.75,93.75,86.00,89.94,26995200,22.49
    +2000-05-19,99.25,99.25,93.37,94.00,26459200,23.50
    +2000-05-18,103.00,104.94,100.62,100.75,13365600,25.19
    +2000-05-17,103.62,103.69,100.37,101.37,14227600,25.34
    +2000-05-16,104.52,109.06,102.75,105.69,15736400,26.42
    +2000-05-15,108.06,108.06,100.12,101.00,24252000,25.25
    +2000-05-12,106.00,110.50,104.77,107.62,10962000,26.91
    +2000-05-11,101.37,104.25,99.00,102.81,17852400,25.70
    +2000-05-10,104.06,105.00,98.75,99.31,19127600,24.83
    +2000-05-09,110.31,111.25,104.87,105.44,11685600,26.36
    +2000-05-08,112.09,113.69,110.00,110.12,6605600,27.53
    +2000-05-05,110.81,114.75,110.72,113.12,10160000,28.28
    +2000-05-04,115.12,115.25,110.56,110.69,14284400,27.67
    +2000-05-03,118.94,121.25,111.62,115.06,17500000,28.76
    +2000-05-02,123.25,126.25,117.50,117.87,8446400,29.47
    +2000-05-01,124.87,125.12,121.87,124.31,8100000,31.08
    +2000-04-28,127.12,127.50,121.31,124.06,8932400,31.01
    +2000-04-27,117.19,127.00,116.58,126.75,11678000,31.69
    +2000-04-26,126.62,128.00,120.00,121.31,13117600,30.33
    +2000-04-25,122.12,128.75,122.06,128.31,14002400,32.08
    +2000-04-24,115.00,120.50,114.75,120.50,15845600,30.12
    +2000-04-20,123.69,124.75,117.06,118.87,25806800,29.72
    +2000-04-19,126.19,130.25,119.75,121.12,18586400,30.28
    +2000-04-18,123.50,126.87,119.37,126.87,13962400,31.72
    +2000-04-17,109.50,123.94,109.06,123.87,14642400,30.97
    +2000-04-14,109.31,118.00,109.00,111.87,23845600,27.97
    +2000-04-13,111.50,120.00,108.50,113.81,18923600,28.45
    +2000-04-12,119.00,119.00,104.87,109.25,33618800,27.31
    +2000-04-11,123.50,124.87,118.06,119.44,19368000,29.86
    +2000-04-10,131.69,132.75,124.75,125.00,7592400,31.25
    +2000-04-07,127.25,131.88,125.50,131.75,8668800,32.94
    +2000-04-06,130.63,134.50,123.25,125.19,9290800,31.30
    +2000-04-05,126.47,132.88,124.00,130.38,16359200,32.60
    +2000-04-04,132.63,133.00,116.75,127.31,23596400,31.83
    +2000-04-03,135.50,139.50,129.44,133.31,11742400,33.33
    +2000-03-31,127.44,137.25,126.00,135.81,14457600,33.95
    +2000-03-30,133.56,137.69,125.44,125.75,14800000,31.44
    +2000-03-29,139.38,139.44,133.83,135.94,8568800,33.99
    +2000-03-28,137.25,142.00,137.13,139.13,7253600,34.78
    +2000-03-27,137.63,144.75,136.88,139.56,9976800,34.89
    +2000-03-24,142.44,143.94,135.50,138.69,15962000,34.67
    +2000-03-23,142.00,150.38,140.00,141.31,20098000,35.33
    +2000-03-22,132.78,144.38,131.56,144.19,20288800,36.05
    +2000-03-21,122.56,136.75,121.62,134.94,18729200,33.74
    +2000-03-20,123.50,126.25,122.37,123.00,7316400,30.75
    +2000-03-17,120.12,125.00,119.62,125.00,10902400,31.25
    +2000-03-16,117.31,122.00,114.50,121.56,13516800,30.39
    +2000-03-15,115.62,120.25,114.12,116.25,15845200,29.06
    +2000-03-14,121.22,124.25,114.00,114.25,15321200,28.56
    +2000-03-13,122.12,126.50,119.50,121.31,10864400,30.33
    +2000-03-10,121.69,127.94,121.00,125.75,8900800,31.44
    +2000-03-09,120.87,125.00,118.25,122.25,9884400,30.56
    +2000-03-08,122.87,123.94,118.56,122.00,9690800,30.50
    +2000-03-07,126.44,127.44,121.12,122.87,9767600,30.72
    +2000-03-06,126.00,129.13,125.00,125.69,7520000,31.42
    +2000-03-03,124.87,128.23,120.00,128.00,11565200,32.00
    +2000-03-02,127.00,127.94,120.69,122.00,11136800,30.50
    +2000-03-01,118.56,132.06,118.50,130.31,38478000,32.58
    +2000-02-29,113.56,117.25,112.56,114.62,13186800,28.66
    +2000-02-28,110.12,115.00,108.37,113.25,11729200,28.31
    +2000-02-25,114.81,117.00,110.12,110.37,8908000,27.59
    +2000-02-24,117.31,119.12,111.75,115.20,13446400,28.80
    +2000-02-23,113.23,119.00,111.00,116.25,16905600,29.06
    +2000-02-22,110.12,116.94,106.69,113.81,15083200,28.45
    +2000-02-18,114.62,115.37,110.87,111.25,8346800,27.81
    +2000-02-17,115.19,115.50,113.12,114.87,10350000,28.72
    +2000-02-16,117.75,118.12,112.12,114.12,13525200,28.53
    +2000-02-15,115.25,119.94,115.19,119.00,17363600,29.75
    +2000-02-14,109.31,115.87,108.62,115.81,13130000,28.95
    +2000-02-11,113.62,114.12,108.25,108.75,7592000,27.19
    +2000-02-10,112.87,113.87,110.00,113.50,10832400,28.38
    +2000-02-09,114.12,117.12,112.44,112.62,10698000,28.16
    +2000-02-08,114.00,116.12,111.25,114.87,14613600,28.72
    +2000-02-07,108.00,114.25,105.94,114.06,15770800,28.51
    +2000-02-04,103.94,110.00,103.62,108.00,15206800,27.00
    +2000-02-03,100.31,104.25,100.25,103.31,16977600,25.83
    +2000-02-02,100.75,102.12,97.00,98.81,16588800,24.70
    +2000-02-01,104.00,105.00,100.00,100.25,11380000,25.06
    +2000-01-31,101.00,103.87,94.50,103.75,25071200,25.94
    +2000-01-28,108.19,110.87,100.62,101.62,15142000,25.41
    +2000-01-27,108.81,113.00,107.00,110.00,12163600,27.50
    +2000-01-26,110.00,114.19,109.75,110.19,13131200,27.55
    +2000-01-25,105.00,113.12,102.37,112.25,17775200,28.06
    +2000-01-24,108.44,112.75,105.12,106.25,15760000,26.56
    +2000-01-21,114.25,114.25,110.19,111.31,17729200,27.83
    +2000-01-20,115.50,121.50,113.50,113.50,65418800,28.38
    +2000-01-19,105.62,108.75,103.37,106.56,21358000,26.64
    +2000-01-18,101.00,106.00,100.44,103.94,16421200,25.99
    +2000-01-14,100.00,102.25,99.37,100.44,13954400,25.11
    +2000-01-13,94.48,98.75,92.50,96.75,36882400,24.19
    +2000-01-12,95.00,95.50,86.50,87.19,34870800,21.80
    +2000-01-11,95.94,99.37,90.50,92.75,15775200,23.19
    +2000-01-10,102.00,102.25,94.75,97.75,18059200,24.44
    +2000-01-07,96.50,101.00,95.50,99.50,16463200,24.88
    +2000-01-06,106.12,107.00,95.00,95.00,27443200,23.75
    +2000-01-05,103.75,110.56,103.00,104.00,27818000,26.00
    +2000-01-04,108.25,110.62,101.19,102.50,18310000,25.62
    +2000-01-03,104.87,112.50,101.69,111.94,19144400,27.99
    +1999-12-31,100.94,102.87,99.50,102.81,5856400,25.70
    +1999-12-30,102.19,104.12,99.62,100.31,7419200,25.08
    +1999-12-29,96.81,102.19,95.50,100.69,10161200,25.17
    +1999-12-28,99.12,99.62,95.00,98.19,8843200,24.55
    +1999-12-27,104.37,104.44,99.25,99.31,6022000,24.83
    +1999-12-23,101.81,104.25,101.06,103.50,8218800,25.88
    +1999-12-22,102.87,104.56,98.75,99.94,11682000,24.99
    +1999-12-21,98.19,103.06,97.94,102.50,11000000,25.62
    +1999-12-20,99.56,99.62,96.62,98.00,10155200,24.50
    +1999-12-17,100.87,102.00,98.50,100.00,17700800,25.00
    +1999-12-16,98.00,98.37,94.00,98.31,16568000,24.58
    +1999-12-15,93.25,97.25,91.06,97.00,22254400,24.25
    +1999-12-14,98.37,99.75,94.75,94.87,15570800,23.72
    +1999-12-13,102.39,102.50,98.94,99.00,18931200,24.75
    +1999-12-10,105.31,109.25,99.00,103.00,22786800,25.75
    +1999-12-09,111.00,111.00,100.87,105.25,30555600,26.31
    +1999-12-08,116.25,117.87,109.50,110.06,14730800,27.51
    +1999-12-07,116.56,118.00,114.00,117.81,15901200,29.45
    +1999-12-06,114.56,117.31,111.44,116.00,16688000,29.00
    +1999-12-03,112.19,115.56,111.87,115.00,23151200,28.75
    +1999-12-02,103.12,110.62,101.75,110.19,20275600,27.55
    +1999-12-01,101.00,104.50,100.06,103.06,22098000,25.76
    +1999-11-30,98.12,103.75,97.37,97.87,30132400,24.47
    +1999-11-29,94.25,99.75,93.25,94.56,16586800,23.64
    +1999-11-26,94.75,95.50,94.12,95.06,4737600,23.76
    +1999-11-24,93.00,95.00,91.69,94.69,7683600,23.67
    +1999-11-23,91.75,95.25,88.50,92.81,19406400,23.20
    +1999-11-22,91.75,91.75,89.25,90.62,7242400,22.66
    +1999-11-19,89.50,92.87,88.06,92.44,11162000,23.11
    +1999-11-18,91.06,91.12,88.44,89.62,13043600,22.41
    +1999-11-17,90.69,94.75,90.00,90.25,13032000,22.56
    +1999-11-16,90.00,91.75,88.50,91.19,8370000,22.80
    +1999-11-15,89.62,92.87,88.50,89.44,9283600,22.36
    +1999-11-12,91.94,92.00,87.37,90.62,9970000,22.66
    +1999-11-11,91.59,92.62,89.87,92.25,9660000,23.06
    +1999-11-10,88.25,93.25,88.12,91.44,20661200,22.86
    +1999-11-09,94.37,94.50,88.00,89.62,28910000,22.41
    +1999-11-08,87.75,97.73,86.75,96.37,33962400,24.09
    +1999-11-05,84.62,88.37,84.00,88.31,14889200,22.08
    +1999-11-04,82.06,85.37,80.62,83.62,13549200,20.91
    +1999-11-03,81.62,83.25,81.00,81.50,11736800,20.38
    +1999-11-02,78.00,81.69,77.31,80.25,14268800,20.06
    +1999-11-01,80.00,80.69,77.37,77.62,9965600,19.41
    +1999-10-29,78.81,81.06,78.81,80.12,18680800,20.03
    +1999-10-28,77.06,79.00,76.06,77.87,18005200,19.47
    +1999-10-27,74.37,76.62,73.44,76.37,15837600,19.09
    +1999-10-26,74.94,75.50,73.31,75.06,12924400,18.76
    +1999-10-25,74.25,76.12,73.75,74.50,11677600,18.62
    +1999-10-22,77.12,77.25,73.37,73.94,14995200,18.49
    +1999-10-21,72.56,77.06,72.37,76.12,28347600,19.03
    +1999-10-20,70.00,75.25,70.00,75.12,38633600,18.78
    +1999-10-19,71.62,75.00,68.44,68.50,36521200,17.12
    +1999-10-18,73.87,74.25,71.12,73.25,27733600,18.31
    +1999-10-15,71.12,75.81,70.19,74.56,41910000,18.64
    +1999-10-14,69.25,73.31,69.00,73.19,67822400,18.30
    +1999-10-13,66.62,69.50,63.75,64.03,22752000,16.01
    +1999-10-12,67.87,69.62,67.00,67.69,20142000,16.92
    +1999-10-11,66.00,68.25,66.00,66.69,9418000,16.67
    +1999-10-08,66.19,66.31,63.50,65.56,13689200,16.39
    +1999-10-07,68.44,68.62,64.87,66.37,21660800,16.59
    +1999-10-06,69.37,69.62,67.00,67.19,28726400,16.80
    +1999-10-05,65.62,68.12,64.75,67.94,29100800,16.99
    +1999-10-04,62.38,64.87,62.38,64.56,16408800,16.14
    +1999-10-01,62.13,62.44,59.50,61.72,21977600,15.43
    +1999-09-30,59.56,64.19,59.25,63.31,32449200,15.83
    +1999-09-29,60.25,61.25,58.00,59.06,23493600,14.77
    +1999-09-28,61.50,62.00,57.44,59.63,50542400,14.91
    +1999-09-27,66.37,66.75,61.19,61.31,33877600,15.33
    +1999-09-24,63.38,67.02,63.00,64.94,42148800,16.24
    +1999-09-23,71.12,71.25,63.00,63.31,40853200,15.83
    +1999-09-22,69.75,71.62,69.02,70.31,40132000,17.58
    +1999-09-21,73.19,73.25,69.00,69.25,119931200,17.31
    +1999-09-20,77.00,80.12,76.87,79.06,16326400,19.76
    +1999-09-17,77.31,77.75,76.25,76.94,9915600,19.24
    +1999-09-16,76.06,78.06,73.87,76.81,15793600,19.20
    +1999-09-15,78.87,79.12,75.25,75.37,12843200,18.84
    +1999-09-14,74.72,78.50,74.69,77.81,13883200,19.45
    +1999-09-13,77.06,77.06,74.81,75.00,9000000,18.75
    +1999-09-10,76.00,77.69,74.69,77.44,16398000,19.36
    +1999-09-09,75.50,75.94,73.87,75.56,19093600,18.89
    +1999-09-08,76.19,77.69,74.50,74.50,27233600,18.62
    +1999-09-07,73.75,77.94,73.50,76.37,35177600,19.09
    +1999-09-03,71.94,75.25,70.50,73.50,58403600,18.38
    +1999-09-02,67.62,71.44,66.87,70.56,31975200,17.64
    +1999-09-01,67.00,68.81,66.00,68.62,28168000,17.16
    +1999-08-31,62.59,65.87,62.06,65.25,22675200,16.31
    +1999-08-30,65.00,65.00,62.00,62.06,12033200,15.52
    +1999-08-27,62.75,65.00,62.69,64.75,15980000,16.19
    +1999-08-26,61.13,63.13,61.13,62.13,14449200,15.53
    +1999-08-25,60.69,61.50,60.13,61.38,10553600,15.35
    +1999-08-24,60.38,60.75,59.94,60.38,17948000,15.10
    +1999-08-23,59.38,61.38,59.31,60.75,12709200,15.19
    +1999-08-20,59.25,59.38,58.19,59.19,11730800,14.80
    +1999-08-19,59.81,60.50,58.56,58.75,19645600,14.69
    +1999-08-18,60.06,62.00,59.63,60.13,16743200,15.03
    +1999-08-17,60.31,60.38,58.94,60.31,11474400,15.08
    +1999-08-16,59.81,60.69,59.50,60.50,9896400,15.12
    +1999-08-13,60.63,62.00,59.88,60.06,10668800,15.02
    +1999-08-12,59.06,61.38,58.63,60.00,23806400,15.00
    +1999-08-11,56.00,59.75,55.94,59.69,30374400,14.92
    +1999-08-10,54.00,56.00,53.63,55.38,14879200,13.85
    +1999-08-09,54.34,55.19,54.25,54.44,8338000,13.61
    +1999-08-06,54.06,55.31,53.50,54.13,15575600,13.53
    +1999-08-05,53.50,54.88,52.13,54.75,11541200,13.69
    +1999-08-04,55.19,55.88,53.25,53.81,13279200,13.45
    +1999-08-03,56.75,57.44,53.63,55.25,13176800,13.81
    +1999-08-02,55.63,58.00,55.50,55.75,12958000,13.94
    +1999-07-30,54.50,56.13,54.50,55.69,13685600,13.92
    +1999-07-29,53.38,55.25,53.13,53.88,9860000,13.47
    +1999-07-28,53.88,55.38,53.00,54.38,11762000,13.60
    +1999-07-27,52.63,53.94,52.50,53.69,14150800,13.42
    +1999-07-26,52.88,53.00,50.88,50.94,12555200,12.73
    +1999-07-23,52.81,53.75,52.69,53.31,8192000,13.33
    +1999-07-22,53.63,53.88,51.13,52.38,14529200,13.10
    +1999-07-21,54.06,55.44,52.88,54.06,25653600,13.52
    +1999-07-20,54.56,55.50,52.75,52.88,15804400,13.22
    +1999-07-19,53.94,55.81,52.31,54.44,20050000,13.61
    +1999-07-16,53.63,54.50,53.00,53.06,14705600,13.27
    +1999-07-15,55.88,55.94,51.31,53.25,60433600,13.31
    +1999-07-14,54.50,56.63,54.50,55.94,22320000,13.98
    +1999-07-13,53.50,54.19,52.88,53.69,10136800,13.42
    +1999-07-12,55.50,55.63,54.19,54.50,10862000,13.62
    +1999-07-09,54.50,55.63,53.00,55.63,21750000,13.91
    +1999-07-08,51.13,55.06,50.88,54.50,58058000,13.62
    +1999-07-07,47.38,50.75,47.00,49.88,39264400,12.47
    +1999-07-06,45.94,47.63,45.81,47.38,16212000,11.85
    +1999-07-02,45.53,46.88,45.19,46.31,4426800,11.58
    +1999-07-01,46.31,46.56,45.25,45.31,5334400,11.33
    +1999-06-30,45.69,46.94,44.94,46.31,12270800,11.58
    +1999-06-29,42.72,45.56,42.63,45.38,13599200,11.35
    +1999-06-28,42.44,42.94,42.38,42.56,9938800,10.64
    +1999-06-25,42.50,42.69,42.06,42.19,10518800,10.55
    +1999-06-24,43.63,43.63,42.25,42.31,15498000,10.58
    +1999-06-23,45.06,45.09,43.56,43.69,18994400,10.92
    +1999-06-22,46.31,46.94,45.38,45.38,5415600,11.35
    +1999-06-21,47.00,47.25,46.00,46.50,4842000,11.62
    +1999-06-18,45.38,47.25,45.19,47.13,7448000,11.78
    +1999-06-17,47.63,48.00,45.75,46.38,8022400,11.60
    +1999-06-16,46.38,48.06,46.38,47.94,8056800,11.98
    +1999-06-15,45.19,46.75,45.13,46.06,4666400,11.52
    +1999-06-14,46.50,46.63,45.13,45.44,5615600,11.36
    +1999-06-11,48.13,48.50,46.25,46.44,6613600,11.61
    +1999-06-10,47.88,48.25,47.31,48.13,11325200,12.03
    +1999-06-09,47.44,48.50,47.44,48.44,12655200,12.11
    +1999-06-08,48.75,48.81,47.56,47.69,11203200,11.92
    +1999-06-07,48.13,49.00,47.50,48.94,14949200,12.23
    +1999-06-04,47.63,48.19,47.25,48.13,13171200,12.03
    +1999-06-03,46.88,48.00,46.81,47.44,17450800,11.86
    +1999-06-02,44.50,47.94,44.00,46.56,18614400,11.64
    +1999-06-01,45.00,45.31,44.38,44.81,16479200,11.20
    +1999-05-28,43.31,44.31,43.13,44.06,7196400,11.02
    +1999-05-27,43.19,43.75,42.69,43.50,12042400,10.88
    +1999-05-26,41.75,44.38,41.25,44.06,15642000,11.02
    +1999-05-25,41.56,42.44,40.94,41.50,13095200,10.38
    +1999-05-24,43.63,44.31,41.88,41.94,9340800,10.48
    +1999-05-21,43.00,44.31,42.56,43.94,16555200,10.98
    +1999-05-20,45.44,45.75,42.50,42.50,14940000,10.62
    +1999-05-19,45.50,45.75,43.50,45.19,10660000,11.30
    +1999-05-18,44.81,46.00,44.38,45.25,14954400,11.31
    +1999-05-17,43.75,44.69,43.00,44.38,7531200,11.10
    +1999-05-14,45.13,45.81,44.38,44.38,8102000,11.10
    +1999-05-13,46.44,46.81,45.50,46.19,10573600,11.55
    +1999-05-12,44.88,46.50,44.13,46.50,14129200,11.62
    +1999-05-11,44.88,46.19,43.56,44.75,16388800,11.19
    +1999-05-10,46.75,46.94,44.63,45.25,14055600,11.31
    +1999-05-07,44.63,45.88,42.75,45.88,15528800,11.47
    +1999-05-06,46.56,46.88,44.00,44.50,15486400,11.12
    +1999-05-05,46.31,47.00,44.63,47.00,20694400,11.75
    +1999-05-04,48.25,48.63,46.19,46.50,28980000,11.62
    +1999-05-03,46.06,50.00,45.75,49.56,52535600,12.39
    +1999-04-30,44.00,47.13,44.00,46.00,52596400,11.50
    +1999-04-29,43.25,44.38,41.78,43.00,28206400,10.75
    +1999-04-28,44.63,45.69,43.63,44.06,34122000,11.02
    +1999-04-27,43.00,45.81,43.00,45.75,75225200,11.44
    +1999-04-26,39.50,41.25,39.25,40.94,33152000,10.23
    +1999-04-23,36.25,39.44,36.25,39.19,37402400,9.80
    +1999-04-22,35.06,36.63,35.06,36.38,26454400,9.10
    +1999-04-21,34.00,34.38,33.50,34.38,12566800,8.60
    +1999-04-20,33.88,34.75,33.50,34.06,18725600,8.52
    +1999-04-19,35.69,36.00,33.50,33.88,32923200,8.47
    +1999-04-16,35.88,36.06,35.25,35.44,17945600,8.86
    +1999-04-15,35.38,36.19,34.31,35.75,61960000,8.94
    +1999-04-14,35.25,37.06,35.00,35.53,24323600,8.88
    +1999-04-13,36.31,36.81,34.50,34.63,14732400,8.66
    +1999-04-12,35.00,36.88,34.88,36.25,14145600,9.06
    +1999-04-09,36.25,37.25,35.94,36.75,9608000,9.19
    +1999-04-08,36.88,37.06,36.00,36.88,10600800,9.22
    +1999-04-07,38.06,38.25,36.38,37.13,14723200,9.28
    +1999-04-06,36.81,38.31,36.81,38.00,22455200,9.50
    +1999-04-05,36.00,37.88,36.00,37.06,16474400,9.27
    +1999-04-01,36.06,36.69,35.75,36.06,9381200,9.02
    +1999-03-31,36.38,37.13,35.88,35.94,15086400,8.98
    +1999-03-30,35.00,36.38,35.00,35.88,19806800,8.97
    +1999-03-29,33.50,35.44,33.44,35.38,20337600,8.85
    +1999-03-26,33.75,33.81,33.00,33.25,9080000,8.31
    +1999-03-25,34.38,34.88,33.38,33.81,14286800,8.45
    +1999-03-24,33.25,33.75,32.50,33.69,14297600,8.42
    +1999-03-23,34.44,34.44,32.75,33.00,14842000,8.25
    +1999-03-22,34.00,35.19,32.94,35.06,21200800,8.77
    +1999-03-19,35.94,36.00,32.88,33.50,19161200,8.38
    +1999-03-18,34.38,35.63,34.25,35.50,8126800,8.88
    +1999-03-17,35.94,36.06,33.94,34.06,13084400,8.52
    +1999-03-16,35.00,35.56,34.94,35.50,14302000,8.88
    +1999-03-15,33.31,35.00,33.25,34.06,12586800,8.52
    +1999-03-12,32.31,33.50,32.31,33.19,9700000,8.30
    +1999-03-11,32.25,33.88,32.00,32.19,16936800,8.05
    +1999-03-10,34.19,34.19,32.44,32.56,19526800,8.14
    +1999-03-09,34.31,34.38,33.50,34.13,11427600,8.53
    +1999-03-08,33.25,34.69,33.19,34.38,19682000,8.60
    +1999-03-05,34.31,34.31,32.38,33.19,16735600,8.30
    +1999-03-04,34.50,34.50,32.38,33.44,13137600,8.36
    +1999-03-03,34.75,35.13,33.50,34.19,10497600,8.55
    +1999-03-02,34.13,35.31,33.75,34.63,24414400,8.66
    +1999-03-01,34.81,34.81,33.63,33.75,17435200,8.44
    +1999-02-26,36.50,37.00,34.50,34.81,23847600,8.70
    +1999-02-25,37.31,37.69,36.50,36.94,9455600,9.23
    +1999-02-24,38.81,39.00,37.38,37.44,7620000,9.36
    +1999-02-23,38.56,39.56,37.94,38.44,11521200,9.61
    +1999-02-22,37.38,38.88,37.25,38.44,10682000,9.61
    +1999-02-19,36.25,37.69,36.19,37.19,12938800,9.30
    +1999-02-18,37.56,37.88,35.56,36.00,17876400,9.00
    +1999-02-17,38.13,38.69,36.94,37.00,10581200,9.25
    +1999-02-16,38.88,38.88,37.88,38.31,10723600,9.58
    +1999-02-12,39.13,39.13,37.00,37.69,15339200,9.42
    +1999-02-11,38.75,39.75,38.56,39.63,20200000,9.91
    +1999-02-10,36.88,38.69,36.00,38.31,20135200,9.58
    +1999-02-09,37.94,39.06,37.06,37.19,25042000,9.30
    +1999-02-08,36.69,37.94,36.25,37.75,16723600,9.44
    +1999-02-05,38.25,38.38,35.50,36.31,27778000,9.08
    +1999-02-04,40.19,40.25,37.75,37.88,16565600,9.47
    +1999-02-03,39.00,40.56,38.75,40.19,12108000,10.05
    +1999-02-02,40.38,40.75,39.00,39.19,10975600,9.80
    +1999-02-01,41.69,41.94,40.31,40.94,9962000,10.23
    +1999-01-29,41.19,41.56,40.00,41.19,8684400,10.30
    +1999-01-28,40.88,41.25,40.31,40.88,12015600,10.22
    +1999-01-27,41.00,41.38,39.94,40.13,13053200,10.03
    +1999-01-26,39.94,40.88,39.63,40.50,20002400,10.12
    +1999-01-25,39.25,39.56,38.81,39.38,13763200,9.85
    +1999-01-22,37.69,39.50,37.06,38.75,12365200,9.69
    +1999-01-21,40.44,40.56,37.50,38.81,21449200,9.70
    +1999-01-20,41.06,42.00,40.50,40.56,27806800,10.14
    +1999-01-19,41.94,42.31,40.38,40.88,19116400,10.22
    +1999-01-15,41.81,42.13,40.00,41.31,35933600,10.33
    +1999-01-14,45.50,46.00,41.06,41.38,61570000,10.35
    +1999-01-13,42.88,47.31,42.25,46.50,37434400,11.62
    +1999-01-12,46.31,46.63,44.13,46.13,29330000,11.53
    +1999-01-11,45.75,46.06,44.88,45.88,20054400,11.47
    +1999-01-08,46.56,46.88,44.00,45.00,24246400,11.25
    +1999-01-07,42.25,45.06,42.13,45.00,51056800,11.25
    +1999-01-06,44.13,44.13,41.00,41.75,48165200,10.44
    +1999-01-05,41.94,43.94,41.50,43.31,50362000,10.83
    +1999-01-04,42.13,42.25,40.00,41.25,34049200,10.31
    +1998-12-31,40.50,41.38,39.50,40.94,9716400,10.23
    +1998-12-30,40.13,41.13,40.00,40.06,8498000,10.02
    +1998-12-29,41.13,41.50,40.25,40.81,13853200,10.20
    +1998-12-28,39.00,41.13,39.00,40.88,25917600,10.22
    +1998-12-24,39.88,40.00,39.19,39.25,7155200,9.81
    +1998-12-23,38.63,40.50,38.38,39.81,44124400,9.95
    +1998-12-22,36.38,38.13,36.00,38.00,41111200,9.50
    +1998-12-21,35.38,35.63,34.25,35.06,12769200,8.77
    +1998-12-18,33.38,35.38,33.25,35.19,28283200,8.80
    +1998-12-17,32.94,33.75,32.75,33.44,11812000,8.36
    +1998-12-16,33.75,34.19,32.63,32.81,13375200,8.20
    +1998-12-15,32.75,33.63,32.75,33.56,9462000,8.39
    +1998-12-14,32.88,33.31,32.25,32.50,17925200,8.12
    +1998-12-11,32.25,34.00,32.00,33.75,24644400,8.44
    +1998-12-10,32.69,32.94,31.87,32.00,13980800,8.00
    +1998-12-09,32.69,32.88,31.62,32.00,21184400,8.00
    +1998-12-08,33.94,33.94,32.00,32.06,24295200,8.02
    +1998-12-07,33.38,33.75,32.75,33.75,20255600,8.44
    +1998-12-04,34.31,34.44,32.00,32.75,25765200,8.19
    +1998-12-03,36.31,36.50,33.63,33.69,22380800,8.42
    +1998-12-02,34.13,36.88,33.50,36.00,34382400,9.00
    +1998-12-01,32.00,34.81,31.62,34.13,30941200,8.53
    +1998-11-30,34.56,34.81,31.75,31.94,20060800,7.99
    +1998-11-27,35.06,35.13,34.75,35.06,5483600,8.77
    +1998-11-25,35.88,36.06,34.94,35.13,10855600,8.78
    +1998-11-24,36.13,36.75,35.75,35.94,11430800,8.98
    +1998-11-23,35.56,36.81,35.19,36.25,20642000,9.06
    +1998-11-20,36.44,36.75,34.75,35.31,14268000,8.83
    +1998-11-19,35.50,37.19,35.44,35.75,12385200,8.94
    +1998-11-18,35.19,36.00,34.88,35.44,11781200,8.86
    +1998-11-17,35.75,35.81,34.75,34.81,7529200,8.70
    +1998-11-16,35.94,36.75,35.44,36.00,13740800,9.00
    +1998-11-13,34.94,36.06,34.69,35.69,28301200,8.92
    +1998-11-12,33.13,34.44,32.88,34.00,21261200,8.50
    +1998-11-11,35.75,35.81,32.75,33.56,33895200,8.39
    +1998-11-10,36.19,36.25,35.00,35.13,31576800,8.78
    +1998-11-09,37.69,38.13,35.50,36.63,23622000,9.16
    +1998-11-06,37.88,38.25,37.25,38.06,28496800,9.52
    +1998-11-05,38.38,39.38,38.06,38.19,21684400,9.55
    +1998-11-04,38.56,39.13,38.13,38.69,22438000,9.67
    +1998-11-03,37.38,38.25,37.31,37.81,13247600,9.45
    +1998-11-02,37.50,37.75,37.25,37.63,9076400,9.41
    +1998-10-30,36.81,37.50,36.25,37.13,11358000,9.28
    +1998-10-29,36.44,37.44,35.81,36.44,12321200,9.11
    +1998-10-28,35.25,37.00,35.13,36.81,13006400,9.20
    +1998-10-27,38.00,38.94,35.06,35.25,19233200,8.81
    +1998-10-26,36.06,37.75,35.50,37.44,17013600,9.36
    +1998-10-23,36.75,36.88,35.13,35.50,12732400,8.88
    +1998-10-22,36.88,37.63,36.25,36.75,11343200,9.19
    +1998-10-21,36.75,37.44,35.75,37.13,15390000,9.28
    +1998-10-20,37.94,38.19,36.00,36.06,13649200,9.02
    +1998-10-19,36.69,38.06,35.88,37.50,17010000,9.38
    +1998-10-16,37.13,38.06,36.50,36.69,21998000,9.17
    +1998-10-15,36.25,37.25,35.50,36.63,30037600,9.16
    +1998-10-14,39.75,41.31,36.81,37.38,81445600,9.35
    +1998-10-13,38.06,39.19,36.00,38.75,33646400,9.69
    +1998-10-12,37.50,38.44,36.56,37.44,22250000,9.36
    +1998-10-09,31.75,35.25,30.75,35.13,23880000,8.78
    +1998-10-08,31.00,31.19,28.50,30.81,24623200,7.70
    +1998-10-07,32.38,33.31,31.87,31.94,16920000,7.99
    +1998-10-06,33.69,34.31,32.50,32.56,14281200,8.14
    +1998-10-05,34.00,34.56,31.50,32.19,19726800,8.05
    +1998-10-02,35.50,36.25,34.13,35.06,16998800,8.77
    +1998-10-01,36.75,38.00,35.38,35.69,13234400,8.92
    +1998-09-30,38.75,39.25,38.00,38.13,5976800,9.53
    +1998-09-29,39.06,40.00,38.13,39.50,10907600,9.88
    +1998-09-28,39.75,40.19,38.00,39.06,14501200,9.77
    +1998-09-25,38.19,39.19,37.63,38.75,8172000,9.69
    +1998-09-24,37.88,39.56,37.75,38.50,17246800,9.62
    +1998-09-23,37.25,38.38,36.56,38.31,10284400,9.58
    +1998-09-22,37.13,37.63,36.38,37.00,9218800,9.25
    +1998-09-21,35.69,36.94,35.31,36.94,10570800,9.23
    +1998-09-18,36.06,36.75,35.56,36.75,10904400,9.19
    +1998-09-17,36.06,37.13,35.88,36.00,9627600,9.00
    +1998-09-16,38.63,38.75,37.00,37.31,9248800,9.33
    +1998-09-15,36.75,38.56,36.50,38.19,15492000,9.55
    +1998-09-14,38.25,38.81,37.13,37.19,8837600,9.30
    +1998-09-11,38.50,39.63,36.88,37.63,12593600,9.41
    +1998-09-10,36.25,38.25,35.75,38.13,18826800,9.53
    +1998-09-09,38.06,38.13,37.00,37.38,12683200,9.35
    +1998-09-08,38.00,38.25,36.75,38.25,14400000,9.56
    +1998-09-04,35.50,36.44,33.75,35.13,13493200,8.78
    +1998-09-03,35.00,35.13,34.00,34.63,14653200,8.66
    +1998-09-02,35.50,37.38,35.25,35.56,30122400,8.89
    +1998-09-01,31.37,35.38,30.62,34.13,31060000,8.53
    +1998-08-31,34.75,34.88,31.00,31.19,31012400,7.80
    +1998-08-28,37.13,38.50,34.13,34.19,33303200,8.55
    +1998-08-27,39.25,39.25,35.63,37.50,39813600,9.38
    +1998-08-26,39.88,41.13,39.50,40.38,14538000,10.10
    +1998-08-25,42.38,42.38,40.31,40.81,17709200,10.20
    +1998-08-24,43.44,43.50,40.13,41.19,21810000,10.30
    +1998-08-21,40.00,43.56,39.00,43.00,29054400,10.75
    +1998-08-20,41.00,41.13,40.25,40.63,14018000,10.16
    +1998-08-19,43.50,43.75,41.00,41.00,17377600,10.25
    +1998-08-18,42.44,43.38,42.25,42.56,21642000,10.64
    +1998-08-17,41.00,42.81,39.88,41.94,33248800,10.48
    +1998-08-14,40.69,40.75,39.50,40.50,16110000,10.12
    +1998-08-13,39.94,40.75,39.38,39.44,13976800,9.86
    +1998-08-12,39.75,40.94,39.48,40.06,24654400,10.02
    +1998-08-11,37.75,41.00,37.38,39.00,62860000,9.75
    +1998-08-10,36.31,38.06,36.25,37.94,17455600,9.48
    +1998-08-07,37.19,37.38,36.00,36.50,10645600,9.12
    +1998-08-06,35.06,36.88,34.88,36.88,15678800,9.22
    +1998-08-05,33.75,36.00,33.50,36.00,16226800,9.00
    +1998-08-04,35.50,36.00,34.00,34.19,10506800,8.55
    +1998-08-03,34.25,35.56,33.25,35.13,10786800,8.78
    +1998-07-31,36.63,36.75,34.50,34.63,6550800,8.66
    +1998-07-30,35.81,36.75,35.50,36.50,12950000,9.12
    +1998-07-29,33.75,35.88,33.69,35.13,16006800,8.78
    +1998-07-28,34.06,34.63,33.00,33.63,8054400,8.41
    +1998-07-27,34.25,34.88,33.25,34.44,7657600,8.61
    +1998-07-24,35.38,35.50,33.81,34.69,9693600,8.67
    +1998-07-23,34.81,35.63,34.75,34.94,9040800,8.73
    +1998-07-22,34.94,35.63,34.25,35.00,10040800,8.75
    +1998-07-21,36.13,37.00,35.56,35.63,11772400,8.91
    +1998-07-20,36.56,36.63,35.50,36.25,13727600,9.06
    +1998-07-17,37.25,37.25,36.19,36.88,22486400,9.22
    +1998-07-16,37.88,38.13,35.75,37.50,91497600,9.38
    +1998-07-15,33.69,34.69,33.50,34.44,21253600,8.61
    +1998-07-14,33.94,34.00,33.13,33.44,19607600,8.36
    +1998-07-13,31.94,34.13,31.87,33.94,25566400,8.48
    +1998-07-10,32.19,32.63,31.75,32.06,10806800,8.02
    +1998-07-09,32.94,33.63,31.44,31.69,20256400,7.92
    +1998-07-08,30.75,32.94,30.69,32.56,33334400,8.14
    +1998-07-07,30.37,30.87,30.00,30.50,8637600,7.62
    +1998-07-06,29.50,30.37,29.12,30.37,9697600,7.59
    +1998-07-02,29.69,30.06,29.00,29.00,10650800,7.25
    +1998-07-01,28.87,30.00,28.50,29.94,11228800,7.49
    +1998-06-30,28.62,28.81,28.12,28.69,4681200,7.17
    +1998-06-29,28.25,28.81,28.06,28.69,5943600,7.17
    +1998-06-26,28.50,28.62,27.75,28.19,3973200,7.05
    +1998-06-25,28.56,28.81,28.31,28.56,6856400,7.14
    +1998-06-24,27.75,28.62,27.31,28.25,9788800,7.06
    +1998-06-23,27.44,28.12,27.25,27.81,8258800,6.95
    +1998-06-22,27.00,27.56,26.75,27.37,4809200,6.84
    +1998-06-19,27.37,27.44,26.75,27.06,4931200,6.76
    +1998-06-18,27.75,28.06,27.19,27.31,4288800,6.83
    +1998-06-17,28.00,28.56,27.94,28.12,6687600,7.03
    +1998-06-16,27.69,28.12,27.31,28.00,4649200,7.00
    +1998-06-15,27.25,28.25,27.25,27.50,4881200,6.88
    +1998-06-12,27.62,28.25,27.37,28.12,8014400,7.03
    +1998-06-11,28.19,28.62,27.81,27.81,6451200,6.95
    +1998-06-10,28.00,29.00,27.62,28.06,8202000,7.01
    +1998-06-09,27.37,28.50,27.37,28.25,9852400,7.06
    +1998-06-08,27.00,27.69,26.81,27.25,4523600,6.81
    +1998-06-05,26.87,27.25,26.37,26.87,4406800,6.72
    +1998-06-04,26.62,26.87,25.81,26.81,5585600,6.70
    +1998-06-03,27.12,27.25,26.19,26.31,5196800,6.58
    +1998-06-02,26.44,27.31,26.00,26.87,6405600,6.72
    +1998-06-01,26.50,27.62,25.62,26.25,11427600,6.56
    +1998-05-29,27.50,27.56,26.44,26.62,7751200,6.66
    +1998-05-28,26.75,27.87,26.75,27.44,10672000,6.86
    +1998-05-27,25.69,26.81,25.62,26.75,13233200,6.69
    +1998-05-26,28.06,28.25,26.62,26.69,11143200,6.67
    +1998-05-22,28.75,28.75,27.31,27.87,9522000,6.97
    +1998-05-21,29.56,29.69,28.62,28.87,4700000,7.22
    +1998-05-20,29.62,29.87,28.75,29.56,6810000,7.39
    +1998-05-19,28.94,29.44,28.81,29.37,7815200,7.34
    +1998-05-18,29.37,29.56,28.37,28.50,8310800,7.12
    +1998-05-15,30.06,30.37,29.25,29.56,9743600,7.39
    +1998-05-14,30.37,30.44,29.75,30.06,5815600,7.51
    +1998-05-13,30.06,30.81,29.62,30.44,11245600,7.61
    +1998-05-12,30.56,30.75,29.94,30.12,9212000,7.53
    +1998-05-11,30.87,31.62,30.75,30.94,23768000,7.74
    +1998-05-08,30.06,30.50,29.94,30.44,9690000,7.61
    +1998-05-07,30.56,30.62,29.87,30.19,19761200,7.55
    +1998-05-06,29.87,30.44,29.25,30.31,32056400,7.58
    +1998-05-05,29.25,29.87,29.12,29.69,14982400,7.42
    +1998-05-04,28.87,29.50,28.87,29.06,20419200,7.26
    +1998-05-01,27.50,28.25,26.87,28.00,6582000,7.00
    +1998-04-30,27.37,27.62,27.06,27.37,6442000,6.84
    +1998-04-29,26.94,27.44,26.75,27.00,6774400,6.75
    +1998-04-28,27.87,28.00,26.25,26.94,8487600,6.74
    +1998-04-27,26.75,27.75,26.75,27.75,14655600,6.94
    +1998-04-24,27.75,28.25,27.50,27.94,7708000,6.99
    +1998-04-23,27.44,29.00,27.19,27.69,16983200,6.92
    +1998-04-22,28.75,29.00,27.50,27.50,10186400,6.88
    +1998-04-21,29.06,29.12,28.50,29.00,12446400,7.25
    +1998-04-20,27.62,29.50,27.56,29.00,18498800,7.25
    +1998-04-17,28.56,28.62,27.69,27.94,21165200,6.99
    +1998-04-16,29.25,29.62,28.19,28.62,65642000,7.16
    +1998-04-15,27.19,27.50,26.62,27.44,19928800,6.86
    +1998-04-14,26.37,27.25,26.37,26.94,11725200,6.74
    +1998-04-13,25.62,26.69,25.00,26.44,10305600,6.61
    +1998-04-09,25.06,25.87,25.00,25.62,6083600,6.41
    +1998-04-08,25.25,25.37,24.69,25.00,8044400,6.25
    +1998-04-07,25.81,26.00,24.87,25.50,10461200,6.38
    +1998-04-06,27.00,27.00,26.19,26.25,12422000,6.56
    +1998-04-03,27.12,27.25,26.81,27.06,7259200,6.76
    +1998-04-02,27.31,27.44,26.94,27.31,6950800,6.83
    +1998-04-01,27.44,27.81,27.06,27.50,6693600,6.88
    +1998-03-31,27.44,27.81,27.25,27.50,9538800,6.88
    +1998-03-30,26.75,27.50,26.75,27.44,8972400,6.86
    +1998-03-27,26.62,27.31,26.37,26.94,9133200,6.74
    +1998-03-26,26.75,27.00,26.44,26.56,7253600,6.64
    +1998-03-25,27.62,27.75,26.37,27.16,13854400,6.79
    +1998-03-24,26.37,28.00,26.25,28.00,24152000,7.00
    +1998-03-23,25.94,26.25,24.62,26.12,14818800,6.53
    +1998-03-20,26.69,26.87,26.00,26.37,7704400,6.59
    +1998-03-19,26.87,26.94,26.56,26.75,5736800,6.69
    +1998-03-18,26.00,26.94,26.00,26.94,9900000,6.74
    +1998-03-17,26.50,26.69,25.87,26.34,14658800,6.59
    +1998-03-16,27.12,27.25,26.19,26.69,14375600,6.67
    +1998-03-13,27.25,27.25,26.25,27.12,20231200,6.78
    +1998-03-12,26.12,27.00,25.56,27.00,26598000,6.75
    +1998-03-11,25.12,26.19,24.56,26.12,43374400,6.53
    +1998-03-10,23.00,24.50,22.94,24.06,25472400,6.01
    +1998-03-09,23.75,24.31,22.50,22.75,20540800,5.69
    +1998-03-06,23.87,24.50,23.37,24.44,23803600,6.11
    +1998-03-05,23.25,24.25,23.12,24.06,24129200,6.01
    +1998-03-04,22.87,24.75,22.87,24.44,29212400,6.11
    +1998-03-03,21.87,23.19,21.62,23.12,11937600,5.78
    +1998-03-02,23.56,23.56,22.25,22.75,14313600,5.69
    +1998-02-27,23.31,23.87,22.56,23.62,18578000,5.91
    +1998-02-26,22.31,23.56,21.87,23.50,21263200,5.88
    +1998-02-25,21.31,22.75,20.94,22.31,25459200,5.58
    +1998-02-24,21.31,21.37,20.75,21.31,16322000,5.33
    +1998-02-23,20.12,21.62,20.00,21.25,17060800,5.31
    +1998-02-20,20.50,20.56,19.81,20.00,11634400,5.00
    +1998-02-19,20.87,20.94,20.00,20.44,14292400,5.11
    +1998-02-18,19.56,20.75,19.56,20.56,17677600,5.14
    +1998-02-17,19.50,19.75,19.50,19.62,6530800,4.91
    +1998-02-13,19.19,19.87,19.00,19.50,7444400,4.88
    +1998-02-12,19.12,19.44,19.06,19.37,7297600,4.84
    +1998-02-11,19.50,19.50,18.87,19.00,7582000,4.75
    +1998-02-10,19.12,19.56,19.06,19.44,15090000,4.86
    +1998-02-09,18.37,19.50,18.37,19.19,17682000,4.80
    +1998-02-06,18.37,18.69,18.25,18.50,7241200,4.62
    +1998-02-05,18.25,18.50,18.00,18.31,8526400,4.58
    +1998-02-04,18.06,18.50,18.00,18.25,6100000,4.56
    +1998-02-03,17.69,18.62,17.69,18.31,14390000,4.58
    +1998-02-02,18.50,18.50,17.37,17.69,22752400,4.42
    +1998-01-30,18.31,18.87,18.25,18.31,5802400,4.58
    +1998-01-29,18.94,19.12,18.50,18.50,7571200,4.62
    +1998-01-28,19.19,19.37,18.62,19.19,5418000,4.80
    +1998-01-27,19.19,19.69,19.00,19.12,4013200,4.78
    +1998-01-26,19.44,19.56,18.81,19.44,5246800,4.86
    +1998-01-23,19.37,19.69,19.25,19.50,8331200,4.88
    +1998-01-22,18.69,19.75,18.62,19.25,11785200,4.81
    +1998-01-21,18.75,19.06,18.56,18.91,6812000,4.73
    +1998-01-20,19.06,19.31,18.62,19.06,8642400,4.76
    +1998-01-16,19.44,19.44,18.69,18.81,8820000,4.70
    +1998-01-15,19.19,19.75,18.62,19.19,19982000,4.80
    +1998-01-14,19.87,19.94,19.25,19.75,21048000,4.94
    +1998-01-13,18.62,19.62,18.50,19.50,22758800,4.88
    +1998-01-12,17.44,18.62,17.12,18.25,18444400,4.56
    +1998-01-09,18.12,19.37,17.50,18.19,31675200,4.55
    +1998-01-08,17.44,18.62,16.94,18.19,27645600,4.55
    +1998-01-07,18.81,19.00,17.31,17.50,37201200,4.38
    +1998-01-06,15.94,20.00,14.75,18.94,64737600,4.74
    +1998-01-05,16.50,16.56,15.19,15.88,23282000,3.97
    +1998-01-02,13.63,16.25,13.50,16.25,25650800,4.06
    +1997-12-31,13.13,13.63,12.94,13.13,14531200,3.28
    +1997-12-30,13.00,13.44,12.75,13.19,12250800,3.30
    +1997-12-29,13.31,13.44,12.88,13.13,9944400,3.28
    +1997-12-26,13.06,13.38,13.00,13.31,3860000,3.33
    +1997-12-24,13.00,13.25,13.00,13.13,3502000,3.28
    +1997-12-23,13.13,13.31,12.94,12.94,16402000,3.23
    +1997-12-22,13.88,14.00,13.19,13.31,5704400,3.33
    +1997-12-19,13.56,13.88,13.25,13.69,6812000,3.42
    +1997-12-18,14.00,14.00,13.75,13.81,7225200,3.45
    +1997-12-17,14.31,14.56,13.94,13.94,9494400,3.48
    +1997-12-16,14.00,14.38,14.00,14.31,6646400,3.58
    +1997-12-15,14.13,14.25,13.75,13.94,5927600,3.48
    +1997-12-12,14.75,14.88,14.00,14.13,5742400,3.53
    +1997-12-11,14.44,14.56,13.88,14.56,9185600,3.64
    +1997-12-10,15.06,15.06,14.50,14.75,6960000,3.69
    +1997-12-09,15.50,15.69,15.00,15.25,8680800,3.81
    +1997-12-08,15.56,15.75,15.38,15.56,4776800,3.89
    +1997-12-05,15.56,16.00,15.56,15.81,7926400,3.95
    +1997-12-04,16.00,16.00,15.63,15.63,7135600,3.91
    +1997-12-03,16.06,16.12,15.69,15.75,12258800,3.94
    +1997-12-02,17.37,17.50,15.88,15.88,14178800,3.97
    +1997-12-01,17.69,17.94,17.25,17.75,3135600,4.44
    +1997-11-28,17.62,17.87,17.44,17.75,1495600,4.44
    +1997-11-26,17.37,17.69,17.25,17.50,2178800,4.38
    +1997-11-25,17.69,17.87,16.87,17.37,7346400,4.34
    +1997-11-24,17.56,18.00,17.50,17.62,5630800,4.41
    +1997-11-21,18.62,18.69,18.00,18.19,3498800,4.55
    +1997-11-20,18.19,18.62,18.12,18.50,4587600,4.62
    +1997-11-19,17.87,18.31,17.87,18.25,2843600,4.56
    +1997-11-18,18.50,18.50,18.06,18.06,5258000,4.51
    +1997-11-17,18.87,18.94,18.33,18.50,7323600,4.62
    +1997-11-14,18.25,18.50,18.00,18.44,4835600,4.61
    +1997-11-13,18.00,18.06,17.50,18.00,9218000,4.50
    +1997-11-12,18.06,18.50,17.56,17.62,7448000,4.41
    +1997-11-11,19.00,19.00,18.12,18.37,11893600,4.59
    +1997-11-10,21.00,21.50,18.50,18.69,49946800,4.67
    +1997-11-07,18.87,20.00,18.75,19.75,28423200,4.94
    +1997-11-06,18.87,19.50,18.87,19.00,22060800,4.75
    +1997-11-05,18.25,18.62,18.06,18.37,13840000,4.59
    +1997-11-04,17.75,18.12,17.50,17.94,6033200,4.49
    +1997-11-03,17.56,17.75,17.06,17.37,4512000,4.34
    +1997-10-31,17.37,17.37,16.62,17.03,9549200,4.26
    +1997-10-30,17.06,17.56,16.50,16.50,6764400,4.12
    +1997-10-29,18.44,18.50,17.25,17.50,6355200,4.38
    +1997-10-28,16.00,18.50,15.88,18.12,12273200,4.53
    +1997-10-27,16.75,18.12,16.75,16.75,11764400,4.19
    +1997-10-24,18.12,18.37,16.50,16.56,13880000,4.14
    +1997-10-23,18.00,18.19,17.75,17.75,6688000,4.44
    +1997-10-22,19.06,19.25,18.50,18.56,5421200,4.64
    +1997-10-21,18.87,19.31,18.69,19.06,16982000,4.76
    +1997-10-20,20.12,20.19,18.62,18.69,14724400,4.67
    +1997-10-17,21.12,21.12,19.87,20.12,15682000,5.03
    +1997-10-16,21.12,22.06,20.87,21.50,26422000,5.38
    +1997-10-15,22.12,24.75,22.12,23.81,28982000,5.95
    +1997-10-14,22.69,22.75,22.19,22.69,5923200,5.67
    +1997-10-13,22.75,22.87,22.19,22.69,5679200,5.67
    +1997-10-10,21.50,22.75,21.50,22.69,9666800,5.67
    +1997-10-09,21.25,22.50,21.19,21.75,6696400,5.44
    +1997-10-08,21.75,21.81,21.31,21.50,3891200,5.38
    +1997-10-07,21.87,22.00,21.81,21.81,3916400,5.45
    +1997-10-06,22.19,22.25,21.69,21.94,3338800,5.49
    +1997-10-03,22.00,22.25,21.69,22.12,5813200,5.53
    +1997-10-02,21.44,22.00,21.37,21.94,4856400,5.49
    +1997-10-01,21.69,21.75,21.37,21.53,4670800,5.38
    +1997-09-30,22.00,22.31,21.69,21.69,5032000,5.42
    +1997-09-29,21.69,22.25,21.56,22.06,5980000,5.51
    +1997-09-26,21.50,21.94,21.12,21.31,7440000,5.33
    +1997-09-25,21.31,21.75,21.00,21.12,7988000,5.28
    +1997-09-24,21.69,21.75,21.37,21.50,7957600,5.38
    +1997-09-23,22.25,22.25,21.69,21.75,7163200,5.44
    +1997-09-22,22.12,23.06,22.00,22.81,7176400,5.70
    +1997-09-19,22.19,22.19,21.75,21.94,3407600,5.49
    +1997-09-18,21.50,22.50,21.50,22.31,6042400,5.58
    +1997-09-17,22.00,22.00,21.69,21.81,3109200,5.45
    +1997-09-16,22.06,22.14,21.75,21.94,4812400,5.49
    +1997-09-15,21.87,22.12,21.50,21.50,3473200,5.38
    +1997-09-12,22.19,22.25,21.44,22.06,4071200,5.51
    +1997-09-11,22.87,23.00,22.06,22.37,7504400,5.59
    +1997-09-10,21.75,23.12,21.69,22.94,9803600,5.74
    +1997-09-09,21.31,21.87,21.25,21.81,5702000,5.45
    +1997-09-08,22.25,22.25,21.44,21.50,6264400,5.38
    +1997-09-05,22.62,22.87,22.00,22.19,4883600,5.55
    +1997-09-04,22.56,22.87,22.25,22.50,4385600,5.62
    +1997-09-03,22.37,23.25,22.31,22.50,10163200,5.62
    +1997-09-02,22.00,22.56,21.94,22.37,6646800,5.59
    +1997-08-29,21.81,22.00,21.50,21.75,3937600,5.44
    +1997-08-28,22.12,22.50,22.00,22.00,3426400,5.50
    +1997-08-27,22.37,22.75,21.87,22.69,6813200,5.67
    +1997-08-26,22.62,23.00,22.12,22.25,8100800,5.56
    +1997-08-25,23.62,23.69,22.94,23.06,4968800,5.76
    +1997-08-22,23.44,24.00,23.37,23.62,8135200,5.91
    +1997-08-21,24.50,24.69,23.87,24.00,9271200,6.00
    +1997-08-20,24.44,25.12,24.19,24.62,11595200,6.16
    +1997-08-19,23.69,24.50,23.31,24.44,10331200,6.11
    +1997-08-18,23.31,23.75,22.75,23.62,7791200,5.91
    +1997-08-15,23.12,23.44,22.81,23.25,9320000,5.81
    +1997-08-14,23.62,24.25,22.69,23.00,15536400,5.75
    +1997-08-13,22.25,23.87,20.44,23.62,42923600,5.91
    +1997-08-12,24.06,24.25,21.87,22.06,37444400,5.51
    +1997-08-11,26.31,26.44,23.50,24.56,55411200,6.14
    +1997-08-08,27.81,28.37,26.12,26.81,64809200,6.70
    +1997-08-07,28.75,29.56,28.37,29.19,134124400,7.30
    +1997-08-06,25.25,27.75,25.00,26.31,149671200,6.58
    +1997-08-05,19.94,20.00,19.48,19.75,8840800,4.94
    +1997-08-04,19.19,19.81,19.19,19.75,21851200,4.94
    +1997-08-01,17.62,19.19,17.56,19.19,17217600,4.80
    +1997-07-31,17.37,17.75,17.25,17.50,9434400,4.38
    +1997-07-30,16.94,17.69,16.75,17.37,13372400,4.34
    +1997-07-29,16.44,16.62,16.37,16.50,2558000,4.12
    +1997-07-28,16.44,16.50,16.25,16.44,3962000,4.11
    +1997-07-25,15.88,16.56,15.75,16.25,7798000,4.06
    +1997-07-24,16.12,16.12,15.63,15.81,4772000,3.95
    +1997-07-23,16.75,16.87,16.00,16.12,5049200,4.03
    +1997-07-22,16.37,16.69,16.31,16.56,8274400,4.14
    +1997-07-21,17.56,17.69,16.00,16.16,12695600,4.04
    +1997-07-18,17.87,17.94,17.06,17.34,11353600,4.34
    +1997-07-17,17.00,18.12,16.44,17.50,26659200,4.38
    +1997-07-16,15.81,16.50,15.63,16.44,15947600,4.11
    +1997-07-15,15.75,16.00,15.63,15.94,14953200,3.98
    +1997-07-14,15.25,15.63,14.88,15.63,14700800,3.91
    +1997-07-11,13.38,15.50,13.31,15.19,26252400,3.80
    +1997-07-10,12.88,13.38,12.75,13.25,17606400,3.31
    +1997-07-09,13.81,13.88,13.63,13.69,5090000,3.42
    +1997-07-08,13.88,14.00,13.69,13.75,3427600,3.44
    +1997-07-07,13.94,14.25,13.75,13.81,6860000,3.45
    +1997-07-03,13.13,13.88,13.00,13.69,6688000,3.42
    +1997-07-02,13.25,13.38,13.00,13.06,8931200,3.27
    +1997-07-01,13.94,14.00,13.13,13.19,16104400,3.30
    +1997-06-30,14.75,14.75,14.00,14.25,6132400,3.56
    +1997-06-27,14.69,14.81,14.63,14.69,5642000,3.67
    +1997-06-26,15.13,15.13,14.63,14.69,13643600,3.67
    +1997-06-25,15.31,15.38,15.00,15.13,7102000,3.78
    +1997-06-24,15.44,15.56,15.25,15.31,3974800,3.83
    +1997-06-23,15.50,15.63,15.38,15.38,3574800,3.85
    +1997-06-20,15.69,15.75,15.50,15.56,3943600,3.89
    +1997-06-19,16.00,16.00,15.69,15.75,4323600,3.94
    +1997-06-18,16.12,16.25,15.75,15.94,3936400,3.98
    +1997-06-17,15.56,16.50,15.50,16.34,5080800,4.09
    +1997-06-16,15.88,15.88,15.38,15.50,4800800,3.88
    +1997-06-13,16.06,16.12,15.75,15.81,4737600,3.95
    +1997-06-12,16.37,16.37,16.00,16.06,2816400,4.01
    +1997-06-11,16.31,16.44,16.25,16.31,3766800,4.08
    +1997-06-10,16.75,16.75,16.06,16.25,4969200,4.06
    +1997-06-09,16.69,16.94,16.62,16.62,2689200,4.16
    +1997-06-06,16.62,16.75,16.50,16.75,1893200,4.19
    +1997-06-05,16.62,17.12,16.56,16.69,2323200,4.17
    +1997-06-04,16.62,16.75,16.50,16.62,2889200,4.16
    +1997-06-03,16.75,16.94,16.62,16.69,2335600,4.17
    +1997-06-02,17.00,17.00,16.75,16.94,1488000,4.24
    +1997-05-30,16.50,17.00,16.37,16.62,6340800,4.16
    +1997-05-29,17.12,17.12,16.62,16.62,3976800,4.16
    +1997-05-28,17.37,17.50,17.00,17.00,3130000,4.25
    +1997-05-27,16.75,17.37,16.75,17.25,2938000,4.31
    +1997-05-23,16.62,17.00,16.62,16.87,2413200,4.22
    +1997-05-22,16.75,16.87,16.50,16.62,2753600,4.16
    +1997-05-21,17.12,17.12,16.50,16.87,4369200,4.22
    +1997-05-20,17.00,17.44,16.75,17.25,3046400,4.31
    +1997-05-19,17.50,17.62,17.00,17.00,1881200,4.25
    +1997-05-16,17.50,17.62,17.25,17.25,3338800,4.31
    +1997-05-15,17.75,18.00,17.50,17.75,3544800,4.44
    +1997-05-14,17.87,18.00,17.50,17.69,4846800,4.42
    +1997-05-13,17.50,17.87,17.00,17.56,7056800,4.39
    +1997-05-12,17.25,17.62,17.00,17.56,5898800,4.39
    +1997-05-09,17.00,17.50,17.00,17.06,6732000,4.26
    +1997-05-08,16.62,17.12,16.50,17.00,2963200,4.25
    +1997-05-07,16.87,17.00,16.37,16.50,4101200,4.12
    +1997-05-06,17.00,17.12,16.75,16.87,2974800,4.22
    +1997-05-05,17.00,17.12,16.75,17.00,3538800,4.25
    +1997-05-02,17.00,17.12,16.75,17.00,3643600,4.25
    +1997-05-01,16.87,17.12,16.75,17.00,2596800,4.25
    +1997-04-30,17.00,17.25,16.75,17.00,9202000,4.25
    +1997-04-29,18.00,18.00,17.50,17.69,1853200,4.42
    +1997-04-28,17.75,17.87,17.50,17.62,1687600,4.41
    +1997-04-25,17.62,17.87,17.37,17.50,3121200,4.38
    +1997-04-24,18.50,18.50,17.75,17.87,2696800,4.47
    +1997-04-23,18.37,18.50,18.12,18.12,1960800,4.53
    +1997-04-22,18.12,18.50,17.87,18.50,3392000,4.62
    +1997-04-21,18.62,18.62,18.00,18.00,3197600,4.50
    +1997-04-18,19.12,19.12,18.37,18.37,5058000,4.59
    +1997-04-17,18.25,19.12,18.12,19.00,7859200,4.75
    +1997-04-16,18.62,19.00,18.37,18.56,3101200,4.64
    +1997-04-15,19.12,19.25,18.12,18.44,4869200,4.61
    +1997-04-14,18.37,18.87,18.00,18.75,4020000,4.69
    +1997-04-11,18.87,18.87,18.12,18.25,2842400,4.56
    +1997-04-10,19.00,19.12,18.50,18.87,4188000,4.72
    +1997-04-09,19.25,19.25,18.87,19.00,8766400,4.75
    +1997-04-08,19.62,19.62,18.62,19.12,6923600,4.78
    +1997-04-07,19.75,19.87,19.25,19.50,9136800,4.88
    +1997-04-04,19.12,19.62,19.00,19.25,16980800,4.81
    +1997-04-03,18.50,19.12,18.25,18.87,19603200,4.72
    +1997-04-02,17.87,18.06,17.62,18.00,7957600,4.50
    +1997-04-01,17.62,17.81,17.37,17.50,7881200,4.38
    +1997-03-31,18.62,19.37,17.25,18.25,34658000,4.56
    +1997-03-27,17.50,19.25,17.25,18.62,40695200,4.66
    +1997-03-26,16.37,16.87,16.25,16.75,3824400,4.19
    +1997-03-25,16.62,16.62,16.08,16.50,4031200,4.12
    +1997-03-24,16.50,16.62,16.25,16.50,2556800,4.12
    +1997-03-21,17.50,17.50,16.37,16.62,4892400,4.16
    +1997-03-20,16.00,17.50,15.88,17.25,11324400,4.31
    +1997-03-19,16.37,16.37,15.88,16.12,7457600,4.03
    +1997-03-18,16.37,16.50,16.12,16.25,4548800,4.06
    +1997-03-17,16.25,16.50,16.00,16.50,6886400,4.12
    +1997-03-14,16.37,16.75,16.25,16.56,8245600,4.14
    +1997-03-13,16.37,16.37,16.12,16.37,3772000,4.09
    +1997-03-12,16.25,16.75,16.12,16.25,2544400,4.06
    +1997-03-11,16.62,16.62,16.00,16.37,3539200,4.09
    +1997-03-10,16.62,16.75,16.44,16.62,3554800,4.16
    +1997-03-07,16.75,16.75,16.37,16.50,2523200,4.12
    +1997-03-06,17.00,17.00,16.50,16.62,4172000,4.16
    +1997-03-05,16.62,17.00,16.50,17.00,3453600,4.25
    +1997-03-04,16.25,16.50,16.00,16.50,3688800,4.12
    +1997-03-03,16.50,16.50,16.00,16.12,4670000,4.03
    +1997-02-28,16.87,16.87,16.25,16.25,4371200,4.06
    +1997-02-27,17.00,17.12,16.75,17.00,3700000,4.25
    +1997-02-26,17.00,17.12,16.75,17.12,3687600,4.28
    +1997-02-25,17.00,17.37,16.87,16.87,4938000,4.22
    +1997-02-24,16.25,16.87,16.25,16.62,4222000,4.16
    +1997-02-21,16.87,17.00,16.00,16.37,7549200,4.09
    +1997-02-20,17.62,17.62,17.00,17.00,4474800,4.25
    +1997-02-19,17.87,17.87,17.12,17.62,8627600,4.41
    +1997-02-18,16.62,17.87,16.25,17.87,13171200,4.47
    +1997-02-14,16.25,16.37,16.00,16.31,8492000,4.08
    +1997-02-13,15.75,16.12,15.50,16.12,7013200,4.03
    +1997-02-12,15.75,15.88,15.50,15.75,6303600,3.94
    +1997-02-11,15.88,16.00,15.50,15.69,5004400,3.92
    +1997-02-10,16.12,16.12,15.63,15.63,6633600,3.91
    +1997-02-07,16.50,16.50,15.75,15.81,8403600,3.95
    +1997-02-06,15.25,16.12,15.25,16.00,14283600,4.00
    +1997-02-05,15.25,15.63,15.25,15.25,14093600,3.81
    +1997-02-04,16.25,16.37,15.13,15.38,25458000,3.85
    +1997-02-03,16.87,17.00,16.25,16.31,13162000,4.08
    +1997-01-31,16.62,16.62,16.50,16.62,7135200,4.16
    +1997-01-30,16.75,16.75,16.50,16.75,5018800,4.19
    +1997-01-29,16.62,16.75,16.50,16.62,5428000,4.16
    +1997-01-28,17.00,17.00,16.50,16.62,7520000,4.16
    +1997-01-27,17.12,17.25,16.62,16.62,7646800,4.16
    +1997-01-24,17.25,17.25,16.87,16.87,6726800,4.22
    +1997-01-23,17.25,17.37,17.12,17.25,6175200,4.31
    +1997-01-22,17.37,17.50,17.00,17.19,7356800,4.30
    +1997-01-21,17.00,17.25,16.87,17.25,10179200,4.31
    +1997-01-20,16.87,17.12,16.75,16.94,10423600,4.24
    +1997-01-17,16.75,17.12,16.62,16.75,11619200,4.19
    +1997-01-16,17.12,17.12,16.62,16.75,23983600,4.19
    +1997-01-15,18.00,18.00,17.12,17.25,15483200,4.31
    +1997-01-14,18.37,18.37,17.75,17.87,9143200,4.47
    +1997-01-13,18.50,18.50,18.12,18.12,10942000,4.53
    +1997-01-10,17.62,18.25,17.62,18.25,12651200,4.56
    +1997-01-09,17.75,17.87,17.50,17.75,15970000,4.44
    +1997-01-08,18.25,18.37,17.37,17.62,39296400,4.41
    +1997-01-07,18.12,18.25,17.50,17.50,34896400,4.38
    +1997-01-06,17.62,18.34,17.25,17.87,67246400,4.47
    +1997-01-03,21.12,22.25,21.00,21.75,4295600,5.44
    +1997-01-02,21.12,21.25,20.75,21.00,5128800,5.25
    +1996-12-31,21.37,21.50,20.75,20.87,13719200,5.22
    +1996-12-30,23.12,23.25,21.75,21.75,9366800,5.44
    +1996-12-27,22.87,23.75,22.87,23.12,4900000,5.78
    +1996-12-26,23.25,23.25,22.87,23.00,3049200,5.75
    +1996-12-24,23.25,23.37,22.87,23.12,2067600,5.78
    +1996-12-23,24.00,24.25,23.25,23.25,11883600,5.81
    +1996-12-20,22.50,23.62,21.37,23.50,19535600,5.88
    +1996-12-19,23.00,23.25,22.25,22.25,4893600,5.56
    +1996-12-18,22.75,23.12,22.62,23.12,7326400,5.78
    +1996-12-17,22.37,22.50,22.25,22.50,5625200,5.62
    +1996-12-16,23.50,23.50,22.50,22.62,5335600,5.66
    +1996-12-13,23.75,23.87,23.25,23.25,3194400,5.81
    +1996-12-12,24.12,24.25,23.87,23.87,3122400,5.97
    +1996-12-11,23.75,24.25,23.75,24.00,5853600,6.00
    +1996-12-10,24.87,25.00,24.25,24.50,6593600,6.12
    +1996-12-09,25.25,25.37,24.81,25.00,5680800,6.25
    +1996-12-06,24.37,25.37,24.00,25.12,8210800,6.28
    +1996-12-05,25.00,25.25,25.00,25.00,5096800,6.25
    +1996-12-04,25.12,25.37,24.87,25.00,6823600,6.25
    +1996-12-03,25.25,25.50,25.00,25.12,9840800,6.28
    +1996-12-02,24.12,25.12,23.87,25.12,6254400,6.28
    +1996-11-29,24.50,24.62,24.00,24.12,1527600,6.03
    +1996-11-27,24.12,24.62,24.12,24.50,3191200,6.12
    +1996-11-26,24.87,25.00,24.00,24.25,4054800,6.06
    +1996-11-25,25.37,25.50,25.00,25.00,2830800,6.25
    +1996-11-22,24.50,25.25,24.50,25.25,3732400,6.31
    +1996-11-21,24.87,25.00,24.37,24.50,2522400,6.12
    +1996-11-20,24.87,25.37,24.87,25.00,3683200,6.25
    +1996-11-19,24.87,25.12,24.62,24.87,4446400,6.22
    +1996-11-18,25.00,25.12,24.50,24.75,5468800,6.19
    +1996-11-15,25.87,26.00,25.00,25.00,4684400,6.25
    +1996-11-14,25.50,25.75,25.37,25.62,1740800,6.41
    +1996-11-13,25.37,25.87,25.00,25.56,3000800,6.39
    +1996-11-12,26.12,26.25,25.12,25.25,5120000,6.31
    +1996-11-11,26.37,26.37,25.87,26.00,3318800,6.50
    +1996-11-08,25.87,26.25,25.75,26.25,6750800,6.56
    +1996-11-07,25.37,26.00,25.25,25.87,5548800,6.47
    +1996-11-06,25.62,25.75,24.87,25.50,6462000,6.38
    +1996-11-05,24.50,25.87,24.50,25.50,13517600,6.38
    +1996-11-04,24.37,24.50,23.75,24.37,3270800,6.09
    +1996-11-01,23.37,24.25,23.12,24.25,7563200,6.06
    +1996-10-31,23.25,23.37,22.25,23.00,6945600,5.75
    +1996-10-30,23.50,24.00,22.87,22.87,9192000,5.72
    +1996-10-29,24.62,24.75,23.12,23.25,7135200,5.81
    +1996-10-28,25.12,25.12,24.50,24.50,4288800,6.12
    +1996-10-25,24.87,25.00,24.50,24.50,2775600,6.12
    +1996-10-24,25.00,25.00,24.50,24.75,3020800,6.19
    +1996-10-23,24.75,25.25,24.37,24.75,5736800,6.19
    +1996-10-22,25.62,25.62,24.25,24.87,7651200,6.22
    +1996-10-21,26.50,26.62,25.50,25.62,6712000,6.41
    +1996-10-18,26.50,26.62,26.00,26.56,13681200,6.64
    +1996-10-17,27.50,27.75,26.37,26.37,36679200,6.59
    +1996-10-16,25.25,26.12,24.62,25.75,11975200,6.44
    +1996-10-15,25.75,25.87,25.00,25.25,12970000,6.31
    +1996-10-14,24.50,25.37,24.25,25.25,9649200,6.31
    +1996-10-11,24.37,24.62,24.00,24.25,4327600,6.06
    +1996-10-10,23.87,24.50,23.75,24.19,9883200,6.05
    +1996-10-09,23.37,23.62,22.87,23.00,3044800,5.75
    +1996-10-08,23.50,24.25,23.25,23.25,6802000,5.81
    +1996-10-07,23.00,23.37,22.87,23.12,3428800,5.78
    +1996-10-04,22.87,23.12,22.12,22.81,4770000,5.70
    +1996-10-03,23.62,23.75,22.37,22.37,8140000,5.59
    +1996-10-02,23.62,24.62,23.12,23.62,9890000,5.91
    +1996-10-01,22.00,24.75,22.00,24.62,19269200,6.16
    +1996-09-30,22.12,22.37,22.12,22.19,3058000,5.55
    +1996-09-27,22.25,22.37,22.12,22.31,2932000,5.58
    +1996-09-26,22.37,22.50,22.25,22.37,3693600,5.59
    +1996-09-25,22.50,22.62,22.00,22.37,3902400,5.59
    +1996-09-24,22.37,22.87,22.37,22.50,5143600,5.62
    +1996-09-23,22.87,22.87,22.37,22.37,1653600,5.59
    +1996-09-20,23.37,23.50,22.75,22.87,5330800,5.72
    +1996-09-19,23.62,23.62,23.37,23.37,4282000,5.84
    +1996-09-18,23.00,24.12,22.87,23.50,12631200,5.88
    +1996-09-17,22.87,23.12,22.50,23.00,7487600,5.75
    +1996-09-16,21.50,23.00,21.37,22.37,8747600,5.59
    +1996-09-13,20.37,21.25,20.37,21.00,5967600,5.25
    +1996-09-12,21.00,21.12,20.25,20.37,9340000,5.09
    +1996-09-11,21.50,21.75,21.00,21.12,5266800,5.28
    +1996-09-10,22.12,22.12,21.50,21.50,5562000,5.38
    +1996-09-09,22.62,22.75,21.87,22.00,5302400,5.50
    +1996-09-06,23.12,23.25,22.62,23.00,8602000,5.75
    +1996-09-05,23.50,23.75,22.87,22.87,9999200,5.72
    +1996-09-04,23.87,24.62,23.87,24.12,3636400,6.03
    +1996-09-03,24.12,24.37,23.87,24.12,2461200,6.03
    +1996-08-30,24.75,24.75,24.25,24.25,3784800,6.06
    +1996-08-29,24.87,24.87,24.37,24.50,3829200,6.12
    +1996-08-28,24.87,25.00,24.50,24.87,5844400,6.22
    +1996-08-27,24.12,25.00,24.00,24.86,10339200,6.22
    +1996-08-26,23.87,24.12,23.50,24.12,3204400,6.03
    +1996-08-23,23.00,24.00,23.00,23.87,7281200,5.97
    +1996-08-22,23.00,23.25,22.87,23.25,3138000,5.81
    +1996-08-21,23.50,23.62,22.87,23.00,4052400,5.75
    +1996-08-20,23.87,23.87,23.37,23.50,7564400,5.88
    +1996-08-19,22.37,23.62,22.37,23.62,8084400,5.91
    +1996-08-16,22.62,22.62,22.12,22.50,5075600,5.62
    +1996-08-15,22.62,22.75,22.25,22.25,3845600,5.56
    +1996-08-14,22.62,23.00,22.62,22.75,2570000,5.69
    +1996-08-13,22.87,23.12,22.37,22.50,3706400,5.62
    +1996-08-12,23.37,23.62,22.37,23.00,5408000,5.75
    +1996-08-09,22.25,23.37,22.12,23.12,8243600,5.78
    +1996-08-08,22.37,22.37,21.87,22.12,3640000,5.53
    +1996-08-07,21.75,22.62,21.62,22.37,8892400,5.59
    +1996-08-06,21.00,21.50,20.75,21.50,3354800,5.38
    +1996-08-05,21.62,21.87,20.87,21.00,3612000,5.25
    +1996-08-02,21.62,22.00,21.25,21.62,4574800,5.41
    +1996-08-01,22.00,22.00,21.12,21.25,3942400,5.31
    +1996-07-31,21.25,22.00,21.25,22.00,3332400,5.50
    +1996-07-30,22.62,22.75,21.25,21.37,6766800,5.34
    +1996-07-29,22.00,22.50,21.75,22.25,7005600,5.56
    +1996-07-26,21.50,22.00,21.12,22.00,4426800,5.50
    +1996-07-25,21.12,21.37,20.75,21.00,4090800,5.25
    +1996-07-24,20.00,21.00,19.87,20.81,9448800,5.20
    +1996-07-23,20.50,20.62,20.25,20.50,4651200,5.12
    +1996-07-22,20.87,20.87,20.00,20.25,5456400,5.06
    +1996-07-19,20.87,21.00,20.75,20.75,9510000,5.19
    +1996-07-18,21.50,21.75,20.36,20.87,32058800,5.22
    +1996-07-17,17.37,17.50,16.62,16.87,8355600,4.22
    +1996-07-16,17.37,17.37,16.00,16.87,10334400,4.22
    +1996-07-15,18.12,18.12,17.12,17.19,4779200,4.30
    +1996-07-12,18.37,18.37,17.25,18.06,9610800,4.51
    +1996-07-11,18.75,18.87,17.37,17.87,10420000,4.47
    +1996-07-10,19.12,19.50,18.75,18.75,6055200,4.69
    +1996-07-09,19.50,19.62,19.00,19.00,6723600,4.75
    +1996-07-08,19.62,19.87,19.00,19.12,6762000,4.78
    +1996-07-05,19.37,19.75,19.25,19.50,3808800,4.88
    +1996-07-03,20.37,20.37,19.37,19.37,10323200,4.84
    +1996-07-02,21.37,21.50,21.00,21.00,3189200,5.25
    +1996-07-01,21.12,21.50,21.00,21.50,4732400,5.38
    +1996-06-28,20.87,21.00,20.62,21.00,4138000,5.25
    +1996-06-27,20.00,21.00,19.75,20.62,8202400,5.16
    +1996-06-26,20.62,20.75,19.62,19.87,14440800,4.97
    +1996-06-25,22.12,22.25,20.37,20.62,8831200,5.16
    +1996-06-24,22.62,22.62,22.12,22.25,4398000,5.56
    +1996-06-21,22.87,22.87,22.37,22.62,5792000,5.66
    +1996-06-20,23.37,23.37,22.50,22.75,5260800,5.69
    +1996-06-19,23.12,23.37,22.62,23.12,4803600,5.78
    +1996-06-18,23.62,23.75,22.62,22.75,7979200,5.69
    +1996-06-17,24.12,24.12,23.62,23.62,4052000,5.91
    +1996-06-14,24.75,24.75,23.87,23.94,5186800,5.99
    +1996-06-13,24.37,24.92,24.00,24.62,6856800,6.16
    +1996-06-12,24.50,24.50,24.00,24.25,5440000,6.06
    +1996-06-11,24.25,24.25,24.00,24.00,5481200,6.00
    +1996-06-10,24.37,24.50,24.00,24.12,3820800,6.03
    +1996-06-07,24.00,24.37,23.50,24.37,9565200,6.09
    +1996-06-06,25.00,25.25,24.12,24.25,12938800,6.06
    +1996-06-05,25.37,25.50,24.25,25.12,18228000,6.28
    +1996-06-04,24.00,24.37,23.87,24.19,27235600,6.05
    +1996-06-03,25.87,26.00,24.75,24.75,4481200,6.19
    +1996-05-31,25.62,26.62,25.50,26.12,5813600,6.53
    +1996-05-30,24.87,25.75,24.75,25.50,3703600,6.38
    +1996-05-29,26.25,26.25,24.75,24.87,7840000,6.22
    +1996-05-28,26.75,27.25,26.37,26.37,3658800,6.59
    +1996-05-24,26.25,26.87,26.12,26.75,4046800,6.69
    +1996-05-23,26.12,26.62,25.75,26.25,4447600,6.56
    +1996-05-22,27.37,27.37,25.75,26.06,7215600,6.51
    +1996-05-21,28.00,28.12,27.12,27.12,4088000,6.78
    +1996-05-20,27.87,28.12,27.62,27.94,3028800,6.99
    +1996-05-17,28.37,28.37,27.50,27.62,4405600,6.91
    +1996-05-16,28.25,28.62,27.87,28.37,4648800,7.09
    +1996-05-15,27.87,28.87,27.75,28.50,10442400,7.12
    +1996-05-14,27.75,28.00,27.50,27.50,7068000,6.88
    +1996-05-13,27.12,27.62,26.62,27.06,6701200,6.76
    +1996-05-10,26.25,27.37,26.00,27.25,3966400,6.81
    +1996-05-09,26.37,26.50,25.75,26.12,3515600,6.53
    +1996-05-08,27.25,27.25,25.62,26.75,6688800,6.69
    +1996-05-07,26.37,27.37,26.25,26.87,12641200,6.72
    +1996-05-06,24.87,25.87,24.75,25.62,10349200,6.41
    +1996-05-03,24.12,24.12,23.50,23.87,3892400,5.97
    +1996-05-02,24.50,24.50,23.50,23.75,6728000,5.94
    +1996-05-01,24.37,24.75,24.12,24.37,4039200,6.09
    +1996-04-30,24.87,24.87,24.12,24.37,4881200,6.09
    +1996-04-29,25.00,25.00,24.50,24.75,4324800,6.19
    +1996-04-26,25.00,25.12,24.62,24.75,6759200,6.19
    +1996-04-25,24.37,24.87,24.12,24.87,6245200,6.22
    +1996-04-24,24.62,24.75,24.19,24.25,4596800,6.06
    +1996-04-23,25.12,25.25,24.62,24.75,6086400,6.19
    +1996-04-22,25.25,25.50,24.87,25.12,3973200,6.28
    +1996-04-19,24.62,25.12,24.62,25.06,3655600,6.26
    +1996-04-18,25.37,25.39,24.25,24.75,7780800,6.19
    +1996-04-17,25.87,26.00,25.12,25.25,3056400,6.31
    +1996-04-16,25.87,26.00,25.62,25.87,3634400,6.47
    +1996-04-15,25.50,25.75,25.00,25.75,5515600,6.44
    +1996-04-12,25.87,25.87,25.37,25.50,2924400,6.38
    +1996-04-11,26.12,26.25,25.50,25.75,3526400,6.44
    +1996-04-10,26.12,26.50,25.87,26.00,6242400,6.50
    +1996-04-09,24.87,26.50,24.37,26.00,8415600,6.50
    +1996-04-08,23.87,24.50,23.75,24.37,6046400,6.09
    +1996-04-04,24.62,24.62,24.00,24.12,3092000,6.03
    +1996-04-03,25.12,25.12,24.33,24.56,2591200,6.14
    +1996-04-02,25.62,25.62,24.87,25.00,3635600,6.25
    +1996-04-01,25.12,25.87,24.52,25.50,5680000,6.38
    +1996-03-29,24.25,24.75,23.75,24.56,5962400,6.14
    +1996-03-28,24.75,25.62,24.12,24.19,10572000,6.05
    +1996-03-27,23.25,25.25,23.00,25.25,15338800,6.31
    +1996-03-26,24.00,24.50,23.62,23.87,5755600,5.97
    +1996-03-25,25.50,25.75,24.00,24.00,5887600,6.00
    +1996-03-22,25.25,25.37,24.87,25.37,3842400,6.34
    +1996-03-21,25.50,25.50,25.00,25.12,3932400,6.28
    +1996-03-20,25.75,25.75,25.12,25.25,4154800,6.31
    +1996-03-19,26.37,26.50,25.62,25.75,4442400,6.44
    +1996-03-18,25.94,26.12,25.75,26.12,3907600,6.53
    +1996-03-15,26.00,26.00,25.50,25.87,3632400,6.47
    +1996-03-14,25.87,25.87,25.50,25.62,3342400,6.41
    +1996-03-13,25.87,26.12,25.62,25.75,3560000,6.44
    +1996-03-12,26.00,26.37,25.62,25.81,3453200,6.45
    +1996-03-11,26.25,26.37,25.75,25.87,4544800,6.47
    +1996-03-08,25.75,26.25,25.00,26.00,5322400,6.50
    +1996-03-07,26.25,26.37,25.37,25.81,9292400,6.45
    +1996-03-06,26.75,26.87,26.12,26.19,3547600,6.55
    +1996-03-05,26.50,26.75,26.25,26.62,4246800,6.66
    +1996-03-04,27.25,27.37,26.25,26.25,6708800,6.56
    +1996-03-01,27.62,27.62,26.62,26.87,8263200,6.72
    +1996-02-29,27.50,27.75,27.25,27.50,4049200,6.88
    +1996-02-28,28.87,28.87,27.62,27.75,6728800,6.94
    +1996-02-27,29.87,29.87,28.50,28.62,5331200,7.16
    +1996-02-26,30.00,30.12,29.50,29.50,4238000,7.38
    +1996-02-23,29.87,30.25,29.62,29.87,6205200,7.47
    +1996-02-22,30.00,30.12,29.62,29.87,6588000,7.47
    +1996-02-21,29.37,29.75,29.12,29.62,7924400,7.41
    +1996-02-20,28.00,29.50,28.00,29.00,13473200,7.25
    +1996-02-16,28.12,28.37,27.50,27.50,5602400,6.88
    +1996-02-15,27.62,28.12,27.37,28.00,4360000,7.00
    +1996-02-14,28.25,28.25,27.44,27.62,5843600,6.91
    +1996-02-13,28.00,28.87,27.87,28.12,8161200,7.03
    +1996-02-12,28.12,28.50,28.00,28.37,6948800,7.09
    +1996-02-09,27.87,28.50,27.62,27.75,7360800,6.94
    +1996-02-08,27.50,28.12,27.50,27.87,9420800,6.97
    +1996-02-07,29.75,29.75,27.75,28.25,12885200,7.06
    +1996-02-06,29.25,30.00,29.25,29.62,8101200,7.41
    +1996-02-05,29.69,29.75,29.00,29.25,11396400,7.31
    +1996-02-02,28.87,29.62,28.75,29.25,19865600,7.31
    +1996-02-01,27.50,28.37,27.50,28.37,11902400,7.09
    +1996-01-31,27.75,28.00,27.37,27.62,11736800,6.91
    +1996-01-30,27.00,28.12,26.86,27.31,22246800,6.83
    +1996-01-29,29.00,29.75,28.75,29.12,11900000,7.28
    +1996-01-26,30.37,31.25,28.62,30.62,26297600,7.66
    +1996-01-25,31.75,32.00,30.12,30.25,15911200,7.56
    +1996-01-24,32.13,32.25,31.75,32.25,23438800,8.06
    +1996-01-23,33.75,34.00,31.00,31.62,35305200,7.91
    +1996-01-22,29.75,31.00,29.25,30.50,17852400,7.62
    +1996-01-19,31.00,31.75,29.37,29.87,29623600,7.47
    +1996-01-18,32.88,33.38,30.37,31.94,24955200,7.99
    +1996-01-17,34.38,34.38,33.75,34.00,8445200,8.50
    +1996-01-16,34.38,34.75,33.63,34.56,12606400,8.64
    +1996-01-15,33.75,34.50,33.38,34.13,12971200,8.53
    +1996-01-12,34.75,34.75,33.25,33.88,14370000,8.47
    +1996-01-11,32.63,35.00,32.38,35.00,27041200,8.75
    +1996-01-10,32.50,34.75,32.25,34.25,13057600,8.56
    +1996-01-09,34.63,34.63,32.75,32.75,8978800,8.19
    +1996-01-08,34.50,35.50,34.00,34.63,4341200,8.66
    +1996-01-05,31.62,34.25,31.37,34.25,15929200,8.56
    +1996-01-04,32.38,32.38,31.37,31.56,10721200,7.89
    +1996-01-03,32.00,32.88,31.87,32.13,15368800,8.03
    +1996-01-02,32.25,32.25,31.75,32.13,4983200,8.03
    +1995-12-29,32.00,32.38,31.62,31.87,10874400,7.97
    +1995-12-28,32.13,32.75,31.87,32.00,8933200,8.00
    +1995-12-27,32.13,33.38,31.87,32.38,9609200,8.10
    +1995-12-26,32.50,32.50,31.75,32.06,4994800,8.02
    +1995-12-22,32.63,32.88,32.13,32.25,8392400,8.06
    +1995-12-21,32.75,32.75,31.62,32.50,11893200,8.12
    +1995-12-20,33.50,33.63,32.50,32.63,13074400,8.16
    +1995-12-19,32.75,33.25,32.25,32.75,15403600,8.19
    +1995-12-18,35.13,35.25,31.87,32.25,23807600,8.06
    +1995-12-15,35.50,36.63,34.38,35.25,25960000,8.81
    +1995-12-14,38.88,39.38,38.00,38.25,11928000,9.56
    +1995-12-13,38.25,39.00,36.75,38.38,24472400,9.60
    +1995-12-12,38.63,38.63,38.00,38.00,6353200,9.50
    +1995-12-11,39.50,39.63,38.38,38.63,4003200,9.66
    +1995-12-08,38.75,39.38,37.88,39.38,5053200,9.85
    +1995-12-07,38.75,38.75,37.88,38.56,5084800,9.64
    +1995-12-06,39.75,39.88,38.38,38.75,7195200,9.69
    +1995-12-05,38.50,39.88,38.25,39.50,13000000,9.88
    +1995-12-04,40.13,40.13,39.00,39.50,17171200,9.88
    +1995-12-01,38.00,38.25,37.13,37.63,7300800,9.41
    +1995-11-30,38.88,39.00,38.00,38.13,6247600,9.53
    +1995-11-29,40.13,40.13,39.00,39.25,3782000,9.81
    +1995-11-28,39.38,40.13,39.25,40.00,6305200,10.00
    +1995-11-27,40.63,40.63,39.38,39.38,4148800,9.85
    +1995-11-24,38.88,40.38,38.75,40.19,3930800,10.05
    +1995-11-22,38.63,39.25,38.50,38.63,3533600,9.66
    +1995-11-21,38.75,38.75,37.88,38.63,6845200,9.66
    +1995-11-20,40.25,40.25,38.50,38.63,5314400,9.63
    +1995-11-17,40.00,40.38,39.75,40.13,4607600,10.00
    +1995-11-16,40.88,41.50,39.50,39.94,8102000,9.95
    +1995-11-15,42.00,42.00,40.13,41.00,8874400,10.22
    +1995-11-14,41.00,42.50,41.00,41.50,14560000,10.34
    +1995-11-13,40.25,41.25,40.00,40.88,11343200,10.19
    +1995-11-10,39.38,40.25,38.88,39.75,7973200,9.91
    +1995-11-09,39.75,40.00,38.88,39.38,9295200,9.81
    +1995-11-08,39.75,41.00,38.75,38.88,12823600,9.69
    +1995-11-07,37.75,40.50,37.50,39.63,26310800,9.88
    +1995-11-06,36.50,38.75,36.38,38.13,11143200,9.50
    +1995-11-03,36.75,36.88,35.88,36.50,6413200,9.10
    +1995-11-02,36.88,36.88,36.25,36.63,5464400,9.13
    +1995-11-01,36.63,37.13,35.50,36.63,6913200,9.13
    +1995-10-31,35.25,36.63,35.13,36.31,10334400,9.05
    +1995-10-30,34.88,35.25,34.63,35.25,6291200,8.79
    +1995-10-27,34.88,34.88,34.13,34.75,5523200,8.66
    +1995-10-26,34.88,35.00,34.50,34.88,4503600,8.69
    +1995-10-25,35.25,35.38,34.75,34.75,4761200,8.66
    +1995-10-24,35.50,35.50,34.88,35.13,7638800,8.76
    +1995-10-23,35.13,35.13,34.75,35.13,7078000,8.76
    +1995-10-20,35.25,35.25,34.63,35.13,13818800,8.76
    +1995-10-19,35.88,36.13,34.75,34.75,33761200,8.66
    +1995-10-18,37.00,39.56,36.75,37.38,18311200,9.32
    +1995-10-17,36.50,36.88,35.88,36.63,6390000,9.13
    +1995-10-16,36.25,37.00,35.88,36.13,6515200,9.00
    +1995-10-13,35.75,36.88,35.50,36.00,8422000,8.97
    +1995-10-12,35.00,35.38,34.75,35.31,5803200,8.80
    +1995-10-11,35.25,35.63,34.13,34.88,11893200,8.69
    +1995-10-10,34.38,35.00,33.63,34.69,14303600,8.65
    +1995-10-09,35.38,35.75,34.38,34.81,13320800,8.68
    +1995-10-06,36.75,37.00,35.63,35.69,11058000,8.89
    +1995-10-05,36.25,36.63,35.88,36.50,8737600,9.10
    +1995-10-04,36.63,37.00,36.00,36.38,9532000,9.07
    +1995-10-03,38.13,38.50,37.13,37.63,10368000,9.38
    +1995-10-02,37.75,38.50,37.50,37.63,14000000,9.38
    +1995-09-29,38.00,38.25,36.88,37.25,10123200,9.28
    +1995-09-28,36.50,37.88,36.50,37.75,11843600,9.41
    +1995-09-27,37.50,37.50,34.75,36.25,16135600,9.03
    +1995-09-26,37.75,37.88,37.13,37.38,8961200,9.32
    +1995-09-25,38.25,38.27,37.38,37.52,11267600,9.35
    +1995-09-22,36.88,37.25,36.38,37.06,14258000,9.24
    +1995-09-21,36.50,37.50,36.38,37.00,12407600,9.22
    +1995-09-20,37.25,37.38,36.50,36.63,11500800,9.13
    +1995-09-19,36.75,37.13,36.13,36.75,17512400,9.16
    +1995-09-18,36.38,36.81,35.88,36.69,22216400,9.14
    +1995-09-15,37.38,39.88,35.50,35.88,43286800,8.94
    +1995-09-14,41.38,41.63,39.75,40.00,19675600,9.97
    +1995-09-13,42.88,43.38,42.00,42.38,11530800,10.56
    +1995-09-12,44.50,44.88,42.63,42.94,11658800,10.70
    +1995-09-11,44.88,45.50,44.25,44.25,6160800,11.03
    +1995-09-08,44.75,44.88,44.50,44.75,6243200,11.15
    +1995-09-07,44.00,45.31,43.75,44.75,9373600,11.15
    +1995-09-06,43.88,44.17,43.50,43.75,7175600,10.90
    +1995-09-05,43.50,43.50,42.75,43.50,6443200,10.84
    +1995-09-01,43.00,43.50,42.88,42.94,3532400,10.70
    +1995-08-31,43.38,43.50,43.00,43.00,3148000,10.72
    +1995-08-30,43.25,43.75,43.13,43.38,5482000,10.81
    +1995-08-29,43.00,43.25,42.50,43.13,11325600,10.75
    +1995-08-28,44.88,45.00,43.00,43.00,8680000,10.72
    +1995-08-25,45.88,45.88,44.63,44.75,4819200,11.15
    +1995-08-24,45.63,46.25,45.50,45.75,10285200,11.40
    +1995-08-23,44.88,45.88,44.63,45.50,9078000,11.34
    +1995-08-22,44.38,45.13,44.13,44.75,7769200,11.15
    +1995-08-21,44.88,45.38,44.13,44.13,9721200,11.00
    +1995-08-18,44.88,45.13,43.75,44.88,8620000,11.19
    +1995-08-17,44.63,45.50,44.13,44.63,8827600,11.12
    +1995-08-16,44.00,44.50,43.63,44.50,10457600,11.09
    +1995-08-15,43.88,44.13,43.13,44.06,11370800,10.95
    +1995-08-14,43.00,43.75,42.88,43.38,5989200,10.78
    +1995-08-11,42.88,43.13,41.88,43.06,7407600,10.70
    +1995-08-10,43.13,43.25,42.63,42.75,5868000,10.63
    +1995-08-09,42.63,43.75,42.50,43.13,13190000,10.72
    +1995-08-08,43.63,43.75,42.38,42.50,8388800,10.56
    +1995-08-07,44.13,44.63,43.13,43.38,6920000,10.78
    +1995-08-04,45.00,45.13,43.75,44.25,6884400,11.00
    +1995-08-03,44.13,45.63,43.88,45.00,7640800,11.18
    +1995-08-02,43.88,45.00,43.75,44.38,9840800,11.03
    +1995-08-01,44.88,44.88,43.50,43.50,7540000,10.81
    +1995-07-31,45.50,45.63,44.75,45.00,5673600,11.18
    +1995-07-28,46.75,47.25,45.00,45.50,9341200,11.31
    +1995-07-27,45.50,47.50,45.50,46.81,11621200,11.63
    +1995-07-26,46.25,46.25,45.38,45.38,6125200,11.28
    +1995-07-25,46.00,46.38,45.63,45.75,9418000,11.37
    +1995-07-24,44.00,45.50,43.75,45.38,7679200,11.28
    +1995-07-21,43.00,44.88,43.00,43.75,27082400,10.87
    +1995-07-20,46.00,47.38,45.00,47.06,11848800,11.70
    +1995-07-19,47.00,48.00,45.00,45.50,18613200,11.31
    +1995-07-18,49.00,49.56,47.75,48.13,9102000,11.96
    +1995-07-17,48.88,49.75,48.63,49.00,8098000,12.18
    +1995-07-14,47.38,49.00,47.00,48.75,9929200,12.12
    +1995-07-13,47.38,48.75,47.13,47.63,12596400,11.84
    +1995-07-12,47.25,48.00,46.13,47.00,10145200,11.68
    +1995-07-11,47.75,48.63,47.06,47.13,7683200,11.71
    +1995-07-10,48.63,49.88,48.13,48.63,10640800,12.09
    +1995-07-07,46.88,49.25,46.75,48.63,13840000,12.09
    +1995-07-06,46.50,47.00,45.75,47.00,6583200,11.68
    +1995-07-05,46.88,47.88,46.50,46.50,6325600,11.56
    +1995-07-03,46.50,47.13,46.25,46.94,1410800,11.67
    +1995-06-30,47.25,47.88,46.13,46.44,5927600,11.54
    +1995-06-29,46.38,48.13,46.00,47.25,8320000,11.74
    +1995-06-28,46.00,47.50,45.38,46.63,9531200,11.59
    +1995-06-27,47.38,48.25,46.38,46.38,7772400,11.53
    +1995-06-26,48.25,48.50,47.63,48.13,5465600,11.96
    +1995-06-23,48.75,49.00,47.75,48.75,8286800,12.12
    +1995-06-22,49.00,49.63,48.63,49.13,16928800,12.21
    +1995-06-21,47.63,50.13,46.75,49.38,22378800,12.27
    +1995-06-20,46.00,47.75,46.00,47.38,26385200,11.78
    +1995-06-19,43.88,45.25,43.50,44.38,16774400,11.03
    +1995-06-16,43.88,44.00,43.50,43.88,3200800,10.91
    +1995-06-15,43.63,43.75,43.38,43.63,3331200,10.84
    +1995-06-14,43.88,43.88,43.38,43.63,4224800,10.84
    +1995-06-13,44.50,44.63,43.88,44.00,4508000,10.94
    +1995-06-12,44.00,44.50,43.88,44.17,7584400,10.98
    +1995-06-09,43.63,43.75,43.13,43.50,6679200,10.81
    +1995-06-08,43.38,43.38,42.13,42.94,4874400,10.67
    +1995-06-07,44.13,44.13,43.13,43.13,4451200,10.72
    +1995-06-06,43.63,44.38,43.50,44.00,11270800,10.94
    +1995-06-05,42.38,43.50,42.13,43.50,9103200,10.81
    +1995-06-02,41.88,42.38,41.50,42.13,3783200,10.47
    +1995-06-01,41.88,42.50,41.75,42.19,6685200,10.49
    +1995-05-31,42.13,42.13,41.00,41.56,5707600,10.33
    +1995-05-30,42.63,42.88,41.50,42.00,7021200,10.44
    +1995-05-26,43.00,43.13,42.25,42.69,4097600,10.61
    +1995-05-25,43.25,44.00,43.00,43.38,6536800,10.75
    +1995-05-24,43.75,44.25,42.88,43.50,9459200,10.78
    +1995-05-23,44.13,44.38,43.50,43.88,9881200,10.88
    +1995-05-22,42.50,44.13,42.25,44.13,13282400,10.94
    +1995-05-19,42.88,43.75,42.63,42.75,11522000,10.60
    +1995-05-18,44.13,44.13,43.25,43.38,13287600,10.75
    +1995-05-17,43.75,44.38,43.50,44.00,9419200,10.91
    +1995-05-16,43.13,44.38,42.50,43.75,11895600,10.84
    +1995-05-15,43.13,43.75,42.50,43.63,14053200,10.81
    +1995-05-12,40.88,43.69,40.50,43.63,23153200,10.81
    +1995-05-11,41.63,41.63,40.38,41.00,18712400,10.16
    +1995-05-10,41.50,41.88,40.75,41.44,9837600,10.27
    +1995-05-09,40.63,41.38,40.00,41.25,11540800,10.22
    +1995-05-08,39.88,41.00,39.75,40.50,13832000,10.04
    +1995-05-05,38.75,39.13,38.13,38.88,7445200,9.64
    +1995-05-04,38.25,39.88,38.00,38.50,10846800,9.54
    +1995-05-03,38.25,38.63,38.00,38.13,6043600,9.45
    +1995-05-02,38.25,38.38,37.50,38.13,4289200,9.45
    +1995-05-01,38.25,38.75,38.00,38.25,6375600,9.48
    +1995-04-28,38.00,38.38,37.50,38.25,6984400,9.48
    +1995-04-27,38.50,38.50,37.75,37.88,5014800,9.39
    +1995-04-26,37.63,38.75,37.38,38.25,8246800,9.48
    +1995-04-25,39.13,39.38,37.25,37.75,9780000,9.36
    +1995-04-24,39.00,39.63,38.50,39.00,9724400,9.67
    +1995-04-21,37.25,39.50,37.13,39.13,23812400,9.70
    +1995-04-20,37.13,38.50,36.63,37.63,11772400,9.33
    +1995-04-19,37.50,37.50,35.63,36.38,9990800,9.02
    +1995-04-18,38.50,38.63,37.50,37.50,8263200,9.29
    +1995-04-17,38.13,39.38,37.88,38.38,7467600,9.51
    +1995-04-13,39.25,39.25,37.88,38.25,6242400,9.48
    +1995-04-12,38.25,39.63,37.38,39.00,16973200,9.67
    +1995-04-11,36.75,37.88,36.63,37.75,7673200,9.36
    +1995-04-10,36.88,37.00,36.13,36.63,4211200,9.08
    +1995-04-07,37.00,37.13,36.25,36.75,10562400,9.11
    +1995-04-06,37.25,38.00,35.53,36.75,25823600,9.11
    +1995-04-05,34.13,34.75,33.75,34.75,9470000,8.61
    +1995-04-04,35.75,35.88,33.63,33.88,15300000,8.40
    +1995-04-03,35.50,35.75,35.13,35.50,5528000,8.80
    +1995-03-31,35.13,35.63,34.75,35.25,6558000,8.74
    +1995-03-30,34.63,35.50,34.50,35.38,9767600,8.77
    +1995-03-29,34.00,34.88,33.88,34.38,17760000,8.52
    +1995-03-28,36.25,36.34,34.13,34.38,24655600,8.52
    +1995-03-27,37.63,37.63,36.63,37.19,5111200,9.22
    +1995-03-24,37.38,37.88,37.25,37.75,4584400,9.36
    +1995-03-23,37.88,38.00,36.98,37.13,6094400,9.20
    +1995-03-22,36.25,39.50,36.25,38.06,17130800,9.43
    +1995-03-21,35.50,36.75,35.25,36.25,10920800,8.98
    +1995-03-20,35.13,35.63,35.00,35.25,6793600,8.74
    +1995-03-17,35.50,35.50,34.88,35.13,7713600,8.71
    +1995-03-16,35.25,36.00,35.00,35.25,11330000,8.74
    +1995-03-15,35.50,36.25,34.88,35.00,26120800,8.67
    +1995-03-14,38.25,38.25,34.50,35.00,26015200,8.67
    +1995-03-13,39.63,39.63,38.00,38.13,11653200,9.45
    +1995-03-10,39.63,40.38,39.38,39.50,4923200,9.79
    +1995-03-09,39.88,40.38,39.38,39.75,7038000,9.85
    +1995-03-08,38.75,40.13,37.75,39.56,13048800,9.81
    +1995-03-07,39.88,39.88,38.25,38.31,5399200,9.50
    +1995-03-06,39.75,40.00,39.50,39.75,4751200,9.85
    +1995-03-03,39.75,40.69,39.50,40.25,5209200,9.98
    +1995-03-02,40.13,40.75,39.75,40.00,9619200,9.91
    +1995-03-01,39.75,40.13,39.42,40.00,8025200,9.91
    +1995-02-28,38.50,39.88,38.00,39.50,7965200,9.79
    +1995-02-27,38.25,39.00,38.11,38.25,9600800,9.48
    +1995-02-24,40.13,40.38,38.50,39.00,20334400,9.67
    +1995-02-23,41.13,41.88,40.00,40.19,11262000,9.96
    +1995-02-22,40.63,41.00,40.13,40.81,10501200,10.12
    +1995-02-21,42.63,42.75,40.88,41.00,10776800,10.16
    +1995-02-17,42.88,43.00,42.50,42.50,4366400,10.53
    +1995-02-16,43.13,43.25,42.63,43.19,7821200,10.70
    +1995-02-15,43.25,43.50,42.50,42.56,6604400,10.55
    +1995-02-14,43.75,44.13,42.63,42.94,5934400,10.64
    +1995-02-13,43.50,44.50,43.25,43.75,10120800,10.84
    +1995-02-10,43.63,44.19,43.38,43.75,12542400,10.81
    +1995-02-09,42.13,43.88,42.13,43.63,16988800,10.78
    +1995-02-08,41.00,42.38,40.88,42.31,14403600,10.46
    +1995-02-07,40.38,41.00,40.00,40.81,7200000,10.09
    +1995-02-06,40.75,40.75,39.50,40.50,8702000,10.01
    +1995-02-03,42.00,42.13,40.38,40.50,11400800,10.01
    +1995-02-02,40.13,41.88,40.13,41.63,7288000,10.29
    +1995-02-01,40.75,40.75,39.88,40.13,5665200,9.92
    +1995-01-31,40.50,40.88,40.00,40.38,7621200,9.98
    +1995-01-30,40.13,40.50,39.88,40.13,8255200,9.92
    +1995-01-27,39.88,40.38,39.00,39.88,10676400,9.86
    +1995-01-26,40.88,41.50,39.25,39.50,8822000,9.76
    +1995-01-25,39.50,42.00,39.50,40.98,18482000,10.13
    +1995-01-24,42.25,42.38,41.38,41.63,7805600,10.29
    +1995-01-23,41.88,42.63,41.00,42.25,14252400,10.44
    +1995-01-20,47.00,47.00,42.50,42.63,35731200,10.54
    +1995-01-19,45.50,46.00,45.00,45.88,11238800,11.34
    +1995-01-18,45.00,45.63,44.75,45.63,4581200,11.28
    +1995-01-17,44.50,45.50,44.13,45.00,11806400,11.12
    +1995-01-16,44.88,45.25,44.25,44.50,6765600,11.00
    +1995-01-13,46.13,46.13,44.38,44.88,12565600,11.09
    +1995-01-12,46.13,46.38,44.75,45.38,19721200,11.22
    +1995-01-11,43.75,48.06,42.69,46.75,31212400,11.56
    +1995-01-10,41.25,44.00,41.25,43.69,21977600,10.80
    +1995-01-09,41.63,41.88,41.00,41.20,9805200,10.18
    +1995-01-06,41.63,43.13,41.13,42.00,38456800,10.38
    +1995-01-05,39.25,39.38,38.75,38.88,2646800,9.61
    +1995-01-04,38.63,39.63,38.63,39.38,5682400,9.73
    +1995-01-03,38.88,38.88,37.88,38.38,3726400,9.49
    +1994-12-30,39.38,39.88,38.75,39.00,2616400,9.64
    +1994-12-29,39.25,39.88,39.13,39.50,4341200,9.76
    +1994-12-28,39.13,39.25,38.25,39.13,3198000,9.67
    +1994-12-27,39.25,39.75,38.88,39.13,2928800,9.67
    +1994-12-23,38.50,39.38,38.50,38.88,3372000,9.61
    +1994-12-22,38.50,38.88,38.25,38.63,4771200,9.55
    +1994-12-21,37.88,38.50,37.50,38.38,5635600,9.49
    +1994-12-20,39.13,39.25,38.38,38.50,6263600,9.52
    +1994-12-19,37.25,39.38,37.25,39.13,11890000,9.67
    +1994-12-16,37.25,37.75,36.75,37.25,6432400,9.21
    +1994-12-15,38.00,38.38,36.88,37.13,8133200,9.18
    +1994-12-14,36.50,38.13,36.50,37.88,11123600,9.36
    +1994-12-13,36.63,36.94,36.25,36.38,4266800,8.99
    +1994-12-12,36.38,36.75,35.50,36.50,8004400,9.02
    +1994-12-09,35.88,36.38,34.75,36.25,9329200,8.96
    +1994-12-08,36.88,37.00,35.75,35.88,6081200,8.87
    +1994-12-07,37.50,37.81,36.06,36.63,4916800,9.05
    +1994-12-06,37.00,38.38,36.88,37.56,8516400,9.28
    +1994-12-05,36.50,37.38,36.13,37.19,6460000,9.19
    +1994-12-02,36.50,36.75,35.63,36.56,6170000,9.04
    +1994-12-01,37.00,37.63,36.00,36.19,11051200,8.95
    +1994-11-30,38.38,39.38,37.00,37.25,11157600,9.21
    +1994-11-29,38.00,38.50,37.75,38.25,5163200,9.45
    +1994-11-28,37.63,38.25,37.31,37.81,4971200,9.35
    +1994-11-25,36.88,37.75,36.75,37.75,3012400,9.33
    +1994-11-23,37.00,37.88,36.38,36.88,11723200,9.12
    +1994-11-22,37.75,39.13,37.25,37.38,8018800,9.24
    +1994-11-21,40.00,40.25,38.00,38.13,7255600,9.42
    +1994-11-18,40.00,40.50,39.63,40.00,5257600,9.89
    +1994-11-17,40.88,41.00,39.88,40.00,5380000,9.86
    +1994-11-16,40.75,41.56,40.63,40.94,6700000,10.09
    +1994-11-15,42.50,43.00,41.25,41.38,6001200,10.20
    +1994-11-14,41.25,42.75,41.25,42.50,5002000,10.47
    +1994-11-11,41.25,41.50,41.00,41.13,2237600,10.14
    +1994-11-10,41.75,41.88,41.00,41.31,5476800,10.18
    +1994-11-09,42.75,43.00,41.00,41.63,14530000,10.26
    +1994-11-08,40.63,42.63,40.25,42.25,12476400,10.41
    +1994-11-07,40.38,41.25,40.13,40.75,4058000,10.04
    +1994-11-04,41.50,41.63,40.00,40.38,6869200,9.95
    +1994-11-03,41.75,42.00,41.00,41.50,3962400,10.23
    +1994-11-02,43.13,43.25,41.38,41.38,7819200,10.20
    +1994-11-01,42.88,43.48,42.38,43.13,7805600,10.63
    +1994-10-31,42.00,43.38,41.50,43.19,12728000,10.64
    +1994-10-28,42.38,42.88,41.75,42.13,9762400,10.38
    +1994-10-27,43.25,43.75,42.50,42.75,5700800,10.54
    +1994-10-26,42.63,43.27,42.63,43.25,7043200,10.66
    +1994-10-25,41.63,42.63,41.50,42.63,10771200,10.51
    +1994-10-24,42.75,43.13,41.88,42.25,7316800,10.41
    +1994-10-21,40.75,42.75,40.75,42.63,11528000,10.51
    +1994-10-20,41.25,41.81,40.50,41.00,7808000,10.10
    +1994-10-19,41.00,42.13,41.00,41.25,12549200,10.17
    +1994-10-18,40.63,41.63,40.50,41.25,16749200,10.17
    +1994-10-17,40.88,41.50,38.88,39.75,10866400,9.80
    +1994-10-14,41.50,42.00,40.88,41.13,6292000,10.14
    +1994-10-13,42.63,42.88,40.63,41.13,18761200,10.14
    +1994-10-12,39.63,42.63,39.13,42.13,21340000,10.38
    +1994-10-11,41.38,41.88,39.38,39.63,30083600,9.77
    +1994-10-10,37.13,39.63,37.00,38.88,18700800,9.58
    +1994-10-07,36.13,37.06,35.50,37.00,13022000,9.12
    +1994-10-06,37.38,37.48,36.00,36.25,18828800,8.93
    +1994-10-05,33.63,38.13,33.38,37.88,25366800,9.33
    +1994-10-04,33.25,34.00,33.00,33.75,5822000,8.32
    +1994-10-03,33.63,33.75,32.50,33.13,4644400,8.16
    +1994-09-30,34.13,34.50,33.63,33.69,2561200,8.30
    +1994-09-29,33.75,34.38,33.38,34.13,3921200,8.41
    +1994-09-28,34.00,34.38,33.63,33.88,2914800,8.35
    +1994-09-27,33.75,34.13,33.38,33.88,3904800,8.35
    +1994-09-26,33.88,34.50,33.63,33.94,5072400,8.36
    +1994-09-23,33.88,34.50,33.88,33.94,4760000,8.36
    +1994-09-22,34.25,34.25,33.63,33.88,5235600,8.35
    +1994-09-21,34.50,34.63,33.75,34.13,8402400,8.41
    +1994-09-20,35.13,35.38,34.38,34.56,7047600,8.52
    +1994-09-19,36.38,36.75,35.50,35.50,6242000,8.75
    +1994-09-16,35.88,37.25,35.50,36.38,13008000,8.97
    +1994-09-15,35.13,36.13,35.13,36.00,9253200,8.87
    +1994-09-14,35.63,35.75,35.00,35.13,3549200,8.66
    +1994-09-13,35.75,36.25,35.63,35.81,3723600,8.82
    +1994-09-12,35.63,35.75,35.38,35.75,3252400,8.81
    +1994-09-09,35.75,36.00,35.38,35.75,5624400,8.81
    +1994-09-08,36.00,36.25,35.63,36.13,5691200,8.90
    +1994-09-07,35.63,36.63,35.38,36.13,7283200,8.90
    +1994-09-06,35.25,35.63,35.00,35.56,3279200,8.76
    +1994-09-02,35.25,35.50,35.00,35.38,3628000,8.72
    +1994-09-01,35.38,35.75,34.63,35.00,7305200,8.63
    +1994-08-31,36.00,37.38,35.75,36.19,12568800,8.92
    +1994-08-30,35.25,36.38,35.13,36.25,6515600,8.93
    +1994-08-29,35.75,36.13,35.25,35.38,5450800,8.72
    +1994-08-26,35.25,36.13,35.25,35.75,7300000,8.81
    +1994-08-25,34.25,36.38,34.25,35.06,10688800,8.64
    +1994-08-24,34.75,35.00,34.38,34.88,6132400,8.60
    +1994-08-23,34.88,35.88,34.75,35.00,7669200,8.63
    +1994-08-22,34.75,35.00,34.63,34.88,5445600,8.60
    +1994-08-19,34.75,35.00,34.25,34.88,4674800,8.60
    +1994-08-18,34.75,35.25,34.50,34.63,7370000,8.53
    +1994-08-17,34.88,35.38,34.63,35.00,10232400,8.63
    +1994-08-16,34.38,34.75,34.00,34.75,5563200,8.56
    +1994-08-15,34.75,35.00,34.25,34.63,4293200,8.53
    +1994-08-12,34.38,35.13,33.88,34.75,6425200,8.53
    +1994-08-11,34.25,35.13,33.88,34.31,10649200,8.43
    +1994-08-10,33.63,34.88,33.25,34.63,9065200,8.50
    +1994-08-09,33.50,33.88,33.13,33.63,2811200,8.26
    +1994-08-08,33.13,34.00,33.00,33.75,5048800,8.29
    +1994-08-05,32.88,33.38,32.88,33.25,3123200,8.17
    +1994-08-04,33.13,33.75,33.13,33.25,6620000,8.17
    +1994-08-03,32.75,33.25,32.13,33.13,8113600,8.14
    +1994-08-02,33.50,33.63,32.38,32.56,9642400,8.00
    +1994-08-01,33.63,33.75,32.75,33.38,8204400,8.20
    +1994-07-29,31.87,34.00,31.87,33.69,19853600,8.27
    +1994-07-28,31.00,32.13,30.87,31.87,8762000,7.83
    +1994-07-27,31.25,31.37,30.62,31.06,4788000,7.63
    +1994-07-26,31.75,32.00,31.12,31.37,6756400,7.70
    +1994-07-25,31.12,31.87,30.75,31.69,15103200,7.78
    +1994-07-22,31.62,31.97,30.00,31.00,28098800,7.61
    +1994-07-21,26.62,28.50,26.50,28.00,10348800,6.88
    +1994-07-20,27.37,27.62,26.37,26.62,7765200,6.54
    +1994-07-19,28.62,28.75,27.37,27.69,4176400,6.80
    +1994-07-18,28.12,29.00,28.00,28.37,2734800,6.97
    +1994-07-15,28.23,28.62,27.50,28.25,3409200,6.94
    +1994-07-14,29.62,29.75,28.25,28.62,6459200,7.03
    +1994-07-13,28.50,30.25,28.50,29.69,16081200,7.29
    +1994-07-12,27.00,28.44,26.37,28.37,8662000,6.97
    +1994-07-11,27.12,27.37,26.62,27.00,3801200,6.63
    +1994-07-08,26.50,27.62,26.50,27.06,7457600,6.65
    +1994-07-07,25.87,27.00,25.50,26.81,6097600,6.58
    +1994-07-06,26.25,26.50,26.00,26.12,3499200,6.41
    +1994-07-05,25.62,26.75,25.62,26.50,3080800,6.51
    +1994-07-01,26.37,26.50,25.37,25.75,6404400,6.32
    +1994-06-30,26.25,26.87,26.25,26.50,3652000,6.51
    +1994-06-29,26.75,27.12,25.87,26.12,4842400,6.41
    +1994-06-28,26.25,27.12,25.62,26.75,6235200,6.57
    +1994-06-27,25.25,26.25,24.62,26.25,9153200,6.45
    +1994-06-24,25.12,26.12,24.75,25.61,10470000,6.29
    +1994-06-23,26.25,26.25,24.87,25.12,7283200,6.17
    +1994-06-22,26.25,26.75,26.00,26.25,4081200,6.45
    +1994-06-21,26.87,27.25,25.75,26.00,8693200,6.39
    +1994-06-20,26.25,27.25,26.00,27.12,7150000,6.66
    +1994-06-17,26.00,26.75,25.87,26.50,8027600,6.51
    +1994-06-16,27.75,27.75,26.12,26.37,7812400,6.48
    +1994-06-15,27.00,28.00,26.87,27.81,5704400,6.83
    +1994-06-14,27.25,27.37,26.62,27.06,5531200,6.65
    +1994-06-13,26.37,27.19,26.37,27.00,3339200,6.63
    +1994-06-10,27.12,27.37,26.37,26.50,5107600,6.51
    +1994-06-09,25.62,27.00,25.50,27.00,10485200,6.63
    +1994-06-08,27.50,27.62,26.00,26.12,9809200,6.41
    +1994-06-07,27.25,27.75,27.25,27.50,5013600,6.75
    +1994-06-06,27.50,27.75,27.00,27.37,4513200,6.72
    +1994-06-03,27.12,28.00,26.75,27.62,12649200,6.78
    +1994-06-02,28.37,28.50,27.12,27.37,13762400,6.72
    +1994-06-01,28.50,28.62,27.87,28.25,13786800,6.94
    +1994-05-31,29.50,29.50,28.50,29.25,9211200,7.18
    +1994-05-27,30.25,30.75,29.50,29.94,3882400,7.35
    +1994-05-26,31.50,31.50,30.25,30.50,2613200,7.46
    +1994-05-25,30.25,31.75,30.00,31.25,4873200,7.64
    +1994-05-24,31.00,31.25,30.25,30.75,4536400,7.52
    +1994-05-23,31.00,31.25,30.00,30.50,4286400,7.46
    +1994-05-20,31.75,32.25,31.00,31.06,3519200,7.60
    +1994-05-19,30.75,32.50,30.50,32.13,9776800,7.86
    +1994-05-18,29.75,30.75,29.25,30.62,4436800,7.49
    +1994-05-17,29.75,29.75,28.75,29.37,6450800,7.18
    +1994-05-16,30.00,30.50,29.50,29.50,4854800,7.22
    +1994-05-13,29.75,30.50,29.25,30.00,3323200,7.34
    +1994-05-12,30.50,30.75,29.50,29.69,3839200,7.26
    +1994-05-11,31.00,31.50,29.75,30.25,5218000,7.40
    +1994-05-10,31.75,32.00,31.00,31.00,5246800,7.58
    +1994-05-09,32.25,32.50,30.75,31.25,5026400,7.64
    +1994-05-06,32.25,32.75,31.25,32.31,6721200,7.90
    +1994-05-05,33.25,33.75,32.25,32.88,10307600,8.04
    +1994-05-04,31.00,33.25,30.50,33.00,13008800,8.07
    +1994-05-03,31.00,31.25,29.50,30.25,4761200,7.40
    +1994-05-02,30.00,31.25,30.00,31.00,4401200,7.58
    +1994-04-29,30.00,30.50,29.75,30.00,3399200,7.34
    +1994-04-28,31.00,31.25,29.75,30.25,3604400,7.40
    +1994-04-26,31.50,31.50,31.00,31.25,5879200,7.64
    +1994-04-25,29.75,31.00,29.50,31.00,12846800,7.58
    +1994-04-22,31.25,32.00,28.50,29.75,24923600,7.28
    +1994-04-21,28.50,30.50,27.00,29.62,14674400,7.25
    +1994-04-20,29.25,30.00,28.00,28.25,10080800,6.91
    +1994-04-19,29.75,30.00,28.50,29.00,5947600,7.09
    +1994-04-18,30.50,30.50,29.25,29.62,8238800,7.25
    +1994-04-15,31.25,31.50,30.00,30.25,6730800,7.40
    +1994-04-14,30.50,31.75,30.00,31.50,7933200,7.71
    +1994-04-13,32.25,32.50,31.25,31.75,8330000,7.77
    +1994-04-12,33.38,33.38,31.75,32.00,4890800,7.83
    +1994-04-11,33.50,33.50,32.50,33.50,3823600,8.19
    +1994-04-08,33.75,34.00,33.25,33.50,6336400,8.19
    +1994-04-07,33.50,33.75,32.75,33.38,2764800,8.17
    +1994-04-06,34.00,34.00,32.75,33.50,4616400,8.19
    +1994-04-05,33.75,34.25,33.50,33.50,3505600,8.19
    +1994-04-04,32.25,33.25,31.75,33.25,6016800,8.13
    +1994-03-31,32.50,33.50,31.50,33.25,7481200,8.13
    +1994-03-30,32.50,33.25,31.75,32.50,6079200,7.95
    +1994-03-29,33.25,33.75,32.25,32.75,7640000,8.01
    +1994-03-28,33.00,34.00,32.75,33.25,10098800,8.13
    +1994-03-25,34.75,34.75,32.75,32.75,12291200,8.01
    +1994-03-24,35.13,35.25,34.00,34.63,6738800,8.47
    +1994-03-23,35.25,35.50,34.25,35.13,7749200,8.59
    +1994-03-22,35.25,35.50,34.50,35.00,8690800,8.56
    +1994-03-21,36.38,36.50,35.25,35.50,8806400,8.68
    +1994-03-18,36.75,36.75,35.75,36.38,8004400,8.90
    +1994-03-17,36.75,37.00,36.25,36.50,5590800,8.93
    +1994-03-16,37.50,37.75,36.50,36.75,5265200,8.99
    +1994-03-15,38.25,38.25,37.25,37.63,7319200,9.20
    +1994-03-14,38.50,38.50,37.75,38.13,15783600,9.33
    +1994-03-11,37.00,37.75,36.75,37.25,5791200,9.11
    +1994-03-10,37.25,37.63,36.75,37.25,5142400,9.11
    +1994-03-09,36.63,37.50,36.00,37.50,8896800,9.17
    +1994-03-08,38.00,38.00,36.75,37.00,6647600,9.05
    +1994-03-07,37.00,38.13,36.75,37.88,11088800,9.27
    +1994-03-04,36.00,37.50,35.75,36.75,8113600,8.99
    +1994-03-03,35.75,36.25,35.50,35.75,6737600,8.75
    +1994-03-02,35.25,36.25,34.75,35.63,10519200,8.72
    +1994-03-01,36.75,36.75,35.75,36.25,7570800,8.87
    +1994-02-28,36.25,37.00,36.00,36.50,4434800,8.93
    +1994-02-25,37.00,37.25,35.50,36.00,8468000,8.81
    +1994-02-24,37.00,37.25,36.25,36.63,7081200,8.96
    +1994-02-23,37.25,38.25,37.00,37.25,9318800,9.11
    +1994-02-22,36.25,37.50,35.75,37.25,7676400,9.11
    +1994-02-18,36.50,37.00,36.25,36.25,5326400,8.87
    +1994-02-17,37.25,37.88,36.25,37.00,5197600,9.05
    +1994-02-16,37.50,37.50,36.75,36.75,4379200,8.99
    +1994-02-15,36.75,37.50,36.25,37.13,4654400,9.08
    +1994-02-14,37.00,38.00,36.75,37.00,8775200,9.05
    +1994-02-11,36.25,37.50,36.25,37.00,5880800,9.05
    +1994-02-10,36.25,37.50,36.00,36.50,10802000,8.93
    +1994-02-09,35.75,36.50,35.25,36.25,6699200,8.87
    +1994-02-08,36.00,36.50,35.25,35.75,10210800,8.75
    +1994-02-07,33.50,37.13,33.50,36.50,25925200,8.93
    +1994-02-04,33.50,35.00,33.25,33.50,12645200,8.17
    +1994-02-03,33.00,33.63,32.50,33.50,4933200,8.17
    +1994-02-02,33.25,33.25,32.50,33.00,5247600,8.04
    +1994-02-01,33.00,33.50,32.25,33.25,5618000,8.10
    +1994-01-31,33.50,33.75,32.75,32.75,8532400,7.98
    +1994-01-28,34.25,34.75,33.75,34.00,4891200,8.29
    +1994-01-27,33.50,34.25,33.00,34.13,4724800,8.32
    +1994-01-26,33.75,34.00,33.25,33.50,5922400,8.17
    +1994-01-25,34.75,35.00,33.25,33.88,15818800,8.26
    +1994-01-24,33.25,35.25,33.25,35.00,24742000,8.53
    +1994-01-21,33.25,33.50,32.25,33.38,35007600,8.14
    +1994-01-20,29.50,30.75,29.50,29.87,9582400,7.28
    +1994-01-19,29.25,29.75,28.75,29.25,10066400,7.13
    +1994-01-18,30.25,30.25,29.00,29.37,12978000,7.16
    +1994-01-17,31.00,31.50,30.00,30.37,5206400,7.40
    +1994-01-14,30.75,31.75,30.50,31.00,7673200,7.56
    +1994-01-13,30.00,30.75,29.75,30.62,19000000,7.46
    +1994-01-12,32.25,32.25,30.50,30.50,15684400,7.43
    +1994-01-11,33.50,33.75,31.75,31.87,12700000,7.77
    +1994-01-10,33.00,33.88,32.75,33.63,7222000,8.20
    +1994-01-07,32.00,33.25,31.25,33.13,10688800,8.08
    +1994-01-06,33.75,34.00,32.50,32.75,13095200,7.98
    +1994-01-05,31.75,33.88,31.75,33.75,21874400,8.23
    +1994-01-04,30.25,31.50,30.00,31.50,10198800,7.68
    +1994-01-03,29.50,30.00,29.00,29.87,6485200,7.28
    +1993-12-31,29.75,30.25,29.25,29.25,5765200,7.13
    +1993-12-30,28.50,30.25,28.50,29.75,11253200,7.25
    +1993-12-29,29.25,29.25,28.50,28.50,3853200,6.95
    +1993-12-28,28.75,29.50,28.50,29.12,5705600,7.10
    +1993-12-27,27.75,28.75,27.25,28.50,5730000,6.95
    +1993-12-23,27.25,27.25,26.50,27.25,8120000,6.64
    +1993-12-22,27.25,28.50,27.00,28.00,6498800,6.82
    +1993-12-21,28.50,28.75,27.25,27.50,8973600,6.70
    +1993-12-20,29.25,29.75,28.25,28.50,6768800,6.95
    +1993-12-17,29.50,29.75,29.12,29.50,5197600,7.19
    +1993-12-16,29.50,29.75,29.00,29.37,4532000,7.16
    +1993-12-15,29.00,29.75,29.00,29.75,4438000,7.25
    +1993-12-14,29.25,29.75,29.00,29.12,10492400,7.10
    +1993-12-13,28.25,29.50,27.75,29.50,8729200,7.19
    +1993-12-10,30.25,30.50,27.75,28.25,17781200,6.89
    +1993-12-09,31.75,32.00,29.75,30.00,6531200,7.31
    +1993-12-08,32.00,32.25,31.50,31.87,1422000,7.77
    +1993-12-07,32.00,32.25,31.50,32.25,2280800,7.86
    +1993-12-06,31.50,32.50,31.25,32.25,5610000,7.86
    +1993-12-03,31.75,32.00,31.00,31.50,4314800,7.68
    +1993-12-02,31.75,32.00,31.00,31.75,3614400,7.74
    +1993-12-01,32.00,32.25,31.25,31.50,3978800,7.68
    +1993-11-30,31.75,32.63,31.50,31.50,4036800,7.68
    +1993-11-29,32.25,32.50,31.50,31.75,3462000,7.74
    +1993-11-26,32.75,33.00,32.25,32.63,1569200,7.95
    +1993-11-24,32.75,33.50,32.63,33.00,3246800,8.04
    +1993-11-23,32.50,33.00,31.25,33.00,6653600,8.04
    +1993-11-22,32.75,33.00,32.25,32.50,5389200,7.92
    +1993-11-19,33.00,33.50,32.50,33.00,4409200,8.04
    +1993-11-18,33.50,33.75,33.00,33.50,4089200,8.14
    +1993-11-17,34.00,35.00,32.75,33.50,10812400,8.14
    +1993-11-16,32.00,34.25,31.75,34.00,10838000,8.26
    +1993-11-15,31.50,32.75,31.50,32.00,5616800,7.77
    +1993-11-12,31.50,32.00,30.50,31.75,5136800,7.71
    +1993-11-11,30.75,32.00,30.50,31.37,5090800,7.62
    +1993-11-10,30.25,30.75,30.00,30.75,2765600,7.47
    +1993-11-09,31.00,31.25,29.75,30.12,6136400,7.32
    +1993-11-08,32.00,32.13,30.50,30.75,5966400,7.47
    +1993-11-05,31.87,32.25,30.75,31.87,13513200,7.74
    +1993-11-04,31.50,32.25,30.75,32.25,6632000,7.83
    +1993-11-03,33.00,33.00,31.00,31.62,6320000,7.68
    +1993-11-02,31.25,33.00,31.00,32.75,8013600,7.95
    +1993-11-01,30.75,31.50,30.25,31.50,3798800,7.65
    +1993-10-29,31.00,31.75,30.50,30.75,4892400,7.47
    +1993-10-28,31.75,32.25,31.00,31.00,8736800,7.53
    +1993-10-27,30.00,32.25,29.75,31.75,16415200,7.71
    +1993-10-26,29.75,30.00,29.00,29.75,7960000,7.23
    +1993-10-25,30.25,30.50,29.62,30.00,7840800,7.29
    +1993-10-22,30.50,31.50,29.75,30.25,14160000,7.35
    +1993-10-21,27.50,31.25,27.25,30.25,22417600,7.35
    +1993-10-20,28.00,28.25,27.25,27.75,4956400,6.74
    +1993-10-19,28.25,28.50,27.25,27.75,7643200,6.74
    +1993-10-18,28.00,28.75,27.75,28.37,11900000,6.89
    +1993-10-15,27.75,28.50,26.75,28.25,34136400,6.86
    +1993-10-14,24.00,24.50,23.50,23.75,5749200,5.77
    +1993-10-13,24.25,24.25,23.50,24.00,6322400,5.83
    +1993-10-12,24.00,25.00,23.75,24.00,10952400,5.83
    +1993-10-11,22.75,24.00,22.75,23.75,5775200,5.77
    +1993-10-08,23.25,23.25,22.25,22.62,4989200,5.49
    +1993-10-07,23.50,23.75,22.75,23.00,4828000,5.59
    +1993-10-06,23.75,24.00,23.37,23.62,6271200,5.74
    +1993-10-05,23.00,24.00,23.00,23.50,6306400,5.71
    +1993-10-04,22.62,23.00,22.00,22.75,6891200,5.53
    +1993-10-01,22.75,23.00,22.50,22.75,12022000,5.53
    +1993-09-30,24.00,24.00,23.00,23.37,9828000,5.68
    +1993-09-29,24.25,24.87,23.75,23.87,8463600,5.80
    +1993-09-28,24.75,25.00,24.25,24.75,3386400,6.01
    +1993-09-27,25.00,25.25,24.25,24.75,4043200,6.01
    +1993-09-24,25.00,25.25,24.50,25.00,2743200,6.07
    +1993-09-23,25.50,25.50,24.50,24.75,4697600,6.01
    +1993-09-22,24.25,25.50,24.25,25.50,3960800,6.19
    +1993-09-21,24.75,25.25,23.87,24.50,5250000,5.95
    +1993-09-20,25.25,25.50,24.75,24.87,3968800,6.04
    +1993-09-17,24.37,25.50,24.25,25.25,6157600,6.13
    +1993-09-16,24.25,25.00,24.25,24.75,3086800,6.01
    +1993-09-15,24.50,25.00,23.50,24.50,9206800,5.95
    +1993-09-14,24.25,25.00,24.00,24.25,9880000,5.89
    +1993-09-13,26.25,26.50,24.75,25.25,9143600,6.13
    +1993-09-10,26.25,26.25,25.37,26.25,4804800,6.38
    +1993-09-09,26.75,27.00,26.00,26.00,5352000,6.31
    +1993-09-08,26.25,27.00,26.00,26.75,8102000,6.50
    +1993-09-07,26.00,27.00,25.75,26.25,5130000,6.38
    +1993-09-03,26.00,26.00,25.25,25.75,5830000,6.25
    +1993-09-02,26.00,26.25,25.25,25.75,10081200,6.25
    +1993-09-01,26.50,26.75,25.75,26.12,8065200,6.34
    +1993-08-31,26.50,26.75,26.00,26.50,4570800,6.44
    +1993-08-30,26.50,26.50,25.87,26.00,9785600,6.31
    +1993-08-27,27.00,27.00,26.25,26.50,6676400,6.44
    +1993-08-26,27.25,27.25,26.50,26.87,6296800,6.53
    +1993-08-25,28.00,28.25,26.75,27.25,5209200,6.62
    +1993-08-24,28.25,28.75,27.75,28.00,3625600,6.80
    +1993-08-23,28.00,28.75,27.50,28.37,3265600,6.89
    +1993-08-20,27.75,28.00,27.00,28.00,3574400,6.80
    +1993-08-19,28.75,28.75,27.50,27.50,5452000,6.68
    +1993-08-18,29.00,29.75,28.25,28.50,6751200,6.92
    +1993-08-17,27.75,28.50,27.25,28.37,3876800,6.89
    +1993-08-16,27.50,28.00,27.25,27.50,3669200,6.68
    +1993-08-13,26.50,27.75,26.25,27.37,4978800,6.62
    +1993-08-12,27.50,27.75,26.00,26.50,12098800,6.41
    +1993-08-11,28.50,28.50,27.00,27.50,5965200,6.65
    +1993-08-10,29.50,29.75,28.25,28.50,5465600,6.89
    +1993-08-09,29.25,30.25,29.00,29.75,5767600,7.19
    +1993-08-06,29.25,30.25,29.25,29.25,4506800,7.07
    +1993-08-05,30.75,30.75,29.00,29.50,7498800,7.13
    +1993-08-04,29.25,30.50,29.00,30.25,8700000,7.31
    +1993-08-03,29.00,29.25,28.75,29.00,6315600,7.01
    +1993-08-02,28.25,29.25,28.00,28.50,7728000,6.89
    +1993-07-30,27.50,28.25,27.00,27.75,7669200,6.71
    +1993-07-29,27.00,27.50,26.75,27.25,4343200,6.59
    +1993-07-28,26.25,27.00,26.25,26.87,3300000,6.50
    +1993-07-27,26.75,27.50,26.25,26.50,7100800,6.41
    +1993-07-26,26.75,27.50,26.00,26.87,5468000,6.50
    +1993-07-23,27.00,27.50,26.00,26.25,8365600,6.35
    +1993-07-22,26.00,27.00,25.75,26.50,7554400,6.41
    +1993-07-21,26.00,26.75,25.50,26.25,16283600,6.35
    +1993-07-20,26.25,27.75,25.75,26.87,19017600,6.50
    +1993-07-19,28.00,28.75,25.50,25.62,28813200,6.20
    +1993-07-16,28.50,29.62,26.50,27.50,75744400,6.65
    +1993-07-15,37.25,37.75,35.25,35.75,12091200,8.64
    +1993-07-14,36.75,37.50,35.75,37.25,8816800,9.01
    +1993-07-13,38.75,38.75,37.00,37.25,5650800,9.01
    +1993-07-12,36.75,38.13,36.25,38.00,6215600,9.19
    +1993-07-09,37.00,37.25,36.50,36.75,5604400,8.89
    +1993-07-08,36.50,37.50,36.25,36.50,4964800,8.83
    +1993-07-07,37.50,37.88,36.25,36.50,8124400,8.83
    +1993-07-06,38.25,39.00,37.50,37.75,5558800,9.13
    +1993-07-02,38.25,38.75,37.75,38.50,6846400,9.31
    +1993-07-01,39.00,39.75,38.00,38.00,7809200,9.19
    +1993-06-30,38.75,39.75,38.50,39.50,7170000,9.55
    +1993-06-29,40.25,40.25,38.50,39.00,10526400,9.43
    +1993-06-28,40.50,40.50,38.75,40.13,12645600,9.70
    +1993-06-25,40.38,40.75,39.50,40.00,9198000,9.67
    +1993-06-24,40.50,41.75,40.00,41.75,7980000,10.10
    +1993-06-23,41.75,41.75,40.00,40.50,6462400,9.79
    +1993-06-22,40.88,42.00,39.75,41.38,12021200,10.01
    +1993-06-21,40.50,40.50,39.50,39.63,9776800,9.58
    +1993-06-18,41.63,42.13,39.75,41.00,11138800,9.91
    +1993-06-17,42.50,42.50,40.50,41.25,14635600,9.97
    +1993-06-16,42.25,43.25,41.50,42.25,12615600,10.22
    +1993-06-15,45.25,45.25,41.88,42.00,16018000,10.16
    +1993-06-14,44.00,44.75,43.50,44.63,8927600,10.79
    +1993-06-11,45.00,45.25,43.38,43.75,8662400,10.58
    +1993-06-10,43.50,44.75,42.75,44.50,19783600,10.76
    +1993-06-09,45.00,45.63,44.00,44.25,42090000,10.70
    +1993-06-08,48.75,50.00,48.00,49.50,22194400,11.97
    +1993-06-07,54.50,54.75,50.38,50.75,17239200,12.27
    +1993-06-04,55.75,56.25,54.50,54.88,7649200,13.27
    +1993-06-03,57.00,57.25,56.00,56.38,5603200,13.63
    +1993-06-02,56.75,58.25,56.00,57.00,7160000,13.78
    +1993-06-01,56.50,57.75,56.50,57.00,4837600,13.78
    +1993-05-28,57.00,57.50,56.25,56.63,6575200,13.69
    +1993-05-27,57.75,58.50,57.25,57.50,7049200,13.87
    +1993-05-26,56.00,57.75,55.38,57.75,4353600,13.94
    +1993-05-25,56.75,57.50,55.75,56.38,6462400,13.60
    +1993-05-24,56.75,58.75,56.75,57.63,5373200,13.91
    +1993-05-21,58.75,59.13,56.75,57.50,5300000,13.87
    +1993-05-20,57.25,59.00,57.25,58.75,10385200,14.18
    +1993-05-19,54.75,57.50,54.50,57.25,6176400,13.81
    +1993-05-18,55.50,56.25,55.00,55.50,5860000,13.39
    +1993-05-17,55.50,56.00,55.00,55.75,2491200,13.45
    +1993-05-14,55.25,56.00,55.00,55.50,4212000,13.39
    +1993-05-13,53.50,55.75,53.50,55.50,12940800,13.39
    +1993-05-12,54.25,54.75,53.00,53.25,3779200,12.85
    +1993-05-11,55.00,55.25,54.00,54.50,5665600,13.15
    +1993-05-10,55.00,55.88,55.00,55.00,4929200,13.27
    +1993-05-07,53.50,54.75,53.50,54.75,2927600,13.21
    +1993-05-06,54.50,54.75,53.50,53.75,2536800,12.97
    +1993-05-05,53.00,55.50,53.00,54.50,9059200,13.15
    +1993-05-04,52.25,54.25,52.00,53.38,6112400,12.88
    +1993-05-03,51.25,52.00,51.00,51.88,2332400,12.52
    +1993-04-30,50.75,52.50,50.75,51.25,4730000,12.37
    +1993-04-29,51.50,51.75,50.13,50.75,2958000,12.25
    +1993-04-28,49.75,52.00,49.75,51.38,5846800,12.40
    +1993-04-27,48.75,50.25,48.75,50.25,4648800,12.13
    +1993-04-26,49.25,49.75,48.50,49.00,3689200,11.82
    +1993-04-23,49.75,50.25,48.75,49.25,4808000,11.88
    +1993-04-22,49.25,50.50,49.00,50.00,5648800,12.06
    +1993-04-21,50.25,50.75,49.25,49.63,7337600,11.98
    +1993-04-20,48.75,50.25,48.25,50.00,8580800,12.06
    +1993-04-19,48.50,49.50,48.25,48.50,8148000,11.70
    +1993-04-16,48.25,48.75,47.38,48.13,24533200,11.61
    +1993-04-15,48.25,48.25,46.75,47.25,7816800,11.40
    +1993-04-14,48.25,48.75,47.63,48.75,6092400,11.76
    +1993-04-13,50.50,51.25,48.25,48.50,5893600,11.70
    +1993-04-12,49.50,51.00,49.50,50.00,3324800,12.06
    +1993-04-08,50.00,50.50,49.00,49.75,5857600,12.00
    +1993-04-07,49.00,50.75,48.50,50.50,5825200,12.19
    +1993-04-06,50.00,50.25,48.75,48.75,6020800,11.76
    +1993-04-05,50.00,50.50,49.50,50.00,5332000,12.06
    +1993-04-02,50.50,51.25,49.50,50.13,9077600,12.10
    +1993-04-01,51.25,52.00,51.00,51.75,3878000,12.49
    +1993-03-31,52.50,52.75,51.25,51.50,7968800,12.43
    +1993-03-30,51.13,52.25,50.25,52.25,9447600,12.61
    +1993-03-29,52.25,52.50,50.75,51.00,9362000,12.31
    +1993-03-26,54.75,54.75,52.50,53.25,5431200,12.85
    +1993-03-25,53.75,54.75,53.50,54.75,6125200,13.21
    +1993-03-24,52.75,54.25,52.50,53.75,5126400,12.97
    +1993-03-23,53.25,54.00,52.63,52.75,3674400,12.73
    +1993-03-22,53.50,53.88,52.75,53.25,5911200,12.85
    +1993-03-19,55.00,55.25,53.50,53.75,5516800,12.97
    +1993-03-18,55.00,55.63,54.50,54.50,3810800,13.15
    +1993-03-17,56.50,57.00,55.00,55.13,6301200,13.30
    +1993-03-16,57.25,57.75,56.50,56.50,3626800,13.63
    +1993-03-15,56.00,57.25,55.38,57.00,4868800,13.75
    +1993-03-12,56.75,56.75,55.50,56.25,4527600,13.57
    +1993-03-11,57.00,57.25,56.25,56.88,5167600,13.73
    +1993-03-10,56.75,57.25,56.00,56.75,4738800,13.69
    +1993-03-09,56.50,57.50,56.50,56.75,5535200,13.69
    +1993-03-08,55.00,56.75,55.00,56.50,6322400,13.63
    +1993-03-05,54.75,55.75,54.75,55.00,4001200,13.27
    +1993-03-04,54.50,55.25,53.50,55.00,6730000,13.27
    +1993-03-03,54.00,55.00,53.25,54.63,7261200,13.18
    +1993-03-02,53.00,54.50,53.00,54.25,5294400,13.09
    +1993-03-01,53.00,53.50,52.75,53.25,4272400,12.85
    +1993-02-26,54.25,54.25,52.25,53.00,10538000,12.79
    +1993-02-25,53.25,54.75,53.25,54.75,5979200,13.21
    +1993-02-24,52.13,53.88,52.13,53.63,10253600,12.94
    +1993-02-23,55.00,55.25,54.00,54.25,6937600,13.09
    +1993-02-22,55.00,56.00,54.75,55.13,3531200,13.30
    +1993-02-19,55.25,55.50,54.75,55.00,6366800,13.27
    +1993-02-18,55.00,55.25,53.50,55.00,10006800,13.27
    +1993-02-17,53.25,54.00,52.00,53.88,8932400,13.00
    +1993-02-16,53.50,53.50,51.50,53.00,14563200,12.79
    +1993-02-12,55.00,55.50,53.75,53.88,9855600,13.00
    +1993-02-11,55.75,56.25,55.00,55.13,6015200,13.27
    +1993-02-10,57.00,57.25,55.00,55.75,9593600,13.42
    +1993-02-09,57.00,57.38,56.50,56.88,8525600,13.70
    +1993-02-08,57.00,57.50,55.50,56.50,10060000,13.60
    +1993-02-05,59.25,59.50,56.25,57.25,13134400,13.78
    +1993-02-04,60.00,60.25,59.00,59.50,7453200,14.33
    +1993-02-03,61.00,61.00,58.50,60.00,9455200,14.45
    +1993-02-02,60.75,61.50,60.25,60.25,6530000,14.51
    +1993-02-01,59.25,61.25,59.25,61.25,8608800,14.75
    +1993-01-29,60.25,61.25,59.00,59.50,9516800,14.33
    +1993-01-28,60.00,60.25,59.25,59.88,6580000,14.42
    +1993-01-27,61.00,61.75,58.75,60.25,8101200,14.51
    +1993-01-26,60.50,62.00,60.50,60.75,10201200,14.63
    +1993-01-25,59.25,60.50,59.25,60.00,7237600,14.45
    +1993-01-22,60.25,60.25,59.00,59.50,5252400,14.33
    +1993-01-21,59.75,60.25,58.75,60.00,6601200,14.45
    +1993-01-20,59.75,60.25,59.50,60.00,5685600,14.45
    +1993-01-19,59.75,60.50,59.25,59.75,9802400,14.39
    +1993-01-18,59.50,60.00,58.00,59.50,11935600,14.33
    +1993-01-15,61.00,62.25,60.00,60.25,32257600,14.51
    +1993-01-14,64.00,65.25,63.75,65.00,13145200,15.65
    +1993-01-13,61.50,64.00,61.25,63.50,7135600,15.29
    +1993-01-12,62.75,63.75,61.50,61.50,12364400,14.81
    +1993-01-11,62.00,64.37,61.75,64.12,9785200,15.44
    +1993-01-08,60.75,63.00,59.75,62.25,11474400,14.99
    +1993-01-07,61.75,62.50,60.63,61.00,9741200,14.69
    +1993-01-06,60.75,62.00,60.50,61.75,10055600,14.87
    +1993-01-05,58.00,59.25,57.25,59.25,6658800,14.27
    +1993-01-04,59.50,60.00,57.75,58.25,4618800,14.03
    +1992-12-31,58.75,60.00,58.75,59.75,3302000,14.39
    +1992-12-30,59.75,59.75,58.75,58.75,3610800,14.15
    +1992-12-29,59.50,60.75,59.50,59.63,4171200,14.36
    +1992-12-28,59.25,59.75,59.25,59.50,2536400,14.33
    +1992-12-24,60.00,60.00,59.00,59.00,1642400,14.21
    +1992-12-23,60.25,60.50,59.25,59.75,4018800,14.39
    +1992-12-22,59.75,61.25,59.75,60.63,10009200,14.60
    +1992-12-21,58.25,60.00,58.00,59.63,9159200,14.36
    +1992-12-18,57.50,59.25,57.25,58.25,8414400,14.03
    +1992-12-17,55.25,57.50,55.25,56.88,8370800,13.70
    +1992-12-16,56.25,57.00,54.50,55.00,8085200,13.24
    +1992-12-15,56.75,57.00,55.50,56.38,6541200,13.57
    +1992-12-14,57.50,57.75,56.75,57.25,3962000,13.78
    +1992-12-11,57.25,58.25,57.25,57.50,4299200,13.84
    +1992-12-10,57.25,57.63,56.50,57.25,5010800,13.78
    +1992-12-09,57.75,58.00,57.25,57.63,5700800,13.88
    +1992-12-08,57.75,58.75,57.75,58.13,7035600,14.00
    +1992-12-07,56.75,57.75,56.75,57.75,5168000,13.90
    +1992-12-04,57.25,57.50,56.50,56.88,3432400,13.70
    +1992-12-03,56.50,57.63,56.13,57.50,6710800,13.84
    +1992-12-02,58.25,58.50,57.00,57.25,3498800,13.78
    +1992-12-01,57.25,59.00,56.75,58.25,4652400,14.03
    +1992-11-30,56.25,57.50,55.63,57.50,5739200,13.84
    +1992-11-27,56.50,57.25,56.25,56.50,1688800,13.57
    +1992-11-25,57.00,57.25,56.00,56.50,4208000,13.57
    +1992-11-24,57.00,57.50,56.50,57.50,5601200,13.82
    +1992-11-23,56.50,57.00,56.25,56.75,5462400,13.63
    +1992-11-20,58.50,58.75,57.00,57.50,5572000,13.82
    +1992-11-19,57.75,59.50,57.75,58.25,8608000,14.00
    +1992-11-18,56.00,58.25,55.50,57.75,10889200,13.88
    +1992-11-17,57.25,57.50,54.88,55.25,6045200,13.27
    +1992-11-16,56.25,57.75,56.00,57.38,2419200,13.79
    +1992-11-13,57.00,57.25,56.00,56.25,3042000,13.51
    +1992-11-12,57.00,57.50,56.38,56.88,3844400,13.67
    +1992-11-11,56.50,58.25,56.25,56.75,5023600,13.63
    +1992-11-10,55.00,56.50,54.75,56.25,4368000,13.51
    +1992-11-09,56.00,56.00,54.75,55.25,4052000,13.27
    +1992-11-06,54.75,56.50,54.75,55.75,9443200,13.39
    +1992-11-05,52.50,55.00,52.50,55.00,10647600,13.21
    +1992-11-04,52.00,52.75,52.00,52.50,5086800,12.61
    +1992-11-03,52.50,52.50,51.50,52.00,4042000,12.49
    +1992-11-02,52.50,52.75,51.75,52.25,6094400,12.55
    +1992-10-30,53.50,53.50,52.00,52.50,4657600,12.61
    +1992-10-29,52.25,54.00,51.50,53.25,7661200,12.79
    +1992-10-28,51.25,52.75,50.75,52.25,7033200,12.55
    +1992-10-27,51.50,52.50,51.00,51.50,7575600,12.37
    +1992-10-26,48.75,51.50,48.50,51.50,8972000,12.37
    +1992-10-23,49.25,49.50,48.25,48.75,3279200,11.71
    +1992-10-22,48.50,49.25,48.25,48.75,3026400,11.71
    +1992-10-21,49.25,49.50,48.00,48.50,4080800,11.65
    +1992-10-20,49.00,50.00,48.50,49.13,10269200,11.80
    +1992-10-19,49.00,49.25,48.50,49.00,7002400,11.77
    +1992-10-16,46.75,49.50,46.50,49.00,16142000,11.77
    +1992-10-15,45.75,46.00,45.25,45.50,2701200,10.93
    +1992-10-14,45.25,46.25,45.00,46.00,3429200,11.05
    +1992-10-13,44.75,46.00,44.00,45.38,5265600,10.90
    +1992-10-12,43.25,44.25,43.25,44.00,2580000,10.57
    +1992-10-09,43.50,44.00,43.00,43.38,2108000,10.42
    +1992-10-08,44.00,44.25,43.00,43.50,4543200,10.45
    +1992-10-07,45.00,45.25,43.50,43.75,4050800,10.51
    +1992-10-06,43.75,45.00,42.75,44.75,4058000,10.75
    +1992-10-05,43.25,43.75,41.50,43.50,9475600,10.45
    +1992-10-02,44.50,44.75,43.00,43.75,4063600,10.51
    +1992-10-01,44.75,45.13,44.25,44.25,4396400,10.63
    +1992-09-30,45.00,45.50,44.50,45.13,3580800,10.84
    +1992-09-29,44.50,45.50,44.00,44.88,5626400,10.78
    +1992-09-28,45.00,45.00,43.75,44.75,5351200,10.75
    +1992-09-25,46.25,46.50,45.25,45.50,4926400,10.93
    +1992-09-24,47.25,47.75,46.25,46.25,4492000,11.11
    +1992-09-23,46.00,47.50,45.50,47.50,4443200,11.41
    +1992-09-22,46.75,46.75,45.25,45.75,3996800,10.99
    +1992-09-21,46.75,47.75,46.25,46.50,3204400,11.17
    +1992-09-18,45.75,46.88,45.25,46.50,4133600,11.17
    +1992-09-17,47.25,47.25,45.38,46.00,6180000,11.05
    +1992-09-16,47.75,48.25,46.50,47.00,6395600,11.29
    +1992-09-15,49.25,49.25,47.75,48.25,7806800,11.59
    +1992-09-14,49.00,50.00,48.50,49.50,7682400,11.89
    +1992-09-11,49.00,49.25,47.50,47.63,6438000,11.44
    +1992-09-10,48.00,49.50,47.50,49.25,8165600,11.83
    +1992-09-09,48.00,49.25,47.75,49.00,5622400,11.77
    +1992-09-08,46.75,48.00,46.50,47.75,2511200,11.47
    +1992-09-04,48.25,48.25,46.75,47.25,2268800,11.35
    +1992-09-03,49.00,49.25,47.75,47.75,7570000,11.47
    +1992-09-02,46.50,48.75,46.50,48.50,6794400,11.65
    +1992-09-01,46.25,46.50,45.75,46.50,2172000,11.17
    +1992-08-31,45.00,46.25,44.75,46.00,4328800,11.05
    +1992-08-28,44.25,45.25,44.00,45.00,2202400,10.81
    +1992-08-27,44.75,45.13,44.25,44.50,2974800,10.69
    +1992-08-26,44.25,44.50,43.25,44.25,4325600,10.63
    +1992-08-25,43.25,44.50,43.25,44.38,4731200,10.66
    +1992-08-24,44.25,44.75,43.25,43.25,5454400,10.39
    +1992-08-21,44.75,45.25,44.00,44.63,3926400,10.72
    +1992-08-20,44.75,45.00,44.25,44.75,3894800,10.75
    +1992-08-19,44.63,45.25,44.50,44.50,6096800,10.69
    +1992-08-18,44.50,45.25,44.50,44.75,4017600,10.75
    +1992-08-17,44.25,44.75,43.75,44.75,4617600,10.75
    +1992-08-14,45.00,45.25,44.50,44.75,4872400,10.72
    +1992-08-13,44.50,45.50,44.25,44.75,6122000,10.72
    +1992-08-12,43.75,44.25,43.25,44.13,4343600,10.57
    +1992-08-11,44.50,44.50,43.00,43.50,4339200,10.42
    +1992-08-10,43.25,44.50,43.00,44.13,3280800,10.57
    +1992-08-07,42.00,43.75,41.50,43.38,7842400,10.39
    +1992-08-06,44.25,44.50,42.75,44.00,9220800,10.54
    +1992-08-05,45.50,45.50,44.50,44.75,4981200,10.72
    +1992-08-04,45.00,45.75,44.75,45.50,4295600,10.90
    +1992-08-03,46.75,47.25,45.50,45.75,2452400,10.96
    +1992-07-31,47.25,47.50,46.75,46.75,3262000,11.20
    +1992-07-30,47.25,47.50,46.75,47.25,4927600,11.32
    +1992-07-29,46.63,47.75,46.50,47.25,8976400,11.32
    +1992-07-28,45.50,46.50,45.25,46.50,4813600,11.14
    +1992-07-27,45.75,46.50,45.25,45.25,88800,10.84
    +1992-07-24,44.50,46.25,44.00,45.88,4832000,10.99
    +1992-07-23,44.50,44.75,43.75,44.75,6128800,10.72
    +1992-07-22,45.25,45.50,44.00,44.25,5798800,10.60
    +1992-07-21,45.50,46.25,45.00,45.75,4730800,10.96
    +1992-07-20,44.75,45.25,44.00,44.75,6873600,10.72
    +1992-07-17,45.00,46.00,44.63,45.00,15135600,10.78
    +1992-07-16,47.75,49.00,47.25,48.75,5011200,11.68
    +1992-07-15,47.50,49.00,47.25,48.00,6248000,11.50
    +1992-07-14,47.00,48.00,47.00,47.50,4510800,11.38
    +1992-07-13,45.75,47.13,45.25,47.00,4486800,11.26
    +1992-07-10,46.00,46.25,44.88,45.75,5144400,10.96
    +1992-07-09,46.00,46.50,45.75,45.88,5922000,10.99
    +1992-07-08,44.00,45.75,44.00,45.75,7020000,10.96
    +1992-07-07,46.25,46.25,43.50,44.25,7416400,10.60
    +1992-07-06,46.50,46.75,45.50,46.25,4378000,11.08
    +1992-07-02,49.00,49.00,45.75,46.25,9169200,11.08
    +1992-07-01,48.00,49.50,47.75,49.00,5129200,11.74
    +1992-06-30,46.75,48.25,46.50,48.00,6919200,11.50
    +1992-06-29,45.75,47.13,45.25,46.75,6735200,11.20
    +1992-06-26,45.75,46.00,44.50,45.25,3953600,10.84
    +1992-06-25,46.50,46.50,45.25,45.63,5745200,10.93
    +1992-06-24,45.50,46.00,45.25,46.00,7548000,11.02
    +1992-06-23,45.00,45.50,44.50,45.25,11130800,10.84
    +1992-06-22,44.00,44.75,42.75,44.25,13930000,10.60
    +1992-06-19,46.00,46.00,43.75,44.75,15280000,10.72
    +1992-06-18,47.50,49.00,44.75,45.25,15495600,10.84
    +1992-06-17,49.00,49.25,47.00,47.50,10880800,11.38
    +1992-06-16,51.75,52.00,48.75,49.25,13053200,11.80
    +1992-06-15,54.00,54.00,52.50,52.63,6777600,12.61
    +1992-06-12,54.50,55.00,54.25,54.63,3450800,13.09
    +1992-06-11,53.75,54.25,53.50,53.88,5028800,12.91
    +1992-06-10,54.00,54.75,53.50,53.75,4522400,12.88
    +1992-06-09,54.25,54.25,53.50,54.00,3626800,12.94
    +1992-06-08,55.00,55.00,54.00,54.25,3730000,13.00
    +1992-06-05,54.75,55.25,54.25,54.88,4040800,13.15
    +1992-06-04,54.25,54.75,53.50,54.50,6453200,13.06
    +1992-06-03,56.50,56.50,54.00,54.13,10743200,12.97
    +1992-06-02,57.50,57.50,56.25,56.50,5560000,13.54
    +1992-06-01,57.25,59.50,56.00,57.50,8869200,13.78
    +1992-05-29,59.75,60.63,59.50,59.75,6369200,14.29
    +1992-05-28,60.00,60.25,59.00,59.50,4558000,14.23
    +1992-05-27,59.25,60.25,59.00,60.25,5516400,14.41
    +1992-05-26,59.50,59.75,58.75,59.25,3423200,14.17
    +1992-05-22,59.00,59.75,59.00,59.50,1670800,14.23
    +1992-05-21,60.25,60.25,58.75,59.13,4938800,14.14
    +1992-05-20,59.75,60.25,59.25,60.00,6200800,14.35
    +1992-05-19,60.75,60.75,59.00,59.38,4715600,14.20
    +1992-05-18,61.50,61.50,60.00,60.38,4616400,14.44
    +1992-05-15,61.00,61.25,60.50,60.63,4339200,14.50
    +1992-05-14,62.75,63.00,60.25,61.38,5606800,14.68
    +1992-05-13,62.50,63.25,62.25,62.75,3482000,15.01
    +1992-05-12,62.25,63.00,61.75,62.25,2769200,14.89
    +1992-05-11,62.00,62.75,61.50,62.25,3250000,14.89
    +1992-05-08,61.50,62.88,61.00,62.00,7105600,14.83
    +1992-05-07,61.50,62.25,60.50,60.75,6175600,14.53
    +1992-05-06,60.75,62.13,60.50,61.75,6377600,14.77
    +1992-05-05,60.50,60.63,59.50,60.50,6449200,14.47
    +1992-05-04,59.50,61.25,59.25,60.50,4402000,14.47
    +1992-05-01,60.00,60.75,58.25,59.25,4821200,14.17
    +1992-04-30,57.25,60.25,56.50,60.13,9303600,14.38
    +1992-04-29,54.25,57.00,54.25,57.00,7116800,13.63
    +1992-04-28,55.25,55.75,53.00,54.25,6229200,12.97
    +1992-04-27,56.00,56.25,55.00,55.75,5014800,13.33
    +1992-04-24,57.00,58.25,56.00,56.50,3526800,13.51
    +1992-04-23,57.50,58.25,56.00,57.00,6534400,13.63
    +1992-04-22,56.25,58.00,56.25,57.63,6129200,13.78
    +1992-04-21,57.00,57.25,56.00,56.25,6442400,13.45
    +1992-04-20,59.00,59.00,56.00,56.75,7380800,13.57
    +1992-04-16,60.25,60.75,58.50,59.00,9260800,14.11
    +1992-04-15,58.00,60.88,57.50,60.50,7764400,14.47
    +1992-04-14,57.75,59.25,57.25,58.75,5178000,14.05
    +1992-04-13,55.50,56.75,55.25,56.50,4402000,13.51
    +1992-04-10,57.25,57.50,55.00,55.50,9803600,13.27
    +1992-04-09,56.00,58.25,55.25,57.25,6874400,13.69
    +1992-04-08,57.00,57.00,54.75,55.88,13123600,13.36
    +1992-04-07,61.00,61.25,57.25,57.25,8234400,13.69
    +1992-04-06,59.00,61.00,59.00,60.75,3643600,14.53
    +1992-04-03,58.75,59.25,58.50,59.00,4181200,14.11
    +1992-04-02,59.00,59.50,58.38,58.75,4798800,14.05
    +1992-04-01,57.25,59.25,57.25,59.00,5714400,14.11
    +1992-03-31,58.25,59.75,58.00,58.25,7613200,13.93
    +1992-03-30,61.25,61.25,57.75,58.13,12124400,13.90
    +1992-03-27,63.88,64.00,60.50,61.00,9452000,14.59
    +1992-03-26,64.75,65.25,63.75,64.00,4412400,15.30
    +1992-03-25,65.00,65.00,64.25,64.50,4353200,15.42
    +1992-03-24,63.50,65.00,63.25,65.00,7501200,15.54
    +1992-03-23,63.00,63.75,63.00,63.00,1804400,15.07
    +1992-03-20,63.00,63.25,63.00,63.25,1942400,15.13
    +1992-03-19,63.75,63.75,62.75,63.00,4251200,15.07
    +1992-03-18,63.25,64.00,63.00,63.75,2902000,15.25
    +1992-03-17,63.50,63.75,62.75,62.88,3061200,15.04
    +1992-03-16,62.75,63.50,61.75,63.38,2016400,15.16
    +1992-03-13,63.25,63.75,62.00,63.13,2843600,15.10
    +1992-03-12,63.25,63.75,61.50,62.75,5472400,15.01
    +1992-03-11,63.75,64.25,63.00,63.25,4714400,15.13
    +1992-03-10,64.00,64.75,63.75,63.75,4394400,15.25
    +1992-03-09,63.75,64.25,63.50,63.75,3896800,15.25
    +1992-03-06,63.50,64.00,63.00,64.00,4816400,15.30
    +1992-03-05,64.50,65.50,63.00,63.50,8462400,15.19
    +1992-03-04,66.25,66.75,64.75,65.00,4120800,15.54
    +1992-03-03,67.75,68.00,66.25,66.37,3560000,15.87
    +1992-03-02,67.75,68.50,67.25,67.25,3203200,16.08
    +1992-02-28,68.50,69.00,67.00,67.50,3244400,16.14
    +1992-02-27,70.00,70.00,68.00,68.50,4364800,16.38
    +1992-02-26,68.25,70.00,68.25,69.87,8193600,16.71
    +1992-02-25,66.25,68.50,65.25,68.50,8134400,16.38
    +1992-02-24,66.25,66.50,65.75,66.12,6122400,15.81
    +1992-02-21,64.75,65.50,64.50,65.00,5421200,15.54
    +1992-02-20,62.50,64.75,62.25,64.62,4692400,15.45
    +1992-02-19,62.75,63.00,61.75,62.00,3426400,14.83
    +1992-02-18,64.25,64.50,62.75,62.75,2442000,15.01
    +1992-02-14,63.75,64.25,63.25,64.12,2610800,15.33
    +1992-02-13,65.25,65.25,63.75,64.25,2734400,15.34
    +1992-02-12,63.75,65.50,63.00,65.25,4931200,15.57
    +1992-02-11,63.00,63.75,62.25,62.88,4378800,15.01
    +1992-02-10,64.00,64.25,63.00,63.13,3091200,15.07
    +1992-02-07,64.25,64.75,62.75,64.00,5285600,15.28
    +1992-02-06,65.75,66.00,64.00,64.12,3330000,15.30
    +1992-02-05,66.25,66.75,65.12,66.12,5772400,15.78
    +1992-02-04,65.75,66.25,65.00,65.75,6896400,15.69
    +1992-02-03,64.75,66.25,64.50,65.75,5652000,15.69
    +1992-01-31,64.00,65.25,63.50,64.75,5164400,15.46
    +1992-01-30,63.50,63.75,62.75,63.75,3128800,15.22
    +1992-01-29,64.75,65.75,63.25,63.25,5164400,15.10
    +1992-01-28,64.75,65.37,63.00,65.25,6206800,15.57
    +1992-01-27,64.75,65.25,64.25,64.50,2992000,15.40
    +1992-01-24,64.50,65.75,64.00,64.62,6356400,15.42
    +1992-01-23,64.25,64.75,63.00,64.50,4953200,15.40
    +1992-01-22,61.50,63.75,61.25,63.50,6560000,15.16
    +1992-01-21,64.25,64.25,61.00,61.13,6938000,14.59
    +1992-01-20,64.50,65.25,64.00,64.00,7492400,15.28
    +1992-01-17,67.75,69.00,64.75,64.75,30308800,15.46
    +1992-01-16,63.75,64.25,62.50,62.75,10485200,14.98
    +1992-01-15,64.50,65.00,63.00,63.50,11652400,15.16
    +1992-01-14,62.25,64.75,62.25,64.50,9789200,15.40
    +1992-01-13,62.25,62.75,61.50,62.00,3858800,14.80
    +1992-01-10,61.50,62.50,61.00,62.25,7012400,14.86
    +1992-01-09,60.50,62.25,60.25,62.25,7450800,14.86
    +1992-01-08,58.50,61.25,58.50,60.50,8330800,14.44
    +1992-01-07,57.50,59.50,57.50,59.13,5059200,14.11
    +1992-01-06,58.75,59.00,57.75,58.00,4080000,13.84
    +1992-01-03,60.00,60.25,58.25,59.00,6814400,14.08
    +1992-01-02,55.75,59.75,55.50,59.50,8357600,14.20
    +1991-12-31,57.38,58.00,56.00,56.38,4802000,13.46
    +1991-12-30,55.00,57.25,55.00,56.75,6580800,13.55
    +1991-12-27,54.75,55.75,54.50,55.00,6008000,13.13
    +1991-12-26,52.75,55.00,52.25,54.88,4805600,13.10
    +1991-12-24,52.00,53.75,51.75,52.25,6742400,12.47
    +1991-12-23,50.50,51.75,50.00,51.50,3686800,12.29
    +1991-12-20,51.25,51.50,50.25,50.25,4588000,11.99
    +1991-12-19,51.25,51.75,50.75,50.75,4140800,12.11
    +1991-12-18,50.25,52.00,50.00,51.75,6678000,12.35
    +1991-12-17,50.50,51.00,50.25,50.50,3502400,12.05
    +1991-12-16,50.38,50.75,50.00,50.50,2777600,12.05
    +1991-12-13,49.75,50.75,49.75,50.38,3418000,12.03
    +1991-12-12,49.38,49.75,49.00,49.38,3297600,11.79
    +1991-12-11,49.25,49.75,48.50,49.00,3031200,11.70
    +1991-12-10,49.00,49.50,48.50,49.13,4390000,11.73
    +1991-12-09,49.00,50.00,48.75,49.13,3502000,11.73
    +1991-12-06,49.50,49.75,48.50,48.75,7055200,11.64
    +1991-12-05,50.50,51.00,49.25,50.00,3555600,11.93
    +1991-12-04,50.75,50.75,50.00,50.50,2897600,12.05
    +1991-12-03,52.00,52.00,50.25,50.50,3692400,12.05
    +1991-12-02,50.75,52.00,50.00,51.75,4250000,12.35
    +1991-11-29,50.50,51.50,50.50,50.75,1227600,12.11
    +1991-11-27,51.25,51.50,50.50,51.00,2268800,12.17
    +1991-11-26,51.50,52.00,50.00,51.50,4982000,12.29
    +1991-11-25,51.00,52.25,51.00,51.25,2802000,12.23
    +1991-11-22,51.00,51.75,50.25,51.25,3502400,12.23
    +1991-11-21,50.50,51.75,50.50,51.00,3823200,12.17
    +1991-11-20,51.25,52.00,50.25,50.50,6005600,12.05
    +1991-11-19,51.75,51.75,49.75,51.25,10216400,12.23
    +1991-11-18,50.00,52.50,50.00,52.13,8530000,12.44
    +1991-11-15,54.50,54.75,49.75,50.00,9186400,11.91
    +1991-11-14,54.25,55.25,54.00,54.75,6733600,13.04
    +1991-11-13,54.00,54.50,53.50,54.13,6640000,12.89
    +1991-11-12,54.25,54.75,53.75,54.50,5972000,12.98
    +1991-11-11,53.50,54.50,53.25,53.75,5896800,12.80
    +1991-11-08,51.25,53.75,51.00,53.25,13435200,12.68
    +1991-11-07,48.50,50.50,48.25,49.75,10618800,11.85
    +1991-11-06,49.00,49.25,47.50,48.00,8466400,11.43
    +1991-11-05,49.75,50.50,48.75,48.75,7711200,11.61
    +1991-11-04,50.75,50.75,48.50,49.75,6983200,11.85
    +1991-11-01,51.25,52.00,50.50,51.00,7203600,12.14
    +1991-10-31,50.75,51.75,50.00,51.50,8300800,12.26
    +1991-10-30,52.00,52.75,49.50,49.75,5302400,11.85
    +1991-10-29,51.50,52.00,50.75,51.75,3624400,12.32
    +1991-10-28,51.50,51.75,50.75,51.50,2792400,12.26
    +1991-10-25,51.75,52.25,50.75,51.25,3832000,12.20
    +1991-10-24,53.00,53.25,51.50,52.13,6372400,12.41
    +1991-10-23,55.00,55.25,52.75,53.13,6046400,12.65
    +1991-10-22,55.50,56.25,54.50,54.50,7456400,12.98
    +1991-10-21,55.25,55.88,54.25,54.75,4172000,13.04
    +1991-10-18,55.13,55.50,54.50,55.00,15964400,13.10
    +1991-10-17,53.00,53.25,51.50,52.38,5423200,12.47
    +1991-10-16,52.50,54.00,52.25,53.50,7182000,12.74
    +1991-10-15,50.50,52.50,50.00,52.50,10300800,12.50
    +1991-10-14,49.00,50.25,48.75,49.88,4015600,11.88
    +1991-10-11,48.13,48.88,46.50,48.50,4292000,11.55
    +1991-10-10,48.75,49.00,46.75,47.75,5623200,11.37
    +1991-10-09,48.25,48.75,47.75,48.00,4752400,11.43
    +1991-10-08,48.13,48.50,46.50,48.25,6170000,11.49
    +1991-10-07,48.00,48.75,47.50,48.13,2328000,11.46
    +1991-10-04,48.00,48.75,47.50,48.25,2854400,11.49
    +1991-10-03,50.00,50.00,47.50,47.75,6478000,11.37
    +1991-10-02,51.75,51.75,49.50,49.75,643600,11.85
    +1991-10-01,49.25,51.25,49.00,50.75,4698800,12.08
    +1991-09-30,49.25,49.75,49.00,49.50,2266800,11.79
    +1991-09-27,50.00,50.75,48.75,49.00,2245200,11.67
    +1991-09-26,50.25,50.25,49.00,50.00,2556800,11.91
    +1991-09-25,50.25,50.50,49.25,50.50,1959200,12.02
    +1991-09-24,49.50,50.38,48.25,50.25,3805600,11.97
    +1991-09-23,50.00,50.75,49.25,49.50,3136800,11.79
    +1991-09-20,49.75,51.00,49.50,50.63,6742000,12.06
    +1991-09-19,50.25,50.50,49.50,49.75,6374400,11.85
    +1991-09-18,48.75,50.50,48.50,50.13,4342000,11.94
    +1991-09-17,47.00,49.00,46.75,49.00,4856400,11.67
    +1991-09-16,49.25,49.25,46.50,47.25,7365600,11.25
    +1991-09-13,50.00,50.25,48.50,48.63,5974400,11.58
    +1991-09-12,51.25,51.25,49.75,50.63,4267600,12.06
    +1991-09-11,50.75,51.00,49.50,50.50,6378000,12.02
    +1991-09-10,52.75,53.38,49.75,50.13,6535600,11.94
    +1991-09-09,51.75,53.50,51.50,53.25,4538000,12.68
    +1991-09-06,51.00,51.75,50.50,51.50,2848800,12.26
    +1991-09-05,51.50,51.75,50.75,51.00,2793600,12.14
    +1991-09-04,52.75,52.75,51.38,51.50,4299200,12.26
    +1991-09-03,52.75,53.25,52.00,52.50,2443200,12.50
    +1991-08-30,53.00,53.25,52.25,53.00,2363200,12.62
    +1991-08-29,53.25,53.88,52.50,53.00,4053200,12.62
    +1991-08-28,54.00,54.25,53.13,53.25,3843600,12.68
    +1991-08-27,53.00,54.00,52.75,54.00,3597600,12.86
    +1991-08-26,53.00,53.50,52.50,53.00,3644400,12.62
    +1991-08-23,54.00,55.50,52.75,53.00,8601200,12.62
    +1991-08-22,54.00,54.75,53.75,54.25,5936400,12.92
    +1991-08-21,52.50,54.13,52.00,53.75,7987600,12.80
    +1991-08-20,51.50,51.75,50.50,51.00,7123600,12.14
    +1991-08-19,49.50,51.63,48.50,50.50,11538000,12.02
    +1991-08-16,52.75,54.25,52.25,53.25,5689200,12.65
    +1991-08-15,55.00,55.00,53.00,53.25,5219200,12.65
    +1991-08-14,54.75,55.00,53.88,54.88,7173200,13.04
    +1991-08-13,52.00,54.00,52.00,53.50,10255200,12.71
    +1991-08-12,50.75,52.25,50.50,51.75,5096400,12.29
    +1991-08-09,50.50,51.00,49.75,50.75,5533600,12.06
    +1991-08-08,50.75,51.75,50.00,50.50,6769200,12.00
    +1991-08-07,49.50,51.00,49.38,50.38,7578800,11.97
    +1991-08-06,48.75,50.25,47.75,49.50,7890800,11.76
    +1991-08-05,49.75,49.75,48.25,48.50,3620800,11.52
    +1991-08-02,49.75,50.25,49.00,50.00,9767600,11.88
    +1991-08-01,46.00,49.25,45.75,49.13,16023600,11.67
    +1991-07-31,46.50,46.88,45.00,46.25,3689200,10.99
    +1991-07-30,45.50,46.75,45.50,46.50,3281200,11.05
    +1991-07-29,45.25,45.50,44.50,45.50,1916800,10.81
    +1991-07-26,45.75,45.75,44.75,44.88,2657600,10.66
    +1991-07-25,45.25,45.75,45.00,45.25,2366800,10.75
    +1991-07-24,45.25,45.75,44.50,45.00,4703200,10.69
    +1991-07-23,46.25,46.50,44.50,45.00,4770000,10.69
    +1991-07-22,45.75,46.25,45.50,46.00,3882000,10.93
    +1991-07-19,45.25,46.25,45.00,46.00,4601200,10.93
    +1991-07-18,44.00,45.13,43.00,44.88,14240000,10.66
    +1991-07-17,43.50,44.50,42.25,42.50,7474400,10.10
    +1991-07-16,45.50,45.75,43.50,43.75,7966400,10.39
    +1991-07-15,46.75,46.75,45.50,45.50,4932400,10.81
    +1991-07-12,47.25,47.25,46.25,46.75,4753200,11.11
    +1991-07-11,47.00,47.25,46.00,46.75,5217600,11.11
    +1991-07-10,47.50,48.25,46.75,47.25,5610000,11.23
    +1991-07-09,47.25,48.25,46.50,46.88,8091200,11.14
    +1991-07-08,45.25,47.25,45.00,46.75,10971200,11.11
    +1991-07-05,43.00,46.00,42.75,45.63,11842000,10.84
    +1991-07-03,42.25,43.50,41.75,43.13,11087600,10.25
    +1991-07-02,42.25,42.75,41.75,42.25,4296800,10.04
    +1991-07-01,42.25,43.00,41.75,42.50,6979200,10.10
    +1991-06-28,42.25,42.50,40.25,41.50,8102400,9.86
    +1991-06-27,42.50,42.75,41.75,42.50,5400000,10.10
    +1991-06-26,42.75,43.50,42.25,43.00,8958000,10.22
    +1991-06-25,42.00,43.00,41.75,42.38,8151200,10.07
    +1991-06-24,41.75,42.25,41.25,41.75,7443600,9.92
    +1991-06-21,42.00,42.50,41.75,42.00,7378800,9.98
    +1991-06-20,41.25,42.00,40.75,42.00,5158000,9.98
    +1991-06-19,41.75,42.25,41.25,41.75,6408000,9.92
    +1991-06-18,42.25,43.25,41.50,42.13,8749200,10.01
    +1991-06-17,41.00,42.25,41.00,42.00,5966800,9.98
    +1991-06-14,42.75,42.75,40.75,41.13,8049200,9.77
    +1991-06-13,42.50,43.00,41.75,42.13,7565200,10.01
    +1991-06-12,44.00,44.75,41.25,42.38,15580000,10.07
    +1991-06-11,45.00,45.50,44.25,44.63,6742400,10.60
    +1991-06-10,46.00,47.13,45.75,46.00,5991200,10.93
    +1991-06-07,46.25,47.00,45.63,46.13,5463600,10.96
    +1991-06-06,48.25,48.25,46.50,46.63,6028000,11.08
    +1991-06-05,49.25,49.25,47.75,48.00,4760800,11.40
    +1991-06-04,49.50,49.50,48.50,49.13,6593600,11.67
    +1991-06-03,47.00,49.50,46.75,49.25,7870800,11.70
    +1991-05-31,47.50,47.75,46.25,47.00,7792400,11.17
    +1991-05-30,47.00,47.75,46.50,47.63,5663600,11.32
    +1991-05-29,46.25,47.75,45.88,47.00,13733600,11.17
    +1991-05-28,46.00,46.25,45.25,46.00,6124400,10.93
    +1991-05-24,45.50,46.00,45.00,45.88,3484800,10.90
    +1991-05-23,46.50,46.75,44.75,45.13,7458800,10.72
    +1991-05-22,45.75,46.50,45.50,46.25,8137600,10.99
    +1991-05-21,45.25,46.50,44.75,45.25,12500000,10.75
    +1991-05-20,47.25,47.50,44.00,44.25,9365200,10.51
    +1991-05-17,48.75,48.75,46.50,47.00,16836800,11.14
    +1991-05-16,51.00,51.25,48.50,49.00,13652000,11.61
    +1991-05-15,51.50,52.00,49.00,50.50,18530800,11.97
    +1991-05-14,52.75,53.75,52.50,53.50,7763600,12.68
    +1991-05-13,52.25,53.50,51.50,52.75,8763600,12.50
    +1991-05-10,51.50,53.25,50.75,51.25,8652000,12.14
    +1991-05-09,50.00,51.50,49.75,50.75,8523200,12.03
    +1991-05-08,50.75,50.75,49.25,49.75,6332400,11.79
    +1991-05-07,51.00,51.25,50.50,50.63,9671200,12.00
    +1991-05-06,48.50,50.50,48.25,50.25,7596400,11.91
    +1991-05-03,49.00,49.50,48.25,49.00,8717600,11.61
    +1991-05-02,47.75,49.75,47.50,49.00,28973600,11.61
    +1991-05-01,48.00,49.00,47.00,47.25,66732000,11.20
    +1991-04-30,57.75,58.25,54.50,55.00,25413600,13.03
    +1991-04-29,58.50,60.25,58.25,58.25,7395200,13.80
    +1991-04-26,58.50,59.00,57.75,58.63,4481200,13.89
    +1991-04-25,59.75,59.75,58.50,58.50,11276800,13.86
    +1991-04-24,61.75,62.00,60.50,60.75,3769200,14.40
    +1991-04-23,62.25,63.00,60.25,61.50,8494400,14.57
    +1991-04-22,59.50,62.00,58.75,61.50,9190000,14.57
    +1991-04-19,61.00,61.50,59.50,59.63,10272400,14.13
    +1991-04-18,62.75,63.00,60.75,61.00,8853600,14.46
    +1991-04-17,65.00,65.00,62.00,63.25,11533600,14.99
    +1991-04-16,63.25,64.50,62.50,64.25,22176800,15.23
    +1991-04-15,61.75,64.50,60.00,62.25,60732400,14.75
    +1991-04-12,71.50,73.25,69.75,71.75,13140000,17.00
    +1991-04-11,67.75,71.37,67.50,71.00,12710800,16.83
    +1991-04-10,68.50,69.25,66.75,66.87,7733600,15.85
    +1991-04-09,69.75,70.00,68.25,68.75,4280800,16.29
    +1991-04-08,69.25,70.00,68.75,70.00,2604400,16.59
    +1991-04-05,71.75,71.75,68.75,69.37,5567600,16.44
    +1991-04-04,70.00,72.00,69.50,71.50,6024400,16.94
    +1991-04-03,72.50,72.75,70.00,70.00,8585200,16.59
    +1991-04-02,69.00,72.75,68.50,72.75,10473600,17.24
    +1991-04-01,68.00,69.50,67.50,68.50,4218000,16.23
    +1991-03-28,69.25,70.00,67.75,68.00,2816800,16.11
    +1991-03-27,70.00,70.25,68.50,69.25,6812400,16.41
    +1991-03-26,64.75,70.25,64.75,70.00,11935200,16.59
    +1991-03-25,63.50,65.00,63.25,64.50,4858800,15.28
    +1991-03-22,64.00,64.75,62.25,63.25,12096400,14.99
    +1991-03-21,68.25,68.75,63.75,64.75,10600000,15.34
    +1991-03-20,69.25,69.50,66.87,67.75,12939200,16.06
    +1991-03-19,66.50,70.25,65.75,69.50,15100000,16.47
    +1991-03-18,65.75,68.25,65.75,67.75,7645200,16.06
    +1991-03-15,65.75,66.50,65.25,66.25,7335600,15.70
    +1991-03-14,66.75,67.50,64.50,65.25,8126400,15.46
    +1991-03-13,62.75,66.50,62.75,66.25,6253200,15.70
    +1991-03-12,63.00,63.75,62.50,62.88,8360000,14.90
    +1991-03-11,64.50,64.75,62.25,63.50,6276400,15.05
    +1991-03-08,67.75,68.25,65.00,65.00,11522400,15.40
    +1991-03-07,63.50,67.50,63.25,67.25,11497600,15.94
    +1991-03-06,64.00,65.62,62.88,63.00,18731200,14.93
    +1991-03-05,59.00,63.25,59.00,63.13,15769200,14.96
    +1991-03-04,58.00,58.75,57.00,58.38,3175600,13.83
    +1991-03-01,57.00,59.00,57.00,57.75,4518800,13.69
    +1991-02-28,58.25,58.50,56.25,57.25,8120000,13.57
    +1991-02-27,58.25,58.50,57.50,58.25,6243200,13.80
    +1991-02-26,57.50,58.75,56.50,58.25,8934400,13.80
    +1991-02-25,60.25,60.50,57.50,58.00,12848800,13.74
    +1991-02-22,59.00,61.75,58.50,59.75,8320800,14.16
    +1991-02-21,61.25,62.25,58.75,59.00,6826400,13.98
    +1991-02-20,59.50,61.75,59.25,61.00,7646800,14.46
    +1991-02-19,57.50,60.25,57.38,60.00,8080800,14.22
    +1991-02-15,57.25,58.50,57.25,57.63,13067600,13.66
    +1991-02-14,60.00,60.00,56.75,57.13,13493200,13.51
    +1991-02-13,60.00,60.25,58.00,60.00,9130800,14.19
    +1991-02-12,61.00,61.25,59.38,60.00,8042000,14.19
    +1991-02-11,60.00,61.50,59.75,61.38,11546400,14.51
    +1991-02-08,57.50,60.25,57.50,59.88,11220000,14.16
    +1991-02-07,57.00,58.75,55.75,57.75,18587600,13.66
    +1991-02-06,57.75,58.25,56.50,56.88,7965200,13.45
    +1991-02-05,55.25,58.00,54.75,57.75,12740000,13.66
    +1991-02-04,55.75,56.00,55.00,55.25,9569200,13.07
    +1991-02-01,55.50,57.88,55.50,55.75,15897600,13.18
    +1991-01-31,55.50,56.00,54.75,55.50,8677600,13.12
    +1991-01-30,53.25,55.75,53.25,55.50,12043200,13.12
    +1991-01-29,54.25,54.50,52.25,53.75,7708800,12.71
    +1991-01-28,53.25,55.25,53.25,54.50,9771200,12.89
    +1991-01-25,52.00,53.63,52.00,53.50,8012000,12.65
    +1991-01-24,51.50,52.75,51.50,52.13,8374400,12.33
    +1991-01-23,51.25,52.25,51.00,51.75,8725600,12.24
    +1991-01-22,51.00,52.50,50.50,51.25,15296400,12.12
    +1991-01-21,49.75,51.50,49.75,50.75,11595200,12.00
    +1991-01-18,48.75,50.75,48.50,50.25,33691200,11.88
    +1991-01-17,52.50,52.75,49.00,51.25,21137600,12.12
    +1991-01-16,47.00,50.00,46.75,49.75,13968800,11.76
    +1991-01-15,46.50,46.75,46.00,46.75,6870000,11.06
    +1991-01-14,46.00,46.75,46.00,46.25,7535600,10.94
    +1991-01-11,47.00,47.25,46.00,47.00,11003200,11.11
    +1991-01-10,45.75,47.25,45.75,47.13,15562400,11.15
    +1991-01-09,44.25,46.00,43.75,45.25,16692400,10.70
    +1991-01-08,43.75,43.88,42.50,43.25,7816400,10.23
    +1991-01-07,43.00,45.25,43.00,43.25,11111200,10.23
    +1991-01-04,43.00,44.25,43.00,43.25,5062400,10.23
    +1991-01-03,43.50,44.25,43.00,43.00,5365600,10.17
    +1991-01-02,42.75,44.00,42.00,43.50,5543600,10.29
    +1990-12-31,43.00,43.25,42.75,43.00,1593200,10.17
    +1990-12-28,43.25,43.50,42.75,43.00,2285200,10.17
    +1990-12-27,43.25,44.00,43.25,43.50,3492000,10.29
    +1990-12-26,44.00,44.25,43.00,43.75,3682000,10.35
    +1990-12-24,44.75,45.00,44.00,44.00,2106800,10.40
    +1990-12-21,44.25,45.25,43.50,45.00,12363200,10.64
    +1990-12-20,41.25,44.50,41.25,44.00,14326400,10.40
    +1990-12-19,42.50,42.50,41.13,41.88,5036800,9.90
    +1990-12-18,41.00,42.50,40.75,42.25,7899200,9.99
    +1990-12-17,39.00,40.50,39.00,40.13,4683600,9.49
    +1990-12-14,40.25,40.50,39.50,39.88,3126400,9.43
    +1990-12-13,39.50,41.00,39.50,40.75,5752000,9.64
    +1990-12-12,39.75,40.00,39.00,39.63,8664400,9.37
    +1990-12-11,41.25,41.50,40.00,40.00,12438000,9.46
    +1990-12-10,42.25,42.50,41.50,41.75,8966400,9.87
    +1990-12-07,41.00,42.75,41.00,42.50,11781200,10.05
    +1990-12-06,41.25,41.75,40.50,41.25,19013600,9.75
    +1990-12-05,38.50,40.25,37.88,40.13,7822000,9.49
    +1990-12-04,37.50,38.75,37.50,38.50,5453200,9.10
    +1990-12-03,37.25,38.25,37.00,38.13,5922400,9.02
    +1990-11-30,36.25,37.25,36.25,36.75,4350800,8.69
    +1990-11-29,37.00,37.00,36.25,36.75,4528000,8.69
    +1990-11-28,37.75,38.50,36.75,36.75,6250800,8.69
    +1990-11-27,37.00,38.25,36.75,37.50,5899200,8.87
    +1990-11-26,36.00,37.00,36.00,36.75,2925600,8.69
    +1990-11-23,36.25,37.00,36.00,36.38,1911200,8.60
    +1990-11-21,35.25,36.25,34.75,36.13,4400800,8.54
    +1990-11-20,36.50,36.75,35.25,35.50,5490800,8.39
    +1990-11-19,35.50,36.38,35.25,36.38,8017600,8.60
    +1990-11-16,35.75,36.00,34.75,35.13,6545200,8.31
    +1990-11-15,36.75,37.00,35.50,36.00,5787600,8.48
    +1990-11-14,35.75,37.25,35.75,37.00,6819200,8.72
    +1990-11-13,36.25,36.50,35.75,36.00,5086400,8.48
    +1990-11-12,35.50,36.75,35.25,36.25,5192000,8.54
    +1990-11-09,35.00,35.75,34.50,35.50,7102000,8.37
    +1990-11-08,33.00,35.00,33.00,34.50,7136400,8.13
    +1990-11-07,33.50,33.75,32.63,33.25,7254400,7.84
    +1990-11-06,33.50,34.50,33.25,33.50,6620800,7.90
    +1990-11-05,32.25,33.50,32.00,33.25,6604400,7.84
    +1990-11-02,30.50,32.38,30.50,31.75,5323200,7.48
    +1990-11-01,30.50,31.00,29.75,30.50,3258800,7.19
    +1990-10-31,30.50,31.87,30.25,30.75,5331200,7.25
    +1990-10-30,29.75,30.75,28.87,30.37,3513600,7.16
    +1990-10-29,30.25,30.50,29.75,29.87,4415600,7.04
    +1990-10-26,29.75,31.25,29.75,30.00,4811200,7.07
    +1990-10-25,30.25,31.25,29.62,30.00,5481200,7.07
    +1990-10-24,30.75,31.00,30.00,30.50,5079200,7.19
    +1990-10-23,31.00,31.50,30.25,31.00,5969200,7.31
    +1990-10-22,31.50,31.50,30.50,31.12,9041200,7.33
    +1990-10-19,31.25,31.75,30.25,31.37,33363200,7.39
    +1990-10-18,26.50,28.75,26.50,28.50,11255600,6.72
    +1990-10-17,25.25,26.50,25.00,26.50,11059200,6.25
    +1990-10-16,27.50,27.50,24.25,25.00,10913200,5.89
    +1990-10-15,28.50,28.75,26.62,27.75,7190000,6.54
    +1990-10-12,28.25,28.50,27.00,28.25,8169200,6.66
    +1990-10-11,26.75,27.87,25.50,27.75,7376800,6.54
    +1990-10-10,27.25,28.00,26.00,26.50,5283600,6.25
    +1990-10-09,28.50,29.00,27.75,28.00,4321200,6.60
    +1990-10-08,28.75,29.25,28.25,29.12,2218800,6.86
    +1990-10-05,27.00,28.75,27.00,28.00,3572000,6.60
    +1990-10-04,26.75,28.00,26.25,28.00,7638800,6.60
    +1990-10-03,29.75,29.75,26.75,27.00,9591200,6.36
    +1990-10-02,31.00,32.00,29.50,29.62,9699200,6.98
    +1990-10-01,29.50,31.00,29.25,30.50,5581200,7.19
    +1990-09-28,28.50,29.00,27.25,29.00,6291200,6.83
    +1990-09-27,30.00,30.50,28.00,28.25,5085600,6.66
    +1990-09-26,30.00,30.50,29.75,29.75,3363200,7.01
    +1990-09-25,30.50,30.75,29.25,30.00,5642000,7.07
    +1990-09-24,31.50,31.50,29.75,30.25,4961200,7.13
    +1990-09-21,32.00,32.50,31.00,31.50,5503600,7.42
    +1990-09-20,32.25,32.25,31.25,31.62,3607600,7.45
    +1990-09-19,33.25,33.75,32.00,32.50,6536800,7.66
    +1990-09-18,33.75,33.75,33.00,33.38,4456400,7.87
    +1990-09-17,34.00,35.25,33.50,33.75,2782000,7.95
    +1990-09-14,33.50,34.25,33.25,34.00,4084400,8.01
    +1990-09-13,34.50,34.75,33.00,33.75,3492400,7.95
    +1990-09-12,34.50,34.50,33.50,34.00,3600800,8.01
    +1990-09-11,36.00,36.13,33.75,34.00,6370800,8.01
    +1990-09-10,37.00,37.00,35.75,35.75,2732400,8.43
    +1990-09-07,35.50,36.75,35.13,36.38,2098800,8.57
    +1990-09-06,35.50,36.00,35.25,35.75,3134800,8.43
    +1990-09-05,37.25,37.25,35.75,36.00,2292000,8.48
    +1990-09-04,36.50,37.50,36.50,37.00,2974800,8.72
    +1990-08-31,36.00,37.25,36.00,37.00,3570000,8.72
    +1990-08-30,37.25,37.50,36.00,36.25,4388800,8.54
    +1990-08-29,38.00,38.13,36.75,37.25,5407600,8.78
    +1990-08-28,37.50,38.38,37.25,38.13,2877600,8.99
    +1990-08-27,36.75,38.00,36.25,37.75,4214800,8.90
    +1990-08-24,35.25,36.00,34.75,35.50,2634400,8.37
    +1990-08-23,34.25,35.00,33.50,34.50,5138800,8.13
    +1990-08-22,37.00,37.00,34.88,35.13,4395600,8.28
    +1990-08-21,35.75,36.75,35.25,36.25,5769200,8.54
    +1990-08-20,36.50,37.50,36.25,36.75,2681200,8.66
    +1990-08-17,38.50,38.50,35.75,36.50,8806400,8.58
    +1990-08-16,39.00,39.63,38.50,38.50,4438800,9.05
    +1990-08-15,40.00,40.25,39.25,39.25,3292000,9.22
    +1990-08-14,40.00,40.00,39.25,39.75,3520800,9.34
    +1990-08-13,38.00,40.00,37.88,39.88,5584400,9.37
    +1990-08-10,38.75,39.25,38.25,38.75,3683600,9.11
    +1990-08-09,40.25,40.50,39.25,39.50,3443600,9.28
    +1990-08-08,39.50,40.75,39.50,40.13,3674400,9.43
    +1990-08-07,40.25,40.63,38.75,39.50,7096400,9.28
    +1990-08-06,39.00,40.50,38.50,39.50,6425600,9.28
    +1990-08-03,43.50,43.75,39.75,41.25,9609200,9.69
    +1990-08-02,41.25,43.75,41.25,43.50,7973600,10.22
    +1990-08-01,42.00,42.75,41.50,42.38,3350800,9.96
    +1990-07-31,42.50,42.75,41.50,42.00,3444800,9.87
    +1990-07-30,40.75,42.50,40.75,42.38,3058800,9.96
    +1990-07-27,41.25,41.75,40.50,41.38,2240000,9.72
    +1990-07-26,42.25,42.50,41.00,41.38,2885600,9.72
    +1990-07-25,42.00,43.25,41.75,42.25,3762400,9.93
    +1990-07-24,42.00,42.25,41.00,42.13,6928800,9.90
    +1990-07-23,41.00,41.75,40.00,41.50,9655200,9.75
    +1990-07-20,42.00,42.50,40.75,41.00,6858000,9.63
    +1990-07-19,40.75,42.50,40.00,41.75,20932400,9.81
    +1990-07-18,44.50,45.00,43.00,44.63,10309200,10.49
    +1990-07-17,45.75,46.00,44.00,44.25,4892000,10.40
    +1990-07-16,46.75,47.13,45.25,45.63,6428000,10.72
    +1990-07-13,47.50,47.75,46.75,46.75,8254400,10.99
    +1990-07-12,46.75,47.50,46.50,47.38,6537600,11.13
    +1990-07-11,46.75,47.00,45.75,47.00,8808800,11.04
    +1990-07-10,47.00,47.50,46.75,47.00,12923600,11.04
    +1990-07-09,45.00,47.00,44.75,46.63,11281200,10.96
    +1990-07-06,43.50,45.00,43.25,44.75,7481200,10.52
    +1990-07-05,43.75,44.25,43.25,43.50,3859200,10.22
    +1990-07-03,43.88,44.50,43.75,44.00,3572400,10.34
    +1990-07-02,44.50,44.50,43.75,44.00,4856400,10.34
    +1990-06-29,43.00,44.88,42.75,44.75,11622000,10.52
    +1990-06-28,42.75,43.25,41.75,43.00,8930000,10.10
    +1990-06-27,40.75,42.00,40.25,41.50,3490800,9.75
    +1990-06-26,41.75,42.00,40.38,40.63,4558800,9.55
    +1990-06-25,41.50,41.75,40.25,41.25,4378000,9.69
    +1990-06-22,42.00,42.63,41.25,41.50,10154400,9.75
    +1990-06-21,40.00,42.00,40.00,41.88,7455600,9.84
    +1990-06-20,39.88,40.25,39.75,40.00,5530000,9.40
    +1990-06-19,39.00,39.75,38.38,39.63,5623600,9.31
    +1990-06-18,39.25,39.50,39.00,39.25,3988800,9.22
    +1990-06-15,39.75,40.00,39.13,39.50,5163600,9.28
    +1990-06-14,40.00,40.25,39.25,39.75,5018000,9.34
    +1990-06-13,40.38,40.75,39.75,39.75,4963600,9.34
    +1990-06-12,39.13,40.50,38.75,40.50,5902000,9.52
    +1990-06-11,37.75,39.00,37.75,39.00,5661200,9.16
    +1990-06-08,38.50,38.50,37.50,38.25,11926800,8.99
    +1990-06-07,39.50,39.75,38.50,39.00,6668800,9.16
    +1990-06-06,39.00,39.50,38.75,39.50,7563600,9.28
    +1990-06-05,41.00,41.00,39.00,39.50,10702000,9.28
    +1990-06-04,40.75,41.00,39.75,40.75,6412400,9.58
    +1990-06-01,41.38,42.00,40.75,40.75,5624400,9.58
    +1990-05-31,41.50,41.50,41.00,41.25,3682400,9.69
    +1990-05-30,41.63,41.75,41.25,41.38,9890000,9.72
    +1990-05-29,40.00,41.25,39.25,41.00,8689200,9.63
    +1990-05-25,39.50,40.75,39.00,40.00,11562400,9.40
    +1990-05-24,42.25,42.25,41.50,42.00,5296400,9.87
    +1990-05-23,41.25,42.50,41.25,42.00,7417600,9.87
    +1990-05-22,40.13,41.50,40.00,41.38,10772000,9.72
    +1990-05-21,39.50,40.00,38.75,39.50,9382400,9.28
    +1990-05-18,41.25,41.50,39.50,39.75,9248000,9.31
    +1990-05-17,41.75,42.25,41.00,41.50,5488000,9.72
    +1990-05-16,41.75,41.75,41.00,41.63,3139200,9.76
    +1990-05-15,41.38,42.00,41.00,41.75,5343600,9.78
    +1990-05-14,42.75,42.75,41.25,41.75,8088000,9.78
    +1990-05-11,41.38,42.75,40.75,42.63,7691200,9.99
    +1990-05-10,41.75,41.75,40.50,41.38,6413600,9.70
    +1990-05-09,41.63,42.00,41.25,41.88,3491200,9.81
    +1990-05-08,41.00,42.00,41.00,41.75,4025600,9.78
    +1990-05-07,39.75,41.75,39.75,41.50,4866400,9.72
    +1990-05-04,40.00,40.75,39.25,40.00,6063200,9.37
    +1990-05-03,39.75,40.25,39.75,40.00,5950800,9.37
    +1990-05-02,39.75,40.00,39.25,39.75,4857600,9.31
    +1990-05-01,39.75,40.00,39.38,39.63,5845200,9.29
    +1990-04-30,39.25,39.75,39.00,39.38,4888800,9.23
    +1990-04-27,39.00,39.50,38.75,39.13,4178800,9.17
    +1990-04-26,39.00,39.50,38.13,38.88,5098000,9.11
    +1990-04-25,38.75,39.00,38.25,38.75,4743200,9.08
    +1990-04-24,40.00,40.50,38.50,38.75,10852000,9.08
    +1990-04-23,40.25,40.50,39.50,39.75,4597600,9.31
    +1990-04-20,40.88,41.50,39.75,40.25,11573600,9.43
    +1990-04-19,41.75,43.13,40.00,40.25,17215600,9.43
    +1990-04-18,43.25,43.75,42.50,43.25,6925200,10.13
    +1990-04-17,43.25,43.50,42.75,43.25,4683600,10.13
    +1990-04-16,43.50,44.25,43.25,43.75,8116400,10.25
    +1990-04-12,43.00,44.00,42.50,43.25,7566800,10.13
    +1990-04-11,41.50,43.00,41.50,42.50,7620000,9.96
    +1990-04-10,41.25,42.00,41.00,41.25,4695600,9.67
    +1990-04-09,39.75,41.50,39.50,41.13,3771200,9.64
    +1990-04-06,40.25,41.25,39.75,39.88,4235600,9.35
    +1990-04-05,41.00,41.25,40.00,40.25,3877600,9.43
    +1990-04-04,41.50,42.00,40.75,41.25,5363200,9.67
    +1990-04-03,40.50,41.75,40.50,41.75,5006400,9.78
    +1990-04-02,40.00,40.63,39.50,40.25,5332000,9.43
    +1990-03-30,40.00,41.00,40.00,40.25,7986400,9.43
    +1990-03-29,41.00,41.50,40.75,41.13,3472000,9.64
    +1990-03-28,42.00,42.13,41.00,41.25,3696800,9.67
    +1990-03-27,42.00,42.25,41.25,42.00,3033600,9.84
    +1990-03-26,42.50,43.38,42.00,42.25,4581200,9.90
    +1990-03-23,41.25,43.00,41.00,42.25,8155200,9.90
    +1990-03-22,41.75,42.25,40.75,40.75,8292400,9.55
    +1990-03-21,41.25,42.25,41.25,41.63,5463200,9.76
    +1990-03-20,42.25,43.00,40.75,41.38,13984400,9.70
    +1990-03-19,40.50,42.50,40.00,42.38,15433200,9.93
    +1990-03-16,40.00,40.75,39.13,40.25,23042400,9.43
    +1990-03-15,36.50,38.00,36.50,36.75,4302000,8.61
    +1990-03-14,36.75,37.25,36.50,37.00,3654800,8.67
    +1990-03-13,36.50,37.25,36.25,36.88,5321200,8.64
    +1990-03-12,37.25,37.50,36.25,36.63,5864400,8.58
    +1990-03-09,36.75,37.50,36.25,36.88,8248800,8.64
    +1990-03-08,35.75,37.00,35.00,36.75,8013600,8.61
    +1990-03-07,35.00,36.00,35.00,35.38,7301200,8.29
    +1990-03-06,35.00,35.25,34.50,35.25,5578800,8.26
    +1990-03-05,33.50,34.75,33.50,34.50,6537600,8.08
    +1990-03-02,33.50,34.75,33.25,33.75,3761200,7.91
    +1990-03-01,33.50,34.75,33.25,34.25,7283200,8.03
    +1990-02-28,33.50,34.00,33.25,34.00,3918800,7.97
    +1990-02-27,34.00,34.25,33.50,33.50,2642000,7.85
    +1990-02-26,33.00,34.25,33.00,34.00,2844800,7.97
    +1990-02-23,32.75,33.50,32.75,33.25,5375600,7.79
    +1990-02-22,34.00,34.50,33.00,33.00,6976800,7.73
    +1990-02-21,32.75,34.25,32.50,34.00,6283600,7.97
    +1990-02-20,33.50,33.75,33.00,33.50,4402400,7.85
    +1990-02-16,34.25,34.50,33.75,33.75,4556400,7.91
    +1990-02-15,33.75,34.25,33.50,34.25,3509200,8.00
    +1990-02-14,34.50,34.75,33.75,34.25,3448000,8.00
    +1990-02-13,34.00,35.00,33.75,34.50,3653600,8.06
    +1990-02-12,34.25,34.50,33.75,34.00,2695600,7.94
    +1990-02-09,33.50,34.50,33.25,34.25,6004400,8.00
    +1990-02-08,33.25,33.50,32.25,33.00,6680000,7.71
    +1990-02-07,33.00,34.00,32.50,33.25,11180800,7.77
    +1990-02-06,34.75,35.00,34.00,34.75,2640000,8.12
    +1990-02-05,34.25,35.25,34.00,35.00,3653200,8.18
    +1990-02-02,33.25,34.75,33.25,34.25,4248800,8.00
    +1990-02-01,34.50,34.63,33.50,33.63,4193200,7.86
    +1990-01-31,34.50,34.75,33.00,34.00,5152400,7.94
    +1990-01-30,33.25,34.50,33.00,34.00,4180800,7.94
    +1990-01-29,33.00,33.50,32.13,33.25,4284800,7.77
    +1990-01-26,34.00,34.00,32.25,32.75,6492000,7.65
    +1990-01-25,34.25,34.75,34.00,34.13,3996800,7.97
    +1990-01-24,32.50,34.25,32.25,34.00,6077600,7.94
    +1990-01-23,33.75,34.25,33.00,33.75,5048800,7.88
    +1990-01-22,34.00,34.50,33.25,33.25,5200800,7.77
    +1990-01-19,33.75,34.50,33.50,34.25,9485600,8.00
    +1990-01-18,33.00,33.50,32.25,32.38,9760800,7.56
    +1990-01-17,34.75,34.75,33.00,33.25,7050000,7.77
    +1990-01-16,33.50,35.00,32.75,34.88,7658000,8.15
    +1990-01-15,34.50,35.75,34.25,34.25,5785600,8.00
    +1990-01-12,34.25,34.75,33.75,34.50,6150000,8.06
    +1990-01-11,36.25,36.25,34.50,34.50,7547600,8.06
    +1990-01-10,37.63,37.63,35.75,36.00,7140000,8.41
    +1990-01-09,38.00,38.00,37.00,37.63,3096800,8.79
    +1990-01-08,37.50,38.00,37.00,38.00,3643200,8.88
    +1990-01-05,37.75,38.25,37.00,37.75,4406400,8.82
    +1990-01-04,38.25,38.75,37.25,37.63,7928800,8.79
    +1990-01-03,38.00,38.00,37.50,37.50,7444400,8.76
    +1990-01-02,35.25,37.50,35.00,37.25,6555600,8.70
    +1989-12-29,34.75,35.75,34.38,35.25,5445200,8.23
    +1989-12-28,35.00,35.25,34.25,34.63,5403200,8.09
    +1989-12-27,35.50,35.75,35.00,35.13,9189200,8.21
    +1989-12-26,36.75,36.75,35.25,35.50,4849200,8.29
    +1989-12-22,36.25,37.25,36.00,36.50,6610800,8.53
    +1989-12-21,35.75,36.25,35.50,36.25,10889200,8.47
    +1989-12-20,35.75,36.25,35.25,35.75,6377600,8.35
    +1989-12-19,34.50,35.50,34.50,35.00,8977600,8.18
    +1989-12-18,33.75,35.00,33.75,34.75,10978000,8.12
    +1989-12-15,34.75,35.00,32.50,33.75,18520800,7.88
    +1989-12-14,35.75,36.13,34.50,34.88,10886400,8.15
    +1989-12-13,36.00,36.50,35.50,36.00,13920000,8.41
    +1989-12-12,39.25,39.50,35.00,36.00,36634400,8.41
    +1989-12-11,41.00,41.50,38.38,39.25,23223200,9.17
    +1989-12-08,42.50,43.00,41.25,41.75,9032400,9.75
    +1989-12-07,42.25,43.25,42.00,42.75,6378800,9.99
    +1989-12-06,45.00,45.25,41.00,42.75,11965600,9.99
    +1989-12-05,45.25,45.75,44.50,45.00,4364800,10.51
    +1989-12-04,43.75,45.50,43.75,45.25,3498000,10.57
    +1989-12-01,44.50,45.00,43.63,44.00,5235200,10.28
    +1989-11-30,43.75,44.50,43.50,44.25,2280800,10.34
    +1989-11-29,43.50,44.25,42.50,44.00,5475200,10.28
    +1989-11-28,43.75,44.25,42.75,44.13,4854400,10.31
    +1989-11-27,44.75,45.25,43.75,44.00,3774800,10.28
    +1989-11-24,44.75,45.00,44.75,44.75,1014400,10.45
    +1989-11-22,45.50,45.75,44.50,44.75,3508000,10.45
    +1989-11-21,45.25,46.50,45.25,45.25,5013600,10.57
    +1989-11-20,45.00,45.50,44.50,45.25,3870800,10.57
    +1989-11-17,44.50,45.25,44.50,44.75,3164400,10.45
    +1989-11-16,44.50,44.75,43.75,44.75,3453600,10.43
    +1989-11-15,45.00,45.25,44.00,44.25,3499200,10.31
    +1989-11-14,46.50,46.75,44.50,44.75,3021200,10.43
    +1989-11-13,46.50,47.25,46.50,46.50,2445600,10.83
    +1989-11-10,45.75,47.00,45.75,46.75,2336800,10.89
    +1989-11-09,45.00,46.00,44.50,46.00,3166400,10.72
    +1989-11-08,44.25,45.25,44.25,45.00,5102000,10.49
    +1989-11-07,43.25,44.50,43.25,44.00,5406800,10.25
    +1989-11-06,43.50,44.00,43.00,43.25,4416400,10.08
    +1989-11-03,44.00,44.50,43.25,43.25,6258800,10.08
    +1989-11-02,45.00,45.00,43.00,44.00,16170800,10.25
    +1989-11-01,46.25,46.75,45.75,46.13,2199200,10.75
    +1989-10-31,45.75,46.50,45.50,46.50,3288800,10.83
    +1989-10-30,45.50,46.00,45.00,45.75,3121200,10.66
    +1989-10-27,45.25,45.75,44.50,45.25,4634400,10.54
    +1989-10-26,45.50,46.50,45.00,45.25,6048000,10.54
    +1989-10-25,47.75,47.75,46.25,46.50,4263600,10.83
    +1989-10-24,46.25,48.50,45.25,47.63,7735600,11.10
    +1989-10-23,48.00,48.25,46.25,46.75,4375600,10.89
    +1989-10-20,47.75,49.25,47.50,48.00,9350800,11.18
    +1989-10-19,48.25,49.50,48.25,48.75,4016800,11.36
    +1989-10-18,46.50,48.25,46.00,48.25,5157600,11.24
    +1989-10-17,46.00,48.75,45.00,47.25,8935600,11.01
    +1989-10-16,44.75,46.75,42.50,46.75,15184400,10.89
    +1989-10-13,48.75,49.50,45.00,45.75,7195600,10.66
    +1989-10-12,49.00,49.25,48.50,48.75,2969200,11.36
    +1989-10-11,48.75,49.25,48.00,48.88,5608800,11.39
    +1989-10-10,49.75,50.38,48.50,49.50,10262400,11.53
    +1989-10-09,48.00,49.75,47.50,49.50,6997600,11.53
    +1989-10-06,46.25,48.25,46.00,48.13,12939200,11.21
    +1989-10-05,44.50,46.50,44.25,45.50,8760000,10.60
    +1989-10-04,43.75,44.63,43.50,44.25,5687600,10.31
    +1989-10-03,44.25,44.50,43.13,43.63,6094400,10.17
    +1989-10-02,44.50,44.75,43.75,44.38,4922400,10.34
    +1989-09-29,45.25,45.50,44.50,44.50,2500800,10.37
    +1989-09-28,45.00,45.75,45.00,45.50,2856800,10.60
    +1989-09-27,44.25,45.13,44.00,44.75,3229200,10.43
    +1989-09-26,45.00,45.50,44.75,45.25,2762400,10.54
    +1989-09-25,44.75,45.75,44.75,45.25,4875600,10.54
    +1989-09-22,44.75,45.25,44.25,44.88,2605600,10.46
    +1989-09-21,45.00,46.00,44.25,44.75,7186800,10.43
    +1989-09-20,44.00,45.00,43.75,44.63,4230800,10.40
    +1989-09-19,44.25,44.50,43.00,43.25,2888800,10.08
    +1989-09-18,44.50,45.00,44.00,44.00,2264400,10.25
    +1989-09-15,45.00,45.25,44.25,45.00,4470800,10.49
    +1989-09-14,45.00,45.25,44.50,44.75,4693600,10.43
    +1989-09-13,46.25,46.63,45.00,45.00,4616400,10.49
    +1989-09-12,45.50,46.75,45.00,46.00,3710800,10.72
    +1989-09-11,44.75,46.00,44.50,45.75,3522000,10.66
    +1989-09-08,44.75,45.25,44.50,45.00,2013200,10.49
    +1989-09-07,44.75,45.50,44.75,44.75,4083200,10.43
    +1989-09-06,44.75,44.88,44.00,44.75,3108800,10.43
    +1989-09-05,44.50,45.38,44.50,44.75,4112400,10.43
    +1989-09-01,44.50,44.75,44.25,44.63,2651200,10.40
    +1989-08-31,44.50,45.00,44.25,44.50,2016400,10.37
    +1989-08-30,44.00,44.75,44.00,44.50,4161200,10.37
    +1989-08-29,44.75,45.00,43.75,44.13,6339200,10.28
    +1989-08-28,44.50,45.00,44.00,44.75,2936800,10.43
    +1989-08-25,44.00,45.00,44.00,44.75,5766400,10.43
    +1989-08-24,43.75,44.50,43.50,44.13,5829200,10.28
    +1989-08-23,43.00,44.25,42.50,43.75,6202400,10.19
    +1989-08-22,42.00,43.00,42.00,42.88,4013200,9.99
    +1989-08-21,42.25,43.25,42.00,42.25,4923600,9.84
    +1989-08-18,41.75,42.50,41.50,42.25,3003600,9.82
    +1989-08-17,40.25,41.25,40.00,41.00,5495600,9.53
    +1989-08-16,41.50,41.75,40.00,40.38,4318800,9.39
    +1989-08-15,40.75,41.50,40.75,41.38,5852000,9.62
    +1989-08-14,41.50,42.00,40.50,40.75,3690800,9.47
    +1989-08-11,44.00,44.00,41.25,41.88,8226800,9.74
    +1989-08-10,44.00,44.00,42.75,43.25,5442400,10.05
    +1989-08-09,44.00,45.75,43.88,44.00,6975600,10.23
    +1989-08-08,43.50,44.75,43.50,44.13,7366400,10.26
    +1989-08-07,43.00,44.00,42.63,43.75,6012000,10.17
    +1989-08-04,41.25,42.75,41.13,42.75,6564400,9.94
    +1989-08-03,40.50,41.50,40.50,41.25,6185600,9.59
    +1989-08-02,39.75,40.50,39.50,40.50,3633600,9.41
    +1989-08-01,39.75,40.25,39.25,39.88,4996800,9.27
    +1989-07-31,39.25,40.00,39.00,39.75,4014800,9.24
    +1989-07-28,39.25,39.75,39.00,39.38,4274400,9.15
    +1989-07-27,38.25,39.50,38.00,39.25,6193200,9.12
    +1989-07-26,38.25,38.50,37.75,38.25,8363600,8.89
    +1989-07-25,39.25,39.75,38.00,38.75,7502400,9.01
    +1989-07-24,39.75,39.75,39.25,39.25,4154800,9.12
    +1989-07-21,39.75,40.00,39.00,40.00,4993600,9.30
    +1989-07-20,40.75,41.25,39.75,40.00,8448800,9.30
    +1989-07-19,39.50,40.75,39.00,40.50,8543200,9.41
    +1989-07-18,40.75,40.75,38.75,39.25,17050800,9.12
    +1989-07-17,40.75,41.25,39.75,40.75,4694400,9.47
    +1989-07-14,40.75,41.00,39.75,40.75,9206800,9.47
    +1989-07-13,40.00,41.00,39.50,40.63,8057600,9.44
    +1989-07-12,39.75,40.25,39.50,40.00,4452000,9.30
    +1989-07-11,40.75,41.00,39.75,39.75,8729200,9.24
    +1989-07-10,41.00,41.25,40.00,40.50,7294400,9.41
    +1989-07-07,41.25,42.00,40.50,41.25,3806400,9.59
    +1989-07-06,40.75,41.75,40.25,41.25,6218000,9.59
    +1989-07-05,40.50,40.75,40.00,40.50,4264400,9.41
    +1989-07-03,41.75,41.75,40.75,40.75,1730800,9.47
    +1989-06-30,40.50,41.75,39.50,41.25,5885600,9.59
    +1989-06-29,41.00,41.25,40.00,40.63,8351200,9.44
    +1989-06-28,42.25,42.25,41.00,41.75,9190800,9.70
    +1989-06-27,43.75,44.25,42.50,42.63,3788000,9.91
    +1989-06-26,44.00,44.00,43.25,43.50,6568800,10.11
    +1989-06-23,43.25,44.25,43.25,43.88,4438800,10.20
    +1989-06-22,42.50,43.75,42.00,43.25,4911200,10.05
    +1989-06-21,43.00,43.50,42.25,42.50,4659200,9.88
    +1989-06-20,44.00,44.00,42.25,43.00,4807600,10.00
    +1989-06-19,44.50,44.75,43.50,44.00,6551200,10.23
    +1989-06-16,44.75,45.50,43.50,44.50,19378000,10.34
    +1989-06-15,49.50,49.75,47.50,47.50,5766800,11.04
    +1989-06-14,49.00,50.25,48.25,49.63,8983600,11.54
    +1989-06-13,47.50,48.75,47.00,48.50,8254400,11.27
    +1989-06-12,46.75,47.75,46.25,47.50,2892400,11.04
    +1989-06-09,47.25,47.75,46.50,47.00,3378800,10.93
    +1989-06-08,48.50,49.00,47.25,47.63,6378800,11.07
    +1989-06-07,46.75,48.50,46.75,48.25,6293200,11.22
    +1989-06-06,46.75,47.00,46.25,46.75,5189200,10.87
    +1989-06-05,48.75,49.00,46.50,47.00,4451200,10.93
    +1989-06-02,48.50,49.50,48.50,49.00,4448800,11.39
    +1989-06-01,47.75,49.25,47.50,48.75,6416800,11.33
    +1989-05-31,47.50,48.13,47.00,47.75,4134400,11.10
    +1989-05-30,48.25,49.00,47.38,47.50,4018000,11.04
    +1989-05-26,48.25,49.00,48.00,48.50,4028800,11.27
    +1989-05-25,47.25,49.00,47.25,48.25,8309200,11.22
    +1989-05-24,45.25,47.75,45.25,47.75,10645200,11.10
    +1989-05-23,46.00,46.00,45.25,45.50,4803600,10.58
    +1989-05-22,45.75,46.25,45.25,46.00,6800000,10.69
    +1989-05-19,44.75,46.25,44.75,45.75,11820800,10.61
    +1989-05-18,45.25,45.50,44.75,44.75,7558800,10.38
    +1989-05-17,45.25,45.50,45.00,45.25,8892400,10.50
    +1989-05-16,46.00,46.25,45.00,45.38,8170800,10.53
    +1989-05-15,44.75,46.25,44.75,46.00,11372400,10.67
    +1989-05-12,44.50,45.00,44.00,45.00,16685600,10.44
    +1989-05-11,43.25,44.25,43.00,43.88,10763600,10.18
    +1989-05-10,43.00,43.50,42.50,43.25,8380000,10.03
    +1989-05-09,42.00,43.00,42.00,42.50,12398800,9.86
    +1989-05-08,41.50,42.25,41.50,42.25,7373600,9.80
    +1989-05-05,42.50,42.75,41.50,41.50,16464400,9.63
    +1989-05-04,40.25,41.25,40.00,41.00,6762000,9.51
    +1989-05-03,39.75,40.75,39.75,40.25,7896800,9.34
    +1989-05-02,39.00,40.25,39.00,39.88,7719200,9.25
    +1989-05-01,38.50,39.25,38.50,39.00,2881200,9.05
    +1989-04-28,39.25,39.50,38.50,39.00,3725600,9.05
    +1989-04-27,39.50,40.00,39.00,39.38,4988000,9.13
    +1989-04-26,40.00,40.25,39.13,39.75,6652000,9.22
    +1989-04-25,40.00,40.50,39.75,40.00,4165600,9.28
    +1989-04-24,40.00,40.25,39.50,40.13,3977600,9.31
    +1989-04-21,40.50,40.88,39.75,40.13,4132000,9.31
    +1989-04-20,40.75,41.50,40.25,40.75,6434400,9.45
    +1989-04-19,40.00,41.63,39.75,40.88,15215600,9.48
    +1989-04-18,39.50,40.50,39.25,40.13,20055200,9.31
    +1989-04-17,38.50,39.25,38.00,39.25,5008000,9.10
    +1989-04-14,39.00,39.25,38.25,38.75,4408800,8.99
    +1989-04-13,38.75,39.50,38.25,38.50,6493200,8.93
    +1989-04-12,38.25,39.25,37.88,38.50,13862000,8.93
    +1989-04-11,37.50,38.00,37.00,37.75,5252400,8.76
    +1989-04-10,37.25,38.00,36.75,37.00,4854400,8.58
    +1989-04-07,36.00,37.50,36.00,37.38,12699200,8.67
    +1989-04-06,34.75,36.13,34.50,36.00,5598800,8.35
    +1989-04-05,34.50,35.25,34.25,35.00,4303200,8.12
    +1989-04-04,34.50,34.88,33.88,34.50,4140800,8.00
    +1989-04-03,35.50,36.25,34.75,35.00,5949200,8.12
    +1989-03-31,35.00,35.75,34.75,35.63,6630800,8.26
    +1989-03-30,34.25,35.00,34.00,34.75,3780800,8.06
    +1989-03-29,34.00,34.50,34.00,34.25,2666800,7.94
    +1989-03-28,34.00,34.50,34.00,34.00,5047600,7.89
    +1989-03-27,34.25,34.50,33.50,33.75,5425600,7.83
    +1989-03-23,34.00,34.50,33.75,34.38,4250800,7.97
    +1989-03-22,34.25,34.75,33.75,33.88,5180800,7.86
    +1989-03-21,35.50,35.50,34.75,34.88,4588800,8.09
    +1989-03-20,35.00,35.25,34.50,34.88,6480800,8.09
    +1989-03-17,34.50,35.75,34.00,34.88,8485200,8.09
    +1989-03-16,35.00,35.50,34.50,35.25,6880000,8.18
    +1989-03-15,35.25,35.50,34.75,35.00,3225600,8.12
    +1989-03-14,35.00,35.50,34.88,35.25,5796800,8.18
    +1989-03-13,35.00,35.50,34.75,35.00,4683600,8.12
    +1989-03-10,34.50,35.00,34.25,35.00,3684400,8.12
    +1989-03-09,35.25,35.75,34.50,34.50,4768800,8.00
    +1989-03-08,35.63,36.25,35.25,35.25,7727600,8.18
    +1989-03-07,35.50,36.00,35.00,35.75,9327600,8.29
    +1989-03-06,35.00,35.88,34.50,35.50,6028800,8.23
    +1989-03-03,35.25,35.25,34.00,34.75,13854400,8.06
    +1989-03-02,35.75,36.25,34.75,35.00,13440800,8.12
    +1989-03-01,36.25,36.50,35.50,36.00,6096400,8.35
    +1989-02-28,36.50,36.75,36.00,36.25,6290000,8.41
    +1989-02-27,36.00,36.50,35.75,36.50,4151200,8.47
    +1989-02-24,37.00,37.00,36.00,36.00,5452000,8.35
    +1989-02-23,36.50,37.00,36.25,36.75,3409200,8.52
    +1989-02-22,37.25,37.50,36.50,36.75,8529200,8.52
    +1989-02-21,36.88,37.75,36.75,37.50,6808800,8.70
    +1989-02-17,36.25,37.00,36.25,36.75,4180800,8.52
    +1989-02-16,36.25,37.25,36.00,36.38,9138800,8.41
    +1989-02-15,35.75,36.25,35.50,36.25,11812400,8.38
    +1989-02-14,36.88,37.00,35.25,35.75,31843200,8.27
    +1989-02-13,36.75,37.25,36.75,37.00,8422000,8.56
    +1989-02-10,38.25,38.25,37.00,37.25,12441200,8.62
    +1989-02-09,38.25,39.00,38.00,38.25,5756400,8.85
    +1989-02-08,39.00,39.50,38.00,38.25,5612000,8.85
    +1989-02-07,38.25,39.25,38.25,39.00,5908800,9.02
    +1989-02-06,39.50,39.50,38.25,38.50,4174400,8.91
    +1989-02-03,40.00,40.25,39.00,39.25,6406400,9.08
    +1989-02-02,39.50,40.25,39.25,39.75,16927600,9.19
    +1989-02-01,37.75,39.63,37.38,39.25,17420000,9.08
    +1989-01-31,37.25,37.75,36.75,37.75,16442000,8.73
    +1989-01-30,37.63,38.00,37.25,37.38,20961200,8.65
    +1989-01-27,38.25,39.25,36.25,37.63,75976400,8.70
    +1989-01-26,40.75,42.13,40.63,41.75,10203600,9.66
    +1989-01-25,41.75,42.00,41.00,41.50,3963200,9.60
    +1989-01-24,41.00,41.75,40.75,41.63,7983200,9.63
    +1989-01-23,40.75,41.25,40.75,41.00,6452000,9.48
    +1989-01-20,40.50,41.50,40.25,41.00,6207600,9.48
    +1989-01-19,40.50,41.00,40.00,40.50,9155200,9.37
    +1989-01-18,40.75,41.13,39.50,39.75,17440800,9.19
    +1989-01-17,43.25,43.50,40.00,40.38,27033600,9.34
    +1989-01-16,43.25,44.00,43.00,43.75,6033200,10.12
    +1989-01-13,42.75,43.50,42.38,43.25,6928000,10.00
    +1989-01-12,42.25,43.00,42.00,42.75,5373200,9.89
    +1989-01-11,42.25,42.50,41.25,42.13,5585200,9.74
    +1989-01-10,42.50,42.88,41.50,42.63,3695600,9.86
    +1989-01-09,43.00,43.13,42.25,43.00,2850800,9.95
    +1989-01-06,42.25,43.50,42.25,42.63,7103600,9.86
    +1989-01-05,42.00,43.25,41.25,42.25,10985200,9.77
    +1989-01-04,40.75,42.13,40.50,42.00,8575200,9.71
    +1989-01-03,40.25,40.50,40.00,40.38,3578800,9.34
    +1988-12-30,40.50,41.25,40.25,40.25,2938800,9.31
    +1988-12-29,40.25,40.75,40.25,40.50,4212000,9.37
    +1988-12-28,40.50,40.75,39.75,40.25,1841200,9.31
    +1988-12-27,41.00,41.50,40.50,40.50,2155200,9.37
    +1988-12-23,41.00,41.38,41.00,41.13,1475600,9.51
    +1988-12-22,41.75,42.00,40.75,41.00,3802000,9.48
    +1988-12-21,41.00,42.00,41.00,41.75,8642400,9.66
    +1988-12-20,41.00,41.50,40.63,41.00,9810800,9.48
    +1988-12-19,40.25,41.00,40.00,40.75,8373600,9.43
    +1988-12-16,39.50,40.50,39.25,40.13,6572000,9.28
    +1988-12-15,40.00,40.50,39.25,39.50,4032000,9.14
    +1988-12-14,38.50,40.00,38.50,39.75,6916800,9.19
    +1988-12-13,38.50,38.75,38.25,38.75,4386400,8.96
    +1988-12-12,39.25,39.50,38.50,38.50,4215600,8.91
    +1988-12-09,39.25,39.50,38.75,39.13,1608800,9.05
    +1988-12-08,39.25,39.25,38.75,39.13,2125600,9.05
    +1988-12-07,39.00,39.50,38.75,39.38,3518800,9.11
    +1988-12-06,39.25,39.75,39.00,39.50,3763200,9.14
    +1988-12-05,39.50,40.00,38.75,39.50,5534400,9.14
    +1988-12-02,38.25,39.88,38.00,39.25,11940000,9.08
    +1988-12-01,37.75,39.00,37.50,38.75,7586800,8.96
    +1988-11-30,36.75,38.00,36.75,37.63,6013600,8.70
    +1988-11-29,36.50,36.75,36.00,36.75,3326400,8.50
    +1988-11-28,36.50,36.75,36.00,36.50,4986800,8.44
    +1988-11-25,36.25,36.75,36.00,36.50,1727600,8.44
    +1988-11-23,35.75,37.00,35.50,36.88,6733200,8.53
    +1988-11-22,36.50,36.88,36.00,36.13,5299200,8.36
    +1988-11-21,37.50,37.75,36.25,36.63,7928000,8.47
    +1988-11-18,38.50,38.50,38.00,38.00,2066400,8.77
    +1988-11-17,38.00,38.50,38.00,38.25,2841200,8.82
    +1988-11-16,39.00,39.25,37.75,38.00,5280000,8.77
    +1988-11-15,39.00,39.25,38.75,39.00,2866800,9.00
    +1988-11-14,38.75,39.00,38.25,38.88,3046400,8.97
    +1988-11-11,39.00,39.63,38.50,38.50,3882400,8.88
    +1988-11-10,39.50,39.75,39.00,39.50,3573200,9.11
    +1988-11-09,38.25,39.38,38.00,39.25,7206800,9.05
    +1988-11-08,37.50,38.75,37.38,38.50,5540800,8.88
    +1988-11-07,37.25,37.75,37.00,37.50,6093600,8.65
    +1988-11-04,36.75,38.00,36.75,37.75,5500000,8.71
    +1988-11-03,37.25,37.50,36.75,37.13,8670000,8.57
    +1988-11-02,38.25,38.25,36.75,37.25,7451200,8.59
    +1988-11-01,38.50,38.75,37.75,38.00,5138800,8.77
    +1988-10-31,38.75,38.75,37.50,38.63,8695200,8.91
    +1988-10-28,39.00,39.50,38.50,38.50,3026800,8.88
    +1988-10-27,38.75,39.25,38.25,39.00,5138000,9.00
    +1988-10-26,40.00,40.00,38.50,39.25,6751200,9.05
    +1988-10-25,40.25,40.25,39.75,39.88,3043600,9.20
    +1988-10-24,41.25,41.25,39.63,40.00,4842400,9.23
    +1988-10-21,41.25,41.75,40.75,41.00,4422400,9.46
    +1988-10-20,40.00,41.63,40.00,41.50,6215200,9.57
    +1988-10-19,39.75,40.75,39.50,40.00,9918000,9.23
    +1988-10-18,39.00,39.50,38.25,39.38,5100000,9.08
    +1988-10-17,38.50,39.00,38.25,38.50,3360800,8.88
    +1988-10-14,39.50,39.50,38.13,38.75,5625200,8.94
    +1988-10-13,38.50,39.75,38.50,39.00,5892400,9.00
    +1988-10-12,38.50,39.00,38.00,38.75,4763600,8.94
    +1988-10-11,38.25,39.50,38.25,39.00,6964400,9.00
    +1988-10-10,39.50,39.75,37.50,38.50,11880000,8.88
    +1988-10-07,39.00,39.75,38.38,39.75,16355200,9.17
    +1988-10-06,40.50,40.88,39.25,39.75,6009200,9.17
    +1988-10-05,41.25,41.75,40.50,40.88,4400000,9.43
    +1988-10-04,42.25,42.75,41.13,41.50,1847600,9.57
    +1988-10-03,43.00,43.25,42.00,42.50,3243200,9.80
    +1988-09-30,44.00,44.00,43.25,43.25,3338800,9.98
    +1988-09-29,43.75,44.25,43.50,44.00,3804400,10.15
    +1988-09-28,43.50,44.13,43.25,43.50,3038800,10.04
    +1988-09-27,42.50,43.50,42.50,43.38,5832400,10.01
    +1988-09-26,43.75,44.00,42.50,42.75,3124400,9.86
    +1988-09-23,43.50,44.25,43.50,43.75,3638000,10.09
    +1988-09-22,43.00,44.00,42.75,44.00,5203600,10.15
    +1988-09-21,41.75,43.00,41.50,42.75,3274800,9.86
    +1988-09-20,41.75,42.25,41.38,41.50,3682400,9.57
    +1988-09-19,42.00,42.25,41.25,41.75,3296400,9.63
    +1988-09-16,41.50,42.75,41.38,42.25,4431200,9.75
    +1988-09-15,42.00,42.75,41.50,41.63,5920000,9.60
    +1988-09-14,41.75,42.38,41.50,42.00,8520800,9.69
    +1988-09-13,40.25,41.25,40.00,41.00,4293600,9.46
    +1988-09-12,41.00,41.75,40.13,41.00,5290800,9.46
    +1988-09-09,38.75,41.00,37.75,40.50,8393200,9.34
    +1988-09-08,38.25,39.50,37.75,38.75,7403200,8.94
    +1988-09-07,39.00,39.50,37.75,38.25,6417600,8.82
    +1988-09-06,40.00,40.00,38.75,38.88,5125200,8.97
    +1988-09-02,39.50,40.00,39.00,39.75,6661200,9.17
    +1988-09-01,39.75,39.75,38.50,38.88,8818800,8.97
    +1988-08-31,41.00,41.13,39.50,39.88,8493600,9.20
    +1988-08-30,40.75,41.00,40.00,40.88,1809200,9.43
    +1988-08-29,40.75,41.00,40.50,40.88,2046400,9.43
    +1988-08-26,40.00,40.75,40.00,40.25,1453200,9.29
    +1988-08-25,40.25,40.50,39.25,40.13,4560000,9.26
    +1988-08-24,39.75,40.75,39.50,40.75,4482000,9.40
    +1988-08-23,39.75,40.25,39.25,39.50,5843200,9.11
    +1988-08-22,40.25,40.75,39.50,39.75,6100000,9.17
    +1988-08-19,42.50,42.75,40.50,40.75,8120000,9.40
    +1988-08-18,42.00,43.00,41.75,42.50,2648000,9.80
    +1988-08-17,42.50,42.75,41.75,42.00,4252400,9.69
    +1988-08-16,41.00,43.25,40.75,42.50,4397600,9.80
    +1988-08-15,42.25,42.25,40.50,41.25,5971200,9.52
    +1988-08-12,43.00,43.00,42.25,42.50,2771200,9.79
    +1988-08-11,42.25,43.25,42.00,43.25,3803200,9.96
    +1988-08-10,43.75,43.75,41.75,41.88,5300800,9.64
    +1988-08-09,44.00,44.25,43.00,43.50,6090800,10.02
    +1988-08-08,44.50,44.75,44.00,44.00,1085600,10.13
    +1988-08-05,44.50,45.00,44.25,44.25,1881200,10.19
    +1988-08-04,44.75,45.25,44.50,44.63,2473200,10.28
    +1988-08-03,44.75,44.75,44.00,44.75,3980800,10.30
    +1988-08-02,45.00,45.50,44.50,44.63,4338000,10.28
    +1988-08-01,44.50,45.75,44.25,45.00,3085600,10.36
    +1988-07-29,43.25,44.50,43.00,44.38,5697600,10.22
    +1988-07-28,42.50,43.00,42.25,42.63,3326800,9.82
    +1988-07-27,42.75,43.25,42.50,42.75,4162400,9.84
    +1988-07-26,42.75,43.25,42.25,42.75,3640800,9.84
    +1988-07-25,42.75,43.25,42.25,42.75,3794400,9.84
    +1988-07-22,43.00,43.25,42.50,42.50,3724800,9.79
    +1988-07-21,43.75,44.00,42.75,43.00,5323600,9.90
    +1988-07-20,44.75,45.00,44.00,44.25,4293600,10.19
    +1988-07-19,45.00,45.50,43.88,44.75,4372400,10.30
    +1988-07-18,45.38,46.00,45.25,45.50,4061200,10.48
    +1988-07-15,45.00,45.50,44.75,45.00,2968000,10.36
    +1988-07-14,44.75,45.25,44.50,45.00,2245200,10.36
    +1988-07-13,44.75,45.00,44.25,44.75,4132000,10.30
    +1988-07-12,45.00,45.25,44.50,44.75,3605600,10.30
    +1988-07-11,45.50,45.50,44.88,45.13,2646400,10.39
    +1988-07-08,45.50,46.00,45.00,45.25,3766400,10.42
    +1988-07-07,46.50,46.50,45.25,45.88,3778000,10.56
    +1988-07-06,47.13,47.50,46.13,46.50,5608800,10.71
    +1988-07-05,46.50,47.25,46.13,47.25,3736400,10.88
    +1988-07-01,46.50,46.88,46.25,46.50,3385600,10.71
    +1988-06-30,46.25,46.75,46.00,46.25,4104800,10.65
    +1988-06-29,46.00,46.75,45.75,46.38,5125200,10.68
    +1988-06-28,44.75,46.25,44.50,46.25,5809200,10.65
    +1988-06-27,44.50,45.38,44.50,44.50,3001200,10.25
    +1988-06-24,45.00,45.50,44.50,45.00,2684400,10.36
    +1988-06-23,45.75,45.75,45.00,45.00,2566400,10.36
    +1988-06-22,45.50,45.88,45.00,45.63,6998000,10.51
    +1988-06-21,44.00,45.00,43.88,44.88,4422000,10.33
    +1988-06-20,44.38,44.75,44.00,44.13,2811200,10.16
    +1988-06-17,44.75,44.75,44.25,44.75,3410800,10.30
    +1988-06-16,45.00,45.25,44.25,44.50,3854400,10.25
    +1988-06-15,45.25,45.75,45.00,45.75,4360000,10.53
    +1988-06-14,45.25,46.00,45.00,45.25,10445600,10.42
    +1988-06-13,45.00,45.25,44.25,45.00,5320000,10.36
    +1988-06-10,43.50,44.75,43.00,44.50,6320000,10.25
    +1988-06-09,45.00,45.25,43.25,43.50,9640000,10.02
    +1988-06-08,44.25,45.50,44.00,45.00,9240000,10.36
    +1988-06-07,43.75,45.25,43.50,44.00,11120000,10.13
    +1988-06-06,42.75,44.00,42.75,44.00,5880000,10.13
    +1988-06-03,41.75,43.25,41.75,43.00,6280000,9.90
    +1988-06-02,42.00,42.50,41.50,41.75,4760000,9.61
    +1988-06-01,41.50,42.50,41.25,42.50,8200000,9.79
    +1988-05-31,40.00,41.50,39.75,41.50,4400000,9.56
    +1988-05-27,39.25,40.00,39.00,39.75,3020000,9.15
    +1988-05-26,38.50,39.50,38.50,39.38,3076800,9.07
    +1988-05-25,39.00,39.75,38.50,38.50,4840000,8.87
    +1988-05-24,38.00,39.00,37.75,38.88,5080000,8.95
    +1988-05-23,38.50,38.88,37.38,38.00,6560000,8.75
    +1988-05-20,39.25,39.50,38.75,38.75,2941200,8.92
    +1988-05-19,39.50,39.75,38.50,39.00,8920000,8.98
    +1988-05-18,40.50,40.75,39.50,39.75,6240000,9.15
    +1988-05-17,41.50,42.00,40.25,40.50,6920000,9.33
    +1988-05-16,40.50,41.38,40.00,41.25,2686800,9.50
    +1988-05-13,40.25,40.50,40.00,40.50,2566800,9.31
    +1988-05-12,39.50,40.25,39.50,39.75,2965600,9.13
    +1988-05-11,40.25,40.75,39.50,39.50,6240000,9.08
    +1988-05-10,40.50,41.00,40.25,40.88,3439200,9.39
    +1988-05-09,41.25,41.25,40.50,40.75,2732000,9.36
    +1988-05-06,41.63,41.75,41.25,41.25,3835600,9.48
    +1988-05-05,42.00,42.25,41.50,41.75,2536800,9.59
    +1988-05-04,41.88,43.13,41.75,42.00,8000000,9.65
    +1988-05-03,41.00,42.25,40.75,41.75,4440000,9.59
    +1988-05-02,40.75,41.25,40.50,41.00,2944400,9.42
    +1988-04-29,41.25,41.50,40.50,41.00,3222000,9.42
    +1988-04-28,41.75,42.00,41.25,41.38,3553600,9.51
    +1988-04-27,41.75,42.00,41.50,41.75,4520000,9.59
    +1988-04-26,41.00,41.75,40.75,41.50,6280000,9.54
    +1988-04-25,40.25,41.00,40.00,40.88,5360000,9.39
    +1988-04-22,39.75,40.25,39.50,40.13,3846800,9.22
    +1988-04-21,40.38,40.50,39.00,39.50,6360000,9.08
    +1988-04-20,40.25,40.50,39.25,39.75,7680000,9.13
    +1988-04-19,40.13,41.50,40.13,40.25,7596400,9.25
    +1988-04-18,39.75,40.75,39.25,40.00,6080000,9.19
    +1988-04-15,39.75,40.00,38.50,39.50,8320000,9.08
    +1988-04-14,40.50,41.50,39.00,39.50,6720000,9.08
    +1988-04-13,41.75,42.00,41.00,41.25,5120000,9.48
    +1988-04-12,41.75,42.25,41.25,41.75,6200000,9.59
    +1988-04-11,41.75,42.00,41.00,41.50,5320000,9.54
    +1988-04-08,40.75,41.75,39.75,41.00,7240000,9.42
    +1988-04-07,41.75,42.38,40.75,40.75,5840000,9.36
    +1988-04-06,39.50,41.75,39.00,41.75,6800000,9.59
    +1988-04-05,39.25,39.50,38.50,39.25,5280000,9.02
    +1988-04-04,39.75,40.50,38.50,38.75,6480000,8.91
    +1988-03-31,39.75,40.50,39.25,40.00,7760000,9.19
    +1988-03-30,40.75,41.25,38.75,39.50,13280000,9.08
    +1988-03-29,41.50,42.00,40.63,41.00,7640000,9.42
    +1988-03-28,40.00,41.75,39.50,41.50,6160000,9.54
    +1988-03-25,40.75,41.25,40.00,40.13,4680000,9.22
    +1988-03-24,41.75,42.50,40.00,40.88,11440000,9.39
    +1988-03-23,44.00,44.00,41.88,42.50,7480000,9.77
    +1988-03-22,44.00,44.50,43.25,44.00,4265600,10.11
    +1988-03-21,44.38,44.63,43.00,43.88,8120000,10.08
    +1988-03-18,45.00,45.50,44.25,44.75,9720000,10.28
    +1988-03-17,46.25,46.50,44.75,45.00,9320000,10.34
    +1988-03-16,44.88,46.38,44.50,46.13,4240000,10.60
    +1988-03-15,46.00,46.25,44.75,45.00,6480000,10.34
    +1988-03-14,45.75,46.50,45.50,46.25,3518000,10.63
    +1988-03-11,45.50,45.75,44.50,45.75,5640000,10.51
    +1988-03-10,47.00,47.25,45.25,45.25,6320000,10.40
    +1988-03-09,46.25,47.25,46.25,46.75,4800000,10.74
    +1988-03-08,46.75,47.00,46.00,46.25,5160000,10.63
    +1988-03-07,46.75,47.75,46.50,46.88,7400000,10.77
    +1988-03-04,46.00,47.00,45.50,46.88,7480000,10.77
    +1988-03-03,44.50,47.00,44.50,46.50,16920000,10.69
    +1988-03-02,43.75,45.00,43.50,44.75,10440000,10.28
    +1988-03-01,43.25,43.50,42.50,43.25,6120000,9.94
    +1988-02-29,41.75,43.25,41.50,43.00,4000000,9.88
    +1988-02-26,42.00,42.25,41.25,41.75,2952400,9.59
    +1988-02-25,42.00,43.00,41.75,41.75,6400000,9.59
    +1988-02-24,42.75,43.00,42.00,42.25,5200000,9.71
    +1988-02-23,43.25,43.75,42.25,42.75,7880000,9.82
    +1988-02-22,41.50,43.63,41.50,43.25,7160000,9.94
    +1988-02-19,41.75,42.00,41.50,41.75,3242400,9.59
    +1988-02-18,41.63,42.75,41.50,41.75,5120000,9.59
    +1988-02-17,41.25,42.50,41.25,41.88,9160000,9.62
    +1988-02-16,41.00,41.25,40.00,41.25,5520000,9.48
    +1988-02-12,40.63,41.50,40.50,41.00,4920000,9.42
    +1988-02-11,41.00,41.25,40.25,40.63,5280000,9.32
    +1988-02-10,39.75,41.50,39.75,41.00,8160000,9.40
    +1988-02-09,39.00,39.88,38.75,39.75,4160000,9.12
    +1988-02-08,38.50,39.25,37.75,38.75,7280000,8.89
    +1988-02-05,40.00,40.38,38.50,38.63,4720000,8.86
    +1988-02-04,39.50,40.13,39.00,39.75,7120000,9.12
    +1988-02-03,41.00,41.25,39.25,39.50,8080000,9.06
    +1988-02-02,41.50,41.88,40.50,41.25,6840000,9.46
    +1988-02-01,41.75,42.50,41.38,41.75,7120000,9.58
    +1988-01-29,41.50,41.75,40.25,41.50,9480000,9.52
    +1988-01-28,40.00,41.50,39.75,41.25,8320000,9.46
    +1988-01-27,40.25,40.50,38.75,39.75,9240000,9.12
    +1988-01-26,40.75,41.00,39.25,39.75,5120000,9.12
    +1988-01-25,39.50,41.50,39.50,40.88,7160000,9.38
    +1988-01-22,40.50,40.75,38.25,39.25,15920000,9.00
    +1988-01-21,40.50,40.75,39.38,40.13,17640000,9.20
    +1988-01-20,43.00,43.00,38.25,39.75,24320000,9.12
    +1988-01-19,42.25,43.25,41.38,42.75,9800000,9.80
    +1988-01-18,43.00,43.00,42.00,42.75,4480000,9.80
    +1988-01-15,43.50,45.00,42.50,42.88,12280000,9.83
    +1988-01-14,42.75,42.88,42.00,42.25,4720000,9.69
    +1988-01-13,42.00,43.25,41.13,42.25,7560000,9.69
    +1988-01-12,43.00,43.50,39.75,42.00,14320000,9.63
    +1988-01-11,40.00,42.75,39.75,42.50,14440000,9.75
    +1988-01-08,44.50,45.25,39.50,40.00,17360000,9.17
    +1988-01-07,43.50,44.75,42.50,44.50,7600000,10.21
    +1988-01-06,45.00,45.00,43.75,43.75,9600000,10.03
    +1988-01-05,46.00,46.25,44.25,44.63,11040000,10.24
    +1988-01-04,42.75,44.75,42.25,44.75,11800000,10.26
    +1987-12-31,42.50,43.00,41.88,42.00,4200000,9.63
    +1987-12-30,42.50,43.75,42.50,43.38,5560000,9.95
    +1987-12-29,40.50,42.25,40.25,42.13,4240000,9.66
    +1987-12-28,42.25,42.50,39.50,40.25,8200000,9.23
    +1987-12-24,42.00,43.00,41.75,42.63,2508000,9.78
    +1987-12-23,41.75,42.75,41.25,42.25,6120000,9.69
    +1987-12-22,41.75,41.75,40.50,41.50,4600000,9.52
    +1987-12-21,40.50,41.75,40.25,41.75,6720000,9.58
    +1987-12-18,39.50,41.25,39.25,40.50,10800000,9.29
    +1987-12-17,40.50,40.75,39.25,39.25,11640000,9.00
    +1987-12-16,37.75,39.75,37.25,39.25,11800000,9.00
    +1987-12-15,37.75,38.25,37.00,37.50,10680000,8.60
    +1987-12-14,34.50,37.50,34.25,37.25,12200000,8.54
    +1987-12-11,34.75,34.75,33.50,34.00,4360000,7.80
    +1987-12-10,33.75,36.00,33.25,34.75,9880000,7.97
    +1987-12-09,34.50,36.25,33.88,35.00,6400000,8.03
    +1987-12-08,33.50,34.88,33.25,34.50,9080000,7.91
    +1987-12-07,31.00,33.25,31.00,33.00,7280000,7.57
    +1987-12-04,30.25,31.25,29.75,30.75,8720000,7.05
    +1987-12-03,33.00,33.38,29.75,30.50,11400000,7.00
    +1987-12-02,33.25,33.50,32.50,32.50,5080000,7.45
    +1987-12-01,33.50,34.00,32.75,33.25,6480000,7.63
    +1987-11-30,33.75,34.50,30.50,33.00,14880000,7.57
    +1987-11-27,36.25,36.50,34.75,35.00,2526800,8.03
    +1987-11-25,37.00,37.00,36.00,36.50,3311200,8.37
    +1987-11-24,36.75,37.75,36.13,37.00,7040000,8.49
    +1987-11-23,35.50,36.25,34.75,36.25,3500000,8.31
    +1987-11-20,34.00,36.00,33.25,35.50,8960000,8.14
    +1987-11-19,36.50,36.50,34.00,34.50,6520000,7.91
    +1987-11-18,35.75,36.50,34.50,36.25,9480000,8.31
    +1987-11-17,36.75,37.00,35.00,35.00,9600000,8.03
    +1987-11-16,37.75,38.50,36.50,36.75,6600000,8.41
    +1987-11-13,39.25,39.50,37.00,37.25,5520000,8.52
    +1987-11-12,38.50,40.00,38.38,38.75,8800000,8.87
    +1987-11-11,37.25,38.25,36.75,37.25,6640000,8.52
    +1987-11-10,36.50,37.50,36.00,36.25,8280000,8.30
    +1987-11-09,37.00,37.50,36.25,37.25,7520000,8.52
    +1987-11-06,38.25,39.50,37.00,37.75,6680000,8.64
    +1987-11-05,36.25,38.75,36.25,38.00,9120000,8.70
    +1987-11-04,35.50,37.25,34.75,36.00,8360000,8.24
    +1987-11-03,38.00,38.50,34.25,36.25,11200000,8.30
    +1987-11-02,38.75,39.50,37.50,38.75,6720000,8.87
    +1987-10-30,40.00,43.00,38.50,38.63,15040000,8.84
    +1987-10-29,34.25,40.00,32.25,39.50,11840000,9.04
    +1987-10-28,30.75,33.75,29.25,33.50,14960000,7.67
    +1987-10-27,29.50,32.25,29.00,30.25,16280000,6.92
    +1987-10-26,34.50,35.00,27.62,28.00,11200000,6.41
    +1987-10-23,35.75,36.50,34.25,35.50,7080000,8.12
    +1987-10-22,39.25,40.50,36.00,36.75,13760000,8.41
    +1987-10-21,38.50,42.00,38.00,40.50,19080000,9.27
    +1987-10-20,38.50,42.00,32.63,34.50,20320000,7.90
    +1987-10-19,48.25,48.25,35.50,36.50,17000000,8.35
    +1987-10-16,52.25,53.00,47.50,48.25,15000000,11.04
    +1987-10-15,53.25,54.50,51.75,52.00,12440000,11.90
    +1987-10-14,53.75,54.00,52.00,53.25,9240000,12.19
    +1987-10-13,54.50,54.75,53.25,54.50,5800000,12.47
    +1987-10-12,54.25,54.38,51.75,53.25,7120000,12.19
    +1987-10-09,54.25,55.50,54.00,54.13,5200000,12.39
    +1987-10-08,55.50,56.00,53.25,54.25,5880000,12.42
    +1987-10-07,55.50,55.75,54.25,55.50,8000000,12.70
    +1987-10-06,59.50,59.50,55.50,55.75,7200000,12.76
    +1987-10-05,58.50,59.75,57.75,59.25,4800000,13.56
    +1987-10-02,58.25,58.75,57.50,58.50,3450000,13.39
    +1987-10-01,56.75,58.75,56.50,58.25,4160000,13.33
    +1987-09-30,54.25,57.00,54.25,56.50,4360000,12.93
    +1987-09-29,56.00,56.00,54.25,54.50,6120000,12.47
    +1987-09-28,57.50,58.75,55.50,55.75,7280000,12.76
    +1987-09-25,56.75,58.00,56.50,57.50,3806800,13.16
    +1987-09-24,55.25,57.88,55.25,56.50,6520000,12.93
    +1987-09-23,54.13,56.00,53.75,55.25,9098800,12.64
    +1987-09-22,50.50,54.25,50.25,54.13,5480000,12.39
    +1987-09-21,51.75,52.75,50.25,50.25,4600000,11.50
    +1987-09-18,52.00,52.25,51.38,51.75,2555600,11.84
    +1987-09-17,52.00,52.25,51.00,52.00,2400000,11.90
    +1987-09-16,51.75,52.63,51.25,51.75,6000000,11.84
    +1987-09-15,53.00,53.00,51.50,51.75,3744800,11.84
    +1987-09-14,54.75,55.25,52.75,53.00,2928000,12.13
    +1987-09-11,54.00,55.50,52.75,54.50,4440000,12.47
    +1987-09-10,53.25,54.50,53.13,53.75,5000000,12.30
    +1987-09-09,50.25,53.00,49.50,52.75,5640000,12.07
    +1987-09-08,50.25,50.50,48.50,49.88,6280000,11.42
    +1987-09-04,51.25,51.75,50.00,50.50,3891200,11.56
    +1987-09-03,52.50,52.75,50.25,51.25,6600000,11.73
    +1987-09-02,52.00,53.25,50.75,52.00,8200000,11.90
    +1987-09-01,54.75,55.25,52.50,52.50,4960000,12.01
    +1987-08-31,52.25,54.25,51.75,54.00,5360000,12.36
    +1987-08-28,52.00,52.50,51.50,52.00,3434400,11.90
    +1987-08-27,52.25,52.75,51.50,52.00,4440000,11.90
    +1987-08-26,53.00,53.50,52.00,52.00,7000000,11.90
    +1987-08-25,52.75,53.25,52.00,52.00,4880000,11.90
    +1987-08-24,53.00,53.50,52.25,52.25,4320000,11.96
    +1987-08-21,51.75,53.75,51.50,53.00,5000000,12.13
    +1987-08-20,50.25,52.50,49.75,51.75,6280000,11.84
    +1987-08-19,49.50,50.00,49.00,50.00,2404400,11.44
    +1987-08-18,49.25,49.50,48.25,48.75,8480000,11.16
    +1987-08-17,49.50,50.00,48.75,49.50,5200000,11.33
    +1987-08-14,48.50,50.00,48.00,49.00,3758800,11.21
    +1987-08-13,48.75,50.25,48.50,49.00,7000000,11.21
    +1987-08-12,49.50,49.75,48.25,48.75,5760000,11.16
    +1987-08-11,49.50,50.25,48.75,49.50,9680000,11.33
    +1987-08-10,48.25,48.25,45.75,48.25,2800000,11.04
    +1987-08-07,46.25,47.25,46.00,46.50,5440000,10.63
    +1987-08-06,43.25,46.75,42.75,46.25,9000000,10.57
    +1987-08-05,42.25,43.50,42.00,43.25,4640000,9.89
    +1987-08-04,40.50,42.25,40.00,42.25,4320000,9.66
    +1987-08-03,41.00,41.50,40.25,40.25,2275600,9.20
    +1987-07-31,41.25,42.00,41.25,41.25,2613600,9.43
    +1987-07-30,41.00,41.50,40.75,41.50,3727600,9.49
    +1987-07-29,42.00,42.00,40.50,41.00,3534800,9.37
    +1987-07-28,42.50,42.75,41.75,41.88,2660800,9.57
    +1987-07-27,42.50,43.00,42.00,42.25,2035600,9.66
    +1987-07-24,41.50,42.75,41.50,42.50,4200000,9.71
    +1987-07-23,43.00,43.50,40.50,41.75,2685600,9.54
    +1987-07-22,41.50,42.75,41.25,42.50,2185200,9.71
    +1987-07-21,42.00,42.50,41.25,41.38,3966400,9.46
    +1987-07-20,43.00,43.25,41.50,41.75,4440000,9.54
    +1987-07-17,44.25,44.75,42.75,43.25,3300000,9.89
    +1987-07-16,44.00,44.00,43.25,44.00,3388000,10.06
    +1987-07-15,43.00,44.75,42.25,44.00,9680000,10.06
    +1987-07-14,41.00,43.00,41.00,43.00,9200000,9.83
    +1987-07-13,39.00,40.75,38.75,40.50,9120000,9.26
    +1987-07-10,38.00,39.25,37.75,38.00,5600000,8.69
    +1987-07-09,37.25,38.75,37.25,37.75,8560000,8.63
    +1987-07-08,39.25,39.25,36.50,37.25,12200000,8.51
    +1987-07-07,40.50,41.00,38.75,39.25,7280000,8.97
    +1987-07-06,40.75,41.75,40.50,40.75,3060800,9.31
    +1987-07-02,40.00,41.00,39.75,40.63,2931200,9.29
    +1987-07-01,40.75,40.75,39.75,40.00,3402000,9.14
    +1987-06-30,40.50,41.00,39.75,40.50,5160000,9.26
    +1987-06-29,40.50,40.75,40.00,40.75,3628000,9.31
    +1987-06-26,40.75,41.50,40.00,40.50,4560000,9.26
    +1987-06-25,42.00,42.50,40.50,40.50,4320000,9.26
    +1987-06-24,41.50,43.25,40.50,42.00,4240000,9.60
    +1987-06-23,42.00,42.13,40.75,41.25,2892000,9.43
    +1987-06-22,41.25,42.25,40.88,42.00,6040000,9.60
    +1987-06-19,41.50,41.75,40.38,41.00,4480000,9.37
    +1987-06-18,40.25,41.75,39.50,41.50,8200000,9.49
    +1987-06-17,41.50,42.50,40.00,40.50,10640000,9.26
    +1987-06-16,41.50,41.75,38.00,41.50,12240000,9.49
    +1987-06-15,79.00,79.50,77.50,78.50,9280000,8.97
    +1987-06-12,79.00,79.75,78.75,79.00,3653600,9.03
    +1987-06-11,78.50,80.00,78.00,79.00,4521600,9.03
    +1987-06-10,78.75,80.25,78.00,78.50,5235200,8.97
    +1987-06-09,77.50,79.50,77.50,78.50,4570400,8.97
    +1987-06-08,77.75,78.00,76.75,77.75,7213600,8.89
    +1987-06-05,78.75,78.75,77.75,77.75,4696000,8.89
    +1987-06-04,78.00,78.75,77.00,78.50,5511200,8.97
    +1987-06-03,77.25,79.50,77.25,77.75,6140000,8.89
    +1987-06-02,77.50,78.00,77.00,77.25,4927200,8.83
    +1987-06-01,79.50,79.50,77.50,77.75,2984000,8.89
    +1987-05-29,80.25,80.50,79.00,79.00,3322400,9.03
    +1987-05-28,79.50,80.25,78.50,80.00,5424000,9.14
    +1987-05-27,78.00,80.25,77.50,79.50,6484000,9.09
    +1987-05-26,74.50,78.00,74.00,78.00,5481600,8.91
    +1987-05-22,75.00,75.50,73.75,74.12,3484000,8.47
    +1987-05-21,74.75,75.75,74.50,74.50,6233600,8.51
    +1987-05-20,73.00,75.00,72.50,74.50,10320000,8.51
    +1987-05-19,75.75,75.75,72.62,73.25,8560000,8.37
    +1987-05-18,78.25,78.50,75.50,75.75,8640000,8.66
    +1987-05-15,79.25,79.25,78.00,78.25,5220000,8.94
    +1987-05-14,78.25,79.50,78.25,79.25,5316000,9.06
    +1987-05-13,75.75,78.62,75.50,78.50,11120000,8.97
    +1987-05-12,76.00,76.50,75.00,75.50,9280000,8.63
    +1987-05-11,77.00,79.50,76.75,77.00,7048800,8.80
    +1987-05-08,80.50,81.00,79.00,79.00,6618400,9.01
    +1987-05-07,79.75,81.00,79.75,80.25,6488800,9.16
    +1987-05-06,80.50,82.25,79.25,80.00,10240000,9.13
    +1987-05-05,80.00,80.75,78.00,80.25,8240000,9.16
    +1987-05-04,79.50,80.25,79.00,79.75,5095200,9.10
    +1987-05-01,79.50,80.00,78.75,80.00,4751200,9.13
    +1987-04-30,78.00,80.00,77.75,79.25,9040000,9.04
    +1987-04-29,77.25,79.75,77.00,77.75,10400000,8.87
    +1987-04-28,75.75,77.87,75.50,77.00,11600000,8.79
    +1987-04-27,74.25,75.25,73.25,75.00,13680000,8.56
    +1987-04-24,75.75,76.50,74.50,74.75,9120000,8.53
    +1987-04-23,74.25,77.25,74.25,76.00,10880000,8.67
    +1987-04-22,76.62,77.00,74.00,74.25,14400000,8.47
    +1987-04-21,70.25,75.00,69.50,74.75,15440000,8.53
    +1987-04-20,71.50,72.75,70.75,71.12,5353600,8.12
    +1987-04-16,71.25,73.25,71.00,71.50,12400000,8.16
    +1987-04-15,69.50,71.00,68.75,71.00,12480000,8.10
    +1987-04-14,66.75,69.75,66.50,68.00,14560000,7.76
    +1987-04-13,70.00,70.25,67.50,67.50,5101600,7.70
    +1987-04-10,71.25,71.50,69.75,70.25,7791200,8.02
    +1987-04-09,68.75,71.50,67.75,71.00,8480000,8.10
    +1987-04-08,67.75,70.25,67.50,69.00,8240000,7.87
    +1987-04-07,69.75,70.25,67.75,67.75,9280000,7.73
    +1987-04-06,71.50,72.75,69.25,70.00,10320000,7.99
    +1987-04-03,71.50,71.87,70.25,71.75,19280000,8.19
    +1987-04-02,68.25,71.75,67.00,71.75,27760000,8.19
    +1987-04-01,63.00,67.00,62.38,66.75,7792800,7.62
    +1987-03-31,62.25,64.75,62.25,64.50,9760000,7.36
    +1987-03-30,63.50,64.25,62.25,62.50,9280000,7.13
    +1987-03-27,67.25,67.50,64.75,65.00,4817600,7.42
    +1987-03-26,66.75,67.75,66.50,67.25,5146400,7.67
    +1987-03-25,66.50,67.00,65.25,66.75,9760000,7.62
    +1987-03-24,67.75,68.50,66.25,66.25,9600000,7.56
    +1987-03-23,68.00,68.25,66.25,67.50,8800000,7.70
    +1987-03-20,68.25,69.75,68.25,68.25,12400000,7.79
    +1987-03-19,65.75,68.50,65.50,68.37,7396000,7.80
    +1987-03-18,67.25,67.50,64.75,66.00,10800000,7.53
    +1987-03-17,65.50,68.00,65.00,67.00,8720000,7.65
    +1987-03-16,63.50,65.25,62.50,65.25,8800000,7.45
    +1987-03-13,65.25,66.00,63.50,63.50,7067200,7.25
    +1987-03-12,66.00,66.25,63.63,65.25,10800000,7.45
    +1987-03-11,67.25,68.00,66.25,66.25,7826400,7.56
    +1987-03-10,64.50,66.87,64.50,66.75,8720000,7.62
    +1987-03-09,66.50,66.75,64.50,64.62,9120000,7.37
    +1987-03-06,67.25,68.37,66.75,67.25,6332800,7.67
    +1987-03-05,67.50,69.00,67.25,68.50,12080000,7.82
    +1987-03-04,65.75,68.25,65.37,67.62,16000000,7.72
    +1987-03-03,67.50,68.12,64.75,65.00,15600000,7.42
    +1987-03-02,70.25,70.50,67.00,67.50,14160000,7.70
    +1987-02-27,69.12,71.00,67.75,70.00,14480000,7.99
    +1987-02-26,69.50,71.37,68.00,69.12,17840000,7.89
    +1987-02-25,65.50,69.50,64.62,69.12,16240000,7.89
    +1987-02-24,63.25,66.00,63.13,65.50,12720000,7.47
    +1987-02-23,60.88,64.25,59.63,63.13,12560000,7.20
    +1987-02-20,62.38,62.50,60.63,61.25,6813600,6.99
    +1987-02-19,63.50,63.50,61.75,62.38,11200000,7.12
    +1987-02-18,66.62,67.37,63.38,63.50,16800000,7.25
    +1987-02-17,62.13,66.50,61.88,66.37,14640000,7.57
    +1987-02-13,58.63,62.50,58.00,62.13,18240000,7.09
    +1987-02-12,57.00,59.88,57.00,58.63,25360000,6.69
    +1987-02-11,53.00,56.75,52.75,56.50,12240000,6.45
    +1987-02-10,52.50,52.75,51.63,52.75,5977600,6.02
    +1987-02-09,52.88,53.38,52.25,52.63,5611200,6.01
    +1987-02-06,54.00,54.00,52.88,54.00,10480000,6.16
    +1987-02-05,55.00,55.13,53.13,53.88,12160000,6.15
    +1987-02-04,55.50,55.50,54.38,55.00,7791200,6.28
    +1987-02-03,56.00,56.13,54.75,55.50,6412800,6.33
    +1987-02-02,55.50,56.00,54.25,55.88,8800000,6.38
    +1987-01-30,54.00,55.88,52.63,55.50,14640000,6.33
    +1987-01-29,55.88,57.25,53.38,54.13,19920000,6.18
    +1987-01-28,53.00,55.75,52.13,55.38,14800000,6.32
    +1987-01-27,50.00,53.13,49.88,52.75,13520000,6.02
    +1987-01-26,50.00,50.50,49.50,49.75,12560000,5.68
    +1987-01-23,52.50,53.00,50.25,50.25,16400000,5.73
    +1987-01-22,48.88,52.63,48.50,52.50,16880000,5.99
    +1987-01-21,50.88,51.13,49.00,49.00,19040000,5.59
    +1987-01-20,55.00,55.75,51.50,51.63,27680000,5.89
    +1987-01-19,48.75,53.13,47.88,53.13,12960000,6.06
    +1987-01-16,50.00,50.00,47.75,48.75,14560000,5.56
    +1987-01-15,48.25,51.38,48.00,49.88,19520000,5.69
    +1987-01-14,44.63,48.25,44.50,48.13,18000000,5.49
    +1987-01-13,45.13,45.38,44.63,44.63,7584800,5.09
    +1987-01-12,45.50,45.75,44.75,45.50,8320000,5.19
    +1987-01-09,44.75,45.75,44.38,45.38,8560000,5.18
    +1987-01-08,44.75,45.13,44.50,44.75,10400000,5.11
    +1987-01-07,43.88,44.88,43.63,44.75,15520000,5.11
    +1987-01-06,43.13,44.00,42.63,43.75,11600000,4.99
    +1987-01-05,41.25,43.25,41.00,43.00,8560000,4.91
    +1987-01-02,40.38,41.13,40.13,40.88,4360000,4.66
    +1986-12-31,41.00,41.38,40.38,40.50,4742400,4.62
    +1986-12-30,40.50,41.50,40.38,41.00,5297600,4.68
    +1986-12-29,41.00,41.13,40.25,40.50,4224800,4.62
    +1986-12-26,41.88,41.88,41.00,41.00,3215200,4.68
    +1986-12-24,42.00,42.13,41.63,41.88,3453600,4.78
    +1986-12-23,42.25,42.38,41.88,42.13,8720000,4.81
    +1986-12-22,42.00,42.50,41.75,42.13,5887200,4.81
    +1986-12-19,41.38,42.50,41.38,42.13,7149600,4.81
    +1986-12-18,41.13,41.88,40.75,41.38,6258400,4.72
    +1986-12-17,42.38,42.50,40.88,41.25,5417600,4.71
    +1986-12-16,41.63,42.50,41.63,42.50,5464000,4.85
    +1986-12-15,41.00,41.75,40.38,41.75,7481600,4.76
    +1986-12-12,42.88,43.00,41.25,41.25,6451200,4.71
    +1986-12-11,43.63,43.88,42.63,42.88,8080000,4.89
    +1986-12-10,42.38,43.75,42.00,43.50,8720000,4.96
    +1986-12-09,42.38,42.63,41.13,42.38,10800000,4.84
    +1986-12-08,43.63,43.88,42.38,42.50,12400000,4.85
    +1986-12-05,42.63,43.75,42.50,43.75,9360000,4.99
    +1986-12-04,42.63,42.75,42.00,42.50,9600000,4.85
    +1986-12-03,41.63,43.00,41.50,42.75,12000000,4.88
    +1986-12-02,40.50,41.75,40.00,41.50,13200000,4.74
    +1986-12-01,40.00,40.13,39.13,40.13,12400000,4.58
    +1986-11-28,40.50,40.63,39.63,40.00,7897600,4.56
    +1986-11-26,40.13,41.25,40.00,40.50,18080000,4.62
    +1986-11-25,38.00,40.38,38.00,40.25,30320000,4.59
    +1986-11-24,36.25,38.13,36.00,38.00,13440000,4.34
    +1986-11-21,35.25,36.25,35.13,36.00,10240000,4.11
    +1986-11-20,34.88,35.38,34.88,35.25,10560000,4.02
    +1986-11-19,35.13,35.25,34.50,35.00,10800000,3.99
    +1986-11-18,36.38,36.75,35.13,35.38,6115200,4.04
    +1986-11-17,35.25,37.00,35.00,36.38,5071200,4.15
    +1986-11-14,35.50,35.50,34.88,35.25,4840000,4.02
    +1986-11-13,36.50,36.50,35.50,35.50,4928800,4.05
    +1986-11-12,35.75,36.63,35.63,36.63,4700000,4.18
    +1986-11-11,35.50,35.75,35.25,35.50,1809600,4.05
    +1986-11-10,35.88,35.88,35.13,35.38,3793600,4.04
    +1986-11-07,36.00,36.13,34.88,35.75,5153600,4.08
    +1986-11-06,36.63,36.88,35.75,36.13,11840000,4.12
    +1986-11-05,35.75,37.13,35.50,37.00,22320000,4.22
    +1986-11-04,34.88,35.88,33.88,35.75,8800000,4.08
    +1986-11-03,34.75,35.13,34.63,35.00,5457600,3.99
    +1986-10-31,34.25,34.88,34.25,34.63,4338400,3.95
    +1986-10-30,33.50,34.75,33.38,34.25,10480000,3.91
    +1986-10-29,33.50,33.50,33.13,33.38,3057600,3.81
    +1986-10-28,34.00,34.13,33.00,33.38,5102400,3.81
    +1986-10-27,33.50,34.00,33.25,34.00,5422400,3.88
    +1986-10-24,33.13,33.25,32.75,33.00,2718400,3.77
    +1986-10-23,32.50,33.13,32.50,33.13,4441600,3.78
    +1986-10-22,32.75,32.88,32.25,32.50,3382400,3.71
    +1986-10-21,33.00,33.00,32.63,32.75,4096000,3.74
    +1986-10-20,33.50,33.63,32.88,32.88,5344000,3.75
    +1986-10-17,33.75,34.00,33.38,33.63,5460000,3.84
    +1986-10-16,33.38,33.88,33.25,33.63,4876000,3.84
    +1986-10-15,33.50,33.50,32.75,33.38,7367200,3.81
    +1986-10-14,34.63,35.25,33.75,34.00,7164000,3.88
    +1986-10-13,33.13,34.63,33.00,34.63,3582400,3.95
    +1986-10-10,32.88,33.38,32.38,33.25,2096000,3.79
    +1986-10-09,32.75,33.25,32.63,33.00,2820000,3.77
    +1986-10-08,32.88,33.00,32.25,32.75,4021600,3.74
    +1986-10-07,34.00,34.13,32.88,33.00,4577600,3.77
    +1986-10-06,33.75,34.25,33.63,34.13,3384000,3.89
    +1986-10-03,34.38,34.75,33.38,33.75,4997600,3.85
    +1986-10-02,33.75,34.38,33.50,34.13,3401600,3.89
    +1986-10-01,33.38,34.50,33.38,34.13,4988800,3.89
    +1986-09-30,32.88,33.88,32.63,33.50,6488800,3.82
    +1986-09-29,33.63,33.88,31.62,32.50,7475200,3.71
    +1986-09-26,34.13,34.38,33.88,34.25,2512800,3.91
    +1986-09-25,35.13,35.25,33.63,34.50,6744800,3.94
    +1986-09-24,36.13,36.38,34.00,35.13,6360000,4.01
    +1986-09-23,35.25,36.25,35.13,36.13,12080000,4.12
    +1986-09-22,33.50,35.38,33.50,35.25,8560000,4.02
    +1986-09-19,33.75,33.88,33.25,33.63,4601600,3.84
    +1986-09-18,34.25,34.50,33.75,34.00,3546400,3.88
    +1986-09-17,34.88,35.00,34.25,34.25,4181600,3.91
    +1986-09-16,33.13,35.13,32.50,34.88,8800000,3.98
    +1986-09-15,32.25,33.13,32.00,33.13,7973600,3.78
    +1986-09-12,32.50,32.75,31.75,31.75,8160000,3.62
    +1986-09-11,34.63,34.75,32.50,32.63,4842400,3.72
    +1986-09-10,35.63,35.88,34.75,35.00,2737600,3.99
    +1986-09-09,34.63,36.00,34.63,35.75,5398400,4.08
    +1986-09-08,35.00,35.00,33.63,34.75,4522400,3.97
    +1986-09-05,35.63,35.88,35.00,35.13,3561600,4.01
    +1986-09-04,35.00,35.50,34.75,35.50,7133600,4.05
    +1986-09-03,34.75,34.88,34.13,34.75,4216000,3.97
    +1986-09-02,37.13,37.13,34.75,34.75,8320000,3.97
    +1986-08-29,37.63,38.00,36.88,37.00,4846400,4.22
    +1986-08-28,37.00,38.00,36.88,37.75,7849600,4.31
    +1986-08-27,36.63,37.00,36.25,37.00,5280000,4.22
    +1986-08-26,36.38,36.88,36.38,36.63,4713600,4.18
    +1986-08-25,36.50,36.88,36.38,36.38,4533600,4.15
    +1986-08-22,35.88,36.63,35.88,36.25,4162400,4.14
    +1986-08-21,36.13,36.38,35.75,35.75,6992800,4.08
    +1986-08-20,35.25,36.50,35.25,36.25,6140000,4.14
    +1986-08-19,35.13,35.50,34.63,35.38,4944000,4.04
    +1986-08-18,35.75,35.88,35.00,35.38,5297600,4.04
    +1986-08-15,36.13,36.50,35.63,35.75,4910400,4.08
    +1986-08-14,36.00,37.00,36.00,36.00,8240000,4.11
    +1986-08-13,34.25,36.25,34.25,36.00,16240000,4.11
    +1986-08-12,33.38,34.38,33.38,34.25,8720000,3.91
    +1986-08-11,31.87,33.50,31.75,33.50,6591200,3.82
    +1986-08-08,31.87,32.38,31.62,31.62,3941600,3.61
    +1986-08-07,31.12,32.63,31.12,31.75,6211200,3.62
    +1986-08-06,32.13,32.13,31.00,31.12,6644800,3.55
    +1986-08-05,31.62,32.38,31.50,32.13,4238400,3.67
    +1986-08-04,31.37,31.50,30.62,31.50,4653600,3.59
    +1986-08-01,31.12,31.75,31.12,31.37,5360000,3.58
    +1986-07-31,30.50,31.50,30.50,31.25,10080000,3.57
    +1986-07-30,31.25,31.50,30.00,30.50,9120000,3.48
    +1986-07-29,32.25,32.25,30.75,31.25,21280000,3.57
    +1986-07-28,33.88,34.00,32.25,32.38,8800000,3.69
    +1986-07-25,33.13,34.00,33.00,34.00,7769600,3.88
    +1986-07-24,34.25,34.38,33.00,33.13,5187200,3.78
    +1986-07-23,34.63,34.63,34.13,34.13,6416000,3.89
    +1986-07-22,33.50,34.63,33.25,34.63,8560000,3.95
    +1986-07-21,33.00,33.75,32.75,33.50,8160000,3.82
    +1986-07-18,32.25,32.50,31.25,31.75,11040000,3.62
    +1986-07-17,33.50,33.75,32.13,32.25,8960000,3.68
    +1986-07-16,35.50,35.63,32.75,33.50,19280000,3.82
    +1986-07-15,35.00,35.00,34.25,34.88,10640000,3.98
    +1986-07-14,37.13,37.38,36.25,36.25,8480000,4.14
    +1986-07-11,35.38,37.75,35.25,37.13,8000000,4.24
    +1986-07-10,34.75,35.38,34.63,35.38,7453600,4.04
    +1986-07-09,34.25,34.75,34.00,34.63,13040000,3.95
    +1986-07-08,35.25,35.25,34.13,34.25,9782400,3.91
    +1986-07-07,37.63,37.75,35.38,35.63,6501600,4.07
    +1986-07-03,36.13,37.75,35.63,37.63,6509600,4.29
    +1986-07-02,35.38,36.25,35.38,36.13,5202400,4.12
    +1986-07-01,35.88,36.13,34.75,35.38,3140000,4.04
    +1986-06-30,35.88,36.25,35.75,35.88,2553600,4.09
    +1986-06-27,36.25,36.75,35.50,35.88,1811200,4.09
    +1986-06-26,35.88,36.38,35.50,36.25,4184800,4.14
    +1986-06-25,35.00,36.00,35.00,35.88,4755200,4.09
    +1986-06-24,34.75,35.13,34.38,34.88,5088800,3.98
    +1986-06-23,36.00,36.25,34.63,34.75,4196000,3.97
    +1986-06-20,35.00,36.13,35.00,36.00,5761600,4.11
    +1986-06-19,34.25,35.75,33.88,35.00,12347200,3.99
    +1986-06-18,34.25,34.75,32.50,34.25,15381600,3.91
    +1986-06-17,35.88,36.00,34.00,34.25,7936000,3.91
    +1986-06-16,36.38,36.88,35.63,35.88,6222400,4.09
    +1986-06-13,36.00,36.38,35.25,36.38,5144800,4.15
    +1986-06-12,36.13,36.38,36.00,36.00,4638400,4.11
    +1986-06-11,36.00,36.25,35.50,36.13,6692800,4.12
    +1986-06-10,36.00,36.00,35.13,36.00,8827200,4.11
    +1986-06-09,37.75,37.88,35.88,36.00,8835200,4.11
    +1986-06-06,38.88,38.88,37.50,37.75,6342400,4.31
    +1986-06-05,38.75,39.13,38.50,38.88,5282400,4.44
    +1986-06-04,37.88,38.88,37.75,38.75,10747200,4.42
    +1986-06-03,37.13,38.13,37.13,37.88,11661600,4.32
    +1986-06-02,37.00,37.38,36.75,37.13,7158400,4.24
    +1986-05-30,37.00,37.25,36.50,37.00,4591200,4.22
    +1986-05-29,37.25,37.25,36.50,37.00,3635200,4.22
    +1986-05-28,36.88,37.50,36.75,37.25,7418400,4.25
    +1986-05-27,37.00,37.00,36.38,36.88,3058400,4.21
    +1986-05-23,36.75,37.13,36.38,37.00,5013600,4.22
    +1986-05-22,37.00,37.50,35.75,36.75,7895200,4.19
    +1986-05-21,35.38,37.25,35.00,37.00,12418400,4.22
    +1986-05-20,35.63,35.63,34.25,35.38,8811200,4.04
    +1986-05-19,36.00,36.50,35.50,35.63,7506400,4.07
    +1986-05-16,36.00,36.25,35.13,36.00,11424800,4.11
    +1986-05-15,36.88,37.00,35.63,36.00,7964000,4.11
    +1986-05-14,36.00,37.38,36.00,36.88,17277600,4.21
    +1986-05-13,36.38,36.50,35.25,36.00,16876000,4.11
    +1986-05-12,33.38,36.63,33.25,36.38,14335200,4.15
    +1986-05-09,33.00,33.63,32.75,33.38,7961600,3.81
    +1986-05-08,31.50,33.13,31.50,33.00,8342400,3.77
    +1986-05-07,32.63,32.88,31.25,31.50,7133600,3.59
    +1986-05-06,32.25,33.25,32.25,32.63,7829600,3.72
    +1986-05-05,30.50,32.50,30.50,32.13,5364000,3.67
    +1986-05-02,30.25,31.00,30.12,30.50,3377600,3.48
    +1986-05-01,30.25,30.25,29.75,30.25,9218400,3.45
    +1986-04-30,31.25,31.62,30.25,30.25,4944000,3.45
    +1986-04-29,32.00,32.25,26.87,31.25,4750400,3.57
    +1986-04-28,32.25,32.75,31.75,32.00,5241600,3.65
    +1986-04-25,31.37,32.63,31.37,32.25,9348800,3.68
    +1986-04-24,29.62,31.50,29.50,31.37,16398400,3.58
    +1986-04-23,29.87,30.37,29.37,29.62,9371200,3.38
    +1986-04-22,30.37,31.25,29.62,29.87,11726400,3.41
    +1986-04-21,29.87,30.75,29.87,30.37,9775200,3.47
    +1986-04-18,29.00,29.87,28.75,29.75,8871200,3.39
    +1986-04-17,28.25,29.12,28.00,29.00,9672800,3.31
    +1986-04-16,27.37,28.50,27.37,28.25,7535200,3.22
    +1986-04-15,26.87,27.50,26.87,27.37,4722400,3.12
    +1986-04-14,27.00,27.25,26.75,26.87,3076000,3.07
    +1986-04-11,27.25,27.50,27.00,27.00,2737600,3.08
    +1986-04-10,27.12,27.37,26.87,27.25,3932800,3.11
    +1986-04-09,27.62,27.75,26.87,27.12,4851200,3.09
    +1986-04-08,27.25,27.75,27.25,27.62,6912800,3.15
    +1986-04-07,26.75,27.50,26.25,27.25,4318400,3.11
    +1986-04-04,27.00,27.00,26.62,26.75,4508800,3.05
    +1986-04-03,27.25,27.62,26.87,27.00,7548800,3.08
    +1986-04-02,27.25,27.37,26.25,27.25,11627200,3.11
    +1986-04-01,28.25,28.25,27.00,27.25,7973600,3.11
    +1986-03-31,28.25,28.50,28.00,28.25,6744800,3.22
    +1986-03-27,28.25,29.00,28.25,28.25,7856000,3.22
    +1986-03-26,27.87,28.75,27.87,28.25,7941600,3.22
    +1986-03-25,26.75,27.87,26.75,27.87,10060000,3.18
    +1986-03-24,27.62,27.62,26.37,26.75,10528800,3.05
    +1986-03-21,28.25,28.75,27.50,27.62,9309600,3.15
    +1986-03-20,28.00,29.62,28.00,28.25,32318400,3.22
    +1986-03-19,26.87,27.25,26.37,26.50,6816000,3.02
    +1986-03-18,26.00,27.25,25.87,26.87,8920000,3.07
    +1986-03-17,26.00,26.00,25.37,26.00,4240000,2.97
    +1986-03-14,24.75,26.25,24.75,26.12,13781600,2.98
    +1986-03-13,24.75,25.00,24.37,24.75,4176000,2.82
    +1986-03-12,24.87,25.12,24.75,24.75,3071200,2.82
    +1986-03-11,24.62,24.87,24.50,24.87,3681600,2.84
    +1986-03-10,24.75,24.87,24.62,24.62,2727200,2.81
    +1986-03-07,25.37,25.37,24.75,24.75,3477600,2.82
    +1986-03-06,25.25,25.75,25.12,25.37,3630400,2.89
    +1986-03-05,24.62,25.50,24.25,25.25,6324000,2.88
    +1986-03-04,24.62,25.00,24.50,24.62,3217600,2.81
    +1986-03-03,25.00,25.12,24.50,24.62,3912800,2.81
    +1986-02-28,25.62,25.87,24.87,25.00,4507200,2.85
    +1986-02-27,26.00,26.12,25.50,25.62,3873600,2.92
    +1986-02-26,26.37,26.75,26.00,26.00,5907200,2.97
    +1986-02-25,25.75,26.37,25.12,26.37,8041600,3.01
    +1986-02-24,25.25,25.75,25.00,25.75,8840000,2.94
    +1986-02-21,25.12,25.75,25.12,25.25,6771200,2.88
    +1986-02-20,25.00,25.37,24.87,25.12,4951200,2.87
    +1986-02-19,23.87,25.50,23.87,25.00,12871200,2.85
    +1986-02-18,23.75,24.00,23.25,23.87,5295200,2.72
    +1986-02-14,23.87,24.12,23.75,23.75,4928800,2.71
    +1986-02-13,24.00,24.00,23.75,23.87,3944000,2.72
    +1986-02-12,23.87,24.00,23.75,24.00,4770400,2.74
    +1986-02-11,23.87,24.00,23.50,23.87,5504000,2.72
    +1986-02-10,24.00,24.50,23.75,23.87,4036000,2.72
    +1986-02-07,24.12,24.12,23.50,24.00,4656000,2.74
    +1986-02-06,23.75,24.25,23.62,24.12,4835200,2.75
    +1986-02-05,23.75,23.87,23.50,23.75,7042400,2.71
    +1986-02-04,23.87,24.37,23.75,23.75,9298400,2.71
    +1986-02-03,23.12,24.00,22.87,23.87,12512800,2.72
    +1986-01-31,23.00,23.25,22.87,23.12,5317600,2.64
    +1986-01-30,23.50,23.50,22.87,23.00,8493600,2.62
    +1986-01-29,22.25,24.37,22.00,23.62,21064800,2.70
    +1986-01-28,22.12,22.37,22.00,22.25,7949600,2.54
    +1986-01-27,22.62,22.75,22.00,22.12,13955200,2.52
    +1986-01-24,23.00,23.37,22.62,22.62,4044000,2.58
    +1986-01-23,23.37,23.50,22.75,23.00,5624000,2.62
    +1986-01-22,24.00,24.12,22.37,23.37,5144800,2.67
    +1986-01-21,23.87,24.12,23.75,24.00,5464800,2.74
    +1986-01-20,24.00,24.00,23.37,23.87,4590400,2.72
    +1986-01-17,24.50,24.75,23.87,24.00,12344000,2.74
    +1986-01-16,23.87,24.75,23.87,24.50,19132800,2.80
    +1986-01-15,23.25,24.00,23.12,23.87,15126400,2.72
    +1986-01-14,23.00,23.75,22.50,23.25,9772800,2.65
    +1986-01-13,22.75,23.12,22.50,23.00,7701600,2.62
    +1986-01-10,22.62,23.12,22.62,22.75,5491200,2.60
    +1986-01-09,22.87,23.00,21.87,22.62,16002400,2.58
    +1986-01-08,23.00,23.50,22.75,22.87,21711200,2.61
    +1986-01-07,22.25,23.00,22.12,23.00,16807200,2.62
    +1986-01-06,22.37,22.37,21.87,22.25,6636000,2.54
    +1986-01-03,22.25,22.37,22.12,22.37,8653600,2.55
    +1986-01-02,22.00,22.25,21.75,22.25,4212800,2.54
    +1985-12-31,22.25,22.37,22.00,22.00,3158400,2.51
    +1985-12-30,22.37,22.62,22.12,22.25,3848800,2.54
    +1985-12-27,21.75,22.62,21.75,22.37,4427200,2.55
    +1985-12-26,21.75,22.00,21.62,21.75,1658400,2.48
    +1985-12-24,21.87,22.00,21.62,21.75,2344800,2.48
    +1985-12-23,22.37,22.50,21.62,21.87,5157600,2.50
    +1985-12-20,22.50,22.75,22.25,22.37,7402400,2.55
    +1985-12-19,22.25,22.75,22.12,22.50,9673600,2.57
    +1985-12-18,21.37,22.87,21.37,22.25,20033600,2.54
    +1985-12-17,20.87,21.00,20.37,20.62,3926400,2.35
    +1985-12-16,20.00,21.25,20.00,20.87,10362400,2.38
    +1985-12-13,20.00,20.25,19.75,20.00,8975200,2.28
    +1985-12-12,19.87,20.25,19.87,20.00,4515200,2.28
    +1985-12-11,19.50,20.12,19.50,19.75,8489600,2.25
    +1985-12-10,19.37,19.62,19.25,19.50,7206400,2.23
    +1985-12-09,19.75,20.00,19.25,19.37,5015200,2.21
    +1985-12-06,20.12,20.12,19.62,19.75,2347200,2.25
    +1985-12-05,20.50,20.75,20.00,20.12,4508800,2.30
    +1985-12-04,20.12,20.62,20.12,20.50,5928800,2.34
    +1985-12-03,20.25,20.37,20.00,20.12,5548800,2.30
    +1985-12-02,20.12,20.25,20.00,20.25,3611200,2.31
    +1985-11-29,20.00,20.12,19.87,20.12,3546400,2.30
    +1985-11-27,19.37,20.12,19.25,20.00,6873600,2.28
    +1985-11-26,19.12,19.50,19.00,19.37,5892800,2.21
    +1985-11-25,19.00,19.25,19.00,19.12,3488800,2.18
    +1985-11-22,19.00,19.25,18.87,19.00,4620000,2.17
    +1985-11-21,19.00,19.25,19.00,19.00,3720000,2.17
    +1985-11-20,19.25,19.37,19.00,19.00,3548800,2.17
    +1985-11-19,19.87,20.00,19.25,19.25,3373600,2.20
    +1985-11-18,19.87,20.00,19.87,19.87,2342400,2.27
    +1985-11-15,20.00,20.25,19.87,19.87,2932800,2.27
    +1985-11-14,20.00,20.12,20.00,20.00,4995200,2.28
    +1985-11-13,19.87,19.87,19.37,19.37,3642400,2.21
    +1985-11-12,20.00,20.25,19.87,19.87,6224800,2.27
    +1985-11-11,20.50,20.75,20.00,20.00,6421600,2.28
    +1985-11-08,20.50,20.75,20.50,20.50,10517600,2.34
    +1985-11-07,19.62,19.87,19.62,19.62,11352800,2.24
    +1985-11-06,19.25,19.37,19.25,19.25,7181600,2.20
    +1985-11-05,18.75,19.12,18.62,18.62,3841600,2.12
    +1985-11-04,18.75,19.12,18.75,18.75,5584800,2.14
    +1985-11-01,18.62,19.00,18.62,18.62,3320000,2.12
    +1985-10-31,19.00,19.25,18.62,18.62,5548800,2.12
    +1985-10-30,19.00,19.00,19.00,19.00,8098400,2.17
    +1985-10-29,18.00,18.00,17.87,17.87,4693600,2.04
    +1985-10-28,18.00,18.12,18.00,18.00,2148800,2.05
    +1985-10-25,18.37,18.37,18.00,18.00,2271200,2.05
    +1985-10-24,18.37,18.87,18.37,18.37,9768800,2.10
    +1985-10-23,18.00,18.50,18.00,18.00,5309600,2.05
    +1985-10-22,18.00,18.25,18.00,18.00,15186400,2.05
    +1985-10-21,17.75,17.75,17.25,17.25,4248800,1.97
    +1985-10-18,18.25,18.37,17.75,17.75,8268800,2.03
    +1985-10-17,18.25,19.12,18.25,18.25,12455200,2.08
    +1985-10-16,18.00,18.12,18.00,18.00,10336000,2.05
    +1985-10-15,17.00,17.12,17.00,17.00,10504800,1.94
    +1985-10-14,16.62,16.62,16.62,16.62,5555200,1.90
    +1985-10-11,16.00,16.25,16.00,16.00,4261600,1.83
    +1985-10-10,15.88,16.00,15.88,15.88,9386400,1.81
    +1985-10-09,15.13,15.25,15.00,15.00,3001600,1.71
    +1985-10-08,15.13,15.13,15.13,15.13,3144000,1.73
    +1985-10-07,15.00,15.25,15.00,15.00,3284800,1.71
    +1985-10-04,15.50,15.50,15.00,15.00,2484800,1.71
    +1985-10-03,15.63,15.63,15.50,15.50,1784800,1.77
    +1985-10-02,15.75,15.88,15.63,15.63,795200,1.78
    +1985-10-01,15.75,15.88,15.75,15.75,3175200,1.80
    +1985-09-30,15.88,16.00,15.75,15.75,1324800,1.80
    +1985-09-27,15.88,16.00,15.88,15.88,250400,1.81
    +1985-09-26,15.88,16.00,15.88,15.88,1949600,1.81
    +1985-09-25,16.50,16.50,15.88,15.88,3761600,1.81
    +1985-09-24,16.87,17.25,16.50,16.50,3161600,1.88
    +1985-09-23,16.87,17.12,16.87,16.87,4277600,1.92
    +1985-09-20,17.00,17.12,16.75,16.75,4846400,1.91
    +1985-09-19,17.00,17.00,17.00,17.00,6662400,1.94
    +1985-09-18,16.25,16.25,16.25,16.25,4316000,1.85
    +1985-09-17,15.25,15.25,15.25,15.25,6564000,1.74
    +1985-09-16,15.75,15.75,15.25,15.25,1344000,1.74
    +1985-09-13,16.12,16.12,15.75,15.75,2541600,1.80
    +1985-09-12,16.12,16.12,16.12,16.12,3998400,1.84
    +1985-09-11,15.50,15.63,15.50,15.50,3150400,1.77
    +1985-09-10,15.38,15.63,15.38,15.38,4364800,1.75
    +1985-09-09,15.25,15.38,15.25,15.25,4728800,1.74
    +1985-09-06,15.00,15.00,15.00,15.00,3333600,1.71
    +1985-09-05,14.88,15.00,14.88,14.88,1201600,1.70
    +1985-09-04,14.88,15.13,14.88,14.88,1708800,1.70
    +1985-09-03,15.00,15.00,14.75,14.75,1369600,1.68
    +1985-08-30,15.00,15.00,15.00,15.00,1537600,1.71
    +1985-08-29,15.25,15.25,14.88,14.88,2006400,1.70
    +1985-08-28,15.25,15.38,15.25,15.25,1475200,1.74
    +1985-08-27,15.25,15.25,15.25,15.25,1540000,1.74
    +1985-08-26,15.13,15.13,15.13,15.13,1315200,1.73
    +1985-08-23,14.88,15.00,14.75,14.75,1601600,1.68
    +1985-08-22,15.25,15.25,14.88,14.88,4406400,1.70
    +1985-08-21,15.25,15.25,15.25,15.25,2767200,1.74
    +1985-08-20,15.25,15.25,15.25,15.25,2431200,1.74
    +1985-08-19,15.00,15.25,15.00,15.00,1726400,1.71
    +1985-08-16,14.63,14.88,14.63,14.63,3008800,1.67
    +1985-08-15,14.63,14.75,14.50,14.50,3800000,1.65
    +1985-08-14,15.25,15.25,14.63,14.63,10372800,1.67
    +1985-08-13,15.25,15.50,15.25,15.25,1555200,1.74
    +1985-08-12,15.25,15.25,15.00,15.00,1988800,1.71
    +1985-08-09,15.25,15.25,15.25,15.25,2186400,1.74
    +1985-08-08,15.13,15.25,15.13,15.13,5321600,1.73
    +1985-08-07,15.25,16.00,14.88,14.88,5452800,1.70
    +1985-08-06,15.38,15.75,15.25,15.25,2260000,1.74
    +1985-08-05,15.75,15.88,15.38,15.38,3307200,1.75
    +1985-08-02,15.88,15.88,15.75,15.75,3501600,1.80
    +1985-08-01,15.88,16.12,15.88,15.88,1842400,1.81
    +1985-07-31,16.25,16.37,15.88,15.88,2917600,1.81
    +1985-07-30,16.25,16.37,16.25,16.25,3237600,1.85
    +1985-07-29,16.62,16.62,16.00,16.00,2808800,1.83
    +1985-07-26,16.62,16.75,16.62,16.62,4673600,1.90
    +1985-07-25,16.62,16.75,16.62,16.62,11282400,1.90
    +1985-07-24,16.50,16.75,16.25,16.25,6040000,1.85
    +1985-07-23,16.87,17.12,16.50,16.50,6038400,1.88
    +1985-07-22,17.37,17.37,16.87,16.87,6906400,1.92
    +1985-07-19,17.37,17.37,17.37,17.37,4117600,1.98
    +1985-07-18,17.62,17.62,17.25,17.25,6437600,1.97
    +1985-07-17,17.62,17.87,17.62,17.62,4255200,2.01
    +1985-07-16,17.75,17.87,17.50,17.50,5120000,2.00
    +1985-07-15,17.87,18.25,17.75,17.75,2804800,2.03
    +1985-07-12,18.00,18.00,17.87,17.87,1680000,2.04
    +1985-07-11,18.00,18.12,18.00,18.00,2361600,2.05
    +1985-07-10,18.00,18.00,18.00,18.00,3802400,2.05
    +1985-07-09,17.62,17.75,17.62,17.62,5284000,2.01
    +1985-07-08,17.62,17.75,17.62,17.62,3301600,2.01
    +1985-07-05,17.62,17.75,17.62,17.62,1321600,2.01
    +1985-07-03,17.50,17.50,17.50,17.50,2472800,2.00
    +1985-07-02,18.12,18.25,17.25,17.25,2807200,1.97
    +1985-07-01,18.12,18.25,18.12,18.12,3702400,2.07
    +1985-06-28,18.37,18.50,18.00,18.00,4875200,2.05
    +1985-06-27,18.37,18.50,18.37,18.37,6915200,2.10
    +1985-06-26,18.12,18.12,18.12,18.12,4722400,2.07
    +1985-06-25,17.50,17.87,17.50,17.50,10506400,2.00
    +1985-06-24,17.25,17.50,17.25,17.25,7387200,1.97
    +1985-06-21,16.12,16.50,16.12,16.12,5941600,1.84
    +1985-06-20,15.75,15.75,15.75,15.75,6822400,1.80
    +1985-06-19,15.63,15.88,15.63,15.63,6177600,1.78
    +1985-06-18,15.25,15.50,15.25,15.25,9489600,1.74
    +1985-06-17,14.88,15.00,14.88,14.88,8464000,1.70
    +1985-06-14,14.88,15.75,14.75,14.75,20226400,1.68
    +1985-06-13,15.75,15.88,14.88,14.88,13573600,1.70
    +1985-06-12,16.12,16.25,15.75,15.75,8888800,1.80
    +1985-06-11,16.12,16.50,16.12,16.12,10751200,1.84
    +1985-06-10,16.37,16.50,16.12,16.12,11296000,1.84
    +1985-06-07,17.00,17.00,16.37,16.37,16980000,1.87
    +1985-06-06,17.00,17.00,17.00,17.00,9688800,1.94
    +1985-06-05,17.25,17.75,16.87,16.87,10267200,1.92
    +1985-06-04,17.25,17.37,17.25,17.25,14373600,1.97
    +1985-06-03,17.00,17.00,16.00,16.00,20578400,1.83
    +1985-05-31,17.62,18.00,17.37,17.37,13235200,1.98
    +1985-05-30,17.62,17.87,17.62,17.62,11273600,2.01
    +1985-05-29,17.12,17.25,17.12,17.12,8808800,1.95
    +1985-05-28,17.87,17.87,16.87,16.87,18253600,1.92
    +1985-05-24,19.75,19.75,18.12,18.12,21060000,2.07
    +1985-05-23,20.50,20.50,19.75,19.75,8576000,2.25
    +1985-05-22,20.75,20.87,20.62,20.62,4342400,2.35
    +1985-05-21,21.25,21.25,20.75,20.75,5452800,2.37
    +1985-05-20,21.75,22.25,21.37,21.37,7044000,2.44
    +1985-05-17,21.37,22.12,21.25,21.75,7592800,2.48
    +1985-05-16,21.37,22.00,21.37,21.37,8275200,2.44
    +1985-05-15,20.00,20.37,20.00,20.00,4668800,2.28
    +1985-05-14,20.00,20.12,19.75,19.75,4364000,2.25
    +1985-05-13,20.25,20.37,20.00,20.00,3157600,2.28
    +1985-05-10,20.00,20.50,20.00,20.25,4893600,2.31
    +1985-05-09,20.00,20.12,20.00,20.00,4571200,2.28
    +1985-05-08,19.87,19.87,19.87,19.87,5177600,2.27
    +1985-05-07,20.00,20.00,20.00,20.00,3844800,2.28
    +1985-05-06,20.00,20.25,19.75,19.75,2007200,2.25
    +1985-05-03,19.25,20.12,19.25,20.00,5673600,2.28
    +1985-05-02,20.62,20.62,19.25,19.25,11787200,2.20
    +1985-05-01,21.25,21.37,20.87,20.87,2075200,2.38
    +1985-04-30,21.25,21.37,21.25,21.25,3396000,2.42
    +1985-04-29,21.87,22.00,21.12,21.12,2256000,2.41
    +1985-04-26,22.00,22.62,21.87,21.87,4295200,2.50
    +1985-04-25,22.00,22.12,22.00,22.00,3135200,2.51
    +1985-04-24,22.12,22.50,22.00,22.00,2830400,2.51
    +1985-04-23,22.12,22.25,22.12,22.12,4261600,2.52
    +1985-04-22,22.50,22.50,21.62,21.62,3700000,2.47
    +1985-04-19,22.87,22.87,22.37,22.50,3468800,2.57
    +1985-04-18,22.87,23.00,22.87,22.87,7246400,2.61
    +1985-04-17,22.62,22.87,22.62,22.62,4402400,2.58
    +1985-04-16,21.62,21.75,21.62,21.62,2424800,2.47
    +1985-04-15,21.37,21.62,21.37,21.37,2168800,2.44
    +1985-04-12,21.37,21.37,20.75,20.87,2607200,2.38
    +1985-04-11,21.37,22.00,21.37,21.37,5260000,2.44
    +1985-04-10,21.00,21.25,21.00,21.00,8117600,2.40
    +1985-04-09,19.62,19.75,19.62,19.62,9461600,2.24
    +1985-04-08,20.87,21.00,19.62,19.62,7129600,2.24
    +1985-04-04,21.00,21.12,20.62,20.87,5792800,2.38
    +1985-04-03,21.00,21.12,21.00,21.00,8681600,2.40
    +1985-04-02,21.62,21.75,21.00,21.00,8146400,2.40
    +1985-04-01,22.12,22.62,21.62,21.62,4115200,2.47
    +1985-03-29,21.87,22.25,21.87,22.12,3155200,2.52
    +1985-03-28,21.87,22.25,21.87,21.87,4667200,2.50
    +1985-03-27,22.50,22.75,21.87,21.87,4008800,2.50
    +1985-03-26,22.50,22.50,22.50,22.50,4346400,2.57
    +1985-03-25,22.25,22.25,21.62,21.62,3931200,2.47
    +1985-03-22,22.62,23.00,22.25,22.25,2910400,2.54
    +1985-03-21,22.62,23.00,22.62,22.62,5826400,2.58
    +1985-03-20,22.25,22.62,22.25,22.25,14498400,2.54
    +1985-03-19,22.87,23.12,22.00,22.00,6147200,2.51
    +1985-03-18,22.87,23.12,22.87,22.87,4487200,2.61
    +1985-03-15,21.75,23.12,21.62,22.62,6524000,2.58
    +1985-03-14,21.75,21.87,21.75,21.75,8667200,2.48
    +1985-03-13,23.00,23.00,21.75,21.75,8973600,2.48
    +1985-03-12,23.00,23.25,23.00,23.00,7880000,2.62
    +1985-03-11,22.25,22.37,22.25,22.25,10244800,2.54
    +1985-03-08,22.12,22.12,20.75,21.50,16931200,2.45
    +1985-03-07,24.62,24.75,22.12,22.12,26244000,2.52
    +1985-03-06,25.87,25.87,24.62,24.62,6933600,2.81
    +1985-03-05,25.87,25.87,25.87,25.87,4687200,2.95
    +1985-03-04,25.25,26.00,25.25,25.25,5484000,2.88
    +1985-03-01,24.75,24.87,24.00,24.87,8857600,2.84
    +1985-02-28,25.12,25.12,24.75,24.75,11415200,2.82
    +1985-02-27,26.75,26.75,25.12,25.12,14421600,2.87
    +1985-02-26,27.25,27.37,26.75,26.75,6764800,3.05
    +1985-02-25,27.62,27.75,27.25,27.25,3564000,3.11
    +1985-02-22,26.87,27.87,26.87,27.62,8096000,3.15
    +1985-02-21,26.87,27.00,26.87,26.87,11035200,3.07
    +1985-02-20,27.62,27.75,26.37,26.37,7864800,3.01
    +1985-02-19,27.87,27.87,27.62,27.62,5391200,3.15
    +1985-02-15,27.62,28.12,27.37,28.00,6224000,3.19
    +1985-02-14,28.37,28.62,27.62,27.62,15268800,3.15
    +1985-02-13,29.75,29.75,28.37,28.37,18835200,3.24
    +1985-02-12,30.50,30.62,29.75,29.75,8095200,3.39
    +1985-02-11,30.50,30.75,30.50,30.50,12431200,3.48
    +1985-02-08,29.87,30.00,29.50,29.87,4757600,3.41
    +1985-02-07,30.00,30.37,29.87,29.87,8793600,3.41
    +1985-02-06,30.00,30.00,30.00,30.00,6980000,3.42
    +1985-02-05,29.50,30.00,29.50,29.50,6824800,3.37
    +1985-02-04,29.25,29.37,29.25,29.25,7801600,3.34
    +1985-02-01,29.00,29.12,28.37,28.62,4941600,3.27
    +1985-01-31,29.87,30.00,29.00,29.00,9880000,3.31
    +1985-01-30,29.87,30.50,29.87,29.87,17624800,3.41
    +1985-01-29,30.25,30.50,29.87,29.87,8029600,3.41
    +1985-01-28,30.25,30.62,30.25,30.25,14721600,3.45
    +1985-01-25,29.00,29.62,28.37,29.62,11381600,3.38
    +1985-01-24,29.62,29.62,29.00,29.00,14192800,3.31
    +1985-01-23,30.12,30.25,29.62,29.62,15384000,3.38
    +1985-01-22,30.12,30.25,30.12,30.12,15202400,3.44
    +1985-01-21,29.25,29.50,29.25,29.25,11635200,3.34
    +1985-01-18,28.12,29.25,28.00,28.62,12615200,3.27
    +1985-01-17,30.25,30.75,28.12,28.12,19573600,3.21
    +1985-01-16,30.25,30.75,30.25,30.25,6816000,3.45
    +1985-01-15,30.62,31.12,30.00,30.00,9476000,3.42
    +1985-01-14,30.62,30.87,30.62,30.62,9691200,3.49
    +1985-01-11,30.00,30.25,29.50,29.75,7347200,3.39
    +1985-01-10,30.00,30.12,30.00,30.00,9926400,3.42
    +1985-01-09,28.75,29.12,28.75,28.75,5973600,3.28
    +1985-01-08,28.25,28.50,28.00,28.00,5040000,3.19
    +1985-01-07,28.37,28.50,28.25,28.25,6117600,3.22
    +1985-01-04,28.37,28.50,28.00,28.37,4915200,3.24
    +1985-01-03,28.37,29.12,28.37,28.37,5967200,3.24
    +1985-01-02,29.12,29.12,27.87,27.87,6272800,3.18
    +1984-12-31,29.12,29.25,29.12,29.12,7453600,3.32
    +1984-12-28,27.75,28.87,27.62,28.75,5941600,3.28
    +1984-12-27,27.75,27.87,27.75,27.75,3531200,3.17
    +1984-12-26,27.62,27.87,27.62,27.62,2444000,3.15
    +1984-12-24,27.50,27.62,27.50,27.50,2418400,3.14
    +1984-12-21,27.37,27.50,26.75,27.00,4438400,3.08
    +1984-12-20,27.50,28.00,27.37,27.37,5013600,3.12
    +1984-12-19,28.62,28.75,27.50,27.50,11372800,3.14
    +1984-12-18,28.62,28.75,28.62,28.62,12164800,3.27
    +1984-12-17,27.00,27.25,27.00,27.00,4513600,3.08
    +1984-12-14,25.75,26.62,25.75,26.37,3475200,3.01
    +1984-12-13,25.75,26.25,25.75,25.75,2424800,2.94
    +1984-12-12,26.37,26.37,25.50,25.50,3937600,2.91
    +1984-12-11,26.75,27.12,26.37,26.37,4432800,3.01
    +1984-12-10,27.25,27.25,26.75,26.75,4016000,3.05
    +1984-12-07,27.37,28.37,27.12,27.25,17696000,3.11
    +1984-12-06,27.37,27.50,27.37,27.37,11360000,3.12
    +1984-12-05,26.12,26.12,26.12,26.12,9406400,2.98
    +1984-12-04,24.87,25.37,24.87,24.87,4332800,2.84
    +1984-12-03,24.75,24.87,24.37,24.37,3533600,2.78
    +1984-11-30,25.37,25.62,24.62,24.75,3906400,2.82
    +1984-11-29,25.87,25.87,25.37,25.37,6248800,2.89
    +1984-11-28,25.87,26.50,25.87,25.87,14673600,2.95
    +1984-11-27,24.62,24.87,24.62,24.62,4590400,2.81
    +1984-11-26,24.00,24.00,24.00,24.00,3636000,2.74
    +1984-11-23,23.37,24.12,23.37,23.75,4904800,2.71
    +1984-11-21,23.12,23.25,23.12,23.12,6418400,2.64
    +1984-11-20,22.62,22.75,22.62,22.62,9424800,2.58
    +1984-11-19,23.25,23.37,21.87,21.87,8321600,2.50
    +1984-11-16,23.75,24.12,23.12,23.25,5920000,2.65
    +1984-11-15,23.75,24.00,23.75,23.75,3833600,2.71
    +1984-11-14,23.75,24.00,23.75,23.75,3752800,2.71
    +1984-11-13,24.12,24.62,23.50,23.50,4548800,2.68
    +1984-11-12,24.12,24.25,24.12,24.12,4070400,2.75
    +1984-11-09,24.75,24.87,23.00,23.25,10518400,2.65
    +1984-11-08,25.75,25.75,24.75,24.75,3162400,2.82
    +1984-11-07,26.25,26.37,25.75,25.75,8286400,2.94
    +1984-11-06,26.25,26.37,26.25,26.25,8073600,3.00
    +1984-11-05,24.87,25.37,24.75,24.75,3764800,2.82
    +1984-11-02,25.00,25.12,24.75,24.87,1004800,2.84
    +1984-11-01,25.00,25.25,25.00,25.00,1680000,2.85
    +1984-10-31,25.00,25.25,24.87,24.87,2191200,2.84
    +1984-10-30,25.00,25.25,25.00,25.00,2677600,2.85
    +1984-10-29,24.75,24.87,24.75,24.75,1836000,2.82
    +1984-10-26,25.25,25.25,24.50,24.62,4113600,2.81
    +1984-10-25,26.25,26.25,25.25,25.25,5676000,2.88
    +1984-10-24,26.25,26.50,26.25,26.25,5989600,3.00
    +1984-10-23,26.00,26.25,26.00,26.00,6668800,2.97
    +1984-10-22,25.62,26.00,25.37,25.37,4108800,2.89
    +1984-10-19,25.62,27.37,25.50,25.62,11673600,2.92
    +1984-10-18,25.62,25.75,25.62,25.62,8842400,2.92
    +1984-10-17,24.87,25.00,24.87,24.87,5636000,2.84
    +1984-10-16,24.00,24.12,23.87,23.87,4246400,2.72
    +1984-10-15,24.00,24.25,24.00,24.00,8715200,2.74
    +1984-10-12,23.75,23.87,22.50,22.75,9522400,2.60
    +1984-10-11,23.87,24.50,23.75,23.75,6553600,2.71
    +1984-10-10,24.62,24.62,23.87,23.87,13070400,2.72
    +1984-10-09,24.87,25.00,24.62,24.62,4515200,2.81
    +1984-10-08,24.87,25.00,24.87,24.87,1721600,2.84
    +1984-10-05,25.37,25.37,24.75,24.87,3510400,2.84
    +1984-10-04,25.37,25.62,25.37,25.37,4482400,2.89
    +1984-10-03,25.12,25.50,25.12,25.12,4335200,2.87
    +1984-10-02,24.75,25.62,24.75,24.75,4258400,2.82
    +1984-10-01,25.00,25.00,24.50,24.50,3521600,2.80
    +1984-09-28,25.75,25.75,24.62,25.12,8344800,2.87
    +1984-09-27,25.75,25.87,25.75,25.75,3796000,2.94
    +1984-09-26,26.12,27.25,25.75,25.75,3987200,2.94
    +1984-09-25,26.50,26.50,26.12,26.12,5977600,2.98
    +1984-09-24,26.87,27.00,26.62,26.62,2833600,3.04
    +1984-09-21,27.12,27.87,26.50,26.87,3591200,3.07
    +1984-09-20,27.12,27.37,27.12,27.12,2387200,3.09
    +1984-09-19,27.62,27.87,27.00,27.00,3816000,3.08
    +1984-09-18,28.62,28.87,27.62,27.62,3495200,3.15
    +1984-09-17,28.62,29.00,28.62,28.62,6886400,3.27
    +1984-09-14,27.62,28.50,27.62,27.87,8826400,3.18
    +1984-09-13,27.50,27.62,27.50,27.50,7429600,3.14
    +1984-09-12,26.87,27.00,26.12,26.12,4773600,2.98
    +1984-09-11,26.62,27.37,26.62,26.87,5444000,3.07
    +1984-09-10,26.50,26.62,25.87,26.37,2346400,3.01
    +1984-09-07,26.50,26.87,26.25,26.50,2981600,3.02
    Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/sampledata/AAPL.dat and /tmp/GJbvHcIw6l/matplotlib-1.0.1/sampledata/AAPL.dat differ
    Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/sampledata/aapl.npy and /tmp/GJbvHcIw6l/matplotlib-1.0.1/sampledata/aapl.npy differ
    Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/sampledata/axes_grid/bivariate_normal.npy and /tmp/GJbvHcIw6l/matplotlib-1.0.1/sampledata/axes_grid/bivariate_normal.npy differ
    diff -Nru matplotlib-0.99.3/sampledata/data_x_x2_x3.csv matplotlib-1.0.1/sampledata/data_x_x2_x3.csv
    --- matplotlib-0.99.3/sampledata/data_x_x2_x3.csv	1970-01-01 00:00:00.000000000 +0000
    +++ matplotlib-1.0.1/sampledata/data_x_x2_x3.csv	2009-09-06 12:32:28.000000000 +0000
    @@ -0,0 +1,11 @@
    + 0   0    0
    + 1   1    1
    + 2   4    8
    + 3   9   27
    + 4  16   64
    + 5  25  125
    + 6  36  216
    + 7  49  343
    + 8  64  512
    + 9  81  729
    +10 100 1000
    diff -Nru matplotlib-0.99.3/sampledata/demodata.csv matplotlib-1.0.1/sampledata/demodata.csv
    --- matplotlib-0.99.3/sampledata/demodata.csv	1970-01-01 00:00:00.000000000 +0000
    +++ matplotlib-1.0.1/sampledata/demodata.csv	2009-09-06 12:32:28.000000000 +0000
    @@ -0,0 +1,11 @@
    +clientid,date,weekdays,gains,prices,up
    +0,2008-04-30,Wed,-0.52458192906686452,7791404.0091921333,False
    +1,2008-05-01,Thu,0.076191536201738269,3167180.7366340165,True
    +2,2008-05-02,Fri,-0.86850970062880861,9589766.9613829032,False
    +3,2008-05-03,Sat,-0.42701083852713395,8949415.1867596991,False
    +4,2008-05-04,Sun,0.2532553652693274,937163.44375252665,True
    +5,2008-05-05,Mon,-0.68151636911081892,949579.88022264629,False
    +6,2008-05-06,Tue,0.0071911579626532168,7268426.906552773,True
    +7,2008-05-07,Wed,0.67449747200412147,7517014.782897247,True
    +8,2008-05-08,Thu,-1.1841008656818983,1920959.5423492221,False
    +9,2008-05-09,Fri,-1.5803692595811152,8456240.6198725495,False
    Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/sampledata/eeg.dat and /tmp/GJbvHcIw6l/matplotlib-1.0.1/sampledata/eeg.dat differ
    diff -Nru matplotlib-0.99.3/sampledata/embedding_in_wx3.xrc matplotlib-1.0.1/sampledata/embedding_in_wx3.xrc
    --- matplotlib-0.99.3/sampledata/embedding_in_wx3.xrc	1970-01-01 00:00:00.000000000 +0000
    +++ matplotlib-1.0.1/sampledata/embedding_in_wx3.xrc	2009-09-06 12:32:28.000000000 +0000
    @@ -0,0 +1,65 @@
    +
    +
    +  
    +    embedding_in_wx3
    +    
    +      
    +        wxVERTICAL
    +        
    +          
    +            
    +            
    +          
    +          
    +          wxALL|wxEXPAND
    +          5
    +        
    +        
    +          
    +            wxHORIZONTAL
    +            
    +              
    +                
    +              
    +              
    +              wxALL|wxEXPAND
    +              2
    +            
    +            
    +              
    +                
    +              
    +              
    +              wxALL|wxEXPAND
    +              2
    +            
    +            
    +              
    +                
    +                
    +              
    +              
    +              wxALL|wxEXPAND
    +              2
    +            
    +            
    +              
    +                0
    +              
    +              
    +              wxEXPAND
    +            
    +          
    +          
    +          wxLEFT|wxRIGHT|wxEXPAND
    +          5
    +        
    +        
    +          
    +          
    +          wxEXPAND
    +        
    +      
    +    
    +  
    +
    \ No newline at end of file
    Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/sampledata/goog.npy and /tmp/GJbvHcIw6l/matplotlib-1.0.1/sampledata/goog.npy differ
    Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/sampledata/INTC.dat and /tmp/GJbvHcIw6l/matplotlib-1.0.1/sampledata/INTC.dat differ
    Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/sampledata/lena.jpg and /tmp/GJbvHcIw6l/matplotlib-1.0.1/sampledata/lena.jpg differ
    Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/sampledata/lena.png and /tmp/GJbvHcIw6l/matplotlib-1.0.1/sampledata/lena.png differ
    Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/sampledata/logo2.png and /tmp/GJbvHcIw6l/matplotlib-1.0.1/sampledata/logo2.png differ
    diff -Nru matplotlib-0.99.3/sampledata/MANIFEST.in matplotlib-1.0.1/sampledata/MANIFEST.in
    --- matplotlib-0.99.3/sampledata/MANIFEST.in	1970-01-01 00:00:00.000000000 +0000
    +++ matplotlib-1.0.1/sampledata/MANIFEST.in	2011-01-02 22:44:34.000000000 +0000
    @@ -0,0 +1,5 @@
    +include *.png *.jpg *.csv *.dat *.npy *.xrc *.ima
    +include setup.py MANIFEST.in MANIFEST
    +recursive-include axes_grid *
    +recursive-include testdir *
    +
    diff -Nru matplotlib-0.99.3/sampledata/membrane.dat matplotlib-1.0.1/sampledata/membrane.dat
    --- matplotlib-0.99.3/sampledata/membrane.dat	1970-01-01 00:00:00.000000000 +0000
    +++ matplotlib-1.0.1/sampledata/membrane.dat	2009-09-06 12:32:28.000000000 +0000
    @@ -0,0 +1,64 @@
    +°ú*¿°ú*¿ºš+¿°ú*¿°ú*¿Ä:,¿Ä:,¿Ä:,¿°ú*¿ºš+¿ºš+¿°ú*¿ºš+¿°ú*¿¦Z*¿°ú*¿°ú*¿¦Z*¿¦Z*¿°ú*¿Ä:,¿Ä:,¿œº)¿¦Z*¿¦Z*¿°ú*¿°ú*¿°ú*¿ºš+¿Ä:,¿Ä:,¿°ú*¿ºš+¿°ú*¿ºš+¿ºš+¿ºš+¿ºš+¿ºš+¿ºš+¿°ú*¿°ú*¿ºš+¿ºš+¿ºš+¿°ú*¿°ú*¿ºš+¿¦Z*¿°ú*¿°ú*¿ºš+¿ºš+¿°ú*¿ºš+¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿¦Z*¿¦Z*¿°ú*¿ºš+¿¦Z*¿ºš+¿ºš+¿¦Z*¿°ú*¿°ú*¿ºš+¿ºš+¿ºš+¿ºš+¿Ä:,¿Ä:,¿ºš+¿ºš+¿ºš+¿¦Z*¿œº)¿ºš+¿°ú*¿°ú*¿Ä:,¿ºš+¿ºš+¿¦Z*¿Ä:,¿Ä:,¿¦Z*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿Ä:,¿ºš+¿°ú*¿°ú*¿°ú*¿ºš+¿ºš+¿ºš+¿°ú*¿°ú*¿ºš+¿Ä:,¿Ä:,¿°ú*¿ºš+¿ºš+¿ºš+¿°ú*¿°ú*¿ºš+¿°ú*¿°ú*¿ºš+¿ºš+¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿¦Z*¿¦Z*¿ºš+¿ºš+¿ºš+¿ºš+¿ºš+¿¦Z*¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿Ä:,¿°ú*¿°ú*¿Ä:,¿ÎÚ,¿ÎÚ,¿ºš+¿Ä:,¿Ä:,¿ºš+¿°ú*¿Ä:,¿ºš+¿ºš+¿ºš+¿¦Z*¿¦Z*¿°ú*¿ºš+¿ºš+¿¦Z*¿°ú*¿°ú*¿¦Z*¿¦Z*¿¦Z*¿°ú*¿ºš+¿¦Z*¿¦Z*¿¦Z*¿ºš+¿ºš+¿ºš+¿Ä:,¿°ú*¿°ú*¿ºš+¿°ú*¿ºš+¿ºš+¿ºš+¿œº)¿°ú*¿°ú*¿Ä:,¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿¦Z*¿¦Z*¿¦Z*¿¦Z*¿°ú*¿°ú*¿¦Z*¿¦Z*¿ºš+¿ºš+¿ºš+¿ºš+¿ºš+¿ºš+¿¦Z*¿°ú*¿°ú*¿Ä:,¿°ú*¿Ä:,¿Ä:,¿ÎÚ,¿°ú*¿¦Z*¿¦Z*¿¦Z*¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿œº)¿œº)¿ºš+¿ºš+¿°ú*¿°ú*¿ºš+¿°ú*¿°ú*¿¦Z*¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿°ú*¿ºš+¿ºš+¿ºš+¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿ºš+¿ºš+¿œº)¿¦Z*¿¦Z*¿Ä:,¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿¦Z*¿¦Z*¿°ú*¿¦Z*¿¦Z*¿ºš+¿ºš+¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿ÎÚ,¿ÎÚ,¿ºš+¿°ú*¿°ú*¿Ä:,¿°ú*¿ºš+¿ºš+¿ºš+¿¦Z*¿¦Z*¿¦Z*¿°ú*¿°ú*¿°ú*¿ºš+¿°ú*¿°ú*¿°ú*¿¦Z*¿¦Z*¿¦Z*¿ºš+¿°ú*¿¦Z*¿¦Z*¿ºš+¿ºš+¿ºš+¿ºš+¿Ä:,¿Ä:,¿ºš+¿ºš+¿ºš+¿ºš+¿Ä:,¿Ä:,¿ºš+¿¦Z*¿ºš+¿ºš+¿ºš+¿œº)¿°ú*¿°ú*¿°ú*¿œº)¿œº)¿ÎÚ,¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿¦Z*¿¦Z*¿°ú*¿Ä:,¿Ä:,¿ºš+¿ºš+¿ºš+¿Ä:,¿ºš+¿°ú*¿°ú*¿°ú*¿ÎÚ,¿ºš+¿ºš+¿ºš+¿ºš+¿ºš+¿¦Z*¿°ú*¿°ú*¿ºš+¿¦Z*¿¦Z*¿°ú*¿°ú*¿°ú*¿¦Z*¿°ú*¿œº)¿¦Z*¿¦Z*¿¦Z*¿¦Z*¿¦Z*¿Ä:,¿°ú*¿°ú*¿ºš+¿ºš+¿ºš+¿°ú*¿ºš+¿ºš+¿°ú*¿°ú*¿Ä:,¿°ú*¿°ú*¿ÎÚ,¿°ú*¿°ú*¿ºš+¿°ú*¿°ú*¿¦Z*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿ºš+¿°ú*¿ºš+¿¦Z*¿ºš+¿Ä:,¿ºš+¿ºš+¿°ú*¿ºš+¿ºš+¿Ä:,¿°ú*¿°ú*¿ºš+¿ºš+¿ºš+¿ºš+¿°ú*¿°ú*¿Ä:,¿œº)¿¦Z*¿°ú*¿ºš+¿¦Z*¿¦Z*¿¦Z*¿¦Z*¿°ú*¿°ú*¿¦Z*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿Ä:,¿Ä:,¿°ú*¿ºš+¿Ä:,¿°ú*¿°ú*¿°ú*¿¦Z*¿¦Z*¿°ú*¿°ú*¿°ú*¿ºš+¿ºš+¿ºš+¿ºš+¿¦Z*¿°ú*¿°ú*¿°ú*¿¦Z*¿°ú*¿°ú*¿¦Z*¿¦Z*¿¦Z*¿ºš+¿Ä:,¿Ä:,¿¦Z*¿¦Z*¿¦Z*¿¦Z*¿¦Z*¿ºš+¿°ú*¿°ú*¿ºš+¿ºš+¿ºš+¿Ä:,¿ºš+¿ºš+¿ºš+¿ºš+¿Ä:,¿ºš+¿°ú*¿ºš+¿Ä:,¿Ä:,¿¦Z*¿¦Z*¿¦Z*¿°ú*¿°ú*¿°ú*¿ºš+¿°ú*¿°ú*¿¦Z*¿¦Z*¿¦Z*¿ºš+¿ºš+¿ºš+¿°ú*¿ºš+¿ºš+¿¦Z*¿¦Z*¿ºš+¿ºš+¿ºš+¿ºš+¿Ä:,¿Ä:,¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿Ä:,¿°ú*¿°ú*¿°ú*¿¦Z*¿°ú*¿¦Z*¿¦Z*¿°ú*¿œº)¿œº)¿°ú*¿ºš+¿ºš+¿ºš+¿ºš+¿ºš+¿°ú*¿ºš+¿°ú*¿°ú*¿°ú*¿°ú*¿ºš+¿ºš+¿ºš+¿ºš+¿ºš+¿¦Z*¿ºš+¿ºš+¿°ú*¿°ú*¿¦Z*¿ºš+¿ºš+¿¦Z*¿°ú*¿°ú*¿°ú*¿œº)¿œº)¿°ú*¿¦Z*¿¦Z*¿°ú*¿¦Z*¿¦Z*¿ºš+¿ºš+¿¦Z*¿°ú*¿°ú*¿Ä:,¿°ú*¿°ú*¿°ú*¿Ä:,¿Ä:,¿°ú*¿°ú*¿°ú*¿¦Z*¿Ä:,¿ºš+¿°ú*¿Ä:,¿°ú*¿¦Z*¿¦Z*¿ºš+¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿°ú*¿œº)¿œº)¿ºš+¿¦Z*¿¦Z*¿°ú*¿ºš+¿ºš+¿¦Z*¿°ú*¿°ú*¿ºš+¿ºš+¿ºš+¿ºš+¿ºš+¿°ú*¿ºš+¿ºš+¿¦Z*¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿ºš+¿¦Z*¿œº)¿°ú*¿ºš+¿¦Z*¿¦Z*¿¦Z*¿ºš+¿°ú*¿°ú*¿ºš+¿°ú*¿°ú*¿°ú*¿ºš+¿ºš+¿°ú*¿Ä:,¿Ä:,¿°ú*¿¦Z*¿°ú*¿ºš+¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿¦Z*¿°ú*¿°ú*¿ºš+¿°ú*¿°ú*¿Ä:,¿°ú*¿¦Z*¿¦Z*¿¦Z*¿¦Z*¿œº)¿œº)¿°ú*¿ºš+¿ºš+¿°ú*¿ºš+¿ºš+¿œº)¿°ú*¿°ú*¿ºš+¿ºš+¿ºš+¿°ú*¿¦Z*¿¦Z*¿ºš+¿ºš+¿¦Z*¿ºš+¿ºš+¿°ú*¿œº)¿œº)¿ºš+¿°ú*¿°ú*¿¦Z*¿¦Z*¿¦Z*¿¦Z*¿°ú*¿°ú*¿¦Z*¿¦Z*¿¦Z*¿ºš+¿°ú*¿Ä:,¿¦Z*¿°ú*¿°ú*¿Ä:,¿Ä:,¿¦Z*¿°ú*¿°ú*¿ºš+¿¦Z*¿¦Z*¿ºš+¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿¦Z*¿°ú*¿°ú*¿¦Z*¿°ú*¿ºš+¿¦Z*¿¦Z*¿œº)¿ºš+¿ºš+¿¦Z*¿¦Z*¿¦Z*¿ºš+¿°ú*¿°ú*¿ºš+¿ºš+¿ºš+¿ºš+¿ºš+¿ºš+¿Ä:,¿ºš+¿ºš+¿¦Z*¿¦Z*¿°ú*¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿œº)¿°ú*¿°ú*¿°ú*¿¦Z*¿¦Z*¿°ú*¿°ú*¿°ú*¿ºš+¿°ú*¿°ú*¿°ú*¿¦Z*¿ºš+¿°ú*¿°ú*¿°ú*¿¦Z*¿¦Z*¿Ä:,¿Ä:,¿¦Z*¿°ú*¿Ä:,¿ºš+¿ºš+¿ºš+¿Ä:,¿Ä:,¿Ä:,¿¦Z*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿¦Z*¿¦Z*¿¦Z*¿°ú*¿¦Z*¿¦Z*¿Ä:,¿Ä:,¿œº)¿¦Z*¿¦Z*¿Ä:,¿¦Z*¿¦Z*¿ºš+¿ºš+¿ºš+¿°ú*¿ºš+¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿ºš+¿ºš+¿°ú*¿°ú*¿¦Z*¿ºš+¿ºš+¿¦Z*¿¦Z*¿¦Z*¿ºš+¿¦Z*¿¦Z*¿°ú*¿Ä:,¿Ä:,¿°ú*¿°ú*¿°ú*¿ºš+¿ºš+¿ºš+¿¦Z*¿¦Z*¿ºš+¿ºš+¿ºš+¿°ú*¿ºš+¿ºš+¿°ú*¿¦Z*¿¦Z*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿¦Z*¿°ú*¿¦Z*¿¦Z*¿°ú*¿¦Z*¿¦Z*¿¦Z*¿¦Z*¿°ú*¿°ú*¿ºš+¿°ú*¿°ú*¿°ú*¿ºš+¿ºš+¿œº)¿°ú*¿°ú*¿Ä:,¿°ú*¿°ú*¿ºš+¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿ºš+¿ºš+¿°ú*¿¦Z*¿¦Z*¿°ú*¿¦Z*¿’)¿¦Z*¿Ä:,¿¦Z*¿œº)¿œº)¿°ú*¿ºš+¿ºš+¿°ú*¿ºš+¿ºš+¿ºš+¿°ú*¿°ú*¿¦Z*¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿œº)¿œº)¿œº)¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿¦Z*¿¦Z*¿°ú*¿¦Z*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿°ú*¿¦Z*¿ºš+¿ºš+¿œº)¿°ú*¿°ú*¿ºš+¿¦Z*¿°ú*¿°ú*¿°ú*¿Ä:,¿°ú*¿°ú*¿°ú*¿ºš+¿ºš+¿°ú*¿œº)¿œº)¿ºš+¿ºš+¿ºš+¿¦Z*¿Ä:,¿°ú*¿œº)¿œº)¿°ú*¿ºš+¿ºš+¿¦Z*¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿¦Z*¿Ä:,¿Ä:,¿°ú*¿¦Z*¿°ú*¿Ä:,¿Ä:,¿ºš+¿°ú*¿°ú*¿¦Z*¿’)¿’)¿ºš+¿°ú*¿¦Z*¿ºš+¿ºš+¿°ú*¿°ú*¿°ú*¿¦Z*¿¦Z*¿¦Z*¿°ú*¿œº)¿œº)¿Ä:,¿°ú*¿°ú*¿ºš+¿ºš+¿ºš+¿`ú%¿VZ%¿8z#¿$:"¿ü¹¿ÞÙ¿Àù¿Àù¿z™¿\¹¿\¹¿*™¿¿¿Ðø¿²¿²¿”8	¿vX¿vX¿:˜¿&X¿¿Ó/ý¾¿ïû¾«¯ú¾[¯õ¾[¯õ¾¯ð¾÷nï¾÷nモ.é¾C.ä¾C.ä¾ßíݾ˭ܾ˭ܾgmÖ¾+­Ò¾mѾmѾïìξwlǾwlǾwlǾ'l¾,Á¾,Á¾ë«¾¾ÿ뿾ÿ뿾×k½¾×k½¾×k½¾ë«¾¾ë«¾¾ë«¾¾ë«¾¾,Á¾,Á¾,Á¾'l¾c,ƾwlǾwlǾwlǾŸìɾŸìɾ³,˾Çl̾Çl̾mѾ-о-о+­Ò¾?íÓ¾?íÓ¾S-Õ¾gmÖ¾gmÖ¾{­×¾{­×¾{­×¾íؾ£-ھ˭ܾ·mÛ¾·mÛ¾ßíݾßíݾßíݾ˭ܾó-ß¾ó-ß¾nà¾ó-ß¾ßíݾnྮá¾/î⾮ᾮᾮá¾Wnå¾Wnå¾/îâ¾/îâ¾/îâ¾C.ä¾/îâ¾/îâ¾®á¾/îâ¾/îâ¾®á¾C.ä¾C.ä¾®á¾ó-ß¾nà¾nà¾nà¾/îâ¾nà¾nà¾ó-ß¾®á¾®á¾nà¾nà¾nà¾nà¾Ë­Ü¾Ë­Ü¾ßíݾnà¾Ë­Ü¾Ë­Ü¾ßíݾßíݾ£-Ú¾£-Ú¾£-Ú¾{­×¾{­×¾íؾS-Õ¾S-Õ¾gmÖ¾íؾíؾ+­Ò¾+­Ò¾+­Ò¾+­Ò¾mѾmѾïìξ-о۬;۬;۬;-оÇl̾Çl̾Çl̾³,˾³,˾Ÿìɾ³,˾³,˾ŸìɾŸìɾŸìɾ‹¬È¾‹¬È¾‹¬È¾c,ƾc,ƾwlǾwlǾwlǾOìľOìľOìľc,ƾOìľOìľOìľOìľOìľOìľwlǾOìľwlǾŸìɾwlǾwlǾwlǾ³,˾ŸìɾŸìɾ³,˾³,˾³,˾ŸìɾÇl̾Çl̾ŸìɾŸìɾÇl̾³,˾³,˾۬;۬;۬;۬;-о-оmѾ-о-о+­Ò¾-о-о+­Ò¾S-Õ¾S-Õ¾S-Õ¾gmÖ¾gmÖ¾gmÖ¾S-Õ¾{­×¾íؾíؾ{­×¾{­×¾{­×¾{­×¾Ë­Ü¾Ë­Ü¾·mÛ¾·mÛ¾·mÛ¾£-Ú¾íؾíؾ·mÛ¾·mÛ¾íؾ·mÛ¾·mÛ¾·mÛ¾£-Ú¾·m۾˭ܾ·mÛ¾·mÛ¾·mÛ¾·mÛ¾·m۾˭ܾ˭ܾ˭ܾ£-Ú¾·mÛ¾·mÛ¾£-Ú¾íؾ£-ھ˭ܾíؾíؾíؾíؾgmÖ¾gmÖ¾gmÖ¾gmÖ¾gmÖ¾gmÖ¾gmÖ¾?íÓ¾?íÓ¾?íÓ¾mѾmѾïìξmѾmѾ۬;۬;۬;-оÇl̾Çl̾³,˾³,˾wlǾŸìɾŸìɾc,ƾwlǾwlǾc,ƾ'l¾'l¾;¬Ã¾,Á¾ÿ뿾,Á¾,Á¾×k½¾×k½¾×k½¾×k½¾×k½¾×k½¾¯ëº¾¯ëº¾¯ëº¾‡k¸¾‡k¸¾s+·¾_ëµ¾_ëµ¾_ëµ¾›«¹¾›«¹¾s+·¾_ëµ¾_ëµ¾#+²¾_ëµ¾_ëµ¾7k³¾7k³¾7k³¾‡k¸¾K«´¾K«´¾s+·¾_ëµ¾s+·¾7k³¾7k³¾_ëµ¾‡k¸¾‡k¸¾‡k¸¾¯ëº¾¯ëº¾×k½¾¯ëº¾¯ëº¾×k½¾ë«¾¾ë«¾¾ë«¾¾,Á¾;¬Ã¾wlǾwlǾc,ƾwlǾwlǾ‹¬È¾‹¬È¾‹¬È¾³,˾Çl̾Çl̾Çl̾³,˾³,˾-о-оïìξ-о-о+­Ò¾-о-о?íÓ¾?íÓ¾?íÓ¾S-Õ¾S-Õ¾S-Õ¾S-Õ¾gmÖ¾gmÖ¾gmÖ¾íؾíؾ{­×¾{­×¾£-Ú¾íؾíؾíؾ£-Ú¾£-Ú¾£-Ú¾{­×¾{­×¾£-Ú¾£-Ú¾£-Ú¾£-Ú¾{­×¾{­×¾gmÖ¾íؾ{­×¾gmÖ¾gmÖ¾gmÖ¾gmÖ¾gmÖ¾?íÓ¾?íÓ¾?íÓ¾+­Ò¾+­Ò¾mѾïìξïìξ-о+­Ò¾+­Ò¾Û¬Í¾ïìξïìξÇl̾ŸìɾŸìɾ‹¬È¾³,˾³,˾wlǾOìľOìľc,ƾ'l¾'l¾ÿ뿾ÿ뿾ÿ뿾Ã+¼¾Ã+¼¾×k½¾×k½¾×k½¾›«¹¾s+·¾s+·¾7k³¾#+²¾#+²¾7k³¾7k³¾7k³¾çj®¾çj®¾çj®¾Ó*­¾¿ê«¾¿ê«¾—j©¾«ªª¾[ª¥¾[ª¥¾Gj¤¾[ª¥¾꡾꡾÷iŸ¾Ï霾Ï霾é—¾Wi•¾Wi•¾gh†¾ÕM]¾ÕM]¾9Žã½i‹¶½i‹¶½É¾]ÍU¾]ÍU¾Ó*­¾c,ƾ£-Ú¾k®æ¾3/ó¾Ó/ý¾¸¿¸¿b¿vX¿vX¿Š˜¿”8	¿”8	¿²¿¨x
    +¿¨x
    +¿¨x
    +¿Š˜¿¨x
    +¿žØ	¿”8	¿Š˜¿¨x
    +¿¨x
    +¿€ø¿Š˜¿Š˜¿€ø¿l¸¿l¸¿vX¿l¸¿l¸¿NØ¿b¿b¿Xx¿Xx¿NØ¿:˜¿:˜¿:˜¿&X¿&X¿¸¿&X¿&X¿û¯ÿ¾x¿x¿çoþ¾Ó/ý¾Ó/ý¾¿ïû¾«¯ú¾«¯ú¾—où¾ƒ/ø¾ƒ/ø¾oïö¾[¯õ¾3/ó¾¯ð¾¯ð¾¯ð¾÷nï¾÷nᆵð¾¯ð¾¯ð¾»®ë¾Ïîì¾Ïîì¾î羓.龓.龓.é¾C.ä¾C.ä¾k®æ¾nà¾nà¾ßíݾßíݾ·mÛ¾£-Ú¾£-Ú¾íؾgmÖ¾gmÖ¾S-Õ¾+­Ò¾+­Ò¾-оmѾïìξ³,˾ŸìɾŸìɾŸìɾc,ƾc,ƾc,ƾc,ƾ'l¾,Á¾,Á¾ÿ뿾×k½¾×k½¾¯ëº¾›«¹¾›«¹¾›«¹¾K«´¾7k³¾7k³¾7k³¾ûª¯¾Ó*­¾Ó*­¾¿ê«¾«ªª¾«ªª¾ƒ*¨¾[ª¥¾[ª¥¾3*£¾꡾꡾Ï霾»©›¾§iš¾k©–¾Wi•¾/é’¾ó(¾ó(¾ýÍ_¾É¾É¾‰‰˜½ÉŠ¬½ÉŠ¬½mÌF¾gh†¾ƒ*¨¾;¬Ã¾;¬Ã¾Wnå¾ã.î¾ã.î¾Ó/ý¾¿¿NØ¿NØ¿NØ¿vX¿vX¿vX¿b¿€ø¿€ø¿b¿l¸¿l¸¿l¸¿l¸¿b¿l¸¿l¸¿NØ¿NØ¿NØ¿D8¿D8¿D8¿:˜¿¿¿:˜¿¸¿¸¿x¿&X¿û¯ÿ¾Ó/ý¾û¯ÿ¾çoþ¾û¯ÿ¾û¯ÿ¾¿ïû¾¿ïû¾¿ïû¾«¯ú¾oïö¾oïö¾Goô¾oïö¾oïö¾[¯õ¾Goô¾Goô¾Goô¾ïñ¾ã.î¾ã.î¾ã.nê¾»®ë¾»®ë¾»®ë¾îç¾îç¾k®æ¾k®æ¾k®æ¾®á¾®á¾®á¾ó-ß¾nà¾Ë­Ü¾·mÛ¾·mÛ¾£-Ú¾£-Ú¾£-Ú¾?íÓ¾S-Õ¾S-Õ¾mѾmѾmѾïìξïìξïìξÇl̾³,˾ŸìɾwlǾwlǾ;¬Ã¾c,ƾc,ƾ,Á¾ë«¾¾ë«¾¾ë«¾¾Ã+¼¾Ã+¼¾‡k¸¾‡k¸¾‡k¸¾7k³¾7k³¾#+²¾#+²¾#+²¾çj®¾Ó*­¾Ó*­¾—j©¾ƒ*¨¾ƒ*¨¾3*£¾[ª¥¾ª ¾÷iŸ¾÷iŸ¾»©›¾»©›¾»©›¾C)”¾©‘¾©‘¾{¨‡¾ÝÏ}¾ÝÏ}¾
    +Ⱦ)Š¢½)Š¢½)Š¢½…H¾…H¾ßè¾Ó*­¾;¬Ã¾S-Õ¾S-Õ¾÷nï¾[¯õ¾[¯õ¾û¯ÿ¾¸¿¸¿:˜¿D8¿D8¿0ø¿NØ¿NØ¿NØ¿:˜¿:˜¿D8¿:˜¿:˜¿0ø¿0ø¿&X¿&X¿¿¸¿x¿x¿¸¿û¯ÿ¾û¯ÿ¾çoþ¾û¯ÿ¾û¯ÿ¾Ó/ý¾¿ïû¾¿ïû¾«¯ú¾ƒ/ø¾ƒ/ø¾—où¾[¯õ¾[¯õ¾oïö¾Goô¾Goô¾Goô¾Goô¾ïñ¾3/ó¾3/ó¾¯ð¾¯ð¾¯ð¾ã.î¾Ïîì¾Ïî쾧n꾧n꾧nê¾îç¾k®æ¾k®æ¾C.ä¾C.ä¾C.ä¾®á¾nà¾ó-߾˭ܾ˭ܾ·mÛ¾£-Ú¾£-Ú¾£-Ú¾gmÖ¾gmÖ¾{­×¾gmÖ¾gmÖ¾+­Ò¾?íÓ¾mѾïìξïìξ۬;³,˾³,˾‹¬È¾ŸìɾŸìɾwlǾc,ƾc,ƾ,Á¾ÿ뿾ÿ뿾Ã+¼¾›«¹¾›«¹¾¯ëº¾s+·¾_ëµ¾_ëµ¾_ëµ¾#+²¾ë°¾ë°¾çj®¾—j©¾—j©¾«ªª¾«ªª¾«ªª¾[ª¥¾ª ¾ª ¾Ï霾Ï霾Ï霾闾闾©‘¾/é’¾/é’¾+¨‚¾ÅNl¾ÅNl¾	ŒÀ½q
    +W½q
    +W½‰‰˜½­È
    +¾­È
    +¾Wi•¾7k³¾7k³¾Ë­Ü¾k®æ¾÷nï¾Goô¾¿ïû¾çoþ¾û¯ÿ¾û¯ÿ¾¸¿&X¿&X¿¸¿&X¿&X¿¸¿¸¿¸¿¿¸¿¸¿x¿x¿x¿çoþ¾Ó/ý¾¿ïû¾¿ïû¾¿ïû¾«¯ú¾—où¾—où¾«¯ú¾«¯ú¾«¯ú¾[¯õ¾oïö¾oïö¾ïñ¾Goô¾Goô¾3/ó¾3/ó¾3/ó¾ïñ¾÷nᆵð¾÷nï¾Ïîì¾Ïîì¾ã.î¾ã.n꾓.龓.龧nê¾k®æ¾k®æ¾k®æ¾Wnå¾Wnå¾nà¾C.ä¾/îâ¾nà¾nà¾ó-ß¾ó-ß¾ó-߾˭ܾ·mÛ¾·mÛ¾íؾíؾíؾS-Õ¾gmÖ¾gmÖ¾S-Õ¾-о-о-оmѾmѾ³,˾۬;³,˾³,˾ŸìɾŸìɾc,ƾc,ƾOìľ'l¾'l¾×k½¾,Á¾,Á¾›«¹¾¯ëº¾¯ëº¾‡k¸¾K«´¾K«´¾7k³¾ë°¾ûª¯¾çj®¾çj®¾«ªª¾«ªª¾«ªª¾oꦾ[ª¥¾[ª¥¾꡾ã)ž¾ã)ž¾Ï霾»©›¾»©›¾©‘¾ó(¾Ë¨Œ¾?胾=Ïs¾…MX¾ýȾýȾ	½	½	½É¾Oq¾Oq¾‡k¸¾Çl̾Çl̾k®æ¾÷nï¾÷nᆱ¯ú¾û¯ÿ¾Ó/ý¾û¯ÿ¾û¯ÿ¾x¿çoþ¾çoþ¾û¯ÿ¾û¯ÿ¾û¯ÿ¾çoþ¾çoþ¾çoþ¾çoþ¾Ó/ý¾¿ïû¾ƒ/ø¾ƒ/ø¾«¯ú¾oïö¾oïö¾[¯õ¾oïö¾oïö¾3/ó¾3/ó¾3/ó¾3/ó¾¯ð¾¯ð¾÷nᆵð¾ã.î¾÷nï¾÷nï¾»®ë¾Ïîì¾Ïî쾧n꾓.龓.龓.é¾îç¾î羓.龓.龓.é¾C.ä¾C.ä¾Wn微ᾮᾮá¾ó-ß¾ó-ß¾ßíݾó-ß¾ó-ß¾ßíݾ˭ܾ˭ܾ˭ܾ£-Ú¾£-Ú¾£-Ú¾{­×¾{­×¾{­×¾gmÖ¾+­Ò¾+­Ò¾+­Ò¾?íÓ¾mѾmѾmѾïìξïìξ³,˾Çl̾Çl̾ŸìɾwlǾwlǾOìľ;¬Ã¾'l¾;¬Ã¾,Á¾ë«¾¾ë«¾¾ë«¾¾¯ëº¾¯ëº¾¯ëº¾‡k¸¾7k³¾7k³¾_ëµ¾#+²¾#+²¾ë°¾ûª¯¾¿ê«¾¿ê«¾¿ê«¾ƒ*¨¾Gj¤¾Gj¤¾[ª¥¾÷iŸ¾÷iŸ¾Ï霾»©›¾»©›¾C)”¾i¾i¾S(…¾h¾íÎn¾ELD¾)ò½a½¡
    +ª¼¡
    +ª¼¹‹»½-Ë2¾-Ë2¾oꦾÿ뿾+­Ò¾nྒྷ.é¾ïñ¾Goô¾Goô¾ƒ/ø¾¿ïû¾¿ïû¾çoþ¾Ó/ý¾Ó/ý¾çoþ¾çoþ¾çoþ¾¿ïû¾Ó/ý¾¿ïû¾—où¾—où¾oïö¾oïö¾oïö¾Goô¾3/ó¾3/ó¾¯ð¾[¯õ¾ïñ¾ã.î¾ã.î¾÷nᆵð¾¯ð¾»®ë¾Ïîì¾Ïî쾓.龧n꾧n꾧nê¾îç¾îç¾k®æ¾k®æ¾Wnå¾k®æ¾k®æ¾®á¾®á¾®á¾/îâ¾ßíݾßíݾnà¾ßíݾßíݾßíݾßíݾ˭ܾ·mÛ¾·mÛ¾·mÛ¾£-Ú¾£-Ú¾{­×¾íؾíؾ{­×¾gmÖ¾gmÖ¾?íÓ¾?íÓ¾?íÓ¾mѾ-о-оmѾ-о۬;ïìξïìξ۬;³,˾³,˾wlǾ‹¬È¾‹¬È¾c,ƾc,ƾc,ƾ;¬Ã¾;¬Ã¾;¬Ã¾ÿ뿾ÿ뿾×k½¾Ã+¼¾Ã+¼¾›«¹¾¯ëº¾¯ëº¾_ëµ¾s+·¾s+·¾#+²¾ë°¾ë°¾ë°¾ûª¯¾Ó*­¾«ªª¾«ªª¾oꦾƒ*¨¾ƒ*¨¾÷iŸ¾÷iŸ¾÷iŸ¾“)™¾é—¾é—¾C)”¾ó(¾ó(¾gh†¾ÝÏ}¾ÝÏ}¾ÍË<¾éÞ½‘9½a	–¼q½‹±½K0¾K0¾oꦾÿ뿾ÿ뿾ßíݾk®æ¾k®æ¾¯ð¾[¯õ¾[¯õ¾«¯ú¾—où¾—où¾¿ïû¾—où¾«¯ú¾—où¾—où¾[¯õ¾[¯õ¾[¯õ¾oïö¾Goô¾Goô¾Goô¾ïñ¾ïñ¾÷nᆵð¾¯ð¾ã.î¾Ïîì¾Ïîì¾»®ë¾»®ë¾»®ë¾§nê¾îç¾îç¾k®æ¾k®æ¾Wnå¾Wnå¾Wnå¾Wnå¾/îâ¾/îâ¾C.侮ᾮá¾nà¾nà¾nྷm۾˭ܾ˭ܾ˭ܾ˭ܾ˭ܾ£-Ú¾·mÛ¾£-Ú¾gmÖ¾íؾ{­×¾{­×¾{­×¾{­×¾gmÖ¾gmÖ¾S-Õ¾+­Ò¾+­Ò¾+­Ò¾?íÓ¾?íÓ¾ïìξïìξïìξïìξïìξ۬;۬;۬;³,˾³,˾³,˾wlǾwlǾwlǾwlǾOìľOìľ'l¾Oìľÿ뿾,Á¾,Á¾×k½¾ÿ뿾ÿ뿾×k½¾›«¹¾›«¹¾‡k¸¾›«¹¾›«¹¾K«´¾7k³¾7k³¾7k³¾ë°¾ë°¾çj®¾¿ê«¾¿ê«¾—j©¾3*£¾Gj¤¾[ª¥¾[ª¥¾÷iŸ¾ã)ž¾ã)ž¾§iš¾C)”¾C)”¾©‘¾ßè¾ßè¾ÝÏ}¾eOv¾eOv¾%I¾Ù‰½Ù‰½!‚¼±k½5H¾­ÍZ¾/é’¾7k³¾ŸìɾŸìɾ®á¾“.龓.é¾Goô¾[¯õ¾[¯õ¾—où¾—où¾—où¾—où¾ƒ/ø¾ƒ/ø¾ƒ/ø¾Goô¾Goô¾Goô¾Goô¾3/ó¾ïñ¾ïñ¾ïñ¾ïñ¾ïñ¾÷nï¾÷nï¾÷nï¾»®ë¾“.龓.龓.龓.龓.é¾îç¾Wnå¾Wnå¾C.ä¾Wnå¾/îâ¾/îâ¾/îâ¾nà¾ó-ß¾ó-ß¾ó-ß¾ßíݾßíݾ˭ܾ˭ܾ˭ܾ£-Ú¾£-Ú¾£-Ú¾£-Ú¾£-Ú¾íؾ{­×¾{­×¾íؾ{­×¾{­×¾?íÓ¾gmÖ¾S-Õ¾?íÓ¾?íÓ¾mѾS-Õ¾S-Õ¾mѾmѾmѾïìξ۬;۬;Çl̾Çl̾Çl̾Çl̾ŸìɾŸìɾŸìɾŸìɾwlǾc,ƾc,ƾc,ƾOìľOìľ'l¾c,ƾc,ƾÿ뿾뫾¾ë«¾¾¯ëº¾¯ëº¾¯ëº¾Ã+¼¾¯ëº¾‡k¸¾›«¹¾›«¹¾‡k¸¾_ëµ¾_ëµ¾#+²¾ë°¾ë°¾Ó*­¾¿ê«¾¿ê«¾¿ê«¾—j©¾Gj¤¾Gj¤¾꡾3*£¾÷iŸ¾÷iŸ¾»©›¾§iš¾§iš¾C)”¾/é’¾/é’¾£(Š¾S(…¾S(…¾uNg¾õK?¾‰Žè½ÑM½ÑM½¡
    +ª¼ÉŠ¬½ÉŠ¬½eOv¾÷iŸ¾÷iŸ¾Çl̾íؾíؾ§nê¾ã.î¾ã.î¾Goô¾oïö¾[¯õ¾ƒ/ø¾ƒ/ø¾[¯õ¾Goô¾Goô¾oïö¾3/ó¾3/ó¾Goô¾3/ó¾ïñ¾¯ð¾¯ð¾ïñ¾»®ë¾»®ë¾§nê¾»®ë¾»®ë¾“.龓.龓.é¾îç¾Wnå¾Wnå¾C.ä¾nà¾C.ä¾®á¾ó-ß¾ó-ß¾®á¾®á¾·mÛ¾ßíݾßíݾ˭ܾíؾíؾ·mÛ¾·mÛ¾·mÛ¾£-Ú¾íؾíؾíؾgmÖ¾íؾS-Õ¾S-Õ¾gmÖ¾S-Õ¾S-Õ¾S-Õ¾gmÖ¾gmÖ¾-оmѾmѾ-о-о-оïìξ۬;۬;Çl̾Çl̾³,˾ŸìɾŸìɾŸìɾc,ƾc,ƾ‹¬È¾wlǾwlǾwlǾ‹¬È¾‹¬È¾;¬Ã¾;¬Ã¾Oìľ뫾¾'l¾'l¾,Á¾,Á¾ë«¾¾ë«¾¾ë«¾¾¯ëº¾¯ëº¾¯ëº¾‡k¸¾_ëµ¾_ëµ¾_ëµ¾#+²¾#+²¾#+²¾ë°¾¿ê«¾¿ê«¾¿ê«¾¿ê«¾—j©¾—j©¾oꦾ[ª¥¾[ª¥¾꡾ª ¾ª ¾»©›¾“)™¾é—¾/é’¾©‘¾ßè¾èˆ¾èˆ¾eOv¾ýÍ_¾ýÍ_¾)Š¢½á¾¼á¾¼q½ùŒÏ½ÌA¾·h‹¾·h‹¾,Á¾mѾmѾC.侧n꾧nê¾ïñ¾3/ó¾3/ó¾ƒ/ø¾[¯õ¾[¯õ¾ƒ/ø¾oïö¾3/ó¾3/ó¾3/ó¾[¯õ¾ïñ¾ïñ¾÷nᆵð¾¯ð¾Ïîì¾»®ë¾»®ë¾§n꾧n꾧nê¾îç¾k®æ¾“.é¾/îâ¾/îâ¾/îâ¾Wnå¾Wnå¾ó-ß¾®á¾®á¾®á¾ßíݾßíݾßíݾßíݾ·mÛ¾ßíݾ£-Ú¾íؾ£-Ú¾£-Ú¾íؾíؾíؾ{­×¾{­×¾{­×¾{­×¾{­×¾{­×¾mѾmѾmѾ+­Ò¾-о-оmѾmѾïìξ۬;۬;Çl̾Çl̾Çl̾Çl̾ŸìɾŸìɾÇl̾‹¬È¾‹¬È¾‹¬È¾³,˾³,˾c,ƾwlǾ‹¬È¾Oìľ;¬Ã¾;¬Ã¾OìľOìľÿ뿾'l¾'l¾뫾¾ë«¾¾ë«¾¾×k½¾›«¹¾×k½¾¯ëº¾›«¹¾‡k¸¾‡k¸¾‡k¸¾#+²¾#+²¾#+²¾K«´¾ë°¾ë°¾ûª¯¾çj®¾çj®¾¿ê«¾—j©¾—j©¾ƒ*¨¾[ª¥¾꡾3*£¾ª ¾÷iŸ¾»©›¾»©›¾/é’¾Wi•¾Wi•¾{¨‡¾gh†¾gh†¾eOv¾…MX¾MɾɊ¬½	½Á¼¡ú¼¡ú¼¥K:¾èˆ¾èˆ¾,Á¾-о-оk®æ¾§n꾧nê¾ïñ¾Goô¾3/ó¾3/ó¾3/ó¾oïö¾oïö¾oïö¾[¯õ¾[¯õ¾[¯õ¾ïñ¾¯ð¾¯ð¾ã.î¾ã.î¾ã.î¾»®ë¾§n꾧n꾧nê¾Wnå¾k®æ¾k®æ¾k®æ¾C.ä¾C.ä¾C.ä¾Wnå¾C.ä¾C.ä¾/î⾮ᾮá¾ßíݾó-ß¾·mÛ¾ßíݾ˭ܾ·mÛ¾£-Ú¾£-Ú¾·mÛ¾·mÛ¾·mÛ¾S-Õ¾{­×¾{­×¾?íÓ¾gmÖ¾gmÖ¾S-Õ¾+­Ò¾+­Ò¾+­Ò¾+­Ò¾+­Ò¾-о-о-оïìξïìξ-о۬;۬;۬;۬;۬;Çl̾۬;Çl̾ŸìɾŸìɾŸìɾŸìɾŸìɾwlǾwlǾwlǾ;¬Ã¾;¬Ã¾;¬Ã¾;¬Ã¾;¬Ã¾;¬Ã¾,Á¾ÿ뿾ÿ뿾ÿ뿾×k½¾×k½¾Ã+¼¾Ã+¼¾›«¹¾›«¹¾›«¹¾¯ëº¾s+·¾s+·¾‡k¸¾_ëµ¾_ëµ¾7k³¾ë°¾ë°¾ë°¾ûª¯¾ûª¯¾¿ê«¾—j©¾—j©¾oꦾoꦾGj¤¾3*£¾3*£¾Ï霾»©›¾»©›¾»©›¾C)”¾C)”¾ó(¾Ë¨Œ¾Ë¨Œ¾+¨‚¾µO{¾µO{¾UK5¾™Ù½ñ
    +/½A4¼A4¼)Š¢½ÅI¾ÅI¾ã)ž¾›«¹¾›«¹¾{­×¾/îâ¾/îâ¾Ïîì¾÷nï¾÷nï¾ïñ¾3/ó¾Goô¾Goô¾Goô¾3/ó¾3/ó¾3/ó¾ïñ¾÷nï¾÷nï¾÷nï¾Ïîì¾Ïîì¾»®ë¾Ïîì¾Ïî쾧n꾧n꾧nê¾k®æ¾îç¾îç¾k®æ¾k®æ¾C.ä¾C.ä¾C.侮ᾮᾮá¾ó-ß¾ßíݾßíݾ˭ܾ·mÛ¾·mÛ¾·mÛ¾·mÛ¾·mÛ¾íؾíؾ£-Ú¾gmÖ¾gmÖ¾{­×¾{­×¾{­×¾S-Õ¾gmÖ¾gmÖ¾S-Õ¾?íÓ¾?íÓ¾+­Ò¾?íÓ¾?íÓ¾mѾ۬;۬;mѾ-оïìξ۬;ïìξÇl̾³,˾³,˾Ÿìɾ³,˾³,˾ŸìɾŸìɾŸìɾ‹¬È¾wlǾwlǾ;¬Ã¾OìľOìľ;¬Ã¾'l¾'l¾;¬Ã¾;¬Ã¾ÿ뿾,Á¾,Á¾×k½¾×k½¾×k½¾×k½¾Ã+¼¾Ã+¼¾›«¹¾s+·¾s+·¾s+·¾K«´¾7k³¾ë°¾#+²¾ûª¯¾¿ê«¾¿ê«¾Ó*­¾Ó*­¾Ó*­¾ƒ*¨¾oꦾoꦾGj¤¾÷iŸ¾÷iŸ¾ã)ž¾Ï霾Ï霾é—¾/é’¾/é’¾©‘¾£(Š¾S(…¾h¾Ïx¾ÕM]¾íɾíɾ±	½Á¼Á¼i‹¶½K0¾K0¾ª ¾Ã+¼¾Û¬Í¾£-Ú¾nà¾îç¾Ïîì¾ã.î¾Goô¾3/ó¾3/ó¾ïñ¾Goô¾Goô¾3/ó¾¯ð¾¯ð¾Goô¾ïñ¾ïñ¾¯ð¾ïñ¾ïñ¾»®ë¾Ïîì¾Ïîì¾»®ë¾§nê¾»®ë¾îç¾îç¾Wnå¾Wnå¾Wnå¾/îâ¾C.ä¾C.ä¾ó-ß¾nà¾nà¾ó-߾˭ܾ˭ܾßíݾßíݾßíݾ£-Ú¾£-Ú¾£-Ú¾íؾ£-Ú¾£-Ú¾gmÖ¾gmÖ¾{­×¾{­×¾{­×¾S-Õ¾S-Õ¾S-Õ¾+­Ò¾+­Ò¾+­Ò¾?íÓ¾-о-оmѾmѾmѾïìξ۬;۬;۬;Çl̾Çl̾³,˾Ÿìɾ³,˾‹¬È¾‹¬È¾³,˾‹¬È¾‹¬È¾wlǾwlǾwlǾ;¬Ã¾OìľOìľOìľOìľOìľ;¬Ã¾;¬Ã¾'l¾,Á¾,Á¾ë«¾¾×k½¾×k½¾¯ëº¾¯ëº¾¯ëº¾›«¹¾s+·¾s+·¾K«´¾K«´¾K«´¾#+²¾#+²¾ûª¯¾ûª¯¾ûª¯¾¿ê«¾çj®¾çj®¾—j©¾oꦾoꦾGj¤¾3*£¾3*£¾÷iŸ¾Ï霾Ï霾§iš¾é—¾/é’¾i¾ó(¾·h‹¾S(…¾S(…¾Îi¾•LI¾•LI¾Qu½a	–¼a	–¼‘9½)ò½)ò½ó(¾Ó*­¾Ó*­¾mѾ·mÛ¾C.ä¾»®ë¾Ïîì¾÷nï¾ïñ¾ïñ¾3/ó¾Goô¾Goô¾[¯õ¾3/ó¾3/ó¾3/ó¾¯ð¾¯ð¾ïñ¾ã.î¾ã.î¾»®ë¾»®ë¾»®ë¾»®ë¾“.龓.龓.龓.é¾Wnå¾Wnå¾Wnå¾/îâ¾nà¾nà¾/îâ¾nà¾nྮá¾ó-ß¾ó-ß¾ó-ß¾ßíݾ˭ܾ˭ܾ˭ܾ£-Ú¾£-Ú¾£-Ú¾£-Ú¾íؾíؾ{­×¾gmÖ¾gmÖ¾-оS-Õ¾S-Õ¾S-Õ¾mѾ+­Ò¾+­Ò¾-оmѾ-о-оïìξïìξïìξïìξÇl̾Çl̾ïìξÇl̾Çl̾Çl̾Çl̾³,˾ŸìɾŸìɾŸìɾ‹¬È¾‹¬È¾wlǾ‹¬È¾‹¬È¾;¬Ã¾OìľOìľ,Á¾'l¾'l¾ÿ뿾뫾¾ë«¾¾ÿ뿾¯ëº¾×k½¾Ã+¼¾Ã+¼¾‡k¸¾›«¹¾›«¹¾›«¹¾_ëµ¾_ëµ¾_ëµ¾K«´¾K«´¾ûª¯¾ë°¾ë°¾Ó*­¾Ó*­¾Ó*­¾oꦾ[ª¥¾oꦾGj¤¾3*£¾ª ¾ª ¾ª ¾“)™¾é—¾é—¾k©–¾i¾i¾Ë¨Œ¾S(…¾S(…¾eOv¾MÎd¾MÎd¾©ŒÊ½ñ
    +/½Á¼!‚¼Iˆ„½É¾ÅNl¾ÅNl¾K«´¾ŸìɾŸìɾó-ß¾k®æ¾k®æ¾ã.î¾÷nï¾÷nï¾Goô¾3/ó¾3/ó¾3/ó¾ïñ¾¯ð¾ïñ¾ïñ¾ïñ¾Ïîì¾Ïîì¾Ïîì¾»®ë¾»®ë¾»®ë¾Ïîì¾Ïî쾓.é¾îç¾îç¾k®æ¾k®æ¾k®æ¾Wnå¾C.ä¾/îâ¾C.ä¾®á¾nà¾nà¾nà¾nà¾ßíݾßíݾ˭ܾíؾ£-ھ˭ܾ˭ܾíؾ£-Ú¾£-Ú¾£-Ú¾{­×¾{­×¾{­×¾?íÓ¾?íÓ¾?íÓ¾gmÖ¾?íÓ¾+­Ò¾+­Ò¾S-Õ¾mѾmѾ+­Ò¾-о-о-оmѾmѾ۬;۬;۬;ïìξ³,˾³,˾³,˾³,˾ŸìɾŸìɾŸìɾwlǾŸìɾŸìɾc,ƾOìľOìľc,ƾ;¬Ã¾;¬Ã¾;¬Ã¾;¬Ã¾,Á¾ÿ뿾ÿ뿾,Á¾ë«¾¾ë«¾¾×k½¾Ã+¼¾Ã+¼¾›«¹¾¯ëº¾s+·¾_ëµ¾_ëµ¾K«´¾7k³¾7k³¾ë°¾ûª¯¾ûª¯¾Ó*­¾Ó*­¾Ó*­¾oꦾƒ*¨¾ƒ*¨¾oꦾ꡾÷iŸ¾÷iŸ¾÷iŸ¾“)™¾é—¾é—¾Wi•¾/é’¾/é’¾£(Š¾gh†¾gh†¾eOv¾ÕM]¾=Ê#¾	ŒÀ½Q
    +%½Á¼!‚¼!‚¼íɾ=Ïs¾=Ïs¾s+·¾‹¬È¾‹¬È¾Ë­Ü¾k®æ¾k®æ¾Ïîì¾Ïî쾯ð¾3/ó¾3/ó¾ïñ¾3/ó¾3/ó¾ïñ¾ïñ¾ïñ¾¯ð¾¯ð¾¯ð¾ïñ¾Ïîì¾Ïîì¾»®ë¾»®ë¾»®ë¾§n꾧nê¾k®æ¾k®æ¾k®æ¾Wnå¾C.ä¾C.ä¾Wnå¾/îâ¾nà¾ó-ß¾ó-ß¾nà¾ßíݾßíݾ˭ܾßíݾßíݾ·mÛ¾£-Ú¾£-Ú¾£-Ú¾íؾ£-Ú¾{­×¾{­×¾{­×¾gmÖ¾gmÖ¾gmÖ¾{­×¾{­×¾S-Õ¾?íÓ¾?íÓ¾?íÓ¾+­Ò¾mѾ+­Ò¾mѾ۬;ïìξïìξ-оïìξïìξÇl̾Çl̾Çl̾³,˾Ÿìɾ‹¬È¾wlǾ‹¬È¾wlǾc,ƾc,ƾ‹¬È¾c,ƾc,ƾc,ƾwlǾwlǾ'l¾;¬Ã¾;¬Ã¾,Á¾,Á¾,Á¾ÿ뿾뫾¾ë«¾¾Ã+¼¾›«¹¾›«¹¾‡k¸¾‡k¸¾K«´¾_ëµ¾_ëµ¾7k³¾ë°¾ë°¾ûª¯¾#+²¾#+²¾¿ê«¾«ªª¾«ªª¾ƒ*¨¾ƒ*¨¾[ª¥¾Gj¤¾Gj¤¾꡾÷iŸ¾÷iŸ¾§iš¾§iš¾§iš¾©‘¾ó(¾ó(¾£(Š¾?胾ÝÏ}¾Îi¾Îi¾5H¾Iˆ„½Iˆ„½p»±	½±	½mÌF¾£(Š¾£(Š¾ÿ뿾۬;۬;®á¾“.龧nê¾Ïîì¾Ïîì¾3/ó¾3/ó¾3/ó¾Goô¾Goô¾Goô¾¯ð¾ïñ¾ïñ¾¯ð¾÷nï¾÷nï¾ã.î¾ã.î¾ã.n꾧nê¾î羧n꾧nê¾Wnå¾k®æ¾k®æ¾k®æ¾®á¾®á¾C.ä¾/îâ¾®á¾ó-ß¾nà¾ó-ß¾ó-ß¾ó-ß¾ó-ß¾·mÛ¾·mÛ¾ßíݾ˭ܾ˭ܾ£-Ú¾£-Ú¾£-Ú¾{­×¾{­×¾{­×¾íؾ?íÓ¾gmÖ¾?íÓ¾?íÓ¾?íÓ¾+­Ò¾+­Ò¾+­Ò¾mѾmѾmѾïìξïìξ-о۬;۬;ïìξïìξïìξ۬;Çl̾۬;³,˾³,˾³,˾Çl̾Çl̾wlǾwlǾwlǾwlǾc,ƾOìľc,ƾ;¬Ã¾'l¾'l¾'l¾ÿ뿾'l¾'l¾×k½¾¯ëº¾¯ëº¾ë«¾¾¯ëº¾¯ëº¾s+·¾‡k¸¾‡k¸¾K«´¾K«´¾K«´¾7k³¾ë°¾ë°¾ûª¯¾ûª¯¾Ó*­¾«ªª¾«ªª¾ƒ*¨¾oꦾoꦾª ¾꡾꡾Ï霾“)™¾é—¾k©–¾C)”¾i¾ßè¾ßè¾{¨‡¾ÝÏ}¾ÝÏ}¾­ÍZ¾íɾíɾaæ¼
    + º
    + º‰‰˜½=Ê#¾=Ê#¾ã)ž¾s+·¾³,˾gm־˭ܾk®æ¾»®ë¾»®ë¾¯ð¾¯ð¾¯ð¾ïñ¾3/ó¾3/ó¾ïñ¾¯ð¾¯ð¾ïñ¾¯ð¾¯ð¾÷nï¾÷nᄃnê¾Ïîì¾Ïîì¾»®ë¾“.龓.é¾î羓.龓.é¾Wnå¾îç¾îç¾Wnå¾C.ä¾C.ä¾/îâ¾/îâ¾nྮᾮá¾ó-ß¾®á¾®á¾ßíݾ˭ܾ˭ܾ·mÛ¾íؾ£-Ú¾íؾíؾ{­×¾gmÖ¾gmÖ¾gmÖ¾S-Õ¾S-Õ¾?íÓ¾+­Ò¾+­Ò¾S-Õ¾?íÓ¾?íÓ¾+­Ò¾+­Ò¾+­Ò¾mѾmѾ+­Ò¾mѾmѾ-о-о-оÇl̾Çl̾Çl̾³,˾‹¬È¾ŸìɾŸìɾŸìɾŸìɾc,ƾc,ƾOìľOìľOìľ;¬Ã¾;¬Ã¾;¬Ã¾;¬Ã¾ÿ뿾ÿ뿾뫾¾ë«¾¾ë«¾¾Ã+¼¾Ã+¼¾¯ëº¾›«¹¾›«¹¾›«¹¾_ëµ¾_ëµ¾K«´¾7k³¾7k³¾ë°¾7k³¾7k³¾¿ê«¾«ªª¾«ªª¾¿ê«¾[ª¥¾[ª¥¾Gj¤¾Gj¤¾ã)ž¾÷iŸ¾÷iŸ¾»©›¾§iš¾§iš¾k©–¾i¾i¾Ë¨Œ¾èˆ¾+¨‚¾Ïx¾MÎd¾õK?¾ÙŽí½ÙŽí½Á
    +\¼p»p»ÙŽí½
    +ÍP¾
    +ÍP¾Ó*­¾,Á¾,Á¾Ë­Ü¾®á¾“.é¾»®ë¾»®ë¾¯ð¾3/ó¾3/ó¾÷nï¾Goô¾Goô¾ïñ¾ïñ¾¯ð¾¯ð¾ã.î¾÷nï¾÷nï¾÷nï¾ã.î¾»®ë¾»®ë¾Ïî쾓.龓.龧nê¾îç¾îç¾îç¾îç¾Wnå¾Wnå¾Wnå¾/îâ¾ó-ß¾ó-ß¾/î⾮ᾮá¾ßíݾßíݾßíݾ˭ܾ£-Ú¾£-Ú¾£-Ú¾íؾíؾ£-Ú¾£-Ú¾·mÛ¾£-Ú¾£-Ú¾gmÖ¾gmÖ¾gmÖ¾gmÖ¾?íÓ¾?íÓ¾gmÖ¾+­Ò¾+­Ò¾+­Ò¾mѾ+­Ò¾mѾmѾ-оÇl̾Çl̾ïìξ۬;۬;Çl̾Çl̾Çl̾³,˾‹¬È¾‹¬È¾‹¬È¾wlǾ‹¬È¾‹¬È¾c,ƾ;¬Ã¾wlǾwlǾ;¬Ã¾,Á¾,Á¾'l¾'l¾'l¾ÿ뿾뫾¾ë«¾¾×k½¾Ã+¼¾Ã+¼¾‡k¸¾›«¹¾›«¹¾_ëµ¾K«´¾K«´¾7k³¾7k³¾¿ê«¾ûª¯¾ûª¯¾Ó*­¾ƒ*¨¾ƒ*¨¾ƒ*¨¾oꦾoꦾGj¤¾꡾꡾꡾ã)ž¾ã)ž¾“)™¾“)™¾Wi•¾ßè¾ßè¾Ë¨Œ¾{¨‡¾{¨‡¾=Ïs¾­ÍZ¾­ÍZ¾‹±½¡ú¼¡ú¼!‚¼™ˆ‰½MɾÅNl¾“)™¾K«´¾ŸìɾŸìɾßíݾWnå¾Wnå¾Ïîì¾ã.î¾ã.î¾Goô¾3/ó¾3/ó¾Goô¾Goô¾Goô¾÷nᆵð¾ïñ¾ïñ¾÷nï¾÷nï¾÷nï¾÷nï¾÷nᄃn꾧nê¾îç¾îç¾îç¾îç¾Wnå¾Wnå¾îç¾C.ä¾/îâ¾/îâ¾/îâ¾/îâ¾nà¾nà¾ó-ß¾ó-ß¾ó-ß¾ó-ß¾ßíݾßíݾ˭ܾ˭ܾ˭ܾ·mÛ¾ßíݾßíݾ{­×¾{­×¾{­×¾{­×¾gmÖ¾íؾgmÖ¾{­×¾?íÓ¾S-Õ¾S-Õ¾S-Õ¾mѾmѾ+­Ò¾-о-о+­Ò¾ïìξïìξÇl̾ïìξ۬;Çl̾Çl̾ïìξÇl̾Çl̾³,˾³,˾³,˾‹¬È¾‹¬È¾‹¬È¾wlǾOìľc,ƾc,ƾc,ƾ;¬Ã¾'l¾'l¾뫾¾ÿ뿾ÿ뿾×k½¾×k½¾¯ëº¾×k½¾×k½¾s+·¾‡k¸¾‡k¸¾K«´¾_ëµ¾_ëµ¾#+²¾ë°¾ë°¾ë°¾Ó*­¾¿ê«¾¿ê«¾ƒ*¨¾ƒ*¨¾[ª¥¾oꦾ3*£¾ª ¾ª ¾÷iŸ¾»©›¾»©›¾é—¾C)”¾C)”¾Ë¨Œ¾{¨‡¾{¨‡¾(€¾íÎn¾íÎn¾µJ+¾	ŒÀ½±	½
    + ºÁ¼a½…H¾…H¾k©–¾#+²¾#+²¾?íӾ˭ܾ˭ܾ»®ë¾÷nï¾÷nï¾ã.î¾3/ó¾3/ó¾3/ó¾3/ó¾3/ó¾ïñ¾ïñ¾ïñ¾¯ð¾÷nï¾ã.î¾÷nï¾÷nï¾»®ë¾§n꾧nê¾Ïîì¾îç¾î羧n꾓.龓.é¾Wnå¾Wnå¾Wnå¾Wnå¾C.ä¾/î⾮ᾮá¾C.侮ᾮá¾nà¾nà¾nà¾Ë­Ü¾Ë­Ü¾Ë­Ü¾ßíݾ£-Ú¾£-Ú¾£-Ú¾íؾ{­×¾{­×¾{­×¾{­×¾íؾíؾgmÖ¾?íÓ¾?íÓ¾?íÓ¾?íÓ¾?íÓ¾?íÓ¾?íÓ¾+­Ò¾+­Ò¾+­Ò¾mѾmѾmѾïìξïìξïìξÇl̾Çl̾Çl̾Çl̾Çl̾Çl̾Ÿìɾ‹¬È¾‹¬È¾ŸìɾŸìɾc,ƾwlǾwlǾ,Á¾'l¾'l¾;¬Ã¾ÿ뿾ÿ뿾ÿ뿾뫾¾ë«¾¾Ã+¼¾×k½¾×k½¾Ã+¼¾‡k¸¾‡k¸¾_ëµ¾K«´¾_ëµ¾#+²¾#+²¾ë°¾ë°¾ë°¾¿ê«¾«ªª¾«ªª¾ƒ*¨¾Gj¤¾Gj¤¾3*£¾3*£¾3*£¾Ï霾»©›¾§iš¾é—¾é—¾/é’¾ó(¾ó(¾{¨‡¾S(…¾S(…¾ÅNl¾…MX¾…MX¾)Š¢½á¾¼á¾¼¡
    +ª¼Ù‰½eJ&¾ÝÏ}¾ª ¾s+·¾ŸìɾŸìɾnà¾Wnå¾Wnå¾ã.î¾ã.î¾ã.ð¾ïñ¾ïñ¾3/ó¾[¯õ¾[¯õ¾¯ð¾¯ð¾ïñ¾÷nï¾Ïîì¾÷nï¾÷nï¾÷nï¾»®ë¾ã.î¾ã..龧n꾧nê¾îç¾î羓.é¾k®æ¾k®æ¾Wnå¾Wnå¾Wnå¾nà¾nà¾nà¾nà¾ó-ß¾ó-ß¾nà¾ßíݾßíݾ·mÛ¾·mÛ¾·mÛ¾·mÛ¾·mÛ¾íؾíؾíؾíؾ{­×¾{­×¾{­×¾£-Ú¾£-Ú¾?íÓ¾gmÖ¾gmÖ¾gmÖ¾+­Ò¾?íÓ¾?íÓ¾?íÓ¾mѾ+­Ò¾+­Ò¾mѾïìξïìξ۬;Çl̾Çl̾۬;³,˾³,˾Çl̾ŸìɾŸìɾ‹¬È¾wlǾ‹¬È¾c,ƾOìľwlǾwlǾOìľ;¬Ã¾;¬Ã¾;¬Ã¾,Á¾,Á¾,Á¾ë«¾¾×k½¾×k½¾×k½¾›«¹¾›«¹¾›«¹¾‡k¸¾‡k¸¾K«´¾K«´¾#+²¾ë°¾çj®¾ûª¯¾çj®¾çj®¾«ªª¾—j©¾—j©¾oꦾGj¤¾Gj¤¾ã)ž¾ª ¾ª ¾»©›¾“)™¾“)™¾k©–¾i¾Ë¨Œ¾£(Š¾{¨‡¾+¨‚¾Ïx¾Ïx¾ÍË<¾ÙŽí½ÙŽí½È»p»±	½ÙŽí½½ÌK¾ß辫ªª¾«ªª¾-о£-Ú¾£-Ú¾îç¾Ïîì¾Ïîì¾ã.ð¾¯ð¾¯ð¾¯ð¾¯ð¾Goô¾3/ó¾3/ó¾ïñ¾¯ð¾÷nï¾÷nï¾÷nï¾ã.n꾧nê¾»®ë¾»®ë¾»®ë¾§nê¾îç¾îç¾Wnå¾k®æ¾k®æ¾/îâ¾C.ä¾C.ä¾C.ä¾®á¾ó-ß¾/îâ¾/îâ¾ó-ß¾ßíݾßíݾßíݾó-ß¾ó-ß¾ßíݾ·mÛ¾·m۾˭ܾ£-Ú¾£-Ú¾{­×¾{­×¾íؾS-Õ¾S-Õ¾gmÖ¾íؾíؾgmÖ¾S-Õ¾S-Õ¾S-Õ¾mѾmѾ-о+­Ò¾+­Ò¾-о۬;۬;-оÇl̾Çl̾ïìξïìξÇl̾ŸìɾŸìɾ³,˾ŸìɾŸìɾwlǾwlǾwlǾc,ƾ;¬Ã¾;¬Ã¾;¬Ã¾Oìľ'l¾ÿ뿾ÿ뿾ÿ뿾×k½¾×k½¾›«¹¾¯ëº¾¯ëº¾s+·¾_ëµ¾K«´¾K«´¾K«´¾#+²¾ë°¾ë°¾ûª¯¾Ó*­¾Ó*­¾¿ê«¾—j©¾—j©¾oꦾ[ª¥¾[ª¥¾Gj¤¾꡾꡾»©›¾Ï霾»©›¾k©–¾k©–¾/é’¾i¾i¾gh†¾+¨‚¾+¨‚¾MÎd¾}Ë7¾}Ë7¾1C½Á¼Á¼á¾¼IÔ½ELD¾£(Š¾ƒ*¨¾Ã+¼¾Çl̾Çl̾®á¾Wnå¾Wnå¾ã.ð¾¯ð¾ïñ¾3/ó¾3/ó¾¯ð¾3/ó¾3/ó¾ïñ¾ïñ¾ïñ¾÷nï¾Ïîì¾Ïîì¾ã.î¾»®ë¾»®ë¾Ïîì¾Ïîì¾îç¾îç¾îç¾îç¾îç¾îç¾Wnå¾/îâ¾/îâ¾/îâ¾/îâ¾/îâ¾/îâ¾/îâ¾®á¾nà¾nà¾C.ä¾nà¾nà¾ßíݾnà¾nà¾íؾ·mÛ¾·mÛ¾£-Ú¾{­×¾{­×¾íؾS-Õ¾S-Õ¾gmÖ¾gmÖ¾+­Ò¾?íÓ¾S-Õ¾+­Ò¾+­Ò¾+­Ò¾+­Ò¾+­Ò¾+­Ò¾mѾ?íÓ¾?íӾ۬;-о-оïìξïìξÇl̾Çl̾Çl̾Çl̾³,˾³,˾ŸìɾŸìɾŸìɾc,ƾOìľc,ƾc,ƾc,ƾ,Á¾c,ƾc,ƾÿ뿾뫾¾ë«¾¾×k½¾Ã+¼¾Ã+¼¾¯ëº¾‡k¸¾‡k¸¾s+·¾s+·¾s+·¾K«´¾K«´¾ûª¯¾ûª¯¾çj®¾#+²¾Ó*­¾Ó*­¾—j©¾«ªª¾«ªª¾Gj¤¾3*£¾3*£¾꡾Ï霾Ï霾Ï霾k©–¾k©–¾/é’¾©‘¾©‘¾·h‹¾gh†¾gh†¾=Ïs¾ýÍ_¾¥K:¾™Ù½™Ù½A4¼p»p»™Ù½•LI¾•LI¾«ªª¾×k½¾×k½¾£-Ú¾®á¾®á¾»®ë¾÷nï¾÷nᆵð¾ïñ¾ïñ¾ïñ¾3/ó¾Goô¾ã.î¾ã.ð¾ïñ¾ïñ¾ã.î¾Ïîì¾Ïîì¾»®ë¾Ïîì¾Ïîì¾»®ë¾§n꾧n꾓.é¾îç¾îç¾îç¾îç¾Wnå¾Wnå¾Wnå¾C.ä¾/îâ¾/îâ¾/îâ¾/îâ¾ó-ß¾ó-ß¾®á¾nà¾ßíݾßíݾ˭ܾ·mÛ¾·m۾˭ܾ˭ܾ˭ܾ£-Ú¾£-Ú¾£-Ú¾íؾ{­×¾£-Ú¾£-Ú¾gmÖ¾S-Õ¾íؾíؾ+­Ò¾S-Õ¾S-Õ¾S-Õ¾+­Ò¾+­Ò¾mѾ-о-оmѾïìξ۬;-оïìξÇl̾³,˾³,˾Ÿìɾ‹¬È¾‹¬È¾Ÿìɾ‹¬È¾‹¬È¾;¬Ã¾c,ƾc,ƾOìľ;¬Ã¾;¬Ã¾,Á¾,Á¾×k½¾,Á¾,Á¾¯ëº¾×k½¾×k½¾›«¹¾‡k¸¾‡k¸¾‡k¸¾7k³¾7k³¾K«´¾ë°¾ë°¾çj®¾çj®¾Ó*­¾«ªª¾«ªª¾ƒ*¨¾[ª¥¾[ª¥¾Gj¤¾3*£¾3*£¾ã)ž¾§iš¾§iš¾é—¾k©–¾k©–¾i¾·h‹¾·h‹¾S(…¾(€¾(€¾ÕM]¾µJ+¾YŒÅ½	½p»p»ÑM½ÑM½…MX¾©‘¾©‘¾'l¾+­Ò¾+­Ò¾nà¾îç¾Ïîì¾Ïîì¾ã.ð¾ïñ¾3/ó¾ïñ¾ïñ¾ïñ¾ïñ¾ïñ¾ïñ¾¯ð¾¯ð¾¯ð¾÷nï¾ã.î¾ã.î¾÷nï¾Ïîì¾Ïîì¾k®æ¾»®ë¾»®ë¾îç¾îç¾îç¾îç¾C.ä¾/îâ¾Wnå¾Wnå¾/îâ¾/îâ¾/îâ¾®á¾nà¾nà¾ó-ß¾nà¾nà¾ßíݾßíݾßíݾßíݾnà¾nྣ-Ú¾£-Ú¾£-Ú¾£-Ú¾{­×¾íؾ{­×¾íؾ{­×¾{­×¾{­×¾S-Õ¾S-Õ¾S-Õ¾+­Ò¾mѾmѾ+­Ò¾mѾmѾïìξïìξïìξÇl̾Çl̾Çl̾Çl̾³,˾ŸìɾÇl̾³,˾ŸìɾŸìɾŸìɾc,ƾc,ƾc,ƾOìľ'l¾'l¾'l¾'l¾'l¾ÿ뿾×k½¾×k½¾Ã+¼¾Ã+¼¾Ã+¼¾‡k¸¾‡k¸¾K«´¾_ëµ¾7k³¾#+²¾7k³¾7k³¾çj®¾çj®¾çj®¾«ªª¾«ªª¾«ªª¾ƒ*¨¾3*£¾3*£¾3*£¾÷iŸ¾Ï霾§iš¾§iš¾§iš¾Wi•¾Wi•¾ó(¾Ë¨Œ¾Ë¨Œ¾?胾(€¾(€¾­ÍZ¾íɾíɾq½
    + º
    + ºq
    +W½5H¾…MX¾C)”¾C)”¾,Á¾mѾmѾC.ä¾Wnå¾Wnå¾Ïîì¾ïñ¾ïñ¾ïñ¾3/ó¾3/ó¾ïñ¾Goô¾Goô¾ïñ¾ïñ¾ïñ¾÷nï¾÷nᆵð¾ã.î¾ã.î¾»®ë¾Ïîì¾Ïîì¾îç¾îç¾î羓.é¾k®æ¾k®æ¾îç¾Wnå¾Wnå¾C.ä¾C.ä¾/îâ¾/îâ¾®á¾nà¾nà¾nྮá¾nà¾nà¾ßíݾnà¾nྣ-ھ˭ܾ˭ܾ˭ܾ£-Ú¾£-Ú¾£-Ú¾íؾíؾS-Õ¾íؾíؾgmÖ¾{­×¾S-Õ¾+­Ò¾+­Ò¾S-Õ¾mѾmѾmѾ?íÓ¾?íÓ¾-о-о-оïìξïìξïìξ۬;۬;³,˾ŸìɾŸìɾ‹¬È¾‹¬È¾‹¬È¾OìľOìľOìľc,ƾ,Á¾,Á¾,Á¾'l¾'l¾×k½¾ë«¾¾×k½¾¯ëº¾‡k¸¾›«¹¾‡k¸¾‡k¸¾K«´¾_ëµ¾_ëµ¾7k³¾ë°¾ë°¾çj®¾çj®¾çj®¾Ó*­¾—j©¾—j©¾—j©¾oꦾoꦾ3*£¾꡾÷iŸ¾»©›¾“)™¾k©–¾Wi•¾Wi•¾ó(¾ßè¾ßè¾S(…¾(€¾(€¾%Nb¾õK?¾õK?¾±k½Á¼Á¼aæ¼i‹¶½µJ+¾+¨‚¾3*£¾›«¹¾³,˾³,˾nà¾Wnå¾Wnå¾Ïî쾯ð¾¯ð¾ïñ¾ïñ¾ïñ¾¯ð¾ïñ¾ïñ¾ïñ¾¯ð¾¯ð¾ïñ¾ã.î¾Ïîì¾ã.î¾ã.n꾧n꾧n꾓.龧n꾧nê¾îç¾k®æ¾k®æ¾îç¾k®æ¾k®æ¾Wnå¾k®æ¾k®æ¾C.ä¾nྮá¾C.ä¾C.ä¾ó-ß¾nà¾nà¾ßíݾßíݾßíݾ˭ܾ˭ܾ£-Ú¾·mÛ¾·mÛ¾·mÛ¾£-Ú¾£-Ú¾gmÖ¾{­×¾{­×¾{­×¾S-Õ¾S-Õ¾íؾS-Õ¾S-Õ¾?íÓ¾?íÓ¾S-Õ¾-о-о+­Ò¾mѾmѾ-о-о-о۬;Çl̾Çl̾³,˾³,˾³,˾‹¬È¾‹¬È¾c,ƾwlǾOìľ;¬Ã¾;¬Ã¾;¬Ã¾'l¾ÿ뿾ÿ뿾,Á¾ÿ뿾ÿ뿾Ã+¼¾×k½¾×k½¾Ã+¼¾›«¹¾s+·¾_ëµ¾‡k¸¾_ëµ¾#+²¾#+²¾#+²¾ûª¯¾ûª¯¾¿ê«¾«ªª¾«ªª¾ƒ*¨¾oꦾoꦾ3*£¾ª ¾ª ¾ã)ž¾§iš¾§iš¾“)™¾“)™¾/é’¾ó(¾ó(¾£(Š¾{¨‡¾{¨‡¾µO{¾%Nb¾%Nb¾
    +ȾIˆ„½Iˆ„½p;!‚¼‰‰˜½Ê(¾µO{¾÷iŸ¾s+·¾s+·¾S-Õ¾ßíݾßíݾîç¾»®ë¾»®ë¾÷nï¾÷nï¾÷nï¾ïñ¾¯ð¾¯ð¾ïñ¾ïñ¾ïñ¾¯ð¾¯ð¾÷nï¾÷nï¾÷nï¾ã.î¾Ïîì¾Ïîì¾Ïîì¾Ïîì¾Ïî쾓.龧n꾓.é¾îç¾k®æ¾îç¾îç¾îç¾C.ä¾C.ä¾C.ä¾C.侮ᾮᾮᾮᾮá¾nà¾ßíݾßíݾó-ß¾ó-߾˭ܾßíݾßíݾ˭ܾíؾíؾ·mÛ¾·mÛ¾·mÛ¾·mÛ¾íؾíؾ{­×¾S-Õ¾gmÖ¾S-Õ¾S-Õ¾?íÓ¾+­Ò¾+­Ò¾+­Ò¾+­Ò¾+­Ò¾-оmѾmѾïìξ۬;۬;ïìξ³,˾³,˾³,˾Çl̾³,˾‹¬È¾‹¬È¾wlǾwlǾwlǾc,ƾOìľOìľ;¬Ã¾;¬Ã¾;¬Ã¾×k½¾ë«¾¾ë«¾¾¯ëº¾¯ëº¾›«¹¾›«¹¾›«¹¾_ëµ¾_ëµ¾_뵾밾밾밾ûª¯¾ûª¯¾ûª¯¾¿ê«¾—j©¾—j©¾ƒ*¨¾oꦾoꦾGj¤¾Gj¤¾÷iŸ¾Ï霾Ï霾“)™¾é—¾é—¾©‘¾i¾i¾{¨‡¾?胾?胾Îi¾åLN¾É¾yŠ§½yŠ§½
    + ºÈ»È»…H¾%Nb¾%Nb¾çj®¾,Á¾,Á¾Ë­Ü¾®á¾k®æ¾»®ë¾»®ë¾÷nᆵð¾¯ð¾ïñ¾¯ð¾¯ð¾¯ð¾Goô¾Goô¾3/ó¾ïñ¾ïñ¾÷nï¾÷nï¾÷nï¾Ïîì¾Ïî쾧nê¾ã.î¾ã.î¾î羧n꾧n꾓.é¾Wnå¾Wnå¾Wnå¾C.ä¾C.ä¾Wnå¾C.ä¾/îâ¾Wnå¾Wnå¾ó-ß¾®á¾®á¾®á¾ó-ß¾ó-ß¾nà¾nà¾nà¾ßíݾßíݾßíݾ·mÛ¾·mÛ¾·mÛ¾íؾíؾíؾ{­×¾{­×¾gmÖ¾{­×¾{­×¾gmÖ¾?íÓ¾?íÓ¾?íÓ¾mѾmѾ+­Ò¾+­Ò¾ïìξ-о-о-о-о-оÇl̾³,˾Çl̾Çl̾Çl̾‹¬È¾‹¬È¾‹¬È¾‹¬È¾c,ƾc,ƾ;¬Ã¾;¬Ã¾,Á¾,Á¾,Á¾×k½¾×k½¾×k½¾ë«¾¾¯ëº¾¯ëº¾›«¹¾s+·¾s+·¾_ëµ¾s+·¾K«´¾#+²¾#+²¾#+²¾çj®¾çj®¾ûª¯¾¿ê«¾¿ê«¾ƒ*¨¾oꦾoꦾ꡾꡾ª ¾÷iŸ¾Ï霾k©–¾“)™¾“)™¾/é’¾ó(¾ó(¾{¨‡¾{¨‡¾{¨‡¾=Ïs¾ýÍ_¾ýÍ_¾
    +Ⱦ±k½±k½p;¡
    +ª¼ÉŠ¬½µJ+¾µO{¾ª ¾s+·¾s+·¾+­Ò¾ßíݾßíݾîç¾»®ë¾»®ë¾÷nï¾3/ó¾3/ó¾ïñ¾ïñ¾3/ó¾3/ó¾3/ó¾¯ð¾ïñ¾ïñ¾÷nï¾ã.î¾ã.î¾÷nï¾Ïîì¾Ïîì¾Ïî쾓.龓.龓.龧n꾧n꾧n꾧n꾓.é¾Wnå¾Wnå¾îç¾k®æ¾k®æ¾/îâ¾C.ä¾C.ä¾®á¾nྮᾮᾮá¾ßíݾ˭ܾ˭ܾó-߾˭ܾ˭ܾ£-Ú¾£-Ú¾·mÛ¾·mÛ¾·mÛ¾£-Ú¾£-Ú¾£-Ú¾gmÖ¾S-Õ¾S-Õ¾{­×¾S-Õ¾S-Õ¾?íÓ¾S-Õ¾S-Õ¾?íÓ¾?íÓ¾mѾmѾmѾmѾ۬;۬;Çl̾³,˾³,˾‹¬È¾³,˾³,˾c,ƾ‹¬È¾wlǾOìľOìľ;¬Ã¾;¬Ã¾;¬Ã¾,Á¾,Á¾,Á¾ë«¾¾ë«¾¾ë«¾¾×k½¾¯ëº¾Ã+¼¾›«¹¾s+·¾_ëµ¾_ëµ¾_ëµ¾#+²¾ë°¾ë°¾#+²¾¿ê«¾¿ê«¾«ªª¾ƒ*¨¾ƒ*¨¾Gj¤¾3*£¾3*£¾ª ¾÷iŸ¾ã)ž¾»©›¾»©›¾é—¾Wi•¾Wi•¾ó(¾ó(¾ó(¾S(…¾?胾?胾Îi¾•LI¾•LI¾)Š¢½á¾¼p;È»È»…H¾%Nb¾%Nb¾çj®¾,Á¾,Á¾·mÛ¾nà¾nྦྷnê¾÷nï¾÷nï¾Ïî쾯ð¾3/ó¾ïñ¾ïñ¾ïñ¾ïñ¾ïñ¾¯ð¾¯ð¾ã.î¾ã.î¾ã.î¾Ïîì¾ã.î¾ã.î¾÷nï¾Ïîì¾Ïî쾧nê¾»®ë¾»®ë¾îç¾îç¾îç¾îç¾Wnå¾Wnå¾Wnå¾Wnå¾/îâ¾C.ä¾C.ä¾nྮᾮᾮá¾ó-ß¾ó-ß¾ó-ß¾ßíݾßíݾ·mÛ¾ßíݾ˭ܾ£-Ú¾£-ھ˭ܾ·mÛ¾·mÛ¾£-Ú¾íؾíؾgmÖ¾{­×¾{­×¾S-Õ¾gmÖ¾gmÖ¾?íÓ¾+­Ò¾?íÓ¾+­Ò¾+­Ò¾ïìξ-о-оïìξÇl̾Çl̾۬;³,˾ŸìɾŸìɾ³,˾‹¬È¾wlǾwlǾwlǾwlǾwlǾOìľ'l¾'l¾'l¾,Á¾,Á¾×k½¾ë«¾¾ë«¾¾Ã+¼¾Ã+¼¾‡k¸¾›«¹¾›«¹¾ë°¾K«´¾K«´¾ûª¯¾çj®¾çj®¾¿ê«¾¿ê«¾¿ê«¾—j©¾oꦾGj¤¾Gj¤¾Gj¤¾÷iŸ¾÷iŸ¾÷iŸ¾Ï霾k©–¾k©–¾é—¾Wi•¾Wi•¾·h‹¾·h‹¾gh†¾h¾h¾uNg¾ELD¾ELD¾™ˆ‰½Á
    +\¼Á
    +\¼Á¼Qu½%I¾MÎd¾MÎd¾#+²¾;¬Ã¾;¬Ã¾£-Ú¾C.ä¾C.侓.é¾ã.î¾ã.ð¾ïñ¾ïñ¾3/ó¾¯ð¾ïñ¾ïñ¾ïñ¾ã.î¾ïñ¾ïñ¾¯ð¾ã.î¾ã.î¾ïñ¾»®ë¾»®ë¾Ïîì¾»®ë¾»®ë¾“.龓.龓.é¾îç¾Wnå¾îç¾k®æ¾k®æ¾Wnå¾C.ä¾C.ä¾®á¾/îâ¾/îâ¾ó-ß¾nà¾C.ä¾nà¾ó-ß¾nà¾ó-ß¾ó-ß¾ßíݾ£-Ú¾£-Ú¾ßíݾ˭ܾ˭ܾ·mÛ¾íؾíؾ{­×¾gmÖ¾gmÖ¾{­×¾íؾgmÖ¾+­Ò¾?íÓ¾gmÖ¾?íÓ¾?íÓ¾mѾmѾmѾïìξ۬;۬;ïìξ۬;³,˾Çl̾³,˾³,˾ŸìɾŸìɾc,ƾ‹¬È¾‹¬È¾Oìľ;¬Ã¾;¬Ã¾;¬Ã¾'l¾'l¾뫾¾ë«¾¾×k½¾¯ëº¾¯ëº¾¯ëº¾›«¹¾›«¹¾‡k¸¾K«´¾K«´¾7k³¾7k³¾7k³¾Ó*­¾ë°¾çj®¾¿ê«¾—j©¾«ªª¾«ªª¾Gj¤¾[ª¥¾3*£¾3*£¾ã)ž¾Ï霾Ï霾Ï霾闾闾/é’¾i¾i¾£(Š¾S(…¾S(…¾ÝÏ}¾íÎn¾]ÍU¾J!¾J!¾±	½
    + :
    + :	½9Žã½9Žã½gh†¾oꦾoꦾÇl̾S-Õ¾S-Õ¾C.ä¾îç¾Ïîì¾ã.î¾ã.î¾ã.î¾3/ó¾3/ó¾ïñ¾¯ð¾¯ð¾ïñ¾÷nï¾÷nï¾ã.ð¾¯ð¾»®ë¾ã.î¾ã.î¾»®ë¾§nê¾»®ë¾“.龓.é¾î羓.龓.é¾k®æ¾“.龓.é¾Wnå¾/îâ¾/îâ¾C.ä¾/îâ¾/îâ¾/î⾮ᾮá¾nà¾nà¾nà¾ó-ß¾ó-ß¾nà¾Ë­Ü¾Ë­Ü¾Ë­Ü¾íؾíؾ·mÛ¾·mÛ¾·mÛ¾gmÖ¾£-Ú¾gmÖ¾gmÖ¾gmÖ¾?íÓ¾íؾíؾ+­Ò¾?íÓ¾?íÓ¾?íÓ¾+­Ò¾+­Ò¾+­Ò¾-оmѾïìξïìξ³,˾Çl̾Çl̾ŸìɾŸìɾŸìɾŸìɾOìľOìľwlǾc,ƾc,ƾ'l¾'l¾,Á¾,Á¾ÿ뿾×k½¾ë«¾¾ë«¾¾¯ëº¾›«¹¾›«¹¾‡k¸¾›«¹¾›«¹¾7k³¾#+²¾#+²¾#+²¾ûª¯¾ûª¯¾çj®¾ûª¯¾ûª¯¾ƒ*¨¾—j©¾—j©¾[ª¥¾3*£¾꡾÷iŸ¾÷iŸ¾»©›¾§iš¾§iš¾k©–¾Wi•¾Wi•¾Ë¨Œ¾£(Š¾èˆ¾+¨‚¾+¨‚¾Îi¾%Nb¾%Nb¾)ò½a½a½Á<Á
    +\¼Á
    +\¼µJ+¾eOv¾Ï霾_ëµ¾_ëµ¾-о·mÛ¾·mÛ¾î羓.龓.é¾÷nï¾Ïîì¾Ïî쾯ð¾ïñ¾ïñ¾÷nᆵð¾¯ð¾÷nï¾÷nï¾÷nï¾ã.î¾ã.î¾÷nï¾»®ë¾»®ë¾»®ë¾ã.î¾ã..龓.龓.龓.é¾k®æ¾îç¾îç¾îç¾C.ä¾C.ä¾C.ä¾C.ä¾/îâ¾/îâ¾®á¾nà¾nà¾nà¾ßíݾßíݾó-ß¾ßíݾßíݾ˭ܾßíݾ˭ܾ·mÛ¾·mÛ¾£-Ú¾·mÛ¾·mÛ¾{­×¾{­×¾{­×¾{­×¾íؾíؾ{­×¾S-Õ¾S-Õ¾?íÓ¾+­Ò¾+­Ò¾?íÓ¾?íÓ¾ïìξ۬;۬;mѾ۬;۬;³,˾۬;۬;‹¬È¾‹¬È¾‹¬È¾‹¬È¾wlǾwlǾc,ƾ;¬Ã¾;¬Ã¾;¬Ã¾'l¾뫾¾ÿ뿾ÿ뿾×k½¾×k½¾×k½¾Ã+¼¾‡k¸¾‡k¸¾‡k¸¾s+·¾s+·¾#+²¾7k³¾7k³¾çj®¾çj®¾çj®¾«ªª¾«ªª¾ƒ*¨¾[ª¥¾[ª¥¾3*£¾3*£¾3*£¾Ï霾Ï霾Ï霾§iš¾é—¾é—¾/é’¾/é’¾/é’¾·h‹¾{¨‡¾+¨‚¾Ïx¾Ïx¾]ÍU¾=Ê#¾=Ê#¾Q
    +%½p;p;	½IÔ½ÍË<¾S(…¾[ª¥¾›«¹¾‹¬È¾‹¬È¾Ë­Ü¾Wnå¾Wn徧nê¾Ïîì¾Ïîì¾÷nᆵð¾¯ð¾3/ó¾¯ð¾¯ð¾ïñ¾÷nï¾Ïîì¾ïñ¾ïñ¾»®ë¾ã.î¾ã.î¾ã.î¾Ïîì¾Ïîì¾»®ë¾Ïîì¾Ïîì¾î羓.龓.é¾k®æ¾k®æ¾k®æ¾Wnå¾k®æ¾Wnå¾C.ä¾C.ä¾/îâ¾C.ä¾C.ä¾ó-ß¾nà¾nà¾nà¾ó-ß¾ó-ß¾nà¾nà¾nà¾Ë­Ü¾ßíݾßíݾ·mÛ¾·m۾˭ܾíؾíؾíؾíؾíؾgmÖ¾íؾíؾmѾ?íÓ¾?íÓ¾+­Ò¾-оmѾmѾmѾ-оïìξ۬;۬;³,˾³,˾۬;³,˾³,˾Ÿìɾ‹¬È¾‹¬È¾‹¬È¾‹¬È¾‹¬È¾'l¾OìľOìľ,Á¾,Á¾ë«¾¾ÿ뿾ÿ뿾›«¹¾Ã+¼¾Ã+¼¾s+·¾s+·¾s+·¾7k³¾7k³¾#+²¾ë°¾ë°¾¿ê«¾Ó*­¾Ó*­¾—j©¾ƒ*¨¾ƒ*¨¾oꦾGj¤¾Gj¤¾꡾꡾꡾Ï霾»©›¾“)™¾k©–¾k©–¾ó(¾ßè¾ßè¾gh†¾+¨‚¾+¨‚¾ÅNl¾­ÍZ¾­ÍZ¾	ŒÀ½±	½±	½È;a	–¼¹‹»½UK5¾UK5¾÷iŸ¾‡k¸¾‡k¸¾?íӾ˭ܾ˭ܾî羧n꾧nê¾ã.î¾ã.î¾ã.î¾ïñ¾3/ó¾3/ó¾÷nï¾3/ó¾3/ó¾÷nï¾÷nï¾÷nï¾÷nï¾÷nï¾Ïîì¾Ïîì¾Ïîì¾»®ë¾“.龓.龓.龧n꾧n꾓.é¾k®æ¾k®æ¾k®æ¾k®æ¾C.ä¾Wnå¾Wnå¾Wn微ᾮá¾C.ä¾C.ä¾C.ä¾ó-ß¾/îâ¾/îâ¾nà¾nà¾nà¾ßíݾßíݾßíݾ·mÛ¾£-Ú¾£-ھ˭ܾ˭ܾ{­×¾{­×¾{­×¾{­×¾?íÓ¾?íÓ¾{­×¾gmÖ¾gmÖ¾S-Õ¾S-Õ¾S-Õ¾+­Ò¾+­Ò¾-оïìξïìξïìξïìξïìξ۬;۬;۬;‹¬È¾‹¬È¾‹¬È¾wlǾc,ƾ'l¾OìľOìľ'l¾'l¾'l¾ÿ뿾뫾¾ë«¾¾Ã+¼¾¯ëº¾¯ëº¾›«¹¾_ëµ¾7k³¾‡k¸¾s+·¾7k³¾#+²¾#+²¾7k³¾ûª¯¾ûª¯¾Ó*­¾¿ê«¾¿ê«¾ƒ*¨¾[ª¥¾[ª¥¾Gj¤¾꡾꡾ã)ž¾Ï霾Ï霾é—¾C)”¾©‘¾/é’¾/钾舾gh†¾gh†¾h¾Oq¾Oq¾ÌA¾
    +Ⱦ
    +Ⱦ!‚¼Á<Á<a½ÕH
    +¾%Nb¾/é’¾ûª¯¾,Á¾Û¬Í¾Û¬Í¾nà¾k®æ¾k®æ¾§nê¾÷nï¾÷nᆵð¾ã.î¾ã.î¾ïñ¾¯ð¾¯ð¾3/ó¾÷nï¾÷nï¾÷nï¾÷nï¾Ïîì¾Ïîì¾Ïîì¾Ïîì¾Ïîì¾Ïîì¾Ïî쾧n꾧n꾧n꾓.龓.é¾Wnå¾k®æ¾k®æ¾îç¾îç¾Wnå¾îç¾îç¾C.ä¾/îâ¾/îâ¾nྮᾮᾮá¾ó-ß¾ó-ß¾®á¾ßíݾ˭ܾ·m۾˭ܾßíݾíؾíؾ·mÛ¾·mÛ¾·mÛ¾£-Ú¾íؾíؾ{­×¾S-Õ¾{­×¾S-Õ¾S-Õ¾?íÓ¾+­Ò¾+­Ò¾?íÓ¾?íÓ¾?íÓ¾Çl̾ïìξïìξ۬;Çl̾Çl̾۬;‹¬È¾wlǾ‹¬È¾‹¬È¾wlǾc,ƾc,ƾ'l¾'l¾'l¾,Á¾ÿ뿾ÿ뿾ÿ뿾×k½¾×k½¾¯ëº¾Ã+¼¾Ã+¼¾s+·¾s+·¾_ëµ¾_ëµ¾_ëµ¾#+²¾çj®¾çj®¾çj®¾«ªª¾«ªª¾—j©¾—j©¾—j©¾[ª¥¾꡾꡾꡾꡾§iš¾»©›¾»©›¾k©–¾©‘¾©‘¾©‘¾ßè¾ßè¾gh†¾h¾h¾íÎn¾]ÍU¾ÝÊ-¾ùŒÏ½1C½p»A4Ù¿>Ù¿>Ù¿49¿R¿R¿>Ù¿>Ù¿Hy¿\¹¿\¹¿\¹¿\¹¿\¹¿fY¿fY¿fY¿\¹¿pù¿pù¿pù¿pù¿„9¿ŽÙ¿ŽÙ¿„9¿„9¿„9¿˜y¿ŽÙ¿ŽÙ¿¢¿¢¿ŽÙ¿¬¹¿¬¹¿¢¿¢¿¢¿Ê™¿¬¹¿¬¹¿Àù¿¬¹¿¬¹¿Ô9¿Ô9¿Ô9¿¶Y¿Ô9¿Ô9¿¶Y¿Àù¿Ô9¿Ô9¿Ô9¿Ê™¿èy¿èy¿èy¿èy¿èy¿ÞÙ¿ò¿ò¿èy¿èy¿èy¿ü¹¿ò¿ò¿ò¿ú ¿Z ¿èy¿èy¿Z ¿ü¹¿ü¹¿ò¿Z ¿Z ¿ü¹¿ü¹¿ü¹¿ü¹¿ú ¿ú ¿ú ¿ü¹¿ú ¿ú ¿ú ¿ü¹¿š!¿š!¿ú ¿ú ¿ú ¿$:"¿š!¿š!¿š!¿$:"¿$:"¿$:"¿$:"¿$:"¿š!¿$:"¿$:"¿8z#¿$:"¿.Ú"¿.Ú"¿.Ú"¿š!¿$:"¿$:"¿š!¿.Ú"¿.Ú"¿8z#¿.Ú"¿.Ú"¿8z#¿8z#¿Lº$¿8z#¿8z#¿B$¿.Ú"¿.Ú"¿B$¿8z#¿8z#¿Lº$¿B$¿8z#¿B$¿B$¿VZ%¿8z#¿8z#¿B$¿Lº$¿Lº$¿B$¿Lº$¿Lº$¿B$¿B$¿Lº$¿8z#¿B$¿VZ%¿B$¿B$¿Lº$¿`ú%¿`ú%¿8z#¿VZ%¿VZ%¿VZ%¿VZ%¿VZ%¿`ú%¿VZ%¿VZ%¿Lº$¿Lº$¿`ú%¿VZ%¿VZ%¿`ú%¿Lº$¿Lº$¿VZ%¿VZ%¿VZ%¿VZ%¿`ú%¿`ú%¿Lº$¿VZ%¿VZ%¿VZ%¿`ú%¿`ú%¿`ú%¿VZ%¿VZ%¿t:'¿t:'¿`ú%¿`ú%¿`ú%¿`ú%¿jš&¿jš&¿t:'¿`ú%¿`ú%¿~Ú'¿t:'¿t:'¿jš&¿t:'¿t:'¿jš&¿jš&¿jš&¿~Ú'¿~Ú'¿`ú%¿jš&¿jš&¿jš&¿`ú%¿`ú%¿VZ%¿t:'¿t:'¿`ú%¿jš&¿jš&¿~Ú'¿jš&¿`ú%¿`ú%¿ˆz(¿~Ú'¿jš&¿jš&¿~Ú'¿~Ú'¿~Ú'¿t:'¿t:'¿t:'¿`ú%¿t:'¿t:'¿`ú%¿t:'¿t:'¿jš&¿jš&¿~Ú'¿t:'¿t:'¿jš&¿t:'¿t:'¿jš&¿jš&¿jš&¿t:'¿~Ú'¿~Ú'¿~Ú'¿t:'¿jš&¿t:'¿t:'¿~Ú'¿t:'¿t:'¿~Ú'¿~Ú'¿~Ú'¿ˆz(¿~Ú'¿~Ú'¿~Ú'¿t:'¿t:'¿jš&¿~Ú'¿~Ú'¿~Ú'¿t:'¿t:'¿~Ú'¿~Ú'¿~Ú'¿t:'¿t:'¿jš&¿t:'¿t:'¿~Ú'¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿t:'¿ˆz(¿’)¿t:'¿t:'¿ˆz(¿~Ú'¿~Ú'¿~Ú'¿ˆz(¿ˆz(¿~Ú'¿~Ú'¿~Ú'¿t:'¿t:'¿t:'¿t:'¿t:'¿~Ú'¿ˆz(¿t:'¿~Ú'¿t:'¿t:'¿~Ú'¿t:'¿t:'¿ˆz(¿’)¿’)¿~Ú'¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿t:'¿~Ú'¿’)¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿~Ú'¿~Ú'¿~Ú'¿t:'¿t:'¿t:'¿’)¿~Ú'¿t:'¿~Ú'¿~Ú'¿ˆz(¿t:'¿t:'¿’)¿ˆz(¿ˆz(¿’)¿~Ú'¿~Ú'¿ˆz(¿~Ú'¿~Ú'¿~Ú'¿ˆz(¿’)¿ˆz(¿ˆz(¿’)¿œº)¿œº)¿ˆz(¿’)¿’)¿~Ú'¿ˆz(¿ˆz(¿t:'¿ˆz(¿ˆz(¿t:'¿t:'¿t:'¿ˆz(¿ˆz(¿t:'¿~Ú'¿~Ú'¿~Ú'¿t:'¿t:'¿’)¿ˆz(¿ˆz(¿ˆz(¿’)¿’)¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿~Ú'¿’)¿’)¿t:'¿ˆz(¿ˆz(¿œº)¿~Ú'¿ˆz(¿ˆz(¿t:'¿ˆz(¿~Ú'¿~Ú'¿~Ú'¿’)¿’)¿’)¿ˆz(¿ˆz(¿’)¿’)¿’)¿’)¿œº)¿ˆz(¿~Ú'¿~Ú'¿~Ú'¿ˆz(¿ˆz(¿~Ú'¿’)¿’)¿ˆz(¿ˆz(¿ˆz(¿t:'¿ˆz(¿ˆz(¿~Ú'¿~Ú'¿~Ú'¿’)¿~Ú'¿~Ú'¿~Ú'¿~Ú'¿ˆz(¿~Ú'¿~Ú'¿œº)¿~Ú'¿~Ú'¿ˆz(¿œº)¿’)¿’)¿~Ú'¿~Ú'¿’)¿’)¿’)¿~Ú'¿~Ú'¿~Ú'¿ˆz(¿ˆz(¿t:'¿ˆz(¿ˆz(¿~Ú'¿t:'¿t:'¿’)¿ˆz(¿ˆz(¿ˆz(¿~Ú'¿~Ú'¿~Ú'¿~Ú'¿ˆz(¿~Ú'¿~Ú'¿’)¿~Ú'¿~Ú'¿œº)¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿t:'¿’)¿ˆz(¿’)¿’)¿~Ú'¿ˆz(¿ˆz(¿’)¿~Ú'¿~Ú'¿~Ú'¿~Ú'¿~Ú'¿~Ú'¿ˆz(¿~Ú'¿ˆz(¿ˆz(¿t:'¿’)¿’)¿’)¿~Ú'¿~Ú'¿ˆz(¿~Ú'¿~Ú'¿~Ú'¿ˆz(¿~Ú'¿ˆz(¿~Ú'¿ˆz(¿~Ú'¿~Ú'¿ˆz(¿~Ú'¿~Ú'¿’)¿~Ú'¿~Ú'¿~Ú'¿ˆz(¿ˆz(¿~Ú'¿ˆz(¿ˆz(¿’)¿’)¿~Ú'¿t:'¿t:'¿ˆz(¿’)¿’)¿~Ú'¿~Ú'¿~Ú'¿~Ú'¿t:'¿t:'¿ˆz(¿’)¿’)¿~Ú'¿~Ú'¿œº)¿~Ú'¿~Ú'¿ˆz(¿’)¿’)¿t:'¿ˆz(¿ˆz(¿t:'¿ˆz(¿ˆz(¿t:'¿~Ú'¿~Ú'¿~Ú'¿~Ú'¿~Ú'¿’)¿’)¿t:'¿~Ú'¿~Ú'¿ˆz(¿t:'¿t:'¿’)¿’)¿’)¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿~Ú'¿’)¿t:'¿t:'¿’)¿t:'¿t:'¿~Ú'¿ˆz(¿ˆz(¿t:'¿t:'¿t:'¿~Ú'¿jš&¿jš&¿t:'¿ˆz(¿t:'¿ˆz(¿~Ú'¿~Ú'¿’)¿’)¿ˆz(¿~Ú'¿~Ú'¿ˆz(¿~Ú'¿~Ú'¿ˆz(¿œº)¿œº)¿~Ú'¿ˆz(¿ˆz(¿t:'¿~Ú'¿~Ú'¿ˆz(¿ˆz(¿’)¿~Ú'¿~Ú'¿ˆz(¿~Ú'¿~Ú'¿t:'¿~Ú'¿~Ú'¿ˆz(¿jš&¿t:'¿’)¿~Ú'¿t:'¿ˆz(¿ˆz(¿’)¿~Ú'¿~Ú'¿ˆz(¿’)¿’)¿t:'¿ˆz(¿ˆz(¿’)¿~Ú'¿~Ú'¿ˆz(¿ˆz(¿ˆz(¿~Ú'¿~Ú'¿t:'¿’)¿’)¿t:'¿ˆz(¿ˆz(¿~Ú'¿~Ú'¿ˆz(¿ˆz(¿ˆz(¿~Ú'¿~Ú'¿~Ú'¿ˆz(¿’)¿’)¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿~Ú'¿ˆz(¿ˆz(¿’)¿~Ú'¿~Ú'¿ˆz(¿t:'¿t:'¿~Ú'¿~Ú'¿~Ú'¿~Ú'¿~Ú'¿ˆz(¿ˆz(¿ˆz(¿’)¿~Ú'¿~Ú'¿ˆz(¿’)¿’)¿t:'¿ˆz(¿ˆz(¿œº)¿jš&¿jš&¿’)¿ˆz(¿~Ú'¿~Ú'¿’)¿~Ú'¿œº)¿œº)¿’)¿ˆz(¿ˆz(¿’)¿ˆz(¿ˆz(¿ˆz(¿’)¿’)¿jš&¿ˆz(¿ˆz(¿~Ú'¿t:'¿~Ú'¿ˆz(¿ˆz(¿~Ú'¿’)¿’)¿~Ú'¿ˆz(¿ˆz(¿’)¿~Ú'¿~Ú'¿’)¿~Ú'¿~Ú'¿’)¿œº)¿œº)¿t:'¿’)¿’)¿jš&¿jš&¿~Ú'¿~Ú'¿~Ú'¿t:'¿~Ú'¿~Ú'¿’)¿~Ú'¿~Ú'¿~Ú'¿t:'¿ˆz(¿’)¿’)¿’)¿’)¿’)¿~Ú'¿~Ú'¿~Ú'¿’)¿~Ú'¿~Ú'¿’)¿ˆz(¿ˆz(¿’)¿’)¿~Ú'¿ˆz(¿ˆz(¿t:'¿t:'¿t:'¿’)¿~Ú'¿~Ú'¿t:'¿ˆz(¿ˆz(¿jš&¿ˆz(¿ˆz(¿ˆz(¿t:'¿~Ú'¿ˆz(¿ˆz(¿’)¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿’)¿ˆz(¿ˆz(¿’)¿~Ú'¿~Ú'¿’)¿ˆz(¿~Ú'¿t:'¿t:'¿’)¿t:'¿t:'¿~Ú'¿ˆz(¿ˆz(¿t:'¿~Ú'¿~Ú'¿jš&¿~Ú'¿~Ú'¿~Ú'¿t:'¿t:'¿’)¿~Ú'¿ˆz(¿’)¿’)¿jš&¿’)¿’)¿œº)¿ˆz(¿ˆz(¿ˆz(¿’)¿’)¿t:'¿’)¿’)¿~Ú'¿~Ú'¿~Ú'¿t:'¿t:'¿’)¿ˆz(¿ˆz(¿jš&¿ˆz(¿ˆz(¿t:'¿~Ú'¿~Ú'¿ˆz(¿t:'¿t:'¿ˆz(¿~Ú'¿~Ú'¿ˆz(¿ˆz(¿t:'¿ˆz(¿ˆz(¿~Ú'¿~Ú'¿’)¿ˆz(¿’)¿ˆz(¿ˆz(¿ˆz(¿t:'¿~Ú'¿~Ú'¿ˆz(¿ˆz(¿ˆz(¿ˆz(¿~Ú'¿~Ú'¿t:'¿~Ú'¿t:'¿~Ú'¿~Ú'¿~Ú'¿’)¿’)¿ˆz(¿~Ú'¿~Ú'¿~Ú'¿~Ú'¿~Ú'¿jš&¿jš&¿
    \ No newline at end of file
    Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/sampledata/Minduka_Present_Blue_Pack.png and /tmp/GJbvHcIw6l/matplotlib-1.0.1/sampledata/Minduka_Present_Blue_Pack.png differ
    diff -Nru matplotlib-0.99.3/sampledata/msft.csv matplotlib-1.0.1/sampledata/msft.csv
    --- matplotlib-0.99.3/sampledata/msft.csv	1970-01-01 00:00:00.000000000 +0000
    +++ matplotlib-1.0.1/sampledata/msft.csv	2009-09-06 12:32:28.000000000 +0000
    @@ -0,0 +1,66 @@
    +Date,Open,High,Low,Close,Volume,Adj. Close*
    +19-Sep-03,29.76,29.97,29.52,29.96,92433800,29.79
    +18-Sep-03,28.49,29.51,28.42,29.50,67268096,29.34
    +17-Sep-03,28.76,28.95,28.47,28.50,47221600,28.34
    +16-Sep-03,28.41,28.95,28.32,28.90,52060600,28.74
    +15-Sep-03,28.37,28.61,28.33,28.36,41432300,28.20
    +12-Sep-03,27.48,28.40,27.45,28.34,55777200,28.18
    +11-Sep-03,27.66,28.11,27.59,27.84,37813300,27.68
    +10-Sep-03,28.03,28.18,27.48,27.55,54763500,27.40
    +9-Sep-03,28.65,28.71,28.31,28.37,44315200,28.21
    +8-Sep-03,28.39,28.92,28.34,28.84,46105300,28.68
    +5-Sep-03,28.23,28.75,28.17,28.38,64024500,28.22
    +4-Sep-03,28.10,28.47,27.99,28.43,59840800,28.27
    +3-Sep-03,27.42,28.40,27.38,28.30,109437800,28.14
    +2-Sep-03,26.70,27.30,26.47,27.26,74168896,27.11
    +29-Aug-03,26.46,26.55,26.35,26.52,34503000,26.37
    +28-Aug-03,26.50,26.58,26.24,26.51,46211200,26.36
    +27-Aug-03,26.51,26.58,26.30,26.42,30633900,26.27
    +26-Aug-03,26.31,26.67,25.96,26.57,47546000,26.42
    +25-Aug-03,26.31,26.54,26.23,26.50,36132900,26.35
    +22-Aug-03,26.78,26.95,26.21,26.22,65846300,26.07
    +21-Aug-03,26.65,26.73,26.13,26.24,63802700,26.09
    +20-Aug-03,26.30,26.53,26.00,26.45,56739300,26.30
    +19-Aug-03,25.85,26.65,25.77,26.62,72952896,26.47
    +18-Aug-03,25.56,25.83,25.46,25.70,45817400,25.56
    +15-Aug-03,25.61,25.66,25.43,25.54,27607900,25.40
    +14-Aug-03,25.66,25.71,25.52,25.63,37338300,25.49
    +13-Aug-03,25.79,25.89,25.50,25.60,39636900,25.46
    +12-Aug-03,25.71,25.77,25.45,25.73,38208400,25.59
    +11-Aug-03,25.61,25.99,25.54,25.61,36433900,25.47
    +8-Aug-03,25.88,25.98,25.50,25.58,33241400,25.44
    +7-Aug-03,25.72,25.81,25.45,25.71,44258500,25.57
    +6-Aug-03,25.54,26.19,25.43,25.65,56294900,25.51
    +5-Aug-03,26.31,26.54,25.60,25.66,58825800,25.52
    +4-Aug-03,26.15,26.41,25.75,26.18,51825600,26.03
    +1-Aug-03,26.33,26.51,26.12,26.17,42649700,26.02
    +31-Jul-03,26.60,26.99,26.31,26.41,64504800,26.26
    +30-Jul-03,26.46,26.57,26.17,26.23,41240300,26.08
    +29-Jul-03,26.88,26.90,26.24,26.47,62391100,26.32
    +28-Jul-03,26.94,27.00,26.49,26.61,52658300,26.46
    +25-Jul-03,26.28,26.95,26.07,26.89,54173000,26.74
    +24-Jul-03,26.78,26.92,25.98,26.00,53556600,25.85
    +23-Jul-03,26.42,26.65,26.14,26.45,49828200,26.30
    +22-Jul-03,26.28,26.56,26.13,26.38,51791000,26.23
    +21-Jul-03,26.87,26.91,26.00,26.04,48480800,25.89
    +18-Jul-03,27.11,27.23,26.75,26.89,63388400,26.74
    +17-Jul-03,27.14,27.27,26.54,26.69,72805000,26.54
    +16-Jul-03,27.56,27.62,27.20,27.52,49838900,27.37
    +15-Jul-03,27.47,27.53,27.10,27.27,53567600,27.12
    +14-Jul-03,27.63,27.81,27.05,27.40,60464400,27.25
    +11-Jul-03,26.95,27.45,26.89,27.31,50377300,27.16
    +10-Jul-03,27.25,27.42,26.59,26.91,55350800,26.76
    +9-Jul-03,27.56,27.70,27.25,27.47,62300700,27.32
    +8-Jul-03,27.26,27.80,27.25,27.70,61896800,27.55
    +7-Jul-03,27.02,27.55,26.95,27.42,88960800,27.27
    +3-Jul-03,26.69,26.95,26.41,26.50,39440900,26.35
    +2-Jul-03,26.50,26.93,26.45,26.88,94069296,26.73
    +1-Jul-03,25.59,26.20,25.39,26.15,60926000,26.00
    +30-Jun-03,25.94,26.12,25.50,25.64,48073100,25.50
    +27-Jun-03,25.95,26.34,25.53,25.63,76040304,25.49
    +26-Jun-03,25.39,26.51,25.21,25.75,51758100,25.61
    +25-Jun-03,25.64,25.99,25.14,25.26,60483500,25.12
    +24-Jun-03,25.65,26.04,25.52,25.70,51820300,25.56
    +23-Jun-03,26.14,26.24,25.49,25.78,52584500,25.64
    +20-Jun-03,26.34,26.38,26.01,26.33,86048896,26.18
    +19-Jun-03,26.09,26.39,26.01,26.07,63626900,25.92
    \ No newline at end of file
    Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/sampledata/msft_nasdaq.npy and /tmp/GJbvHcIw6l/matplotlib-1.0.1/sampledata/msft_nasdaq.npy differ
    diff -Nru matplotlib-0.99.3/sampledata/PKG-INFO matplotlib-1.0.1/sampledata/PKG-INFO
    --- matplotlib-0.99.3/sampledata/PKG-INFO	1970-01-01 00:00:00.000000000 +0000
    +++ matplotlib-1.0.1/sampledata/PKG-INFO	2011-01-06 13:57:56.000000000 +0000
    @@ -0,0 +1,10 @@
    +Metadata-Version: 1.0
    +Name: mpl_sampledata
    +Version: 1.0.1
    +Summary: matplotlib sample data
    +Home-page: http://matplotlib.sf.net
    +Author: John Hunter
    +Author-email: jdh2358@gmail.com
    +License: UNKNOWN
    +Description: UNKNOWN
    +Platform: UNKNOWN
    diff -Nru matplotlib-0.99.3/sampledata/README.txt matplotlib-1.0.1/sampledata/README.txt
    --- matplotlib-0.99.3/sampledata/README.txt	1970-01-01 00:00:00.000000000 +0000
    +++ matplotlib-1.0.1/sampledata/README.txt	2011-01-02 22:42:00.000000000 +0000
    @@ -0,0 +1,2 @@
    +This is the sample data needed for some of matplotlib's examples and
    +docs.  See matplotlib.cbook.get_sample_data for more info.
    Binary files /tmp/iBNoJs8LMI/matplotlib-0.99.3/sampledata/s1045.ima and /tmp/GJbvHcIw6l/matplotlib-1.0.1/sampledata/s1045.ima differ
    diff -Nru matplotlib-0.99.3/sampledata/setup.py matplotlib-1.0.1/sampledata/setup.py
    --- matplotlib-0.99.3/sampledata/setup.py	1970-01-01 00:00:00.000000000 +0000
    +++ matplotlib-1.0.1/sampledata/setup.py	2011-01-06 13:57:31.000000000 +0000
    @@ -0,0 +1,9 @@
    +from distutils.core import setup
    +
    +setup(name='mpl_sampledata',
    +            version='1.0.1',
    +            description='matplotlib sample data',
    +            author='John Hunter',
    +            author_email='jdh2358@gmail.com',
    +            url='http://matplotlib.sf.net',
    +           )
    diff -Nru matplotlib-0.99.3/sampledata/testdata.csv matplotlib-1.0.1/sampledata/testdata.csv
    --- matplotlib-0.99.3/sampledata/testdata.csv	1970-01-01 00:00:00.000000000 +0000
    +++ matplotlib-1.0.1/sampledata/testdata.csv	2009-09-06 12:32:28.000000000 +0000
    @@ -0,0 +1,5 @@
    +name,age
    +john,41
    +miriam,38
    +rahel,11
    +
    diff -Nru matplotlib-0.99.3/sampledata/testdir/subdir/testsub.csv matplotlib-1.0.1/sampledata/testdir/subdir/testsub.csv
    --- matplotlib-0.99.3/sampledata/testdir/subdir/testsub.csv	1970-01-01 00:00:00.000000000 +0000
    +++ matplotlib-1.0.1/sampledata/testdir/subdir/testsub.csv	2009-09-06 12:32:28.000000000 +0000
    @@ -0,0 +1,5 @@
    +name,age
    +john,41
    +miriam,38
    +rahel,11
    +
    diff -Nru matplotlib-0.99.3/setup.cfg.template matplotlib-1.0.1/setup.cfg.template
    --- matplotlib-0.99.3/setup.cfg.template	2009-07-31 15:14:51.000000000 +0000
    +++ matplotlib-1.0.1/setup.cfg.template	2010-07-07 01:41:55.000000000 +0000
    @@ -4,6 +4,11 @@
     [egg_info]
     tag_svn_revision = 1
     
    +[directories]
    +# Uncomment to override the default basedir in setupext.py.
    +# This can be a single directory or a space-delimited list of directories.
    +#basedirlist = /usr
    +
     [status]
     # To suppress display of the dependencies and their versions
     # at the top of the build log, uncomment the following line:
    diff -Nru matplotlib-0.99.3/setupegg.py matplotlib-1.0.1/setupegg.py
    --- matplotlib-0.99.3/setupegg.py	2009-07-31 15:14:51.000000000 +0000
    +++ matplotlib-1.0.1/setupegg.py	2010-07-07 01:41:55.000000000 +0000
    @@ -5,4 +5,9 @@
     from setuptools import setup
     execfile('setup.py',
              {'additional_params' :
    -         {'namespace_packages' : ['mpl_toolkits']}})
    +          {'namespace_packages' : ['mpl_toolkits'],
    +           'entry_points': {'nose.plugins':
    +                            [
    +    'KnownFailure =  matplotlib.testing.noseclasses:KnownFailure',
    +    ]
    +                            }}})
    diff -Nru matplotlib-0.99.3/setupext.py matplotlib-1.0.1/setupext.py
    --- matplotlib-0.99.3/setupext.py	2010-03-09 14:20:20.000000000 +0000
    +++ matplotlib-1.0.1/setupext.py	2010-07-07 01:41:55.000000000 +0000
    @@ -1,8 +1,10 @@
     """
     Some helper functions for building the C extensions
     
    -you may need to edit basedir to point to the default location of your
    -required libs, eg, png, z, freetype
    +You may need to use the "basedirlist" option in setup.cfg to point
    +to the location of your required libs, eg, png, z, freetype,
    +overriding the settings hard-coded in the "basedir" directory
    +below.
     
     DARWIN
     
    @@ -71,6 +73,7 @@
         'gnukfreebsd6' : ['/usr/local', '/usr'],
         'gnukfreebsd7' : ['/usr/local', '/usr'],
         'gnukfreebsd8' : ['/usr/local', '/usr'],
    +    'gnu0' : ['/usr'],
         'aix5' : ['/usr/local'],
     }
     
    @@ -99,6 +102,7 @@
     BUILT_CONTOUR   = False
     BUILT_GDK       = False
     BUILT_PATH      = False
    +BUILT_TRI       = False
     
     AGG_VERSION = 'agg24'
     TCL_TK_CACHE = None
    @@ -119,7 +123,12 @@
                'build_macosx': 'auto',
                'build_image': True,
                'build_windowing': True,
    -           'backend': None}
    +           'backend': None,
    +           'basedirlist': None}
    +
    +defines = [
    +        ('PY_ARRAY_UNIQUE_SYMBOL', 'MPL_ARRAY_API'),
    +        ('PYCXX_ISO_CPP_LIB', '1')]
     
     # Based on the contents of setup.cfg, determine the build options
     if os.path.exists("setup.cfg"):
    @@ -157,6 +166,15 @@
         try: options['backend'] = config.get("rc_options", "backend")
         except: pass
     
    +    try: options['basedirlist'] = config.get("directories", "basedirlist")
    +    except: pass
    +
    +# For get_base_flags:
    +if options['basedirlist']:
    +    basedirlist = options['basedirlist'].split()
    +else:
    +    basedirlist = basedir[sys.platform]
    +print "basedirlist is:", basedirlist
     
     if options['display_status']:
         def print_line(char='='):
    @@ -327,10 +345,10 @@
     
     def add_base_flags(module):
         incdirs = filter(os.path.exists,
    -                     [os.path.join(p, 'include') for p in basedir[sys.platform] ])
    +                     [os.path.join(p, 'include') for p in basedirlist ])
         libdirs = filter(os.path.exists,
    -                     [os.path.join(p, 'lib')     for p in basedir[sys.platform] ]+
    -                     [os.path.join(p, 'lib64')     for p in basedir[sys.platform] ] )
    +                     [os.path.join(p, 'lib')     for p in basedirlist ]+
    +                     [os.path.join(p, 'lib64')     for p in basedirlist ] )
     
         module.include_dirs.extend(incdirs)
         module.include_dirs.append('.')
    @@ -499,9 +517,10 @@
             return False
         nn = numpy.__version__.split('.')
         if not (int(nn[0]) >= 1 and int(nn[1]) >= 1):
    -        if not int(nn[0]) >= 1:
    +        if not (int(nn[0]) >= 2):
                 print_message(
    -                'numpy 1.1 or later is required; you have %s' % numpy.__version__)
    +               'numpy 1.1 or later is required; you have %s' %
    +               numpy.__version__)
                 return False
         module = Extension('test', [])
         add_numpy_flags(module)
    @@ -978,7 +997,7 @@
         message = None
         if sys.platform == 'win32':
             major, minor1, minor2, s, tmp = sys.version_info
    -        if major == 2 and minor1 == 6:
    +        if major == 2 and minor1 in [6, 7]:
                 module.include_dirs.extend(['win32_static/include/tcl85'])
                 module.libraries.extend(['tk85', 'tcl85'])
             elif major == 2 and minor1 in [3, 4, 5]:
    @@ -1106,7 +1125,7 @@
         deps.extend(glob.glob('CXX/*.c'))
     
         module = Extension('matplotlib.ft2font', deps,
    -                       define_macros=[('PY_ARRAY_UNIQUE_SYMBOL', 'MPL_ARRAY_API')])
    +                       define_macros=defines)
         add_ft2font_flags(module)
         ext_modules.append(module)
         BUILT_FT2FONT = True
    @@ -1119,7 +1138,8 @@
                 'ttconv/pprdrv_tt2.cpp',
                 'ttconv/ttutil.cpp']
     
    -    module = Extension('matplotlib.ttconv', deps)
    +    module = Extension('matplotlib.ttconv', deps,
    +                       define_macros=defines)
         add_base_flags(module)
         ext_modules.append(module)
         BUILT_TTCONV = True
    @@ -1133,7 +1153,7 @@
     
         module = Extension('matplotlib.backends._gtkagg',
                            deps,
    -                       define_macros=[('PY_ARRAY_UNIQUE_SYMBOL', 'MPL_ARRAY_API')]
    +                       define_macros=defines
                            )
     
         # add agg flags before pygtk because agg only supports freetype1
    @@ -1156,7 +1176,7 @@
     
         module = Extension('matplotlib.backends._tkagg',
                            deps,
    -                       define_macros=[('PY_ARRAY_UNIQUE_SYMBOL', 'MPL_ARRAY_API')]
    +                       define_macros=defines
                            )
     
         add_tk_flags(module) # do this first
    @@ -1199,7 +1219,7 @@
         module = Extension('matplotlib.backends._macosx',
                            deps,
                            extra_link_args = ['-framework','Cocoa'],
    -                       define_macros=[('PY_ARRAY_UNIQUE_SYMBOL', 'MPL_ARRAY_API')]
    +                       define_macros=defines
                           )
         add_numpy_flags(module)
         add_agg_flags(module)
    @@ -1218,7 +1238,7 @@
             'matplotlib._png',
             deps,
             include_dirs=numpy_inc_dirs,
    -        define_macros=[('PY_ARRAY_UNIQUE_SYMBOL', 'MPL_ARRAY_API')]
    +        define_macros=defines
             )
     
         add_png_flags(module)
    @@ -1250,7 +1270,7 @@
             'matplotlib.backends._backend_agg',
             deps,
             include_dirs=numpy_inc_dirs,
    -        define_macros=[('PY_ARRAY_UNIQUE_SYMBOL', 'MPL_ARRAY_API')]
    +        define_macros=defines
             )
     
         add_numpy_flags(module)
    @@ -1283,7 +1303,7 @@
             'matplotlib._path',
             deps,
             include_dirs=numpy_inc_dirs,
    -        define_macros=[('PY_ARRAY_UNIQUE_SYMBOL', 'MPL_ARRAY_API')]
    +        define_macros=defines
             )
     
         add_numpy_flags(module)
    @@ -1312,7 +1332,7 @@
             'matplotlib._image',
             deps,
             include_dirs=numpy_inc_dirs,
    -        define_macros=[('PY_ARRAY_UNIQUE_SYMBOL', 'MPL_ARRAY_API')]
    +        define_macros=defines
             )
     
         add_numpy_flags(module)
    @@ -1333,7 +1353,7 @@
         sourcefiles = [os.path.join('lib/matplotlib/delaunay',s) for s in sourcefiles]
         delaunay = Extension('matplotlib._delaunay',sourcefiles,
                              include_dirs=numpy_inc_dirs,
    -                         define_macros=[('PY_ARRAY_UNIQUE_SYMBOL', 'MPL_ARRAY_API')]
    +                         define_macros=defines
                              )
         add_numpy_flags(delaunay)
         add_base_flags(delaunay)
    @@ -1350,7 +1370,7 @@
             'matplotlib._cntr',
             [ 'src/cntr.c'],
             include_dirs=numpy_inc_dirs,
    -        define_macros=[('PY_ARRAY_UNIQUE_SYMBOL', 'MPL_ARRAY_API')]
    +        define_macros=defines
             )
         add_numpy_flags(module)
         add_base_flags(module)
    @@ -1366,7 +1386,7 @@
             'matplotlib.nxutils',
             [ 'src/nxutils.c'],
             include_dirs=numpy_inc_dirs,
    -        define_macros=[('PY_ARRAY_UNIQUE_SYMBOL', 'MPL_ARRAY_API')]
    +        define_macros=defines
             )
         add_numpy_flags(module)
         add_base_flags(module)
    @@ -1385,7 +1405,7 @@
             ['src/backend_gdk.c'],
             libraries = [],
             include_dirs=numpy_inc_dirs,
    -        define_macros=[('PY_ARRAY_UNIQUE_SYMBOL', 'MPL_ARRAY_API')]
    +        define_macros=defines
             )
     
         add_numpy_flags(module)
    @@ -1395,3 +1415,18 @@
     
         BUILT_GDK = True
     
    +
    +def build_tri(ext_modules, packages):
    +    global BUILT_TRI
    +    if BUILT_TRI: return # only build it if you you haven't already
    +
    +    deps = ['lib/matplotlib/tri/_tri.cpp', 'src/mplutils.cpp']
    +    deps.extend(glob.glob('CXX/*.cxx'))
    +    deps.extend(glob.glob('CXX/*.c'))
    +
    +    module = Extension('matplotlib._tri', deps,
    +                       define_macros=defines)
    +    add_numpy_flags(module)
    +    add_base_flags(module)
    +    ext_modules.append(module)
    +    BUILT_TRI = True
    diff -Nru matplotlib-0.99.3/setup.py matplotlib-1.0.1/setup.py
    --- matplotlib-0.99.3/setup.py	2009-07-31 15:14:51.000000000 +0000
    +++ matplotlib-1.0.1/setup.py	2010-07-07 01:41:55.000000000 +0000
    @@ -42,18 +42,24 @@
          check_for_qt, check_for_qt4, check_for_cairo, \
          check_provide_pytz, check_provide_dateutil,\
          check_for_dvipng, check_for_ghostscript, check_for_latex, \
    -     check_for_pdftops, check_for_datetime, options, build_png
    +     check_for_pdftops, check_for_datetime, options, build_png, build_tri
     #import distutils.sysconfig
     
     # jdh
     packages = [
         'matplotlib',
         'matplotlib.backends',
    +    'matplotlib.backends.qt4_editor',
         'matplotlib.projections',
    +    'matplotlib.testing',
    +    'matplotlib.testing.jpl_units',
    +    'matplotlib.tests',
     #   'matplotlib.toolkits',
         'mpl_toolkits',
         'mpl_toolkits.mplot3d',
         'mpl_toolkits.axes_grid',
    +    'mpl_toolkits.axes_grid1',
    +    'mpl_toolkits.axisartist',
         'matplotlib.sphinxext',
         # The following are deprecated and will be removed.
         'matplotlib.numerix',
    @@ -62,6 +68,7 @@
         'matplotlib.numerix.linear_algebra',
         'matplotlib.numerix.random_array',
         'matplotlib.numerix.fft',
    +    'matplotlib.tri',
     
         ]
     
    @@ -88,6 +95,10 @@
                                   'mpl-data/fonts/pdfcorefonts/*.afm',
                                   'mpl-data/fonts/pdfcorefonts/*.txt',
                                   'mpl-data/fonts/ttf/*.ttf',
    +                              'mpl-data/fonts/ttf/LICENSE_STIX',
    +                              'mpl-data/fonts/ttf/COPYRIGHT.TXT',
    +                              'mpl-data/fonts/ttf/README.TXT',
    +                              'mpl-data/fonts/ttf/RELEASENOTES.TXT',
                                   'mpl-data/images/*.xpm',
                                   'mpl-data/images/*.svg',
                                   'mpl-data/images/*.png',
    @@ -99,6 +110,18 @@
                                   'backends/Matplotlib.nib/*',
                                   ]}
     
    +if 1:
    +    # TODO: exclude these when making release?
    +    baseline_images = glob.glob(os.path.join('lib','matplotlib','tests',
    +                                             'baseline_images','*','*'))
    +    def chop_package(fname):
    +        badstr = os.path.join('lib','matplotlib','')
    +        assert fname.startswith(badstr)
    +        result = fname[ len(badstr): ]
    +        return result
    +    baseline_images = [chop_package(f) for f in baseline_images]
    +    package_data['matplotlib'].extend(baseline_images)
    +
     if not check_for_numpy():
         sys.exit(1)
     
    @@ -111,6 +134,7 @@
     build_delaunay(ext_modules, packages)
     build_nxutils(ext_modules, packages)
     build_path(ext_modules, packages)
    +build_tri(ext_modules, packages)
     
     print_raw("")
     print_raw("OPTIONAL BACKEND DEPENDENCIES")
    diff -Nru matplotlib-0.99.3/src/agg_py_path_iterator.h matplotlib-1.0.1/src/agg_py_path_iterator.h
    --- matplotlib-0.99.3/src/agg_py_path_iterator.h	2009-07-31 15:14:23.000000000 +0000
    +++ matplotlib-1.0.1/src/agg_py_path_iterator.h	2010-07-07 01:41:45.000000000 +0000
    @@ -24,8 +24,8 @@
            underlying data arrays, so that Python reference counting can
            work.
         */
    -    PyArrayObject* m_vertices;
    -    PyArrayObject* m_codes;
    +    Py::Object m_vertices;
    +    Py::Object m_codes;
     
         size_t m_iterator;
         size_t m_total_vertices;
    @@ -39,51 +39,50 @@
     public:
         /* path_obj is an instance of the class Path as defined in path.py */
         inline PathIterator(const Py::Object& path_obj) :
    -    m_vertices(NULL), m_codes(NULL), m_iterator(0), m_should_simplify(false),
    -    m_simplify_threshold(1.0 / 9.0)
    +            m_vertices(), m_codes(), m_iterator(0), m_should_simplify(false),
    +            m_simplify_threshold(1.0 / 9.0)
         {
             Py::Object vertices_obj           = path_obj.getAttr("vertices");
             Py::Object codes_obj              = path_obj.getAttr("codes");
             Py::Object should_simplify_obj    = path_obj.getAttr("should_simplify");
             Py::Object simplify_threshold_obj = path_obj.getAttr("simplify_threshold");
     
    -        m_vertices = (PyArrayObject*)PyArray_FromObject
    -                     (vertices_obj.ptr(), PyArray_DOUBLE, 2, 2);
    -        if (!m_vertices ||
    -            PyArray_DIM(m_vertices, 1) != 2)
    +        PyObject* vertices_arr = PyArray_FromObject(vertices_obj.ptr(), PyArray_DOUBLE, 2, 2);
    +        if (!vertices_arr)
    +        {
    +            throw Py::ValueError("Invalid vertices array.");
    +        }
    +
    +        m_vertices = Py::Object(vertices_arr, true);
    +        if (PyArray_DIM(m_vertices.ptr(), 1) != 2)
             {
    -            Py_XDECREF(m_vertices);
    -            m_vertices = NULL;
                 throw Py::ValueError("Invalid vertices array.");
             }
     
             if (codes_obj.ptr() != Py_None)
             {
    -            m_codes = (PyArrayObject*)PyArray_FromObject
    -                      (codes_obj.ptr(), PyArray_UINT8, 1, 1);
    -            if (!m_codes) {
    -                Py_XDECREF(m_vertices);
    -                m_vertices = NULL;
    +            PyObject* codes_arr = PyArray_FromObject(codes_obj.ptr(), PyArray_UINT8, 1, 1);
    +
    +            if (!codes_arr)
    +            {
                     throw Py::ValueError("Invalid codes array.");
                 }
    -            if (PyArray_DIM(m_codes, 0) != PyArray_DIM(m_vertices, 0)) {
    -                Py_XDECREF(m_vertices);
    -                m_vertices = NULL;
    -                Py_XDECREF(m_codes);
    -                m_codes = NULL;
    +
    +            m_codes = Py::Object(codes_arr, true);
    +            if (PyArray_DIM(m_codes.ptr(), 0) != PyArray_DIM(m_vertices.ptr(), 0))
    +            {
                     throw Py::ValueError("Codes array is wrong length");
                 }
             }
     
             m_should_simplify    = should_simplify_obj.isTrue();
    -        m_total_vertices     = PyArray_DIM(m_vertices, 0);
    +        m_total_vertices     = PyArray_DIM(m_vertices.ptr(), 0);
             m_simplify_threshold = Py::Float(simplify_threshold_obj);
         }
     
         ~PathIterator()
         {
    -        Py_XDECREF(m_vertices);
    -        Py_XDECREF(m_codes);
    +
         }
     
         inline unsigned vertex(double* x, double* y)
    @@ -92,13 +91,13 @@
     
             const size_t idx = m_iterator++;
     
    -        char* pair = (char*)PyArray_GETPTR2(m_vertices, idx, 0);
    +        char* pair = (char*)PyArray_GETPTR2(m_vertices.ptr(), idx, 0);
             *x = *(double*)pair;
    -        *y = *(double*)(pair + PyArray_STRIDE(m_vertices, 1));
    +        *y = *(double*)(pair + PyArray_STRIDE(m_vertices.ptr(), 1));
     
    -        if (m_codes)
    +        if (!m_codes.isNone())
             {
    -            return (unsigned)(*(char *)PyArray_GETPTR1(m_codes, idx));
    +            return (unsigned)(*(char *)PyArray_GETPTR1(m_codes.ptr(), idx));
             }
             else
             {
    @@ -128,7 +127,7 @@
     
         inline bool has_curves()
         {
    -        return m_codes != NULL;
    +        return !m_codes.isNone();
         }
     };
     
    diff -Nru matplotlib-0.99.3/src/_backend_agg.cpp matplotlib-1.0.1/src/_backend_agg.cpp
    --- matplotlib-0.99.3/src/_backend_agg.cpp	2010-03-09 14:20:17.000000000 +0000
    +++ matplotlib-1.0.1/src/_backend_agg.cpp	2010-12-13 15:27:29.000000000 +0000
    @@ -1,11 +1,8 @@
     /* A rewrite of _backend_agg using PyCXX to handle ref counting, etc..
      */
    -#include 
     
    -// To remove a gcc warning
    -#ifdef _POSIX_C_SOURCE
    -#undef _POSIX_C_SOURCE
    -#endif
    +/* Python API mandates Python.h is included *first* */
    +#include "Python.h"
     
     #include "ft2font.h"
     #include "_image.h"
    @@ -31,6 +28,7 @@
     #include "agg_span_image_filter_rgba.h"
     #include "agg_span_interpolator_linear.h"
     #include "agg_span_pattern_rgba.h"
    +#include "agg_span_gouraud_rgba.h"
     #include "agg_conv_shorten_path.h"
     #include "util/agg_color_conv_rgb8.h"
     
    @@ -53,57 +51,82 @@
     /*
      Convert dashes from the Python representation as nested sequences to
      the C++ representation as a std::vector >
    - (GCAgg::dash_t)
    -*/
    -void convert_dashes(const Py::Tuple& dashes, double dpi, GCAgg::dash_t& dashes_out,
    -                    double& dashOffset_out) {
    -  if (dashes.length()!=2)
    -    throw Py::ValueError(Printf("Dash descriptor must be a length 2 tuple; found %d", dashes.length()).str());
    + (GCAgg::dash_t) */
    +void
    +convert_dashes(const Py::Tuple& dashes, double dpi,
    +               GCAgg::dash_t& dashes_out, double& dashOffset_out)
    +{
    +    if (dashes.length() != 2)
    +    {
    +        throw Py::ValueError(
    +            Printf("Dash descriptor must be a length 2 tuple; found %d",
    +                   dashes.length()).str()
    +        );
    +    }
     
    -  dashes_out.clear();
    -  dashOffset_out = 0.0;
    -  if (dashes[0].ptr() == Py_None)
    -    return;
    +    dashes_out.clear();
    +    dashOffset_out = 0.0;
    +    if (dashes[0].ptr() == Py_None)
    +    {
    +        return;
    +    }
     
    -  dashOffset_out = double(Py::Float(dashes[0])) * dpi/72.0;
    +    dashOffset_out = double(Py::Float(dashes[0])) * dpi / 72.0;
     
    -  Py::SeqBase dashSeq = dashes[1];
    +    Py::SeqBase dashSeq = dashes[1];
     
    -  size_t Ndash = dashSeq.length();
    -  if (Ndash % 2 != 0)
    -    throw Py::ValueError(Printf("Dash sequence must be an even length sequence; found %d", Ndash).str());
    +    size_t Ndash = dashSeq.length();
    +    if (Ndash % 2 != 0)
    +    {
    +        throw Py::ValueError(
    +            Printf("Dash sequence must be an even length sequence; found %d", Ndash).str()
    +        );
    +    }
     
    -  dashes_out.clear();
    -  dashes_out.reserve(Ndash / 2);
    +    dashes_out.clear();
    +    dashes_out.reserve(Ndash / 2);
     
    -  double val0, val1;
    -  for (size_t i = 0; i < Ndash; i += 2) {
    -    val0 = double(Py::Float(dashSeq[i])) * dpi/72.0;
    -    val1 = double(Py::Float(dashSeq[i+1])) * dpi/72.0;
    -    dashes_out.push_back(std::make_pair(val0, val1));
    -  }
    +    double val0, val1;
    +    for (size_t i = 0; i < Ndash; i += 2)
    +    {
    +        val0 = double(Py::Float(dashSeq[i])) * dpi / 72.0;
    +        val1 = double(Py::Float(dashSeq[i+1])) * dpi / 72.0;
    +        dashes_out.push_back(std::make_pair(val0, val1));
    +    }
     }
     
    -Py::Object BufferRegion::to_string(const Py::Tuple &args) {
    -  // owned=true to prevent memory leak
    -  return Py::String(PyString_FromStringAndSize((const char*)data, height*stride), true);
    +
    +Py::Object
    +BufferRegion::to_string(const Py::Tuple &args)
    +{
    +    // owned=true to prevent memory leak
    +    return Py::String(PyString_FromStringAndSize((const char*)data, height*stride), true);
     }
     
    -Py::Object BufferRegion::set_x(const Py::Tuple &args) {
    +
    +Py::Object
    +BufferRegion::set_x(const Py::Tuple &args)
    +{
         args.verify_length(1);
    -    size_t x = Py::Int( args[0] );
    +    size_t x = Py::Int(args[0]);
         rect.x1 = x;
         return Py::Object();
     }
     
    -Py::Object BufferRegion::set_y(const Py::Tuple &args) {
    +
    +Py::Object
    +BufferRegion::set_y(const Py::Tuple &args)
    +{
         args.verify_length(1);
    -    size_t y = Py::Int( args[0] );
    +    size_t y = Py::Int(args[0]);
         rect.y1 = y;
         return Py::Object();
     }
     
    -Py::Object BufferRegion::get_extents(const Py::Tuple &args) {
    +
    +Py::Object
    +BufferRegion::get_extents(const Py::Tuple &args)
    +{
         args.verify_length(0);
     
         Py::Tuple extents(4);
    @@ -115,569 +138,682 @@
         return extents;
     }
     
    -Py::Object BufferRegion::to_string_argb(const Py::Tuple &args) {
    -  // owned=true to prevent memory leak
    -  Py_ssize_t length;
    -  unsigned char* pix;
    -  unsigned char* begin;
    -  unsigned char* end;
    -  unsigned char tmp;
    -  size_t i, j;
    -
    -  PyObject* str = PyString_FromStringAndSize((const char*)data, height*stride);
    -  if (PyString_AsStringAndSize(str, (char**)&begin, &length)) {
    -    throw Py::TypeError("Could not create memory for blit");
    -  }
    -
    -  pix = begin;
    -  end = begin + (height * stride);
    -  for (i = 0; i < (size_t)height; ++i) {
    -    pix = begin + i * stride;
    -    for (j = 0; j < (size_t)width; ++j) {
    -      // Convert rgba to argb
    -      tmp = pix[2];
    -      pix[2] = pix[0];
    -      pix[0] = tmp;
    -      pix += 4;
    +
    +Py::Object
    +BufferRegion::to_string_argb(const Py::Tuple &args)
    +{
    +    // owned=true to prevent memory leak
    +    Py_ssize_t length;
    +    unsigned char* pix;
    +    unsigned char* begin;
    +    unsigned char* end;
    +    unsigned char tmp;
    +    size_t i, j;
    +
    +    PyObject* str = PyString_FromStringAndSize(
    +                        (const char*)data, height * stride);
    +    if (PyString_AsStringAndSize(str, (char**)&begin, &length))
    +    {
    +        throw Py::TypeError("Could not create memory for blit");
    +    }
    +
    +    pix = begin;
    +    end = begin + (height * stride);
    +    for (i = 0; i < (size_t)height; ++i)
    +    {
    +        pix = begin + i * stride;
    +        for (j = 0; j < (size_t)width; ++j)
    +        {
    +            // Convert rgba to argb
    +            tmp = pix[2];
    +            pix[2] = pix[0];
    +            pix[0] = tmp;
    +            pix += 4;
    +        }
         }
    -  }
     
    -  return Py::String(str, true);
    +    return Py::String(str, true);
     }
     
    +
     GCAgg::GCAgg(const Py::Object &gc, double dpi) :
    -  dpi(dpi), isaa(true), linewidth(1.0), alpha(1.0),
    -  dashOffset(0.0)
    +        dpi(dpi), isaa(true), dashOffset(0.0)
     {
    -  _VERBOSE("GCAgg::GCAgg");
    -  linewidth = points_to_pixels ( gc.getAttr("_linewidth") ) ;
    -  alpha = Py::Float( gc.getAttr("_alpha") );
    -  color = get_color(gc);
    -  _set_antialiased(gc);
    -  _set_linecap(gc);
    -  _set_joinstyle(gc);
    -  _set_dashes(gc);
    -  _set_clip_rectangle(gc);
    -  _set_clip_path(gc);
    -  _set_snap(gc);
    -  _set_hatch_path(gc);
    -}
    -
    -GCAgg::GCAgg(double dpi) :
    -  dpi(dpi), isaa(true),
    -  cap(agg::butt_cap), join(agg::round_join), linewidth(1.0), alpha(1.0),
    -  dashOffset(0.0)
    -{
    -
    +    _VERBOSE("GCAgg::GCAgg");
    +    linewidth = points_to_pixels(gc.getAttr("_linewidth")) ;
    +    alpha = Py::Float(gc.getAttr("_alpha"));
    +    color = get_color(gc);
    +    _set_antialiased(gc);
    +    _set_linecap(gc);
    +    _set_joinstyle(gc);
    +    _set_dashes(gc);
    +    _set_clip_rectangle(gc);
    +    _set_clip_path(gc);
    +    _set_snap(gc);
    +    _set_hatch_path(gc);
     }
     
    +
     void
    -GCAgg::_set_antialiased(const Py::Object& gc) {
    -  _VERBOSE("GCAgg::antialiased");
    -  isaa = Py::Int( gc.getAttr( "_antialiased") );
    +GCAgg::_set_antialiased(const Py::Object& gc)
    +{
    +    _VERBOSE("GCAgg::antialiased");
    +    isaa = Py::Int(gc.getAttr("_antialiased"));
     }
     
    +
     agg::rgba
    -GCAgg::get_color(const Py::Object& gc) {
    -  _VERBOSE("GCAgg::get_color");
    -  Py::Tuple rgb = Py::Tuple( gc.getAttr("_rgb") );
    -
    -  double alpha = Py::Float( gc.getAttr("_alpha") );
    -
    -  double r = Py::Float(rgb[0]);
    -  double g = Py::Float(rgb[1]);
    -  double b = Py::Float(rgb[2]);
    -  return agg::rgba(r, g, b, alpha);
    +GCAgg::get_color(const Py::Object& gc)
    +{
    +    _VERBOSE("GCAgg::get_color");
    +    Py::Tuple rgb = Py::Tuple(gc.getAttr("_rgb"));
    +
    +    double alpha = Py::Float(gc.getAttr("_alpha"));
    +
    +    double r = Py::Float(rgb[0]);
    +    double g = Py::Float(rgb[1]);
    +    double b = Py::Float(rgb[2]);
    +    return agg::rgba(r, g, b, alpha);
     }
     
    +
     double
    -GCAgg::points_to_pixels( const Py::Object& points) {
    -  _VERBOSE("GCAgg::points_to_pixels");
    -  double p = Py::Float( points ) ;
    -  return p * dpi/72.0;
    +GCAgg::points_to_pixels(const Py::Object& points)
    +{
    +    _VERBOSE("GCAgg::points_to_pixels");
    +    double p = Py::Float(points) ;
    +    return p * dpi / 72.0;
     }
     
    +
     void
    -GCAgg::_set_linecap(const Py::Object& gc) {
    -  _VERBOSE("GCAgg::_set_linecap");
    +GCAgg::_set_linecap(const Py::Object& gc)
    +{
    +    _VERBOSE("GCAgg::_set_linecap");
     
    -  std::string capstyle = Py::String( gc.getAttr( "_capstyle" ) );
    +    std::string capstyle = Py::String(gc.getAttr("_capstyle"));
     
    -  if (capstyle=="butt")
    -    cap = agg::butt_cap;
    -  else if (capstyle=="round")
    -    cap = agg::round_cap;
    -  else if(capstyle=="projecting")
    -    cap = agg::square_cap;
    -  else
    -    throw Py::ValueError(Printf("GC _capstyle attribute must be one of butt, round, projecting; found %s", capstyle.c_str()).str());
    +    if (capstyle == "butt")
    +    {
    +        cap = agg::butt_cap;
    +    }
    +    else if (capstyle == "round")
    +    {
    +        cap = agg::round_cap;
    +    }
    +    else if (capstyle == "projecting")
    +    {
    +        cap = agg::square_cap;
    +    }
    +    else
    +    {
    +        throw Py::ValueError(Printf("GC _capstyle attribute must be one of butt, round, projecting; found %s", capstyle.c_str()).str());
    +    }
     }
     
    +
     void
    -GCAgg::_set_joinstyle(const Py::Object& gc) {
    -  _VERBOSE("GCAgg::_set_joinstyle");
    +GCAgg::_set_joinstyle(const Py::Object& gc)
    +{
    +    _VERBOSE("GCAgg::_set_joinstyle");
     
    -  std::string joinstyle = Py::String( gc.getAttr("_joinstyle") );
    +    std::string joinstyle = Py::String(gc.getAttr("_joinstyle"));
     
    -  if (joinstyle=="miter")
    -    join =  agg::miter_join_revert;
    -  else if (joinstyle=="round")
    -    join = agg::round_join;
    -  else if(joinstyle=="bevel")
    -    join = agg::bevel_join;
    -  else
    -    throw Py::ValueError(Printf("GC _joinstyle attribute must be one of butt, round, projecting; found %s", joinstyle.c_str()).str());
    +    if (joinstyle == "miter")
    +    {
    +        join = agg::miter_join_revert;
    +    }
    +    else if (joinstyle == "round")
    +    {
    +        join = agg::round_join;
    +    }
    +    else if (joinstyle == "bevel")
    +    {
    +        join = agg::bevel_join;
    +    }
    +    else
    +    {
    +        throw Py::ValueError(Printf("GC _joinstyle attribute must be one of butt, round, projecting; found %s", joinstyle.c_str()).str());
    +    }
     }
     
    +
     void
    -GCAgg::_set_dashes(const Py::Object& gc) {
    -  //return the dashOffset, dashes sequence tuple.
    -  _VERBOSE("GCAgg::_set_dashes");
    -
    -  Py::Object dash_obj( gc.getAttr( "_dashes" ) );
    -  if (dash_obj.ptr() == Py_None) {
    -    dashes.clear();
    -    return;
    -  }
    +GCAgg::_set_dashes(const Py::Object& gc)
    +{
    +    //return the dashOffset, dashes sequence tuple.
    +    _VERBOSE("GCAgg::_set_dashes");
     
    -  convert_dashes(dash_obj, dpi, dashes, dashOffset);
    +    Py::Object dash_obj(gc.getAttr("_dashes"));
    +    if (dash_obj.ptr() == Py_None)
    +    {
    +        dashes.clear();
    +        return;
    +    }
    +
    +    convert_dashes(dash_obj, dpi, dashes, dashOffset);
     }
     
    +
     void
    -GCAgg::_set_clip_rectangle( const Py::Object& gc) {
    -  //set the clip rectangle from the gc
    +GCAgg::_set_clip_rectangle(const Py::Object& gc)
    +{
    +    //set the clip rectangle from the gc
     
    -  _VERBOSE("GCAgg::_set_clip_rectangle");
    +    _VERBOSE("GCAgg::_set_clip_rectangle");
     
    -  Py::Object o ( gc.getAttr( "_cliprect" ) );
    -  cliprect = o;
    +    Py::Object o(gc.getAttr("_cliprect"));
    +    cliprect = o;
     }
     
    +
     void
    -GCAgg::_set_clip_path( const Py::Object& gc) {
    -  //set the clip path from the gc
    +GCAgg::_set_clip_path(const Py::Object& gc)
    +{
    +    //set the clip path from the gc
     
    -  _VERBOSE("GCAgg::_set_clip_path");
    +    _VERBOSE("GCAgg::_set_clip_path");
     
    -  Py::Object method_obj = gc.getAttr("get_clip_path");
    -  Py::Callable method(method_obj);
    -  Py::Tuple path_and_transform = method.apply(Py::Tuple());
    -  if (path_and_transform[0].ptr() != Py_None) {
    -    clippath = path_and_transform[0];
    -    clippath_trans = py_to_agg_transformation_matrix(path_and_transform[1].ptr());
    -  }
    +    Py::Object method_obj = gc.getAttr("get_clip_path");
    +    Py::Callable method(method_obj);
    +    Py::Tuple path_and_transform = method.apply(Py::Tuple());
    +    if (path_and_transform[0].ptr() != Py_None)
    +    {
    +        clippath = path_and_transform[0];
    +        clippath_trans = py_to_agg_transformation_matrix(path_and_transform[1].ptr());
    +    }
     }
     
    +
     void
    -GCAgg::_set_snap( const Py::Object& gc) {
    -  //set the snap setting
    +GCAgg::_set_snap(const Py::Object& gc)
    +{
    +    //set the snap setting
     
    -  _VERBOSE("GCAgg::_set_snap");
    +    _VERBOSE("GCAgg::_set_snap");
     
    -  Py::Object method_obj = gc.getAttr("get_snap");
    -  Py::Callable method(method_obj);
    -  Py::Object py_snap = method.apply(Py::Tuple());
    -  if (py_snap.isNone()) {
    -    quantize_mode = QUANTIZE_AUTO;
    -  } else if (py_snap.isTrue()) {
    -    quantize_mode = QUANTIZE_TRUE;
    -  } else {
    -    quantize_mode = QUANTIZE_FALSE;
    -  }
    +    Py::Object method_obj = gc.getAttr("get_snap");
    +    Py::Callable method(method_obj);
    +    Py::Object py_snap = method.apply(Py::Tuple());
    +    if (py_snap.isNone())
    +    {
    +        snap_mode = SNAP_AUTO;
    +    }
    +    else if (py_snap.isTrue())
    +    {
    +        snap_mode = SNAP_TRUE;
    +    }
    +    else
    +    {
    +        snap_mode = SNAP_FALSE;
    +    }
     }
     
    +
     void
    -GCAgg::_set_hatch_path( const Py::Object& gc) {
    -  _VERBOSE("GCAgg::_set_hatch_path");
    +GCAgg::_set_hatch_path(const Py::Object& gc)
    +{
    +    _VERBOSE("GCAgg::_set_hatch_path");
     
    -  Py::Object method_obj = gc.getAttr("get_hatch_path");
    -  Py::Callable method(method_obj);
    -  hatchpath = method.apply(Py::Tuple());
    +    Py::Object method_obj = gc.getAttr("get_hatch_path");
    +    Py::Callable method(method_obj);
    +    hatchpath = method.apply(Py::Tuple());
     }
     
    +
     const size_t
     RendererAgg::PIXELS_PER_INCH(96);
     
    +
     RendererAgg::RendererAgg(unsigned int width, unsigned int height, double dpi,
                              int debug) :
    -  width(width),
    -  height(height),
    -  dpi(dpi),
    -  NUMBYTES(width*height*4),
    -  pixBuffer(NULL),
    -  renderingBuffer(),
    -  alphaBuffer(NULL),
    -  alphaMaskRenderingBuffer(),
    -  alphaMask(alphaMaskRenderingBuffer),
    -  pixfmtAlphaMask(alphaMaskRenderingBuffer),
    -  rendererBaseAlphaMask(),
    -  rendererAlphaMask(),
    -  scanlineAlphaMask(),
    -  slineP8(),
    -  slineBin(),
    -  pixFmt(),
    -  rendererBase(),
    -  rendererAA(),
    -  rendererBin(),
    -  theRasterizer(),
    -  debug(debug)
    -{
    -  _VERBOSE("RendererAgg::RendererAgg");
    -  unsigned stride(width*4);
    -
    -  pixBuffer       = new agg::int8u[NUMBYTES];
    -  renderingBuffer.attach(pixBuffer, width, height, stride);
    -  pixFmt.attach(renderingBuffer);
    -  rendererBase.attach(pixFmt);
    -  rendererBase.clear(agg::rgba(1, 1, 1, 0));
    -  rendererAA.attach(rendererBase);
    -  rendererBin.attach(rendererBase);
    -  hatchRenderingBuffer.attach(hatchBuffer, HATCH_SIZE, HATCH_SIZE, HATCH_SIZE*4);
    +    width(width),
    +    height(height),
    +    dpi(dpi),
    +    NUMBYTES(width*height*4),
    +    pixBuffer(NULL),
    +    renderingBuffer(),
    +    alphaBuffer(NULL),
    +    alphaMaskRenderingBuffer(),
    +    alphaMask(alphaMaskRenderingBuffer),
    +    pixfmtAlphaMask(alphaMaskRenderingBuffer),
    +    rendererBaseAlphaMask(),
    +    rendererAlphaMask(),
    +    scanlineAlphaMask(),
    +    slineP8(),
    +    slineBin(),
    +    pixFmt(),
    +    rendererBase(),
    +    rendererAA(),
    +    rendererBin(),
    +    theRasterizer(),
    +    debug(debug)
    +{
    +    _VERBOSE("RendererAgg::RendererAgg");
    +    unsigned stride(width*4);
    +
    +    pixBuffer = new agg::int8u[NUMBYTES];
    +    renderingBuffer.attach(pixBuffer, width, height, stride);
    +    pixFmt.attach(renderingBuffer);
    +    rendererBase.attach(pixFmt);
    +    rendererBase.clear(agg::rgba(1, 1, 1, 0));
    +    rendererAA.attach(rendererBase);
    +    rendererBin.attach(rendererBase);
    +    hatchRenderingBuffer.attach(hatchBuffer, HATCH_SIZE, HATCH_SIZE,
    +                                HATCH_SIZE*4);
     }
     
    -void RendererAgg::create_alpha_buffers() {
    -  if (!alphaBuffer) {
    -    unsigned stride(width*4);
    -    alphaBuffer            = new agg::int8u[NUMBYTES];
    -    alphaMaskRenderingBuffer.attach(alphaBuffer, width, height, stride);
    -    rendererBaseAlphaMask.attach(pixfmtAlphaMask);
    -    rendererAlphaMask.attach(rendererBaseAlphaMask);
    -  }
    +
    +void
    +RendererAgg::create_alpha_buffers()
    +{
    +    if (!alphaBuffer)
    +    {
    +        unsigned stride(width*4);
    +        alphaBuffer = new agg::int8u[NUMBYTES];
    +        alphaMaskRenderingBuffer.attach(alphaBuffer, width, height, stride);
    +        rendererBaseAlphaMask.attach(pixfmtAlphaMask);
    +        rendererAlphaMask.attach(rendererBaseAlphaMask);
    +    }
     }
     
    +
     template
     void
    -RendererAgg::set_clipbox(const Py::Object& cliprect, R& rasterizer) {
    -  //set the clip rectangle from the gc
    +RendererAgg::set_clipbox(const Py::Object& cliprect, R& rasterizer)
    +{
    +    //set the clip rectangle from the gc
     
    -  _VERBOSE("RendererAgg::set_clipbox");
    +    _VERBOSE("RendererAgg::set_clipbox");
     
    -  double l, b, r, t;
    -  if (py_convert_bbox(cliprect.ptr(), l, b, r, t)) {
    -    rasterizer.clip_box(int(mpl_round(l)), height - int(mpl_round(b)),
    -                        int(mpl_round(r)), height - int(mpl_round(t)));
    -  }
    +    double l, b, r, t;
    +    if (py_convert_bbox(cliprect.ptr(), l, b, r, t))
    +    {
    +        rasterizer.clip_box(int(mpl_round(l)), height - int(mpl_round(b)),
    +                            int(mpl_round(r)), height - int(mpl_round(t)));
    +    }
    +    else
    +    {
    +        rasterizer.clip_box(0, 0, width, height);
    +    }
     
    -  _VERBOSE("RendererAgg::set_clipbox done");
    +    _VERBOSE("RendererAgg::set_clipbox done");
     }
     
    +
     std::pair
    -RendererAgg::_get_rgba_face(const Py::Object& rgbFace, double alpha) {
    -  _VERBOSE("RendererAgg::_get_rgba_face");
    -  std::pair face;
    -
    -  if (rgbFace.ptr() == Py_None) {
    -    face.first = false;
    -  }
    -  else {
    -    face.first = true;
    -    Py::Tuple rgb = Py::Tuple(rgbFace);
    -    face.second = rgb_to_color(rgb, alpha);
    -  }
    -  return face;
    +RendererAgg::_get_rgba_face(const Py::Object& rgbFace, double alpha)
    +{
    +    _VERBOSE("RendererAgg::_get_rgba_face");
    +    std::pair face;
    +
    +    if (rgbFace.ptr() == Py_None)
    +    {
    +        face.first = false;
    +    }
    +    else
    +    {
    +        face.first = true;
    +        Py::Tuple rgb = Py::Tuple(rgbFace);
    +        face.second = rgb_to_color(rgb, alpha);
    +    }
    +    return face;
     }
     
    +
     Py::Object
    -RendererAgg::copy_from_bbox(const Py::Tuple& args) {
    -  //copy region in bbox to buffer and return swig/agg buffer object
    -  args.verify_length(1);
    -
    -  Py::Object box_obj = args[0];
    -  double l, b, r, t;
    -  if (!py_convert_bbox(box_obj.ptr(), l, b, r, t))
    -    throw Py::TypeError("Invalid bbox provided to copy_from_bbox");
    -
    -  //  std::cout << l << " " << b << " " << r << " " << t << " " << (height - (int)b) << " " << height - (int)t << std::endl;
    -  agg::rect_i rect((int)l, height - (int)t, (int)r, height - (int)b);
    -
    -  BufferRegion* reg = NULL;
    -  try {
    -    reg = new BufferRegion(rect, true);
    -  } catch (...) {
    -    throw Py::MemoryError("RendererAgg::copy_from_bbox could not allocate memory for buffer");
    -  }
    -
    -  if (!reg) {
    -    throw Py::MemoryError("RendererAgg::copy_from_bbox could not allocate memory for buffer");
    -  }
    +RendererAgg::copy_from_bbox(const Py::Tuple& args)
    +{
    +    //copy region in bbox to buffer and return swig/agg buffer object
    +    args.verify_length(1);
     
    -  try {
    -    agg::rendering_buffer rbuf;
    -    rbuf.attach(reg->data, reg->width, reg->height, reg->stride);
    +    Py::Object box_obj = args[0];
    +    double l, b, r, t;
    +    if (!py_convert_bbox(box_obj.ptr(), l, b, r, t))
    +    {
    +        throw Py::TypeError("Invalid bbox provided to copy_from_bbox");
    +    }
    +
    +    agg::rect_i rect((int)l, height - (int)t, (int)r, height - (int)b);
    +
    +    BufferRegion* reg = NULL;
    +    try
    +    {
    +        reg = new BufferRegion(rect, true);
    +    }
    +    catch (...)
    +    {
    +        throw Py::MemoryError(
    +            "RendererAgg::copy_from_bbox could not allocate memory for buffer");
    +    }
    +
    +    if (!reg)
    +    {
    +        throw Py::MemoryError(
    +            "RendererAgg::copy_from_bbox could not allocate memory for buffer");
    +    }
    +
    +    try
    +    {
    +        agg::rendering_buffer rbuf;
    +        rbuf.attach(reg->data, reg->width, reg->height, reg->stride);
     
    -    pixfmt pf(rbuf);
    -    renderer_base rb(pf);
    -    rb.copy_from(renderingBuffer, &rect, -rect.x1, -rect.y1);
    -  } catch (...) {
    -    delete reg;
    -    throw Py::RuntimeError("An unknown error occurred in copy_from_bbox");
    -  }
    -  return Py::asObject(reg);
    +        pixfmt pf(rbuf);
    +        renderer_base rb(pf);
    +        rb.copy_from(renderingBuffer, &rect, -rect.x1, -rect.y1);
    +    }
    +    catch (...)
    +    {
    +        delete reg;
    +        throw Py::RuntimeError("An unknown error occurred in copy_from_bbox");
    +    }
    +    return Py::asObject(reg);
     }
     
    -Py::Object
    -RendererAgg::restore_region(const Py::Tuple& args) {
    -  //copy BufferRegion to buffer
    -  args.verify_length(1);
    -  BufferRegion* region  = static_cast(args[0].ptr());
     
    -  if (region->data==NULL)
    -    throw Py::ValueError("Cannot restore_region from NULL data");
    -    //return Py::Object();
    +Py::Object
    +RendererAgg::restore_region(const Py::Tuple& args)
    +{
    +    //copy BufferRegion to buffer
    +    args.verify_length(1);
    +    BufferRegion* region  = static_cast(args[0].ptr());
     
    -  //std::cout << "restoring " << region->width << " " << region->height << " " << region->stride << " " << region->rect.x1 << " " << region->rect.y1 << std::endl;
    +    if (region->data == NULL)
    +    {
    +        throw Py::ValueError("Cannot restore_region from NULL data");
    +    }
     
    -  agg::rendering_buffer rbuf;
    -  rbuf.attach(region->data,
    -              region->width,
    -              region->height,
    -              region->stride);
    +    agg::rendering_buffer rbuf;
    +    rbuf.attach(region->data,
    +                region->width,
    +                region->height,
    +                region->stride);
     
    -  rendererBase.copy_from(rbuf, 0, region->rect.x1, region->rect.y1);
    +    rendererBase.copy_from(rbuf, 0, region->rect.x1, region->rect.y1);
     
    -  return Py::Object();
    +    return Py::Object();
     }
     
    +
     // Restore the part of the saved region with offsets
     Py::Object
    -RendererAgg::restore_region2(const Py::Tuple& args) {
    -  //copy BufferRegion to buffer
    -  args.verify_length(7);
    +RendererAgg::restore_region2(const Py::Tuple& args)
    +{
    +    //copy BufferRegion to buffer
    +    args.verify_length(7);
    +
    +    int x(0), y(0), xx1(0), yy1(0), xx2(0), yy2(0);
    +    try
    +    {
    +        xx1 = Py::Int(args[1]);
    +        yy1 = Py::Int(args[2]);
    +        xx2 = Py::Int(args[3]);
    +        yy2 = Py::Int(args[4]);
    +        x = Py::Int(args[5]);
    +        y = Py::Int(args[6]);
    +    }
    +    catch (Py::TypeError)
    +    {
    +        throw Py::TypeError("Invalid input arguments to restore_region2");
    +    }
     
     
    +    BufferRegion* region  = static_cast(args[0].ptr());
    +
    +    if (region->data == NULL)
    +    {
    +        throw Py::ValueError("Cannot restore_region from NULL data");
    +    }
     
    -  int x(0),y(0), xx1(0),yy1(0), xx2(0), yy2(0);
    -  try {
    -    xx1 = Py::Int( args[1] );
    -    yy1 = Py::Int( args[2] );
    -    xx2 = Py::Int( args[3] );
    -    yy2 = Py::Int( args[4] );
    -    x = Py::Int( args[5] );
    -    y = Py::Int( args[6] );
    -  }
    -  catch (Py::TypeError) {
    -    throw Py::TypeError("Invalid input arguments to draw_text_image");
    -  }
    +    agg::rect_i rect(xx1 - region->rect.x1, (yy1 - region->rect.y1),
    +                     xx2 - region->rect.x1, (yy2 - region->rect.y1));
     
    +    agg::rendering_buffer rbuf;
    +    rbuf.attach(region->data,
    +                region->width,
    +                region->height,
    +                region->stride);
     
    -  BufferRegion* region  = static_cast(args[0].ptr());
    +    rendererBase.copy_from(rbuf, &rect, x, y);
     
    -  if (region->data==NULL)
    -    throw Py::ValueError("Cannot restore_region from NULL data");
    +    return Py::Object();
    +}
     
    -  agg::rect_i rect(xx1-region->rect.x1, (yy1-region->rect.y1),
    -                   xx2-region->rect.x1, (yy2-region->rect.y1));
     
    +bool
    +RendererAgg::render_clippath(const Py::Object& clippath,
    +                             const agg::trans_affine& clippath_trans)
    +{
    +    typedef agg::conv_transform transformed_path_t;
    +    typedef agg::conv_curve curve_t;
     
    -  agg::rendering_buffer rbuf;
    -  rbuf.attach(region->data,
    -              region->width,
    -              region->height,
    -              region->stride);
    +    bool has_clippath = (clippath.ptr() != Py_None);
     
    -  rendererBase.copy_from(rbuf, &rect, x, y);
    +    if (has_clippath &&
    +        (clippath.ptr() != lastclippath.ptr() ||
    +         clippath_trans != lastclippath_transform))
    +    {
    +        create_alpha_buffers();
    +        agg::trans_affine trans(clippath_trans);
    +        trans *= agg::trans_affine_scaling(1.0, -1.0);
    +        trans *= agg::trans_affine_translation(0.0, (double)height);
    +
    +        PathIterator clippath_iter(clippath);
    +        rendererBaseAlphaMask.clear(agg::gray8(0, 0));
    +        transformed_path_t transformed_clippath(clippath_iter, trans);
    +        agg::conv_curve curved_clippath(transformed_clippath);
    +        theRasterizer.add_path(curved_clippath);
    +        rendererAlphaMask.color(agg::gray8(255, 255));
    +        agg::render_scanlines(theRasterizer, scanlineAlphaMask, rendererAlphaMask);
    +        lastclippath = clippath;
    +        lastclippath_transform = clippath_trans;
    +    }
     
    -  return Py::Object();
    +    return has_clippath;
     }
     
    +#define MARKER_CACHE_SIZE 512
    +
     
    -bool RendererAgg::render_clippath(const Py::Object& clippath, const agg::trans_affine& clippath_trans) {
    -  typedef agg::conv_transform transformed_path_t;
    -  typedef agg::conv_curve curve_t;
    +Py::Object
    +RendererAgg::draw_markers(const Py::Tuple& args)
    +{
    +    typedef agg::conv_transform                  transformed_path_t;
    +    typedef PathSnapper                    snap_t;
    +    typedef agg::conv_curve                            curve_t;
    +    typedef agg::conv_stroke                          stroke_t;
    +    typedef agg::pixfmt_amask_adaptor pixfmt_amask_type;
    +    typedef agg::renderer_base              amask_ren_type;
    +    typedef agg::renderer_scanline_aa_solid    amask_aa_renderer_type;
    +    typedef agg::renderer_scanline_bin_solid   amask_bin_renderer_type;
    +    args.verify_length(5, 6);
    +
    +    Py::Object        gc_obj          = args[0];
    +    Py::Object        marker_path_obj = args[1];
    +    agg::trans_affine marker_trans    = py_to_agg_transformation_matrix(args[2].ptr());
    +    Py::Object        path_obj        = args[3];
    +    agg::trans_affine trans           = py_to_agg_transformation_matrix(args[4].ptr());
    +    Py::Object        face_obj;
    +    if (args.size() == 6)
    +    {
    +        face_obj = args[5];
    +    }
     
    -  bool has_clippath = (clippath.ptr() != Py_None);
    +    GCAgg gc(gc_obj, dpi);
     
    -  if (has_clippath &&
    -      (clippath.ptr() != lastclippath.ptr() ||
    -       clippath_trans != lastclippath_transform)) {
    -    create_alpha_buffers();
    -    agg::trans_affine trans(clippath_trans);
    +    // Deal with the difference in y-axis direction
    +    marker_trans *= agg::trans_affine_scaling(1.0, -1.0);
         trans *= agg::trans_affine_scaling(1.0, -1.0);
         trans *= agg::trans_affine_translation(0.0, (double)height);
     
    -    PathIterator clippath_iter(clippath);
    -    rendererBaseAlphaMask.clear(agg::gray8(0, 0));
    -    transformed_path_t transformed_clippath(clippath_iter, trans);
    -    agg::conv_curve curved_clippath(transformed_clippath);
    -    theRasterizer.add_path(curved_clippath);
    -    rendererAlphaMask.color(agg::gray8(255, 255));
    -    agg::render_scanlines(theRasterizer, scanlineAlphaMask, rendererAlphaMask);
    -    lastclippath = clippath;
    -    lastclippath_transform = clippath_trans;
    -  }
    -
    -  return has_clippath;
    -}
    +    PathIterator       marker_path(marker_path_obj);
    +    transformed_path_t marker_path_transformed(marker_path, marker_trans);
    +    snap_t             marker_path_snapped(marker_path_transformed,
    +                                           gc.snap_mode,
    +                                           marker_path.total_vertices(),
    +                                           gc.linewidth);
    +    curve_t            marker_path_curve(marker_path_snapped);
    +
    +    PathIterator path(path_obj);
    +    transformed_path_t path_transformed(path, trans);
    +    snap_t             path_snapped(path_transformed,
    +                                    gc.snap_mode,
    +                                    path.total_vertices(),
    +                                    1.0);
    +    curve_t            path_curve(path_snapped);
    +    path_curve.rewind(0);
     
    -#define MARKER_CACHE_SIZE 512
    +    facepair_t face = _get_rgba_face(face_obj, gc.alpha);
     
    -Py::Object
    -RendererAgg::draw_markers(const Py::Tuple& args) {
    -  typedef agg::conv_transform                  transformed_path_t;
    -  typedef PathQuantizer                  quantize_t;
    -  typedef agg::conv_curve                        curve_t;
    -  typedef agg::conv_stroke                          stroke_t;
    -  typedef agg::pixfmt_amask_adaptor pixfmt_amask_type;
    -  typedef agg::renderer_base              amask_ren_type;
    -  typedef agg::renderer_scanline_aa_solid    amask_aa_renderer_type;
    -  typedef agg::renderer_scanline_bin_solid   amask_bin_renderer_type;
    -  args.verify_length(5, 6);
    -
    -  Py::Object        gc_obj          = args[0];
    -  Py::Object        marker_path_obj = args[1];
    -  agg::trans_affine marker_trans    = py_to_agg_transformation_matrix(args[2].ptr());
    -  Py::Object        path_obj        = args[3];
    -  agg::trans_affine trans           = py_to_agg_transformation_matrix(args[4].ptr());
    -  Py::Object        face_obj;
    -  if (args.size() == 6)
    -    face_obj = args[5];
    -
    -  GCAgg gc = GCAgg(gc_obj, dpi);
    -
    -  // Deal with the difference in y-axis direction
    -  marker_trans *= agg::trans_affine_scaling(1.0, -1.0);
    -  trans *= agg::trans_affine_scaling(1.0, -1.0);
    -  trans *= agg::trans_affine_translation(0.0, (double)height);
    -
    -  PathIterator       marker_path(marker_path_obj);
    -  transformed_path_t marker_path_transformed(marker_path, marker_trans);
    -  quantize_t         marker_path_quantized(marker_path_transformed,
    -                                           gc.quantize_mode,
    -                                           marker_path.total_vertices());
    -  curve_t            marker_path_curve(marker_path_quantized);
    -
    -  PathIterator path(path_obj);
    -  transformed_path_t path_transformed(path, trans);
    -  quantize_t         path_quantized(path_transformed,
    -                                    gc.quantize_mode,
    -                                    path.total_vertices());
    -  curve_t            path_curve(path_quantized);
    -  path_curve.rewind(0);
    -
    -  facepair_t face = _get_rgba_face(face_obj, gc.alpha);
    -
    -  //maxim's suggestions for cached scanlines
    -  agg::scanline_storage_aa8 scanlines;
    -  theRasterizer.reset();
    -  theRasterizer.reset_clipping();
    -  rendererBase.reset_clipping(true);
    -
    -  agg::int8u  staticFillCache[MARKER_CACHE_SIZE];
    -  agg::int8u  staticStrokeCache[MARKER_CACHE_SIZE];
    -  agg::int8u* fillCache = staticFillCache;
    -  agg::int8u* strokeCache = staticStrokeCache;
    -
    -  try {
    -    unsigned fillSize = 0;
    -    if (face.first) {
    -      theRasterizer.add_path(marker_path_curve);
    -      agg::render_scanlines(theRasterizer, slineP8, scanlines);
    -      fillSize = scanlines.byte_size();
    -      if (fillSize >= MARKER_CACHE_SIZE)
    -        fillCache = new agg::int8u[fillSize];
    -      scanlines.serialize(fillCache);
    -    }
    -
    -    stroke_t stroke(marker_path_curve);
    -    stroke.width(gc.linewidth);
    -    stroke.line_cap(gc.cap);
    -    stroke.line_join(gc.join);
    +    //maxim's suggestions for cached scanlines
    +    agg::scanline_storage_aa8 scanlines;
         theRasterizer.reset();
    -    theRasterizer.add_path(stroke);
    -    agg::render_scanlines(theRasterizer, slineP8, scanlines);
    -    unsigned strokeSize = scanlines.byte_size();
    -    if (strokeSize >= MARKER_CACHE_SIZE)
    -      strokeCache = new agg::int8u[strokeSize];
    -    scanlines.serialize(strokeCache);
    -
         theRasterizer.reset_clipping();
         rendererBase.reset_clipping(true);
    -    set_clipbox(gc.cliprect, rendererBase);
    -    bool has_clippath = render_clippath(gc.clippath, gc.clippath_trans);
     
    -    double x, y;
    +    agg::int8u  staticFillCache[MARKER_CACHE_SIZE];
    +    agg::int8u  staticStrokeCache[MARKER_CACHE_SIZE];
    +    agg::int8u* fillCache = staticFillCache;
    +    agg::int8u* strokeCache = staticStrokeCache;
     
    -    agg::serialized_scanlines_adaptor_aa8 sa;
    -    agg::serialized_scanlines_adaptor_aa8::embedded_scanline sl;
    -
    -    agg::rect_d clipping_rect(
    -      -(scanlines.min_x() + 1.0),
    -      -(scanlines.min_y() + 1.0),
    -      width + scanlines.max_x() + 1.0,
    -      height + scanlines.max_y() + 1.0);
    -
    -    if (has_clippath) {
    -      while (path_curve.vertex(&x, &y) != agg::path_cmd_stop) {
    -        if (MPL_notisfinite64(x) || MPL_notisfinite64(y)) {
    -          continue;
    -        }
    -
    -        x = (double)(int)x; y = (double)(int)y;
    -
    -        // Cull points outside the boundary of the image.  Values
    -        // that are too large may overflow and create segfaults.
    -        // because they can create segfaults of they overflow; eg
    -        // http://sourceforge.net/tracker/?func=detail&aid=2865490&group_id=80706&atid=560720
    -        if (!clipping_rect.hit_test(x, y)) {
    -          continue;
    +    try
    +    {
    +        unsigned fillSize = 0;
    +        if (face.first)
    +        {
    +            theRasterizer.add_path(marker_path_curve);
    +            agg::render_scanlines(theRasterizer, slineP8, scanlines);
    +            fillSize = scanlines.byte_size();
    +            if (fillSize >= MARKER_CACHE_SIZE)
    +            {
    +                fillCache = new agg::int8u[fillSize];
    +            }
    +            scanlines.serialize(fillCache);
             }
     
    -        pixfmt_amask_type pfa(pixFmt, alphaMask);
    -        amask_ren_type r(pfa);
    -        amask_aa_renderer_type ren(r);
    -
    -        if (face.first) {
    -          ren.color(face.second);
    -          sa.init(fillCache, fillSize, x, y);
    -          agg::render_scanlines(sa, sl, ren);
    -        }
    -        ren.color(gc.color);
    -        sa.init(strokeCache, strokeSize, x, y);
    -        agg::render_scanlines(sa, sl, ren);
    -      }
    -    } else {
    -      while (path_curve.vertex(&x, &y) != agg::path_cmd_stop) {
    -        if (MPL_notisfinite64(x) || MPL_notisfinite64(y)) {
    -          continue;
    +        stroke_t stroke(marker_path_curve);
    +        stroke.width(gc.linewidth);
    +        stroke.line_cap(gc.cap);
    +        stroke.line_join(gc.join);
    +        theRasterizer.reset();
    +        theRasterizer.add_path(stroke);
    +        agg::render_scanlines(theRasterizer, slineP8, scanlines);
    +        unsigned strokeSize = scanlines.byte_size();
    +        if (strokeSize >= MARKER_CACHE_SIZE)
    +        {
    +            strokeCache = new agg::int8u[strokeSize];
             }
    +        scanlines.serialize(strokeCache);
     
    -        x = (double)(int)x; y = (double)(int)y;
    -
    -        // Cull points outside the boundary of the image.  Values
    -        // that are too large may overflow and create segfaults.
    -        // because they can create segfaults of they overflow; eg
    -        // http://sourceforge.net/tracker/?func=detail&aid=2865490&group_id=80706&atid=560720
    -        if (!clipping_rect.hit_test(x, y)) {
    -          continue;
    +        theRasterizer.reset_clipping();
    +        rendererBase.reset_clipping(true);
    +        set_clipbox(gc.cliprect, rendererBase);
    +        bool has_clippath = render_clippath(gc.clippath, gc.clippath_trans);
    +
    +        double x, y;
    +
    +        agg::serialized_scanlines_adaptor_aa8 sa;
    +        agg::serialized_scanlines_adaptor_aa8::embedded_scanline sl;
    +
    +        agg::rect_d clipping_rect(
    +            -(scanlines.min_x() + 1.0),
    +            -(scanlines.min_y() + 1.0),
    +            width + scanlines.max_x() + 1.0,
    +            height + scanlines.max_y() + 1.0);
    +
    +        if (has_clippath)
    +        {
    +            while (path_curve.vertex(&x, &y) != agg::path_cmd_stop)
    +            {
    +                if (MPL_notisfinite64(x) || MPL_notisfinite64(y))
    +                {
    +                    continue;
    +                }
    +
    +                x = (double)(int)x;
    +                y = (double)(int)y;
    +
    +                // Cull points outside the boundary of the image.
    +                // Values that are too large may overflow and create
    +                // segfaults.
    +                // http://sourceforge.net/tracker/?func=detail&aid=2865490&group_id=80706&atid=560720
    +                if (!clipping_rect.hit_test(x, y))
    +                {
    +                    continue;
    +                }
    +
    +                pixfmt_amask_type pfa(pixFmt, alphaMask);
    +                amask_ren_type r(pfa);
    +                amask_aa_renderer_type ren(r);
    +
    +                if (face.first)
    +                {
    +                    ren.color(face.second);
    +                    sa.init(fillCache, fillSize, x, y);
    +                    agg::render_scanlines(sa, sl, ren);
    +                }
    +                ren.color(gc.color);
    +                sa.init(strokeCache, strokeSize, x, y);
    +                agg::render_scanlines(sa, sl, ren);
    +            }
             }
    -
    -        if (face.first) {
    -          rendererAA.color(face.second);
    -          sa.init(fillCache, fillSize, x, y);
    -          agg::render_scanlines(sa, sl, rendererAA);
    +        else
    +        {
    +            while (path_curve.vertex(&x, &y) != agg::path_cmd_stop)
    +            {
    +                if (MPL_notisfinite64(x) || MPL_notisfinite64(y))
    +                {
    +                    continue;
    +                }
    +
    +                x = (double)(int)x;
    +                y = (double)(int)y;
    +
    +                // Cull points outside the boundary of the image.
    +                // Values that are too large may overflow and create
    +                // segfaults.
    +                // http://sourceforge.net/tracker/?func=detail&aid=2865490&group_id=80706&atid=560720
    +                if (!clipping_rect.hit_test(x, y))
    +                {
    +                    continue;
    +                }
    +
    +                if (face.first)
    +                {
    +                    rendererAA.color(face.second);
    +                    sa.init(fillCache, fillSize, x, y);
    +                    agg::render_scanlines(sa, sl, rendererAA);
    +                }
    +
    +                rendererAA.color(gc.color);
    +                sa.init(strokeCache, strokeSize, x, y);
    +                agg::render_scanlines(sa, sl, rendererAA);
    +            }
             }
    -
    -        rendererAA.color(gc.color);
    -        sa.init(strokeCache, strokeSize, x, y);
    -        agg::render_scanlines(sa, sl, rendererAA);
    -      }
         }
    -  } catch(...) {
    +    catch (...)
    +    {
    +        if (fillCache != staticFillCache)
    +            delete[] fillCache;
    +        if (strokeCache != staticStrokeCache)
    +            delete[] strokeCache;
    +        theRasterizer.reset_clipping();
    +        rendererBase.reset_clipping(true);
    +        throw;
    +    }
    +
         if (fillCache != staticFillCache)
    -      delete[] fillCache;
    +        delete[] fillCache;
         if (strokeCache != staticStrokeCache)
    -      delete[] strokeCache;
    -    throw;
    -  }
    -
    -  if (fillCache != staticFillCache)
    -    delete[] fillCache;
    -  if (strokeCache != staticStrokeCache)
    -    delete[] strokeCache;
    +        delete[] strokeCache;
     
    -  return Py::Object();
    +    theRasterizer.reset_clipping();
    +    rendererBase.reset_clipping(true);
    +
    +    return Py::Object();
     }
     
    +
     /**
      * This is a custom span generator that converts spans in the
      * 8-bit inverted greyscale font buffer to rgba that agg can use.
    @@ -686,457 +822,573 @@
     class font_to_rgba
     {
     public:
    -  typedef ChildGenerator child_type;
    -  typedef agg::rgba8 color_type;
    -  typedef typename child_type::color_type child_color_type;
    -  typedef agg::span_allocator span_alloc_type;
    +    typedef ChildGenerator child_type;
    +    typedef agg::rgba8 color_type;
    +    typedef typename child_type::color_type child_color_type;
    +    typedef agg::span_allocator span_alloc_type;
     
     private:
    -  child_type* _gen;
    -  color_type _color;
    -  span_alloc_type _allocator;
    +    child_type* _gen;
    +    color_type _color;
    +    span_alloc_type _allocator;
     
     public:
    -  font_to_rgba(child_type* gen, color_type color) :
    -    _gen(gen),
    -    _color(color) {
    -  }
    -
    -  inline void generate(color_type* output_span, int x, int y, unsigned len)
    -  {
    -    _allocator.allocate(len);
    -    child_color_type* input_span = _allocator.span();
    -    _gen->generate(input_span, x, y, len);
    -
    -    do {
    -      *output_span = _color;
    -      output_span->a = ((unsigned int)_color.a * (unsigned int)input_span->v) >> 8;
    -      ++output_span;
    -      ++input_span;
    -    } while (--len);
    -  }
    -
    -  void prepare()
    -  {
    -    _gen->prepare();
    -  }
    +    font_to_rgba(child_type* gen, color_type color) :
    +        _gen(gen),
    +        _color(color)
    +    {
    +
    +    }
     
    +    inline void
    +    generate(color_type* output_span, int x, int y, unsigned len)
    +    {
    +        _allocator.allocate(len);
    +        child_color_type* input_span = _allocator.span();
    +        _gen->generate(input_span, x, y, len);
    +
    +        do
    +        {
    +            *output_span = _color;
    +            output_span->a = ((unsigned int)_color.a *
    +                              (unsigned int)input_span->v) >> 8;
    +            ++output_span;
    +            ++input_span;
    +        }
    +        while (--len);
    +    }
    +
    +    void
    +    prepare()
    +    {
    +        _gen->prepare();
    +    }
     };
     
    +
     // MGDTODO: Support clip paths
     Py::Object
    -RendererAgg::draw_text_image(const Py::Tuple& args) {
    -  _VERBOSE("RendererAgg::draw_text");
    +RendererAgg::draw_text_image(const Py::Tuple& args)
    +{
    +    _VERBOSE("RendererAgg::draw_text");
     
    -  typedef agg::span_allocator gray_span_alloc_type;
    -  typedef agg::span_allocator color_span_alloc_type;
    -  typedef agg::span_interpolator_linear<> interpolator_type;
    -  typedef agg::image_accessor_clip image_accessor_type;
    -  //typedef agg::span_image_filter_gray_2x2
    -  //  image_span_gen_type;
    -  typedef agg::span_image_filter_gray
    -    image_span_gen_type;
    -
    -  typedef font_to_rgba span_gen_type;
    -  typedef agg::renderer_scanline_aa
    -    renderer_type;
    -
    -  args.verify_length(5);
    -
    -  const unsigned char* buffer = NULL;
    -  int width, height;
    -  Py::Object image_obj = args[0];
    -  PyArrayObject* image_array = NULL;
    -  if (PyArray_Check(image_obj.ptr())) {
    -    image_array = (PyArrayObject*)PyArray_FromObject(image_obj.ptr(), PyArray_UBYTE, 2, 2);
    -    if (!image_array)
    -      throw Py::ValueError("First argument to draw_text_image must be a FT2Font.Image object or a Nx2 uint8 numpy array.");
    -    buffer = (unsigned char *)PyArray_DATA(image_array);
    -    width = PyArray_DIM(image_array, 1);
    -    height = PyArray_DIM(image_array, 0);
    -  } else {
    -    FT2Image *image = static_cast(args[0].ptr());
    -    if (!image->get_buffer())
    -      throw Py::ValueError("First argument to draw_text_image must be a FT2Font.Image object or a Nx2 uint8 numpy array.");
    -    buffer = image->get_buffer();
    -    width = image->get_width();
    -    height = image->get_height();
    -  }
    -
    -  int x(0),y(0);
    -  try {
    -    x = Py::Int( args[1] );
    -    y = Py::Int( args[2] );
    -  }
    -  catch (Py::TypeError) {
    -    Py_XDECREF(image_array);
    -    throw Py::TypeError("Invalid input arguments to draw_text_image");
    -  }
    -
    -  double angle = Py::Float( args[3] );
    -
    -  GCAgg gc = GCAgg(args[4], dpi);
    -
    -  theRasterizer.reset_clipping();
    -  rendererBase.reset_clipping(true);
    -  set_clipbox(gc.cliprect, theRasterizer);
    -
    -  agg::rendering_buffer srcbuf((agg::int8u*)buffer, width, height, width);
    -  agg::pixfmt_gray8 pixf_img(srcbuf);
    -
    -  agg::trans_affine mtx;
    -  mtx *= agg::trans_affine_translation(0, -height);
    -  mtx *= agg::trans_affine_rotation(-angle * agg::pi / 180.0);
    -  mtx *= agg::trans_affine_translation(x, y);
    -
    -  agg::path_storage rect;
    -  rect.move_to(0, 0);
    -  rect.line_to(width, 0);
    -  rect.line_to(width, height);
    -  rect.line_to(0, height);
    -  rect.line_to(0, 0);
    -  agg::conv_transform rect2(rect, mtx);
    -
    -  agg::trans_affine inv_mtx(mtx);
    -  inv_mtx.invert();
    -
    -  agg::image_filter_lut filter;
    -  filter.calculate(agg::image_filter_spline36());
    -  interpolator_type interpolator(inv_mtx);
    -  color_span_alloc_type sa;
    -  image_accessor_type ia(pixf_img, 0);
    -  image_span_gen_type image_span_generator(ia, interpolator, filter);
    -  span_gen_type output_span_generator(&image_span_generator, gc.color);
    -  renderer_type ri(rendererBase, sa, output_span_generator);
    -
    -  theRasterizer.add_path(rect2);
    -  agg::render_scanlines(theRasterizer, slineP8, ri);
    -
    -  Py_XDECREF(image_array);
    -
    -  return Py::Object();
    -}
    -
    -
    -Py::Object
    -RendererAgg::draw_image(const Py::Tuple& args) {
    -  _VERBOSE("RendererAgg::draw_image");
    -
    -  args.verify_length(4, 6);
    -
    -  double x = Py::Float(args[0]);
    -  double y = Py::Float(args[1]);
    -  Image *image = static_cast(args[2].ptr());
    -  Py::Object box_obj = args[3];
    -  Py::Object clippath;
    -  agg::trans_affine clippath_trans;
    -  bool has_clippath = false;
    -
    -  theRasterizer.reset_clipping();
    -  rendererBase.reset_clipping(true);
    -  if (args.size() == 6) {
    -    clippath = args[4];
    -    clippath_trans = py_to_agg_transformation_matrix(args[5].ptr(), false);
    -    has_clippath = render_clippath(clippath, clippath_trans);
    -  }
    -
    -  Py::Tuple empty;
    -  image->flipud_out(empty);
    -  pixfmt pixf(*(image->rbufOut));
    +    typedef agg::span_allocator gray_span_alloc_type;
    +    typedef agg::span_allocator color_span_alloc_type;
    +    typedef agg::span_interpolator_linear<> interpolator_type;
    +    typedef agg::image_accessor_clip image_accessor_type;
    +    typedef agg::span_image_filter_gray image_span_gen_type;
    +    typedef font_to_rgba span_gen_type;
    +    typedef agg::renderer_scanline_aa renderer_type;
    +
    +    args.verify_length(5);
    +
    +    const unsigned char* buffer = NULL;
    +    int width, height;
    +    Py::Object image_obj = args[0];
    +
    +    if (PyArray_Check(image_obj.ptr()))
    +    {
    +        PyObject* image_array = PyArray_FromObject(
    +            image_obj.ptr(), PyArray_UBYTE, 2, 2);
    +        if (!image_array)
    +        {
    +            throw Py::ValueError(
    +                "First argument to draw_text_image must be a FT2Font.Image object or a Nx2 uint8 numpy array.");
    +        }
    +        image_obj = Py::Object(image_array, true);
    +        buffer = (unsigned char *)PyArray_DATA(image_array);
    +        width = PyArray_DIM(image_array, 1);
    +        height = PyArray_DIM(image_array, 0);
    +    }
    +    else
    +    {
    +        FT2Image *image = static_cast(image_obj.ptr());
    +        if (!image->get_buffer())
    +        {
    +            throw Py::ValueError(
    +                "First argument to draw_text_image must be a FT2Font.Image object or a Nx2 uint8 numpy array.");
    +        }
    +        buffer = image->get_buffer();
    +        width = image->get_width();
    +        height = image->get_height();
    +    }
    +
    +    int x(0), y(0);
    +    try
    +    {
    +        x = Py::Int(args[1]);
    +        y = Py::Int(args[2]);
    +    }
    +    catch (Py::TypeError)
    +    {
    +        throw Py::TypeError("Invalid input arguments to draw_text_image");
    +    }
    +
    +    double angle = Py::Float(args[3]);
    +
    +    GCAgg gc(args[4], dpi);
    +
    +    theRasterizer.reset_clipping();
    +    rendererBase.reset_clipping(true);
    +    set_clipbox(gc.cliprect, theRasterizer);
    +
    +    agg::rendering_buffer srcbuf((agg::int8u*)buffer, width, height, width);
    +    agg::pixfmt_gray8 pixf_img(srcbuf);
     
    -  if (has_clippath) {
         agg::trans_affine mtx;
    -    mtx *= agg::trans_affine_translation((int)x, (int)(height-(y+image->rowsOut)));
    +    mtx *= agg::trans_affine_translation(0, -height);
    +    mtx *= agg::trans_affine_rotation(-angle * agg::pi / 180.0);
    +    mtx *= agg::trans_affine_translation(x, y);
     
         agg::path_storage rect;
         rect.move_to(0, 0);
    -    rect.line_to(image->colsOut, 0);
    -    rect.line_to(image->colsOut, image->rowsOut);
    -    rect.line_to(0, image->rowsOut);
    +    rect.line_to(width, 0);
    +    rect.line_to(width, height);
    +    rect.line_to(0, height);
         rect.line_to(0, 0);
         agg::conv_transform rect2(rect, mtx);
     
         agg::trans_affine inv_mtx(mtx);
         inv_mtx.invert();
     
    -    typedef agg::span_allocator color_span_alloc_type;
    -    typedef agg::pixfmt_amask_adaptor pixfmt_amask_type;
    -    typedef agg::renderer_base amask_ren_type;
    -    typedef agg::image_accessor_clip image_accessor_type;
    -    typedef agg::span_interpolator_linear<> interpolator_type;
    -    typedef agg::span_image_filter_rgba_nn image_span_gen_type;
    -    typedef agg::renderer_scanline_aa renderer_type;
    -
    -    color_span_alloc_type sa;
    -    image_accessor_type ia(pixf, agg::rgba8(0, 0, 0, 0));
    +    agg::image_filter_lut filter;
    +    filter.calculate(agg::image_filter_spline36());
         interpolator_type interpolator(inv_mtx);
    -    image_span_gen_type image_span_generator(ia, interpolator);
    -    pixfmt_amask_type pfa(pixFmt, alphaMask);
    -    amask_ren_type r(pfa);
    -    renderer_type ri(r, sa, image_span_generator);
    +    color_span_alloc_type sa;
    +    image_accessor_type ia(pixf_img, 0);
    +    image_span_gen_type image_span_generator(ia, interpolator, filter);
    +    span_gen_type output_span_generator(&image_span_generator, gc.color);
    +    renderer_type ri(rendererBase, sa, output_span_generator);
     
         theRasterizer.add_path(rect2);
         agg::render_scanlines(theRasterizer, slineP8, ri);
    -  } else {
    -    set_clipbox(box_obj, rendererBase);
    -    rendererBase.blend_from(pixf, 0, (int)x, (int)(height-(y+image->rowsOut)));
    -  }
    -
    -  image->flipud_out(empty);
     
    -  return Py::Object();
    +    return Py::Object();
     }
     
    -template
    -void RendererAgg::_draw_path(path_t& path, bool has_clippath,
    -                             const facepair_t& face, const GCAgg& gc) {
    -  typedef agg::conv_stroke                           stroke_t;
    -  typedef agg::conv_dash                             dash_t;
    -  typedef agg::conv_stroke                           stroke_dash_t;
    -  typedef agg::pixfmt_amask_adaptor pixfmt_amask_type;
    -  typedef agg::renderer_base              amask_ren_type;
    -  typedef agg::renderer_scanline_aa_solid    amask_aa_renderer_type;
    -  typedef agg::renderer_scanline_bin_solid   amask_bin_renderer_type;
    -
    -  // Render face
    -  if (face.first) {
    -    theRasterizer.add_path(path);
     
    -    if (gc.isaa) {
    -      if (has_clippath) {
    -        pixfmt_amask_type pfa(pixFmt, alphaMask);
    -        amask_ren_type r(pfa);
    -        amask_aa_renderer_type ren(r);
    -        ren.color(face.second);
    -        agg::render_scanlines(theRasterizer, slineP8, ren);
    -      } else {
    -        rendererAA.color(face.second);
    -        agg::render_scanlines(theRasterizer, slineP8, rendererAA);
    -      }
    -    } else {
    -      if (has_clippath) {
    -        pixfmt_amask_type pfa(pixFmt, alphaMask);
    -        amask_ren_type r(pfa);
    -        amask_bin_renderer_type ren(r);
    -        ren.color(face.second);
    -        agg::render_scanlines(theRasterizer, slineP8, ren);
    -      } else {
    -        rendererBin.color(face.second);
    -        agg::render_scanlines(theRasterizer, slineP8, rendererBin);
    -      }
    -    }
    -  }
    -
    -  // Render hatch
    -  if (!gc.hatchpath.isNone()) {
    -    // Reset any clipping that may be in effect, since we'll be
    -    // drawing the hatch in a scratch buffer at origin (0, 0)
    +Py::Object
    +RendererAgg::draw_image(const Py::Tuple& args)
    +{
    +    _VERBOSE("RendererAgg::draw_image");
    +
    +    args.verify_length(4, 7); // 7 if affine matrix if given
    +
    +    GCAgg gc(args[0], dpi);
    +    Image *image = static_cast(args[3].ptr());
    +    bool has_clippath = false;
    +    agg::trans_affine affine_trans;
    +    bool has_affine = false;
    +    double x, y, w, h;
    +
    +    if (args.size() == 7)
    +    {
    +        has_affine = true;
    +        x = Py::Float(args[1]);
    +        y = Py::Float(args[2]);
    +        w = Py::Float(args[4]);
    +        h = Py::Float(args[5]);
    +        affine_trans = py_to_agg_transformation_matrix(args[6].ptr());
    +    }
    +    else
    +    {
    +        x = mpl_round(Py::Float(args[1]));
    +        y = mpl_round(Py::Float(args[2]));
    +        w = h = 0; /* w and h not used in this case, but assign to prevent
    +                  warnings from the compiler */
    +    }
    +
         theRasterizer.reset_clipping();
         rendererBase.reset_clipping(true);
    +    set_clipbox(gc.cliprect, theRasterizer);
    +    has_clippath = render_clippath(gc.clippath, gc.clippath_trans);
     
    -    // Create and transform the path
    -    typedef agg::conv_transform hatch_path_trans_t;
    -    typedef agg::conv_curve hatch_path_curve_t;
    -    typedef agg::conv_stroke hatch_path_stroke_t;
    -
    -    PathIterator hatch_path(gc.hatchpath);
    -    agg::trans_affine hatch_trans;
    -    hatch_trans *= agg::trans_affine_scaling(1.0, -1.0);
    -    hatch_trans *= agg::trans_affine_translation(0.0, 1.0);
    -    hatch_trans *= agg::trans_affine_scaling(HATCH_SIZE, HATCH_SIZE);
    -    hatch_path_trans_t hatch_path_trans(hatch_path, hatch_trans);
    -    hatch_path_curve_t hatch_path_curve(hatch_path_trans);
    -    hatch_path_stroke_t hatch_path_stroke(hatch_path_curve);
    -    hatch_path_stroke.width(1.0);
    -    hatch_path_stroke.line_cap(agg::square_cap);
    -
    -    // Render the path into the hatch buffer
    -    pixfmt hatch_img_pixf(hatchRenderingBuffer);
    -    renderer_base rb(hatch_img_pixf);
    -    renderer_aa rs(rb);
    -    rb.clear(agg::rgba(0.0, 0.0, 0.0, 0.0));
    -    rs.color(gc.color);
    -
    -    theRasterizer.add_path(hatch_path_curve);
    -    agg::render_scanlines(theRasterizer, slineP8, rs);
    -    theRasterizer.add_path(hatch_path_stroke);
    -    agg::render_scanlines(theRasterizer, slineP8, rs);
    +    Py::Tuple empty;
    +    image->flipud_out(empty);
    +    pixfmt pixf(*(image->rbufOut));
     
    -    // Put clipping back on, if originally set on entry to this
    -    // function
    -    set_clipbox(gc.cliprect, theRasterizer);
    -    if (has_clippath)
    -      render_clippath(gc.clippath, gc.clippath_trans);
    +    if (has_affine | has_clippath)
    +    {
    +        agg::trans_affine mtx;
    +        agg::path_storage rect;
     
    -    // Transfer the hatch to the main image buffer
    -    typedef agg::image_accessor_wrap img_source_type;
    -    typedef agg::span_pattern_rgba span_gen_type;
    -    agg::span_allocator sa;
    -    img_source_type img_src(hatch_img_pixf);
    -    span_gen_type sg(img_src, 0, 0);
    -    theRasterizer.add_path(path);
    -    agg::render_scanlines_aa(theRasterizer, slineP8, rendererBase, sa, sg);
    -  }
    -
    -  // Render stroke
    -  if (gc.linewidth != 0.0) {
    -    double linewidth = gc.linewidth;
    -    if (!gc.isaa) {
    -      linewidth = (linewidth < 0.5) ? 0.5 : mpl_round(linewidth);
    -    }
    -    if (gc.dashes.size() == 0) {
    -      stroke_t stroke(path);
    -      stroke.width(linewidth);
    -      stroke.line_cap(gc.cap);
    -      stroke.line_join(gc.join);
    -      theRasterizer.add_path(stroke);
    -    } else {
    -      dash_t dash(path);
    -      for (GCAgg::dash_t::const_iterator i = gc.dashes.begin();
    -           i != gc.dashes.end(); ++i) {
    -        double val0 = i->first;
    -        double val1 = i->second;
    -        if (!gc.isaa) {
    -          val0 = (int)val0 + 0.5;
    -          val1 = (int)val1 + 0.5;
    -        }
    -        dash.add_dash(val0, val1);
    -      }
    -      stroke_dash_t stroke(dash);
    -      stroke.line_cap(gc.cap);
    -      stroke.line_join(gc.join);
    -      stroke.width(linewidth);
    -      theRasterizer.add_path(stroke);
    -    }
    +        if (has_affine)
    +        {
    +            mtx *= agg::trans_affine_scaling(1, -1);
    +            mtx *= agg::trans_affine_translation(0, image->rowsOut);
    +            mtx *= agg::trans_affine_scaling(w / (image->colsOut),
    +                                             h / (image->rowsOut));
    +            mtx *= agg::trans_affine_translation(x, y);
    +            mtx *= affine_trans;
    +            mtx *= agg::trans_affine_scaling(1.0, -1.0);
    +            mtx *= agg::trans_affine_translation(0.0, (double) height);
    +        }
    +        else
    +        {
    +            mtx *= agg::trans_affine_translation(
    +                (int)x,
    +                (int)(height - (y + image->rowsOut)));
    +        }
     
    -    if (gc.isaa) {
    -      if (has_clippath) {
    -        pixfmt_amask_type pfa(pixFmt, alphaMask);
    -        amask_ren_type r(pfa);
    -        amask_aa_renderer_type ren(r);
    -        ren.color(gc.color);
    -        agg::render_scanlines(theRasterizer, slineP8, ren);
    -      } else {
    -        rendererAA.color(gc.color);
    -        agg::render_scanlines(theRasterizer, slineP8, rendererAA);
    -      }
    -    } else {
    -      if (has_clippath) {
    -        pixfmt_amask_type pfa(pixFmt, alphaMask);
    -        amask_ren_type r(pfa);
    -        amask_bin_renderer_type ren(r);
    -        ren.color(gc.color);
    -        agg::render_scanlines(theRasterizer, slineP8, ren);
    -      } else {
    -        rendererBin.color(gc.color);
    -        agg::render_scanlines(theRasterizer, slineBin, rendererBin);
    -      }
    -    }
    -  }
    -}
    +        rect.move_to(0, 0);
    +        rect.line_to(image->colsOut, 0);
    +        rect.line_to(image->colsOut, image->rowsOut);
    +        rect.line_to(0, image->rowsOut);
    +        rect.line_to(0, 0);
    +
    +        agg::conv_transform rect2(rect, mtx);
    +
    +        agg::trans_affine inv_mtx(mtx);
    +        inv_mtx.invert();
    +
    +        typedef agg::span_allocator color_span_alloc_type;
    +        typedef agg::image_accessor_clip
    +            image_accessor_type;
    +        typedef agg::span_interpolator_linear<> interpolator_type;
    +        typedef agg::span_image_filter_rgba_nn image_span_gen_type;
    +
    +        color_span_alloc_type sa;
    +        image_accessor_type ia(pixf, agg::rgba8(0, 0, 0, 0));
    +        interpolator_type interpolator(inv_mtx);
    +        image_span_gen_type image_span_generator(ia, interpolator);
    +
    +        if (has_clippath)
    +        {
    +            typedef agg::pixfmt_amask_adaptor
    +                pixfmt_amask_type;
    +            typedef agg::renderer_base amask_ren_type;
    +            typedef agg::renderer_scanline_aa
    +                renderer_type_alpha;
    +
    +            pixfmt_amask_type pfa(pixFmt, alphaMask);
    +            amask_ren_type r(pfa);
    +            renderer_type_alpha ri(r, sa, image_span_generator);
     
    -Py::Object
    -RendererAgg::draw_path(const Py::Tuple& args) {
    -  typedef agg::conv_transform  transformed_path_t;
    -  typedef PathNanRemover nan_removed_t;
    -  typedef PathClipper         clipped_t;
    -  typedef PathQuantizer           quantized_t;
    -  typedef PathSimplifier        simplify_t;
    -  typedef agg::conv_curve        curve_t;
    -
    -  _VERBOSE("RendererAgg::draw_path");
    -  args.verify_length(3, 4);
    -
    -  Py::Object gc_obj = args[0];
    -  Py::Object path_obj = args[1];
    -  agg::trans_affine trans = py_to_agg_transformation_matrix(args[2].ptr());
    -  Py::Object face_obj;
    -  if (args.size() == 4)
    -    face_obj = args[3];
    -
    -  PathIterator path(path_obj);
    -  GCAgg gc = GCAgg(gc_obj, dpi);
    -  facepair_t face = _get_rgba_face(face_obj, gc.alpha);
    -
    -  theRasterizer.reset_clipping();
    -  rendererBase.reset_clipping(true);
    -  set_clipbox(gc.cliprect, theRasterizer);
    -  bool has_clippath = render_clippath(gc.clippath, gc.clippath_trans);
    -
    -  trans *= agg::trans_affine_scaling(1.0, -1.0);
    -  trans *= agg::trans_affine_translation(0.0, (double)height);
    -  bool clip = !face.first && gc.hatchpath.isNone();
    -  bool simplify = path.should_simplify() && clip;
    -
    -  transformed_path_t tpath(path, trans);
    -  nan_removed_t      nan_removed(tpath, true, path.has_curves());
    -  clipped_t          clipped(nan_removed, clip, width, height);
    -  quantized_t        quantized(clipped, gc.quantize_mode, path.total_vertices());
    -  simplify_t         simplified(quantized, simplify, path.simplify_threshold());
    -  curve_t            curve(simplified);
    -
    -  try {
    -    _draw_path(curve, has_clippath, face, gc);
    -  } catch (const char* e) {
    -    throw Py::RuntimeError(e);
    -  }
    +            theRasterizer.add_path(rect2);
    +            agg::render_scanlines(theRasterizer, slineP8, ri);
    +        }
    +        else
    +        {
    +            typedef agg::renderer_base ren_type;
    +            typedef agg::renderer_scanline_aa
    +                renderer_type;
    +
    +            ren_type r(pixFmt);
    +            renderer_type ri(r, sa, image_span_generator);
    +
    +            theRasterizer.add_path(rect2);
    +            agg::render_scanlines(theRasterizer, slineP8, ri);
    +        }
    +
    +    }
    +    else
    +    {
    +        set_clipbox(gc.cliprect, rendererBase);
    +        rendererBase.blend_from(pixf, 0, (int)x, (int)(height - (y + image->rowsOut)));
    +    }
    +
    +    rendererBase.reset_clipping(true);
    +    image->flipud_out(empty);
    +
    +    return Py::Object();
    +}
    +
    +
    +template
    +void RendererAgg::_draw_path(path_t& path, bool has_clippath,
    +                             const facepair_t& face, const GCAgg& gc)
    +{
    +    typedef agg::conv_stroke                           stroke_t;
    +    typedef agg::conv_dash                             dash_t;
    +    typedef agg::conv_stroke                           stroke_dash_t;
    +    typedef agg::pixfmt_amask_adaptor pixfmt_amask_type;
    +    typedef agg::renderer_base              amask_ren_type;
    +    typedef agg::renderer_scanline_aa_solid    amask_aa_renderer_type;
    +    typedef agg::renderer_scanline_bin_solid   amask_bin_renderer_type;
    +
    +    // Render face
    +    if (face.first)
    +    {
    +        theRasterizer.add_path(path);
    +
    +        if (gc.isaa)
    +        {
    +            if (has_clippath)
    +            {
    +                pixfmt_amask_type pfa(pixFmt, alphaMask);
    +                amask_ren_type r(pfa);
    +                amask_aa_renderer_type ren(r);
    +                ren.color(face.second);
    +                agg::render_scanlines(theRasterizer, slineP8, ren);
    +            }
    +            else
    +            {
    +                rendererAA.color(face.second);
    +                agg::render_scanlines(theRasterizer, slineP8, rendererAA);
    +            }
    +        }
    +        else
    +        {
    +            if (has_clippath)
    +            {
    +                pixfmt_amask_type pfa(pixFmt, alphaMask);
    +                amask_ren_type r(pfa);
    +                amask_bin_renderer_type ren(r);
    +                ren.color(face.second);
    +                agg::render_scanlines(theRasterizer, slineP8, ren);
    +            }
    +            else
    +            {
    +                rendererBin.color(face.second);
    +                agg::render_scanlines(theRasterizer, slineP8, rendererBin);
    +            }
    +        }
    +    }
    +
    +    // Render hatch
    +    if (!gc.hatchpath.isNone())
    +    {
    +        // Reset any clipping that may be in effect, since we'll be
    +        // drawing the hatch in a scratch buffer at origin (0, 0)
    +        theRasterizer.reset_clipping();
    +        rendererBase.reset_clipping(true);
    +
    +        // Create and transform the path
    +        typedef agg::conv_transform hatch_path_trans_t;
    +        typedef agg::conv_curve hatch_path_curve_t;
    +        typedef agg::conv_stroke hatch_path_stroke_t;
    +
    +        PathIterator hatch_path(gc.hatchpath);
    +        agg::trans_affine hatch_trans;
    +        hatch_trans *= agg::trans_affine_scaling(1.0, -1.0);
    +        hatch_trans *= agg::trans_affine_translation(0.0, 1.0);
    +        hatch_trans *= agg::trans_affine_scaling(HATCH_SIZE, HATCH_SIZE);
    +        hatch_path_trans_t hatch_path_trans(hatch_path, hatch_trans);
    +        hatch_path_curve_t hatch_path_curve(hatch_path_trans);
    +        hatch_path_stroke_t hatch_path_stroke(hatch_path_curve);
    +        hatch_path_stroke.width(1.0);
    +        hatch_path_stroke.line_cap(agg::square_cap);
    +
    +        // Render the path into the hatch buffer
    +        pixfmt hatch_img_pixf(hatchRenderingBuffer);
    +        renderer_base rb(hatch_img_pixf);
    +        renderer_aa rs(rb);
    +        rb.clear(agg::rgba(0.0, 0.0, 0.0, 0.0));
    +        rs.color(gc.color);
    +
    +        theRasterizer.add_path(hatch_path_curve);
    +        agg::render_scanlines(theRasterizer, slineP8, rs);
    +        theRasterizer.add_path(hatch_path_stroke);
    +        agg::render_scanlines(theRasterizer, slineP8, rs);
    +
    +        // Put clipping back on, if originally set on entry to this
    +        // function
    +        set_clipbox(gc.cliprect, theRasterizer);
    +        if (has_clippath)
    +            render_clippath(gc.clippath, gc.clippath_trans);
    +
    +        // Transfer the hatch to the main image buffer
    +        typedef agg::image_accessor_wrap < pixfmt,
    +        agg::wrap_mode_repeat_auto_pow2,
    +        agg::wrap_mode_repeat_auto_pow2 > img_source_type;
    +        typedef agg::span_pattern_rgba span_gen_type;
    +        agg::span_allocator sa;
    +        img_source_type img_src(hatch_img_pixf);
    +        span_gen_type sg(img_src, 0, 0);
    +        theRasterizer.add_path(path);
    +        agg::render_scanlines_aa(theRasterizer, slineP8, rendererBase, sa, sg);
    +    }
    +
    +    // Render stroke
    +    if (gc.linewidth != 0.0)
    +    {
    +        double linewidth = gc.linewidth;
    +        if (!gc.isaa)
    +        {
    +            linewidth = (linewidth < 0.5) ? 0.5 : mpl_round(linewidth);
    +        }
    +        if (gc.dashes.size() == 0)
    +        {
    +            stroke_t stroke(path);
    +            stroke.width(linewidth);
    +            stroke.line_cap(gc.cap);
    +            stroke.line_join(gc.join);
    +            theRasterizer.add_path(stroke);
    +        }
    +        else
    +        {
    +            dash_t dash(path);
    +            for (GCAgg::dash_t::const_iterator i = gc.dashes.begin();
    +                    i != gc.dashes.end(); ++i)
    +            {
    +                double val0 = i->first;
    +                double val1 = i->second;
    +                if (!gc.isaa)
    +                {
    +                    val0 = (int)val0 + 0.5;
    +                    val1 = (int)val1 + 0.5;
    +                }
    +                dash.add_dash(val0, val1);
    +            }
    +            stroke_dash_t stroke(dash);
    +            stroke.line_cap(gc.cap);
    +            stroke.line_join(gc.join);
    +            stroke.width(linewidth);
    +            theRasterizer.add_path(stroke);
    +        }
    +
    +        if (gc.isaa)
    +        {
    +            if (has_clippath)
    +            {
    +                pixfmt_amask_type pfa(pixFmt, alphaMask);
    +                amask_ren_type r(pfa);
    +                amask_aa_renderer_type ren(r);
    +                ren.color(gc.color);
    +                agg::render_scanlines(theRasterizer, slineP8, ren);
    +            }
    +            else
    +            {
    +                rendererAA.color(gc.color);
    +                agg::render_scanlines(theRasterizer, slineP8, rendererAA);
    +            }
    +        }
    +        else
    +        {
    +            if (has_clippath)
    +            {
    +                pixfmt_amask_type pfa(pixFmt, alphaMask);
    +                amask_ren_type r(pfa);
    +                amask_bin_renderer_type ren(r);
    +                ren.color(gc.color);
    +                agg::render_scanlines(theRasterizer, slineP8, ren);
    +            }
    +            else
    +            {
    +                rendererBin.color(gc.color);
    +                agg::render_scanlines(theRasterizer, slineBin, rendererBin);
    +            }
    +        }
    +    }
    +}
    +
    +
    +Py::Object
    +RendererAgg::draw_path(const Py::Tuple& args)
    +{
    +    typedef agg::conv_transform  transformed_path_t;
    +    typedef PathNanRemover nan_removed_t;
    +    typedef PathClipper         clipped_t;
    +    typedef PathSnapper             snapped_t;
    +    typedef PathSimplifier          simplify_t;
    +    typedef agg::conv_curve        curve_t;
    +
    +    _VERBOSE("RendererAgg::draw_path");
    +    args.verify_length(3, 4);
    +
    +    GCAgg gc(args[0], dpi);
    +    PathIterator path(args[1]);
    +    agg::trans_affine trans = py_to_agg_transformation_matrix(args[2].ptr());
    +    Py::Object face_obj;
    +    if (args.size() == 4)
    +        face_obj = args[3];
    +
    +    facepair_t face = _get_rgba_face(face_obj, gc.alpha);
    +
    +    theRasterizer.reset_clipping();
    +    rendererBase.reset_clipping(true);
    +    set_clipbox(gc.cliprect, theRasterizer);
    +    bool has_clippath = render_clippath(gc.clippath, gc.clippath_trans);
    +
    +    trans *= agg::trans_affine_scaling(1.0, -1.0);
    +    trans *= agg::trans_affine_translation(0.0, (double)height);
    +    bool clip = !face.first && gc.hatchpath.isNone() && !path.has_curves();
    +    bool simplify = path.should_simplify() && clip;
    +
    +    transformed_path_t tpath(path, trans);
    +    nan_removed_t      nan_removed(tpath, true, path.has_curves());
    +    clipped_t          clipped(nan_removed, clip, width, height);
    +    snapped_t          snapped(clipped, gc.snap_mode, path.total_vertices(), gc.linewidth);
    +    simplify_t         simplified(snapped, simplify, path.simplify_threshold());
    +    curve_t            curve(simplified);
    +
    +    try
    +    {
    +        _draw_path(curve, has_clippath, face, gc);
    +    }
    +    catch (const char* e)
    +    {
    +        throw Py::RuntimeError(e);
    +    }
    +
    +    return Py::Object();
    +}
     
    -  return Py::Object();
    -}
     
     template
     Py::Object
     RendererAgg::_draw_path_collection_generic
    -  (agg::trans_affine              master_transform,
    -   const Py::Object&              cliprect,
    -   const Py::Object&              clippath,
    -   const agg::trans_affine&       clippath_trans,
    -   const PathGenerator&           path_generator,
    -   const Py::SeqBase& transforms_obj,
    -   const Py::Object&              offsets_obj,
    -   const agg::trans_affine&       offset_trans,
    -   const Py::Object&              facecolors_obj,
    -   const Py::Object&              edgecolors_obj,
    -   const Py::SeqBase&  linewidths,
    -   const Py::SeqBase& linestyles_obj,
    -   const Py::SeqBase&    antialiaseds) {
    -  typedef agg::conv_transform transformed_path_t;
    -  typedef PathNanRemover                         nan_removed_t;
    -  typedef PathClipper                                 clipped_t;
    -  typedef PathQuantizer                                   quantized_t;
    -  typedef agg::conv_curve                               quantized_curve_t;
    -  typedef agg::conv_curve                                 curve_t;
    -
    -  GCAgg gc(dpi);
    -
    -  PyArrayObject* offsets    = NULL;
    -  PyArrayObject* facecolors = NULL;
    -  PyArrayObject* edgecolors = NULL;
    -
    -  try {
    -    offsets = (PyArrayObject*)PyArray_FromObject
    -      (offsets_obj.ptr(), PyArray_DOUBLE, 0, 2);
    +(GCAgg&                         gc,
    + agg::trans_affine              master_transform,
    + const Py::Object&              cliprect,
    + const Py::Object&              clippath,
    + const agg::trans_affine&       clippath_trans,
    + const PathGenerator&           path_generator,
    + const Py::SeqBase& transforms_obj,
    + const Py::Object&              offsets_obj,
    + const agg::trans_affine&       offset_trans,
    + const Py::Object&              facecolors_obj,
    + const Py::Object&              edgecolors_obj,
    + const Py::SeqBase&  linewidths,
    + const Py::SeqBase& linestyles_obj,
    + const Py::SeqBase&    antialiaseds)
    +{
    +    typedef agg::conv_transform transformed_path_t;
    +    typedef PathNanRemover                         nan_removed_t;
    +    typedef PathClipper                                 clipped_t;
    +    typedef PathSnapper                                     snapped_t;
    +    typedef agg::conv_curve                                 snapped_curve_t;
    +    typedef agg::conv_curve                                 curve_t;
    +
    +    PyArrayObject* offsets = (PyArrayObject*)PyArray_FromObject
    +        (offsets_obj.ptr(), PyArray_DOUBLE, 0, 2);
         if (!offsets ||
             (PyArray_NDIM(offsets) == 2 && PyArray_DIM(offsets, 1) != 2) ||
    -        (PyArray_NDIM(offsets) == 1 && PyArray_DIM(offsets, 0) != 0)) {
    -      throw Py::ValueError("Offsets array must be Nx2");
    +        (PyArray_NDIM(offsets) == 1 && PyArray_DIM(offsets, 0) != 0))
    +    {
    +        Py_XDECREF(offsets);
    +        throw Py::ValueError("Offsets array must be Nx2");
         }
    +    Py::Object offsets_arr_obj((PyObject*)offsets, true);
     
         PyArrayObject* facecolors = (PyArrayObject*)PyArray_FromObject
    -      (facecolors_obj.ptr(), PyArray_DOUBLE, 1, 2);
    +        (facecolors_obj.ptr(), PyArray_DOUBLE, 1, 2);
         if (!facecolors ||
             (PyArray_NDIM(facecolors) == 1 && PyArray_DIM(facecolors, 0) != 0) ||
             (PyArray_NDIM(facecolors) == 2 && PyArray_DIM(facecolors, 1) != 4))
    -      throw Py::ValueError("Facecolors must be a Nx4 numpy array or empty");
    +    {
    +        Py_XDECREF(facecolors);
    +        throw Py::ValueError("Facecolors must be a Nx4 numpy array or empty");
    +    }
    +    Py::Object facecolors_arr_obj((PyObject*)facecolors, true);
     
         PyArrayObject* edgecolors = (PyArrayObject*)PyArray_FromObject
    -      (edgecolors_obj.ptr(), PyArray_DOUBLE, 1, 2);
    +        (edgecolors_obj.ptr(), PyArray_DOUBLE, 1, 2);
         if (!edgecolors ||
             (PyArray_NDIM(edgecolors) == 1 && PyArray_DIM(edgecolors, 0) != 0) ||
             (PyArray_NDIM(edgecolors) == 2 && PyArray_DIM(edgecolors, 1) != 4))
    -      throw Py::ValueError("Edgecolors must be a Nx4 numpy array");
    +    {
    +        Py_XDECREF(edgecolors);
    +        throw Py::ValueError("Edgecolors must be a Nx4 numpy array");
    +    }
    +    Py::Object edgecolors_arr_obj((PyObject*)edgecolors, true);
     
         size_t Npaths      = path_generator.num_paths();
         size_t Noffsets    = offsets->dimensions[0];
    @@ -1149,7 +1401,9 @@
         size_t Naa         = antialiaseds.length();
     
         if ((Nfacecolors == 0 && Nedgecolors == 0) || Npaths == 0)
    -      return Py::Object();
    +    {
    +        return Py::Object();
    +    }
     
         size_t i = 0;
     
    @@ -1157,12 +1411,13 @@
         typedef std::vector transforms_t;
         transforms_t transforms;
         transforms.reserve(Ntransforms);
    -    for (i = 0; i < Ntransforms; ++i) {
    -      agg::trans_affine trans = py_to_agg_transformation_matrix
    -        (transforms_obj[i].ptr(), false);
    -      trans *= master_transform;
    +    for (i = 0; i < Ntransforms; ++i)
    +    {
    +        agg::trans_affine trans = py_to_agg_transformation_matrix
    +            (transforms_obj[i].ptr(), false);
    +        trans *= master_transform;
     
    -      transforms.push_back(trans);
    +        transforms.push_back(trans);
         }
     
         // Convert all the dashes up front
    @@ -1171,8 +1426,10 @@
         dashes.resize(Nlinestyles);
         i = 0;
         for (dashes_t::iterator d = dashes.begin();
    -         d != dashes.end(); ++d, ++i) {
    -      convert_dashes(Py::Tuple(linestyles_obj[i]), dpi, d->second, d->first);
    +         d != dashes.end(); ++d, ++i)
    +    {
    +        convert_dashes(Py::Tuple(linestyles_obj[i]), dpi, d->second,
    +                       d->first);
         }
     
         // Handle any clipping globally
    @@ -1187,687 +1444,948 @@
         face.first = Nfacecolors != 0;
         agg::trans_affine trans;
     
    -    for (i = 0; i < N; ++i) {
    -      typename PathGenerator::path_iterator path = path_generator(i);
    +    for (i = 0; i < N; ++i)
    +    {
    +        typename PathGenerator::path_iterator path = path_generator(i);
    +
    +        if (Ntransforms)
    +        {
    +            trans = transforms[i % Ntransforms];
    +        }
    +        else
    +        {
    +            trans = master_transform;
    +        }
    +
    +        if (Noffsets)
    +        {
    +            double xo = *(double*)PyArray_GETPTR2(offsets, i % Noffsets, 0);
    +            double yo = *(double*)PyArray_GETPTR2(offsets, i % Noffsets, 1);
    +            offset_trans.transform(&xo, &yo);
    +            trans *= agg::trans_affine_translation(xo, yo);
    +        }
    +
    +        // These transformations must be done post-offsets
    +        trans *= agg::trans_affine_scaling(1.0, -1.0);
    +        trans *= agg::trans_affine_translation(0.0, (double)height);
    +
    +        if (Nfacecolors)
    +        {
    +            size_t fi = i % Nfacecolors;
    +            face.second = agg::rgba(
    +                *(double*)PyArray_GETPTR2(facecolors, fi, 0),
    +                *(double*)PyArray_GETPTR2(facecolors, fi, 1),
    +                *(double*)PyArray_GETPTR2(facecolors, fi, 2),
    +                *(double*)PyArray_GETPTR2(facecolors, fi, 3));
    +        }
    +
    +        if (Nedgecolors)
    +        {
    +            size_t ei = i % Nedgecolors;
    +            gc.color = agg::rgba(
    +                *(double*)PyArray_GETPTR2(edgecolors, ei, 0),
    +                *(double*)PyArray_GETPTR2(edgecolors, ei, 1),
    +                *(double*)PyArray_GETPTR2(edgecolors, ei, 2),
    +                *(double*)PyArray_GETPTR2(edgecolors, ei, 3));
    +
    +            if (Nlinewidths)
    +            {
    +                gc.linewidth = double(Py::Float(linewidths[i % Nlinewidths])) * dpi / 72.0;
    +            }
    +            else
    +            {
    +                gc.linewidth = 1.0;
    +            }
    +            if (Nlinestyles)
    +            {
    +                gc.dashes = dashes[i % Nlinestyles].second;
    +                gc.dashOffset = dashes[i % Nlinestyles].first;
    +            }
    +        }
    +
    +        bool do_clip = !face.first && gc.hatchpath.isNone() && !has_curves;
    +
    +        if (check_snap)
    +        {
    +            gc.isaa = bool(Py::Int(antialiaseds[i % Naa]));
    +
    +            transformed_path_t tpath(path, trans);
    +            nan_removed_t      nan_removed(tpath, true, has_curves);
    +            clipped_t          clipped(nan_removed, do_clip, width, height);
    +            snapped_t          snapped(clipped, gc.snap_mode,
    +                                       path.total_vertices(), gc.linewidth);
    +            if (has_curves)
    +            {
    +                snapped_curve_t curve(snapped);
    +                _draw_path(curve, has_clippath, face, gc);
    +            }
    +            else
    +            {
    +                _draw_path(snapped, has_clippath, face, gc);
    +            }
    +        }
    +        else
    +        {
    +            gc.isaa = bool(Py::Int(antialiaseds[i % Naa]));
    +
    +            transformed_path_t tpath(path, trans);
    +            nan_removed_t      nan_removed(tpath, true, has_curves);
    +            clipped_t          clipped(nan_removed, do_clip, width, height);
    +            if (has_curves)
    +            {
    +                curve_t curve(clipped);
    +                _draw_path(curve, has_clippath, face, gc);
    +            }
    +            else
    +            {
    +                _draw_path(clipped, has_clippath, face, gc);
    +            }
    +        }
    +    }
     
    -      if (Ntransforms) {
    -        trans = transforms[i % Ntransforms];
    -      } else {
    -        trans = master_transform;
    -      }
    -
    -      if (Noffsets) {
    -        double xo = *(double*)PyArray_GETPTR2(offsets, i % Noffsets, 0);
    -        double yo = *(double*)PyArray_GETPTR2(offsets, i % Noffsets, 1);
    -        offset_trans.transform(&xo, &yo);
    -        trans *= agg::trans_affine_translation(xo, yo);
    -      }
    -
    -      // These transformations must be done post-offsets
    -      trans *= agg::trans_affine_scaling(1.0, -1.0);
    -      trans *= agg::trans_affine_translation(0.0, (double)height);
    -
    -      if (Nfacecolors) {
    -        size_t fi = i % Nfacecolors;
    -        face.second = agg::rgba(*(double*)PyArray_GETPTR2(facecolors, fi, 0),
    -                                *(double*)PyArray_GETPTR2(facecolors, fi, 1),
    -                                *(double*)PyArray_GETPTR2(facecolors, fi, 2),
    -                                *(double*)PyArray_GETPTR2(facecolors, fi, 3));
    -      }
    -
    -      if (Nedgecolors) {
    -        size_t ei = i % Nedgecolors;
    -        gc.color = agg::rgba(*(double*)PyArray_GETPTR2(edgecolors, ei, 0),
    -                             *(double*)PyArray_GETPTR2(edgecolors, ei, 1),
    -                             *(double*)PyArray_GETPTR2(edgecolors, ei, 2),
    -                             *(double*)PyArray_GETPTR2(edgecolors, ei, 3));
    -
    -        if (Nlinewidths) {
    -          gc.linewidth = double(Py::Float(linewidths[i % Nlinewidths])) * dpi/72.0;
    -        } else {
    -          gc.linewidth = 1.0;
    -        }
    -        if (Nlinestyles) {
    -          gc.dashes = dashes[i % Nlinestyles].second;
    -          gc.dashOffset = dashes[i % Nlinestyles].first;
    -        }
    -      }
    -
    -      bool do_clip = !face.first && gc.hatchpath.isNone();
    -
    -      if (check_snap) {
    -        gc.isaa = bool(Py::Int(antialiaseds[i % Naa]));
    -
    -        transformed_path_t tpath(path, trans);
    -        nan_removed_t      nan_removed(tpath, true, has_curves);
    -        clipped_t          clipped(nan_removed, do_clip, width, height);
    -        quantized_t        quantized(clipped, gc.quantize_mode, path.total_vertices());
    -        if (has_curves) {
    -          quantized_curve_t curve(quantized);
    -          _draw_path(curve, has_clippath, face, gc);
    -        } else {
    -          _draw_path(quantized, has_clippath, face, gc);
    -        }
    -      } else {
    -        gc.isaa = bool(Py::Int(antialiaseds[i % Naa]));
    -
    -        transformed_path_t tpath(path, trans);
    -        nan_removed_t      nan_removed(tpath, true, has_curves);
    -        clipped_t          clipped(nan_removed, do_clip, width, height);
    -        if (has_curves) {
    -          curve_t curve(clipped);
    -          _draw_path(curve, has_clippath, face, gc);
    -        } else {
    -          _draw_path(clipped, has_clippath, face, gc);
    -        }
    -      }
    -    }
    -
    -    Py_XDECREF(offsets);
    -    Py_XDECREF(facecolors);
    -    Py_XDECREF(edgecolors);
         return Py::Object();
    -  } catch (...) {
    -    Py_XDECREF(offsets);
    -    Py_XDECREF(facecolors);
    -    Py_XDECREF(edgecolors);
    -    throw;
    -  }
     }
     
     
    -class PathListGenerator {
    -  const Py::SeqBase& m_paths;
    -  size_t m_npaths;
    +class PathListGenerator
    +{
    +    const Py::SeqBase& m_paths;
    +    size_t m_npaths;
     
     public:
    -  typedef PathIterator path_iterator;
    +    typedef PathIterator path_iterator;
     
    -  inline PathListGenerator(const Py::SeqBase& paths) :
    -    m_paths(paths), m_npaths(paths.size()) {
    +    inline
    +    PathListGenerator(const Py::SeqBase& paths) :
    +        m_paths(paths), m_npaths(paths.size())
    +    {
     
    -  }
    +    }
     
    -  inline size_t num_paths() const {
    -    return m_npaths;
    -  }
    +    inline size_t
    +    num_paths() const
    +    {
    +        return m_npaths;
    +    }
     
    -  inline path_iterator operator()(size_t i) const {
    -    return PathIterator(m_paths[i % m_npaths]);
    -  }
    +    inline path_iterator
    +    operator()(size_t i) const
    +    {
    +        return PathIterator(m_paths[i % m_npaths]);
    +    }
     };
     
    +
     Py::Object
    -RendererAgg::draw_path_collection(const Py::Tuple& args) {
    -  _VERBOSE("RendererAgg::draw_path_collection");
    -  args.verify_length(14);
    -
    -  //segments, trans, clipbox, colors, linewidths, antialiaseds
    -  agg::trans_affine       master_transform = py_to_agg_transformation_matrix(args[0].ptr());
    -  Py::Object              cliprect         = args[1];
    -  Py::Object              clippath         = args[2];
    -  agg::trans_affine       clippath_trans   = py_to_agg_transformation_matrix(args[3].ptr(), false);
    -  Py::SeqBase paths            = args[4];
    -  Py::SeqBase transforms_obj   = args[5];
    -  Py::Object              offsets_obj      = args[6];
    -  agg::trans_affine       offset_trans     = py_to_agg_transformation_matrix(args[7].ptr());
    -  Py::Object              facecolors_obj   = args[8];
    -  Py::Object              edgecolors_obj   = args[9];
    -  Py::SeqBase  linewidths       = args[10];
    -  Py::SeqBase linestyles_obj   = args[11];
    -  Py::SeqBase    antialiaseds     = args[12];
    -  // We don't actually care about urls for Agg, so just ignore it.
    -  // Py::SeqBase urls             = args[13];
    -  PathListGenerator path_generator(paths);
    -
    -  try {
    -    _draw_path_collection_generic
    -      (master_transform,
    -       cliprect,
    -       clippath,
    -       clippath_trans,
    -       path_generator,
    -       transforms_obj,
    -       offsets_obj,
    -       offset_trans,
    -       facecolors_obj,
    -       edgecolors_obj,
    -       linewidths,
    -       linestyles_obj,
    -       antialiaseds);
    -  } catch (const char *e) {
    -    throw Py::RuntimeError(e);
    -  }
    -
    -  return Py::Object();
    -}
    -
    -class QuadMeshGenerator {
    -  size_t m_meshWidth;
    -  size_t m_meshHeight;
    -  PyArrayObject* m_coordinates;
    -
    -  class QuadMeshPathIterator {
    -    size_t m_iterator;
    -    size_t m_m, m_n;
    +RendererAgg::draw_path_collection(const Py::Tuple& args)
    +{
    +    _VERBOSE("RendererAgg::draw_path_collection");
    +    args.verify_length(12);
    +
    +    Py::Object gc_obj = args[0];
    +    GCAgg gc(gc_obj, dpi);
    +    agg::trans_affine       master_transform = py_to_agg_transformation_matrix(args[1].ptr());
    +    Py::SeqBase path   = args[2];
    +    PathListGenerator       path_generator(path);
    +    Py::SeqBase transforms_obj   = args[3];
    +    Py::Object              offsets_obj      = args[4];
    +    agg::trans_affine       offset_trans     = py_to_agg_transformation_matrix(args[5].ptr());
    +    Py::Object              facecolors_obj   = args[6];
    +    Py::Object              edgecolors_obj   = args[7];
    +    Py::SeqBase  linewidths       = args[8];
    +    Py::SeqBase linestyles_obj   = args[9];
    +    Py::SeqBase    antialiaseds     = args[10];
    +    // We don't actually care about urls for Agg, so just ignore it.
    +    // Py::SeqBase urls             = args[11];
    +
    +    try
    +    {
    +        _draw_path_collection_generic
    +        (gc,
    +         master_transform,
    +         gc.cliprect,
    +         gc.clippath,
    +         gc.clippath_trans,
    +         path_generator,
    +         transforms_obj,
    +         offsets_obj,
    +         offset_trans,
    +         facecolors_obj,
    +         edgecolors_obj,
    +         linewidths,
    +         linestyles_obj,
    +         antialiaseds);
    +    }
    +    catch (const char *e)
    +    {
    +        throw Py::RuntimeError(e);
    +    }
    +
    +    return Py::Object();
    +}
    +
    +
    +class QuadMeshGenerator
    +{
    +    size_t m_meshWidth;
    +    size_t m_meshHeight;
         PyArrayObject* m_coordinates;
    -  public:
    -    QuadMeshPathIterator(size_t m, size_t n, PyArrayObject* coordinates) :
    -      m_iterator(0), m_m(m), m_n(n), m_coordinates(coordinates) {
    +
    +    class QuadMeshPathIterator
    +    {
    +        size_t m_iterator;
    +        size_t m_m, m_n;
    +        PyArrayObject* m_coordinates;
    +
    +    public:
    +        QuadMeshPathIterator(size_t m, size_t n, PyArrayObject* coordinates) :
    +            m_iterator(0), m_m(m), m_n(n), m_coordinates(coordinates)
    +        {
    +
    +        }
    +
    +    private:
    +        inline unsigned
    +        vertex(unsigned idx, double* x, double* y)
    +        {
    +            size_t m = m_m + ((idx     & 0x2) >> 1);
    +            size_t n = m_n + (((idx + 1) & 0x2) >> 1);
    +            double* pair = (double*)PyArray_GETPTR2(m_coordinates, n, m);
    +            *x = *pair++;
    +            *y = *pair;
    +            return (idx) ? agg::path_cmd_line_to : agg::path_cmd_move_to;
    +        }
    +
    +    public:
    +        inline unsigned
    +        vertex(double* x, double* y)
    +        {
    +            if (m_iterator >= total_vertices())
    +            {
    +                return agg::path_cmd_stop;
    +            }
    +            return vertex(m_iterator++, x, y);
    +        }
    +
    +        inline void
    +        rewind(unsigned path_id)
    +        {
    +            m_iterator = path_id;
    +        }
    +
    +        inline unsigned
    +        total_vertices()
    +        {
    +            return 5;
    +        }
    +
    +        inline bool
    +        should_simplify()
    +        {
    +            return false;
    +        }
    +    };
    +
    +public:
    +    typedef QuadMeshPathIterator path_iterator;
    +
    +    inline
    +    QuadMeshGenerator(size_t meshWidth, size_t meshHeight, PyObject* coordinates) :
    +        m_meshWidth(meshWidth), m_meshHeight(meshHeight), m_coordinates(NULL)
    +    {
    +        PyArrayObject* coordinates_array = \
    +            (PyArrayObject*)PyArray_ContiguousFromObject(
    +                coordinates, PyArray_DOUBLE, 3, 3);
    +
    +        if (!coordinates_array)
    +        {
    +            throw Py::ValueError("Invalid coordinates array.");
    +        }
    +
    +        m_coordinates = coordinates_array;
         }
     
    -  private:
    -    inline unsigned vertex(unsigned idx, double* x, double* y) {
    -      size_t m = m_m + ((idx     & 0x2) >> 1);
    -      size_t n = m_n + (((idx+1) & 0x2) >> 1);
    -      double* pair = (double*)PyArray_GETPTR2(m_coordinates, n, m);
    -      *x = *pair++;
    -      *y = *pair;
    -      return (idx) ? agg::path_cmd_line_to : agg::path_cmd_move_to;
    +    inline
    +    ~QuadMeshGenerator()
    +    {
    +        Py_XDECREF(m_coordinates);
         }
     
    -  public:
    -    inline unsigned vertex(double* x, double* y) {
    -      if (m_iterator >= total_vertices())
    -        return agg::path_cmd_stop;
    -      return vertex(m_iterator++, x, y);
    +    inline size_t
    +    num_paths() const
    +    {
    +        return m_meshWidth * m_meshHeight;
         }
     
    -    inline void rewind(unsigned path_id) {
    -      m_iterator = path_id;
    +    inline path_iterator
    +    operator()(size_t i) const
    +    {
    +        return QuadMeshPathIterator(i % m_meshWidth, i / m_meshWidth, m_coordinates);
         }
    +};
    +
    +Py::Object
    +RendererAgg::draw_quad_mesh(const Py::Tuple& args)
    +{
    +    _VERBOSE("RendererAgg::draw_quad_mesh");
    +    args.verify_length(10);
     
    -    inline unsigned total_vertices() {
    -      return 5;
    +    //segments, trans, clipbox, colors, linewidths, antialiaseds
    +    GCAgg gc(args[0], dpi);
    +    agg::trans_affine       master_transform = py_to_agg_transformation_matrix(args[1].ptr());
    +    size_t                  mesh_width       = Py::Int(args[2]);
    +    size_t                  mesh_height      = Py::Int(args[3]);
    +    Py::Object              coordinates      = args[4];
    +    Py::Object              offsets_obj      = args[5];
    +    agg::trans_affine       offset_trans     = py_to_agg_transformation_matrix(args[6].ptr());
    +    Py::Object              facecolors_obj   = args[7];
    +    bool                    antialiased      = (bool)Py::Int(args[8]);
    +    bool                    showedges        = (bool)Py::Int(args[9]);
    +    bool                    free_edgecolors  = false;
    +
    +    QuadMeshGenerator path_generator(mesh_width, mesh_height, coordinates.ptr());
    +
    +    Py::SeqBase transforms_obj;
    +    Py::Object edgecolors_obj;
    +    Py::Tuple linewidths(1);
    +    linewidths[0] = Py::Float(gc.linewidth);
    +    Py::SeqBase linestyles_obj;
    +    Py::Tuple antialiaseds(1);
    +    antialiaseds[0] = Py::Int(antialiased ? 1 : 0);
    +
    +    if (showedges)
    +    {
    +        npy_intp dims[] = { 1, 4, 0 };
    +        double data[] = { 0, 0, 0, 1 };
    +        edgecolors_obj = Py::Object(PyArray_SimpleNewFromData(2, dims, PyArray_DOUBLE,
    +                                                              (char*)data), true);
    +    }
    +    else
    +    {
    +        if (antialiased)
    +        {
    +            edgecolors_obj = facecolors_obj;
    +        }
    +        else
    +        {
    +            npy_intp dims[] = { 0, 0 };
    +            edgecolors_obj = PyArray_SimpleNew(1, dims, PyArray_DOUBLE);
    +            free_edgecolors = true;
    +        }
         }
     
    -    inline bool should_simplify() {
    -      return false;
    +    try
    +    {
    +        _draw_path_collection_generic
    +            (gc,
    +             master_transform,
    +             gc.cliprect,
    +             gc.clippath,
    +             gc.clippath_trans,
    +             path_generator,
    +             transforms_obj,
    +             offsets_obj,
    +             offset_trans,
    +             facecolors_obj,
    +             edgecolors_obj,
    +             linewidths,
    +             linestyles_obj,
    +             antialiaseds);
    +    }
    +    catch (const char* e)
    +    {
    +        throw Py::RuntimeError(e);
         }
    -  };
     
    -public:
    -  typedef QuadMeshPathIterator path_iterator;
    +    return Py::Object();
    +}
     
    -  inline QuadMeshGenerator(size_t meshWidth, size_t meshHeight, PyObject* coordinates) :
    -    m_meshWidth(meshWidth), m_meshHeight(meshHeight), m_coordinates(NULL) {
    -    PyArrayObject* coordinates_array = (PyArrayObject*)PyArray_ContiguousFromObject(coordinates, PyArray_DOUBLE, 3, 3);
    -    if (!coordinates_array) {
    -      throw Py::ValueError("Invalid coordinates array.");
    -    }
    +void
    +RendererAgg::_draw_gouraud_triangle(const double* points,
    +                                    const double* colors,
    +                                    agg::trans_affine trans,
    +                                    bool has_clippath)
    +{
    +    typedef agg::rgba8                                         color_t;
    +    typedef agg::span_gouraud_rgba                    span_gen_t;
    +    typedef agg::span_allocator                       span_alloc_t;
     
    -    m_coordinates = coordinates_array;
    -  }
    +    trans *= agg::trans_affine_scaling(1.0, -1.0);
    +    trans *= agg::trans_affine_translation(0.0, (double)height);
     
    -  inline ~QuadMeshGenerator() {
    -    Py_XDECREF(m_coordinates);
    -  }
    +    double tpoints[6];
     
    -  inline size_t num_paths() const {
    -    return m_meshWidth * m_meshHeight;
    -  }
    +    for (int i = 0; i < 6; i += 2)
    +    {
    +        tpoints[i] = points[i];
    +        tpoints[i+1] = points[i+1];
    +        trans.transform(&tpoints[i], &tpoints[i+1]);
    +    }
    +
    +    span_alloc_t span_alloc;
    +    span_gen_t span_gen;
    +
    +    span_gen.colors(
    +        agg::rgba(colors[0], colors[1], colors[2], colors[3]),
    +        agg::rgba(colors[4], colors[5], colors[6], colors[7]),
    +        agg::rgba(colors[8], colors[9], colors[10], colors[11]));
    +    span_gen.triangle(
    +        tpoints[0], tpoints[1],
    +        tpoints[2], tpoints[3],
    +        tpoints[4], tpoints[5],
    +        0.5);
    +
    +    theRasterizer.add_path(span_gen);
    +
    +    if (has_clippath)
    +    {
    +        typedef agg::pixfmt_amask_adaptor pixfmt_amask_type;
    +        typedef agg::renderer_base              amask_ren_type;
    +        typedef agg::renderer_scanline_aa
    +        amask_aa_renderer_type;
    +
    +        pixfmt_amask_type pfa(pixFmt, alphaMask);
    +        amask_ren_type r(pfa);
    +        amask_aa_renderer_type ren(r, span_alloc, span_gen);
    +        agg::render_scanlines(theRasterizer, slineP8, ren);
    +    }
    +    else
    +    {
    +        agg::render_scanlines_aa(theRasterizer, slineP8, rendererBase, span_alloc, span_gen);
    +    }
    +}
     
    -  inline path_iterator operator()(size_t i) const {
    -    return QuadMeshPathIterator(i % m_meshWidth, i / m_meshWidth, m_coordinates);
    -  }
    -};
     
     Py::Object
    -RendererAgg::draw_quad_mesh(const Py::Tuple& args) {
    -  _VERBOSE("RendererAgg::draw_quad_mesh");
    -  args.verify_length(12);
    -
    -
    -  //segments, trans, clipbox, colors, linewidths, antialiaseds
    -  agg::trans_affine       master_transform = py_to_agg_transformation_matrix(args[0].ptr());
    -  Py::Object              cliprect         = args[1];
    -  Py::Object              clippath         = args[2];
    -  agg::trans_affine       clippath_trans   = py_to_agg_transformation_matrix(args[3].ptr(), false);
    -  size_t                  mesh_width       = Py::Int(args[4]);
    -  size_t                  mesh_height      = Py::Int(args[5]);
    -  PyObject*               coordinates      = args[6].ptr();
    -  Py::Object              offsets_obj      = args[7];
    -  agg::trans_affine       offset_trans     = py_to_agg_transformation_matrix(args[8].ptr());
    -  Py::Object              facecolors_obj   = args[9];
    -  bool                    antialiased      = (bool)Py::Int(args[10]);
    -  bool                    showedges        = (bool)Py::Int(args[11]);
    -  bool                    free_edgecolors  = false;
    -
    -  QuadMeshGenerator path_generator(mesh_width, mesh_height, coordinates);
    -
    -  Py::SeqBase transforms_obj;
    -  Py::Object edgecolors_obj;
    -  Py::Tuple linewidths(1);
    -  linewidths[0] = Py::Float(1.0);
    -  Py::SeqBase linestyles_obj;
    -  Py::Tuple antialiaseds(1);
    -  antialiaseds[0] = Py::Int(antialiased ? 1 : 0);
    -
    -  if (showedges) {
    -    npy_intp dims[] = { 1, 4, 0 };
    -    double data[] = { 0, 0, 0, 1 };
    -    edgecolors_obj = PyArray_SimpleNewFromData(2, dims, PyArray_DOUBLE, (char*)data);
    -    free_edgecolors = true;
    -  } else {
    -    if (antialiased) {
    -      edgecolors_obj = facecolors_obj;
    -    } else {
    -      npy_intp dims[] = { 0, 0 };
    -      edgecolors_obj = PyArray_SimpleNew(1, dims, PyArray_DOUBLE);
    -      free_edgecolors = true;
    -    }
    -  }
    -
    -  try {
    -    try {
    -      _draw_path_collection_generic
    -        (master_transform,
    -         cliprect,
    -         clippath,
    -         clippath_trans,
    -         path_generator,
    -         transforms_obj,
    -         offsets_obj,
    -         offset_trans,
    -         facecolors_obj,
    -         edgecolors_obj,
    -         linewidths,
    -         linestyles_obj,
    -         antialiaseds);
    -    } catch (const char* e) {
    -      throw Py::RuntimeError(e);
    +RendererAgg::draw_gouraud_triangle(const Py::Tuple& args)
    +{
    +    _VERBOSE("RendererAgg::draw_gouraud_triangle");
    +    args.verify_length(4);
    +
    +    GCAgg             gc(args[0], dpi);
    +    Py::Object        points_obj = args[1];
    +    Py::Object        colors_obj = args[2];
    +    agg::trans_affine trans      = py_to_agg_transformation_matrix(args[3].ptr());
    +
    +    theRasterizer.reset_clipping();
    +    rendererBase.reset_clipping(true);
    +    set_clipbox(gc.cliprect, theRasterizer);
    +    bool has_clippath = render_clippath(gc.clippath, gc.clippath_trans);
    +
    +    PyArrayObject* points = (PyArrayObject*)PyArray_ContiguousFromAny
    +        (points_obj.ptr(), PyArray_DOUBLE, 2, 2);
    +    if (!points ||
    +        PyArray_DIM(points, 0) != 3 || PyArray_DIM(points, 1) != 2)
    +    {
    +        Py_XDECREF(points);
    +        throw Py::ValueError("points must be a 3x2 numpy array");
         }
    -  } catch (...) {
    -    if (free_edgecolors) {
    -      Py_XDECREF(edgecolors_obj.ptr());
    +    points_obj = Py::Object((PyObject*)points, true);
    +
    +    PyArrayObject* colors = (PyArrayObject*)PyArray_ContiguousFromAny
    +        (colors_obj.ptr(), PyArray_DOUBLE, 2, 2);
    +    if (!colors ||
    +        PyArray_DIM(colors, 0) != 3 || PyArray_DIM(colors, 1) != 4)
    +    {
    +        Py_XDECREF(colors);
    +        throw Py::ValueError("colors must be a 3x4 numpy array");
         }
    -    throw;
    -  }
    +    colors_obj = Py::Object((PyObject*)colors, true);
     
    -  if (free_edgecolors) {
    -    Py_XDECREF(edgecolors_obj.ptr());
    -  }
    +    _draw_gouraud_triangle(
    +        (double*)PyArray_DATA(points), (double*)PyArray_DATA(colors),
    +        trans, has_clippath);
     
    -  return Py::Object();
    +    return Py::Object();
     }
     
    +
     Py::Object
    -RendererAgg::write_rgba(const Py::Tuple& args) {
    -  _VERBOSE("RendererAgg::write_rgba");
    +RendererAgg::draw_gouraud_triangles(const Py::Tuple& args)
    +{
    +    _VERBOSE("RendererAgg::draw_gouraud_triangles");
    +    args.verify_length(4);
     
    -  args.verify_length(1);
    +    typedef agg::rgba8                      color_t;
    +    typedef agg::span_gouraud_rgba span_gen_t;
    +    typedef agg::span_allocator    span_alloc_t;
    +
    +    GCAgg             gc(args[0], dpi);
    +    Py::Object        points_obj = args[1];
    +    Py::Object        colors_obj = args[2];
    +    agg::trans_affine trans      = py_to_agg_transformation_matrix(args[3].ptr());
     
    -  FILE *fp = NULL;
    -  bool close_file = false;
    -  Py::Object py_fileobj = Py::Object(args[0]);
    -  if (py_fileobj.isString()) {
    -    std::string fileName = Py::String(py_fileobj);
    -    const char *file_name = fileName.c_str();
    -    if ((fp = fopen(file_name, "wb")) == NULL)
    -      throw Py::RuntimeError( Printf("Could not open file %s", file_name).str() );
    -    if (fwrite(pixBuffer, 1, NUMBYTES, fp) != NUMBYTES) {
    -      fclose(fp);
    -      throw Py::RuntimeError( Printf("Error writing to file %s", file_name).str() );
    -    }
    -    close_file = true;
    -  } else if (PyFile_CheckExact(py_fileobj.ptr())) {
    -    fp = PyFile_AsFile(py_fileobj.ptr());
    -    if (fwrite(pixBuffer, 1, NUMBYTES, fp) != NUMBYTES) {
    -      throw Py::RuntimeError( "Error writing to file" );
    +    theRasterizer.reset_clipping();
    +    rendererBase.reset_clipping(true);
    +    set_clipbox(gc.cliprect, theRasterizer);
    +    bool has_clippath = render_clippath(gc.clippath, gc.clippath_trans);
    +
    +    PyArrayObject* points = (PyArrayObject*)PyArray_ContiguousFromAny
    +        (points_obj.ptr(), PyArray_DOUBLE, 3, 3);
    +    if (!points ||
    +        PyArray_DIM(points, 1) != 3 || PyArray_DIM(points, 2) != 2)
    +    {
    +        Py_XDECREF(points);
    +        throw Py::ValueError("points must be a Nx3x2 numpy array");
         }
    -  } else {
    -    PyObject* write_method = PyObject_GetAttrString(py_fileobj.ptr(), "write");
    -    if (!(write_method && PyCallable_Check(write_method))) {
    -      Py_XDECREF(write_method);
    -      throw Py::TypeError("Object does not appear to be a 8-bit string path or a Python file-like object");
    +    points_obj = Py::Object((PyObject*)points, true);
    +
    +    PyArrayObject* colors = (PyArrayObject*)PyArray_ContiguousFromAny
    +        (colors_obj.ptr(), PyArray_DOUBLE, 3, 3);
    +    if (!colors ||
    +        PyArray_DIM(colors, 1) != 3 || PyArray_DIM(colors, 2) != 4)
    +    {
    +        Py_XDECREF(colors);
    +        throw Py::ValueError("colors must be a Nx3x4 numpy array");
         }
    +    colors_obj = Py::Object((PyObject*)colors, true);
     
    -    PyObject_CallFunction(write_method, (char *)"s#", pixBuffer, NUMBYTES);
    +    if (PyArray_DIM(points, 0) != PyArray_DIM(colors, 0))
    +    {
    +        throw Py::ValueError("points and colors arrays must be the same length");
    +    }
     
    -    Py_XDECREF(write_method);
    -  }
    +    for (int i = 0; i < PyArray_DIM(points, 0); ++i)
    +    {
    +        _draw_gouraud_triangle(
    +            (double*)PyArray_GETPTR1(points, i),
    +            (double*)PyArray_GETPTR1(colors, i), trans, has_clippath);
    +    }
     
    -  return Py::Object();
    +    return Py::Object();
     }
     
    -Py::Object
    -RendererAgg::tostring_rgb(const Py::Tuple& args) {
    -  //"Return the rendered buffer as an RGB string";
     
    -  _VERBOSE("RendererAgg::tostring_rgb");
    -
    -  args.verify_length(0);
    -  int row_len = width*3;
    -  unsigned char* buf_tmp = new unsigned char[row_len * height];
    -  if (buf_tmp == NULL) {
    -    //todo: also handle allocation throw
    -    throw Py::MemoryError("RendererAgg::tostring_rgb could not allocate memory");
    -  }
    +Py::Object
    +RendererAgg::write_rgba(const Py::Tuple& args)
    +{
    +    _VERBOSE("RendererAgg::write_rgba");
     
    -  try {
    -    agg::rendering_buffer renderingBufferTmp;
    -    renderingBufferTmp.attach(buf_tmp,
    -                              width,
    -                              height,
    -                              row_len);
    +    args.verify_length(1);
     
    -    agg::color_conv(&renderingBufferTmp, &renderingBuffer, agg::color_conv_rgba32_to_rgb24());
    +    FILE *fp = NULL;
    +    bool close_file = false;
    +    Py::Object py_fileobj = Py::Object(args[0]);
    +    if (py_fileobj.isString())
    +    {
    +        std::string fileName = Py::String(py_fileobj);
    +        const char *file_name = fileName.c_str();
    +        if ((fp = fopen(file_name, "wb")) == NULL)
    +            throw Py::RuntimeError(
    +                Printf("Could not open file %s", file_name).str());
    +        if (fwrite(pixBuffer, 1, NUMBYTES, fp) != NUMBYTES)
    +        {
    +            fclose(fp);
    +            throw Py::RuntimeError(
    +                Printf("Error writing to file %s", file_name).str());
    +        }
    +        close_file = true;
    +    }
    +    else if (PyFile_CheckExact(py_fileobj.ptr()))
    +    {
    +        fp = PyFile_AsFile(py_fileobj.ptr());
    +        if (fwrite(pixBuffer, 1, NUMBYTES, fp) != NUMBYTES)
    +        {
    +            throw Py::RuntimeError("Error writing to file");
    +        }
    +    }
    +    else
    +    {
    +        PyObject* write_method = PyObject_GetAttrString(py_fileobj.ptr(),
    +                                                        "write");
    +        if (!(write_method && PyCallable_Check(write_method)))
    +        {
    +            Py_XDECREF(write_method);
    +            throw Py::TypeError(
    +                "Object does not appear to be a 8-bit string path or a Python file-like object");
    +        }
     
    -  } catch (...) {
    -    delete [] buf_tmp;
    -    throw Py::RuntimeError("Unknown exception occurred in tostring_rgb");
    -  }
    +        PyObject_CallFunction(write_method, (char *)"s#", pixBuffer, NUMBYTES);
     
    -  //todo: how to do this with native CXX
    -  PyObject* o = Py_BuildValue("s#", buf_tmp, row_len * height);
    +        Py_XDECREF(write_method);
    +    }
     
    -  delete [] buf_tmp;
    -  return Py::asObject(o);
    +    return Py::Object();
     }
     
     
     Py::Object
    -RendererAgg::tostring_argb(const Py::Tuple& args) {
    -  //"Return the rendered buffer as an RGB string";
    +RendererAgg::tostring_rgb(const Py::Tuple& args)
    +{
    +    //"Return the rendered buffer as an RGB string";
     
    -  _VERBOSE("RendererAgg::tostring_argb");
    +    _VERBOSE("RendererAgg::tostring_rgb");
     
    -  args.verify_length(0);
    -  int row_len = width*4;
    -  unsigned char* buf_tmp = new unsigned char[row_len * height];
    -  if (buf_tmp ==NULL) {
    -    //todo: also handle allocation throw
    -    throw Py::MemoryError("RendererAgg::tostring_argb could not allocate memory");
    -  }
    +    args.verify_length(0);
    +    int row_len = width * 3;
    +    unsigned char* buf_tmp = new unsigned char[row_len * height];
    +    if (buf_tmp == NULL)
    +    {
    +        //todo: also handle allocation throw
    +        throw Py::MemoryError(
    +            "RendererAgg::tostring_rgb could not allocate memory");
    +    }
     
    -  try {
    -    agg::rendering_buffer renderingBufferTmp;
    -    renderingBufferTmp.attach(buf_tmp, width, height, row_len);
    -    agg::color_conv(&renderingBufferTmp, &renderingBuffer, agg::color_conv_rgba32_to_argb32());
    -  } catch (...) {
    -    delete [] buf_tmp;
    -    throw Py::RuntimeError("Unknown exception occurred in tostring_argb");
    -  }
    +    try
    +    {
    +        agg::rendering_buffer renderingBufferTmp;
    +        renderingBufferTmp.attach(buf_tmp,
    +                                  width,
    +                                  height,
    +                                  row_len);
    +
    +        agg::color_conv(&renderingBufferTmp, &renderingBuffer,
    +                        agg::color_conv_rgba32_to_rgb24());
    +    }
    +    catch (...)
    +    {
    +        delete [] buf_tmp;
    +        throw Py::RuntimeError("Unknown exception occurred in tostring_rgb");
    +    }
     
    -  //todo: how to do this with native CXX
    -  PyObject* o = Py_BuildValue("s#", buf_tmp, row_len * height);
    -  delete [] buf_tmp;
    -  return Py::asObject(o);
    +    //todo: how to do this with native CXX
    +    PyObject* o = Py_BuildValue("s#", buf_tmp, row_len * height);
    +
    +    delete [] buf_tmp;
    +    return Py::asObject(o);
     }
     
    +
     Py::Object
    -RendererAgg::tostring_bgra(const Py::Tuple& args) {
    -  //"Return the rendered buffer as an RGB string";
    -
    -  _VERBOSE("RendererAgg::tostring_bgra");
    -
    -  args.verify_length(0);
    -  int row_len = width*4;
    -  unsigned char* buf_tmp = new unsigned char[row_len * height];
    -  if (buf_tmp ==NULL) {
    -    //todo: also handle allocation throw
    -    throw Py::MemoryError("RendererAgg::tostring_bgra could not allocate memory");
    -  }
    -
    -  try {
    -    agg::rendering_buffer renderingBufferTmp;
    -    renderingBufferTmp.attach(buf_tmp,
    -                              width,
    -                              height,
    -                              row_len);
    +RendererAgg::tostring_argb(const Py::Tuple& args)
    +{
    +    //"Return the rendered buffer as an RGB string";
     
    -    agg::color_conv(&renderingBufferTmp, &renderingBuffer, agg::color_conv_rgba32_to_bgra32());
    -  } catch (...) {
    -    delete [] buf_tmp;
    -    throw Py::RuntimeError("Unknown exception occurred in tostring_bgra");
    -  }
    +    _VERBOSE("RendererAgg::tostring_argb");
    +
    +    args.verify_length(0);
    +    int row_len = width * 4;
    +    unsigned char* buf_tmp = new unsigned char[row_len * height];
    +    if (buf_tmp == NULL)
    +    {
    +        //todo: also handle allocation throw
    +        throw Py::MemoryError("RendererAgg::tostring_argb could not allocate memory");
    +    }
     
    -  //todo: how to do this with native CXX
    -  PyObject* o = Py_BuildValue("s#",
    -                              buf_tmp,
    -                              row_len * height);
    -  delete [] buf_tmp;
    -  return Py::asObject(o);
    +    try
    +    {
    +        agg::rendering_buffer renderingBufferTmp;
    +        renderingBufferTmp.attach(buf_tmp, width, height, row_len);
    +        agg::color_conv(&renderingBufferTmp, &renderingBuffer, agg::color_conv_rgba32_to_argb32());
    +    }
    +    catch (...)
    +    {
    +        delete [] buf_tmp;
    +        throw Py::RuntimeError("Unknown exception occurred in tostring_argb");
    +    }
    +
    +    //todo: how to do this with native CXX
    +    PyObject* o = Py_BuildValue("s#", buf_tmp, row_len * height);
    +    delete [] buf_tmp;
    +    return Py::asObject(o);
     }
     
    +
     Py::Object
    -RendererAgg::buffer_rgba(const Py::Tuple& args) {
    -  //"expose the rendered buffer as Python buffer object, starting from postion x,y";
    +RendererAgg::tostring_bgra(const Py::Tuple& args)
    +{
    +    //"Return the rendered buffer as an RGB string";
     
    -  _VERBOSE("RendererAgg::buffer_rgba");
    +    _VERBOSE("RendererAgg::tostring_bgra");
     
    -  args.verify_length(2);
    -  int startw = Py::Int(args[0]);
    -  int starth = Py::Int(args[1]);
    -  int row_len = width*4;
    -  int start=row_len*starth+startw*4;
    -  return Py::asObject(PyBuffer_FromMemory( pixBuffer+start, row_len*height-start));
    +    args.verify_length(0);
    +    int row_len = width * 4;
    +    unsigned char* buf_tmp = new unsigned char[row_len * height];
    +    if (buf_tmp == NULL)
    +    {
    +        //todo: also handle allocation throw
    +        throw Py::MemoryError("RendererAgg::tostring_bgra could not allocate memory");
    +    }
    +
    +    try
    +    {
    +        agg::rendering_buffer renderingBufferTmp;
    +        renderingBufferTmp.attach(buf_tmp,
    +                                  width,
    +                                  height,
    +                                  row_len);
    +
    +        agg::color_conv(&renderingBufferTmp, &renderingBuffer, agg::color_conv_rgba32_to_bgra32());
    +    }
    +    catch (...)
    +    {
    +        delete [] buf_tmp;
    +        throw Py::RuntimeError("Unknown exception occurred in tostring_bgra");
    +    }
    +
    +    //todo: how to do this with native CXX
    +    PyObject* o = Py_BuildValue("s#",
    +                                buf_tmp,
    +                                row_len * height);
    +    delete [] buf_tmp;
    +    return Py::asObject(o);
     }
     
    +
     Py::Object
    -RendererAgg::tostring_rgba_minimized(const Py::Tuple& args) {
    -  args.verify_length(0);
    +RendererAgg::buffer_rgba(const Py::Tuple& args)
    +{
    +    //"expose the rendered buffer as Python buffer object, starting from postion x,y";
     
    -  int xmin = width;
    -  int ymin = height;
    -  int xmax = 0;
    -  int ymax = 0;
    +    _VERBOSE("RendererAgg::buffer_rgba");
     
    -  // Looks at the alpha channel to find the minimum extents of the image
    -  unsigned char* pixel = pixBuffer + 3;
    -  for (int y = 0; y < (int)height; ++y) {
    -    for (int x = 0; x < (int)width; ++x) {
    -      if (*pixel) {
    -        if (x < xmin) xmin = x;
    -        if (y < ymin) ymin = y;
    -        if (x > xmax) xmax = x;
    -        if (y > ymax) ymax = y;
    -      }
    -      pixel += 4;
    -    }
    -  }
    +    args.verify_length(2);
    +    int startw = Py::Int(args[0]);
    +    int starth = Py::Int(args[1]);
    +    int row_len = width * 4;
    +    int start = row_len * starth + startw * 4;
    +    return Py::asObject(PyBuffer_FromMemory(pixBuffer + start, row_len*height - start));
    +}
     
    -  int newwidth = 0;
    -  int newheight = 0;
    -  Py::String data;
    -  if (xmin < xmax && ymin < ymax) {
    -    // Expand the bounds by 1 pixel on all sides
    -    xmin = std::max(0, xmin - 1);
    -    ymin = std::max(0, ymin - 1);
    -    xmax = std::min(xmax, (int)width);
    -    ymax = std::min(ymax, (int)height);
     
    -    newwidth    = xmax - xmin;
    -    newheight   = ymax - ymin;
    -    int newsize = newwidth * newheight * 4;
    +Py::Object
    +RendererAgg::tostring_rgba_minimized(const Py::Tuple& args)
    +{
    +    args.verify_length(0);
     
    -    unsigned char* buf = new unsigned char[newsize];
    -    if (buf == NULL) {
    -      throw Py::MemoryError("RendererAgg::tostring_minimized could not allocate memory");
    +    int xmin = width;
    +    int ymin = height;
    +    int xmax = 0;
    +    int ymax = 0;
    +
    +    // Looks at the alpha channel to find the minimum extents of the image
    +    unsigned char* pixel = pixBuffer + 3;
    +    for (int y = 0; y < (int)height; ++y)
    +    {
    +        for (int x = 0; x < (int)width; ++x)
    +        {
    +            if (*pixel)
    +            {
    +                if (x < xmin) xmin = x;
    +                if (y < ymin) ymin = y;
    +                if (x > xmax) xmax = x;
    +                if (y > ymax) ymax = y;
    +            }
    +            pixel += 4;
    +        }
         }
     
    -    unsigned int*  dst = (unsigned int*)buf;
    -    unsigned int*  src = (unsigned int*)pixBuffer;
    -    for (int y = ymin; y < ymax; ++y)
    -      for (int x = xmin; x < xmax; ++x, ++dst)
    -        *dst = src[y * width + x];
    +    int newwidth = 0;
    +    int newheight = 0;
    +    Py::String data;
    +    if (xmin < xmax && ymin < ymax)
    +    {
    +        // Expand the bounds by 1 pixel on all sides
    +        xmin = std::max(0, xmin - 1);
    +        ymin = std::max(0, ymin - 1);
    +        xmax = std::min(xmax, (int)width);
    +        ymax = std::min(ymax, (int)height);
    +
    +        newwidth    = xmax - xmin;
    +        newheight   = ymax - ymin;
    +        int newsize = newwidth * newheight * 4;
    +
    +        unsigned char* buf = new unsigned char[newsize];
    +        if (buf == NULL)
    +        {
    +            throw Py::MemoryError("RendererAgg::tostring_minimized could not allocate memory");
    +        }
     
    -    // The Py::String will take over the buffer
    -    data = Py::String((const char *)buf, (int)newsize);
    -  }
    +        unsigned int*  dst = (unsigned int*)buf;
    +        unsigned int*  src = (unsigned int*)pixBuffer;
    +        for (int y = ymin; y < ymax; ++y)
    +        {
    +            for (int x = xmin; x < xmax; ++x, ++dst)
    +            {
    +                *dst = src[y * width + x];
    +            }
    +        }
     
    -  Py::Tuple bounds(4);
    -  bounds[0] = Py::Int(xmin);
    -  bounds[1] = Py::Int(ymin);
    -  bounds[2] = Py::Int(newwidth);
    -  bounds[3] = Py::Int(newheight);
    +        // The Py::String will take over the buffer
    +        data = Py::String((const char *)buf, (int)newsize);
    +    }
     
    -  Py::Tuple result(2);
    -  result[0] = data;
    -  result[1] = bounds;
    +    Py::Tuple bounds(4);
    +    bounds[0] = Py::Int(xmin);
    +    bounds[1] = Py::Int(ymin);
    +    bounds[2] = Py::Int(newwidth);
    +    bounds[3] = Py::Int(newheight);
     
    -  return result;
    +    Py::Tuple result(2);
    +    result[0] = data;
    +    result[1] = bounds;
    +
    +    return result;
     }
     
    +
     Py::Object
    -RendererAgg::clear(const Py::Tuple& args) {
    -  //"clear the rendered buffer";
    +RendererAgg::clear(const Py::Tuple& args)
    +{
    +    //"clear the rendered buffer";
     
    -  _VERBOSE("RendererAgg::clear");
    +    _VERBOSE("RendererAgg::clear");
     
    -  args.verify_length(0);
    -  rendererBase.clear(agg::rgba(1, 1, 1, 0));
    +    args.verify_length(0);
    +    rendererBase.clear(agg::rgba(1, 1, 1, 0));
     
    -  return Py::Object();
    +    return Py::Object();
     }
     
     
     agg::rgba
    -RendererAgg::rgb_to_color(const Py::SeqBase& rgb, double alpha) {
    -  _VERBOSE("RendererAgg::rgb_to_color");
    +RendererAgg::rgb_to_color(const Py::SeqBase& rgb, double alpha)
    +{
    +    _VERBOSE("RendererAgg::rgb_to_color");
     
    -  double r = Py::Float(rgb[0]);
    -  double g = Py::Float(rgb[1]);
    -  double b = Py::Float(rgb[2]);
    -  return agg::rgba(r, g, b, alpha);
    +    double r = Py::Float(rgb[0]);
    +    double g = Py::Float(rgb[1]);
    +    double b = Py::Float(rgb[2]);
    +    return agg::rgba(r, g, b, alpha);
     }
     
     
     double
    -RendererAgg::points_to_pixels_snapto(const Py::Object& points) {
    -  // convert a value in points to pixels depending on renderer dpi and
    -  // screen pixels per inch
    -  // snap return pixels to grid
    -  _VERBOSE("RendererAgg::points_to_pixels_snapto");
    -  double p = Py::Float( points ) ;
    -  //return (int)(p*PIXELS_PER_INCH/72.0*dpi/72.0)+0.5;
    -  return (int)(p*dpi/72.0)+0.5;
    -}
    -
    -double
    -RendererAgg::points_to_pixels( const Py::Object& points) {
    -  _VERBOSE("RendererAgg::points_to_pixels");
    -  double p = Py::Float( points ) ;
    -  //return p * PIXELS_PER_INCH/72.0*dpi/72.0;
    -  return p * dpi/72.0;
    +RendererAgg::points_to_pixels(const Py::Object& points)
    +{
    +    _VERBOSE("RendererAgg::points_to_pixels");
    +    double p = Py::Float(points) ;
    +    return p * dpi / 72.0;
     }
     
     
    -RendererAgg::~RendererAgg() {
    +RendererAgg::~RendererAgg()
    +{
     
    -  _VERBOSE("RendererAgg::~RendererAgg");
    +    _VERBOSE("RendererAgg::~RendererAgg");
     
    -  delete [] alphaBuffer;
    -  delete [] pixBuffer;
    +    delete [] alphaBuffer;
    +    delete [] pixBuffer;
     }
     
     /* ------------ module methods ------------- */
    -Py::Object _backend_agg_module::new_renderer (const Py::Tuple &args,
    -                                              const Py::Dict &kws)
    +Py::Object _backend_agg_module::new_renderer(const Py::Tuple &args,
    +        const Py::Dict &kws)
     {
     
    -  if (args.length() != 3 )
    +    if (args.length() != 3)
         {
    -      throw Py::RuntimeError("Incorrect # of args to RendererAgg(width, height, dpi).");
    +        throw Py::RuntimeError("Incorrect # of args to RendererAgg(width, height, dpi).");
         }
     
    -  int debug;
    -  if ( kws.hasKey("debug") ) debug = Py::Int( kws["debug"] );
    -  else debug=0;
    +    int debug;
    +    if (kws.hasKey("debug"))
    +    {
    +        debug = Py::Int(kws["debug"]);
    +    }
    +    else
    +    {
    +        debug = 0;
    +    }
     
    -  unsigned int width = (unsigned int)Py::Int(args[0]);
    -  unsigned int height = (unsigned int)Py::Int(args[1]);
    -  double dpi = Py::Float(args[2]);
    +    unsigned int width = (unsigned int)Py::Int(args[0]);
    +    unsigned int height = (unsigned int)Py::Int(args[1]);
    +    double dpi = Py::Float(args[2]);
     
    -  if (width > 1 << 15 || height > 1 << 15) {
    -    throw Py::ValueError("width and height must each be below 32768");
    -  }
    +    if (width > 1 << 15 || height > 1 << 15)
    +    {
    +        throw Py::ValueError("width and height must each be below 32768");
    +    }
     
    -  if (dpi <= 0.0) {
    -    throw Py::ValueError("dpi must be positive");
    -  }
    +    if (dpi <= 0.0)
    +    {
    +        throw Py::ValueError("dpi must be positive");
    +    }
     
    -  RendererAgg* renderer = NULL;
    -  try {
    -    renderer = new RendererAgg(width, height, dpi, debug);
    -  } catch (std::bad_alloc) {
    -    throw Py::RuntimeError("Could not allocate memory for image");
    -  }
    +    RendererAgg* renderer = NULL;
    +    try
    +    {
    +        renderer = new RendererAgg(width, height, dpi, debug);
    +    }
    +    catch (std::bad_alloc)
    +    {
    +        throw Py::RuntimeError("Could not allocate memory for image");
    +    }
     
    -  return Py::asObject(renderer);
    +    return Py::asObject(renderer);
     }
     
     
    -void BufferRegion::init_type() {
    -  behaviors().name("BufferRegion");
    -  behaviors().doc("A wrapper to pass agg buffer objects to and from the python level");
    +void BufferRegion::init_type()
    +{
    +    behaviors().name("BufferRegion");
    +    behaviors().doc("A wrapper to pass agg buffer objects to and from the python level");
     
     
    -  add_varargs_method("set_x", &BufferRegion::set_x,
    -                     "set_x(x)");
    +    add_varargs_method("set_x", &BufferRegion::set_x,
    +                       "set_x(x)");
     
    -  add_varargs_method("set_y", &BufferRegion::set_y,
    -                     "set_y(y)");
    +    add_varargs_method("set_y", &BufferRegion::set_y,
    +                       "set_y(y)");
     
    -  add_varargs_method("get_extents", &BufferRegion::get_extents,
    -                     "get_extents()");
    +    add_varargs_method("get_extents", &BufferRegion::get_extents,
    +                       "get_extents()");
     
    -  add_varargs_method("to_string", &BufferRegion::to_string,
    -                     "to_string()");
    -  add_varargs_method("to_string_argb", &BufferRegion::to_string_argb,
    -                     "to_string_argb()");
    +    add_varargs_method("to_string", &BufferRegion::to_string,
    +                       "to_string()");
    +    add_varargs_method("to_string_argb", &BufferRegion::to_string_argb,
    +                       "to_string_argb()");
     }
     
     
     void RendererAgg::init_type()
     {
    -  behaviors().name("RendererAgg");
    -  behaviors().doc("The agg backend extension module");
    +    behaviors().name("RendererAgg");
    +    behaviors().doc("The agg backend extension module");
     
    -  add_varargs_method("draw_path", &RendererAgg::draw_path,
    -                     "draw_path(gc, path, transform, rgbFace)\n");
    -  add_varargs_method("draw_path_collection", &RendererAgg::draw_path_collection,
    -                     "draw_path_collection(master_transform, cliprect, clippath, clippath_trans, paths, transforms, offsets, offsetTrans, facecolors, edgecolors, linewidths, linestyles, antialiaseds)\n");
    -  add_varargs_method("draw_quad_mesh", &RendererAgg::draw_quad_mesh,
    -                     "draw_quad_mesh(master_transform, cliprect, clippath, clippath_trans, meshWidth, meshHeight, coordinates, offsets, offsetTrans, facecolors, antialiaseds, showedges)\n");
    -  add_varargs_method("draw_markers", &RendererAgg::draw_markers,
    -                     "draw_markers(gc, marker_path, marker_trans, path, rgbFace)\n");
    -  add_varargs_method("draw_text_image", &RendererAgg::draw_text_image,
    -                     "draw_text_image(font_image, x, y, r, g, b, a)\n");
    -  add_varargs_method("draw_image", &RendererAgg::draw_image,
    -                     "draw_image(x, y, im)");
    -  add_varargs_method("write_rgba", &RendererAgg::write_rgba,
    -                     "write_rgba(fname)");
    -  add_varargs_method("tostring_rgb", &RendererAgg::tostring_rgb,
    -                     "s = tostring_rgb()");
    -  add_varargs_method("tostring_argb", &RendererAgg::tostring_argb,
    -                     "s = tostring_argb()");
    -  add_varargs_method("tostring_bgra", &RendererAgg::tostring_bgra,
    -                     "s = tostring_bgra()");
    -  add_varargs_method("tostring_rgba_minimized", &RendererAgg::tostring_rgba_minimized,
    -                     "s = tostring_rgba_minimized()");
    -  add_varargs_method("buffer_rgba", &RendererAgg::buffer_rgba,
    -                     "buffer = buffer_rgba()");
    -  add_varargs_method("clear", &RendererAgg::clear,
    -                     "clear()");
    -  add_varargs_method("copy_from_bbox", &RendererAgg::copy_from_bbox,
    -                     "copy_from_bbox(bbox)");
    -  add_varargs_method("restore_region", &RendererAgg::restore_region,
    -                     "restore_region(region)");
    -  add_varargs_method("restore_region2", &RendererAgg::restore_region2,
    -                     "restore_region(region, x1, y1, x2, y2, x3, y3)");
    +    add_varargs_method("draw_path", &RendererAgg::draw_path,
    +                       "draw_path(gc, path, transform, rgbFace)\n");
    +    add_varargs_method("draw_path_collection", &RendererAgg::draw_path_collection,
    +                       "draw_path_collection(gc, master_transform, paths, transforms, offsets, offsetTrans, facecolors, edgecolors, linewidths, linestyles, antialiaseds)\n");
    +    add_varargs_method("draw_quad_mesh", &RendererAgg::draw_quad_mesh,
    +                       "draw_quad_mesh(gc, master_transform, meshWidth, meshHeight, coordinates, offsets, offsetTrans, facecolors, antialiaseds, showedges)\n");
    +    add_varargs_method("draw_gouraud_triangle", &RendererAgg::draw_gouraud_triangle,
    +                       "draw_gouraud_triangle(gc, points, colors, master_transform)\n");
    +    add_varargs_method("draw_gouraud_triangles", &RendererAgg::draw_gouraud_triangles,
    +                       "draw_gouraud_triangles(gc, points, colors, master_transform)\n");
    +    add_varargs_method("draw_markers", &RendererAgg::draw_markers,
    +                       "draw_markers(gc, marker_path, marker_trans, path, rgbFace)\n");
    +    add_varargs_method("draw_text_image", &RendererAgg::draw_text_image,
    +                       "draw_text_image(font_image, x, y, r, g, b, a)\n");
    +    add_varargs_method("draw_image", &RendererAgg::draw_image,
    +                       "draw_image(gc, x, y, im)");
    +    add_varargs_method("write_rgba", &RendererAgg::write_rgba,
    +                       "write_rgba(fname)");
    +    add_varargs_method("tostring_rgb", &RendererAgg::tostring_rgb,
    +                       "s = tostring_rgb()");
    +    add_varargs_method("tostring_argb", &RendererAgg::tostring_argb,
    +                       "s = tostring_argb()");
    +    add_varargs_method("tostring_bgra", &RendererAgg::tostring_bgra,
    +                       "s = tostring_bgra()");
    +    add_varargs_method("tostring_rgba_minimized", &RendererAgg::tostring_rgba_minimized,
    +                       "s = tostring_rgba_minimized()");
    +    add_varargs_method("buffer_rgba", &RendererAgg::buffer_rgba,
    +                       "buffer = buffer_rgba()");
    +    add_varargs_method("clear", &RendererAgg::clear,
    +                       "clear()");
    +    add_varargs_method("copy_from_bbox", &RendererAgg::copy_from_bbox,
    +                       "copy_from_bbox(bbox)");
    +    add_varargs_method("restore_region", &RendererAgg::restore_region,
    +                       "restore_region(region)");
    +    add_varargs_method("restore_region2", &RendererAgg::restore_region2,
    +                       "restore_region(region, x1, y1, x2, y2, x3, y3)");
     }
     
     extern "C"
    -DL_EXPORT(void)
    -  init_backend_agg(void)
    +    DL_EXPORT(void)
    +    init_backend_agg(void)
     {
    -  //static _backend_agg_module* _backend_agg = new _backend_agg_module;
    +    //static _backend_agg_module* _backend_agg = new _backend_agg_module;
     
    -  _VERBOSE("init_backend_agg");
    +    _VERBOSE("init_backend_agg");
     
    -  import_array();
    +    import_array();
     
    -  static _backend_agg_module* _backend_agg = NULL;
    -  _backend_agg = new _backend_agg_module;
    +    static _backend_agg_module* _backend_agg = NULL;
    +    _backend_agg = new _backend_agg_module;
     }
    diff -Nru matplotlib-0.99.3/src/backend_agg.cpp matplotlib-1.0.1/src/backend_agg.cpp
    --- matplotlib-0.99.3/src/backend_agg.cpp	2010-03-09 14:20:17.000000000 +0000
    +++ matplotlib-1.0.1/src/backend_agg.cpp	2010-12-13 15:27:29.000000000 +0000
    @@ -1,11 +1,8 @@
     /* A rewrite of _backend_agg using PyCXX to handle ref counting, etc..
      */
    -#include 
     
    -// To remove a gcc warning
    -#ifdef _POSIX_C_SOURCE
    -#undef _POSIX_C_SOURCE
    -#endif
    +/* Python API mandates Python.h is included *first* */
    +#include "Python.h"
     
     #include "ft2font.h"
     #include "_image.h"
    @@ -31,6 +28,7 @@
     #include "agg_span_image_filter_rgba.h"
     #include "agg_span_interpolator_linear.h"
     #include "agg_span_pattern_rgba.h"
    +#include "agg_span_gouraud_rgba.h"
     #include "agg_conv_shorten_path.h"
     #include "util/agg_color_conv_rgb8.h"
     
    @@ -53,57 +51,82 @@
     /*
      Convert dashes from the Python representation as nested sequences to
      the C++ representation as a std::vector >
    - (GCAgg::dash_t)
    -*/
    -void convert_dashes(const Py::Tuple& dashes, double dpi, GCAgg::dash_t& dashes_out,
    -                    double& dashOffset_out) {
    -  if (dashes.length()!=2)
    -    throw Py::ValueError(Printf("Dash descriptor must be a length 2 tuple; found %d", dashes.length()).str());
    + (GCAgg::dash_t) */
    +void
    +convert_dashes(const Py::Tuple& dashes, double dpi,
    +               GCAgg::dash_t& dashes_out, double& dashOffset_out)
    +{
    +    if (dashes.length() != 2)
    +    {
    +        throw Py::ValueError(
    +            Printf("Dash descriptor must be a length 2 tuple; found %d",
    +                   dashes.length()).str()
    +        );
    +    }
     
    -  dashes_out.clear();
    -  dashOffset_out = 0.0;
    -  if (dashes[0].ptr() == Py_None)
    -    return;
    +    dashes_out.clear();
    +    dashOffset_out = 0.0;
    +    if (dashes[0].ptr() == Py_None)
    +    {
    +        return;
    +    }
     
    -  dashOffset_out = double(Py::Float(dashes[0])) * dpi/72.0;
    +    dashOffset_out = double(Py::Float(dashes[0])) * dpi / 72.0;
     
    -  Py::SeqBase dashSeq = dashes[1];
    +    Py::SeqBase dashSeq = dashes[1];
     
    -  size_t Ndash = dashSeq.length();
    -  if (Ndash % 2 != 0)
    -    throw Py::ValueError(Printf("Dash sequence must be an even length sequence; found %d", Ndash).str());
    +    size_t Ndash = dashSeq.length();
    +    if (Ndash % 2 != 0)
    +    {
    +        throw Py::ValueError(
    +            Printf("Dash sequence must be an even length sequence; found %d", Ndash).str()
    +        );
    +    }
     
    -  dashes_out.clear();
    -  dashes_out.reserve(Ndash / 2);
    +    dashes_out.clear();
    +    dashes_out.reserve(Ndash / 2);
     
    -  double val0, val1;
    -  for (size_t i = 0; i < Ndash; i += 2) {
    -    val0 = double(Py::Float(dashSeq[i])) * dpi/72.0;
    -    val1 = double(Py::Float(dashSeq[i+1])) * dpi/72.0;
    -    dashes_out.push_back(std::make_pair(val0, val1));
    -  }
    +    double val0, val1;
    +    for (size_t i = 0; i < Ndash; i += 2)
    +    {
    +        val0 = double(Py::Float(dashSeq[i])) * dpi / 72.0;
    +        val1 = double(Py::Float(dashSeq[i+1])) * dpi / 72.0;
    +        dashes_out.push_back(std::make_pair(val0, val1));
    +    }
     }
     
    -Py::Object BufferRegion::to_string(const Py::Tuple &args) {
    -  // owned=true to prevent memory leak
    -  return Py::String(PyString_FromStringAndSize((const char*)data, height*stride), true);
    +
    +Py::Object
    +BufferRegion::to_string(const Py::Tuple &args)
    +{
    +    // owned=true to prevent memory leak
    +    return Py::String(PyString_FromStringAndSize((const char*)data, height*stride), true);
     }
     
    -Py::Object BufferRegion::set_x(const Py::Tuple &args) {
    +
    +Py::Object
    +BufferRegion::set_x(const Py::Tuple &args)
    +{
         args.verify_length(1);
    -    size_t x = Py::Int( args[0] );
    +    size_t x = Py::Int(args[0]);
         rect.x1 = x;
         return Py::Object();
     }
     
    -Py::Object BufferRegion::set_y(const Py::Tuple &args) {
    +
    +Py::Object
    +BufferRegion::set_y(const Py::Tuple &args)
    +{
         args.verify_length(1);
    -    size_t y = Py::Int( args[0] );
    +    size_t y = Py::Int(args[0]);
         rect.y1 = y;
         return Py::Object();
     }
     
    -Py::Object BufferRegion::get_extents(const Py::Tuple &args) {
    +
    +Py::Object
    +BufferRegion::get_extents(const Py::Tuple &args)
    +{
         args.verify_length(0);
     
         Py::Tuple extents(4);
    @@ -115,569 +138,682 @@
         return extents;
     }
     
    -Py::Object BufferRegion::to_string_argb(const Py::Tuple &args) {
    -  // owned=true to prevent memory leak
    -  Py_ssize_t length;
    -  unsigned char* pix;
    -  unsigned char* begin;
    -  unsigned char* end;
    -  unsigned char tmp;
    -  size_t i, j;
    -
    -  PyObject* str = PyString_FromStringAndSize((const char*)data, height*stride);
    -  if (PyString_AsStringAndSize(str, (char**)&begin, &length)) {
    -    throw Py::TypeError("Could not create memory for blit");
    -  }
    -
    -  pix = begin;
    -  end = begin + (height * stride);
    -  for (i = 0; i < (size_t)height; ++i) {
    -    pix = begin + i * stride;
    -    for (j = 0; j < (size_t)width; ++j) {
    -      // Convert rgba to argb
    -      tmp = pix[2];
    -      pix[2] = pix[0];
    -      pix[0] = tmp;
    -      pix += 4;
    +
    +Py::Object
    +BufferRegion::to_string_argb(const Py::Tuple &args)
    +{
    +    // owned=true to prevent memory leak
    +    Py_ssize_t length;
    +    unsigned char* pix;
    +    unsigned char* begin;
    +    unsigned char* end;
    +    unsigned char tmp;
    +    size_t i, j;
    +
    +    PyObject* str = PyString_FromStringAndSize(
    +                        (const char*)data, height * stride);
    +    if (PyString_AsStringAndSize(str, (char**)&begin, &length))
    +    {
    +        throw Py::TypeError("Could not create memory for blit");
    +    }
    +
    +    pix = begin;
    +    end = begin + (height * stride);
    +    for (i = 0; i < (size_t)height; ++i)
    +    {
    +        pix = begin + i * stride;
    +        for (j = 0; j < (size_t)width; ++j)
    +        {
    +            // Convert rgba to argb
    +            tmp = pix[2];
    +            pix[2] = pix[0];
    +            pix[0] = tmp;
    +            pix += 4;
    +        }
         }
    -  }
     
    -  return Py::String(str, true);
    +    return Py::String(str, true);
     }
     
    +
     GCAgg::GCAgg(const Py::Object &gc, double dpi) :
    -  dpi(dpi), isaa(true), linewidth(1.0), alpha(1.0),
    -  dashOffset(0.0)
    +        dpi(dpi), isaa(true), dashOffset(0.0)
     {
    -  _VERBOSE("GCAgg::GCAgg");
    -  linewidth = points_to_pixels ( gc.getAttr("_linewidth") ) ;
    -  alpha = Py::Float( gc.getAttr("_alpha") );
    -  color = get_color(gc);
    -  _set_antialiased(gc);
    -  _set_linecap(gc);
    -  _set_joinstyle(gc);
    -  _set_dashes(gc);
    -  _set_clip_rectangle(gc);
    -  _set_clip_path(gc);
    -  _set_snap(gc);
    -  _set_hatch_path(gc);
    -}
    -
    -GCAgg::GCAgg(double dpi) :
    -  dpi(dpi), isaa(true),
    -  cap(agg::butt_cap), join(agg::round_join), linewidth(1.0), alpha(1.0),
    -  dashOffset(0.0)
    -{
    -
    +    _VERBOSE("GCAgg::GCAgg");
    +    linewidth = points_to_pixels(gc.getAttr("_linewidth")) ;
    +    alpha = Py::Float(gc.getAttr("_alpha"));
    +    color = get_color(gc);
    +    _set_antialiased(gc);
    +    _set_linecap(gc);
    +    _set_joinstyle(gc);
    +    _set_dashes(gc);
    +    _set_clip_rectangle(gc);
    +    _set_clip_path(gc);
    +    _set_snap(gc);
    +    _set_hatch_path(gc);
     }
     
    +
     void
    -GCAgg::_set_antialiased(const Py::Object& gc) {
    -  _VERBOSE("GCAgg::antialiased");
    -  isaa = Py::Int( gc.getAttr( "_antialiased") );
    +GCAgg::_set_antialiased(const Py::Object& gc)
    +{
    +    _VERBOSE("GCAgg::antialiased");
    +    isaa = Py::Int(gc.getAttr("_antialiased"));
     }
     
    +
     agg::rgba
    -GCAgg::get_color(const Py::Object& gc) {
    -  _VERBOSE("GCAgg::get_color");
    -  Py::Tuple rgb = Py::Tuple( gc.getAttr("_rgb") );
    -
    -  double alpha = Py::Float( gc.getAttr("_alpha") );
    -
    -  double r = Py::Float(rgb[0]);
    -  double g = Py::Float(rgb[1]);
    -  double b = Py::Float(rgb[2]);
    -  return agg::rgba(r, g, b, alpha);
    +GCAgg::get_color(const Py::Object& gc)
    +{
    +    _VERBOSE("GCAgg::get_color");
    +    Py::Tuple rgb = Py::Tuple(gc.getAttr("_rgb"));
    +
    +    double alpha = Py::Float(gc.getAttr("_alpha"));
    +
    +    double r = Py::Float(rgb[0]);
    +    double g = Py::Float(rgb[1]);
    +    double b = Py::Float(rgb[2]);
    +    return agg::rgba(r, g, b, alpha);
     }
     
    +
     double
    -GCAgg::points_to_pixels( const Py::Object& points) {
    -  _VERBOSE("GCAgg::points_to_pixels");
    -  double p = Py::Float( points ) ;
    -  return p * dpi/72.0;
    +GCAgg::points_to_pixels(const Py::Object& points)
    +{
    +    _VERBOSE("GCAgg::points_to_pixels");
    +    double p = Py::Float(points) ;
    +    return p * dpi / 72.0;
     }
     
    +
     void
    -GCAgg::_set_linecap(const Py::Object& gc) {
    -  _VERBOSE("GCAgg::_set_linecap");
    +GCAgg::_set_linecap(const Py::Object& gc)
    +{
    +    _VERBOSE("GCAgg::_set_linecap");
     
    -  std::string capstyle = Py::String( gc.getAttr( "_capstyle" ) );
    +    std::string capstyle = Py::String(gc.getAttr("_capstyle"));
     
    -  if (capstyle=="butt")
    -    cap = agg::butt_cap;
    -  else if (capstyle=="round")
    -    cap = agg::round_cap;
    -  else if(capstyle=="projecting")
    -    cap = agg::square_cap;
    -  else
    -    throw Py::ValueError(Printf("GC _capstyle attribute must be one of butt, round, projecting; found %s", capstyle.c_str()).str());
    +    if (capstyle == "butt")
    +    {
    +        cap = agg::butt_cap;
    +    }
    +    else if (capstyle == "round")
    +    {
    +        cap = agg::round_cap;
    +    }
    +    else if (capstyle == "projecting")
    +    {
    +        cap = agg::square_cap;
    +    }
    +    else
    +    {
    +        throw Py::ValueError(Printf("GC _capstyle attribute must be one of butt, round, projecting; found %s", capstyle.c_str()).str());
    +    }
     }
     
    +
     void
    -GCAgg::_set_joinstyle(const Py::Object& gc) {
    -  _VERBOSE("GCAgg::_set_joinstyle");
    +GCAgg::_set_joinstyle(const Py::Object& gc)
    +{
    +    _VERBOSE("GCAgg::_set_joinstyle");
     
    -  std::string joinstyle = Py::String( gc.getAttr("_joinstyle") );
    +    std::string joinstyle = Py::String(gc.getAttr("_joinstyle"));
     
    -  if (joinstyle=="miter")
    -    join =  agg::miter_join_revert;
    -  else if (joinstyle=="round")
    -    join = agg::round_join;
    -  else if(joinstyle=="bevel")
    -    join = agg::bevel_join;
    -  else
    -    throw Py::ValueError(Printf("GC _joinstyle attribute must be one of butt, round, projecting; found %s", joinstyle.c_str()).str());
    +    if (joinstyle == "miter")
    +    {
    +        join = agg::miter_join_revert;
    +    }
    +    else if (joinstyle == "round")
    +    {
    +        join = agg::round_join;
    +    }
    +    else if (joinstyle == "bevel")
    +    {
    +        join = agg::bevel_join;
    +    }
    +    else
    +    {
    +        throw Py::ValueError(Printf("GC _joinstyle attribute must be one of butt, round, projecting; found %s", joinstyle.c_str()).str());
    +    }
     }
     
    +
     void
    -GCAgg::_set_dashes(const Py::Object& gc) {
    -  //return the dashOffset, dashes sequence tuple.
    -  _VERBOSE("GCAgg::_set_dashes");
    -
    -  Py::Object dash_obj( gc.getAttr( "_dashes" ) );
    -  if (dash_obj.ptr() == Py_None) {
    -    dashes.clear();
    -    return;
    -  }
    +GCAgg::_set_dashes(const Py::Object& gc)
    +{
    +    //return the dashOffset, dashes sequence tuple.
    +    _VERBOSE("GCAgg::_set_dashes");
     
    -  convert_dashes(dash_obj, dpi, dashes, dashOffset);
    +    Py::Object dash_obj(gc.getAttr("_dashes"));
    +    if (dash_obj.ptr() == Py_None)
    +    {
    +        dashes.clear();
    +        return;
    +    }
    +
    +    convert_dashes(dash_obj, dpi, dashes, dashOffset);
     }
     
    +
     void
    -GCAgg::_set_clip_rectangle( const Py::Object& gc) {
    -  //set the clip rectangle from the gc
    +GCAgg::_set_clip_rectangle(const Py::Object& gc)
    +{
    +    //set the clip rectangle from the gc
     
    -  _VERBOSE("GCAgg::_set_clip_rectangle");
    +    _VERBOSE("GCAgg::_set_clip_rectangle");
     
    -  Py::Object o ( gc.getAttr( "_cliprect" ) );
    -  cliprect = o;
    +    Py::Object o(gc.getAttr("_cliprect"));
    +    cliprect = o;
     }
     
    +
     void
    -GCAgg::_set_clip_path( const Py::Object& gc) {
    -  //set the clip path from the gc
    +GCAgg::_set_clip_path(const Py::Object& gc)
    +{
    +    //set the clip path from the gc
     
    -  _VERBOSE("GCAgg::_set_clip_path");
    +    _VERBOSE("GCAgg::_set_clip_path");
     
    -  Py::Object method_obj = gc.getAttr("get_clip_path");
    -  Py::Callable method(method_obj);
    -  Py::Tuple path_and_transform = method.apply(Py::Tuple());
    -  if (path_and_transform[0].ptr() != Py_None) {
    -    clippath = path_and_transform[0];
    -    clippath_trans = py_to_agg_transformation_matrix(path_and_transform[1].ptr());
    -  }
    +    Py::Object method_obj = gc.getAttr("get_clip_path");
    +    Py::Callable method(method_obj);
    +    Py::Tuple path_and_transform = method.apply(Py::Tuple());
    +    if (path_and_transform[0].ptr() != Py_None)
    +    {
    +        clippath = path_and_transform[0];
    +        clippath_trans = py_to_agg_transformation_matrix(path_and_transform[1].ptr());
    +    }
     }
     
    +
     void
    -GCAgg::_set_snap( const Py::Object& gc) {
    -  //set the snap setting
    +GCAgg::_set_snap(const Py::Object& gc)
    +{
    +    //set the snap setting
     
    -  _VERBOSE("GCAgg::_set_snap");
    +    _VERBOSE("GCAgg::_set_snap");
     
    -  Py::Object method_obj = gc.getAttr("get_snap");
    -  Py::Callable method(method_obj);
    -  Py::Object py_snap = method.apply(Py::Tuple());
    -  if (py_snap.isNone()) {
    -    quantize_mode = QUANTIZE_AUTO;
    -  } else if (py_snap.isTrue()) {
    -    quantize_mode = QUANTIZE_TRUE;
    -  } else {
    -    quantize_mode = QUANTIZE_FALSE;
    -  }
    +    Py::Object method_obj = gc.getAttr("get_snap");
    +    Py::Callable method(method_obj);
    +    Py::Object py_snap = method.apply(Py::Tuple());
    +    if (py_snap.isNone())
    +    {
    +        snap_mode = SNAP_AUTO;
    +    }
    +    else if (py_snap.isTrue())
    +    {
    +        snap_mode = SNAP_TRUE;
    +    }
    +    else
    +    {
    +        snap_mode = SNAP_FALSE;
    +    }
     }
     
    +
     void
    -GCAgg::_set_hatch_path( const Py::Object& gc) {
    -  _VERBOSE("GCAgg::_set_hatch_path");
    +GCAgg::_set_hatch_path(const Py::Object& gc)
    +{
    +    _VERBOSE("GCAgg::_set_hatch_path");
     
    -  Py::Object method_obj = gc.getAttr("get_hatch_path");
    -  Py::Callable method(method_obj);
    -  hatchpath = method.apply(Py::Tuple());
    +    Py::Object method_obj = gc.getAttr("get_hatch_path");
    +    Py::Callable method(method_obj);
    +    hatchpath = method.apply(Py::Tuple());
     }
     
    +
     const size_t
     RendererAgg::PIXELS_PER_INCH(96);
     
    +
     RendererAgg::RendererAgg(unsigned int width, unsigned int height, double dpi,
                              int debug) :
    -  width(width),
    -  height(height),
    -  dpi(dpi),
    -  NUMBYTES(width*height*4),
    -  pixBuffer(NULL),
    -  renderingBuffer(),
    -  alphaBuffer(NULL),
    -  alphaMaskRenderingBuffer(),
    -  alphaMask(alphaMaskRenderingBuffer),
    -  pixfmtAlphaMask(alphaMaskRenderingBuffer),
    -  rendererBaseAlphaMask(),
    -  rendererAlphaMask(),
    -  scanlineAlphaMask(),
    -  slineP8(),
    -  slineBin(),
    -  pixFmt(),
    -  rendererBase(),
    -  rendererAA(),
    -  rendererBin(),
    -  theRasterizer(),
    -  debug(debug)
    -{
    -  _VERBOSE("RendererAgg::RendererAgg");
    -  unsigned stride(width*4);
    -
    -  pixBuffer       = new agg::int8u[NUMBYTES];
    -  renderingBuffer.attach(pixBuffer, width, height, stride);
    -  pixFmt.attach(renderingBuffer);
    -  rendererBase.attach(pixFmt);
    -  rendererBase.clear(agg::rgba(1, 1, 1, 0));
    -  rendererAA.attach(rendererBase);
    -  rendererBin.attach(rendererBase);
    -  hatchRenderingBuffer.attach(hatchBuffer, HATCH_SIZE, HATCH_SIZE, HATCH_SIZE*4);
    +    width(width),
    +    height(height),
    +    dpi(dpi),
    +    NUMBYTES(width*height*4),
    +    pixBuffer(NULL),
    +    renderingBuffer(),
    +    alphaBuffer(NULL),
    +    alphaMaskRenderingBuffer(),
    +    alphaMask(alphaMaskRenderingBuffer),
    +    pixfmtAlphaMask(alphaMaskRenderingBuffer),
    +    rendererBaseAlphaMask(),
    +    rendererAlphaMask(),
    +    scanlineAlphaMask(),
    +    slineP8(),
    +    slineBin(),
    +    pixFmt(),
    +    rendererBase(),
    +    rendererAA(),
    +    rendererBin(),
    +    theRasterizer(),
    +    debug(debug)
    +{
    +    _VERBOSE("RendererAgg::RendererAgg");
    +    unsigned stride(width*4);
    +
    +    pixBuffer = new agg::int8u[NUMBYTES];
    +    renderingBuffer.attach(pixBuffer, width, height, stride);
    +    pixFmt.attach(renderingBuffer);
    +    rendererBase.attach(pixFmt);
    +    rendererBase.clear(agg::rgba(1, 1, 1, 0));
    +    rendererAA.attach(rendererBase);
    +    rendererBin.attach(rendererBase);
    +    hatchRenderingBuffer.attach(hatchBuffer, HATCH_SIZE, HATCH_SIZE,
    +                                HATCH_SIZE*4);
     }
     
    -void RendererAgg::create_alpha_buffers() {
    -  if (!alphaBuffer) {
    -    unsigned stride(width*4);
    -    alphaBuffer            = new agg::int8u[NUMBYTES];
    -    alphaMaskRenderingBuffer.attach(alphaBuffer, width, height, stride);
    -    rendererBaseAlphaMask.attach(pixfmtAlphaMask);
    -    rendererAlphaMask.attach(rendererBaseAlphaMask);
    -  }
    +
    +void
    +RendererAgg::create_alpha_buffers()
    +{
    +    if (!alphaBuffer)
    +    {
    +        unsigned stride(width*4);
    +        alphaBuffer = new agg::int8u[NUMBYTES];
    +        alphaMaskRenderingBuffer.attach(alphaBuffer, width, height, stride);
    +        rendererBaseAlphaMask.attach(pixfmtAlphaMask);
    +        rendererAlphaMask.attach(rendererBaseAlphaMask);
    +    }
     }
     
    +
     template
     void
    -RendererAgg::set_clipbox(const Py::Object& cliprect, R& rasterizer) {
    -  //set the clip rectangle from the gc
    +RendererAgg::set_clipbox(const Py::Object& cliprect, R& rasterizer)
    +{
    +    //set the clip rectangle from the gc
     
    -  _VERBOSE("RendererAgg::set_clipbox");
    +    _VERBOSE("RendererAgg::set_clipbox");
     
    -  double l, b, r, t;
    -  if (py_convert_bbox(cliprect.ptr(), l, b, r, t)) {
    -    rasterizer.clip_box(int(mpl_round(l)), height - int(mpl_round(b)),
    -                        int(mpl_round(r)), height - int(mpl_round(t)));
    -  }
    +    double l, b, r, t;
    +    if (py_convert_bbox(cliprect.ptr(), l, b, r, t))
    +    {
    +        rasterizer.clip_box(int(mpl_round(l)), height - int(mpl_round(b)),
    +                            int(mpl_round(r)), height - int(mpl_round(t)));
    +    }
    +    else
    +    {
    +        rasterizer.clip_box(0, 0, width, height);
    +    }
     
    -  _VERBOSE("RendererAgg::set_clipbox done");
    +    _VERBOSE("RendererAgg::set_clipbox done");
     }
     
    +
     std::pair
    -RendererAgg::_get_rgba_face(const Py::Object& rgbFace, double alpha) {
    -  _VERBOSE("RendererAgg::_get_rgba_face");
    -  std::pair face;
    -
    -  if (rgbFace.ptr() == Py_None) {
    -    face.first = false;
    -  }
    -  else {
    -    face.first = true;
    -    Py::Tuple rgb = Py::Tuple(rgbFace);
    -    face.second = rgb_to_color(rgb, alpha);
    -  }
    -  return face;
    +RendererAgg::_get_rgba_face(const Py::Object& rgbFace, double alpha)
    +{
    +    _VERBOSE("RendererAgg::_get_rgba_face");
    +    std::pair face;
    +
    +    if (rgbFace.ptr() == Py_None)
    +    {
    +        face.first = false;
    +    }
    +    else
    +    {
    +        face.first = true;
    +        Py::Tuple rgb = Py::Tuple(rgbFace);
    +        face.second = rgb_to_color(rgb, alpha);
    +    }
    +    return face;
     }
     
    +
     Py::Object
    -RendererAgg::copy_from_bbox(const Py::Tuple& args) {
    -  //copy region in bbox to buffer and return swig/agg buffer object
    -  args.verify_length(1);
    -
    -  Py::Object box_obj = args[0];
    -  double l, b, r, t;
    -  if (!py_convert_bbox(box_obj.ptr(), l, b, r, t))
    -    throw Py::TypeError("Invalid bbox provided to copy_from_bbox");
    -
    -  //  std::cout << l << " " << b << " " << r << " " << t << " " << (height - (int)b) << " " << height - (int)t << std::endl;
    -  agg::rect_i rect((int)l, height - (int)t, (int)r, height - (int)b);
    -
    -  BufferRegion* reg = NULL;
    -  try {
    -    reg = new BufferRegion(rect, true);
    -  } catch (...) {
    -    throw Py::MemoryError("RendererAgg::copy_from_bbox could not allocate memory for buffer");
    -  }
    -
    -  if (!reg) {
    -    throw Py::MemoryError("RendererAgg::copy_from_bbox could not allocate memory for buffer");
    -  }
    +RendererAgg::copy_from_bbox(const Py::Tuple& args)
    +{
    +    //copy region in bbox to buffer and return swig/agg buffer object
    +    args.verify_length(1);
     
    -  try {
    -    agg::rendering_buffer rbuf;
    -    rbuf.attach(reg->data, reg->width, reg->height, reg->stride);
    +    Py::Object box_obj = args[0];
    +    double l, b, r, t;
    +    if (!py_convert_bbox(box_obj.ptr(), l, b, r, t))
    +    {
    +        throw Py::TypeError("Invalid bbox provided to copy_from_bbox");
    +    }
    +
    +    agg::rect_i rect((int)l, height - (int)t, (int)r, height - (int)b);
    +
    +    BufferRegion* reg = NULL;
    +    try
    +    {
    +        reg = new BufferRegion(rect, true);
    +    }
    +    catch (...)
    +    {
    +        throw Py::MemoryError(
    +            "RendererAgg::copy_from_bbox could not allocate memory for buffer");
    +    }
    +
    +    if (!reg)
    +    {
    +        throw Py::MemoryError(
    +            "RendererAgg::copy_from_bbox could not allocate memory for buffer");
    +    }
    +
    +    try
    +    {
    +        agg::rendering_buffer rbuf;
    +        rbuf.attach(reg->data, reg->width, reg->height, reg->stride);
     
    -    pixfmt pf(rbuf);
    -    renderer_base rb(pf);
    -    rb.copy_from(renderingBuffer, &rect, -rect.x1, -rect.y1);
    -  } catch (...) {
    -    delete reg;
    -    throw Py::RuntimeError("An unknown error occurred in copy_from_bbox");
    -  }
    -  return Py::asObject(reg);
    +        pixfmt pf(rbuf);
    +        renderer_base rb(pf);
    +        rb.copy_from(renderingBuffer, &rect, -rect.x1, -rect.y1);
    +    }
    +    catch (...)
    +    {
    +        delete reg;
    +        throw Py::RuntimeError("An unknown error occurred in copy_from_bbox");
    +    }
    +    return Py::asObject(reg);
     }
     
    -Py::Object
    -RendererAgg::restore_region(const Py::Tuple& args) {
    -  //copy BufferRegion to buffer
    -  args.verify_length(1);
    -  BufferRegion* region  = static_cast(args[0].ptr());
     
    -  if (region->data==NULL)
    -    throw Py::ValueError("Cannot restore_region from NULL data");
    -    //return Py::Object();
    +Py::Object
    +RendererAgg::restore_region(const Py::Tuple& args)
    +{
    +    //copy BufferRegion to buffer
    +    args.verify_length(1);
    +    BufferRegion* region  = static_cast(args[0].ptr());
     
    -  //std::cout << "restoring " << region->width << " " << region->height << " " << region->stride << " " << region->rect.x1 << " " << region->rect.y1 << std::endl;
    +    if (region->data == NULL)
    +    {
    +        throw Py::ValueError("Cannot restore_region from NULL data");
    +    }
     
    -  agg::rendering_buffer rbuf;
    -  rbuf.attach(region->data,
    -              region->width,
    -              region->height,
    -              region->stride);
    +    agg::rendering_buffer rbuf;
    +    rbuf.attach(region->data,
    +                region->width,
    +                region->height,
    +                region->stride);
     
    -  rendererBase.copy_from(rbuf, 0, region->rect.x1, region->rect.y1);
    +    rendererBase.copy_from(rbuf, 0, region->rect.x1, region->rect.y1);
     
    -  return Py::Object();
    +    return Py::Object();
     }
     
    +
     // Restore the part of the saved region with offsets
     Py::Object
    -RendererAgg::restore_region2(const Py::Tuple& args) {
    -  //copy BufferRegion to buffer
    -  args.verify_length(7);
    +RendererAgg::restore_region2(const Py::Tuple& args)
    +{
    +    //copy BufferRegion to buffer
    +    args.verify_length(7);
    +
    +    int x(0), y(0), xx1(0), yy1(0), xx2(0), yy2(0);
    +    try
    +    {
    +        xx1 = Py::Int(args[1]);
    +        yy1 = Py::Int(args[2]);
    +        xx2 = Py::Int(args[3]);
    +        yy2 = Py::Int(args[4]);
    +        x = Py::Int(args[5]);
    +        y = Py::Int(args[6]);
    +    }
    +    catch (Py::TypeError)
    +    {
    +        throw Py::TypeError("Invalid input arguments to restore_region2");
    +    }
     
     
    +    BufferRegion* region  = static_cast(args[0].ptr());
    +
    +    if (region->data == NULL)
    +    {
    +        throw Py::ValueError("Cannot restore_region from NULL data");
    +    }
     
    -  int x(0),y(0), xx1(0),yy1(0), xx2(0), yy2(0);
    -  try {
    -    xx1 = Py::Int( args[1] );
    -    yy1 = Py::Int( args[2] );
    -    xx2 = Py::Int( args[3] );
    -    yy2 = Py::Int( args[4] );
    -    x = Py::Int( args[5] );
    -    y = Py::Int( args[6] );
    -  }
    -  catch (Py::TypeError) {
    -    throw Py::TypeError("Invalid input arguments to draw_text_image");
    -  }
    +    agg::rect_i rect(xx1 - region->rect.x1, (yy1 - region->rect.y1),
    +                     xx2 - region->rect.x1, (yy2 - region->rect.y1));
     
    +    agg::rendering_buffer rbuf;
    +    rbuf.attach(region->data,
    +                region->width,
    +                region->height,
    +                region->stride);
     
    -  BufferRegion* region  = static_cast(args[0].ptr());
    +    rendererBase.copy_from(rbuf, &rect, x, y);
     
    -  if (region->data==NULL)
    -    throw Py::ValueError("Cannot restore_region from NULL data");
    +    return Py::Object();
    +}
     
    -  agg::rect_i rect(xx1-region->rect.x1, (yy1-region->rect.y1),
    -                   xx2-region->rect.x1, (yy2-region->rect.y1));
     
    +bool
    +RendererAgg::render_clippath(const Py::Object& clippath,
    +                             const agg::trans_affine& clippath_trans)
    +{
    +    typedef agg::conv_transform transformed_path_t;
    +    typedef agg::conv_curve curve_t;
     
    -  agg::rendering_buffer rbuf;
    -  rbuf.attach(region->data,
    -              region->width,
    -              region->height,
    -              region->stride);
    +    bool has_clippath = (clippath.ptr() != Py_None);
     
    -  rendererBase.copy_from(rbuf, &rect, x, y);
    +    if (has_clippath &&
    +        (clippath.ptr() != lastclippath.ptr() ||
    +         clippath_trans != lastclippath_transform))
    +    {
    +        create_alpha_buffers();
    +        agg::trans_affine trans(clippath_trans);
    +        trans *= agg::trans_affine_scaling(1.0, -1.0);
    +        trans *= agg::trans_affine_translation(0.0, (double)height);
    +
    +        PathIterator clippath_iter(clippath);
    +        rendererBaseAlphaMask.clear(agg::gray8(0, 0));
    +        transformed_path_t transformed_clippath(clippath_iter, trans);
    +        agg::conv_curve curved_clippath(transformed_clippath);
    +        theRasterizer.add_path(curved_clippath);
    +        rendererAlphaMask.color(agg::gray8(255, 255));
    +        agg::render_scanlines(theRasterizer, scanlineAlphaMask, rendererAlphaMask);
    +        lastclippath = clippath;
    +        lastclippath_transform = clippath_trans;
    +    }
     
    -  return Py::Object();
    +    return has_clippath;
     }
     
    +#define MARKER_CACHE_SIZE 512
    +
     
    -bool RendererAgg::render_clippath(const Py::Object& clippath, const agg::trans_affine& clippath_trans) {
    -  typedef agg::conv_transform transformed_path_t;
    -  typedef agg::conv_curve curve_t;
    +Py::Object
    +RendererAgg::draw_markers(const Py::Tuple& args)
    +{
    +    typedef agg::conv_transform                  transformed_path_t;
    +    typedef PathSnapper                    snap_t;
    +    typedef agg::conv_curve                            curve_t;
    +    typedef agg::conv_stroke                          stroke_t;
    +    typedef agg::pixfmt_amask_adaptor pixfmt_amask_type;
    +    typedef agg::renderer_base              amask_ren_type;
    +    typedef agg::renderer_scanline_aa_solid    amask_aa_renderer_type;
    +    typedef agg::renderer_scanline_bin_solid   amask_bin_renderer_type;
    +    args.verify_length(5, 6);
    +
    +    Py::Object        gc_obj          = args[0];
    +    Py::Object        marker_path_obj = args[1];
    +    agg::trans_affine marker_trans    = py_to_agg_transformation_matrix(args[2].ptr());
    +    Py::Object        path_obj        = args[3];
    +    agg::trans_affine trans           = py_to_agg_transformation_matrix(args[4].ptr());
    +    Py::Object        face_obj;
    +    if (args.size() == 6)
    +    {
    +        face_obj = args[5];
    +    }
     
    -  bool has_clippath = (clippath.ptr() != Py_None);
    +    GCAgg gc(gc_obj, dpi);
     
    -  if (has_clippath &&
    -      (clippath.ptr() != lastclippath.ptr() ||
    -       clippath_trans != lastclippath_transform)) {
    -    create_alpha_buffers();
    -    agg::trans_affine trans(clippath_trans);
    +    // Deal with the difference in y-axis direction
    +    marker_trans *= agg::trans_affine_scaling(1.0, -1.0);
         trans *= agg::trans_affine_scaling(1.0, -1.0);
         trans *= agg::trans_affine_translation(0.0, (double)height);
     
    -    PathIterator clippath_iter(clippath);
    -    rendererBaseAlphaMask.clear(agg::gray8(0, 0));
    -    transformed_path_t transformed_clippath(clippath_iter, trans);
    -    agg::conv_curve curved_clippath(transformed_clippath);
    -    theRasterizer.add_path(curved_clippath);
    -    rendererAlphaMask.color(agg::gray8(255, 255));
    -    agg::render_scanlines(theRasterizer, scanlineAlphaMask, rendererAlphaMask);
    -    lastclippath = clippath;
    -    lastclippath_transform = clippath_trans;
    -  }
    -
    -  return has_clippath;
    -}
    +    PathIterator       marker_path(marker_path_obj);
    +    transformed_path_t marker_path_transformed(marker_path, marker_trans);
    +    snap_t             marker_path_snapped(marker_path_transformed,
    +                                           gc.snap_mode,
    +                                           marker_path.total_vertices(),
    +                                           gc.linewidth);
    +    curve_t            marker_path_curve(marker_path_snapped);
    +
    +    PathIterator path(path_obj);
    +    transformed_path_t path_transformed(path, trans);
    +    snap_t             path_snapped(path_transformed,
    +                                    gc.snap_mode,
    +                                    path.total_vertices(),
    +                                    1.0);
    +    curve_t            path_curve(path_snapped);
    +    path_curve.rewind(0);
     
    -#define MARKER_CACHE_SIZE 512
    +    facepair_t face = _get_rgba_face(face_obj, gc.alpha);
     
    -Py::Object
    -RendererAgg::draw_markers(const Py::Tuple& args) {
    -  typedef agg::conv_transform                  transformed_path_t;
    -  typedef PathQuantizer                  quantize_t;
    -  typedef agg::conv_curve                        curve_t;
    -  typedef agg::conv_stroke                          stroke_t;
    -  typedef agg::pixfmt_amask_adaptor pixfmt_amask_type;
    -  typedef agg::renderer_base              amask_ren_type;
    -  typedef agg::renderer_scanline_aa_solid    amask_aa_renderer_type;
    -  typedef agg::renderer_scanline_bin_solid   amask_bin_renderer_type;
    -  args.verify_length(5, 6);
    -
    -  Py::Object        gc_obj          = args[0];
    -  Py::Object        marker_path_obj = args[1];
    -  agg::trans_affine marker_trans    = py_to_agg_transformation_matrix(args[2].ptr());
    -  Py::Object        path_obj        = args[3];
    -  agg::trans_affine trans           = py_to_agg_transformation_matrix(args[4].ptr());
    -  Py::Object        face_obj;
    -  if (args.size() == 6)
    -    face_obj = args[5];
    -
    -  GCAgg gc = GCAgg(gc_obj, dpi);
    -
    -  // Deal with the difference in y-axis direction
    -  marker_trans *= agg::trans_affine_scaling(1.0, -1.0);
    -  trans *= agg::trans_affine_scaling(1.0, -1.0);
    -  trans *= agg::trans_affine_translation(0.0, (double)height);
    -
    -  PathIterator       marker_path(marker_path_obj);
    -  transformed_path_t marker_path_transformed(marker_path, marker_trans);
    -  quantize_t         marker_path_quantized(marker_path_transformed,
    -                                           gc.quantize_mode,
    -                                           marker_path.total_vertices());
    -  curve_t            marker_path_curve(marker_path_quantized);
    -
    -  PathIterator path(path_obj);
    -  transformed_path_t path_transformed(path, trans);
    -  quantize_t         path_quantized(path_transformed,
    -                                    gc.quantize_mode,
    -                                    path.total_vertices());
    -  curve_t            path_curve(path_quantized);
    -  path_curve.rewind(0);
    -
    -  facepair_t face = _get_rgba_face(face_obj, gc.alpha);
    -
    -  //maxim's suggestions for cached scanlines
    -  agg::scanline_storage_aa8 scanlines;
    -  theRasterizer.reset();
    -  theRasterizer.reset_clipping();
    -  rendererBase.reset_clipping(true);
    -
    -  agg::int8u  staticFillCache[MARKER_CACHE_SIZE];
    -  agg::int8u  staticStrokeCache[MARKER_CACHE_SIZE];
    -  agg::int8u* fillCache = staticFillCache;
    -  agg::int8u* strokeCache = staticStrokeCache;
    -
    -  try {
    -    unsigned fillSize = 0;
    -    if (face.first) {
    -      theRasterizer.add_path(marker_path_curve);
    -      agg::render_scanlines(theRasterizer, slineP8, scanlines);
    -      fillSize = scanlines.byte_size();
    -      if (fillSize >= MARKER_CACHE_SIZE)
    -        fillCache = new agg::int8u[fillSize];
    -      scanlines.serialize(fillCache);
    -    }
    -
    -    stroke_t stroke(marker_path_curve);
    -    stroke.width(gc.linewidth);
    -    stroke.line_cap(gc.cap);
    -    stroke.line_join(gc.join);
    +    //maxim's suggestions for cached scanlines
    +    agg::scanline_storage_aa8 scanlines;
         theRasterizer.reset();
    -    theRasterizer.add_path(stroke);
    -    agg::render_scanlines(theRasterizer, slineP8, scanlines);
    -    unsigned strokeSize = scanlines.byte_size();
    -    if (strokeSize >= MARKER_CACHE_SIZE)
    -      strokeCache = new agg::int8u[strokeSize];
    -    scanlines.serialize(strokeCache);
    -
         theRasterizer.reset_clipping();
         rendererBase.reset_clipping(true);
    -    set_clipbox(gc.cliprect, rendererBase);
    -    bool has_clippath = render_clippath(gc.clippath, gc.clippath_trans);
     
    -    double x, y;
    +    agg::int8u  staticFillCache[MARKER_CACHE_SIZE];
    +    agg::int8u  staticStrokeCache[MARKER_CACHE_SIZE];
    +    agg::int8u* fillCache = staticFillCache;
    +    agg::int8u* strokeCache = staticStrokeCache;
     
    -    agg::serialized_scanlines_adaptor_aa8 sa;
    -    agg::serialized_scanlines_adaptor_aa8::embedded_scanline sl;
    -
    -    agg::rect_d clipping_rect(
    -      -(scanlines.min_x() + 1.0),
    -      -(scanlines.min_y() + 1.0),
    -      width + scanlines.max_x() + 1.0,
    -      height + scanlines.max_y() + 1.0);
    -
    -    if (has_clippath) {
    -      while (path_curve.vertex(&x, &y) != agg::path_cmd_stop) {
    -        if (MPL_notisfinite64(x) || MPL_notisfinite64(y)) {
    -          continue;
    -        }
    -
    -        x = (double)(int)x; y = (double)(int)y;
    -
    -        // Cull points outside the boundary of the image.  Values
    -        // that are too large may overflow and create segfaults.
    -        // because they can create segfaults of they overflow; eg
    -        // http://sourceforge.net/tracker/?func=detail&aid=2865490&group_id=80706&atid=560720
    -        if (!clipping_rect.hit_test(x, y)) {
    -          continue;
    +    try
    +    {
    +        unsigned fillSize = 0;
    +        if (face.first)
    +        {
    +            theRasterizer.add_path(marker_path_curve);
    +            agg::render_scanlines(theRasterizer, slineP8, scanlines);
    +            fillSize = scanlines.byte_size();
    +            if (fillSize >= MARKER_CACHE_SIZE)
    +            {
    +                fillCache = new agg::int8u[fillSize];
    +            }
    +            scanlines.serialize(fillCache);
             }
     
    -        pixfmt_amask_type pfa(pixFmt, alphaMask);
    -        amask_ren_type r(pfa);
    -        amask_aa_renderer_type ren(r);
    -
    -        if (face.first) {
    -          ren.color(face.second);
    -          sa.init(fillCache, fillSize, x, y);
    -          agg::render_scanlines(sa, sl, ren);
    -        }
    -        ren.color(gc.color);
    -        sa.init(strokeCache, strokeSize, x, y);
    -        agg::render_scanlines(sa, sl, ren);
    -      }
    -    } else {
    -      while (path_curve.vertex(&x, &y) != agg::path_cmd_stop) {
    -        if (MPL_notisfinite64(x) || MPL_notisfinite64(y)) {
    -          continue;
    +        stroke_t stroke(marker_path_curve);
    +        stroke.width(gc.linewidth);
    +        stroke.line_cap(gc.cap);
    +        stroke.line_join(gc.join);
    +        theRasterizer.reset();
    +        theRasterizer.add_path(stroke);
    +        agg::render_scanlines(theRasterizer, slineP8, scanlines);
    +        unsigned strokeSize = scanlines.byte_size();
    +        if (strokeSize >= MARKER_CACHE_SIZE)
    +        {
    +            strokeCache = new agg::int8u[strokeSize];
             }
    +        scanlines.serialize(strokeCache);
     
    -        x = (double)(int)x; y = (double)(int)y;
    -
    -        // Cull points outside the boundary of the image.  Values
    -        // that are too large may overflow and create segfaults.
    -        // because they can create segfaults of they overflow; eg
    -        // http://sourceforge.net/tracker/?func=detail&aid=2865490&group_id=80706&atid=560720
    -        if (!clipping_rect.hit_test(x, y)) {
    -          continue;
    +        theRasterizer.reset_clipping();
    +        rendererBase.reset_clipping(true);
    +        set_clipbox(gc.cliprect, rendererBase);
    +        bool has_clippath = render_clippath(gc.clippath, gc.clippath_trans);
    +
    +        double x, y;
    +
    +        agg::serialized_scanlines_adaptor_aa8 sa;
    +        agg::serialized_scanlines_adaptor_aa8::embedded_scanline sl;
    +
    +        agg::rect_d clipping_rect(
    +            -(scanlines.min_x() + 1.0),
    +            -(scanlines.min_y() + 1.0),
    +            width + scanlines.max_x() + 1.0,
    +            height + scanlines.max_y() + 1.0);
    +
    +        if (has_clippath)
    +        {
    +            while (path_curve.vertex(&x, &y) != agg::path_cmd_stop)
    +            {
    +                if (MPL_notisfinite64(x) || MPL_notisfinite64(y))
    +                {
    +                    continue;
    +                }
    +
    +                x = (double)(int)x;
    +                y = (double)(int)y;
    +
    +                // Cull points outside the boundary of the image.
    +                // Values that are too large may overflow and create
    +                // segfaults.
    +                // http://sourceforge.net/tracker/?func=detail&aid=2865490&group_id=80706&atid=560720
    +                if (!clipping_rect.hit_test(x, y))
    +                {
    +                    continue;
    +                }
    +
    +                pixfmt_amask_type pfa(pixFmt, alphaMask);
    +                amask_ren_type r(pfa);
    +                amask_aa_renderer_type ren(r);
    +
    +                if (face.first)
    +                {
    +                    ren.color(face.second);
    +                    sa.init(fillCache, fillSize, x, y);
    +                    agg::render_scanlines(sa, sl, ren);
    +                }
    +                ren.color(gc.color);
    +                sa.init(strokeCache, strokeSize, x, y);
    +                agg::render_scanlines(sa, sl, ren);
    +            }
             }
    -
    -        if (face.first) {
    -          rendererAA.color(face.second);
    -          sa.init(fillCache, fillSize, x, y);
    -          agg::render_scanlines(sa, sl, rendererAA);
    +        else
    +        {
    +            while (path_curve.vertex(&x, &y) != agg::path_cmd_stop)
    +            {
    +                if (MPL_notisfinite64(x) || MPL_notisfinite64(y))
    +                {
    +                    continue;
    +                }
    +
    +                x = (double)(int)x;
    +                y = (double)(int)y;
    +
    +                // Cull points outside the boundary of the image.
    +                // Values that are too large may overflow and create
    +                // segfaults.
    +                // http://sourceforge.net/tracker/?func=detail&aid=2865490&group_id=80706&atid=560720
    +                if (!clipping_rect.hit_test(x, y))
    +                {
    +                    continue;
    +                }
    +
    +                if (face.first)
    +                {
    +                    rendererAA.color(face.second);
    +                    sa.init(fillCache, fillSize, x, y);
    +                    agg::render_scanlines(sa, sl, rendererAA);
    +                }
    +
    +                rendererAA.color(gc.color);
    +                sa.init(strokeCache, strokeSize, x, y);
    +                agg::render_scanlines(sa, sl, rendererAA);
    +            }
             }
    -
    -        rendererAA.color(gc.color);
    -        sa.init(strokeCache, strokeSize, x, y);
    -        agg::render_scanlines(sa, sl, rendererAA);
    -      }
         }
    -  } catch(...) {
    +    catch (...)
    +    {
    +        if (fillCache != staticFillCache)
    +            delete[] fillCache;
    +        if (strokeCache != staticStrokeCache)
    +            delete[] strokeCache;
    +        theRasterizer.reset_clipping();
    +        rendererBase.reset_clipping(true);
    +        throw;
    +    }
    +
         if (fillCache != staticFillCache)
    -      delete[] fillCache;
    +        delete[] fillCache;
         if (strokeCache != staticStrokeCache)
    -      delete[] strokeCache;
    -    throw;
    -  }
    -
    -  if (fillCache != staticFillCache)
    -    delete[] fillCache;
    -  if (strokeCache != staticStrokeCache)
    -    delete[] strokeCache;
    +        delete[] strokeCache;
     
    -  return Py::Object();
    +    theRasterizer.reset_clipping();
    +    rendererBase.reset_clipping(true);
    +
    +    return Py::Object();
     }
     
    +
     /**
      * This is a custom span generator that converts spans in the
      * 8-bit inverted greyscale font buffer to rgba that agg can use.
    @@ -686,457 +822,573 @@
     class font_to_rgba
     {
     public:
    -  typedef ChildGenerator child_type;
    -  typedef agg::rgba8 color_type;
    -  typedef typename child_type::color_type child_color_type;
    -  typedef agg::span_allocator span_alloc_type;
    +    typedef ChildGenerator child_type;
    +    typedef agg::rgba8 color_type;
    +    typedef typename child_type::color_type child_color_type;
    +    typedef agg::span_allocator span_alloc_type;
     
     private:
    -  child_type* _gen;
    -  color_type _color;
    -  span_alloc_type _allocator;
    +    child_type* _gen;
    +    color_type _color;
    +    span_alloc_type _allocator;
     
     public:
    -  font_to_rgba(child_type* gen, color_type color) :
    -    _gen(gen),
    -    _color(color) {
    -  }
    -
    -  inline void generate(color_type* output_span, int x, int y, unsigned len)
    -  {
    -    _allocator.allocate(len);
    -    child_color_type* input_span = _allocator.span();
    -    _gen->generate(input_span, x, y, len);
    -
    -    do {
    -      *output_span = _color;
    -      output_span->a = ((unsigned int)_color.a * (unsigned int)input_span->v) >> 8;
    -      ++output_span;
    -      ++input_span;
    -    } while (--len);
    -  }
    -
    -  void prepare()
    -  {
    -    _gen->prepare();
    -  }
    +    font_to_rgba(child_type* gen, color_type color) :
    +        _gen(gen),
    +        _color(color)
    +    {
    +
    +    }
     
    +    inline void
    +    generate(color_type* output_span, int x, int y, unsigned len)
    +    {
    +        _allocator.allocate(len);
    +        child_color_type* input_span = _allocator.span();
    +        _gen->generate(input_span, x, y, len);
    +
    +        do
    +        {
    +            *output_span = _color;
    +            output_span->a = ((unsigned int)_color.a *
    +                              (unsigned int)input_span->v) >> 8;
    +            ++output_span;
    +            ++input_span;
    +        }
    +        while (--len);
    +    }
    +
    +    void
    +    prepare()
    +    {
    +        _gen->prepare();
    +    }
     };
     
    +
     // MGDTODO: Support clip paths
     Py::Object
    -RendererAgg::draw_text_image(const Py::Tuple& args) {
    -  _VERBOSE("RendererAgg::draw_text");
    +RendererAgg::draw_text_image(const Py::Tuple& args)
    +{
    +    _VERBOSE("RendererAgg::draw_text");
     
    -  typedef agg::span_allocator gray_span_alloc_type;
    -  typedef agg::span_allocator color_span_alloc_type;
    -  typedef agg::span_interpolator_linear<> interpolator_type;
    -  typedef agg::image_accessor_clip image_accessor_type;
    -  //typedef agg::span_image_filter_gray_2x2
    -  //  image_span_gen_type;
    -  typedef agg::span_image_filter_gray
    -    image_span_gen_type;
    -
    -  typedef font_to_rgba span_gen_type;
    -  typedef agg::renderer_scanline_aa
    -    renderer_type;
    -
    -  args.verify_length(5);
    -
    -  const unsigned char* buffer = NULL;
    -  int width, height;
    -  Py::Object image_obj = args[0];
    -  PyArrayObject* image_array = NULL;
    -  if (PyArray_Check(image_obj.ptr())) {
    -    image_array = (PyArrayObject*)PyArray_FromObject(image_obj.ptr(), PyArray_UBYTE, 2, 2);
    -    if (!image_array)
    -      throw Py::ValueError("First argument to draw_text_image must be a FT2Font.Image object or a Nx2 uint8 numpy array.");
    -    buffer = (unsigned char *)PyArray_DATA(image_array);
    -    width = PyArray_DIM(image_array, 1);
    -    height = PyArray_DIM(image_array, 0);
    -  } else {
    -    FT2Image *image = static_cast(args[0].ptr());
    -    if (!image->get_buffer())
    -      throw Py::ValueError("First argument to draw_text_image must be a FT2Font.Image object or a Nx2 uint8 numpy array.");
    -    buffer = image->get_buffer();
    -    width = image->get_width();
    -    height = image->get_height();
    -  }
    -
    -  int x(0),y(0);
    -  try {
    -    x = Py::Int( args[1] );
    -    y = Py::Int( args[2] );
    -  }
    -  catch (Py::TypeError) {
    -    Py_XDECREF(image_array);
    -    throw Py::TypeError("Invalid input arguments to draw_text_image");
    -  }
    -
    -  double angle = Py::Float( args[3] );
    -
    -  GCAgg gc = GCAgg(args[4], dpi);
    -
    -  theRasterizer.reset_clipping();
    -  rendererBase.reset_clipping(true);
    -  set_clipbox(gc.cliprect, theRasterizer);
    -
    -  agg::rendering_buffer srcbuf((agg::int8u*)buffer, width, height, width);
    -  agg::pixfmt_gray8 pixf_img(srcbuf);
    -
    -  agg::trans_affine mtx;
    -  mtx *= agg::trans_affine_translation(0, -height);
    -  mtx *= agg::trans_affine_rotation(-angle * agg::pi / 180.0);
    -  mtx *= agg::trans_affine_translation(x, y);
    -
    -  agg::path_storage rect;
    -  rect.move_to(0, 0);
    -  rect.line_to(width, 0);
    -  rect.line_to(width, height);
    -  rect.line_to(0, height);
    -  rect.line_to(0, 0);
    -  agg::conv_transform rect2(rect, mtx);
    -
    -  agg::trans_affine inv_mtx(mtx);
    -  inv_mtx.invert();
    -
    -  agg::image_filter_lut filter;
    -  filter.calculate(agg::image_filter_spline36());
    -  interpolator_type interpolator(inv_mtx);
    -  color_span_alloc_type sa;
    -  image_accessor_type ia(pixf_img, 0);
    -  image_span_gen_type image_span_generator(ia, interpolator, filter);
    -  span_gen_type output_span_generator(&image_span_generator, gc.color);
    -  renderer_type ri(rendererBase, sa, output_span_generator);
    -
    -  theRasterizer.add_path(rect2);
    -  agg::render_scanlines(theRasterizer, slineP8, ri);
    -
    -  Py_XDECREF(image_array);
    -
    -  return Py::Object();
    -}
    -
    -
    -Py::Object
    -RendererAgg::draw_image(const Py::Tuple& args) {
    -  _VERBOSE("RendererAgg::draw_image");
    -
    -  args.verify_length(4, 6);
    -
    -  double x = Py::Float(args[0]);
    -  double y = Py::Float(args[1]);
    -  Image *image = static_cast(args[2].ptr());
    -  Py::Object box_obj = args[3];
    -  Py::Object clippath;
    -  agg::trans_affine clippath_trans;
    -  bool has_clippath = false;
    -
    -  theRasterizer.reset_clipping();
    -  rendererBase.reset_clipping(true);
    -  if (args.size() == 6) {
    -    clippath = args[4];
    -    clippath_trans = py_to_agg_transformation_matrix(args[5].ptr(), false);
    -    has_clippath = render_clippath(clippath, clippath_trans);
    -  }
    -
    -  Py::Tuple empty;
    -  image->flipud_out(empty);
    -  pixfmt pixf(*(image->rbufOut));
    +    typedef agg::span_allocator gray_span_alloc_type;
    +    typedef agg::span_allocator color_span_alloc_type;
    +    typedef agg::span_interpolator_linear<> interpolator_type;
    +    typedef agg::image_accessor_clip image_accessor_type;
    +    typedef agg::span_image_filter_gray image_span_gen_type;
    +    typedef font_to_rgba span_gen_type;
    +    typedef agg::renderer_scanline_aa renderer_type;
    +
    +    args.verify_length(5);
    +
    +    const unsigned char* buffer = NULL;
    +    int width, height;
    +    Py::Object image_obj = args[0];
    +
    +    if (PyArray_Check(image_obj.ptr()))
    +    {
    +        PyObject* image_array = PyArray_FromObject(
    +            image_obj.ptr(), PyArray_UBYTE, 2, 2);
    +        if (!image_array)
    +        {
    +            throw Py::ValueError(
    +                "First argument to draw_text_image must be a FT2Font.Image object or a Nx2 uint8 numpy array.");
    +        }
    +        image_obj = Py::Object(image_array, true);
    +        buffer = (unsigned char *)PyArray_DATA(image_array);
    +        width = PyArray_DIM(image_array, 1);
    +        height = PyArray_DIM(image_array, 0);
    +    }
    +    else
    +    {
    +        FT2Image *image = static_cast(image_obj.ptr());
    +        if (!image->get_buffer())
    +        {
    +            throw Py::ValueError(
    +                "First argument to draw_text_image must be a FT2Font.Image object or a Nx2 uint8 numpy array.");
    +        }
    +        buffer = image->get_buffer();
    +        width = image->get_width();
    +        height = image->get_height();
    +    }
    +
    +    int x(0), y(0);
    +    try
    +    {
    +        x = Py::Int(args[1]);
    +        y = Py::Int(args[2]);
    +    }
    +    catch (Py::TypeError)
    +    {
    +        throw Py::TypeError("Invalid input arguments to draw_text_image");
    +    }
    +
    +    double angle = Py::Float(args[3]);
    +
    +    GCAgg gc(args[4], dpi);
    +
    +    theRasterizer.reset_clipping();
    +    rendererBase.reset_clipping(true);
    +    set_clipbox(gc.cliprect, theRasterizer);
    +
    +    agg::rendering_buffer srcbuf((agg::int8u*)buffer, width, height, width);
    +    agg::pixfmt_gray8 pixf_img(srcbuf);
     
    -  if (has_clippath) {
         agg::trans_affine mtx;
    -    mtx *= agg::trans_affine_translation((int)x, (int)(height-(y+image->rowsOut)));
    +    mtx *= agg::trans_affine_translation(0, -height);
    +    mtx *= agg::trans_affine_rotation(-angle * agg::pi / 180.0);
    +    mtx *= agg::trans_affine_translation(x, y);
     
         agg::path_storage rect;
         rect.move_to(0, 0);
    -    rect.line_to(image->colsOut, 0);
    -    rect.line_to(image->colsOut, image->rowsOut);
    -    rect.line_to(0, image->rowsOut);
    +    rect.line_to(width, 0);
    +    rect.line_to(width, height);
    +    rect.line_to(0, height);
         rect.line_to(0, 0);
         agg::conv_transform rect2(rect, mtx);
     
         agg::trans_affine inv_mtx(mtx);
         inv_mtx.invert();
     
    -    typedef agg::span_allocator color_span_alloc_type;
    -    typedef agg::pixfmt_amask_adaptor pixfmt_amask_type;
    -    typedef agg::renderer_base amask_ren_type;
    -    typedef agg::image_accessor_clip image_accessor_type;
    -    typedef agg::span_interpolator_linear<> interpolator_type;
    -    typedef agg::span_image_filter_rgba_nn image_span_gen_type;
    -    typedef agg::renderer_scanline_aa renderer_type;
    -
    -    color_span_alloc_type sa;
    -    image_accessor_type ia(pixf, agg::rgba8(0, 0, 0, 0));
    +    agg::image_filter_lut filter;
    +    filter.calculate(agg::image_filter_spline36());
         interpolator_type interpolator(inv_mtx);
    -    image_span_gen_type image_span_generator(ia, interpolator);
    -    pixfmt_amask_type pfa(pixFmt, alphaMask);
    -    amask_ren_type r(pfa);
    -    renderer_type ri(r, sa, image_span_generator);
    +    color_span_alloc_type sa;
    +    image_accessor_type ia(pixf_img, 0);
    +    image_span_gen_type image_span_generator(ia, interpolator, filter);
    +    span_gen_type output_span_generator(&image_span_generator, gc.color);
    +    renderer_type ri(rendererBase, sa, output_span_generator);
     
         theRasterizer.add_path(rect2);
         agg::render_scanlines(theRasterizer, slineP8, ri);
    -  } else {
    -    set_clipbox(box_obj, rendererBase);
    -    rendererBase.blend_from(pixf, 0, (int)x, (int)(height-(y+image->rowsOut)));
    -  }
    -
    -  image->flipud_out(empty);
     
    -  return Py::Object();
    +    return Py::Object();
     }
     
    -template
    -void RendererAgg::_draw_path(path_t& path, bool has_clippath,
    -                             const facepair_t& face, const GCAgg& gc) {
    -  typedef agg::conv_stroke                           stroke_t;
    -  typedef agg::conv_dash                             dash_t;
    -  typedef agg::conv_stroke                           stroke_dash_t;
    -  typedef agg::pixfmt_amask_adaptor pixfmt_amask_type;
    -  typedef agg::renderer_base              amask_ren_type;
    -  typedef agg::renderer_scanline_aa_solid    amask_aa_renderer_type;
    -  typedef agg::renderer_scanline_bin_solid   amask_bin_renderer_type;
    -
    -  // Render face
    -  if (face.first) {
    -    theRasterizer.add_path(path);
     
    -    if (gc.isaa) {
    -      if (has_clippath) {
    -        pixfmt_amask_type pfa(pixFmt, alphaMask);
    -        amask_ren_type r(pfa);
    -        amask_aa_renderer_type ren(r);
    -        ren.color(face.second);
    -        agg::render_scanlines(theRasterizer, slineP8, ren);
    -      } else {
    -        rendererAA.color(face.second);
    -        agg::render_scanlines(theRasterizer, slineP8, rendererAA);
    -      }
    -    } else {
    -      if (has_clippath) {
    -        pixfmt_amask_type pfa(pixFmt, alphaMask);
    -        amask_ren_type r(pfa);
    -        amask_bin_renderer_type ren(r);
    -        ren.color(face.second);
    -        agg::render_scanlines(theRasterizer, slineP8, ren);
    -      } else {
    -        rendererBin.color(face.second);
    -        agg::render_scanlines(theRasterizer, slineP8, rendererBin);
    -      }
    -    }
    -  }
    -
    -  // Render hatch
    -  if (!gc.hatchpath.isNone()) {
    -    // Reset any clipping that may be in effect, since we'll be
    -    // drawing the hatch in a scratch buffer at origin (0, 0)
    +Py::Object
    +RendererAgg::draw_image(const Py::Tuple& args)
    +{
    +    _VERBOSE("RendererAgg::draw_image");
    +
    +    args.verify_length(4, 7); // 7 if affine matrix if given
    +
    +    GCAgg gc(args[0], dpi);
    +    Image *image = static_cast(args[3].ptr());
    +    bool has_clippath = false;
    +    agg::trans_affine affine_trans;
    +    bool has_affine = false;
    +    double x, y, w, h;
    +
    +    if (args.size() == 7)
    +    {
    +        has_affine = true;
    +        x = Py::Float(args[1]);
    +        y = Py::Float(args[2]);
    +        w = Py::Float(args[4]);
    +        h = Py::Float(args[5]);
    +        affine_trans = py_to_agg_transformation_matrix(args[6].ptr());
    +    }
    +    else
    +    {
    +        x = mpl_round(Py::Float(args[1]));
    +        y = mpl_round(Py::Float(args[2]));
    +        w = h = 0; /* w and h not used in this case, but assign to prevent
    +                  warnings from the compiler */
    +    }
    +
         theRasterizer.reset_clipping();
         rendererBase.reset_clipping(true);
    +    set_clipbox(gc.cliprect, theRasterizer);
    +    has_clippath = render_clippath(gc.clippath, gc.clippath_trans);
     
    -    // Create and transform the path
    -    typedef agg::conv_transform hatch_path_trans_t;
    -    typedef agg::conv_curve hatch_path_curve_t;
    -    typedef agg::conv_stroke hatch_path_stroke_t;
    -
    -    PathIterator hatch_path(gc.hatchpath);
    -    agg::trans_affine hatch_trans;
    -    hatch_trans *= agg::trans_affine_scaling(1.0, -1.0);
    -    hatch_trans *= agg::trans_affine_translation(0.0, 1.0);
    -    hatch_trans *= agg::trans_affine_scaling(HATCH_SIZE, HATCH_SIZE);
    -    hatch_path_trans_t hatch_path_trans(hatch_path, hatch_trans);
    -    hatch_path_curve_t hatch_path_curve(hatch_path_trans);
    -    hatch_path_stroke_t hatch_path_stroke(hatch_path_curve);
    -    hatch_path_stroke.width(1.0);
    -    hatch_path_stroke.line_cap(agg::square_cap);
    -
    -    // Render the path into the hatch buffer
    -    pixfmt hatch_img_pixf(hatchRenderingBuffer);
    -    renderer_base rb(hatch_img_pixf);
    -    renderer_aa rs(rb);
    -    rb.clear(agg::rgba(0.0, 0.0, 0.0, 0.0));
    -    rs.color(gc.color);
    -
    -    theRasterizer.add_path(hatch_path_curve);
    -    agg::render_scanlines(theRasterizer, slineP8, rs);
    -    theRasterizer.add_path(hatch_path_stroke);
    -    agg::render_scanlines(theRasterizer, slineP8, rs);
    +    Py::Tuple empty;
    +    image->flipud_out(empty);
    +    pixfmt pixf(*(image->rbufOut));
     
    -    // Put clipping back on, if originally set on entry to this
    -    // function
    -    set_clipbox(gc.cliprect, theRasterizer);
    -    if (has_clippath)
    -      render_clippath(gc.clippath, gc.clippath_trans);
    +    if (has_affine | has_clippath)
    +    {
    +        agg::trans_affine mtx;
    +        agg::path_storage rect;
     
    -    // Transfer the hatch to the main image buffer
    -    typedef agg::image_accessor_wrap img_source_type;
    -    typedef agg::span_pattern_rgba span_gen_type;
    -    agg::span_allocator sa;
    -    img_source_type img_src(hatch_img_pixf);
    -    span_gen_type sg(img_src, 0, 0);
    -    theRasterizer.add_path(path);
    -    agg::render_scanlines_aa(theRasterizer, slineP8, rendererBase, sa, sg);
    -  }
    -
    -  // Render stroke
    -  if (gc.linewidth != 0.0) {
    -    double linewidth = gc.linewidth;
    -    if (!gc.isaa) {
    -      linewidth = (linewidth < 0.5) ? 0.5 : mpl_round(linewidth);
    -    }
    -    if (gc.dashes.size() == 0) {
    -      stroke_t stroke(path);
    -      stroke.width(linewidth);
    -      stroke.line_cap(gc.cap);
    -      stroke.line_join(gc.join);
    -      theRasterizer.add_path(stroke);
    -    } else {
    -      dash_t dash(path);
    -      for (GCAgg::dash_t::const_iterator i = gc.dashes.begin();
    -           i != gc.dashes.end(); ++i) {
    -        double val0 = i->first;
    -        double val1 = i->second;
    -        if (!gc.isaa) {
    -          val0 = (int)val0 + 0.5;
    -          val1 = (int)val1 + 0.5;
    -        }
    -        dash.add_dash(val0, val1);
    -      }
    -      stroke_dash_t stroke(dash);
    -      stroke.line_cap(gc.cap);
    -      stroke.line_join(gc.join);
    -      stroke.width(linewidth);
    -      theRasterizer.add_path(stroke);
    -    }
    +        if (has_affine)
    +        {
    +            mtx *= agg::trans_affine_scaling(1, -1);
    +            mtx *= agg::trans_affine_translation(0, image->rowsOut);
    +            mtx *= agg::trans_affine_scaling(w / (image->colsOut),
    +                                             h / (image->rowsOut));
    +            mtx *= agg::trans_affine_translation(x, y);
    +            mtx *= affine_trans;
    +            mtx *= agg::trans_affine_scaling(1.0, -1.0);
    +            mtx *= agg::trans_affine_translation(0.0, (double) height);
    +        }
    +        else
    +        {
    +            mtx *= agg::trans_affine_translation(
    +                (int)x,
    +                (int)(height - (y + image->rowsOut)));
    +        }
     
    -    if (gc.isaa) {
    -      if (has_clippath) {
    -        pixfmt_amask_type pfa(pixFmt, alphaMask);
    -        amask_ren_type r(pfa);
    -        amask_aa_renderer_type ren(r);
    -        ren.color(gc.color);
    -        agg::render_scanlines(theRasterizer, slineP8, ren);
    -      } else {
    -        rendererAA.color(gc.color);
    -        agg::render_scanlines(theRasterizer, slineP8, rendererAA);
    -      }
    -    } else {
    -      if (has_clippath) {
    -        pixfmt_amask_type pfa(pixFmt, alphaMask);
    -        amask_ren_type r(pfa);
    -        amask_bin_renderer_type ren(r);
    -        ren.color(gc.color);
    -        agg::render_scanlines(theRasterizer, slineP8, ren);
    -      } else {
    -        rendererBin.color(gc.color);
    -        agg::render_scanlines(theRasterizer, slineBin, rendererBin);
    -      }
    -    }
    -  }
    -}
    +        rect.move_to(0, 0);
    +        rect.line_to(image->colsOut, 0);
    +        rect.line_to(image->colsOut, image->rowsOut);
    +        rect.line_to(0, image->rowsOut);
    +        rect.line_to(0, 0);
    +
    +        agg::conv_transform rect2(rect, mtx);
    +
    +        agg::trans_affine inv_mtx(mtx);
    +        inv_mtx.invert();
    +
    +        typedef agg::span_allocator color_span_alloc_type;
    +        typedef agg::image_accessor_clip
    +            image_accessor_type;
    +        typedef agg::span_interpolator_linear<> interpolator_type;
    +        typedef agg::span_image_filter_rgba_nn image_span_gen_type;
    +
    +        color_span_alloc_type sa;
    +        image_accessor_type ia(pixf, agg::rgba8(0, 0, 0, 0));
    +        interpolator_type interpolator(inv_mtx);
    +        image_span_gen_type image_span_generator(ia, interpolator);
    +
    +        if (has_clippath)
    +        {
    +            typedef agg::pixfmt_amask_adaptor
    +                pixfmt_amask_type;
    +            typedef agg::renderer_base amask_ren_type;
    +            typedef agg::renderer_scanline_aa
    +                renderer_type_alpha;
    +
    +            pixfmt_amask_type pfa(pixFmt, alphaMask);
    +            amask_ren_type r(pfa);
    +            renderer_type_alpha ri(r, sa, image_span_generator);
     
    -Py::Object
    -RendererAgg::draw_path(const Py::Tuple& args) {
    -  typedef agg::conv_transform  transformed_path_t;
    -  typedef PathNanRemover nan_removed_t;
    -  typedef PathClipper         clipped_t;
    -  typedef PathQuantizer           quantized_t;
    -  typedef PathSimplifier        simplify_t;
    -  typedef agg::conv_curve        curve_t;
    -
    -  _VERBOSE("RendererAgg::draw_path");
    -  args.verify_length(3, 4);
    -
    -  Py::Object gc_obj = args[0];
    -  Py::Object path_obj = args[1];
    -  agg::trans_affine trans = py_to_agg_transformation_matrix(args[2].ptr());
    -  Py::Object face_obj;
    -  if (args.size() == 4)
    -    face_obj = args[3];
    -
    -  PathIterator path(path_obj);
    -  GCAgg gc = GCAgg(gc_obj, dpi);
    -  facepair_t face = _get_rgba_face(face_obj, gc.alpha);
    -
    -  theRasterizer.reset_clipping();
    -  rendererBase.reset_clipping(true);
    -  set_clipbox(gc.cliprect, theRasterizer);
    -  bool has_clippath = render_clippath(gc.clippath, gc.clippath_trans);
    -
    -  trans *= agg::trans_affine_scaling(1.0, -1.0);
    -  trans *= agg::trans_affine_translation(0.0, (double)height);
    -  bool clip = !face.first && gc.hatchpath.isNone();
    -  bool simplify = path.should_simplify() && clip;
    -
    -  transformed_path_t tpath(path, trans);
    -  nan_removed_t      nan_removed(tpath, true, path.has_curves());
    -  clipped_t          clipped(nan_removed, clip, width, height);
    -  quantized_t        quantized(clipped, gc.quantize_mode, path.total_vertices());
    -  simplify_t         simplified(quantized, simplify, path.simplify_threshold());
    -  curve_t            curve(simplified);
    -
    -  try {
    -    _draw_path(curve, has_clippath, face, gc);
    -  } catch (const char* e) {
    -    throw Py::RuntimeError(e);
    -  }
    +            theRasterizer.add_path(rect2);
    +            agg::render_scanlines(theRasterizer, slineP8, ri);
    +        }
    +        else
    +        {
    +            typedef agg::renderer_base ren_type;
    +            typedef agg::renderer_scanline_aa
    +                renderer_type;
    +
    +            ren_type r(pixFmt);
    +            renderer_type ri(r, sa, image_span_generator);
    +
    +            theRasterizer.add_path(rect2);
    +            agg::render_scanlines(theRasterizer, slineP8, ri);
    +        }
    +
    +    }
    +    else
    +    {
    +        set_clipbox(gc.cliprect, rendererBase);
    +        rendererBase.blend_from(pixf, 0, (int)x, (int)(height - (y + image->rowsOut)));
    +    }
    +
    +    rendererBase.reset_clipping(true);
    +    image->flipud_out(empty);
    +
    +    return Py::Object();
    +}
    +
    +
    +template
    +void RendererAgg::_draw_path(path_t& path, bool has_clippath,
    +                             const facepair_t& face, const GCAgg& gc)
    +{
    +    typedef agg::conv_stroke                           stroke_t;
    +    typedef agg::conv_dash                             dash_t;
    +    typedef agg::conv_stroke                           stroke_dash_t;
    +    typedef agg::pixfmt_amask_adaptor pixfmt_amask_type;
    +    typedef agg::renderer_base              amask_ren_type;
    +    typedef agg::renderer_scanline_aa_solid    amask_aa_renderer_type;
    +    typedef agg::renderer_scanline_bin_solid   amask_bin_renderer_type;
    +
    +    // Render face
    +    if (face.first)
    +    {
    +        theRasterizer.add_path(path);
    +
    +        if (gc.isaa)
    +        {
    +            if (has_clippath)
    +            {
    +                pixfmt_amask_type pfa(pixFmt, alphaMask);
    +                amask_ren_type r(pfa);
    +                amask_aa_renderer_type ren(r);
    +                ren.color(face.second);
    +                agg::render_scanlines(theRasterizer, slineP8, ren);
    +            }
    +            else
    +            {
    +                rendererAA.color(face.second);
    +                agg::render_scanlines(theRasterizer, slineP8, rendererAA);
    +            }
    +        }
    +        else
    +        {
    +            if (has_clippath)
    +            {
    +                pixfmt_amask_type pfa(pixFmt, alphaMask);
    +                amask_ren_type r(pfa);
    +                amask_bin_renderer_type ren(r);
    +                ren.color(face.second);
    +                agg::render_scanlines(theRasterizer, slineP8, ren);
    +            }
    +            else
    +            {
    +                rendererBin.color(face.second);
    +                agg::render_scanlines(theRasterizer, slineP8, rendererBin);
    +            }
    +        }
    +    }
    +
    +    // Render hatch
    +    if (!gc.hatchpath.isNone())
    +    {
    +        // Reset any clipping that may be in effect, since we'll be
    +        // drawing the hatch in a scratch buffer at origin (0, 0)
    +        theRasterizer.reset_clipping();
    +        rendererBase.reset_clipping(true);
    +
    +        // Create and transform the path
    +        typedef agg::conv_transform hatch_path_trans_t;
    +        typedef agg::conv_curve hatch_path_curve_t;
    +        typedef agg::conv_stroke hatch_path_stroke_t;
    +
    +        PathIterator hatch_path(gc.hatchpath);
    +        agg::trans_affine hatch_trans;
    +        hatch_trans *= agg::trans_affine_scaling(1.0, -1.0);
    +        hatch_trans *= agg::trans_affine_translation(0.0, 1.0);
    +        hatch_trans *= agg::trans_affine_scaling(HATCH_SIZE, HATCH_SIZE);
    +        hatch_path_trans_t hatch_path_trans(hatch_path, hatch_trans);
    +        hatch_path_curve_t hatch_path_curve(hatch_path_trans);
    +        hatch_path_stroke_t hatch_path_stroke(hatch_path_curve);
    +        hatch_path_stroke.width(1.0);
    +        hatch_path_stroke.line_cap(agg::square_cap);
    +
    +        // Render the path into the hatch buffer
    +        pixfmt hatch_img_pixf(hatchRenderingBuffer);
    +        renderer_base rb(hatch_img_pixf);
    +        renderer_aa rs(rb);
    +        rb.clear(agg::rgba(0.0, 0.0, 0.0, 0.0));
    +        rs.color(gc.color);
    +
    +        theRasterizer.add_path(hatch_path_curve);
    +        agg::render_scanlines(theRasterizer, slineP8, rs);
    +        theRasterizer.add_path(hatch_path_stroke);
    +        agg::render_scanlines(theRasterizer, slineP8, rs);
    +
    +        // Put clipping back on, if originally set on entry to this
    +        // function
    +        set_clipbox(gc.cliprect, theRasterizer);
    +        if (has_clippath)
    +            render_clippath(gc.clippath, gc.clippath_trans);
    +
    +        // Transfer the hatch to the main image buffer
    +        typedef agg::image_accessor_wrap < pixfmt,
    +        agg::wrap_mode_repeat_auto_pow2,
    +        agg::wrap_mode_repeat_auto_pow2 > img_source_type;
    +        typedef agg::span_pattern_rgba span_gen_type;
    +        agg::span_allocator sa;
    +        img_source_type img_src(hatch_img_pixf);
    +        span_gen_type sg(img_src, 0, 0);
    +        theRasterizer.add_path(path);
    +        agg::render_scanlines_aa(theRasterizer, slineP8, rendererBase, sa, sg);
    +    }
    +
    +    // Render stroke
    +    if (gc.linewidth != 0.0)
    +    {
    +        double linewidth = gc.linewidth;
    +        if (!gc.isaa)
    +        {
    +            linewidth = (linewidth < 0.5) ? 0.5 : mpl_round(linewidth);
    +        }
    +        if (gc.dashes.size() == 0)
    +        {
    +            stroke_t stroke(path);
    +            stroke.width(linewidth);
    +            stroke.line_cap(gc.cap);
    +            stroke.line_join(gc.join);
    +            theRasterizer.add_path(stroke);
    +        }
    +        else
    +        {
    +            dash_t dash(path);
    +            for (GCAgg::dash_t::const_iterator i = gc.dashes.begin();
    +                    i != gc.dashes.end(); ++i)
    +            {
    +                double val0 = i->first;
    +                double val1 = i->second;
    +                if (!gc.isaa)
    +                {
    +                    val0 = (int)val0 + 0.5;
    +                    val1 = (int)val1 + 0.5;
    +                }
    +                dash.add_dash(val0, val1);
    +            }
    +            stroke_dash_t stroke(dash);
    +            stroke.line_cap(gc.cap);
    +            stroke.line_join(gc.join);
    +            stroke.width(linewidth);
    +            theRasterizer.add_path(stroke);
    +        }
    +
    +        if (gc.isaa)
    +        {
    +            if (has_clippath)
    +            {
    +                pixfmt_amask_type pfa(pixFmt, alphaMask);
    +                amask_ren_type r(pfa);
    +                amask_aa_renderer_type ren(r);
    +                ren.color(gc.color);
    +                agg::render_scanlines(theRasterizer, slineP8, ren);
    +            }
    +            else
    +            {
    +                rendererAA.color(gc.color);
    +                agg::render_scanlines(theRasterizer, slineP8, rendererAA);
    +            }
    +        }
    +        else
    +        {
    +            if (has_clippath)
    +            {
    +                pixfmt_amask_type pfa(pixFmt, alphaMask);
    +                amask_ren_type r(pfa);
    +                amask_bin_renderer_type ren(r);
    +                ren.color(gc.color);
    +                agg::render_scanlines(theRasterizer, slineP8, ren);
    +            }
    +            else
    +            {
    +                rendererBin.color(gc.color);
    +                agg::render_scanlines(theRasterizer, slineBin, rendererBin);
    +            }
    +        }
    +    }
    +}
    +
    +
    +Py::Object
    +RendererAgg::draw_path(const Py::Tuple& args)
    +{
    +    typedef agg::conv_transform  transformed_path_t;
    +    typedef PathNanRemover nan_removed_t;
    +    typedef PathClipper         clipped_t;
    +    typedef PathSnapper             snapped_t;
    +    typedef PathSimplifier          simplify_t;
    +    typedef agg::conv_curve        curve_t;
    +
    +    _VERBOSE("RendererAgg::draw_path");
    +    args.verify_length(3, 4);
    +
    +    GCAgg gc(args[0], dpi);
    +    PathIterator path(args[1]);
    +    agg::trans_affine trans = py_to_agg_transformation_matrix(args[2].ptr());
    +    Py::Object face_obj;
    +    if (args.size() == 4)
    +        face_obj = args[3];
    +
    +    facepair_t face = _get_rgba_face(face_obj, gc.alpha);
    +
    +    theRasterizer.reset_clipping();
    +    rendererBase.reset_clipping(true);
    +    set_clipbox(gc.cliprect, theRasterizer);
    +    bool has_clippath = render_clippath(gc.clippath, gc.clippath_trans);
    +
    +    trans *= agg::trans_affine_scaling(1.0, -1.0);
    +    trans *= agg::trans_affine_translation(0.0, (double)height);
    +    bool clip = !face.first && gc.hatchpath.isNone() && !path.has_curves();
    +    bool simplify = path.should_simplify() && clip;
    +
    +    transformed_path_t tpath(path, trans);
    +    nan_removed_t      nan_removed(tpath, true, path.has_curves());
    +    clipped_t          clipped(nan_removed, clip, width, height);
    +    snapped_t          snapped(clipped, gc.snap_mode, path.total_vertices(), gc.linewidth);
    +    simplify_t         simplified(snapped, simplify, path.simplify_threshold());
    +    curve_t            curve(simplified);
    +
    +    try
    +    {
    +        _draw_path(curve, has_clippath, face, gc);
    +    }
    +    catch (const char* e)
    +    {
    +        throw Py::RuntimeError(e);
    +    }
    +
    +    return Py::Object();
    +}
     
    -  return Py::Object();
    -}
     
     template
     Py::Object
     RendererAgg::_draw_path_collection_generic
    -  (agg::trans_affine              master_transform,
    -   const Py::Object&              cliprect,
    -   const Py::Object&              clippath,
    -   const agg::trans_affine&       clippath_trans,
    -   const PathGenerator&           path_generator,
    -   const Py::SeqBase& transforms_obj,
    -   const Py::Object&              offsets_obj,
    -   const agg::trans_affine&       offset_trans,
    -   const Py::Object&              facecolors_obj,
    -   const Py::Object&              edgecolors_obj,
    -   const Py::SeqBase&  linewidths,
    -   const Py::SeqBase& linestyles_obj,
    -   const Py::SeqBase&    antialiaseds) {
    -  typedef agg::conv_transform transformed_path_t;
    -  typedef PathNanRemover                         nan_removed_t;
    -  typedef PathClipper                                 clipped_t;
    -  typedef PathQuantizer                                   quantized_t;
    -  typedef agg::conv_curve                               quantized_curve_t;
    -  typedef agg::conv_curve                                 curve_t;
    -
    -  GCAgg gc(dpi);
    -
    -  PyArrayObject* offsets    = NULL;
    -  PyArrayObject* facecolors = NULL;
    -  PyArrayObject* edgecolors = NULL;
    -
    -  try {
    -    offsets = (PyArrayObject*)PyArray_FromObject
    -      (offsets_obj.ptr(), PyArray_DOUBLE, 0, 2);
    +(GCAgg&                         gc,
    + agg::trans_affine              master_transform,
    + const Py::Object&              cliprect,
    + const Py::Object&              clippath,
    + const agg::trans_affine&       clippath_trans,
    + const PathGenerator&           path_generator,
    + const Py::SeqBase& transforms_obj,
    + const Py::Object&              offsets_obj,
    + const agg::trans_affine&       offset_trans,
    + const Py::Object&              facecolors_obj,
    + const Py::Object&              edgecolors_obj,
    + const Py::SeqBase&  linewidths,
    + const Py::SeqBase& linestyles_obj,
    + const Py::SeqBase&    antialiaseds)
    +{
    +    typedef agg::conv_transform transformed_path_t;
    +    typedef PathNanRemover                         nan_removed_t;
    +    typedef PathClipper                                 clipped_t;
    +    typedef PathSnapper                                     snapped_t;
    +    typedef agg::conv_curve                                 snapped_curve_t;
    +    typedef agg::conv_curve                                 curve_t;
    +
    +    PyArrayObject* offsets = (PyArrayObject*)PyArray_FromObject
    +        (offsets_obj.ptr(), PyArray_DOUBLE, 0, 2);
         if (!offsets ||
             (PyArray_NDIM(offsets) == 2 && PyArray_DIM(offsets, 1) != 2) ||
    -        (PyArray_NDIM(offsets) == 1 && PyArray_DIM(offsets, 0) != 0)) {
    -      throw Py::ValueError("Offsets array must be Nx2");
    +        (PyArray_NDIM(offsets) == 1 && PyArray_DIM(offsets, 0) != 0))
    +    {
    +        Py_XDECREF(offsets);
    +        throw Py::ValueError("Offsets array must be Nx2");
         }
    +    Py::Object offsets_arr_obj((PyObject*)offsets, true);
     
         PyArrayObject* facecolors = (PyArrayObject*)PyArray_FromObject
    -      (facecolors_obj.ptr(), PyArray_DOUBLE, 1, 2);
    +        (facecolors_obj.ptr(), PyArray_DOUBLE, 1, 2);
         if (!facecolors ||
             (PyArray_NDIM(facecolors) == 1 && PyArray_DIM(facecolors, 0) != 0) ||
             (PyArray_NDIM(facecolors) == 2 && PyArray_DIM(facecolors, 1) != 4))
    -      throw Py::ValueError("Facecolors must be a Nx4 numpy array or empty");
    +    {
    +        Py_XDECREF(facecolors);
    +        throw Py::ValueError("Facecolors must be a Nx4 numpy array or empty");
    +    }
    +    Py::Object facecolors_arr_obj((PyObject*)facecolors, true);
     
         PyArrayObject* edgecolors = (PyArrayObject*)PyArray_FromObject
    -      (edgecolors_obj.ptr(), PyArray_DOUBLE, 1, 2);
    +        (edgecolors_obj.ptr(), PyArray_DOUBLE, 1, 2);
         if (!edgecolors ||
             (PyArray_NDIM(edgecolors) == 1 && PyArray_DIM(edgecolors, 0) != 0) ||
             (PyArray_NDIM(edgecolors) == 2 && PyArray_DIM(edgecolors, 1) != 4))
    -      throw Py::ValueError("Edgecolors must be a Nx4 numpy array");
    +    {
    +        Py_XDECREF(edgecolors);
    +        throw Py::ValueError("Edgecolors must be a Nx4 numpy array");
    +    }
    +    Py::Object edgecolors_arr_obj((PyObject*)edgecolors, true);
     
         size_t Npaths      = path_generator.num_paths();
         size_t Noffsets    = offsets->dimensions[0];
    @@ -1149,7 +1401,9 @@
         size_t Naa         = antialiaseds.length();
     
         if ((Nfacecolors == 0 && Nedgecolors == 0) || Npaths == 0)
    -      return Py::Object();
    +    {
    +        return Py::Object();
    +    }
     
         size_t i = 0;
     
    @@ -1157,12 +1411,13 @@
         typedef std::vector transforms_t;
         transforms_t transforms;
         transforms.reserve(Ntransforms);
    -    for (i = 0; i < Ntransforms; ++i) {
    -      agg::trans_affine trans = py_to_agg_transformation_matrix
    -        (transforms_obj[i].ptr(), false);
    -      trans *= master_transform;
    +    for (i = 0; i < Ntransforms; ++i)
    +    {
    +        agg::trans_affine trans = py_to_agg_transformation_matrix
    +            (transforms_obj[i].ptr(), false);
    +        trans *= master_transform;
     
    -      transforms.push_back(trans);
    +        transforms.push_back(trans);
         }
     
         // Convert all the dashes up front
    @@ -1171,8 +1426,10 @@
         dashes.resize(Nlinestyles);
         i = 0;
         for (dashes_t::iterator d = dashes.begin();
    -         d != dashes.end(); ++d, ++i) {
    -      convert_dashes(Py::Tuple(linestyles_obj[i]), dpi, d->second, d->first);
    +         d != dashes.end(); ++d, ++i)
    +    {
    +        convert_dashes(Py::Tuple(linestyles_obj[i]), dpi, d->second,
    +                       d->first);
         }
     
         // Handle any clipping globally
    @@ -1187,687 +1444,948 @@
         face.first = Nfacecolors != 0;
         agg::trans_affine trans;
     
    -    for (i = 0; i < N; ++i) {
    -      typename PathGenerator::path_iterator path = path_generator(i);
    +    for (i = 0; i < N; ++i)
    +    {
    +        typename PathGenerator::path_iterator path = path_generator(i);
    +
    +        if (Ntransforms)
    +        {
    +            trans = transforms[i % Ntransforms];
    +        }
    +        else
    +        {
    +            trans = master_transform;
    +        }
    +
    +        if (Noffsets)
    +        {
    +            double xo = *(double*)PyArray_GETPTR2(offsets, i % Noffsets, 0);
    +            double yo = *(double*)PyArray_GETPTR2(offsets, i % Noffsets, 1);
    +            offset_trans.transform(&xo, &yo);
    +            trans *= agg::trans_affine_translation(xo, yo);
    +        }
    +
    +        // These transformations must be done post-offsets
    +        trans *= agg::trans_affine_scaling(1.0, -1.0);
    +        trans *= agg::trans_affine_translation(0.0, (double)height);
    +
    +        if (Nfacecolors)
    +        {
    +            size_t fi = i % Nfacecolors;
    +            face.second = agg::rgba(
    +                *(double*)PyArray_GETPTR2(facecolors, fi, 0),
    +                *(double*)PyArray_GETPTR2(facecolors, fi, 1),
    +                *(double*)PyArray_GETPTR2(facecolors, fi, 2),
    +                *(double*)PyArray_GETPTR2(facecolors, fi, 3));
    +        }
    +
    +        if (Nedgecolors)
    +        {
    +            size_t ei = i % Nedgecolors;
    +            gc.color = agg::rgba(
    +                *(double*)PyArray_GETPTR2(edgecolors, ei, 0),
    +                *(double*)PyArray_GETPTR2(edgecolors, ei, 1),
    +                *(double*)PyArray_GETPTR2(edgecolors, ei, 2),
    +                *(double*)PyArray_GETPTR2(edgecolors, ei, 3));
    +
    +            if (Nlinewidths)
    +            {
    +                gc.linewidth = double(Py::Float(linewidths[i % Nlinewidths])) * dpi / 72.0;
    +            }
    +            else
    +            {
    +                gc.linewidth = 1.0;
    +            }
    +            if (Nlinestyles)
    +            {
    +                gc.dashes = dashes[i % Nlinestyles].second;
    +                gc.dashOffset = dashes[i % Nlinestyles].first;
    +            }
    +        }
    +
    +        bool do_clip = !face.first && gc.hatchpath.isNone() && !has_curves;
    +
    +        if (check_snap)
    +        {
    +            gc.isaa = bool(Py::Int(antialiaseds[i % Naa]));
    +
    +            transformed_path_t tpath(path, trans);
    +            nan_removed_t      nan_removed(tpath, true, has_curves);
    +            clipped_t          clipped(nan_removed, do_clip, width, height);
    +            snapped_t          snapped(clipped, gc.snap_mode,
    +                                       path.total_vertices(), gc.linewidth);
    +            if (has_curves)
    +            {
    +                snapped_curve_t curve(snapped);
    +                _draw_path(curve, has_clippath, face, gc);
    +            }
    +            else
    +            {
    +                _draw_path(snapped, has_clippath, face, gc);
    +            }
    +        }
    +        else
    +        {
    +            gc.isaa = bool(Py::Int(antialiaseds[i % Naa]));
    +
    +            transformed_path_t tpath(path, trans);
    +            nan_removed_t      nan_removed(tpath, true, has_curves);
    +            clipped_t          clipped(nan_removed, do_clip, width, height);
    +            if (has_curves)
    +            {
    +                curve_t curve(clipped);
    +                _draw_path(curve, has_clippath, face, gc);
    +            }
    +            else
    +            {
    +                _draw_path(clipped, has_clippath, face, gc);
    +            }
    +        }
    +    }
     
    -      if (Ntransforms) {
    -        trans = transforms[i % Ntransforms];
    -      } else {
    -        trans = master_transform;
    -      }
    -
    -      if (Noffsets) {
    -        double xo = *(double*)PyArray_GETPTR2(offsets, i % Noffsets, 0);
    -        double yo = *(double*)PyArray_GETPTR2(offsets, i % Noffsets, 1);
    -        offset_trans.transform(&xo, &yo);
    -        trans *= agg::trans_affine_translation(xo, yo);
    -      }
    -
    -      // These transformations must be done post-offsets
    -      trans *= agg::trans_affine_scaling(1.0, -1.0);
    -      trans *= agg::trans_affine_translation(0.0, (double)height);
    -
    -      if (Nfacecolors) {
    -        size_t fi = i % Nfacecolors;
    -        face.second = agg::rgba(*(double*)PyArray_GETPTR2(facecolors, fi, 0),
    -                                *(double*)PyArray_GETPTR2(facecolors, fi, 1),
    -                                *(double*)PyArray_GETPTR2(facecolors, fi, 2),
    -                                *(double*)PyArray_GETPTR2(facecolors, fi, 3));
    -      }
    -
    -      if (Nedgecolors) {
    -        size_t ei = i % Nedgecolors;
    -        gc.color = agg::rgba(*(double*)PyArray_GETPTR2(edgecolors, ei, 0),
    -                             *(double*)PyArray_GETPTR2(edgecolors, ei, 1),
    -                             *(double*)PyArray_GETPTR2(edgecolors, ei, 2),
    -                             *(double*)PyArray_GETPTR2(edgecolors, ei, 3));
    -
    -        if (Nlinewidths) {
    -          gc.linewidth = double(Py::Float(linewidths[i % Nlinewidths])) * dpi/72.0;
    -        } else {
    -          gc.linewidth = 1.0;
    -        }
    -        if (Nlinestyles) {
    -          gc.dashes = dashes[i % Nlinestyles].second;
    -          gc.dashOffset = dashes[i % Nlinestyles].first;
    -        }
    -      }
    -
    -      bool do_clip = !face.first && gc.hatchpath.isNone();
    -
    -      if (check_snap) {
    -        gc.isaa = bool(Py::Int(antialiaseds[i % Naa]));
    -
    -        transformed_path_t tpath(path, trans);
    -        nan_removed_t      nan_removed(tpath, true, has_curves);
    -        clipped_t          clipped(nan_removed, do_clip, width, height);
    -        quantized_t        quantized(clipped, gc.quantize_mode, path.total_vertices());
    -        if (has_curves) {
    -          quantized_curve_t curve(quantized);
    -          _draw_path(curve, has_clippath, face, gc);
    -        } else {
    -          _draw_path(quantized, has_clippath, face, gc);
    -        }
    -      } else {
    -        gc.isaa = bool(Py::Int(antialiaseds[i % Naa]));
    -
    -        transformed_path_t tpath(path, trans);
    -        nan_removed_t      nan_removed(tpath, true, has_curves);
    -        clipped_t          clipped(nan_removed, do_clip, width, height);
    -        if (has_curves) {
    -          curve_t curve(clipped);
    -          _draw_path(curve, has_clippath, face, gc);
    -        } else {
    -          _draw_path(clipped, has_clippath, face, gc);
    -        }
    -      }
    -    }
    -
    -    Py_XDECREF(offsets);
    -    Py_XDECREF(facecolors);
    -    Py_XDECREF(edgecolors);
         return Py::Object();
    -  } catch (...) {
    -    Py_XDECREF(offsets);
    -    Py_XDECREF(facecolors);
    -    Py_XDECREF(edgecolors);
    -    throw;
    -  }
     }
     
     
    -class PathListGenerator {
    -  const Py::SeqBase& m_paths;
    -  size_t m_npaths;
    +class PathListGenerator
    +{
    +    const Py::SeqBase& m_paths;
    +    size_t m_npaths;
     
     public:
    -  typedef PathIterator path_iterator;
    +    typedef PathIterator path_iterator;
     
    -  inline PathListGenerator(const Py::SeqBase& paths) :
    -    m_paths(paths), m_npaths(paths.size()) {
    +    inline
    +    PathListGenerator(const Py::SeqBase& paths) :
    +        m_paths(paths), m_npaths(paths.size())
    +    {
     
    -  }
    +    }
     
    -  inline size_t num_paths() const {
    -    return m_npaths;
    -  }
    +    inline size_t
    +    num_paths() const
    +    {
    +        return m_npaths;
    +    }
     
    -  inline path_iterator operator()(size_t i) const {
    -    return PathIterator(m_paths[i % m_npaths]);
    -  }
    +    inline path_iterator
    +    operator()(size_t i) const
    +    {
    +        return PathIterator(m_paths[i % m_npaths]);
    +    }
     };
     
    +
     Py::Object
    -RendererAgg::draw_path_collection(const Py::Tuple& args) {
    -  _VERBOSE("RendererAgg::draw_path_collection");
    -  args.verify_length(14);
    -
    -  //segments, trans, clipbox, colors, linewidths, antialiaseds
    -  agg::trans_affine       master_transform = py_to_agg_transformation_matrix(args[0].ptr());
    -  Py::Object              cliprect         = args[1];
    -  Py::Object              clippath         = args[2];
    -  agg::trans_affine       clippath_trans   = py_to_agg_transformation_matrix(args[3].ptr(), false);
    -  Py::SeqBase paths            = args[4];
    -  Py::SeqBase transforms_obj   = args[5];
    -  Py::Object              offsets_obj      = args[6];
    -  agg::trans_affine       offset_trans     = py_to_agg_transformation_matrix(args[7].ptr());
    -  Py::Object              facecolors_obj   = args[8];
    -  Py::Object              edgecolors_obj   = args[9];
    -  Py::SeqBase  linewidths       = args[10];
    -  Py::SeqBase linestyles_obj   = args[11];
    -  Py::SeqBase    antialiaseds     = args[12];
    -  // We don't actually care about urls for Agg, so just ignore it.
    -  // Py::SeqBase urls             = args[13];
    -  PathListGenerator path_generator(paths);
    -
    -  try {
    -    _draw_path_collection_generic
    -      (master_transform,
    -       cliprect,
    -       clippath,
    -       clippath_trans,
    -       path_generator,
    -       transforms_obj,
    -       offsets_obj,
    -       offset_trans,
    -       facecolors_obj,
    -       edgecolors_obj,
    -       linewidths,
    -       linestyles_obj,
    -       antialiaseds);
    -  } catch (const char *e) {
    -    throw Py::RuntimeError(e);
    -  }
    -
    -  return Py::Object();
    -}
    -
    -class QuadMeshGenerator {
    -  size_t m_meshWidth;
    -  size_t m_meshHeight;
    -  PyArrayObject* m_coordinates;
    -
    -  class QuadMeshPathIterator {
    -    size_t m_iterator;
    -    size_t m_m, m_n;
    +RendererAgg::draw_path_collection(const Py::Tuple& args)
    +{
    +    _VERBOSE("RendererAgg::draw_path_collection");
    +    args.verify_length(12);
    +
    +    Py::Object gc_obj = args[0];
    +    GCAgg gc(gc_obj, dpi);
    +    agg::trans_affine       master_transform = py_to_agg_transformation_matrix(args[1].ptr());
    +    Py::SeqBase path   = args[2];
    +    PathListGenerator       path_generator(path);
    +    Py::SeqBase transforms_obj   = args[3];
    +    Py::Object              offsets_obj      = args[4];
    +    agg::trans_affine       offset_trans     = py_to_agg_transformation_matrix(args[5].ptr());
    +    Py::Object              facecolors_obj   = args[6];
    +    Py::Object              edgecolors_obj   = args[7];
    +    Py::SeqBase  linewidths       = args[8];
    +    Py::SeqBase linestyles_obj   = args[9];
    +    Py::SeqBase    antialiaseds     = args[10];
    +    // We don't actually care about urls for Agg, so just ignore it.
    +    // Py::SeqBase urls             = args[11];
    +
    +    try
    +    {
    +        _draw_path_collection_generic
    +        (gc,
    +         master_transform,
    +         gc.cliprect,
    +         gc.clippath,
    +         gc.clippath_trans,
    +         path_generator,
    +         transforms_obj,
    +         offsets_obj,
    +         offset_trans,
    +         facecolors_obj,
    +         edgecolors_obj,
    +         linewidths,
    +         linestyles_obj,
    +         antialiaseds);
    +    }
    +    catch (const char *e)
    +    {
    +        throw Py::RuntimeError(e);
    +    }
    +
    +    return Py::Object();
    +}
    +
    +
    +class QuadMeshGenerator
    +{
    +    size_t m_meshWidth;
    +    size_t m_meshHeight;
         PyArrayObject* m_coordinates;
    -  public:
    -    QuadMeshPathIterator(size_t m, size_t n, PyArrayObject* coordinates) :
    -      m_iterator(0), m_m(m), m_n(n), m_coordinates(coordinates) {
    +
    +    class QuadMeshPathIterator
    +    {
    +        size_t m_iterator;
    +        size_t m_m, m_n;
    +        PyArrayObject* m_coordinates;
    +
    +    public:
    +        QuadMeshPathIterator(size_t m, size_t n, PyArrayObject* coordinates) :
    +            m_iterator(0), m_m(m), m_n(n), m_coordinates(coordinates)
    +        {
    +
    +        }
    +
    +    private:
    +        inline unsigned
    +        vertex(unsigned idx, double* x, double* y)
    +        {
    +            size_t m = m_m + ((idx     & 0x2) >> 1);
    +            size_t n = m_n + (((idx + 1) & 0x2) >> 1);
    +            double* pair = (double*)PyArray_GETPTR2(m_coordinates, n, m);
    +            *x = *pair++;
    +            *y = *pair;
    +            return (idx) ? agg::path_cmd_line_to : agg::path_cmd_move_to;
    +        }
    +
    +    public:
    +        inline unsigned
    +        vertex(double* x, double* y)
    +        {
    +            if (m_iterator >= total_vertices())
    +            {
    +                return agg::path_cmd_stop;
    +            }
    +            return vertex(m_iterator++, x, y);
    +        }
    +
    +        inline void
    +        rewind(unsigned path_id)
    +        {
    +            m_iterator = path_id;
    +        }
    +
    +        inline unsigned
    +        total_vertices()
    +        {
    +            return 5;
    +        }
    +
    +        inline bool
    +        should_simplify()
    +        {
    +            return false;
    +        }
    +    };
    +
    +public:
    +    typedef QuadMeshPathIterator path_iterator;
    +
    +    inline
    +    QuadMeshGenerator(size_t meshWidth, size_t meshHeight, PyObject* coordinates) :
    +        m_meshWidth(meshWidth), m_meshHeight(meshHeight), m_coordinates(NULL)
    +    {
    +        PyArrayObject* coordinates_array = \
    +            (PyArrayObject*)PyArray_ContiguousFromObject(
    +                coordinates, PyArray_DOUBLE, 3, 3);
    +
    +        if (!coordinates_array)
    +        {
    +            throw Py::ValueError("Invalid coordinates array.");
    +        }
    +
    +        m_coordinates = coordinates_array;
         }
     
    -  private:
    -    inline unsigned vertex(unsigned idx, double* x, double* y) {
    -      size_t m = m_m + ((idx     & 0x2) >> 1);
    -      size_t n = m_n + (((idx+1) & 0x2) >> 1);
    -      double* pair = (double*)PyArray_GETPTR2(m_coordinates, n, m);
    -      *x = *pair++;
    -      *y = *pair;
    -      return (idx) ? agg::path_cmd_line_to : agg::path_cmd_move_to;
    +    inline
    +    ~QuadMeshGenerator()
    +    {
    +        Py_XDECREF(m_coordinates);
         }
     
    -  public:
    -    inline unsigned vertex(double* x, double* y) {
    -      if (m_iterator >= total_vertices())
    -        return agg::path_cmd_stop;
    -      return vertex(m_iterator++, x, y);
    +    inline size_t
    +    num_paths() const
    +    {
    +        return m_meshWidth * m_meshHeight;
         }
     
    -    inline void rewind(unsigned path_id) {
    -      m_iterator = path_id;
    +    inline path_iterator
    +    operator()(size_t i) const
    +    {
    +        return QuadMeshPathIterator(i % m_meshWidth, i / m_meshWidth, m_coordinates);
         }
    +};
    +
    +Py::Object
    +RendererAgg::draw_quad_mesh(const Py::Tuple& args)
    +{
    +    _VERBOSE("RendererAgg::draw_quad_mesh");
    +    args.verify_length(10);
     
    -    inline unsigned total_vertices() {
    -      return 5;
    +    //segments, trans, clipbox, colors, linewidths, antialiaseds
    +    GCAgg gc(args[0], dpi);
    +    agg::trans_affine       master_transform = py_to_agg_transformation_matrix(args[1].ptr());
    +    size_t                  mesh_width       = Py::Int(args[2]);
    +    size_t                  mesh_height      = Py::Int(args[3]);
    +    Py::Object              coordinates      = args[4];
    +    Py::Object              offsets_obj      = args[5];
    +    agg::trans_affine       offset_trans     = py_to_agg_transformation_matrix(args[6].ptr());
    +    Py::Object              facecolors_obj   = args[7];
    +    bool                    antialiased      = (bool)Py::Int(args[8]);
    +    bool                    showedges        = (bool)Py::Int(args[9]);
    +    bool                    free_edgecolors  = false;
    +
    +    QuadMeshGenerator path_generator(mesh_width, mesh_height, coordinates.ptr());
    +
    +    Py::SeqBase transforms_obj;
    +    Py::Object edgecolors_obj;
    +    Py::Tuple linewidths(1);
    +    linewidths[0] = Py::Float(gc.linewidth);
    +    Py::SeqBase linestyles_obj;
    +    Py::Tuple antialiaseds(1);
    +    antialiaseds[0] = Py::Int(antialiased ? 1 : 0);
    +
    +    if (showedges)
    +    {
    +        npy_intp dims[] = { 1, 4, 0 };
    +        double data[] = { 0, 0, 0, 1 };
    +        edgecolors_obj = Py::Object(PyArray_SimpleNewFromData(2, dims, PyArray_DOUBLE,
    +                                                              (char*)data), true);
    +    }
    +    else
    +    {
    +        if (antialiased)
    +        {
    +            edgecolors_obj = facecolors_obj;
    +        }
    +        else
    +        {
    +            npy_intp dims[] = { 0, 0 };
    +            edgecolors_obj = PyArray_SimpleNew(1, dims, PyArray_DOUBLE);
    +            free_edgecolors = true;
    +        }
         }
     
    -    inline bool should_simplify() {
    -      return false;
    +    try
    +    {
    +        _draw_path_collection_generic
    +            (gc,
    +             master_transform,
    +             gc.cliprect,
    +             gc.clippath,
    +             gc.clippath_trans,
    +             path_generator,
    +             transforms_obj,
    +             offsets_obj,
    +             offset_trans,
    +             facecolors_obj,
    +             edgecolors_obj,
    +             linewidths,
    +             linestyles_obj,
    +             antialiaseds);
    +    }
    +    catch (const char* e)
    +    {
    +        throw Py::RuntimeError(e);
         }
    -  };
     
    -public:
    -  typedef QuadMeshPathIterator path_iterator;
    +    return Py::Object();
    +}
     
    -  inline QuadMeshGenerator(size_t meshWidth, size_t meshHeight, PyObject* coordinates) :
    -    m_meshWidth(meshWidth), m_meshHeight(meshHeight), m_coordinates(NULL) {
    -    PyArrayObject* coordinates_array = (PyArrayObject*)PyArray_ContiguousFromObject(coordinates, PyArray_DOUBLE, 3, 3);
    -    if (!coordinates_array) {
    -      throw Py::ValueError("Invalid coordinates array.");
    -    }
    +void
    +RendererAgg::_draw_gouraud_triangle(const double* points,
    +                                    const double* colors,
    +                                    agg::trans_affine trans,
    +                                    bool has_clippath)
    +{
    +    typedef agg::rgba8                                         color_t;
    +    typedef agg::span_gouraud_rgba                    span_gen_t;
    +    typedef agg::span_allocator                       span_alloc_t;
     
    -    m_coordinates = coordinates_array;
    -  }
    +    trans *= agg::trans_affine_scaling(1.0, -1.0);
    +    trans *= agg::trans_affine_translation(0.0, (double)height);
     
    -  inline ~QuadMeshGenerator() {
    -    Py_XDECREF(m_coordinates);
    -  }
    +    double tpoints[6];
     
    -  inline size_t num_paths() const {
    -    return m_meshWidth * m_meshHeight;
    -  }
    +    for (int i = 0; i < 6; i += 2)
    +    {
    +        tpoints[i] = points[i];
    +        tpoints[i+1] = points[i+1];
    +        trans.transform(&tpoints[i], &tpoints[i+1]);
    +    }
    +
    +    span_alloc_t span_alloc;
    +    span_gen_t span_gen;
    +
    +    span_gen.colors(
    +        agg::rgba(colors[0], colors[1], colors[2], colors[3]),
    +        agg::rgba(colors[4], colors[5], colors[6], colors[7]),
    +        agg::rgba(colors[8], colors[9], colors[10], colors[11]));
    +    span_gen.triangle(
    +        tpoints[0], tpoints[1],
    +        tpoints[2], tpoints[3],
    +        tpoints[4], tpoints[5],
    +        0.5);
    +
    +    theRasterizer.add_path(span_gen);
    +
    +    if (has_clippath)
    +    {
    +        typedef agg::pixfmt_amask_adaptor pixfmt_amask_type;
    +        typedef agg::renderer_base              amask_ren_type;
    +        typedef agg::renderer_scanline_aa
    +        amask_aa_renderer_type;
    +
    +        pixfmt_amask_type pfa(pixFmt, alphaMask);
    +        amask_ren_type r(pfa);
    +        amask_aa_renderer_type ren(r, span_alloc, span_gen);
    +        agg::render_scanlines(theRasterizer, slineP8, ren);
    +    }
    +    else
    +    {
    +        agg::render_scanlines_aa(theRasterizer, slineP8, rendererBase, span_alloc, span_gen);
    +    }
    +}
     
    -  inline path_iterator operator()(size_t i) const {
    -    return QuadMeshPathIterator(i % m_meshWidth, i / m_meshWidth, m_coordinates);
    -  }
    -};
     
     Py::Object
    -RendererAgg::draw_quad_mesh(const Py::Tuple& args) {
    -  _VERBOSE("RendererAgg::draw_quad_mesh");
    -  args.verify_length(12);
    -
    -
    -  //segments, trans, clipbox, colors, linewidths, antialiaseds
    -  agg::trans_affine       master_transform = py_to_agg_transformation_matrix(args[0].ptr());
    -  Py::Object              cliprect         = args[1];
    -  Py::Object              clippath         = args[2];
    -  agg::trans_affine       clippath_trans   = py_to_agg_transformation_matrix(args[3].ptr(), false);
    -  size_t                  mesh_width       = Py::Int(args[4]);
    -  size_t                  mesh_height      = Py::Int(args[5]);
    -  PyObject*               coordinates      = args[6].ptr();
    -  Py::Object              offsets_obj      = args[7];
    -  agg::trans_affine       offset_trans     = py_to_agg_transformation_matrix(args[8].ptr());
    -  Py::Object              facecolors_obj   = args[9];
    -  bool                    antialiased      = (bool)Py::Int(args[10]);
    -  bool                    showedges        = (bool)Py::Int(args[11]);
    -  bool                    free_edgecolors  = false;
    -
    -  QuadMeshGenerator path_generator(mesh_width, mesh_height, coordinates);
    -
    -  Py::SeqBase transforms_obj;
    -  Py::Object edgecolors_obj;
    -  Py::Tuple linewidths(1);
    -  linewidths[0] = Py::Float(1.0);
    -  Py::SeqBase linestyles_obj;
    -  Py::Tuple antialiaseds(1);
    -  antialiaseds[0] = Py::Int(antialiased ? 1 : 0);
    -
    -  if (showedges) {
    -    npy_intp dims[] = { 1, 4, 0 };
    -    double data[] = { 0, 0, 0, 1 };
    -    edgecolors_obj = PyArray_SimpleNewFromData(2, dims, PyArray_DOUBLE, (char*)data);
    -    free_edgecolors = true;
    -  } else {
    -    if (antialiased) {
    -      edgecolors_obj = facecolors_obj;
    -    } else {
    -      npy_intp dims[] = { 0, 0 };
    -      edgecolors_obj = PyArray_SimpleNew(1, dims, PyArray_DOUBLE);
    -      free_edgecolors = true;
    -    }
    -  }
    -
    -  try {
    -    try {
    -      _draw_path_collection_generic
    -        (master_transform,
    -         cliprect,
    -         clippath,
    -         clippath_trans,
    -         path_generator,
    -         transforms_obj,
    -         offsets_obj,
    -         offset_trans,
    -         facecolors_obj,
    -         edgecolors_obj,
    -         linewidths,
    -         linestyles_obj,
    -         antialiaseds);
    -    } catch (const char* e) {
    -      throw Py::RuntimeError(e);
    +RendererAgg::draw_gouraud_triangle(const Py::Tuple& args)
    +{
    +    _VERBOSE("RendererAgg::draw_gouraud_triangle");
    +    args.verify_length(4);
    +
    +    GCAgg             gc(args[0], dpi);
    +    Py::Object        points_obj = args[1];
    +    Py::Object        colors_obj = args[2];
    +    agg::trans_affine trans      = py_to_agg_transformation_matrix(args[3].ptr());
    +
    +    theRasterizer.reset_clipping();
    +    rendererBase.reset_clipping(true);
    +    set_clipbox(gc.cliprect, theRasterizer);
    +    bool has_clippath = render_clippath(gc.clippath, gc.clippath_trans);
    +
    +    PyArrayObject* points = (PyArrayObject*)PyArray_ContiguousFromAny
    +        (points_obj.ptr(), PyArray_DOUBLE, 2, 2);
    +    if (!points ||
    +        PyArray_DIM(points, 0) != 3 || PyArray_DIM(points, 1) != 2)
    +    {
    +        Py_XDECREF(points);
    +        throw Py::ValueError("points must be a 3x2 numpy array");
         }
    -  } catch (...) {
    -    if (free_edgecolors) {
    -      Py_XDECREF(edgecolors_obj.ptr());
    +    points_obj = Py::Object((PyObject*)points, true);
    +
    +    PyArrayObject* colors = (PyArrayObject*)PyArray_ContiguousFromAny
    +        (colors_obj.ptr(), PyArray_DOUBLE, 2, 2);
    +    if (!colors ||
    +        PyArray_DIM(colors, 0) != 3 || PyArray_DIM(colors, 1) != 4)
    +    {
    +        Py_XDECREF(colors);
    +        throw Py::ValueError("colors must be a 3x4 numpy array");
         }
    -    throw;
    -  }
    +    colors_obj = Py::Object((PyObject*)colors, true);
     
    -  if (free_edgecolors) {
    -    Py_XDECREF(edgecolors_obj.ptr());
    -  }
    +    _draw_gouraud_triangle(
    +        (double*)PyArray_DATA(points), (double*)PyArray_DATA(colors),
    +        trans, has_clippath);
     
    -  return Py::Object();
    +    return Py::Object();
     }
     
    +
     Py::Object
    -RendererAgg::write_rgba(const Py::Tuple& args) {
    -  _VERBOSE("RendererAgg::write_rgba");
    +RendererAgg::draw_gouraud_triangles(const Py::Tuple& args)
    +{
    +    _VERBOSE("RendererAgg::draw_gouraud_triangles");
    +    args.verify_length(4);
     
    -  args.verify_length(1);
    +    typedef agg::rgba8                      color_t;
    +    typedef agg::span_gouraud_rgba span_gen_t;
    +    typedef agg::span_allocator    span_alloc_t;
    +
    +    GCAgg             gc(args[0], dpi);
    +    Py::Object        points_obj = args[1];
    +    Py::Object        colors_obj = args[2];
    +    agg::trans_affine trans      = py_to_agg_transformation_matrix(args[3].ptr());
     
    -  FILE *fp = NULL;
    -  bool close_file = false;
    -  Py::Object py_fileobj = Py::Object(args[0]);
    -  if (py_fileobj.isString()) {
    -    std::string fileName = Py::String(py_fileobj);
    -    const char *file_name = fileName.c_str();
    -    if ((fp = fopen(file_name, "wb")) == NULL)
    -      throw Py::RuntimeError( Printf("Could not open file %s", file_name).str() );
    -    if (fwrite(pixBuffer, 1, NUMBYTES, fp) != NUMBYTES) {
    -      fclose(fp);
    -      throw Py::RuntimeError( Printf("Error writing to file %s", file_name).str() );
    -    }
    -    close_file = true;
    -  } else if (PyFile_CheckExact(py_fileobj.ptr())) {
    -    fp = PyFile_AsFile(py_fileobj.ptr());
    -    if (fwrite(pixBuffer, 1, NUMBYTES, fp) != NUMBYTES) {
    -      throw Py::RuntimeError( "Error writing to file" );
    +    theRasterizer.reset_clipping();
    +    rendererBase.reset_clipping(true);
    +    set_clipbox(gc.cliprect, theRasterizer);
    +    bool has_clippath = render_clippath(gc.clippath, gc.clippath_trans);
    +
    +    PyArrayObject* points = (PyArrayObject*)PyArray_ContiguousFromAny
    +        (points_obj.ptr(), PyArray_DOUBLE, 3, 3);
    +    if (!points ||
    +        PyArray_DIM(points, 1) != 3 || PyArray_DIM(points, 2) != 2)
    +    {
    +        Py_XDECREF(points);
    +        throw Py::ValueError("points must be a Nx3x2 numpy array");
         }
    -  } else {
    -    PyObject* write_method = PyObject_GetAttrString(py_fileobj.ptr(), "write");
    -    if (!(write_method && PyCallable_Check(write_method))) {
    -      Py_XDECREF(write_method);
    -      throw Py::TypeError("Object does not appear to be a 8-bit string path or a Python file-like object");
    +    points_obj = Py::Object((PyObject*)points, true);
    +
    +    PyArrayObject* colors = (PyArrayObject*)PyArray_ContiguousFromAny
    +        (colors_obj.ptr(), PyArray_DOUBLE, 3, 3);
    +    if (!colors ||
    +        PyArray_DIM(colors, 1) != 3 || PyArray_DIM(colors, 2) != 4)
    +    {
    +        Py_XDECREF(colors);
    +        throw Py::ValueError("colors must be a Nx3x4 numpy array");
         }
    +    colors_obj = Py::Object((PyObject*)colors, true);
     
    -    PyObject_CallFunction(write_method, (char *)"s#", pixBuffer, NUMBYTES);
    +    if (PyArray_DIM(points, 0) != PyArray_DIM(colors, 0))
    +    {
    +        throw Py::ValueError("points and colors arrays must be the same length");
    +    }
     
    -    Py_XDECREF(write_method);
    -  }
    +    for (int i = 0; i < PyArray_DIM(points, 0); ++i)
    +    {
    +        _draw_gouraud_triangle(
    +            (double*)PyArray_GETPTR1(points, i),
    +            (double*)PyArray_GETPTR1(colors, i), trans, has_clippath);
    +    }
     
    -  return Py::Object();
    +    return Py::Object();
     }
     
    -Py::Object
    -RendererAgg::tostring_rgb(const Py::Tuple& args) {
    -  //"Return the rendered buffer as an RGB string";
     
    -  _VERBOSE("RendererAgg::tostring_rgb");
    -
    -  args.verify_length(0);
    -  int row_len = width*3;
    -  unsigned char* buf_tmp = new unsigned char[row_len * height];
    -  if (buf_tmp == NULL) {
    -    //todo: also handle allocation throw
    -    throw Py::MemoryError("RendererAgg::tostring_rgb could not allocate memory");
    -  }
    +Py::Object
    +RendererAgg::write_rgba(const Py::Tuple& args)
    +{
    +    _VERBOSE("RendererAgg::write_rgba");
     
    -  try {
    -    agg::rendering_buffer renderingBufferTmp;
    -    renderingBufferTmp.attach(buf_tmp,
    -                              width,
    -                              height,
    -                              row_len);
    +    args.verify_length(1);
     
    -    agg::color_conv(&renderingBufferTmp, &renderingBuffer, agg::color_conv_rgba32_to_rgb24());
    +    FILE *fp = NULL;
    +    bool close_file = false;
    +    Py::Object py_fileobj = Py::Object(args[0]);
    +    if (py_fileobj.isString())
    +    {
    +        std::string fileName = Py::String(py_fileobj);
    +        const char *file_name = fileName.c_str();
    +        if ((fp = fopen(file_name, "wb")) == NULL)
    +            throw Py::RuntimeError(
    +                Printf("Could not open file %s", file_name).str());
    +        if (fwrite(pixBuffer, 1, NUMBYTES, fp) != NUMBYTES)
    +        {
    +            fclose(fp);
    +            throw Py::RuntimeError(
    +                Printf("Error writing to file %s", file_name).str());
    +        }
    +        close_file = true;
    +    }
    +    else if (PyFile_CheckExact(py_fileobj.ptr()))
    +    {
    +        fp = PyFile_AsFile(py_fileobj.ptr());
    +        if (fwrite(pixBuffer, 1, NUMBYTES, fp) != NUMBYTES)
    +        {
    +            throw Py::RuntimeError("Error writing to file");
    +        }
    +    }
    +    else
    +    {
    +        PyObject* write_method = PyObject_GetAttrString(py_fileobj.ptr(),
    +                                                        "write");
    +        if (!(write_method && PyCallable_Check(write_method)))
    +        {
    +            Py_XDECREF(write_method);
    +            throw Py::TypeError(
    +                "Object does not appear to be a 8-bit string path or a Python file-like object");
    +        }
     
    -  } catch (...) {
    -    delete [] buf_tmp;
    -    throw Py::RuntimeError("Unknown exception occurred in tostring_rgb");
    -  }
    +        PyObject_CallFunction(write_method, (char *)"s#", pixBuffer, NUMBYTES);
     
    -  //todo: how to do this with native CXX
    -  PyObject* o = Py_BuildValue("s#", buf_tmp, row_len * height);
    +        Py_XDECREF(write_method);
    +    }
     
    -  delete [] buf_tmp;
    -  return Py::asObject(o);
    +    return Py::Object();
     }
     
     
     Py::Object
    -RendererAgg::tostring_argb(const Py::Tuple& args) {
    -  //"Return the rendered buffer as an RGB string";
    +RendererAgg::tostring_rgb(const Py::Tuple& args)
    +{
    +    //"Return the rendered buffer as an RGB string";
     
    -  _VERBOSE("RendererAgg::tostring_argb");
    +    _VERBOSE("RendererAgg::tostring_rgb");
     
    -  args.verify_length(0);
    -  int row_len = width*4;
    -  unsigned char* buf_tmp = new unsigned char[row_len * height];
    -  if (buf_tmp ==NULL) {
    -    //todo: also handle allocation throw
    -    throw Py::MemoryError("RendererAgg::tostring_argb could not allocate memory");
    -  }
    +    args.verify_length(0);
    +    int row_len = width * 3;
    +    unsigned char* buf_tmp = new unsigned char[row_len * height];
    +    if (buf_tmp == NULL)
    +    {
    +        //todo: also handle allocation throw
    +        throw Py::MemoryError(
    +            "RendererAgg::tostring_rgb could not allocate memory");
    +    }
     
    -  try {
    -    agg::rendering_buffer renderingBufferTmp;
    -    renderingBufferTmp.attach(buf_tmp, width, height, row_len);
    -    agg::color_conv(&renderingBufferTmp, &renderingBuffer, agg::color_conv_rgba32_to_argb32());
    -  } catch (...) {
    -    delete [] buf_tmp;
    -    throw Py::RuntimeError("Unknown exception occurred in tostring_argb");
    -  }
    +    try
    +    {
    +        agg::rendering_buffer renderingBufferTmp;
    +        renderingBufferTmp.attach(buf_tmp,
    +                                  width,
    +                                  height,
    +                                  row_len);
    +
    +        agg::color_conv(&renderingBufferTmp, &renderingBuffer,
    +                        agg::color_conv_rgba32_to_rgb24());
    +    }
    +    catch (...)
    +    {
    +        delete [] buf_tmp;
    +        throw Py::RuntimeError("Unknown exception occurred in tostring_rgb");
    +    }
     
    -  //todo: how to do this with native CXX
    -  PyObject* o = Py_BuildValue("s#", buf_tmp, row_len * height);
    -  delete [] buf_tmp;
    -  return Py::asObject(o);
    +    //todo: how to do this with native CXX
    +    PyObject* o = Py_BuildValue("s#", buf_tmp, row_len * height);
    +
    +    delete [] buf_tmp;
    +    return Py::asObject(o);
     }
     
    +
     Py::Object
    -RendererAgg::tostring_bgra(const Py::Tuple& args) {
    -  //"Return the rendered buffer as an RGB string";
    -
    -  _VERBOSE("RendererAgg::tostring_bgra");
    -
    -  args.verify_length(0);
    -  int row_len = width*4;
    -  unsigned char* buf_tmp = new unsigned char[row_len * height];
    -  if (buf_tmp ==NULL) {
    -    //todo: also handle allocation throw
    -    throw Py::MemoryError("RendererAgg::tostring_bgra could not allocate memory");
    -  }
    -
    -  try {
    -    agg::rendering_buffer renderingBufferTmp;
    -    renderingBufferTmp.attach(buf_tmp,
    -                              width,
    -                              height,
    -                              row_len);
    +RendererAgg::tostring_argb(const Py::Tuple& args)
    +{
    +    //"Return the rendered buffer as an RGB string";
     
    -    agg::color_conv(&renderingBufferTmp, &renderingBuffer, agg::color_conv_rgba32_to_bgra32());
    -  } catch (...) {
    -    delete [] buf_tmp;
    -    throw Py::RuntimeError("Unknown exception occurred in tostring_bgra");
    -  }
    +    _VERBOSE("RendererAgg::tostring_argb");
    +
    +    args.verify_length(0);
    +    int row_len = width * 4;
    +    unsigned char* buf_tmp = new unsigned char[row_len * height];
    +    if (buf_tmp == NULL)
    +    {
    +        //todo: also handle allocation throw
    +        throw Py::MemoryError("RendererAgg::tostring_argb could not allocate memory");
    +    }
     
    -  //todo: how to do this with native CXX
    -  PyObject* o = Py_BuildValue("s#",
    -                              buf_tmp,
    -                              row_len * height);
    -  delete [] buf_tmp;
    -  return Py::asObject(o);
    +    try
    +    {
    +        agg::rendering_buffer renderingBufferTmp;
    +        renderingBufferTmp.attach(buf_tmp, width, height, row_len);
    +        agg::color_conv(&renderingBufferTmp, &renderingBuffer, agg::color_conv_rgba32_to_argb32());
    +    }
    +    catch (...)
    +    {
    +        delete [] buf_tmp;
    +        throw Py::RuntimeError("Unknown exception occurred in tostring_argb");
    +    }
    +
    +    //todo: how to do this with native CXX
    +    PyObject* o = Py_BuildValue("s#", buf_tmp, row_len * height);
    +    delete [] buf_tmp;
    +    return Py::asObject(o);
     }
     
    +
     Py::Object
    -RendererAgg::buffer_rgba(const Py::Tuple& args) {
    -  //"expose the rendered buffer as Python buffer object, starting from postion x,y";
    +RendererAgg::tostring_bgra(const Py::Tuple& args)
    +{
    +    //"Return the rendered buffer as an RGB string";
     
    -  _VERBOSE("RendererAgg::buffer_rgba");
    +    _VERBOSE("RendererAgg::tostring_bgra");
     
    -  args.verify_length(2);
    -  int startw = Py::Int(args[0]);
    -  int starth = Py::Int(args[1]);
    -  int row_len = width*4;
    -  int start=row_len*starth+startw*4;
    -  return Py::asObject(PyBuffer_FromMemory( pixBuffer+start, row_len*height-start));
    +    args.verify_length(0);
    +    int row_len = width * 4;
    +    unsigned char* buf_tmp = new unsigned char[row_len * height];
    +    if (buf_tmp == NULL)
    +    {
    +        //todo: also handle allocation throw
    +        throw Py::MemoryError("RendererAgg::tostring_bgra could not allocate memory");
    +    }
    +
    +    try
    +    {
    +        agg::rendering_buffer renderingBufferTmp;
    +        renderingBufferTmp.attach(buf_tmp,
    +                                  width,
    +                                  height,
    +                                  row_len);
    +
    +        agg::color_conv(&renderingBufferTmp, &renderingBuffer, agg::color_conv_rgba32_to_bgra32());
    +    }
    +    catch (...)
    +    {
    +        delete [] buf_tmp;
    +        throw Py::RuntimeError("Unknown exception occurred in tostring_bgra");
    +    }
    +
    +    //todo: how to do this with native CXX
    +    PyObject* o = Py_BuildValue("s#",
    +                                buf_tmp,
    +                                row_len * height);
    +    delete [] buf_tmp;
    +    return Py::asObject(o);
     }
     
    +
     Py::Object
    -RendererAgg::tostring_rgba_minimized(const Py::Tuple& args) {
    -  args.verify_length(0);
    +RendererAgg::buffer_rgba(const Py::Tuple& args)
    +{
    +    //"expose the rendered buffer as Python buffer object, starting from postion x,y";
     
    -  int xmin = width;
    -  int ymin = height;
    -  int xmax = 0;
    -  int ymax = 0;
    +    _VERBOSE("RendererAgg::buffer_rgba");
     
    -  // Looks at the alpha channel to find the minimum extents of the image
    -  unsigned char* pixel = pixBuffer + 3;
    -  for (int y = 0; y < (int)height; ++y) {
    -    for (int x = 0; x < (int)width; ++x) {
    -      if (*pixel) {
    -        if (x < xmin) xmin = x;
    -        if (y < ymin) ymin = y;
    -        if (x > xmax) xmax = x;
    -        if (y > ymax) ymax = y;
    -      }
    -      pixel += 4;
    -    }
    -  }
    +    args.verify_length(2);
    +    int startw = Py::Int(args[0]);
    +    int starth = Py::Int(args[1]);
    +    int row_len = width * 4;
    +    int start = row_len * starth + startw * 4;
    +    return Py::asObject(PyBuffer_FromMemory(pixBuffer + start, row_len*height - start));
    +}
     
    -  int newwidth = 0;
    -  int newheight = 0;
    -  Py::String data;
    -  if (xmin < xmax && ymin < ymax) {
    -    // Expand the bounds by 1 pixel on all sides
    -    xmin = std::max(0, xmin - 1);
    -    ymin = std::max(0, ymin - 1);
    -    xmax = std::min(xmax, (int)width);
    -    ymax = std::min(ymax, (int)height);
     
    -    newwidth    = xmax - xmin;
    -    newheight   = ymax - ymin;
    -    int newsize = newwidth * newheight * 4;
    +Py::Object
    +RendererAgg::tostring_rgba_minimized(const Py::Tuple& args)
    +{
    +    args.verify_length(0);
     
    -    unsigned char* buf = new unsigned char[newsize];
    -    if (buf == NULL) {
    -      throw Py::MemoryError("RendererAgg::tostring_minimized could not allocate memory");
    +    int xmin = width;
    +    int ymin = height;
    +    int xmax = 0;
    +    int ymax = 0;
    +
    +    // Looks at the alpha channel to find the minimum extents of the image
    +    unsigned char* pixel = pixBuffer + 3;
    +    for (int y = 0; y < (int)height; ++y)
    +    {
    +        for (int x = 0; x < (int)width; ++x)
    +        {
    +            if (*pixel)
    +            {
    +                if (x < xmin) xmin = x;
    +                if (y < ymin) ymin = y;
    +                if (x > xmax) xmax = x;
    +                if (y > ymax) ymax = y;
    +            }
    +            pixel += 4;
    +        }
         }
     
    -    unsigned int*  dst = (unsigned int*)buf;
    -    unsigned int*  src = (unsigned int*)pixBuffer;
    -    for (int y = ymin; y < ymax; ++y)
    -      for (int x = xmin; x < xmax; ++x, ++dst)
    -        *dst = src[y * width + x];
    +    int newwidth = 0;
    +    int newheight = 0;
    +    Py::String data;
    +    if (xmin < xmax && ymin < ymax)
    +    {
    +        // Expand the bounds by 1 pixel on all sides
    +        xmin = std::max(0, xmin - 1);
    +        ymin = std::max(0, ymin - 1);
    +        xmax = std::min(xmax, (int)width);
    +        ymax = std::min(ymax, (int)height);
    +
    +        newwidth    = xmax - xmin;
    +        newheight   = ymax - ymin;
    +        int newsize = newwidth * newheight * 4;
    +
    +        unsigned char* buf = new unsigned char[newsize];
    +        if (buf == NULL)
    +        {
    +            throw Py::MemoryError("RendererAgg::tostring_minimized could not allocate memory");
    +        }
     
    -    // The Py::String will take over the buffer
    -    data = Py::String((const char *)buf, (int)newsize);
    -  }
    +        unsigned int*  dst = (unsigned int*)buf;
    +        unsigned int*  src = (unsigned int*)pixBuffer;
    +        for (int y = ymin; y < ymax; ++y)
    +        {
    +            for (int x = xmin; x < xmax; ++x, ++dst)
    +            {
    +                *dst = src[y * width + x];
    +            }
    +        }
     
    -  Py::Tuple bounds(4);
    -  bounds[0] = Py::Int(xmin);
    -  bounds[1] = Py::Int(ymin);
    -  bounds[2] = Py::Int(newwidth);
    -  bounds[3] = Py::Int(newheight);
    +        // The Py::String will take over the buffer
    +        data = Py::String((const char *)buf, (int)newsize);
    +    }
     
    -  Py::Tuple result(2);
    -  result[0] = data;
    -  result[1] = bounds;
    +    Py::Tuple bounds(4);
    +    bounds[0] = Py::Int(xmin);
    +    bounds[1] = Py::Int(ymin);
    +    bounds[2] = Py::Int(newwidth);
    +    bounds[3] = Py::Int(newheight);
     
    -  return result;
    +    Py::Tuple result(2);
    +    result[0] = data;
    +    result[1] = bounds;
    +
    +    return result;
     }
     
    +
     Py::Object
    -RendererAgg::clear(const Py::Tuple& args) {
    -  //"clear the rendered buffer";
    +RendererAgg::clear(const Py::Tuple& args)
    +{
    +    //"clear the rendered buffer";
     
    -  _VERBOSE("RendererAgg::clear");
    +    _VERBOSE("RendererAgg::clear");
     
    -  args.verify_length(0);
    -  rendererBase.clear(agg::rgba(1, 1, 1, 0));
    +    args.verify_length(0);
    +    rendererBase.clear(agg::rgba(1, 1, 1, 0));
     
    -  return Py::Object();
    +    return Py::Object();
     }
     
     
     agg::rgba
    -RendererAgg::rgb_to_color(const Py::SeqBase& rgb, double alpha) {
    -  _VERBOSE("RendererAgg::rgb_to_color");
    +RendererAgg::rgb_to_color(const Py::SeqBase& rgb, double alpha)
    +{
    +    _VERBOSE("RendererAgg::rgb_to_color");
     
    -  double r = Py::Float(rgb[0]);
    -  double g = Py::Float(rgb[1]);
    -  double b = Py::Float(rgb[2]);
    -  return agg::rgba(r, g, b, alpha);
    +    double r = Py::Float(rgb[0]);
    +    double g = Py::Float(rgb[1]);
    +    double b = Py::Float(rgb[2]);
    +    return agg::rgba(r, g, b, alpha);
     }
     
     
     double
    -RendererAgg::points_to_pixels_snapto(const Py::Object& points) {
    -  // convert a value in points to pixels depending on renderer dpi and
    -  // screen pixels per inch
    -  // snap return pixels to grid
    -  _VERBOSE("RendererAgg::points_to_pixels_snapto");
    -  double p = Py::Float( points ) ;
    -  //return (int)(p*PIXELS_PER_INCH/72.0*dpi/72.0)+0.5;
    -  return (int)(p*dpi/72.0)+0.5;
    -}
    -
    -double
    -RendererAgg::points_to_pixels( const Py::Object& points) {
    -  _VERBOSE("RendererAgg::points_to_pixels");
    -  double p = Py::Float( points ) ;
    -  //return p * PIXELS_PER_INCH/72.0*dpi/72.0;
    -  return p * dpi/72.0;
    +RendererAgg::points_to_pixels(const Py::Object& points)
    +{
    +    _VERBOSE("RendererAgg::points_to_pixels");
    +    double p = Py::Float(points) ;
    +    return p * dpi / 72.0;
     }
     
     
    -RendererAgg::~RendererAgg() {
    +RendererAgg::~RendererAgg()
    +{
     
    -  _VERBOSE("RendererAgg::~RendererAgg");
    +    _VERBOSE("RendererAgg::~RendererAgg");
     
    -  delete [] alphaBuffer;
    -  delete [] pixBuffer;
    +    delete [] alphaBuffer;
    +    delete [] pixBuffer;
     }
     
     /* ------------ module methods ------------- */
    -Py::Object _backend_agg_module::new_renderer (const Py::Tuple &args,
    -                                              const Py::Dict &kws)
    +Py::Object _backend_agg_module::new_renderer(const Py::Tuple &args,
    +        const Py::Dict &kws)
     {
     
    -  if (args.length() != 3 )
    +    if (args.length() != 3)
         {
    -      throw Py::RuntimeError("Incorrect # of args to RendererAgg(width, height, dpi).");
    +        throw Py::RuntimeError("Incorrect # of args to RendererAgg(width, height, dpi).");
         }
     
    -  int debug;
    -  if ( kws.hasKey("debug") ) debug = Py::Int( kws["debug"] );
    -  else debug=0;
    +    int debug;
    +    if (kws.hasKey("debug"))
    +    {
    +        debug = Py::Int(kws["debug"]);
    +    }
    +    else
    +    {
    +        debug = 0;
    +    }
     
    -  unsigned int width = (unsigned int)Py::Int(args[0]);
    -  unsigned int height = (unsigned int)Py::Int(args[1]);
    -  double dpi = Py::Float(args[2]);
    +    unsigned int width = (unsigned int)Py::Int(args[0]);
    +    unsigned int height = (unsigned int)Py::Int(args[1]);
    +    double dpi = Py::Float(args[2]);
     
    -  if (width > 1 << 15 || height > 1 << 15) {
    -    throw Py::ValueError("width and height must each be below 32768");
    -  }
    +    if (width > 1 << 15 || height > 1 << 15)
    +    {
    +        throw Py::ValueError("width and height must each be below 32768");
    +    }
     
    -  if (dpi <= 0.0) {
    -    throw Py::ValueError("dpi must be positive");
    -  }
    +    if (dpi <= 0.0)
    +    {
    +        throw Py::ValueError("dpi must be positive");
    +    }
     
    -  RendererAgg* renderer = NULL;
    -  try {
    -    renderer = new RendererAgg(width, height, dpi, debug);
    -  } catch (std::bad_alloc) {
    -    throw Py::RuntimeError("Could not allocate memory for image");
    -  }
    +    RendererAgg* renderer = NULL;
    +    try
    +    {
    +        renderer = new RendererAgg(width, height, dpi, debug);
    +    }
    +    catch (std::bad_alloc)
    +    {
    +        throw Py::RuntimeError("Could not allocate memory for image");
    +    }
     
    -  return Py::asObject(renderer);
    +    return Py::asObject(renderer);
     }
     
     
    -void BufferRegion::init_type() {
    -  behaviors().name("BufferRegion");
    -  behaviors().doc("A wrapper to pass agg buffer objects to and from the python level");
    +void BufferRegion::init_type()
    +{
    +    behaviors().name("BufferRegion");
    +    behaviors().doc("A wrapper to pass agg buffer objects to and from the python level");
     
     
    -  add_varargs_method("set_x", &BufferRegion::set_x,
    -                     "set_x(x)");
    +    add_varargs_method("set_x", &BufferRegion::set_x,
    +                       "set_x(x)");
     
    -  add_varargs_method("set_y", &BufferRegion::set_y,
    -                     "set_y(y)");
    +    add_varargs_method("set_y", &BufferRegion::set_y,
    +                       "set_y(y)");
     
    -  add_varargs_method("get_extents", &BufferRegion::get_extents,
    -                     "get_extents()");
    +    add_varargs_method("get_extents", &BufferRegion::get_extents,
    +                       "get_extents()");
     
    -  add_varargs_method("to_string", &BufferRegion::to_string,
    -                     "to_string()");
    -  add_varargs_method("to_string_argb", &BufferRegion::to_string_argb,
    -                     "to_string_argb()");
    +    add_varargs_method("to_string", &BufferRegion::to_string,
    +                       "to_string()");
    +    add_varargs_method("to_string_argb", &BufferRegion::to_string_argb,
    +                       "to_string_argb()");
     }
     
     
     void RendererAgg::init_type()
     {
    -  behaviors().name("RendererAgg");
    -  behaviors().doc("The agg backend extension module");
    +    behaviors().name("RendererAgg");
    +    behaviors().doc("The agg backend extension module");
     
    -  add_varargs_method("draw_path", &RendererAgg::draw_path,
    -                     "draw_path(gc, path, transform, rgbFace)\n");
    -  add_varargs_method("draw_path_collection", &RendererAgg::draw_path_collection,
    -                     "draw_path_collection(master_transform, cliprect, clippath, clippath_trans, paths, transforms, offsets, offsetTrans, facecolors, edgecolors, linewidths, linestyles, antialiaseds)\n");
    -  add_varargs_method("draw_quad_mesh", &RendererAgg::draw_quad_mesh,
    -                     "draw_quad_mesh(master_transform, cliprect, clippath, clippath_trans, meshWidth, meshHeight, coordinates, offsets, offsetTrans, facecolors, antialiaseds, showedges)\n");
    -  add_varargs_method("draw_markers", &RendererAgg::draw_markers,
    -                     "draw_markers(gc, marker_path, marker_trans, path, rgbFace)\n");
    -  add_varargs_method("draw_text_image", &RendererAgg::draw_text_image,
    -                     "draw_text_image(font_image, x, y, r, g, b, a)\n");
    -  add_varargs_method("draw_image", &RendererAgg::draw_image,
    -                     "draw_image(x, y, im)");
    -  add_varargs_method("write_rgba", &RendererAgg::write_rgba,
    -                     "write_rgba(fname)");
    -  add_varargs_method("tostring_rgb", &RendererAgg::tostring_rgb,
    -                     "s = tostring_rgb()");
    -  add_varargs_method("tostring_argb", &RendererAgg::tostring_argb,
    -                     "s = tostring_argb()");
    -  add_varargs_method("tostring_bgra", &RendererAgg::tostring_bgra,
    -                     "s = tostring_bgra()");
    -  add_varargs_method("tostring_rgba_minimized", &RendererAgg::tostring_rgba_minimized,
    -                     "s = tostring_rgba_minimized()");
    -  add_varargs_method("buffer_rgba", &RendererAgg::buffer_rgba,
    -                     "buffer = buffer_rgba()");
    -  add_varargs_method("clear", &RendererAgg::clear,
    -                     "clear()");
    -  add_varargs_method("copy_from_bbox", &RendererAgg::copy_from_bbox,
    -                     "copy_from_bbox(bbox)");
    -  add_varargs_method("restore_region", &RendererAgg::restore_region,
    -                     "restore_region(region)");
    -  add_varargs_method("restore_region2", &RendererAgg::restore_region2,
    -                     "restore_region(region, x1, y1, x2, y2, x3, y3)");
    +    add_varargs_method("draw_path", &RendererAgg::draw_path,
    +                       "draw_path(gc, path, transform, rgbFace)\n");
    +    add_varargs_method("draw_path_collection", &RendererAgg::draw_path_collection,
    +                       "draw_path_collection(gc, master_transform, paths, transforms, offsets, offsetTrans, facecolors, edgecolors, linewidths, linestyles, antialiaseds)\n");
    +    add_varargs_method("draw_quad_mesh", &RendererAgg::draw_quad_mesh,
    +                       "draw_quad_mesh(gc, master_transform, meshWidth, meshHeight, coordinates, offsets, offsetTrans, facecolors, antialiaseds, showedges)\n");
    +    add_varargs_method("draw_gouraud_triangle", &RendererAgg::draw_gouraud_triangle,
    +                       "draw_gouraud_triangle(gc, points, colors, master_transform)\n");
    +    add_varargs_method("draw_gouraud_triangles", &RendererAgg::draw_gouraud_triangles,
    +                       "draw_gouraud_triangles(gc, points, colors, master_transform)\n");
    +    add_varargs_method("draw_markers", &RendererAgg::draw_markers,
    +                       "draw_markers(gc, marker_path, marker_trans, path, rgbFace)\n");
    +    add_varargs_method("draw_text_image", &RendererAgg::draw_text_image,
    +                       "draw_text_image(font_image, x, y, r, g, b, a)\n");
    +    add_varargs_method("draw_image", &RendererAgg::draw_image,
    +                       "draw_image(gc, x, y, im)");
    +    add_varargs_method("write_rgba", &RendererAgg::write_rgba,
    +                       "write_rgba(fname)");
    +    add_varargs_method("tostring_rgb", &RendererAgg::tostring_rgb,
    +                       "s = tostring_rgb()");
    +    add_varargs_method("tostring_argb", &RendererAgg::tostring_argb,
    +                       "s = tostring_argb()");
    +    add_varargs_method("tostring_bgra", &RendererAgg::tostring_bgra,
    +                       "s = tostring_bgra()");
    +    add_varargs_method("tostring_rgba_minimized", &RendererAgg::tostring_rgba_minimized,
    +                       "s = tostring_rgba_minimized()");
    +    add_varargs_method("buffer_rgba", &RendererAgg::buffer_rgba,
    +                       "buffer = buffer_rgba()");
    +    add_varargs_method("clear", &RendererAgg::clear,
    +                       "clear()");
    +    add_varargs_method("copy_from_bbox", &RendererAgg::copy_from_bbox,
    +                       "copy_from_bbox(bbox)");
    +    add_varargs_method("restore_region", &RendererAgg::restore_region,
    +                       "restore_region(region)");
    +    add_varargs_method("restore_region2", &RendererAgg::restore_region2,
    +                       "restore_region(region, x1, y1, x2, y2, x3, y3)");
     }
     
     extern "C"
    -DL_EXPORT(void)
    -  init_backend_agg(void)
    +    DL_EXPORT(void)
    +    init_backend_agg(void)
     {
    -  //static _backend_agg_module* _backend_agg = new _backend_agg_module;
    +    //static _backend_agg_module* _backend_agg = new _backend_agg_module;
     
    -  _VERBOSE("init_backend_agg");
    +    _VERBOSE("init_backend_agg");
     
    -  import_array();
    +    import_array();
     
    -  static _backend_agg_module* _backend_agg = NULL;
    -  _backend_agg = new _backend_agg_module;
    +    static _backend_agg_module* _backend_agg = NULL;
    +    _backend_agg = new _backend_agg_module;
     }
    diff -Nru matplotlib-0.99.3/src/_backend_agg.h matplotlib-1.0.1/src/_backend_agg.h
    --- matplotlib-0.99.3/src/_backend_agg.h	2009-07-31 15:14:23.000000000 +0000
    +++ matplotlib-1.0.1/src/_backend_agg.h	2010-08-03 14:22:39.000000000 +0000
    @@ -55,7 +55,7 @@
     typedef agg::renderer_base renderer_base;
     typedef agg::renderer_scanline_aa_solid renderer_aa;
     typedef agg::renderer_scanline_bin_solid renderer_bin;
    -typedef agg::rasterizer_scanline_aa<> rasterizer;
    +typedef agg::rasterizer_scanline_aa rasterizer;
     
     typedef agg::scanline_p8 scanline_p8;
     typedef agg::scanline_bin scanline_bin;
    @@ -66,79 +66,84 @@
     
     // a helper class to pass agg::buffer objects around.  agg::buffer is
     // a class in the swig wrapper
    -class BufferRegion : public Py::PythonExtension {
    +class BufferRegion : public Py::PythonExtension
    +{
     public:
    -  BufferRegion(const agg::rect_i &r, bool freemem=true) :
    -  rect(r), freemem(freemem) {
    -    width = r.x2 - r.x1;
    -    height = r.y2 - r.y1;
    -    stride = width * 4;
    -    data = new agg::int8u[stride * height];
    -  }
    -  agg::int8u* data;
    -  agg::rect_i rect;
    -  int width;
    -  int height;
    -  int stride;
    -
    -  bool freemem;
    -
    -  // set the x and y corners of the rectangle
    -  Py::Object set_x(const Py::Tuple &args);
    -  Py::Object set_y(const Py::Tuple &args);
    -
    -  Py::Object get_extents(const Py::Tuple &args);
    -
    -  Py::Object to_string(const Py::Tuple &args);
    -  Py::Object to_string_argb(const Py::Tuple &args);
    -  static void init_type(void);
    -
    -  virtual ~BufferRegion() {
    -    if (freemem) {
    -      delete [] data;
    -      data = NULL;
    +    BufferRegion(const agg::rect_i &r, bool freemem = true) :
    +        rect(r), freemem(freemem)
    +    {
    +        width = r.x2 - r.x1;
    +        height = r.y2 - r.y1;
    +        stride = width * 4;
    +        data = new agg::int8u[stride * height];
         }
    -  };
    +
    +    agg::int8u* data;
    +    agg::rect_i rect;
    +    int width;
    +    int height;
    +    int stride;
    +
    +    bool freemem;
    +
    +    // set the x and y corners of the rectangle
    +    Py::Object set_x(const Py::Tuple &args);
    +    Py::Object set_y(const Py::Tuple &args);
    +
    +    Py::Object get_extents(const Py::Tuple &args);
    +
    +    Py::Object to_string(const Py::Tuple &args);
    +    Py::Object to_string_argb(const Py::Tuple &args);
    +    static void init_type(void);
    +
    +    virtual ~BufferRegion()
    +    {
    +        if (freemem)
    +        {
    +            delete [] data;
    +            data = NULL;
    +        }
    +    };
     };
     
    -class GCAgg {
    +class GCAgg
    +{
     public:
    -  GCAgg(const Py::Object& gc, double dpi);
    -  GCAgg(double dpi);
    +    GCAgg(const Py::Object& gc, double dpi);
     
    -  double dpi;
    -  bool isaa;
    +    double dpi;
    +    bool isaa;
     
    -  agg::line_cap_e cap;
    -  agg::line_join_e join;
    +    agg::line_cap_e cap;
    +    agg::line_join_e join;
     
    -  double linewidth;
    -  double alpha;
    -  agg::rgba color;
    -
    -  Py::Object cliprect;
    -  Py::Object clippath;
    -  agg::trans_affine clippath_trans;
    -
    -  //dashes
    -  typedef std::vector > dash_t;
    -  double dashOffset;
    -  dash_t dashes;
    -  e_quantize_mode quantize_mode;
    +    double linewidth;
    +    double alpha;
    +    agg::rgba color;
     
    -  Py::Object hatchpath;
    +    Py::Object cliprect;
    +    Py::Object clippath;
    +    agg::trans_affine clippath_trans;
    +
    +    //dashes
    +    typedef std::vector > dash_t;
    +    double dashOffset;
    +    dash_t dashes;
    +    e_snap_mode snap_mode;
    +
    +    Py::Object hatchpath;
     
     protected:
    -  agg::rgba get_color(const Py::Object& gc);
    -  double points_to_pixels( const Py::Object& points);
    -  void _set_linecap(const Py::Object& gc) ;
    -  void _set_joinstyle(const Py::Object& gc) ;
    -  void _set_dashes(const Py::Object& gc) ;
    -  void _set_clip_rectangle( const Py::Object& gc);
    -  void _set_clip_path( const Py::Object& gc);
    -  void _set_antialiased( const Py::Object& gc);
    -  void _set_snap( const Py::Object& gc);
    -  void _set_hatch_path( const Py::Object& gc);
    +    agg::rgba get_color(const Py::Object& gc);
    +    double points_to_pixels(const Py::Object& points);
    +    void _set_linecap(const Py::Object& gc) ;
    +    void _set_joinstyle(const Py::Object& gc) ;
    +    void _set_dashes(const Py::Object& gc) ;
    +    void _set_clip_rectangle(const Py::Object& gc);
    +    void _set_clip_path(const Py::Object& gc);
    +    void _set_antialiased(const Py::Object& gc);
    +    void _set_snap(const Py::Object& gc);
    +    void _set_hatch_path(const Py::Object& gc);
     };
     
     
    @@ -147,91 +152,105 @@
     //}
     
     // the renderer
    -class RendererAgg: public Py::PythonExtension {
    -  typedef std::pair facepair_t;
    +class RendererAgg: public Py::PythonExtension
    +{
    +    typedef std::pair facepair_t;
     public:
    -  RendererAgg(unsigned int width, unsigned int height, double dpi, int debug);
    -  static void init_type(void);
    +    RendererAgg(unsigned int width, unsigned int height, double dpi, int debug);
    +    static void init_type(void);
     
    -  unsigned int get_width() { return width;}
    -  unsigned int get_height() { return height;}
    -  // the drawing methods
    -  //Py::Object _draw_markers_nocache(const Py::Tuple & args);
    -  //Py::Object _draw_markers_cache(const Py::Tuple & args);
    -  Py::Object draw_markers(const Py::Tuple & args);
    -  Py::Object draw_text_image(const Py::Tuple & args);
    -  Py::Object draw_image(const Py::Tuple & args);
    -  Py::Object draw_path(const Py::Tuple & args);
    -  Py::Object draw_path_collection(const Py::Tuple & args);
    -  Py::Object draw_quad_mesh(const Py::Tuple& args);
    -
    -
    -  Py::Object write_rgba(const Py::Tuple & args);
    -  Py::Object tostring_rgb(const Py::Tuple & args);
    -  Py::Object tostring_argb(const Py::Tuple & args);
    -  Py::Object tostring_bgra(const Py::Tuple & args);
    -  Py::Object tostring_rgba_minimized(const Py::Tuple & args);
    -  Py::Object buffer_rgba(const Py::Tuple & args);
    -  Py::Object clear(const Py::Tuple & args);
    -
    -  Py::Object copy_from_bbox(const Py::Tuple & args);
    -  Py::Object restore_region(const Py::Tuple & args);
    -  Py::Object restore_region2(const Py::Tuple & args);
    -
    -  virtual ~RendererAgg();
    -
    -  static const size_t PIXELS_PER_INCH;
    -  unsigned int width, height;
    -  double dpi;
    -  size_t NUMBYTES;  //the number of bytes in buffer
    -
    -  agg::int8u *pixBuffer;
    -  agg::rendering_buffer renderingBuffer;
    -
    -  agg::int8u *alphaBuffer;
    -  agg::rendering_buffer alphaMaskRenderingBuffer;
    -  alpha_mask_type alphaMask;
    -  agg::pixfmt_gray8 pixfmtAlphaMask;
    -  renderer_base_alpha_mask_type rendererBaseAlphaMask;
    -  renderer_alpha_mask_type rendererAlphaMask;
    -  agg::scanline_p8 scanlineAlphaMask;
    -
    -  scanline_p8 slineP8;
    -  scanline_bin slineBin;
    -  pixfmt pixFmt;
    -  renderer_base rendererBase;
    -  renderer_aa rendererAA;
    -  renderer_bin rendererBin;
    -  rasterizer theRasterizer;
    -
    -  Py::Object lastclippath;
    -  agg::trans_affine lastclippath_transform;
    -
    -  static const size_t HATCH_SIZE = 72;
    -  agg::int8u hatchBuffer[HATCH_SIZE * HATCH_SIZE * 4];
    -  agg::rendering_buffer hatchRenderingBuffer;
    +    unsigned int get_width()
    +    {
    +        return width;
    +    }
    +
    +    unsigned int get_height()
    +    {
    +        return height;
    +    }
     
    -  const int debug;
    +    // the drawing methods
    +    //Py::Object _draw_markers_nocache(const Py::Tuple & args);
    +    //Py::Object _draw_markers_cache(const Py::Tuple & args);
    +    Py::Object draw_markers(const Py::Tuple & args);
    +    Py::Object draw_text_image(const Py::Tuple & args);
    +    Py::Object draw_image(const Py::Tuple & args);
    +    Py::Object draw_path(const Py::Tuple & args);
    +    Py::Object draw_path_collection(const Py::Tuple & args);
    +    Py::Object draw_quad_mesh(const Py::Tuple& args);
    +    Py::Object draw_gouraud_triangle(const Py::Tuple& args);
    +    Py::Object draw_gouraud_triangles(const Py::Tuple& args);
    +
    +    Py::Object write_rgba(const Py::Tuple & args);
    +    Py::Object tostring_rgb(const Py::Tuple & args);
    +    Py::Object tostring_argb(const Py::Tuple & args);
    +    Py::Object tostring_bgra(const Py::Tuple & args);
    +    Py::Object tostring_rgba_minimized(const Py::Tuple & args);
    +    Py::Object buffer_rgba(const Py::Tuple & args);
    +    Py::Object clear(const Py::Tuple & args);
    +
    +    Py::Object copy_from_bbox(const Py::Tuple & args);
    +    Py::Object restore_region(const Py::Tuple & args);
    +    Py::Object restore_region2(const Py::Tuple & args);
    +
    +    virtual ~RendererAgg();
    +
    +    static const size_t PIXELS_PER_INCH;
    +    unsigned int width, height;
    +    double dpi;
    +    size_t NUMBYTES;  //the number of bytes in buffer
    +
    +    agg::int8u *pixBuffer;
    +    agg::rendering_buffer renderingBuffer;
    +
    +    agg::int8u *alphaBuffer;
    +    agg::rendering_buffer alphaMaskRenderingBuffer;
    +    alpha_mask_type alphaMask;
    +    agg::pixfmt_gray8 pixfmtAlphaMask;
    +    renderer_base_alpha_mask_type rendererBaseAlphaMask;
    +    renderer_alpha_mask_type rendererAlphaMask;
    +    agg::scanline_p8 scanlineAlphaMask;
    +
    +    scanline_p8 slineP8;
    +    scanline_bin slineBin;
    +    pixfmt pixFmt;
    +    renderer_base rendererBase;
    +    renderer_aa rendererAA;
    +    renderer_bin rendererBin;
    +    rasterizer theRasterizer;
    +
    +    Py::Object lastclippath;
    +    agg::trans_affine lastclippath_transform;
    +
    +    static const size_t HATCH_SIZE = 72;
    +    agg::int8u hatchBuffer[HATCH_SIZE * HATCH_SIZE * 4];
    +    agg::rendering_buffer hatchRenderingBuffer;
    +
    +    const int debug;
     
     protected:
    -  double points_to_pixels( const Py::Object& points);
    -  double points_to_pixels_snapto( const Py::Object& points);
    -  agg::rgba rgb_to_color(const Py::SeqBase& rgb, double alpha);
    -  facepair_t _get_rgba_face(const Py::Object& rgbFace, double alpha);
    -  template
    -  void set_clipbox(const Py::Object& cliprect, R& rasterizer);
    -  bool render_clippath(const Py::Object& clippath, const agg::trans_affine& clippath_trans);
    -  template
    -  void _draw_path(PathIteratorType& path, bool has_clippath,
    -		  const facepair_t& face, const GCAgg& gc);
    -  template
    -  Py::Object
    -  _draw_path_collection_generic
    -    (agg::trans_affine 	            master_transform,
    -     const Py::Object&		    cliprect,
    -     const Py::Object&		    clippath,
    +    double points_to_pixels(const Py::Object& points);
    +    agg::rgba rgb_to_color(const Py::SeqBase& rgb, double alpha);
    +    facepair_t _get_rgba_face(const Py::Object& rgbFace, double alpha);
    +
    +    template
    +    void set_clipbox(const Py::Object& cliprect, R& rasterizer);
    +
    +    bool render_clippath(const Py::Object& clippath, const agg::trans_affine& clippath_trans);
    +
    +    template
    +    void _draw_path(PathIteratorType& path, bool has_clippath,
    +                    const facepair_t& face, const GCAgg& gc);
    +
    +    template
    +    Py::Object
    +    _draw_path_collection_generic
    +    (GCAgg&                         gc,
    +     agg::trans_affine              master_transform,
    +     const Py::Object&              cliprect,
    +     const Py::Object&              clippath,
          const agg::trans_affine&       clippath_trans,
    -     const PathGenerator&	    path_generator,
    +     const PathGenerator&           path_generator,
          const Py::SeqBase& transforms_obj,
          const Py::Object&              offsets_obj,
          const agg::trans_affine&       offset_trans,
    @@ -241,30 +260,35 @@
          const Py::SeqBase& linestyles_obj,
          const Py::SeqBase&    antialiaseds);
     
    +    void
    +    _draw_gouraud_triangle(
    +        const double* points, const double* colors,
    +        agg::trans_affine trans, bool has_clippath);
    +
     private:
    -  void create_alpha_buffers();
    +    void create_alpha_buffers();
     };
     
     // the extension module
     class _backend_agg_module : public Py::ExtensionModule<_backend_agg_module>
     {
     public:
    -  _backend_agg_module()
    -    : Py::ExtensionModule<_backend_agg_module>( "_backend_agg" )
    -  {
    -    RendererAgg::init_type();
    -    BufferRegion::init_type();
    -
    -    add_keyword_method("RendererAgg", &_backend_agg_module::new_renderer,
    -		       "RendererAgg(width, height, dpi)");
    -    initialize( "The agg rendering backend" );
    -  }
    +    _backend_agg_module()
    +        : Py::ExtensionModule<_backend_agg_module>("_backend_agg")
    +    {
    +        RendererAgg::init_type();
    +        BufferRegion::init_type();
    +
    +        add_keyword_method("RendererAgg", &_backend_agg_module::new_renderer,
    +                           "RendererAgg(width, height, dpi)");
    +        initialize("The agg rendering backend");
    +    }
     
    -  virtual ~_backend_agg_module() {}
    +    virtual ~_backend_agg_module() {}
     
     private:
     
    -  Py::Object new_renderer (const Py::Tuple &args, const Py::Dict &kws);
    +    Py::Object new_renderer(const Py::Tuple &args, const Py::Dict &kws);
     };
     
     
    diff -Nru matplotlib-0.99.3/src/backend_gdk.c matplotlib-1.0.1/src/backend_gdk.c
    --- matplotlib-0.99.3/src/backend_gdk.c	1970-01-01 00:00:00.000000000 +0000
    +++ matplotlib-1.0.1/src/backend_gdk.c	2010-07-07 01:41:45.000000000 +0000
    @@ -0,0 +1,66 @@
    +/* -*- mode: C; c-basic-offset: 4 -*-
    + * C extensions for backend_gdk
    + */
    +
    +#include "Python.h"
    +#include "numpy/arrayobject.h"
    +
    +#include 
    +
    +
    +static PyTypeObject *_PyGdkPixbuf_Type;
    +#define PyGdkPixbuf_Type (*_PyGdkPixbuf_Type)
    +
    +static PyObject *
    +pixbuf_get_pixels_array(PyObject *self, PyObject *args)
    +{
    +    /* 1) read in Python pixbuf, get the underlying gdk_pixbuf */
    +    PyGObject *py_pixbuf;
    +    GdkPixbuf *gdk_pixbuf;
    +    PyArrayObject *array;
    +    npy_intp dims[3] = { 0, 0, 3 };
    +
    +    if (!PyArg_ParseTuple(args, "O!:pixbuf_get_pixels_array",
    +			  &PyGdkPixbuf_Type, &py_pixbuf))
    +	return NULL;
    +
    +    gdk_pixbuf = GDK_PIXBUF(py_pixbuf->obj);
    +
    +    /* 2) same as pygtk/gtk/gdk.c _wrap_gdk_pixbuf_get_pixels_array()
    +     * with 'self' changed to py_pixbuf
    +     */
    +
    +    dims[0] = gdk_pixbuf_get_height(gdk_pixbuf);
    +    dims[1] = gdk_pixbuf_get_width(gdk_pixbuf);
    +    if (gdk_pixbuf_get_has_alpha(gdk_pixbuf))
    +        dims[2] = 4;
    +
    +    array = (PyArrayObject *)PyArray_SimpleNewFromData(3, dims, PyArray_UBYTE,
    +			     (char *)gdk_pixbuf_get_pixels(gdk_pixbuf));
    +    if (array == NULL)
    +        return NULL;
    +
    +    array->strides[0] = gdk_pixbuf_get_rowstride(gdk_pixbuf);
    +    /* the array holds a ref to the pixbuf pixels through this wrapper*/
    +    Py_INCREF(py_pixbuf);
    +    array->base = (PyObject *)py_pixbuf;
    +    return PyArray_Return(array);
    +}
    +
    +static PyMethodDef _backend_gdk_functions[] = {
    +    { "pixbuf_get_pixels_array", (PyCFunction)pixbuf_get_pixels_array, METH_VARARGS },
    +    { NULL, NULL, 0 }
    +};
    +
    +DL_EXPORT(void)
    +init_backend_gdk(void)
    +{
    +    PyObject *mod;
    +    mod = Py_InitModule("matplotlib.backends._backend_gdk",
    +                                        _backend_gdk_functions);
    +    import_array();
    +    init_pygtk();
    +
    +    mod = PyImport_ImportModule("gtk.gdk");
    +    _PyGdkPixbuf_Type = (PyTypeObject *)PyObject_GetAttrString(mod, "Pixbuf");
    +}
    diff -Nru matplotlib-0.99.3/src/cntr.c matplotlib-1.0.1/src/cntr.c
    --- matplotlib-0.99.3/src/cntr.c	2009-07-31 15:14:23.000000000 +0000
    +++ matplotlib-1.0.1/src/cntr.c	2010-07-07 01:41:45.000000000 +0000
    @@ -11,7 +11,7 @@
         was written by following the Python "Extending and Embedding"
         tutorial.
     
    -  $Id: cntr.c 7061 2009-04-23 14:22:27Z mdboom $
    +  $Id: cntr.c 8364 2010-06-01 19:06:28Z mdboom $
      */
     
     #include 
    @@ -50,12 +50,14 @@
      * The problem is that two disjoint curves cut through a saddle zone
      * (I reject the alternative of connecting the opposite points to make
      * a single self-intersecting curve, since those make ugly contour plots
    - * -- I've tried it).  The real problem with saddle zones is that you
    - * need to communicate the connectivity decision you make back to the
    - * calling routine, since for the next contour level, we need to tell
    - * the contour tracer to make the same decision as on the previous
    - * level.  The input/output triangulation array is the solution to this
    - * nasty problem.
    + * -- I've tried it).  The solution is to determine the z value of the
    + * centre of the zone, which is the mean of the z values of the four
    + * corner points.  If the centre z is higher than the contour level of
    + * interest and you are moving along the line with higher values on the
    + * left, turn right to leave the saddle zone.  If the centre z is lower
    + * than the contour level turn left.  Whether the centre z is higher
    + * than the 1 or 2 contour levels is stored in the saddle array so that
    + * it does not need to be recalculated in subsequent passes.
      *
      * Another complicating factor is that there may be logical holes in
      * the mesh -- zones which do not exist.  We want our contours to stop
    @@ -175,6 +177,11 @@
      * or not, z value 0, 1, or 2 -- is kept in a mesh sized data array */
     typedef short Cdata;
     
    +/* information to decide on correct contour direction in saddle zones
    + * is stored in a mesh sized array.  Only those entries corresponding
    + * to saddle zones have nonzero values in this array. */
    +typedef char Saddle;
    +
     /* here is the minimum structure required to tell where we are in the
      * mesh sized data array */
     typedef struct Csite Csite;
    @@ -189,8 +196,8 @@
         long count;                 /* count of start markers visited */
         double zlevel[2];           /* contour levels, zlevel[1]<=zlevel[0]
                                      * signals single level case */
    -    short *triangle;            /* triangulation array for the mesh */
    -    char *reg;                   /* region array for the mesh (was int) */
    +    Saddle *saddle;             /* saddle zone information for the mesh */
    +    char *reg;                  /* region array for the mesh (was int) */
         Cdata *data;                /* added by EF */
         long edge0, left0;          /* starting site on this curve for closure */
         int level0;                 /* starting level for closure */
    @@ -199,6 +206,7 @@
         /* making the actual marks requires a bunch of other stuff */
         const double *x, *y, *z;    /* mesh coordinates and function values */
         double *xcp, *ycp;          /* output contour points */
    +    short *kcp;                 /* kind of contour point */
     };
     
     void print_Csite(Csite *Csite)
    @@ -224,8 +232,6 @@
         printf("\n");
     }
     
    -/* triangle only takes values of -1, 0, 1, so it could be a signed char. */
    -/* most or all of the longs probably could be converted to ints with no loss */
     
     /* the Cdata array consists of the following bits:
      * Z_VALUE     (2 bits) 0, 1, or 2 function value at point
    @@ -242,6 +248,7 @@
      * OPEN_END    marks an i-edge start point whose other endpoint is
      *             on a boundary for the single level case
      * ALL_DONE    marks final start point
    + * SLIT_DN_VISITED this slit downstroke hasn't/has been visited in pass 2
      */
     #define Z_VALUE   0x0003
     #define ZONE_EX   0x0004
    @@ -256,6 +263,7 @@
     #define SLIT_DN   0x0800
     #define OPEN_END  0x1000
     #define ALL_DONE  0x2000
    +#define SLIT_DN_VISITED 0x4000
     
     /* some helpful macros to find points relative to a given directed
      * edge -- points are designated 0, 1, 2, 3 CCW around zone with 0 and
    @@ -268,6 +276,18 @@
     #define START_MARK(left) \
       ((left)>0?((left)>1?J1_START:I1_START):((left)<-1?J0_START:I0_START))
     
    +enum {kind_zone, kind_edge1, kind_edge2,
    +        kind_slit_up, kind_slit_down, kind_start_slit=16} point_kinds;
    +
    +/* Saddle zone array consists of the following bits:
    + * SADDLE_SET  whether zone's saddle data has been set.
    + * SADDLE_GT0  whether z of centre of zone is higher than site->level[0].
    + * SADDLE_GT1  whether z of centre of zone is higher than site->level[1].
    + */
    +#define SADDLE_SET 0x01
    +#define SADDLE_GT0 0x02
    +#define SADDLE_GT1 0x04
    +
     /* ------------------------------------------------------------------------ */
     
     /* these actually mark points */
    @@ -287,7 +307,7 @@
     static long curve_tracer (Csite * site, int pass2);
     
     /* this initializes the data array for curve_tracer */
    -static void data_init (Csite * site, int region, long nchunk);
    +static void data_init (Csite * site, long nchunk);
     
     /* ------------------------------------------------------------------------ */
     
    @@ -309,24 +329,26 @@
         long left0 = site->left0;
         int level0 = site->level0 == level;
         int two_levels = site->zlevel[1] > site->zlevel[0];
    -    short *triangle = site->triangle;
    +    Saddle* saddle = site->saddle;
     
         const double *x = pass2 ? site->x : 0;
         const double *y = pass2 ? site->y : 0;
    -    const double *z = pass2 ? site->z : 0;
    -    double zlevel = pass2 ? site->zlevel[level] : 0.0;
    +    const double *z = site->z;
    +    double zlevel = site->zlevel[level];
         double *xcp = pass2 ? site->xcp : 0;
         double *ycp = pass2 ? site->ycp : 0;
    +    short *kcp = pass2 ? site->kcp : 0;
     
         int z0, z1, z2, z3;
    -    int keep_left = 0;          /* flag to try to minimize curvature in saddles */
         int done = 0;
    +    int n_kind;
     
         if (level)
             level = 2;
     
         for (;;)
         {
    +        n_kind = 0;
             /* set edge endpoints */
             p0 = POINT0 (edge, fwd);
             p1 = POINT1 (edge, fwd);
    @@ -338,6 +360,8 @@
                 double zcp = (zlevel - z[p0]) / (z[p1] - z[p0]);
                 xcp[n] = zcp * (x[p1] - x[p0]) + x[p0];
                 ycp[n] = zcp * (y[p1] - y[p0]) + y[p0];
    +            kcp[n] = kind_zone;
    +            n_kind = n;
             }
             if (!done && !jedge)
             {
    @@ -393,29 +417,30 @@
             {
                 if (z1 == z3)
                 {
    -                /* this is a saddle zone, need triangle to decide
    -                 * -- set triangle if not already decided for this zone */
    +                /* this is a saddle zone, determine whether to turn left or
    +                 * right depending on height of centre of zone relative to
    +                 * contour level.  Set saddle[zone] if not already decided. */
    +                int turnRight;
                     long zone = edge + (left > 0 ? left : 0);
    -                if (triangle)
    +                if (!(saddle[zone] & SADDLE_SET))
                     {
    -                    if (!triangle[zone])
    -                    {
    -                        if (keep_left)
    -                            triangle[zone] = jedge ? -1 : 1;
    -                        else
    -                            triangle[zone] = jedge ? 1 : -1;
    -                    }
    -                    if (triangle[zone] > 0 ? !jedge : jedge)
    -                        goto bkwd;
    -                }
    -                else
    -                {
    -                    if (keep_left)
    -                        goto bkwd;
    +                    double zcentre;
    +                    saddle[zone] = SADDLE_SET;
    +                    zcentre = (z[p0] + z[p0+left] + z[p1] + z[p1+left])/4.0;
    +                    if (zcentre > site->zlevel[0])
    +                        saddle[zone] |=
    +                            (two_levels && zcentre > site->zlevel[1])
    +                            ? SADDLE_GT0 | SADDLE_GT1 : SADDLE_GT0;
                     }
    +
    +                turnRight = level == 2 ? (saddle[zone] & SADDLE_GT1)
    +                                       : (saddle[zone] & SADDLE_GT0);
    +                if (z1 ^ (level == 2))
    +                    turnRight = !turnRight;
    +                if (!turnRight)
    +                    goto bkwd;
                 }
                 /* bend forward (right along curve) */
    -            keep_left = 1;
                 jedge = !jedge;
                 edge = p1 + (left > 0 ? left : 0);
                 {
    @@ -428,7 +453,6 @@
             {
               bkwd:
                 /* bend backward (left along curve) */
    -            keep_left = 0;
                 jedge = !jedge;
                 edge = p0 + (left > 0 ? left : 0);
                 {
    @@ -487,7 +511,15 @@
         site->edge = edge;
         site->n = n;
         site->left = left;
    -    return done > 4 ? slit_cutter (site, done - 5, pass2) : done;
    +    if (done <= 4)
    +    {
    +        return done;
    +    }
    +    if (pass2 && n_kind)
    +    {
    +        kcp[n_kind] += kind_start_slit;
    +    }
    +    return slit_cutter (site, done - 5, pass2);
     }
     
     /* edge_walker assumes that the current edge is being drawn CCW
    @@ -513,11 +545,13 @@
         long left0 = site->left0;
         int level0 = site->level0 == 2;
         int marked;
    +    int n_kind = 0;
     
         const double *x = pass2 ? site->x : 0;
         const double *y = pass2 ? site->y : 0;
         double *xcp = pass2 ? site->xcp : 0;
         double *ycp = pass2 ? site->ycp : 0;
    +    short *kcp = pass2 ? site->kcp : 0;
     
         int z0, z1, heads_up = 0;
     
    @@ -528,6 +562,7 @@
             z0 = data[p0] & Z_VALUE;
             z1 = data[p1] & Z_VALUE;
             marked = 0;
    +        n_kind = 0;
             if (z0 == 1)
             {
                 /* mark current boundary point */
    @@ -535,6 +570,8 @@
                 {
                     xcp[n] = x[p0];
                     ycp[n] = y[p0];
    +                kcp[n] = kind_edge1;
    +                n_kind = n;
                 }
                 marked = 1;
             }
    @@ -549,6 +586,8 @@
                     zcp = (zcp - site->z[p0]) / (site->z[p1] - site->z[p0]);
                     xcp[n] = zcp * (x[p1] - x[p0]) + x[p0];
                     ycp[n] = zcp * (y[p1] - y[p0]) + y[p0];
    +                kcp[n] = kind_edge2;
    +                n_kind = n;
                 }
                 marked = 1;
             }
    @@ -562,17 +601,34 @@
                     site->n = n + marked;
                     /* if the curve is closing on a hole, need to make a downslit */
                     if (fwd < 0 && !(data[edge] & (jedge ? J_BNDY : I_BNDY)))
    +                {
    +                    if (n_kind) kcp[n_kind] += kind_start_slit;
                         return slit_cutter (site, 0, pass2);
    +                }
    +                if (fwd < 0 && level0 && left < 0)
    +                {
    +                    /* remove J0_START from this boundary edge as boundary is
    +                     * included by the upwards slit from contour line below. */
    +                    data[edge] &= ~J0_START;
    +                    if (n_kind) kcp[n_kind] += kind_start_slit;
    +                    return slit_cutter (site, 0, pass2);
    +                }
                     return 3;
                 }
                 else if (pass2)
                 {
                     if (heads_up || (fwd < 0 && (data[edge] & SLIT_DN)))
                     {
    -                    site->edge = edge;
    -                    site->left = left;
    -                    site->n = n + marked;
    -                    return slit_cutter (site, heads_up, pass2);
    +                    if (!heads_up && !(data[edge] & SLIT_DN_VISITED))
    +                        data[edge] |= SLIT_DN_VISITED;
    +                    else
    +                    {
    +                        site->edge = edge;
    +                        site->left = left;
    +                        site->n = n + marked;
    +                        if (n_kind) kcp[n_kind] += kind_start_slit;
    +                        return slit_cutter (site, heads_up, pass2);
    +                    }
                     }
                 }
                 else
    @@ -649,6 +705,7 @@
         const double *y = pass2 ? site->y : 0;
         double *xcp = pass2 ? site->xcp : 0;
         double *ycp = pass2 ? site->ycp : 0;
    +    short *kcp = pass2 ? site->kcp : 0;
     
         if (up)
         {
    @@ -677,6 +734,7 @@
                 }
                 xcp[n] = x[p1];
                 ycp[n] = y[p1];
    +            kcp[n] = kind_slit_up;
                 n++;
                 p1 += imax;
             }
    @@ -733,6 +791,7 @@
                 {
                     xcp[n] = x[p0];
                     ycp[n] = y[p0];
    +                kcp[n] = kind_slit_down;
                     n++;
                 }
                 else
    @@ -943,13 +1002,8 @@
     
     /* ------------------------------------------------------------------------ */
     
    -/* The sole function of the "region" argument is to specify the
    -   value in Csite.reg that denotes a missing zone.  We always
    -   use zero.
    -*/
    -
     static void
    -data_init (Csite * site, int region, long nchunk)
    +data_init (Csite * site, long nchunk)
     {
         Cdata * data = site->data;
         long imax = site->imax;
    @@ -1019,8 +1073,7 @@
                 data[ij + imax + 1] = 0;
                 if (reg)
                 {
    -                if (region ? (reg[ij + imax + 1] == region)
    -                    : (reg[ij + imax + 1] != 0))
    +                if (reg[ij + imax + 1] != 0)
                         data[ij + imax + 1] = ZONE_EX;
                 }
                 else
    @@ -1156,6 +1209,8 @@
         /* place immediate stop mark if nothing found */
         if (!count)
             data[0] |= ALL_DONE;
    +    else
    +        for (i = 0; i < ijmax; ++i) site->saddle[i] = 0;
     
         /* initialize site */
         site->edge0 = site->edge00 = site->edge = 0;
    @@ -1227,9 +1282,10 @@
         if (site == NULL) return NULL;
         site->data = NULL;
         site->reg = NULL;
    -    site->triangle = NULL;
    +    site->saddle = NULL;
         site->xcp = NULL;
         site->ycp = NULL;
    +    site->kcp = NULL;
         site->x = NULL;
         site->y = NULL;
         site->z = NULL;
    @@ -1242,7 +1298,6 @@
     {
         long ijmax = iMax * jMax;
         long nreg = iMax * jMax + iMax + 1;
    -    long i;
     
         site->imax = iMax;
         site->jmax = jMax;
    @@ -1252,21 +1307,20 @@
             PyMem_Free(site);
             return -1;
         }
    -    site->triangle = (short *) PyMem_Malloc(sizeof(short) * ijmax);
    -    if (site->triangle == NULL)
    +    site->saddle = (Saddle*) PyMem_Malloc(sizeof(Saddle) * ijmax);
    +    if (site->saddle == NULL)
         {
             PyMem_Free(site->data);
             PyMem_Free(site);
             return -1;
         }
    -    for (i = 0; i < ijmax; i++) site->triangle[i] = 0;
         site->reg = NULL;
         if (mask != NULL)
         {
             site->reg = (char *) PyMem_Malloc(sizeof(char) * nreg);
             if (site->reg == NULL)
             {
    -            PyMem_Free(site->triangle);
    +            PyMem_Free(site->saddle);
                 PyMem_Free(site->data);
                 PyMem_Free(site);
                 return -1;
    @@ -1279,117 +1333,249 @@
         site->z = z;
         site->xcp = NULL;
         site->ycp = NULL;
    +    site->kcp = NULL;
         return 0;
     }
     
     void cntr_del(Csite *site)
     {
    -    PyMem_Free(site->triangle);
    +    PyMem_Free(site->saddle);
         PyMem_Free(site->reg);
         PyMem_Free(site->data);
         PyMem_Free(site);
         site = NULL;
     }
     
    -/* Build a list of lists of points, where each point is an (x,y)
    -   tuple.
    -*/
    -static PyObject *
    -build_cntr_list_p(long *np, double *xp, double *yp, int nparts, long ntotal)
    +#define MOVETO 1
    +#define LINETO 2
    +
    +int reorder(double *xpp, double *ypp, short *kpp,
    +                    double *xy, unsigned char *c, int npts)
     {
    -    PyObject *point, *contourList, *all_contours;
    -    int start = 0, end = 0;
    -    int i, j, k;
    +    int *i0;
    +    int *i1;
    +    int *subp=NULL;  /* initialized to suppress warning */
    +    int isp, nsp;
    +    int iseg, nsegs;
    +    int isegplus;
    +    int i;
    +    int k;
    +    int started;
    +    int maxnsegs = npts/2 + 1;
    +
    +    /* allocate maximum possible size--gross overkill */
    +    i0 = malloc(maxnsegs * sizeof(int));
    +    i1 = malloc(maxnsegs * sizeof(int));
     
    -    all_contours = PyList_New(nparts);
    +    /* Find the segments. */
    +    iseg = 0;
    +    started = 0;
    +    for (i=0; i= kind_slit_up) || (i == npts-1))
    +            {
    +                i1[iseg] = i;
    +                started = 0;
    +                iseg++;
    +                if (iseg == maxnsegs)
    +                {
    +                    k = -1;
    +                    goto ending;
    +                }
    +            }
    +        }
    +        else if ((kpp[i] < kind_slit_up) && (i < npts-1))
    +        {
    +            i0[iseg] = i;
    +            started = 1;
    +        }
    +    }
     
    -    for (i = 0; i < nparts; i++)
    +    nsegs = iseg;
    +
    +
    +    /* Find the subpaths as sets of connected segments. */
    +
    +    subp = malloc(nsegs * sizeof(int));
    +    for (i=0; i= 0) continue;
    +        subp[iseg] = nsp;
    +        nsp++;
    +        if (iseg == nsegs-1) continue;
    +        for (isegplus = iseg+1; isegplus < nsegs; isegplus++)
             {
    -            point = Py_BuildValue("(dd)", xp[j], yp[j]);
    -            if (PyList_SetItem(contourList, k, point)) goto error;
    +            if (subp[isegplus] >= 0) continue;
    +
    +            if (xend == xpp[i0[isegplus]] && yend == ypp[i0[isegplus]])
    +            {
    +                subp[isegplus] = subp[iseg];
    +                xend = xpp[i1[isegplus]];
    +                yend = ypp[i1[isegplus]];
    +            }
    +
             }
    -        if (PyList_SetItem(all_contours, i, contourList)) goto error;
         }
    -    return all_contours;
     
    -    error:
    -    Py_XDECREF(all_contours);
    -    return NULL;
    -}
    +    /* Generate the verts and codes from the subpaths. */
    +    k = 0;
    +    for (isp=0; isp npts)  /* should never happen */
    +                {
    +                    k = -1;
    +                    goto ending;
    +                }
    +            }
    +        }
    +    }
     
    +    ending:
    +    free(i0);
    +    free(i1);
    +    free(subp);
     
    -#if 0
    -/* the following function is not used, so it produces a warning
    - * commented it out NN - 070630 */
    +    return k;
    +}
     
    -/* Build a list of tuples (X, Y), where X and Y are 1-D arrays. */
    +/* Build a list of XY 2-D arrays, shape (N,2), to which a list of path
    +        code arrays is concatenated.
    +*/
     static PyObject *
    -build_cntr_list_v(long *np, double *xp, double *yp, int nparts, long ntotal)
    +build_cntr_list_v2(long *np, double *xp, double *yp, short *kp,
    +                                            int nparts, long ntotal)
     {
    -    PyObject *point, *all_contours;
    -    PyArrayObject *xv, *yv;
    -    npy_intp dims[1];
    +    PyObject *all_contours;
    +    PyArrayObject *xyv = NULL;
    +    PyArrayObject *kv = NULL;
    +    npy_intp dims[2];
    +    npy_intp kdims[1];
         int i;
    -    long j, k;
    +    long k;
     
    -    all_contours = PyList_New(nparts);
    +    PyArray_Dims newshape;
     
    -    k = 0;
    -    for (i = 0; i < nparts; i++)
    +    all_contours = PyList_New(nparts*2);
    +
    +    for (i=0, k=0; i < nparts; k+= np[i], i++)
         {
    +        double *xpp = xp+k;
    +        double *ypp = yp+k;
    +        short *kpp = kp+k;
    +        int n;
    +
    +
             dims[0] = np[i];
    -        xv = (PyArrayObject *) PyArray_SimpleNew(1, dims, PyArray_DOUBLE);
    -        yv = (PyArrayObject *) PyArray_SimpleNew(1, dims, PyArray_DOUBLE);
    -        if (xv == NULL || yv == NULL)  goto error;
    -        for (j = 0; j < dims[0]; j++)
    -        {
    -            ((double *)xv->data)[j] = xp[k];
    -            ((double *)yv->data)[j] = yp[k];
    -            k++;
    -        }
    -        point = Py_BuildValue("(NN)", xv, yv);
    -        /* "O" increments ref count; "N" does not. */
    -        if (PyList_SetItem(all_contours, i, point)) goto error;
    +        dims[1] = 2;
    +        kdims[0] = np[i];
    +        xyv = (PyArrayObject *) PyArray_SimpleNew(2, dims, PyArray_DOUBLE);
    +        if (xyv == NULL)  goto error;
    +        kv = (PyArrayObject *) PyArray_SimpleNew(1, kdims, PyArray_UBYTE);
    +        if (kv == NULL) goto error;
    +
    +        n = reorder(xpp, ypp, kpp,
    +                        (double *) xyv->data,
    +                        (unsigned char *) kv->data,
    +                        np[i]);
    +        if (n == -1) goto error;
    +        newshape.len = 2;
    +        dims[0] = n;
    +        newshape.ptr = dims;
    +        if (PyArray_Resize(xyv, &newshape, 1, NPY_CORDER) == NULL) goto error;
    +
    +        newshape.len = 1;  /* ptr, dims can stay the same */
    +        if (PyArray_Resize(kv, &newshape, 1, NPY_CORDER) == NULL) goto error;
    +
    +
    +        if (PyList_SetItem(all_contours, i, (PyObject *)xyv)) goto error;
    +        if (PyList_SetItem(all_contours, nparts+i,
    +                                (PyObject *)kv)) goto error;
         }
         return all_contours;
     
         error:
    +    Py_XDECREF(xyv);
    +    Py_XDECREF(kv);
         Py_XDECREF(all_contours);
         return NULL;
     }
    -#endif
     
    -/* Build a list of XY 2-D arrays, shape (N,2) */
    +#if 0   /* preprocess this out when we are not using it. */
    +/* Build a list of XY 2-D arrays, shape (N,2), to which a list of K arrays
    +        is concatenated.
    +   This is kept in the code in case we need to switch back to it,
    +   or in case we need it for investigating the infamous internal
    +   masked region bug.
    +*/
    +
     static PyObject *
    -build_cntr_list_v2(long *np, double *xp, double *yp, int nparts, long ntotal)
    +__build_cntr_list_v2(long *np, double *xp, double *yp, short *kp,
    +                                            int nparts, long ntotal)
     {
         PyObject *all_contours;
         PyArrayObject *xyv;
    +    PyArrayObject *kv;
         npy_intp dims[2];
    +    npy_intp kdims[1];
         int i;
         long j, k;
     
    -    all_contours = PyList_New(nparts);
    +    all_contours = PyList_New(nparts*2);
     
         k = 0;
         for (i = 0; i < nparts; i++)
         {
             dims[0] = np[i];
             dims[1] = 2;
    +        kdims[0] = np[i];
             xyv = (PyArrayObject *) PyArray_SimpleNew(2, dims, PyArray_DOUBLE);
             if (xyv == NULL)  goto error;
    +        kv = (PyArrayObject *) PyArray_SimpleNew(1, kdims, PyArray_SHORT);
    +        if (kv == NULL) goto error;
    +
             for (j = 0; j < dims[0]; j++)
             {
                 ((double *)xyv->data)[2*j] = xp[k];
                 ((double *)xyv->data)[2*j+1] = yp[k];
    +            ((short *)kv->data)[j] = kp[k];
                 k++;
             }
             if (PyList_SetItem(all_contours, i, (PyObject *)xyv)) goto error;
    +        if (PyList_SetItem(all_contours, nparts+i,
    +                                (PyObject *)kv)) goto error;
         }
         return all_contours;
     
    @@ -1398,6 +1584,7 @@
         return NULL;
     }
     
    +#endif  /* preprocessing out the old version for now */
     
     
     /* cntr_trace is called once per contour level or level pair.
    @@ -1408,11 +1595,12 @@
     */
     
     PyObject *
    -cntr_trace(Csite *site, double levels[], int nlevels, int points, long nchunk)
    +cntr_trace(Csite *site, double levels[], int nlevels, long nchunk)
     {
         PyObject *c_list = NULL;
         double *xp0;
         double *yp0;
    +    short *kp0;
         long *nseg0;
         int iseg;
     
    @@ -1430,7 +1618,7 @@
             site->zlevel[1] = levels[1];
         }
         site->n = site->count = 0;
    -    data_init (site, 0, nchunk);
    +    data_init (site, nchunk);
     
         /* make first pass to compute required sizes for second pass */
         for (;;)
    @@ -1451,12 +1639,14 @@
         }
         xp0 = (double *) PyMem_Malloc(ntotal * sizeof(double));
         yp0 = (double *) PyMem_Malloc(ntotal * sizeof(double));
    +    kp0 = (short *) PyMem_Malloc(ntotal * sizeof(short));
         nseg0 = (long *) PyMem_Malloc(nparts * sizeof(long));
    -    if (xp0 == NULL || yp0 == NULL || nseg0 == NULL) goto error;
    +    if (xp0 == NULL || yp0 == NULL || kp0 == NULL || nseg0 == NULL) goto error;
     
         /* second pass */
         site->xcp = xp0;
         site->ycp = yp0;
    +    site->kcp = kp0;
         iseg = 0;
         for (;;iseg++)
         {
    @@ -1475,6 +1665,7 @@
                 nseg0[iseg] = n;
                 site->xcp += n;
                 site->ycp += n;
    +            site->kcp += n;
                 ntotal2 += n;
                 nparts2++;
             }
    @@ -1486,22 +1677,25 @@
             }
         }
     
    +    c_list = build_cntr_list_v2(nseg0, xp0, yp0, kp0, nparts, ntotal);
     
    -    if (points)
    -    {
    -        c_list = build_cntr_list_p(nseg0, xp0, yp0, nparts, ntotal);
    -    }
    -    else
    -    {
    -        c_list = build_cntr_list_v2(nseg0, xp0, yp0, nparts, ntotal);
    -    }
    -    PyMem_Free(xp0); PyMem_Free(yp0); PyMem_Free(nseg0);
    -    site->xcp = NULL; site->ycp = NULL;
    +    PyMem_Free(xp0);
    +    PyMem_Free(yp0);
    +    PyMem_Free(kp0);
    +    PyMem_Free(nseg0);
    +    site->xcp = NULL;
    +    site->ycp = NULL;
    +    site->kcp = NULL;
         return c_list;
     
         error:
    -    PyMem_Free(xp0); PyMem_Free(yp0); PyMem_Free(nseg0);
    -    site->xcp = NULL; site->ycp = NULL;
    +    PyMem_Free(xp0);
    +    PyMem_Free(yp0);
    +    PyMem_Free(kp0);
    +    PyMem_Free(nseg0);
    +    site->xcp = NULL;
    +    site->ycp = NULL;
    +    site->kcp = NULL;
         Py_XDECREF(c_list);
         return NULL;
     }
    @@ -1603,16 +1797,14 @@
         }
     
         xpa = (PyArrayObject *) PyArray_ContiguousFromObject(xarg,
    -							 PyArray_DOUBLE, 2, 2);
    +                                                      PyArray_DOUBLE, 2, 2);
         ypa = (PyArrayObject *) PyArray_ContiguousFromObject(yarg,
    -							 PyArray_DOUBLE,
    -							 2, 2);
    -    zpa = (PyArrayObject *) PyArray_ContiguousFromObject(zarg, PyArray_DOUBLE,
    -							 2, 2);
    +                                                      PyArray_DOUBLE, 2, 2);
    +    zpa = (PyArrayObject *) PyArray_ContiguousFromObject(zarg,
    +                                                      PyArray_DOUBLE, 2, 2);
         if (marg)
             mpa = (PyArrayObject *) PyArray_ContiguousFromObject(marg,
    -							     PyArray_SBYTE,
    -							     2, 2);
    +                                                      PyArray_SBYTE, 2, 2);
         else
             mpa = NULL;
     
    @@ -1663,18 +1855,40 @@
     {
         double levels[2] = {0.0, -1e100};
         int nlevels = 2;
    -    int points = 0;
         long nchunk = 0L;
    -    static char *kwlist[] = {"level0", "level1", "points", "nchunk", NULL};
    +    static char *kwlist[] = {"level0", "level1",  "nchunk", NULL};
     
    -    if (! PyArg_ParseTupleAndKeywords(args, kwds, "d|dil", kwlist,
    -                                      levels, levels+1, &points, &nchunk))
    +    if (! PyArg_ParseTupleAndKeywords(args, kwds, "d|dl", kwlist,
    +                                      levels, levels+1, &nchunk))
         {
             return NULL;
         }
         if (levels[1] == -1e100 || levels[1] <= levels[0])
             nlevels = 1;
    -    return cntr_trace(self->site, levels, nlevels, points, nchunk);
    +    return cntr_trace(self->site, levels, nlevels, nchunk);
    +}
    +
    +/* The following will not normally be called.  It is experimental,
    +   and intended for future debugging.  It may go away at any time.
    +*/
    +static PyObject *
    +Cntr_get_cdata(Cntr *self)
    +{
    +    PyArrayObject *Cdata;
    +    npy_intp dims[2];
    +    int i, j;
    +    int ni, nj;
    +
    +    dims[0] = ni = self->site->imax;
    +    dims[1] = nj = self->site->jmax;
    +
    +    Cdata = (PyArrayObject *) PyArray_SimpleNew(2, dims, PyArray_SHORT);
    +    for (j=0; jdata[j + i*nj] = self->site->data[i + j*ni];
    +            /* output is C-order, input is F-order */
    +    /* for now we are ignoring the last ni+1 values */
    +    return (PyObject *)Cdata;
     }
     
     static PyMethodDef Cntr_methods[] = {
    @@ -1689,6 +1903,12 @@
          "    Optional argument: nchunk; approximate number of grid points\n"
          "        per chunk. 0 (default) for no chunking.\n"
         },
    +    {"get_cdata", (PyCFunction)Cntr_get_cdata, METH_NOARGS,
    +     "Returns a copy of the mesh array with contour calculation codes.\n\n"
    +     "Experimental and incomplete; we are not returning quite all of\n"
    +     "the array.\n"
    +     "Don't call this unless you are exploring the dark recesses of cntr.c\n"
    +    },
         {0, 0, 0, 0}  /* Sentinel */
     };
     
    @@ -1751,7 +1971,8 @@
     
         if (m == NULL)
           return;
    -
    +    PyModule_AddIntConstant(m, "_slitkind", (long)kind_slit_up );
    +    /* We can add all the point_kinds values later if we need them. */
         import_array();
         Py_INCREF(&CntrType);
         PyModule_AddObject(m, "Cntr", (PyObject *)&CntrType);
    diff -Nru matplotlib-0.99.3/src/ft2font.cpp matplotlib-1.0.1/src/ft2font.cpp
    --- matplotlib-0.99.3/src/ft2font.cpp	2010-03-09 14:20:17.000000000 +0000
    +++ matplotlib-1.0.1/src/ft2font.cpp	2010-07-07 01:41:45.000000000 +0000
    @@ -54,476 +54,525 @@
     // }
     
     FT2Image::FT2Image(unsigned long width, unsigned long height) :
    -  _isDirty(true),
    -  _buffer(NULL),
    -  _width(0), _height(0),
    -  _rgbCopy(NULL),
    -  _rgbaCopy(NULL) {
    -  _VERBOSE("FT2Image::FT2Image");
    -  resize(width, height);
    -}
    -
    -FT2Image::~FT2Image() {
    -  _VERBOSE("FT2Image::~FT2Image");
    -  delete [] _buffer;
    -  _buffer=NULL;
    -  delete _rgbCopy;
    -  delete _rgbaCopy;
    -}
    -
    -void FT2Image::resize(long width, long height) {
    -  if (width < 0) width = 1;
    -  if (height < 0) height = 1;
    -  size_t numBytes = width*height;
    -
    -  if ((unsigned long)width != _width || (unsigned long)height != _height) {
    -    if (numBytes > _width*_height) {
    -      delete [] _buffer;
    -      _buffer = NULL;
    -      _buffer = new unsigned char [numBytes];
    -    }
    -
    -    _width = (unsigned long)width;
    -    _height = (unsigned long)height;
    -  }
    +    _isDirty(true),
    +    _buffer(NULL),
    +    _width(0), _height(0),
    +    _rgbCopy(NULL),
    +    _rgbaCopy(NULL)
    +{
    +    _VERBOSE("FT2Image::FT2Image");
    +    resize(width, height);
    +}
    +
    +FT2Image::~FT2Image()
    +{
    +    _VERBOSE("FT2Image::~FT2Image");
    +    delete [] _buffer;
    +    _buffer = NULL;
    +    delete _rgbCopy;
    +    delete _rgbaCopy;
    +}
    +
    +void
    +FT2Image::resize(long width, long height)
    +{
    +    if (width < 0)
    +    {
    +        width = 1;
    +    }
    +    if (height < 0)
    +    {
    +        height = 1;
    +    }
    +    size_t numBytes = width * height;
    +
    +    if ((unsigned long)width != _width || (unsigned long)height != _height)
    +    {
    +        if (numBytes > _width*_height)
    +        {
    +            delete [] _buffer;
    +            _buffer = NULL;
    +            _buffer = new unsigned char [numBytes];
    +        }
    +
    +        _width = (unsigned long)width;
    +        _height = (unsigned long)height;
    +    }
    +
    +    memset(_buffer, 0, numBytes);
    +
    +    _isDirty = true;
    +}
    +
    +void
    +FT2Image::draw_bitmap(FT_Bitmap*  bitmap,
    +                      FT_Int      x,
    +                      FT_Int      y)
    +{
    +    _VERBOSE("FT2Image::draw_bitmap");
    +    FT_Int image_width = (FT_Int)_width;
    +    FT_Int image_height = (FT_Int)_height;
    +    FT_Int char_width =  bitmap->width;
    +    FT_Int char_height = bitmap->rows;
    +
    +    FT_Int x1 = CLAMP(x, 0, image_width);
    +    FT_Int y1 = CLAMP(y, 0, image_height);
    +    FT_Int x2 = CLAMP(x + char_width, 0, image_width);
    +    FT_Int y2 = CLAMP(y + char_height, 0, image_height);
     
    -  memset(_buffer, 0, numBytes);
    +    FT_Int x_start = MAX(0, -x);
    +    FT_Int y_offset = y1 - MAX(0, -y);
     
    -  _isDirty = true;
    +    for (FT_Int i = y1; i < y2; ++i)
    +    {
    +        unsigned char* dst = _buffer + (i * image_width + x1);
    +        unsigned char* src = bitmap->buffer + (((i - y_offset) * bitmap->pitch) + x_start);
    +        for (FT_Int j = x1; j < x2; ++j, ++dst, ++src)
    +            *dst |= *src;
    +    }
    +
    +    _isDirty = true;
     }
     
     void
    -FT2Image::draw_bitmap( FT_Bitmap*  bitmap,
    -                       FT_Int      x,
    -                       FT_Int      y) {
    -  _VERBOSE("FT2Image::draw_bitmap");
    -  FT_Int image_width = (FT_Int)_width;
    -  FT_Int image_height = (FT_Int)_height;
    -  FT_Int char_width =  bitmap->width;
    -  FT_Int char_height = bitmap->rows;
    -
    -  FT_Int x1 = CLAMP(x, 0, image_width);
    -  FT_Int y1 = CLAMP(y, 0, image_height);
    -  FT_Int x2 = CLAMP(x + char_width, 0, image_width);
    -  FT_Int y2 = CLAMP(y + char_height, 0, image_height);
    -
    -  FT_Int x_start = MAX(0, -x);
    -  FT_Int y_offset = y1 - MAX(0, -y);
    -
    -  for ( FT_Int i = y1; i < y2; ++i ) {
    -    unsigned char* dst = _buffer + (i * image_width + x1);
    -    unsigned char* src = bitmap->buffer + (((i - y_offset) * bitmap->pitch) + x_start);
    -    for ( FT_Int j = x1; j < x2; ++j, ++dst, ++src )
    -      *dst |= *src;
    -  }
    -
    -  _isDirty = true;
    -}
    -
    -void FT2Image::write_bitmap(const char* filename) const {
    -  FILE *fh = fopen(filename, "w");
    -
    -  for ( size_t i = 0; i< _height; i++) {
    -    for ( size_t j = 0; j < _width; ++j) {
    -      if (_buffer[j + i*_width])
    -        fputc('#', fh);
    -      else
    -        fputc(' ', fh);
    +FT2Image::write_bitmap(const char* filename) const
    +{
    +    FILE *fh = fopen(filename, "w");
    +
    +    for (size_t i = 0; i < _height; i++)
    +    {
    +        for (size_t j = 0; j < _width; ++j)
    +        {
    +            if (_buffer[j + i*_width])
    +            {
    +                fputc('#', fh);
    +            }
    +            else
    +            {
    +                fputc(' ', fh);
    +            }
    +        }
    +        fputc('\n', fh);
         }
    -    fputc('\n', fh);
    -  }
     
    -  fclose(fh);
    +    fclose(fh);
     }
     
     char FT2Image::write_bitmap__doc__[] =
    -"write_bitmap(fname)\n"
    -"\n"
    -"Write the bitmap to file fname\n"
    -;
    +    "write_bitmap(fname)\n"
    +    "\n"
    +    "Write the bitmap to file fname\n"
    +    ;
     Py::Object
    -FT2Image::py_write_bitmap(const Py::Tuple & args) {
    -  _VERBOSE("FT2Image::write_bitmap");
    +FT2Image::py_write_bitmap(const Py::Tuple & args)
    +{
    +    _VERBOSE("FT2Image::write_bitmap");
     
    -  args.verify_length(1);
    +    args.verify_length(1);
     
    -  std::string filename = Py::String(args[0]);
    +    std::string filename = Py::String(args[0]);
     
    -  write_bitmap(filename.c_str());
    +    write_bitmap(filename.c_str());
     
    -  return Py::Object();
    +    return Py::Object();
     }
     
     void
     FT2Image::draw_rect(unsigned long x0, unsigned long y0,
    -                    unsigned long x1, unsigned long y1) {
    -  if ( x0>_width || x1>_width ||
    -       y0>_height || y1>_height )
    -    throw Py::ValueError("Rect coords outside image bounds");
    -
    -  size_t top = y0*_width;
    -  size_t bottom = y1*_width;
    -  for (size_t i=x0; i _width || x1 > _width ||
    +        y0 > _height || y1 > _height)
    +    {
    +        throw Py::ValueError("Rect coords outside image bounds");
    +    }
    +
    +    size_t top = y0 * _width;
    +    size_t bottom = y1 * _width;
    +    for (size_t i = x0; i < x1 + 1; ++i)
    +    {
    +        _buffer[i + top] = 255;
    +        _buffer[i + bottom] = 255;
    +    }
    +
    +    for (size_t j = y0 + 1; j < y1; ++j)
    +    {
    +        _buffer[x0 + j*_width] = 255;
    +        _buffer[x1 + j*_width] = 255;
    +    }
     
    -  _isDirty = true;
    +    _isDirty = true;
     }
     
     char FT2Image::draw_rect__doc__[] =
    -"draw_rect(x0, y0, x1, y1)\n"
    -"\n"
    -"Draw a rect to the image.\n"
    -"\n"
    -;
    +    "draw_rect(x0, y0, x1, y1)\n"
    +    "\n"
    +    "Draw a rect to the image.\n"
    +    "\n"
    +    ;
     Py::Object
    -FT2Image::py_draw_rect(const Py::Tuple & args) {
    -  _VERBOSE("FT2Image::draw_rect");
    +FT2Image::py_draw_rect(const Py::Tuple & args)
    +{
    +    _VERBOSE("FT2Image::draw_rect");
     
    -  args.verify_length(4);
    +    args.verify_length(4);
     
    -  long x0 = Py::Int(args[0]);
    -  long y0 = Py::Int(args[1]);
    -  long x1 = Py::Int(args[2]);
    -  long y1 = Py::Int(args[3]);
    +    long x0 = Py::Int(args[0]);
    +    long y0 = Py::Int(args[1]);
    +    long x1 = Py::Int(args[2]);
    +    long y1 = Py::Int(args[3]);
     
    -  draw_rect(x0, y0, x1, y1);
    +    draw_rect(x0, y0, x1, y1);
     
    -  return Py::Object();
    +    return Py::Object();
     }
     
    -void FT2Image::draw_rect_filled(unsigned long x0, unsigned long y0,
    -                                unsigned long x1, unsigned long y1) {
    -  x0 = std::min(x0, _width);
    -  y0 = std::min(y0, _height);
    -  x1 = std::min(x1, _width);
    -  y1 = std::min(y1, _height);
    +void
    +FT2Image::draw_rect_filled(unsigned long x0, unsigned long y0,
    +                           unsigned long x1, unsigned long y1)
    +{
    +    x0 = std::min(x0, _width);
    +    y0 = std::min(y0, _height);
    +    x1 = std::min(x1, _width);
    +    y1 = std::min(y1, _height);
     
    -  for (size_t j=y0; jdata;
    +void
    +FT2Image::makeRgbCopy()
    +{
    +    if (!_isDirty)
    +    {
    +        return;
    +    }
     
    -  while (src != src_end) {
    -    *dst++ = *src++;
    -  }
    -  */
    +    if (!_rgbCopy)
    +    {
    +        _rgbCopy = new FT2Image(_width * 3, _height);
    +    }
    +    else
    +    {
    +        _rgbCopy->resize(_width * 3, _height);
    +    }
    +    unsigned char *src            = _buffer;
    +    unsigned char *src_end        = src + (_width * _height);
    +    unsigned char *dst            = _rgbCopy->_buffer;
     
    -  return Py::asObject((PyObject*)A);
    +    unsigned char tmp;
    +    while (src != src_end)
    +    {
    +        tmp = 255 - *src++;
    +        *dst++ = tmp;
    +        *dst++ = tmp;
    +        *dst++ = tmp;
    +    }
     }
     
    -void FT2Image::makeRgbCopy() {
    -  if (!_isDirty)
    -    return;
    +char FT2Image::as_rgb_str__doc__[] =
    +    "width, height, s = image_as_rgb_str()\n"
    +    "\n"
    +    "Return the image buffer as a 24-bit RGB string.\n"
    +    "\n"
    +    ;
    +Py::Object
    +FT2Image::py_as_rgb_str(const Py::Tuple & args)
    +{
    +    _VERBOSE("FT2Image::as_str_rgb");
    +    args.verify_length(0);
     
    -  if (!_rgbCopy) {
    -    _rgbCopy = new FT2Image(_width * 3, _height);
    -  } else {
    -    _rgbCopy->resize(_width * 3, _height);
    -  }
    -  unsigned char *src            = _buffer;
    -  unsigned char *src_end        = src + (_width * _height);
    -  unsigned char *dst            = _rgbCopy->_buffer;
    +    makeRgbCopy();
     
    -  unsigned char tmp;
    -  while (src != src_end) {
    -    tmp = 255 - *src++;
    -    *dst++ = tmp;
    -    *dst++ = tmp;
    -    *dst++ = tmp;
    -  }
    +    return _rgbCopy->py_as_str(args);
     }
     
    -char FT2Image::as_rgb_str__doc__[] =
    -"width, height, s = image_as_rgb_str()\n"
    -"\n"
    -"Return the image buffer as a 24-bit RGB string.\n"
    -"\n"
    -;
    -Py::Object
    -FT2Image::py_as_rgb_str(const Py::Tuple & args) {
    -  _VERBOSE("FT2Image::as_str_rgb");
    -  args.verify_length(0);
    -
    -  makeRgbCopy();
    -
    -  return _rgbCopy->py_as_str(args);
    -}
    -
    -void FT2Image::makeRgbaCopy() {
    -  if (!_isDirty)
    -    return;
    -
    -  if (!_rgbaCopy) {
    -    _rgbaCopy = new FT2Image(_width * 4, _height);
    -  } else {
    -    _rgbaCopy->resize(_width * 4, _height);
    -  }
    -  unsigned char *src            = _buffer;
    -  unsigned char *src_end        = src + (_width * _height);
    -  unsigned char *dst            = _rgbaCopy->_buffer;
    -
    -  while (src != src_end) {
    -    // We know the array has already been zero'ed out in
    -    // the resize method, so we just skip over the r, g and b.
    -    dst += 3;
    -    *dst++ = *src++;
    -  }
    +void FT2Image::makeRgbaCopy()
    +{
    +    if (!_isDirty)
    +    {
    +        return;
    +    }
    +
    +    if (!_rgbaCopy)
    +    {
    +        _rgbaCopy = new FT2Image(_width * 4, _height);
    +    }
    +    else
    +    {
    +        _rgbaCopy->resize(_width * 4, _height);
    +    }
    +    unsigned char *src            = _buffer;
    +    unsigned char *src_end        = src + (_width * _height);
    +    unsigned char *dst            = _rgbaCopy->_buffer;
    +
    +    while (src != src_end)
    +    {
    +        // We know the array has already been zero'ed out in
    +        // the resize method, so we just skip over the r, g and b.
    +        dst += 3;
    +        *dst++ = *src++;
    +    }
     }
     
     char FT2Image::as_rgba_str__doc__[] =
    -"width, height, s = image_as_rgb_str()\n"
    -"\n"
    -"Return the image buffer as a 32-bit RGBA string.\n"
    -"\n"
    -;
    +    "width, height, s = image_as_rgb_str()\n"
    +    "\n"
    +    "Return the image buffer as a 32-bit RGBA string.\n"
    +    "\n"
    +    ;
     Py::Object
    -FT2Image::py_as_rgba_str(const Py::Tuple & args) {
    -  _VERBOSE("FT2Image::as_str_rgba");
    -  args.verify_length(0);
    +FT2Image::py_as_rgba_str(const Py::Tuple & args)
    +{
    +    _VERBOSE("FT2Image::as_str_rgba");
    +    args.verify_length(0);
     
    -  makeRgbaCopy();
    +    makeRgbaCopy();
     
    -  return _rgbaCopy->py_as_str(args);
    +    return _rgbaCopy->py_as_str(args);
     }
     
     Py::Object
    -FT2Image::py_get_width(const Py::Tuple & args) {
    -  _VERBOSE("FT2Image::get_width");
    -  args.verify_length(0);
    +FT2Image::py_get_width(const Py::Tuple & args)
    +{
    +    _VERBOSE("FT2Image::get_width");
    +    args.verify_length(0);
     
    -  return Py::Int((long)get_width());
    +    return Py::Int((long)get_width());
     }
     
     Py::Object
    -FT2Image::py_get_height(const Py::Tuple & args) {
    -  _VERBOSE("FT2Image::get_height");
    -  args.verify_length(0);
    +FT2Image::py_get_height(const Py::Tuple & args)
    +{
    +    _VERBOSE("FT2Image::get_height");
    +    args.verify_length(0);
     
    -  return Py::Int((long)get_height());
    +    return Py::Int((long)get_height());
     }
     
    -Glyph::Glyph( const FT_Face& face, const FT_Glyph& glyph, size_t ind) :
    -  glyphInd(ind) {
    -  _VERBOSE("Glyph::Glyph");
    -
    -  FT_BBox bbox;
    -  FT_Glyph_Get_CBox( glyph, ft_glyph_bbox_subpixels, &bbox );
    -
    -  setattr("width",        Py::Int( face->glyph->metrics.width / HORIZ_HINTING) );
    -  setattr("height",       Py::Int( face->glyph->metrics.height) );
    -  setattr("horiBearingX", Py::Int( face->glyph->metrics.horiBearingX / HORIZ_HINTING) );
    -  setattr("horiBearingY", Py::Int( face->glyph->metrics.horiBearingY) );
    -  setattr("horiAdvance",  Py::Int( face->glyph->metrics.horiAdvance) );
    -  setattr("linearHoriAdvance",  Py::Int( face->glyph->linearHoriAdvance / HORIZ_HINTING) );
    -  setattr("vertBearingX", Py::Int( face->glyph->metrics.vertBearingX) );
    -
    -  setattr("vertBearingY", Py::Int( face->glyph->metrics.vertBearingY) );
    -  setattr("vertAdvance",  Py::Int( face->glyph->metrics.vertAdvance) );
    -  //setattr("bitmap_left",  Py::Int( face->glyph->bitmap_left) );
    -  //setattr("bitmap_top",  Py::Int( face->glyph->bitmap_top) );
    +Glyph::Glyph(const FT_Face& face, const FT_Glyph& glyph, size_t ind) :
    +        glyphInd(ind)
    +{
    +    _VERBOSE("Glyph::Glyph");
     
    -  Py::Tuple abbox(4);
    +    FT_BBox bbox;
    +    FT_Glyph_Get_CBox(glyph, ft_glyph_bbox_subpixels, &bbox);
     
    -  abbox[0] = Py::Int(bbox.xMin);
    -  abbox[1] = Py::Int(bbox.yMin);
    -  abbox[2] = Py::Int(bbox.xMax);
    -  abbox[3] = Py::Int(bbox.yMax);
    -  setattr("bbox", abbox);
    -  setattr("path", get_path(face));
    +    setattr("width",        Py::Int(face->glyph->metrics.width / HORIZ_HINTING));
    +    setattr("height",       Py::Int(face->glyph->metrics.height));
    +    setattr("horiBearingX", Py::Int(face->glyph->metrics.horiBearingX / HORIZ_HINTING));
    +    setattr("horiBearingY", Py::Int(face->glyph->metrics.horiBearingY));
    +    setattr("horiAdvance",  Py::Int(face->glyph->metrics.horiAdvance));
    +    setattr("linearHoriAdvance",  Py::Int(face->glyph->linearHoriAdvance / HORIZ_HINTING));
    +    setattr("vertBearingX", Py::Int(face->glyph->metrics.vertBearingX));
    +
    +    setattr("vertBearingY", Py::Int(face->glyph->metrics.vertBearingY));
    +    setattr("vertAdvance",  Py::Int(face->glyph->metrics.vertAdvance));
    +    //setattr("bitmap_left",  Py::Int( face->glyph->bitmap_left) );
    +    //setattr("bitmap_top",  Py::Int( face->glyph->bitmap_top) );
    +
    +    Py::Tuple abbox(4);
    +
    +    abbox[0] = Py::Int(bbox.xMin);
    +    abbox[1] = Py::Int(bbox.yMin);
    +    abbox[2] = Py::Int(bbox.xMax);
    +    abbox[3] = Py::Int(bbox.yMax);
    +    setattr("bbox", abbox);
    +    setattr("path", get_path(face));
     }
     
    -Glyph::~Glyph() {
    -  _VERBOSE("Glyph::~Glyph");
    +Glyph::~Glyph()
    +{
    +    _VERBOSE("Glyph::~Glyph");
     }
     
     int
    -Glyph::setattr( const char *name, const Py::Object &value ) {
    -  _VERBOSE("Glyph::setattr");
    -  __dict__[name] = value;
    -  return 0;
    +Glyph::setattr(const char *name, const Py::Object &value)
    +{
    +    _VERBOSE("Glyph::setattr");
    +    __dict__[name] = value;
    +    return 0;
     }
     
     Py::Object
    -Glyph::getattr( const char *name ) {
    -  _VERBOSE("Glyph::getattr");
    -  if ( __dict__.hasKey(name) ) return __dict__[name];
    -  else return getattr_default( name );
    +Glyph::getattr(const char *name)
    +{
    +    _VERBOSE("Glyph::getattr");
    +    if (__dict__.hasKey(name)) return __dict__[name];
    +    else return getattr_default(name);
     }
     
     inline double conv(int v)
     {
    -  return double(v) / 64.0;
    +    return double(v) / 64.0;
     }
     
     
     //see http://freetype.sourceforge.net/freetype2/docs/glyphs/glyphs-6.html
     Py::Object
    -Glyph::get_path( const FT_Face& face) {
    -  //get the glyph as a path, a list of (COMMAND, *args) as desribed in matplotlib.path
    -  // this code is from agg's decompose_ft_outline with minor modifications
    +Glyph::get_path(const FT_Face& face)
    +{
    +    //get the glyph as a path, a list of (COMMAND, *args) as desribed in matplotlib.path
    +    // this code is from agg's decompose_ft_outline with minor modifications
     
    -  enum {MOVETO, LINETO, CURVE3, CURVE4, ENDPOLY};
    -  FT_Outline& outline = face->glyph->outline;
    -  Py::List path;
    -  bool flip_y= false; //todo, pass me as kwarg
    +    enum {MOVETO, LINETO, CURVE3, CURVE4, ENDPOLY};
    +    FT_Outline& outline = face->glyph->outline;
    +    Py::List path;
    +    bool flip_y = false; //todo, pass me as kwarg
     
     
    -  FT_Vector   v_last;
    -  FT_Vector   v_control;
    -  FT_Vector   v_start;
    +    FT_Vector   v_last;
    +    FT_Vector   v_control;
    +    FT_Vector   v_start;
     
    -  FT_Vector*  point;
    -  FT_Vector*  limit;
    -  char*       tags;
    +    FT_Vector*  point;
    +    FT_Vector*  limit;
    +    char*       tags;
     
    -  int   n;         // index of contour in outline
    -  int   first;     // index of first point in contour
    -  char  tag;       // current point's state
    +    int   n;         // index of contour in outline
    +    int   first;     // index of first point in contour
    +    char  tag;       // current point's state
     
    -  first = 0;
    +    first = 0;
     
    -  for(n = 0; n < outline.n_contours; n++)
    +    for (n = 0; n < outline.n_contours; n++)
         {
    -      int  last;  // index of last point in contour
    +        int  last;  // index of last point in contour
     
    -      last  = outline.contours[n];
    -      limit = outline.points + last;
    +        last  = outline.contours[n];
    +        limit = outline.points + last;
     
    -      v_start = outline.points[first];
    -      v_last  = outline.points[last];
    +        v_start = outline.points[first];
    +        v_last  = outline.points[last];
     
    -      v_control = v_start;
    +        v_control = v_start;
     
    -      point = outline.points + first;
    -      tags  = outline.tags  + first;
    -      tag   = FT_CURVE_TAG(tags[0]);
    +        point = outline.points + first;
    +        tags  = outline.tags  + first;
    +        tag   = FT_CURVE_TAG(tags[0]);
     
    -      // A contour cannot start with a cubic control point!
    -      if(tag == FT_CURVE_TAG_CUBIC) return Py::Object();
    +        // A contour cannot start with a cubic control point!
    +        if (tag == FT_CURVE_TAG_CUBIC)
    +        {
    +            return Py::Object();
    +        }
     
    -      // check first point to determine origin
    -      if( tag == FT_CURVE_TAG_CONIC)
    +        // check first point to determine origin
    +        if (tag == FT_CURVE_TAG_CONIC)
             {
    -          // first point is conic control.  Yes, this happens.
    -          if(FT_CURVE_TAG(outline.tags[last]) == FT_CURVE_TAG_ON)
    +            // first point is conic control.  Yes, this happens.
    +            if (FT_CURVE_TAG(outline.tags[last]) == FT_CURVE_TAG_ON)
                 {
    -              // start at last point if it is on the curve
    -              v_start = v_last;
    -              limit--;
    +                // start at last point if it is on the curve
    +                v_start = v_last;
    +                limit--;
                 }
    -          else
    +            else
                 {
    -              // if both first and last points are conic,
    -              // start at their middle and record its position
    -              // for closure
    -              v_start.x = (v_start.x + v_last.x) / 2;
    -              v_start.y = (v_start.y + v_last.y) / 2;
    +                // if both first and last points are conic,
    +                // start at their middle and record its position
    +                // for closure
    +                v_start.x = (v_start.x + v_last.x) / 2;
    +                v_start.y = (v_start.y + v_last.y) / 2;
     
    -              v_last = v_start;
    +                v_last = v_start;
                 }
    -          point--;
    -          tags--;
    +            point--;
    +            tags--;
             }
     
    -      double x = conv(v_start.x);
    -      double y = flip_y ? -conv(v_start.y) : conv(v_start.y);
    -      Py::Tuple tup(3);
    -      tup[0] = Py::Int(MOVETO);
    -      tup[1] = Py::Float(x);
    -      tup[2] = Py::Float(y);
    -      path.append(tup);
    -
    -      Py::Tuple closepoly(2);
    -      closepoly[0] = Py::Int(ENDPOLY);
    -      closepoly[1] = Py::Int(0);
    +        double x = conv(v_start.x);
    +        double y = flip_y ? -conv(v_start.y) : conv(v_start.y);
    +        Py::Tuple tup(3);
    +        tup[0] = Py::Int(MOVETO);
    +        tup[1] = Py::Float(x);
    +        tup[2] = Py::Float(y);
    +        path.append(tup);
    +
    +        Py::Tuple closepoly(2);
    +        closepoly[0] = Py::Int(ENDPOLY);
    +        closepoly[1] = Py::Int(0);
     
    -      while(point < limit)
    +        while (point < limit)
             {
    -          point++;
    -          tags++;
    +            point++;
    +            tags++;
     
    -          tag = FT_CURVE_TAG(tags[0]);
    -          switch(tag)
    +            tag = FT_CURVE_TAG(tags[0]);
    +            switch (tag)
                 {
                 case FT_CURVE_TAG_ON:  // emit a single line_to
    -              {
    +            {
                     double x = conv(point->x);
                     double y = flip_y ? -conv(point->y) : conv(point->y);
                     Py::Tuple tup(3);
    @@ -533,16 +582,16 @@
                     path.append(tup);
     
                     continue;
    -              }
    +            }
     
                 case FT_CURVE_TAG_CONIC:  // consume conic arcs
    -              {
    +            {
                     v_control.x = point->x;
                     v_control.y = point->y;
     
    -              Do_Conic:
    -                if(point < limit)
    -                  {
    +Do_Conic:
    +                if (point < limit)
    +                {
                         FT_Vector vec;
                         FT_Vector v_middle;
     
    @@ -553,8 +602,8 @@
                         vec.x = point->x;
                         vec.y = point->y;
     
    -                    if(tag == FT_CURVE_TAG_ON)
    -                      {
    +                    if (tag == FT_CURVE_TAG_ON)
    +                    {
                             double xctl = conv(v_control.x);
                             double yctl = flip_y ? -conv(v_control.y) : conv(v_control.y);
                             double xto = conv(vec.x);
    @@ -567,9 +616,12 @@
                             tup[4] = Py::Float(yto);
                             path.append(tup);
                             continue;
    -                      }
    +                    }
     
    -                    if(tag != FT_CURVE_TAG_CONIC) return Py::Object();
    +                    if (tag != FT_CURVE_TAG_CONIC)
    +                    {
    +                        return Py::Object();
    +                    }
     
                         v_middle.x = (v_control.x + vec.x) / 2;
                         v_middle.y = (v_control.y + vec.y) / 2;
    @@ -588,7 +640,7 @@
     
                         v_control = vec;
                         goto Do_Conic;
    -                  }
    +                }
                     double xctl = conv(v_control.x);
                     double yctl = flip_y ? -conv(v_control.y) : conv(v_control.y);
                     double xto = conv(v_start.x);
    @@ -601,16 +653,16 @@
                     tup[4] = Py::Float(yto);
                     path.append(tup);
                     goto Close;
    -              }
    +            }
     
                 default:  // FT_CURVE_TAG_CUBIC
    -              {
    +            {
                     FT_Vector vec1, vec2;
     
    -                if(point + 1 > limit || FT_CURVE_TAG(tags[1]) != FT_CURVE_TAG_CUBIC)
    -                  {
    +                if (point + 1 > limit || FT_CURVE_TAG(tags[1]) != FT_CURVE_TAG_CUBIC)
    +                {
                         return Py::Object();
    -                  }
    +                }
     
                     vec1.x = point[0].x;
                     vec1.y = point[0].y;
    @@ -620,8 +672,8 @@
                     point += 2;
                     tags  += 2;
     
    -                if(point <= limit)
    -                  {
    +                if (point <= limit)
    +                {
                         FT_Vector vec;
     
                         vec.x = point->x;
    @@ -644,7 +696,7 @@
                         path.append(tup);
     
                         continue;
    -                  }
    +                }
     
                     double xctl1 = conv(vec1.x);
                     double yctl1 = flip_y ? -conv(vec1.y) : conv(vec1.y);
    @@ -663,666 +715,834 @@
                     path.append(tup);
     
                     goto Close;
    -              }
    +            }
                 }
             }
     
    -      path.append(closepoly);
    +        path.append(closepoly);
     
     
    -    Close:
    -      first = last + 1;
    +Close:
    +        first = last + 1;
         }
     
    -  return path;
    +    return path;
     }
     
     
     FT2Font::FT2Font(std::string facefile) :
    -  image(NULL)
    +    image(NULL)
     {
    -  _VERBOSE(Printf("FT2Font::FT2Font %s", facefile.c_str()).str());
    -  clear(Py::Tuple(0));
    +    _VERBOSE(Printf("FT2Font::FT2Font %s", facefile.c_str()).str());
    +    clear(Py::Tuple(0));
     
    -  int error = FT_New_Face( _ft2Library, facefile.c_str(), 0, &face );
    +    int error = FT_New_Face(_ft2Library, facefile.c_str(), 0, &face);
     
    +    if (error == FT_Err_Unknown_File_Format)
    +    {
    +        std::ostringstream s;
    +        s << "Could not load facefile " << facefile << "; Unknown_File_Format" << std::endl;
    +        ob_refcnt--;
    +        throw Py::RuntimeError(s.str());
    +    }
    +    else if (error == FT_Err_Cannot_Open_Resource)
    +    {
    +        std::ostringstream s;
    +        s << "Could not open facefile " << facefile << "; Cannot_Open_Resource" << std::endl;
    +        ob_refcnt--;
    +        throw Py::RuntimeError(s.str());
    +    }
    +    else if (error == FT_Err_Invalid_File_Format)
    +    {
    +        std::ostringstream s;
    +        s << "Could not open facefile " << facefile << "; Invalid_File_Format" << std::endl;
    +        ob_refcnt--;
    +        throw Py::RuntimeError(s.str());
    +    }
    +    else if (error)
    +    {
    +        std::ostringstream s;
    +        s << "Could not open facefile " << facefile << "; freetype error code " << error << std::endl;
    +        ob_refcnt--;
    +        throw Py::RuntimeError(s.str());
    +    }
     
    -  if (error == FT_Err_Unknown_File_Format ) {
    -    std::ostringstream s;
    -    s << "Could not load facefile " << facefile << "; Unknown_File_Format" << std::endl;
    -    throw Py::RuntimeError(s.str());
    -  }
    -  else if (error == FT_Err_Cannot_Open_Resource) {
    -    std::ostringstream s;
    -    s << "Could not open facefile " << facefile << "; Cannot_Open_Resource" << std::endl;
    -    throw Py::RuntimeError(s.str());
    -  }
    -  else if (error == FT_Err_Invalid_File_Format) {
    -    std::ostringstream s;
    -    s << "Could not open facefile " << facefile << "; Invalid_File_Format" << std::endl;
    -    throw Py::RuntimeError(s.str());
    -  }
    -  else if (error) {
    -    std::ostringstream s;
    -    s << "Could not open facefile " << facefile << "; freetype error code " << error<< std::endl;
    -    throw Py::RuntimeError(s.str());
    -  }
    -
    -  // set a default fontsize 12 pt at 72dpi
    +    // set a default fontsize 12 pt at 72dpi
     #ifdef VERTICAL_HINTING
    -  error = FT_Set_Char_Size( face, 12 * 64, 0, 72 * HORIZ_HINTING, 72 );
    -  static FT_Matrix transform = { 65536 / HORIZ_HINTING, 0, 0, 65536 };
    -  FT_Set_Transform( face, &transform, 0 );
    +    error = FT_Set_Char_Size(face, 12 * 64, 0, 72 * HORIZ_HINTING, 72);
    +    static FT_Matrix transform = { 65536 / HORIZ_HINTING, 0, 0, 65536 };
    +    FT_Set_Transform(face, &transform, 0);
     #else
    -  error = FT_Set_Char_Size( face, 12 * 64, 0, 72, 72 );
    +    error = FT_Set_Char_Size(face, 12 * 64, 0, 72, 72);
     #endif
    -  //error = FT_Set_Char_Size( face, 20 * 64, 0, 80, 80 );
    -  if (error) {
    -    std::ostringstream s;
    -    s << "Could not set the fontsize for facefile  " << facefile << std::endl;
    -    throw Py::RuntimeError(s.str());
    -  }
    -
    -  // set some face props as attributes
    -  //small memory leak fixed after 2.1.8
    -  //fields can be null so we have to check this first
    -
    -  const char* ps_name = FT_Get_Postscript_Name( face );
    -  if ( ps_name == NULL )
    -    ps_name = "UNAVAILABLE";
    -
    -   const char* family_name = face->family_name;
    -   if ( family_name == NULL )
    -     family_name = "UNAVAILABLE";
    -
    -   const char* style_name = face->style_name;
    -   if ( style_name == NULL )
    -     style_name = "UNAVAILABLE";
    -
    -
    -  setattr("postscript_name", Py::String(ps_name));
    -  setattr("num_faces",       Py::Int(face->num_faces));
    -  setattr("family_name",     Py::String(family_name));
    -  setattr("style_name",      Py::String(style_name));
    -  setattr("face_flags",      Py::Int(face->face_flags));
    -  setattr("style_flags",     Py::Int(face->style_flags));
    -  setattr("num_glyphs",      Py::Int(face->num_glyphs));
    -  setattr("num_fixed_sizes", Py::Int(face->num_fixed_sizes));
    -  setattr("num_charmaps",    Py::Int(face->num_charmaps));
    -
    -  int scalable = FT_IS_SCALABLE( face );
    -
    -  setattr("scalable", Py::Int(scalable));
    -
    -  if (scalable) {
    -    setattr("units_per_EM", Py::Int(face->units_per_EM));
    -
    -    Py::Tuple bbox(4);
    -    bbox[0] = Py::Int(face->bbox.xMin);
    -    bbox[1] = Py::Int(face->bbox.yMin);
    -    bbox[2] = Py::Int(face->bbox.xMax);
    -    bbox[3] = Py::Int(face->bbox.yMax);
    -    setattr("bbox",  bbox);
    -    setattr("ascender",            Py::Int(face->ascender));
    -    setattr("descender",           Py::Int(face->descender));
    -    setattr("height",              Py::Int(face->height));
    -    setattr("max_advance_width",   Py::Int(face->max_advance_width));
    -    setattr("max_advance_height",  Py::Int(face->max_advance_height));
    -    setattr("underline_position",  Py::Int(face->underline_position));
    -    setattr("underline_thickness", Py::Int(face->underline_thickness));
    -  }
    +    //error = FT_Set_Char_Size( face, 20 * 64, 0, 80, 80 );
    +    if (error)
    +    {
    +        std::ostringstream s;
    +        s << "Could not set the fontsize for facefile  " << facefile << std::endl;
    +        ob_refcnt--;
    +        throw Py::RuntimeError(s.str());
    +    }
     
    -  setattr("fname", Py::String(facefile));
    +    // set some face props as attributes
    +    //small memory leak fixed after 2.1.8
    +    //fields can be null so we have to check this first
     
    -  _VERBOSE("FT2Font::FT2Font done");
    +    const char* ps_name = FT_Get_Postscript_Name(face);
    +    if (ps_name == NULL)
    +    {
    +        ps_name = "UNAVAILABLE";
    +    }
    +
    +    const char* family_name = face->family_name;
    +    if (family_name == NULL)
    +    {
    +        family_name = "UNAVAILABLE";
    +    }
    +
    +    const char* style_name = face->style_name;
    +    if (style_name == NULL)
    +    {
    +        style_name = "UNAVAILABLE";
    +    }
    +
    +    setattr("postscript_name", Py::String(ps_name));
    +    setattr("num_faces",       Py::Int(face->num_faces));
    +    setattr("family_name",     Py::String(family_name));
    +    setattr("style_name",      Py::String(style_name));
    +    setattr("face_flags",      Py::Int(face->face_flags));
    +    setattr("style_flags",     Py::Int(face->style_flags));
    +    setattr("num_glyphs",      Py::Int(face->num_glyphs));
    +    setattr("num_fixed_sizes", Py::Int(face->num_fixed_sizes));
    +    setattr("num_charmaps",    Py::Int(face->num_charmaps));
    +
    +    int scalable = FT_IS_SCALABLE(face);
    +
    +    setattr("scalable", Py::Int(scalable));
    +
    +    if (scalable)
    +    {
    +        setattr("units_per_EM", Py::Int(face->units_per_EM));
    +
    +        Py::Tuple bbox(4);
    +        bbox[0] = Py::Int(face->bbox.xMin);
    +        bbox[1] = Py::Int(face->bbox.yMin);
    +        bbox[2] = Py::Int(face->bbox.xMax);
    +        bbox[3] = Py::Int(face->bbox.yMax);
    +        setattr("bbox",  bbox);
    +        setattr("ascender",            Py::Int(face->ascender));
    +        setattr("descender",           Py::Int(face->descender));
    +        setattr("height",              Py::Int(face->height));
    +        setattr("max_advance_width",   Py::Int(face->max_advance_width));
    +        setattr("max_advance_height",  Py::Int(face->max_advance_height));
    +        setattr("underline_position",  Py::Int(face->underline_position));
    +        setattr("underline_thickness", Py::Int(face->underline_thickness));
    +    }
    +
    +    setattr("fname", Py::String(facefile));
    +
    +    _VERBOSE("FT2Font::FT2Font done");
     }
     
     FT2Font::~FT2Font()
     {
    -  _VERBOSE("FT2Font::~FT2Font");
    +    _VERBOSE("FT2Font::~FT2Font");
     
    -  Py_XDECREF(image);
    -  FT_Done_Face    ( face );
    +    Py_XDECREF(image);
    +    FT_Done_Face(face);
     
    -  for (size_t i=0; i=face->num_charmaps)
    -    throw Py::ValueError("i exceeds the available number of char maps");
    -  FT_CharMap charmap = face->charmaps[i];
    -  if (FT_Set_Charmap( face, charmap ))
    -    throw Py::ValueError("Could not set the charmap");
    -  return Py::Object();
    +    "set_charmap(i)\n"
    +    "\n"
    +    "Make the i-th charmap current\n"
    +    ;
    +
    +Py::Object
    +FT2Font::set_charmap(const Py::Tuple & args)
    +{
    +    _VERBOSE("FT2Font::set_charmap");
    +    args.verify_length(1);
    +
    +    int i = Py::Int(args[0]);
    +    if (i >= face->num_charmaps)
    +    {
    +        throw Py::ValueError("i exceeds the available number of char maps");
    +    }
    +    FT_CharMap charmap = face->charmaps[i];
    +    if (FT_Set_Charmap(face, charmap))
    +    {
    +        throw Py::ValueError("Could not set the charmap");
    +    }
    +    return Py::Object();
    +}
    +
    +char FT2Font::select_charmap__doc__[] =
    +    "select_charmap(i)\n"
    +    "\n"
    +    "select charmap i where i is one of the FT_Encoding number\n"
    +    ;
    +
    +Py::Object
    +FT2Font::select_charmap(const Py::Tuple & args)
    +{
    +    _VERBOSE("FT2Font::set_charmap");
    +    args.verify_length(1);
    +
    +    unsigned long i = Py::Long(args[0]);
    +    //if (FT_Select_Charmap( face, FT_ENCODING_ADOBE_CUSTOM ))
    +    if (FT_Select_Charmap(face, (FT_Encoding) i))
    +    {
    +        throw Py::ValueError("Could not set the charmap");
    +    }
    +    return Py::Object();
     }
     
     FT_BBox
    -FT2Font::compute_string_bbox(  ) {
    -  _VERBOSE("FT2Font::compute_string_bbox");
    +FT2Font::compute_string_bbox()
    +{
    +    _VERBOSE("FT2Font::compute_string_bbox");
    +
    +    FT_BBox bbox;
    +    /* initialize string bbox to "empty" values */
    +    bbox.xMin = bbox.yMin = 32000;
    +    bbox.xMax = bbox.yMax = -32000;
     
    -  FT_BBox bbox;
    -  /* initialize string bbox to "empty" values */
    -  bbox.xMin = bbox.yMin = 32000;
    -  bbox.xMax = bbox.yMax = -32000;
    -
    -  for ( size_t n = 0; n < glyphs.size(); n++ ) {
    -    FT_BBox glyph_bbox;
    -    FT_Glyph_Get_CBox( glyphs[n], ft_glyph_bbox_subpixels, &glyph_bbox );
    -    if ( glyph_bbox.xMin < bbox.xMin ) bbox.xMin = glyph_bbox.xMin;
    -    if ( glyph_bbox.yMin < bbox.yMin ) bbox.yMin = glyph_bbox.yMin;
    -    if ( glyph_bbox.xMax > bbox.xMax ) bbox.xMax = glyph_bbox.xMax;
    -    if ( glyph_bbox.yMax > bbox.yMax ) bbox.yMax = glyph_bbox.yMax;
    -  }
    -  /* check that we really grew the string bbox */
    -  if ( bbox.xMin > bbox.xMax ) {
    -    bbox.xMin = 0; bbox.yMin = 0; bbox.xMax = 0; bbox.yMax = 0;
    -  }
    -  return bbox;
    +    int right_side = 0;
    +    for (size_t n = 0; n < glyphs.size(); n++)
    +    {
    +        FT_BBox glyph_bbox;
    +        FT_Glyph_Get_CBox(glyphs[n], ft_glyph_bbox_subpixels, &glyph_bbox);
    +        if (glyph_bbox.xMin < bbox.xMin) bbox.xMin = glyph_bbox.xMin;
    +        if (glyph_bbox.yMin < bbox.yMin) bbox.yMin = glyph_bbox.yMin;
    +        if (glyph_bbox.xMin == glyph_bbox.xMax)
    +        {
    +            right_side += glyphs[n]->advance.x >> 10;
    +            if (right_side > bbox.xMax) bbox.xMax = right_side;
    +        }
    +        else
    +        {
    +            if (glyph_bbox.xMax > bbox.xMax) bbox.xMax = glyph_bbox.xMax;
    +        }
    +        if (glyph_bbox.yMax > bbox.yMax) bbox.yMax = glyph_bbox.yMax;
    +    }
    +    /* check that we really grew the string bbox */
    +    if (bbox.xMin > bbox.xMax)
    +    {
    +        bbox.xMin = 0;
    +        bbox.yMin = 0;
    +        bbox.xMax = 0;
    +        bbox.yMax = 0;
    +    }
    +    return bbox;
     }
     
     
     char FT2Font::get_kerning__doc__[] =
    -"dx = get_kerning(left, right, mode)\n"
    -"\n"
    -"Get the kerning between left char and right glyph indices\n"
    -"mode is a kerning mode constant\n"
    -"  KERNING_DEFAULT  - Return scaled and grid-fitted kerning distances\n"
    -"  KERNING_UNFITTED - Return scaled but un-grid-fitted kerning distances\n"
    -"  KERNING_UNSCALED - Return the kerning vector in original font units\n"
    -;
    -Py::Object
    -FT2Font::get_kerning(const Py::Tuple & args) {
    -  _VERBOSE("FT2Font::get_kerning");
    -  args.verify_length(3);
    -  int left = Py::Int(args[0]);
    -  int right = Py::Int(args[1]);
    -  int mode = Py::Int(args[2]);
    -
    -
    -  if (!FT_HAS_KERNING( face )) return Py::Int(0);
    -  FT_Vector delta;
    -
    -  if (!FT_Get_Kerning( face, left, right, mode, &delta )) {
    -    return Py::Int(delta.x / HORIZ_HINTING);
    -  }
    -  else {
    -    return Py::Int(0);
    +    "dx = get_kerning(left, right, mode)\n"
    +    "\n"
    +    "Get the kerning between left char and right glyph indices\n"
    +    "mode is a kerning mode constant\n"
    +    "  KERNING_DEFAULT  - Return scaled and grid-fitted kerning distances\n"
    +    "  KERNING_UNFITTED - Return scaled but un-grid-fitted kerning distances\n"
    +    "  KERNING_UNSCALED - Return the kerning vector in original font units\n"
    +    ;
    +Py::Object
    +FT2Font::get_kerning(const Py::Tuple & args)
    +{
    +    _VERBOSE("FT2Font::get_kerning");
    +    args.verify_length(3);
    +    int left = Py::Int(args[0]);
    +    int right = Py::Int(args[1]);
    +    int mode = Py::Int(args[2]);
     
    -  }
    +
    +    if (!FT_HAS_KERNING(face))
    +    {
    +        return Py::Int(0);
    +    }
    +    FT_Vector delta;
    +
    +    if (!FT_Get_Kerning(face, left, right, mode, &delta))
    +    {
    +        return Py::Int(delta.x / HORIZ_HINTING);
    +    }
    +    else
    +    {
    +        return Py::Int(0);
    +
    +    }
     }
     
     
     
     char FT2Font::set_text__doc__[] =
    -"set_text(s, angle)\n"
    -"\n"
    -"Set the text string and angle.\n"
    -"You must call this before draw_glyphs_to_bitmap\n"
    -"A sequence of x,y positions is returned";
    -Py::Object
    -FT2Font::set_text(const Py::Tuple & args, const Py::Dict & kwargs) {
    -  _VERBOSE("FT2Font::set_text");
    -  args.verify_length(2);
    -
    -
    -  Py::String text( args[0] );
    -  std::string stdtext="";
    -  Py_UNICODE* pcode=NULL;
    -  size_t N = 0;
    -  if (PyUnicode_Check(text.ptr())) {
    -    pcode = PyUnicode_AsUnicode(text.ptr());
    -    N = PyUnicode_GetSize(text.ptr());
    -  }
    -  else {
    -    stdtext = text.as_std_string();
    -    N = stdtext.size();
    -  }
    -
    -
    -  angle = Py::Float(args[1]);
    -
    -  angle = angle/360.0*2*3.14159;
    -
    -  long flags = FT_LOAD_FORCE_AUTOHINT;
    -  if (kwargs.hasKey("flags"))
    -    flags = Py::Long(kwargs["flags"]);
    -
    -  //this computes width and height in subpixels so we have to divide by 64
    -  matrix.xx = (FT_Fixed)( cos( angle ) * 0x10000L );
    -  matrix.xy = (FT_Fixed)(-sin( angle ) * 0x10000L );
    -  matrix.yx = (FT_Fixed)( sin( angle ) * 0x10000L );
    -  matrix.yy = (FT_Fixed)( cos( angle ) * 0x10000L );
    -
    -  FT_Bool use_kerning = FT_HAS_KERNING( face );
    -  FT_UInt previous = 0;
    -
    -  glyphs.resize(0);
    -  pen.x = 0;
    -  pen.y = 0;
    -
    -  Py::Tuple xys(N);
    -  for ( unsigned int n = 0; n < N; n++ ) {
    -    std::string thischar("?");
    -    FT_UInt glyph_index;
    -
    -
    -    if (pcode==NULL) {
    -      // plain ol string
    -      thischar = stdtext[n];
    -      glyph_index = FT_Get_Char_Index( face, stdtext[n] );
    -     }
    -    else {
    -      //unicode
    -      glyph_index = FT_Get_Char_Index( face, pcode[n] );
    -    }
    -
    -    // retrieve kerning distance and move pen position
    -    if ( use_kerning && previous && glyph_index ) {
    -      FT_Vector delta;
    -      FT_Get_Kerning( face, previous, glyph_index,
    -                      FT_KERNING_DEFAULT, &delta );
    -      pen.x += delta.x / HORIZ_HINTING;
    -    }
    -    error = FT_Load_Glyph( face, glyph_index, flags );
    -    if ( error ) {
    -      std::cerr << "\tcould not load glyph for " << thischar << std::endl;
    -      continue;
    +    "set_text(s, angle)\n"
    +    "\n"
    +    "Set the text string and angle.\n"
    +    "You must call this before draw_glyphs_to_bitmap\n"
    +    "A sequence of x,y positions is returned";
    +Py::Object
    +FT2Font::set_text(const Py::Tuple & args, const Py::Dict & kwargs)
    +{
    +    _VERBOSE("FT2Font::set_text");
    +    args.verify_length(2);
    +
    +
    +    Py::String text(args[0]);
    +    std::string stdtext = "";
    +    Py_UNICODE* pcode = NULL;
    +    size_t N = 0;
    +    if (PyUnicode_Check(text.ptr()))
    +    {
    +        pcode = PyUnicode_AsUnicode(text.ptr());
    +        N = PyUnicode_GetSize(text.ptr());
    +    }
    +    else
    +    {
    +        stdtext = text.as_std_string();
    +        N = stdtext.size();
         }
    -    // ignore errors, jump to next glyph
     
    -    // extract glyph image and store it in our table
     
    -    FT_Glyph thisGlyph;
    -    error = FT_Get_Glyph( face->glyph, &thisGlyph );
    +    angle = Py::Float(args[1]);
     
    -    if ( error ) {
    -      std::cerr << "\tcould not get glyph for " << thischar << std::endl;
    -      continue;
    -    }
    -    // ignore errors, jump to next glyph
    -
    -    FT_Glyph_Transform( thisGlyph, 0, &pen);
    -    Py::Tuple xy(2);
    -    xy[0] = Py::Float(pen.x);
    -    xy[1] = Py::Float(pen.y);
    -    xys[n] = xy;
    -    pen.x += face->glyph->advance.x;
    +    angle = angle / 360.0 * 2 * 3.14159;
     
    -    previous = glyph_index;
    -    glyphs.push_back(thisGlyph);
    -  }
    +    long flags = FT_LOAD_FORCE_AUTOHINT;
    +    if (kwargs.hasKey("flags"))
    +    {
    +        flags = Py::Long(kwargs["flags"]);
    +    }
    +
    +    //this computes width and height in subpixels so we have to divide by 64
    +    matrix.xx = (FT_Fixed)(cos(angle) * 0x10000L);
    +    matrix.xy = (FT_Fixed)(-sin(angle) * 0x10000L);
    +    matrix.yx = (FT_Fixed)(sin(angle) * 0x10000L);
    +    matrix.yy = (FT_Fixed)(cos(angle) * 0x10000L);
    +
    +    FT_Bool use_kerning = FT_HAS_KERNING(face);
    +    FT_UInt previous = 0;
    +
    +    glyphs.resize(0);
    +    pen.x = 0;
    +    pen.y = 0;
    +
    +    Py::Tuple xys(N);
    +    for (unsigned int n = 0; n < N; n++)
    +    {
    +        std::string thischar("?");
    +        FT_UInt glyph_index;
    +
    +
    +        if (pcode == NULL)
    +        {
    +            // plain ol string
    +            thischar = stdtext[n];
    +            glyph_index = FT_Get_Char_Index(face, stdtext[n]);
    +        }
    +        else
    +        {
    +            //unicode
    +            glyph_index = FT_Get_Char_Index(face, pcode[n]);
    +        }
    +
    +        // retrieve kerning distance and move pen position
    +        if (use_kerning && previous && glyph_index)
    +        {
    +            FT_Vector delta;
    +            FT_Get_Kerning(face, previous, glyph_index,
    +                           FT_KERNING_DEFAULT, &delta);
    +            pen.x += delta.x / HORIZ_HINTING;
    +        }
    +        error = FT_Load_Glyph(face, glyph_index, flags);
    +        if (error)
    +        {
    +            std::cerr << "\tcould not load glyph for " << thischar << std::endl;
    +            continue;
    +        }
    +        // ignore errors, jump to next glyph
    +
    +        // extract glyph image and store it in our table
    +
    +        FT_Glyph thisGlyph;
    +        error = FT_Get_Glyph(face->glyph, &thisGlyph);
     
    -  // now apply the rotation
    -  for (unsigned int n=0; nglyph->advance.x;
    +
    +        previous = glyph_index;
    +        glyphs.push_back(thisGlyph);
    +    }
    +
    +    // now apply the rotation
    +    for (unsigned int n = 0; n < glyphs.size(); n++)
    +    {
    +        FT_Glyph_Transform(glyphs[n], &matrix, 0);
    +    }
     
    -  _VERBOSE("FT2Font::set_text done");
    -  return xys;
    +    _VERBOSE("FT2Font::set_text done");
    +    return xys;
     }
     
     char FT2Font::get_num_glyphs__doc__[] =
    -"get_num_glyphs()\n"
    -"\n"
    -"Return the number of loaded glyphs\n"
    -;
    -Py::Object
    -FT2Font::get_num_glyphs(const Py::Tuple & args){
    -  _VERBOSE("FT2Font::get_num_glyphs");
    -  args.verify_length(0);
    +    "get_num_glyphs()\n"
    +    "\n"
    +    "Return the number of loaded glyphs\n"
    +    ;
    +Py::Object
    +FT2Font::get_num_glyphs(const Py::Tuple & args)
    +{
    +    _VERBOSE("FT2Font::get_num_glyphs");
    +    args.verify_length(0);
     
    -  return Py::Int((long)glyphs.size());
    +    return Py::Int((long)glyphs.size());
     }
     
     char FT2Font::load_char__doc__[] =
    -"load_char(charcode, flags=LOAD_FORCE_AUTOHINT)\n"
    -"\n"
    -"Load character with charcode in current fontfile and set glyph.\n"
    -"The flags argument can be a bitwise-or of the LOAD_XXX constants.\n"
    -"Return value is a Glyph object, with attributes\n"
    -"  width          # glyph width\n"
    -"  height         # glyph height\n"
    -"  bbox           # the glyph bbox (xmin, ymin, xmax, ymax)\n"
    -"  horiBearingX   # left side bearing in horizontal layouts\n"
    -"  horiBearingY   # top side bearing in horizontal layouts\n"
    -"  horiAdvance    # advance width for horizontal layout\n"
    -"  vertBearingX   # left side bearing in vertical layouts\n"
    -"  vertBearingY   # top side bearing in vertical layouts\n"
    -"  vertAdvance    # advance height for vertical layout\n"
    -;
    -Py::Object
    -FT2Font::load_char(const Py::Tuple & args, const Py::Dict & kwargs) {
    -  _VERBOSE("FT2Font::load_char");
    -  //load a char using the unsigned long charcode
    -
    -  args.verify_length(1);
    -  long charcode = Py::Long(args[0]), flags = Py::Long(FT_LOAD_FORCE_AUTOHINT);
    -  if (kwargs.hasKey("flags"))
    -    flags = Py::Long(kwargs["flags"]);
    -
    -  int error = FT_Load_Char( face, (unsigned long)charcode, flags);
    -
    -  if (error)
    -    throw Py::RuntimeError(Printf("Could not load charcode %d", charcode).str());
    -
    -  FT_Glyph thisGlyph;
    -  error = FT_Get_Glyph( face->glyph, &thisGlyph );
    -
    -  if (error)
    -    throw Py::RuntimeError(Printf("Could not get glyph for char %d", charcode).str());
    -
    -  size_t num = glyphs.size();  //the index into the glyphs list
    -  glyphs.push_back(thisGlyph);
    -  Glyph* gm = new Glyph(face, thisGlyph, num);
    -  return Py::asObject(gm);
    +    "load_char(charcode, flags=LOAD_FORCE_AUTOHINT)\n"
    +    "\n"
    +    "Load character with charcode in current fontfile and set glyph.\n"
    +    "The flags argument can be a bitwise-or of the LOAD_XXX constants.\n"
    +    "Return value is a Glyph object, with attributes\n"
    +    "  width          # glyph width\n"
    +    "  height         # glyph height\n"
    +    "  bbox           # the glyph bbox (xmin, ymin, xmax, ymax)\n"
    +    "  horiBearingX   # left side bearing in horizontal layouts\n"
    +    "  horiBearingY   # top side bearing in horizontal layouts\n"
    +    "  horiAdvance    # advance width for horizontal layout\n"
    +    "  vertBearingX   # left side bearing in vertical layouts\n"
    +    "  vertBearingY   # top side bearing in vertical layouts\n"
    +    "  vertAdvance    # advance height for vertical layout\n"
    +    ;
    +Py::Object
    +FT2Font::load_char(const Py::Tuple & args, const Py::Dict & kwargs)
    +{
    +    _VERBOSE("FT2Font::load_char");
    +    //load a char using the unsigned long charcode
    +
    +    args.verify_length(1);
    +    long charcode = Py::Long(args[0]), flags = Py::Long(FT_LOAD_FORCE_AUTOHINT);
    +    if (kwargs.hasKey("flags"))
    +    {
    +        flags = Py::Long(kwargs["flags"]);
    +    }
    +
    +    int error = FT_Load_Char(face, (unsigned long)charcode, flags);
    +
    +    if (error)
    +    {
    +        throw Py::RuntimeError(Printf("Could not load charcode %d", charcode).str());
    +    }
    +
    +    FT_Glyph thisGlyph;
    +    error = FT_Get_Glyph(face->glyph, &thisGlyph);
    +
    +    if (error)
    +    {
    +        throw Py::RuntimeError(Printf("Could not get glyph for char %d", charcode).str());
    +    }
    +
    +    size_t num = glyphs.size();  //the index into the glyphs list
    +    glyphs.push_back(thisGlyph);
    +    Glyph* gm = new Glyph(face, thisGlyph, num);
    +    return Py::asObject(gm);
    +}
    +
    +
    +char FT2Font::load_glyph__doc__[] =
    +    "load_glyph(glyphindex, flags=LOAD_FORCE_AUTOHINT)\n"
    +    "\n"
    +    "Load character with glyphindex in current fontfile and set glyph.\n"
    +    "The flags argument can be a bitwise-or of the LOAD_XXX constants.\n"
    +    "Return value is a Glyph object, with attributes\n"
    +    "  width          # glyph width\n"
    +    "  height         # glyph height\n"
    +    "  bbox           # the glyph bbox (xmin, ymin, xmax, ymax)\n"
    +    "  horiBearingX   # left side bearing in horizontal layouts\n"
    +    "  horiBearingY   # top side bearing in horizontal layouts\n"
    +    "  horiAdvance    # advance width for horizontal layout\n"
    +    "  vertBearingX   # left side bearing in vertical layouts\n"
    +    "  vertBearingY   # top side bearing in vertical layouts\n"
    +    "  vertAdvance    # advance height for vertical layout\n"
    +    ;
    +Py::Object
    +FT2Font::load_glyph(const Py::Tuple & args, const Py::Dict & kwargs)
    +{
    +    _VERBOSE("FT2Font::load_glyph");
    +    //load a char using the unsigned long charcode
    +
    +    args.verify_length(1);
    +    long glyph_index = Py::Long(args[0]), flags = Py::Long(FT_LOAD_FORCE_AUTOHINT);
    +    if (kwargs.hasKey("flags"))
    +    {
    +        flags = Py::Long(kwargs["flags"]);
    +    }
    +
    +    int error = FT_Load_Glyph(face, glyph_index, flags);
    +
    +    if (error)
    +    {
    +        throw Py::RuntimeError(Printf("Could not load glyph index %d", glyph_index).str());
    +    }
    +
    +    FT_Glyph thisGlyph;
    +    error = FT_Get_Glyph(face->glyph, &thisGlyph);
    +
    +    if (error)
    +    {
    +        throw Py::RuntimeError(Printf("Could not get glyph for glyph index %d", glyph_index).str());
    +    }
    +
    +    size_t num = glyphs.size();  //the index into the glyphs list
    +    glyphs.push_back(thisGlyph);
    +    Glyph* gm = new Glyph(face, thisGlyph, num);
    +    return Py::asObject(gm);
     }
     
    +
     char FT2Font::get_width_height__doc__[] =
    -"w, h = get_width_height()\n"
    -"\n"
    -"Get the width and height in 26.6 subpixels of the current string set by set_text\n"
    -"The rotation of the string is accounted for.  To get width and height\n"
    -"in pixels, divide these values by 64\n"
    -;
    -Py::Object
    -FT2Font::get_width_height(const Py::Tuple & args) {
    -  _VERBOSE("FT2Font::get_width_height");
    -  args.verify_length(0);
    -
    -  FT_BBox bbox = compute_string_bbox();
    -
    -  Py::Tuple ret(2);
    -  ret[0] = Py::Int(bbox.xMax - bbox.xMin);
    -  ret[1] = Py::Int(bbox.yMax - bbox.yMin);
    -  return ret;
    +    "w, h = get_width_height()\n"
    +    "\n"
    +    "Get the width and height in 26.6 subpixels of the current string set by set_text\n"
    +    "The rotation of the string is accounted for.  To get width and height\n"
    +    "in pixels, divide these values by 64\n"
    +    ;
    +Py::Object
    +FT2Font::get_width_height(const Py::Tuple & args)
    +{
    +    _VERBOSE("FT2Font::get_width_height");
    +    args.verify_length(0);
    +
    +    FT_BBox bbox = compute_string_bbox();
    +
    +    Py::Tuple ret(2);
    +    ret[0] = Py::Int(bbox.xMax - bbox.xMin);
    +    ret[1] = Py::Int(bbox.yMax - bbox.yMin);
    +    return ret;
     }
     
     char FT2Font::get_descent__doc__[] =
    -"d = get_descent()\n"
    -"\n"
    -"Get the descent of the current string set by set_text in 26.6 subpixels.\n"
    -"The rotation of the string is accounted for.  To get the descent\n"
    -"in pixels, divide this value by 64.\n"
    -;
    -Py::Object
    -FT2Font::get_descent(const Py::Tuple & args) {
    -  _VERBOSE("FT2Font::get_descent");
    -  args.verify_length(0);
    +    "d = get_descent()\n"
    +    "\n"
    +    "Get the descent of the current string set by set_text in 26.6 subpixels.\n"
    +    "The rotation of the string is accounted for.  To get the descent\n"
    +    "in pixels, divide this value by 64.\n"
    +    ;
    +Py::Object
    +FT2Font::get_descent(const Py::Tuple & args)
    +{
    +    _VERBOSE("FT2Font::get_descent");
    +    args.verify_length(0);
     
    -  FT_BBox bbox = compute_string_bbox();
    -  return Py::Int(- bbox.yMin);;
    +    FT_BBox bbox = compute_string_bbox();
    +    return Py::Int(- bbox.yMin);;
     }
     
     char FT2Font::draw_glyphs_to_bitmap__doc__[] =
    -"draw_glyphs_to_bitmap()\n"
    -"\n"
    -"Draw the glyphs that were loaded by set_text to the bitmap\n"
    -"The bitmap size will be automatically set to include the glyphs\n"
    -;
    -Py::Object
    -FT2Font::draw_glyphs_to_bitmap(const Py::Tuple & args) {
    -
    -  _VERBOSE("FT2Font::draw_glyphs_to_bitmap");
    -  args.verify_length(0);
    -
    -  FT_BBox string_bbox = compute_string_bbox();
    -  size_t width = (string_bbox.xMax-string_bbox.xMin) / 64 + 2;
    -  size_t height = (string_bbox.yMax-string_bbox.yMin) / 64 + 2;
    -
    -  Py_XDECREF(image);
    -  image = NULL;
    -  image = new FT2Image(width, height);
    -
    -  for ( size_t n = 0; n < glyphs.size(); n++ )
    -    {
    -      FT_BBox bbox;
    -      FT_Glyph_Get_CBox(glyphs[n], ft_glyph_bbox_pixels, &bbox);
    -
    -      error = FT_Glyph_To_Bitmap(&glyphs[n],
    -                                 ft_render_mode_normal,
    -                                 0,
    -                                 1
    -                                 );
    -      if (error)
    -        throw Py::RuntimeError("Could not convert glyph to bitmap");
    +    "draw_glyphs_to_bitmap()\n"
    +    "\n"
    +    "Draw the glyphs that were loaded by set_text to the bitmap\n"
    +    "The bitmap size will be automatically set to include the glyphs\n"
    +    ;
    +Py::Object
    +FT2Font::draw_glyphs_to_bitmap(const Py::Tuple & args)
    +{
    +
    +    _VERBOSE("FT2Font::draw_glyphs_to_bitmap");
    +    args.verify_length(0);
     
    -      FT_BitmapGlyph bitmap = (FT_BitmapGlyph)glyphs[n];
    -      // now, draw to our target surface (convert position)
    +    FT_BBox string_bbox = compute_string_bbox();
    +    size_t width = (string_bbox.xMax - string_bbox.xMin) / 64 + 2;
    +    size_t height = (string_bbox.yMax - string_bbox.yMin) / 64 + 2;
    +
    +    Py_XDECREF(image);
    +    image = NULL;
    +    image = new FT2Image(width, height);
     
    -      //bitmap left and top in pixel, string bbox in subpixel
    -      FT_Int x = (FT_Int)(bitmap->left - (string_bbox.xMin / 64.));
    -      FT_Int y = (FT_Int)((string_bbox.yMax / 64.) - bitmap->top + 1);
    +    for (size_t n = 0; n < glyphs.size(); n++)
    +    {
    +        FT_BBox bbox;
    +        FT_Glyph_Get_CBox(glyphs[n], ft_glyph_bbox_pixels, &bbox);
    +
    +        error = FT_Glyph_To_Bitmap(&glyphs[n],
    +                                   ft_render_mode_normal,
    +                                   0,
    +                                   1
    +                                  );
    +        if (error)
    +        {
    +            throw Py::RuntimeError("Could not convert glyph to bitmap");
    +        }
    +
    +        FT_BitmapGlyph bitmap = (FT_BitmapGlyph)glyphs[n];
    +        // now, draw to our target surface (convert position)
    +
    +        //bitmap left and top in pixel, string bbox in subpixel
    +        FT_Int x = (FT_Int)(bitmap->left - (string_bbox.xMin / 64.));
    +        FT_Int y = (FT_Int)((string_bbox.yMax / 64.) - bitmap->top + 1);
     
    -      image->draw_bitmap( &bitmap->bitmap, x, y);
    +        image->draw_bitmap(&bitmap->bitmap, x, y);
         }
     
    -  return Py::Object();
    +    return Py::Object();
     }
     
     
     char FT2Font::get_xys__doc__[] =
    -"get_xys()\n"
    -"\n"
    -"Get the xy locations of the current glyphs\n"
    -;
    +    "get_xys()\n"
    +    "\n"
    +    "Get the xy locations of the current glyphs\n"
    +    ;
     Py::Object
    -FT2Font::get_xys(const Py::Tuple & args) {
    +FT2Font::get_xys(const Py::Tuple & args)
    +{
     
    -  _VERBOSE("FT2Font::get_xys");
    -  args.verify_length(0);
    +    _VERBOSE("FT2Font::get_xys");
    +    args.verify_length(0);
     
    -  FT_BBox string_bbox = compute_string_bbox();
    -  Py::Tuple xys(glyphs.size());
    +    FT_BBox string_bbox = compute_string_bbox();
    +    Py::Tuple xys(glyphs.size());
     
    -  for ( size_t n = 0; n < glyphs.size(); n++ )
    +    for (size_t n = 0; n < glyphs.size(); n++)
         {
     
    -      FT_BBox bbox;
    -      FT_Glyph_Get_CBox(glyphs[n], ft_glyph_bbox_pixels, &bbox);
    +        FT_BBox bbox;
    +        FT_Glyph_Get_CBox(glyphs[n], ft_glyph_bbox_pixels, &bbox);
     
    -      error = FT_Glyph_To_Bitmap(&glyphs[n],
    -                                 ft_render_mode_normal,
    -                                 0,
    -                                 1
    -                                 );
    -      if (error)
    -        throw Py::RuntimeError("Could not convert glyph to bitmap");
    +        error = FT_Glyph_To_Bitmap(&glyphs[n],
    +                                   ft_render_mode_normal,
    +                                   0,
    +                                   1
    +                                  );
    +        if (error)
    +        {
    +            throw Py::RuntimeError("Could not convert glyph to bitmap");
    +        }
     
    -      FT_BitmapGlyph bitmap = (FT_BitmapGlyph)glyphs[n];
    +        FT_BitmapGlyph bitmap = (FT_BitmapGlyph)glyphs[n];
     
     
    -      //bitmap left and top in pixel, string bbox in subpixel
    -      FT_Int x = (FT_Int)(bitmap->left-string_bbox.xMin/64.);
    -      FT_Int y = (FT_Int)(string_bbox.yMax/64.-bitmap->top+1);
    -      //make sure the index is non-neg
    -      x = x<0?0:x;
    -      y = y<0?0:y;
    -      Py::Tuple xy(2);
    -      xy[0] = Py::Float(x);
    -      xy[1] = Py::Float(y);
    -      xys[n] = xy;
    +        //bitmap left and top in pixel, string bbox in subpixel
    +        FT_Int x = (FT_Int)(bitmap->left - string_bbox.xMin / 64.);
    +        FT_Int y = (FT_Int)(string_bbox.yMax / 64. - bitmap->top + 1);
    +        //make sure the index is non-neg
    +        x = x < 0 ? 0 : x;
    +        y = y < 0 ? 0 : y;
    +        Py::Tuple xy(2);
    +        xy[0] = Py::Float(x);
    +        xy[1] = Py::Float(y);
    +        xys[n] = xy;
         }
     
    -  return xys;
    +    return xys;
     }
     
     char FT2Font::draw_glyph_to_bitmap__doc__[] =
    -"draw_glyph_to_bitmap(bitmap, x, y, glyph)\n"
    -"\n"
    -"Draw a single glyph to the bitmap at pixel locations x,y\n"
    -"Note it is your responsibility to set up the bitmap manually\n"
    -"with set_bitmap_size(w,h) before this call is made.\n"
    -"\n"
    -"If you want automatic layout, use set_text in combinations with\n"
    -"draw_glyphs_to_bitmap.  This function is intended for people who\n"
    -"want to render individual glyphs at precise locations, eg, a\n"
    -"a glyph returned by load_char\n";
    -
    -Py::Object
    -FT2Font::draw_glyph_to_bitmap(const Py::Tuple & args) {
    -  _VERBOSE("FT2Font::draw_glyph_to_bitmap");
    -  args.verify_length(4);
    -
    -  if (!FT2Image::check(args[0].ptr()))
    -    throw Py::TypeError("Usage: draw_glyph_to_bitmap(bitmap, x,y,glyph)");
    -  FT2Image* im = static_cast(args[0].ptr());
    -
    -  double xd = Py::Float(args[1]);
    -  double yd = Py::Float(args[2]);
    -  long x = (long)xd;
    -  long y = (long)yd;
    -  FT_Vector sub_offset;
    -  sub_offset.x = int(-(xd - (double)x) * 64.0);
    -  sub_offset.y = int(-(yd - (double)y) * 64.0);
    -
    -  if (!Glyph::check(args[3].ptr()))
    -    throw Py::TypeError("Usage: draw_glyph_to_bitmap(bitmap, x,y,glyph)");
    -  Glyph* glyph = static_cast(args[3].ptr());
    -
    -  if ((size_t)glyph->glyphInd >= glyphs.size())
    -    throw Py::ValueError("glyph num is out of range");
    -
    -  error = FT_Glyph_To_Bitmap(&glyphs[glyph->glyphInd],
    -                             ft_render_mode_normal,
    -                             &sub_offset,  //no additional translation
    -                             1   //destroy image;
    -                             );
    -  if (error)
    -    throw Py::RuntimeError("Could not convert glyph to bitmap");
    +    "draw_glyph_to_bitmap(bitmap, x, y, glyph)\n"
    +    "\n"
    +    "Draw a single glyph to the bitmap at pixel locations x,y\n"
    +    "Note it is your responsibility to set up the bitmap manually\n"
    +    "with set_bitmap_size(w,h) before this call is made.\n"
    +    "\n"
    +    "If you want automatic layout, use set_text in combinations with\n"
    +    "draw_glyphs_to_bitmap.  This function is intended for people who\n"
    +    "want to render individual glyphs at precise locations, eg, a\n"
    +    "a glyph returned by load_char\n";
     
    -  FT_BitmapGlyph bitmap = (FT_BitmapGlyph)glyphs[glyph->glyphInd];
    +Py::Object
    +FT2Font::draw_glyph_to_bitmap(const Py::Tuple & args)
    +{
    +    _VERBOSE("FT2Font::draw_glyph_to_bitmap");
    +    args.verify_length(4);
    +
    +    if (!FT2Image::check(args[0].ptr()))
    +    {
    +        throw Py::TypeError("Usage: draw_glyph_to_bitmap(bitmap, x,y,glyph)");
    +    }
    +    FT2Image* im = static_cast(args[0].ptr());
    +
    +    double xd = Py::Float(args[1]);
    +    double yd = Py::Float(args[2]);
    +    long x = (long)xd;
    +    long y = (long)yd;
    +    FT_Vector sub_offset;
    +    sub_offset.x = 0; // int((xd - (double)x) * 64.0);
    +    sub_offset.y = 0; // int((yd - (double)y) * 64.0);
    +
    +    if (!Glyph::check(args[3].ptr()))
    +    {
    +        throw Py::TypeError("Usage: draw_glyph_to_bitmap(bitmap, x,y,glyph)");
    +    }
    +    Glyph* glyph = static_cast(args[3].ptr());
    +
    +    if ((size_t)glyph->glyphInd >= glyphs.size())
    +    {
    +        throw Py::ValueError("glyph num is out of range");
    +    }
    +
    +    error = FT_Glyph_To_Bitmap(&glyphs[glyph->glyphInd],
    +                               ft_render_mode_normal,
    +                               &sub_offset,  //no additional translation
    +                               1   //destroy image;
    +                              );
    +    if (error)
    +    {
    +        throw Py::RuntimeError("Could not convert glyph to bitmap");
    +    }
    +
    +    FT_BitmapGlyph bitmap = (FT_BitmapGlyph)glyphs[glyph->glyphInd];
     
    -  im->draw_bitmap( &bitmap->bitmap, x + bitmap->left, y);
    -  return Py::Object();
    +    im->draw_bitmap(&bitmap->bitmap, x + bitmap->left, y);
    +    return Py::Object();
     }
     
     char FT2Font::get_glyph_name__doc__[] =
    -"get_glyph_name(index)\n"
    -"\n"
    -"Retrieves the ASCII name of a given glyph in a face.\n"
    -;
    -Py::Object
    -FT2Font::get_glyph_name(const Py::Tuple & args) {
    -  _VERBOSE("FT2Font::get_glyph_name");
    -  args.verify_length(1);
    -
    -  if (!FT_HAS_GLYPH_NAMES(face))
    -    throw Py::RuntimeError("Face has no glyph names");
    -
    -  char buffer[128];
    -  if (FT_Get_Glyph_Name(face, (FT_UInt) Py::Int(args[0]), buffer, 128))
    -    throw Py::RuntimeError("Could not get glyph names.");
    -  return Py::String(buffer);
    +    "get_glyph_name(index)\n"
    +    "\n"
    +    "Retrieves the ASCII name of a given glyph in a face.\n"
    +    ;
    +Py::Object
    +FT2Font::get_glyph_name(const Py::Tuple & args)
    +{
    +    _VERBOSE("FT2Font::get_glyph_name");
    +    args.verify_length(1);
    +
    +    if (!FT_HAS_GLYPH_NAMES(face))
    +    {
    +        throw Py::RuntimeError("Face has no glyph names");
    +    }
    +
    +    char buffer[128];
    +    if (FT_Get_Glyph_Name(face, (FT_UInt) Py::Int(args[0]), buffer, 128))
    +    {
    +        throw Py::RuntimeError("Could not get glyph names.");
    +    }
    +    return Py::String(buffer);
     }
     
     char FT2Font::get_charmap__doc__[] =
    -"get_charmap()\n"
    -"\n"
    -"Returns a dictionary that maps the character codes of the selected charmap\n"
    -"(Unicode by default) to their corresponding glyph indices.\n"
    -;
    -Py::Object
    -FT2Font::get_charmap(const Py::Tuple & args) {
    -  _VERBOSE("FT2Font::get_charmap");
    -  args.verify_length(0);
    -
    -  FT_UInt index;
    -  Py::Dict charmap;
    -
    -  FT_ULong code = FT_Get_First_Char(face, &index);
    -  while (index != 0) {
    -    charmap[Py::Long((long) code)] = Py::Int((int) index);
    -    code = FT_Get_Next_Char(face, code, &index);
    -  }
    -  return charmap;
    +    "get_charmap()\n"
    +    "\n"
    +    "Returns a dictionary that maps the character codes of the selected charmap\n"
    +    "(Unicode by default) to their corresponding glyph indices.\n"
    +    ;
    +Py::Object
    +FT2Font::get_charmap(const Py::Tuple & args)
    +{
    +    _VERBOSE("FT2Font::get_charmap");
    +    args.verify_length(0);
    +
    +    FT_UInt index;
    +    Py::Dict charmap;
    +
    +    //std::cout << "asd" << face->charmaps[1]->encoding << std::endl;
    +    FT_ULong code = FT_Get_First_Char(face, &index);
    +    while (index != 0)
    +    {
    +        charmap[Py::Long((long) code)] = Py::Int((int) index);
    +        code = FT_Get_Next_Char(face, code, &index);
    +    }
    +    return charmap;
     }
     
     
    @@ -1362,575 +1582,606 @@
     // 8         Designer             e.g. "Apple Computer"
     
     char FT2Font::get_sfnt__doc__[] =
    -"get_sfnt(name)\n"
    -"\n"
    -"Get all values from the SFNT names table.  Result is a dictionary whose"
    -"key is the platform-ID, ISO-encoding-scheme, language-code, and"
    -"description.\n"
    -/*
    -  "The font name identifier codes are:\n"
    -  "\n"
    -  "  0    Copyright notice     e.g. Copyright Apple Computer, Inc. 1992\n"
    -  "  1    Font family name     e.g. New York\n"
    -  "  2    Font style           e.g. Bold\n"
    -  "  3    Font identification  e.g. Apple Computer New York Bold Ver 1\n"
    -  "  4    Full font name       e.g. New York Bold\n"
    -  "  5    Version string       e.g. August 10, 1991, 1.08d21\n"
    -  "  6    Postscript name      e.g. Times-Bold\n"
    -  "  7    Trademark            \n"
    -  "  8    Designer             e.g. Apple Computer\n"
    -  "  11   URL                  e.g. http://www.apple.com\n"
    -  "  13   Copyright license    \n"
    -*/
    -;
    -Py::Object
    -FT2Font::get_sfnt(const Py::Tuple & args) {
    -  _VERBOSE("FT2Font::get_sfnt");
    -  args.verify_length(0);
    -
    -  if (!(face->face_flags & FT_FACE_FLAG_SFNT))
    -    throw Py::RuntimeError("No SFNT name table");
    -
    -  size_t count = FT_Get_Sfnt_Name_Count(face);
    -
    -  Py::Dict names;
    -  for (size_t j = 0; j < count; j++) {
    -    FT_SfntName sfnt;
    -    FT_Error error = FT_Get_Sfnt_Name(face, j, &sfnt);
    +    "get_sfnt(name)\n"
    +    "\n"
    +    "Get all values from the SFNT names table.  Result is a dictionary whose"
    +    "key is the platform-ID, ISO-encoding-scheme, language-code, and"
    +    "description.\n"
    +    /*
    +      "The font name identifier codes are:\n"
    +      "\n"
    +      "  0    Copyright notice     e.g. Copyright Apple Computer, Inc. 1992\n"
    +      "  1    Font family name     e.g. New York\n"
    +      "  2    Font style           e.g. Bold\n"
    +      "  3    Font identification  e.g. Apple Computer New York Bold Ver 1\n"
    +      "  4    Full font name       e.g. New York Bold\n"
    +      "  5    Version string       e.g. August 10, 1991, 1.08d21\n"
    +      "  6    Postscript name      e.g. Times-Bold\n"
    +      "  7    Trademark            \n"
    +      "  8    Designer             e.g. Apple Computer\n"
    +      "  11   URL                  e.g. http://www.apple.com\n"
    +      "  13   Copyright license    \n"
    +    */
    +    ;
    +Py::Object
    +FT2Font::get_sfnt(const Py::Tuple & args)
    +{
    +    _VERBOSE("FT2Font::get_sfnt");
    +    args.verify_length(0);
     
    -    if (error)
    -      throw Py::RuntimeError("Could not get SFNT name");
    +    if (!(face->face_flags & FT_FACE_FLAG_SFNT))
    +    {
    +        throw Py::RuntimeError("No SFNT name table");
    +    }
    +
    +    size_t count = FT_Get_Sfnt_Name_Count(face);
    +
    +    Py::Dict names;
    +    for (size_t j = 0; j < count; j++)
    +    {
    +        FT_SfntName sfnt;
    +        FT_Error error = FT_Get_Sfnt_Name(face, j, &sfnt);
    +
    +        if (error)
    +        {
    +            throw Py::RuntimeError("Could not get SFNT name");
    +        }
     
    -    Py::Tuple key(4);
    -    key[0] = Py::Int(sfnt.platform_id);
    -    key[1] = Py::Int(sfnt.encoding_id);
    -    key[2] = Py::Int(sfnt.language_id);
    -    key[3] = Py::Int(sfnt.name_id);
    -    names[key] = Py::String((char *) sfnt.string,
    -                            (int) sfnt.string_len);
    -  }
    -  return names;
    +        Py::Tuple key(4);
    +        key[0] = Py::Int(sfnt.platform_id);
    +        key[1] = Py::Int(sfnt.encoding_id);
    +        key[2] = Py::Int(sfnt.language_id);
    +        key[3] = Py::Int(sfnt.name_id);
    +        names[key] = Py::String((char *) sfnt.string,
    +                                (int) sfnt.string_len);
    +    }
    +    return names;
     }
     
     char FT2Font::get_name_index__doc__[] =
    -"get_name_index(name)\n"
    -"\n"
    -"Returns the glyph index of a given glyph name.\n"
    -"The glyph index 0 means `undefined character code'.\n"
    -;
    -Py::Object
    -FT2Font::get_name_index(const Py::Tuple & args) {
    -  _VERBOSE("FT2Font::get_name_index");
    -  args.verify_length(1);
    -  std::string glyphname = Py::String(args[0]);
    +    "get_name_index(name)\n"
    +    "\n"
    +    "Returns the glyph index of a given glyph name.\n"
    +    "The glyph index 0 means `undefined character code'.\n"
    +    ;
    +Py::Object
    +FT2Font::get_name_index(const Py::Tuple & args)
    +{
    +    _VERBOSE("FT2Font::get_name_index");
    +    args.verify_length(1);
    +    std::string glyphname = Py::String(args[0]);
     
    -  return Py::Long((long)
    -                  FT_Get_Name_Index(face, (FT_String *) glyphname.c_str()));
    +    return Py::Long((long)
    +                    FT_Get_Name_Index(face, (FT_String *) glyphname.c_str()));
     }
     
     char FT2Font::get_ps_font_info__doc__[] =
    -"get_ps_font_info()\n"
    -"\n"
    -"Return the information in the PS Font Info structure.\n"
    -;
    +    "get_ps_font_info()\n"
    +    "\n"
    +    "Return the information in the PS Font Info structure.\n"
    +    ;
     Py::Object
     FT2Font::get_ps_font_info(const Py::Tuple & args)
     {
    -  _VERBOSE("FT2Font::get_ps_font_info");
    -  args.verify_length(0);
    -  PS_FontInfoRec fontinfo;
    -
    -  FT_Error error = FT_Get_PS_Font_Info(face, &fontinfo);
    -  if (error) {
    -    Py::RuntimeError("Could not get PS font info");
    -    return Py::Object();
    -  }
    +    _VERBOSE("FT2Font::get_ps_font_info");
    +    args.verify_length(0);
    +    PS_FontInfoRec fontinfo;
     
    -  Py::Tuple info(9);
    -  info[0] = Py::String(fontinfo.version ? fontinfo.version : "");
    -  info[1] = Py::String(fontinfo.notice ? fontinfo.notice : "");
    -  info[2] = Py::String(fontinfo.full_name ? fontinfo.full_name : "");
    -  info[3] = Py::String(fontinfo.family_name ? fontinfo.family_name : "");
    -  info[4] = Py::String(fontinfo.weight ? fontinfo.weight : "");
    -  info[5] = Py::Long(fontinfo.italic_angle);
    -  info[6] = Py::Int(fontinfo.is_fixed_pitch);
    -  info[7] = Py::Int(fontinfo.underline_position);
    -  info[8] = Py::Int(fontinfo.underline_thickness);
    -  return info;
    +    FT_Error error = FT_Get_PS_Font_Info(face, &fontinfo);
    +    if (error)
    +    {
    +        Py::RuntimeError("Could not get PS font info");
    +        return Py::Object();
    +    }
    +
    +    Py::Tuple info(9);
    +    info[0] = Py::String(fontinfo.version ? fontinfo.version : "");
    +    info[1] = Py::String(fontinfo.notice ? fontinfo.notice : "");
    +    info[2] = Py::String(fontinfo.full_name ? fontinfo.full_name : "");
    +    info[3] = Py::String(fontinfo.family_name ? fontinfo.family_name : "");
    +    info[4] = Py::String(fontinfo.weight ? fontinfo.weight : "");
    +    info[5] = Py::Long(fontinfo.italic_angle);
    +    info[6] = Py::Int(fontinfo.is_fixed_pitch);
    +    info[7] = Py::Int(fontinfo.underline_position);
    +    info[8] = Py::Int(fontinfo.underline_thickness);
    +    return info;
     }
     
     char FT2Font::get_sfnt_table__doc__[] =
    -"get_sfnt_table(name)\n"
    -"\n"
    -"Return one of the following SFNT tables: head, maxp, OS/2, hhea, "
    -"vhea, post, or pclt.\n"
    -;
    -Py::Object
    -FT2Font::get_sfnt_table(const Py::Tuple & args) {
    -  _VERBOSE("FT2Font::get_sfnt_table");
    -  args.verify_length(1);
    -  std::string tagname = Py::String(args[0]);
    -
    -  int tag;
    -  const char *tags[] = {"head", "maxp", "OS/2", "hhea",
    -                        "vhea", "post", "pclt",  NULL};
    -
    -  for (tag=0; tags[tag] != NULL; tag++)
    -    if (strcmp(tagname.c_str(), tags[tag]) == 0)
    -      break;
    +    "get_sfnt_table(name)\n"
    +    "\n"
    +    "Return one of the following SFNT tables: head, maxp, OS/2, hhea, "
    +    "vhea, post, or pclt.\n"
    +    ;
    +Py::Object
    +FT2Font::get_sfnt_table(const Py::Tuple & args)
    +{
    +    _VERBOSE("FT2Font::get_sfnt_table");
    +    args.verify_length(1);
    +    std::string tagname = Py::String(args[0]);
    +
    +    int tag;
    +    const char *tags[] = {"head", "maxp", "OS/2", "hhea",
    +                          "vhea", "post", "pclt",  NULL
    +                         };
     
    -  void *table = FT_Get_Sfnt_Table(face, (FT_Sfnt_Tag) tag);
    -  if (!table)
    -    return Py::Object();
    -  //throw Py::RuntimeError("Could not get SFNT table");
    +    for (tag = 0; tags[tag] != NULL; tag++)
    +    {
    +        if (strcmp(tagname.c_str(), tags[tag]) == 0)
    +        {
    +            break;
    +        }
    +    }
     
    -  switch (tag) {
    -  case 0:
    +    void *table = FT_Get_Sfnt_Table(face, (FT_Sfnt_Tag) tag);
    +    if (!table)
         {
    -      char head_dict[] = "{s:(h,h), s:(h,h), s:l, s:l, s:i, s:i,"
    -        "s:(l,l), s:(l,l), s:h, s:h, s:h, s:h, s:i, s:i, s:h, s:h, s:h}";
    -      TT_Header *t = (TT_Header *)table;
    -      return Py::asObject(Py_BuildValue(head_dict,
    -                                        "version",
    -                                        FIXED_MAJOR(t->Table_Version),
    -                                        FIXED_MINOR(t->Table_Version),
    -                                        "fontRevision",
    -                                        FIXED_MAJOR(t->Font_Revision),
    -                                        FIXED_MINOR(t->Font_Revision),
    -                                        "checkSumAdjustment", t->CheckSum_Adjust,
    -                                        "magicNumber" ,       t->Magic_Number,
    -                                        "flags",         (unsigned)t->Flags,
    -                                        "unitsPerEm",    (unsigned)t->Units_Per_EM,
    -                                        "created",            t->Created[0], t->Created[1],
    -                                        "modified",           t->Modified[0],t->Modified[1],
    -                                        "xMin",               t->xMin,
    -                                        "yMin",               t->yMin,
    -                                        "xMax",               t->xMax,
    -                                        "yMax",               t->yMax,
    -                                        "macStyle",      (unsigned)t->Mac_Style,
    -                                        "lowestRecPPEM", (unsigned)t->Lowest_Rec_PPEM,
    -                                        "fontDirectionHint",  t->Font_Direction,
    -                                        "indexToLocFormat",   t->Index_To_Loc_Format,
    -                                        "glyphDataFormat",    t->Glyph_Data_Format));
    -    }
    -  case 1:
    -    {
    -      char maxp_dict[] = "{s:(h,h), s:i, s:i, s:i, s:i, s:i, s:i,"
    -        "s:i, s:i, s:i, s:i, s:i, s:i, s:i, s:i}";
    -      TT_MaxProfile *t = (TT_MaxProfile *)table;
    -      return Py::asObject(Py_BuildValue(maxp_dict,
    -                                        "version",
    -                                        FIXED_MAJOR(t->version),
    -                                        FIXED_MINOR(t->version),
    -                                        "numGlyphs",     (unsigned)t->numGlyphs,
    -                                        "maxPoints",     (unsigned)t->maxPoints,
    -                                        "maxContours",   (unsigned)t->maxContours,
    -                                        "maxComponentPoints",
    -                                        (unsigned)t->maxCompositePoints,
    -                                        "maxComponentContours",
    -                                        (unsigned)t->maxCompositeContours,
    -                                        "maxZones",      (unsigned)t->maxZones,
    -                                        "maxTwilightPoints",(unsigned)t->maxTwilightPoints,
    -                                        "maxStorage",    (unsigned)t->maxStorage,
    -                                        "maxFunctionDefs",(unsigned)t->maxFunctionDefs,
    -                                        "maxInstructionDefs",
    -                                        (unsigned)t->maxInstructionDefs,
    -                                        "maxStackElements",(unsigned)t->maxStackElements,
    -                                        "maxSizeOfInstructions",
    -                                        (unsigned)t->maxSizeOfInstructions,
    -                                        "maxComponentElements",
    -                                        (unsigned)t->maxComponentElements,
    -                                        "maxComponentDepth",
    -                                        (unsigned)t->maxComponentDepth));
    -    }
    -  case 2:
    -    {
    -      char os_2_dict[] = "{s:h, s:h, s:h, s:h, s:h, s:h, s:h, s:h,"
    -        "s:h, s:h, s:h, s:h, s:h, s:h, s:h, s:h, s:s#, s:(llll),"
    -        "s:s#, s:h, s:h, s:h}";
    -      TT_OS2 *t = (TT_OS2 *)table;
    -      return Py::asObject(Py_BuildValue(os_2_dict,
    -                                        "version",       (unsigned)t->version,
    -                                        "xAvgCharWidth",      t->xAvgCharWidth,
    -                                        "usWeightClass", (unsigned)t->usWeightClass,
    -                                        "usWidthClass",  (unsigned)t->usWidthClass,
    -                                        "fsType",             t->fsType,
    -                                        "ySubscriptXSize",    t->ySubscriptXSize,
    -                                        "ySubscriptYSize",    t->ySubscriptYSize,
    -                                        "ySubscriptXOffset",  t->ySubscriptXOffset,
    -                                        "ySubscriptYOffset",  t->ySubscriptYOffset,
    -                                        "ySuperscriptXSize",  t->ySuperscriptXSize,
    -                                        "ySuperscriptYSize",  t->ySuperscriptYSize,
    -                                        "ySuperscriptXOffset", t->ySuperscriptXOffset,
    -                                        "ySuperscriptYOffset", t->ySuperscriptYOffset,
    -                                        "yStrikeoutSize",     t->yStrikeoutSize,
    -                                        "yStrikeoutPosition", t->yStrikeoutPosition,
    -                                        "sFamilyClass",       t->sFamilyClass,
    -                                        "panose",             t->panose, 10,
    -                                        "ulCharRange",
    -                                        (unsigned long) t->ulUnicodeRange1,
    -                                        (unsigned long) t->ulUnicodeRange2,
    -                                        (unsigned long) t->ulUnicodeRange3,
    -                                        (unsigned long) t->ulUnicodeRange4,
    -                                        "achVendID",          t->achVendID, 4,
    -                                        "fsSelection",   (unsigned)t->fsSelection,
    -                                        "fsFirstCharIndex",(unsigned)t->usFirstCharIndex,
    -                                        "fsLastCharIndex",(unsigned)t->usLastCharIndex));
    -    }
    -  case 3:
    -    {
    -      char hhea_dict[] = "{s:(h,h), s:h, s:h, s:h, s:i, s:h, s:h, s:h,"
    -        "s:h, s:h, s:h, s:h, s:i}";
    -      TT_HoriHeader *t = (TT_HoriHeader *)table;
    -      return Py::asObject(Py_BuildValue(hhea_dict,
    -                                        "version",
    -                                        FIXED_MAJOR(t->Version),
    -                                        FIXED_MINOR(t->Version),
    -                                        "ascent",             t->Ascender,
    -                                        "descent",            t->Descender,
    -                                        "lineGap",            t->Line_Gap,
    -                                        "advanceWidthMax",(unsigned)t->advance_Width_Max,
    -                                        "minLeftBearing",     t->min_Left_Side_Bearing,
    -                                        "minRightBearing",    t->min_Right_Side_Bearing,
    -                                        "xMaxExtent",         t->xMax_Extent,
    -                                        "caretSlopeRise",     t->caret_Slope_Rise,
    -                                        "caretSlopeRun",      t->caret_Slope_Run,
    -                                        "caretOffset",        t->caret_Offset,
    -                                        "metricDataFormat",   t->metric_Data_Format,
    -                                        "numOfLongHorMetrics",
    -                                        (unsigned)t->number_Of_HMetrics));
    -    }
    -  case 4:
    -    {
    -      char vhea_dict[] = "{s:(h,h), s:h, s:h, s:h, s:i, s:h, s:h, s:h,"
    -        "s:h, s:h, s:h, s:h, s:i}";
    -      TT_VertHeader *t = (TT_VertHeader *)table;
    -      return Py::asObject(Py_BuildValue(vhea_dict,
    -                                        "version",
    -                                        FIXED_MAJOR(t->Version),
    -                                        FIXED_MINOR(t->Version),
    -                                        "vertTypoAscender",   t->Ascender,
    -                                        "vertTypoDescender",  t->Descender,
    -                                        "vertTypoLineGap",    t->Line_Gap,
    -                                        "advanceHeightMax",(unsigned)t->advance_Height_Max,
    -                                        "minTopSideBearing",  t->min_Top_Side_Bearing,
    -                                        "minBottomSizeBearing", t->min_Bottom_Side_Bearing,
    -                                        "yMaxExtent",         t->yMax_Extent,
    -                                        "caretSlopeRise",     t->caret_Slope_Rise,
    -                                        "caretSlopeRun",      t->caret_Slope_Run,
    -                                        "caretOffset",        t->caret_Offset,
    -                                        "metricDataFormat",   t->metric_Data_Format,
    -                                        "numOfLongVerMetrics",
    -                                        (unsigned)t->number_Of_VMetrics));
    -    }
    -  case 5:
    -    {
    -      TT_Postscript *t = (TT_Postscript *)table;
    -      Py::Dict post;
    -      Py::Tuple format(2), angle(2);
    -      format[0] = Py::Int(FIXED_MAJOR(t->FormatType));
    -      format[1] = Py::Int(FIXED_MINOR(t->FormatType));
    -      post["format"]             = format;
    -      angle[0]  = Py::Int(FIXED_MAJOR(t->italicAngle));
    -      angle[1]  = Py::Int(FIXED_MINOR(t->italicAngle));
    -      post["italicAngle"]        = angle;
    -      post["underlinePosition"]  = Py::Int(t->underlinePosition);
    -      post["underlineThickness"] = Py::Int(t->underlineThickness);
    -      post["isFixedPitch"]       = Py::Long((long) t->isFixedPitch);
    -      post["minMemType42"]       = Py::Long((long) t->minMemType42);
    -      post["maxMemType42"]       = Py::Long((long) t->maxMemType42);
    -      post["minMemType1"]        = Py::Long((long) t->minMemType1);
    -      post["maxMemType1"]        = Py::Long((long) t->maxMemType1);
    -      return post;
    -    }
    -  case 6:
    -    {
    -      TT_PCLT *t = (TT_PCLT *)table;
    -      Py::Dict pclt;
    -      Py::Tuple version(2);
    -      version[0] = Py::Int(FIXED_MAJOR(t->Version));
    -      version[1] = Py::Int(FIXED_MINOR(t->Version));
    -      pclt["version"]            = version;
    -      pclt["fontNumber"]         = Py::Long((long) t->FontNumber);
    -      pclt["pitch"]              = Py::Int((short) t->Pitch);
    -      pclt["xHeight"]            = Py::Int((short) t->xHeight);
    -      pclt["style"]              = Py::Int((short) t->Style);
    -      pclt["typeFamily"]         = Py::Int((short) t->TypeFamily);
    -      pclt["capHeight"]          = Py::Int((short) t->CapHeight);
    -      pclt["symbolSet"]          = Py::Int((short) t->SymbolSet);
    -      pclt["typeFace"]           = Py::String((char *) t->TypeFace, 16);
    -      pclt["characterComplement"] = Py::String((char *)
    -                                               t->CharacterComplement, 8);
    -      pclt["filename"]           = Py::String((char *) t->FileName, 6);
    -      pclt["strokeWeight"]       = Py::Int((int) t->StrokeWeight);
    -      pclt["widthType"]          = Py::Int((int) t->WidthType);
    -      pclt["serifStyle"]         = Py::Int((int) t->SerifStyle);
    -      return pclt;
    +        return Py::Object();
    +    }
    +
    +    switch (tag)
    +    {
    +    case 0:
    +        {
    +            char head_dict[] = "{s:(h,h), s:(h,h), s:l, s:l, s:i, s:i,"
    +                "s:(l,l), s:(l,l), s:h, s:h, s:h, s:h, s:i, s:i, s:h, s:h, s:h}";
    +            TT_Header *t = (TT_Header *)table;
    +            return Py::asObject(Py_BuildValue(head_dict,
    +                                              "version",
    +                                              FIXED_MAJOR(t->Table_Version),
    +                                              FIXED_MINOR(t->Table_Version),
    +                                              "fontRevision",
    +                                              FIXED_MAJOR(t->Font_Revision),
    +                                              FIXED_MINOR(t->Font_Revision),
    +                                              "checkSumAdjustment", t->CheckSum_Adjust,
    +                                              "magicNumber" ,       t->Magic_Number,
    +                                              "flags", (unsigned)t->Flags,
    +                                              "unitsPerEm", (unsigned)t->Units_Per_EM,
    +                                              "created",            t->Created[0], t->Created[1],
    +                                              "modified",           t->Modified[0], t->Modified[1],
    +                                              "xMin",               t->xMin,
    +                                              "yMin",               t->yMin,
    +                                              "xMax",               t->xMax,
    +                                              "yMax",               t->yMax,
    +                                              "macStyle", (unsigned)t->Mac_Style,
    +                                              "lowestRecPPEM", (unsigned)t->Lowest_Rec_PPEM,
    +                                              "fontDirectionHint",  t->Font_Direction,
    +                                              "indexToLocFormat",   t->Index_To_Loc_Format,
    +                                              "glyphDataFormat",    t->Glyph_Data_Format));
    +        }
    +    case 1:
    +        {
    +            char maxp_dict[] = "{s:(h,h), s:i, s:i, s:i, s:i, s:i, s:i,"
    +                "s:i, s:i, s:i, s:i, s:i, s:i, s:i, s:i}";
    +            TT_MaxProfile *t = (TT_MaxProfile *)table;
    +            return Py::asObject(Py_BuildValue(maxp_dict,
    +                                              "version",
    +                                              FIXED_MAJOR(t->version),
    +                                              FIXED_MINOR(t->version),
    +                                              "numGlyphs", (unsigned)t->numGlyphs,
    +                                              "maxPoints", (unsigned)t->maxPoints,
    +                                              "maxContours", (unsigned)t->maxContours,
    +                                              "maxComponentPoints",
    +                                              (unsigned)t->maxCompositePoints,
    +                                              "maxComponentContours",
    +                                              (unsigned)t->maxCompositeContours,
    +                                              "maxZones", (unsigned)t->maxZones,
    +                                              "maxTwilightPoints", (unsigned)t->maxTwilightPoints,
    +                                              "maxStorage", (unsigned)t->maxStorage,
    +                                              "maxFunctionDefs", (unsigned)t->maxFunctionDefs,
    +                                              "maxInstructionDefs",
    +                                              (unsigned)t->maxInstructionDefs,
    +                                              "maxStackElements", (unsigned)t->maxStackElements,
    +                                              "maxSizeOfInstructions",
    +                                              (unsigned)t->maxSizeOfInstructions,
    +                                              "maxComponentElements",
    +                                              (unsigned)t->maxComponentElements,
    +                                              "maxComponentDepth",
    +                                              (unsigned)t->maxComponentDepth));
    +        }
    +    case 2:
    +        {
    +            char os_2_dict[] = "{s:h, s:h, s:h, s:h, s:h, s:h, s:h, s:h,"
    +                "s:h, s:h, s:h, s:h, s:h, s:h, s:h, s:h, s:s#, s:(llll),"
    +                "s:s#, s:h, s:h, s:h}";
    +            TT_OS2 *t = (TT_OS2 *)table;
    +            return Py::asObject(Py_BuildValue(os_2_dict,
    +                                              "version", (unsigned)t->version,
    +                                              "xAvgCharWidth",      t->xAvgCharWidth,
    +                                              "usWeightClass", (unsigned)t->usWeightClass,
    +                                              "usWidthClass", (unsigned)t->usWidthClass,
    +                                              "fsType",             t->fsType,
    +                                              "ySubscriptXSize",    t->ySubscriptXSize,
    +                                              "ySubscriptYSize",    t->ySubscriptYSize,
    +                                              "ySubscriptXOffset",  t->ySubscriptXOffset,
    +                                              "ySubscriptYOffset",  t->ySubscriptYOffset,
    +                                              "ySuperscriptXSize",  t->ySuperscriptXSize,
    +                                              "ySuperscriptYSize",  t->ySuperscriptYSize,
    +                                              "ySuperscriptXOffset", t->ySuperscriptXOffset,
    +                                              "ySuperscriptYOffset", t->ySuperscriptYOffset,
    +                                              "yStrikeoutSize",     t->yStrikeoutSize,
    +                                              "yStrikeoutPosition", t->yStrikeoutPosition,
    +                                              "sFamilyClass",       t->sFamilyClass,
    +                                              "panose",             t->panose, 10,
    +                                              "ulCharRange",
    +                                              (unsigned long) t->ulUnicodeRange1,
    +                                              (unsigned long) t->ulUnicodeRange2,
    +                                              (unsigned long) t->ulUnicodeRange3,
    +                                              (unsigned long) t->ulUnicodeRange4,
    +                                              "achVendID",          t->achVendID, 4,
    +                                              "fsSelection", (unsigned)t->fsSelection,
    +                                              "fsFirstCharIndex", (unsigned)t->usFirstCharIndex,
    +                                              "fsLastCharIndex", (unsigned)t->usLastCharIndex));
    +        }
    +    case 3:
    +        {
    +            char hhea_dict[] = "{s:(h,h), s:h, s:h, s:h, s:i, s:h, s:h, s:h,"
    +                "s:h, s:h, s:h, s:h, s:i}";
    +            TT_HoriHeader *t = (TT_HoriHeader *)table;
    +            return Py::asObject(Py_BuildValue(hhea_dict,
    +                                              "version",
    +                                              FIXED_MAJOR(t->Version),
    +                                              FIXED_MINOR(t->Version),
    +                                              "ascent",             t->Ascender,
    +                                              "descent",            t->Descender,
    +                                              "lineGap",            t->Line_Gap,
    +                                              "advanceWidthMax", (unsigned)t->advance_Width_Max,
    +                                              "minLeftBearing",     t->min_Left_Side_Bearing,
    +                                              "minRightBearing",    t->min_Right_Side_Bearing,
    +                                              "xMaxExtent",         t->xMax_Extent,
    +                                              "caretSlopeRise",     t->caret_Slope_Rise,
    +                                              "caretSlopeRun",      t->caret_Slope_Run,
    +                                              "caretOffset",        t->caret_Offset,
    +                                              "metricDataFormat",   t->metric_Data_Format,
    +                                              "numOfLongHorMetrics",
    +                                              (unsigned)t->number_Of_HMetrics));
    +        }
    +    case 4:
    +        {
    +            char vhea_dict[] = "{s:(h,h), s:h, s:h, s:h, s:i, s:h, s:h, s:h,"
    +                "s:h, s:h, s:h, s:h, s:i}";
    +            TT_VertHeader *t = (TT_VertHeader *)table;
    +            return Py::asObject(Py_BuildValue(vhea_dict,
    +                                              "version",
    +                                              FIXED_MAJOR(t->Version),
    +                                              FIXED_MINOR(t->Version),
    +                                              "vertTypoAscender",   t->Ascender,
    +                                              "vertTypoDescender",  t->Descender,
    +                                              "vertTypoLineGap",    t->Line_Gap,
    +                                              "advanceHeightMax", (unsigned)t->advance_Height_Max,
    +                                              "minTopSideBearing",  t->min_Top_Side_Bearing,
    +                                              "minBottomSizeBearing", t->min_Bottom_Side_Bearing,
    +                                              "yMaxExtent",         t->yMax_Extent,
    +                                              "caretSlopeRise",     t->caret_Slope_Rise,
    +                                              "caretSlopeRun",      t->caret_Slope_Run,
    +                                              "caretOffset",        t->caret_Offset,
    +                                              "metricDataFormat",   t->metric_Data_Format,
    +                                              "numOfLongVerMetrics",
    +                                              (unsigned)t->number_Of_VMetrics));
    +        }
    +    case 5:
    +        {
    +            TT_Postscript *t = (TT_Postscript *)table;
    +            Py::Dict post;
    +            Py::Tuple format(2), angle(2);
    +            format[0] = Py::Int(FIXED_MAJOR(t->FormatType));
    +            format[1] = Py::Int(FIXED_MINOR(t->FormatType));
    +            post["format"]             = format;
    +            angle[0]  = Py::Int(FIXED_MAJOR(t->italicAngle));
    +            angle[1]  = Py::Int(FIXED_MINOR(t->italicAngle));
    +            post["italicAngle"]        = angle;
    +            post["underlinePosition"]  = Py::Int(t->underlinePosition);
    +            post["underlineThickness"] = Py::Int(t->underlineThickness);
    +            post["isFixedPitch"]       = Py::Long((long) t->isFixedPitch);
    +            post["minMemType42"]       = Py::Long((long) t->minMemType42);
    +            post["maxMemType42"]       = Py::Long((long) t->maxMemType42);
    +            post["minMemType1"]        = Py::Long((long) t->minMemType1);
    +            post["maxMemType1"]        = Py::Long((long) t->maxMemType1);
    +            return post;
    +        }
    +    case 6:
    +        {
    +            TT_PCLT *t = (TT_PCLT *)table;
    +            Py::Dict pclt;
    +            Py::Tuple version(2);
    +            version[0] = Py::Int(FIXED_MAJOR(t->Version));
    +            version[1] = Py::Int(FIXED_MINOR(t->Version));
    +            pclt["version"]            = version;
    +            pclt["fontNumber"]         = Py::Long((long) t->FontNumber);
    +            pclt["pitch"]              = Py::Int((short) t->Pitch);
    +            pclt["xHeight"]            = Py::Int((short) t->xHeight);
    +            pclt["style"]              = Py::Int((short) t->Style);
    +            pclt["typeFamily"]         = Py::Int((short) t->TypeFamily);
    +            pclt["capHeight"]          = Py::Int((short) t->CapHeight);
    +            pclt["symbolSet"]          = Py::Int((short) t->SymbolSet);
    +            pclt["typeFace"]           = Py::String((char *) t->TypeFace, 16);
    +            pclt["characterComplement"] = Py::String((char *)
    +                                                     t->CharacterComplement, 8);
    +            pclt["filename"]           = Py::String((char *) t->FileName, 6);
    +            pclt["strokeWeight"]       = Py::Int((int) t->StrokeWeight);
    +            pclt["widthType"]          = Py::Int((int) t->WidthType);
    +            pclt["serifStyle"]         = Py::Int((int) t->SerifStyle);
    +            return pclt;
    +        }
    +    default:
    +        return Py::Object();
         }
    -  default:
    -    return Py::Object();
    -  }
     }
     
     char FT2Font::get_image__doc__ [] =
    -  "get_image()\n"
    -  "\n"
    -  "Returns the underlying image buffer for this font object.\n";
    -Py::Object
    -FT2Font::get_image (const Py::Tuple &args) {
    -  args.verify_length(0);
    -  if (image) {
    -    Py_XINCREF(image);
    -    return Py::asObject(image);
    -  }
    -  throw Py::RuntimeError("You must call .set_text() before .get_image()");
    +    "get_image()\n"
    +    "\n"
    +    "Returns the underlying image buffer for this font object.\n";
    +Py::Object
    +FT2Font::get_image(const Py::Tuple &args)
    +{
    +    args.verify_length(0);
    +    if (image)
    +    {
    +        Py_XINCREF(image);
    +        return Py::asObject(image);
    +    }
    +    throw Py::RuntimeError("You must call .set_text() before .get_image()");
     }
     
     char FT2Font::attach_file__doc__ [] =
    -  "attach_file(filename)\n"
    -  "\n"
    -  "Attach a file with extra information on the font\n"
    -  "(in practice, an AFM file with the metrics of a Type 1 font).\n"
    -  "Throws an exception if unsuccessful.\n";
    +    "attach_file(filename)\n"
    +    "\n"
    +    "Attach a file with extra information on the font\n"
    +    "(in practice, an AFM file with the metrics of a Type 1 font).\n"
    +    "Throws an exception if unsuccessful.\n";
     Py::Object
    -FT2Font::attach_file (const Py::Tuple &args) {
    -  args.verify_length(1);
    +FT2Font::attach_file(const Py::Tuple &args)
    +{
    +    args.verify_length(1);
     
    -  std::string filename = Py::String(args[0]);
    -  FT_Error error =
    -    FT_Attach_File(face, filename.c_str());
    +    std::string filename = Py::String(args[0]);
    +    FT_Error error = FT_Attach_File(face, filename.c_str());
     
    -  if (error) {
    -    std::ostringstream s;
    -    s << "Could not attach file " << filename
    -      << " (freetype error code " << error << ")" << std::endl;
    -    throw Py::RuntimeError(s.str());
    -  }
    -  return Py::Object();
    +    if (error)
    +    {
    +        std::ostringstream s;
    +        s << "Could not attach file " << filename
    +        << " (freetype error code " << error << ")" << std::endl;
    +        throw Py::RuntimeError(s.str());
    +    }
    +    return Py::Object();
     }
     
     Py::Object
    -ft2font_module::new_ft2image (const Py::Tuple &args) {
    -  args.verify_length(2);
    +ft2font_module::new_ft2image(const Py::Tuple &args)
    +{
    +    args.verify_length(2);
     
    -  int width = Py::Int(args[0]);
    -  int height = Py::Int(args[1]);
    +    int width = Py::Int(args[0]);
    +    int height = Py::Int(args[1]);
     
    -  return Py::asObject( new FT2Image(width, height) );
    +    return Py::asObject(new FT2Image(width, height));
     }
     
     Py::Object
    -ft2font_module::new_ft2font (const Py::Tuple &args) {
    -  _VERBOSE("ft2font_module::new_ft2font ");
    -  args.verify_length(1);
    +ft2font_module::new_ft2font(const Py::Tuple &args)
    +{
    +    _VERBOSE("ft2font_module::new_ft2font ");
    +    args.verify_length(1);
     
    -  std::string facefile = Py::String(args[0]);
    -  return Py::asObject( new FT2Font(facefile) );
    +    std::string facefile = Py::String(args[0]);
    +    return Py::asObject(new FT2Font(facefile));
     }
     
     void
    -FT2Image::init_type() {
    - _VERBOSE("FT2Image::init_type");
    - behaviors().name("FT2Image");
    - behaviors().doc("FT2Image");
    -
    - add_varargs_method("write_bitmap", &FT2Image::py_write_bitmap,
    -                    FT2Image::write_bitmap__doc__);
    - add_varargs_method("draw_rect", &FT2Image::py_draw_rect,
    -                    FT2Image::draw_rect__doc__);
    - add_varargs_method("draw_rect_filled", &FT2Image::py_draw_rect_filled,
    -                    FT2Image::draw_rect_filled__doc__);
    - add_varargs_method("as_array", &FT2Image::py_as_array,
    -                    FT2Image::as_array__doc__);
    - add_varargs_method("as_str", &FT2Image::py_as_str,
    -                    FT2Image::as_str__doc__);
    - add_varargs_method("as_rgb_str", &FT2Image::py_as_rgb_str,
    -                    FT2Image::as_rgb_str__doc__);
    - add_varargs_method("as_rgba_str", &FT2Image::py_as_rgba_str,
    -                    FT2Image::as_rgba_str__doc__);
    - add_varargs_method("get_width", &FT2Image::py_get_width,
    -                    "Returns the width of the image");
    - add_varargs_method("get_height", &FT2Image::py_get_height,
    -                    "Returns the height of the image");
    +FT2Image::init_type()
    +{
    +    _VERBOSE("FT2Image::init_type");
    +    behaviors().name("FT2Image");
    +    behaviors().doc("FT2Image");
    +
    +    add_varargs_method("write_bitmap", &FT2Image::py_write_bitmap,
    +                       FT2Image::write_bitmap__doc__);
    +    add_varargs_method("draw_rect", &FT2Image::py_draw_rect,
    +                       FT2Image::draw_rect__doc__);
    +    add_varargs_method("draw_rect_filled", &FT2Image::py_draw_rect_filled,
    +                       FT2Image::draw_rect_filled__doc__);
    +    add_varargs_method("as_array", &FT2Image::py_as_array,
    +                       FT2Image::as_array__doc__);
    +    add_varargs_method("as_str", &FT2Image::py_as_str,
    +                       FT2Image::as_str__doc__);
    +    add_varargs_method("as_rgb_str", &FT2Image::py_as_rgb_str,
    +                       FT2Image::as_rgb_str__doc__);
    +    add_varargs_method("as_rgba_str", &FT2Image::py_as_rgba_str,
    +                       FT2Image::as_rgba_str__doc__);
    +    add_varargs_method("get_width", &FT2Image::py_get_width,
    +                       "Returns the width of the image");
    +    add_varargs_method("get_height", &FT2Image::py_get_height,
    +                       "Returns the height of the image");
     }
     
     void
    -Glyph::init_type() {
    -  _VERBOSE("Glyph::init_type");
    -  behaviors().name("Glyph");
    -  behaviors().doc("Glyph");
    -  behaviors().supportGetattr();
    -  behaviors().supportSetattr();
    +Glyph::init_type()
    +{
    +    _VERBOSE("Glyph::init_type");
    +    behaviors().name("Glyph");
    +    behaviors().doc("Glyph");
    +    behaviors().supportGetattr();
    +    behaviors().supportSetattr();
     }
     
     void
    -FT2Font::init_type() {
    -  _VERBOSE("FT2Font::init_type");
    -  behaviors().name("FT2Font");
    -  behaviors().doc("FT2Font");
    -
    -  add_varargs_method("clear", &FT2Font::clear,
    -                     FT2Font::clear__doc__);
    -  add_varargs_method("draw_glyph_to_bitmap", &FT2Font::draw_glyph_to_bitmap,
    -                     FT2Font::draw_glyph_to_bitmap__doc__);
    -  add_varargs_method("draw_glyphs_to_bitmap", &FT2Font::draw_glyphs_to_bitmap,
    -                     FT2Font::draw_glyphs_to_bitmap__doc__);
    -  add_varargs_method("get_xys", &FT2Font::get_xys,
    -                     FT2Font::get_xys__doc__);
    -
    -  add_varargs_method("get_num_glyphs", &FT2Font::get_num_glyphs,
    -                     FT2Font::get_num_glyphs__doc__);
    -  add_keyword_method("load_char", &FT2Font::load_char,
    -                     FT2Font::load_char__doc__);
    -  add_keyword_method("set_text", &FT2Font::set_text,
    -                     FT2Font::set_text__doc__);
    -  add_varargs_method("set_size", &FT2Font::set_size,
    -                     FT2Font::set_size__doc__);
    -  add_varargs_method("set_charmap", &FT2Font::set_charmap,
    -                     FT2Font::set_charmap__doc__);
    -
    -  add_varargs_method("get_width_height", &FT2Font::get_width_height,
    -                     FT2Font::get_width_height__doc__);
    -  add_varargs_method("get_descent", &FT2Font::get_descent,
    -                     FT2Font::get_descent__doc__);
    -  add_varargs_method("get_glyph_name", &FT2Font::get_glyph_name,
    -                     FT2Font::get_glyph_name__doc__);
    -  add_varargs_method("get_charmap", &FT2Font::get_charmap,
    -                     FT2Font::get_charmap__doc__);
    -  add_varargs_method("get_kerning", &FT2Font::get_kerning,
    -                     FT2Font::get_kerning__doc__);
    -  add_varargs_method("get_sfnt", &FT2Font::get_sfnt,
    -                     FT2Font::get_sfnt__doc__);
    -  add_varargs_method("get_name_index", &FT2Font::get_name_index,
    -                     FT2Font::get_name_index__doc__);
    -  add_varargs_method("get_ps_font_info", &FT2Font::get_ps_font_info,
    -                     FT2Font::get_ps_font_info__doc__);
    -  add_varargs_method("get_sfnt_table", &FT2Font::get_sfnt_table,
    -                     FT2Font::get_sfnt_table__doc__);
    -  add_varargs_method("get_image", &FT2Font::get_image,
    -                     FT2Font::get_image__doc__);
    -  add_varargs_method("attach_file", &FT2Font::attach_file,
    -                     FT2Font::attach_file__doc__);
    +FT2Font::init_type()
    +{
    +    _VERBOSE("FT2Font::init_type");
    +    behaviors().name("FT2Font");
    +    behaviors().doc("FT2Font");
    +
    +    add_varargs_method("clear", &FT2Font::clear,
    +                       FT2Font::clear__doc__);
    +    add_varargs_method("draw_glyph_to_bitmap", &FT2Font::draw_glyph_to_bitmap,
    +                       FT2Font::draw_glyph_to_bitmap__doc__);
    +    add_varargs_method("draw_glyphs_to_bitmap", &FT2Font::draw_glyphs_to_bitmap,
    +                       FT2Font::draw_glyphs_to_bitmap__doc__);
    +    add_varargs_method("get_xys", &FT2Font::get_xys,
    +                       FT2Font::get_xys__doc__);
    +
    +    add_varargs_method("get_num_glyphs", &FT2Font::get_num_glyphs,
    +                       FT2Font::get_num_glyphs__doc__);
    +    add_keyword_method("load_char", &FT2Font::load_char,
    +                       FT2Font::load_char__doc__);
    +    add_keyword_method("load_glyph", &FT2Font::load_glyph,
    +                       FT2Font::load_glyph__doc__);
    +    add_keyword_method("set_text", &FT2Font::set_text,
    +                       FT2Font::set_text__doc__);
    +    add_varargs_method("set_size", &FT2Font::set_size,
    +                       FT2Font::set_size__doc__);
    +    add_varargs_method("set_charmap", &FT2Font::set_charmap,
    +                       FT2Font::set_charmap__doc__);
    +    add_varargs_method("select_charmap", &FT2Font::select_charmap,
    +                       FT2Font::select_charmap__doc__);
    +
    +    add_varargs_method("get_width_height", &FT2Font::get_width_height,
    +                       FT2Font::get_width_height__doc__);
    +    add_varargs_method("get_descent", &FT2Font::get_descent,
    +                       FT2Font::get_descent__doc__);
    +    add_varargs_method("get_glyph_name", &FT2Font::get_glyph_name,
    +                       FT2Font::get_glyph_name__doc__);
    +    add_varargs_method("get_charmap", &FT2Font::get_charmap,
    +                       FT2Font::get_charmap__doc__);
    +    add_varargs_method("get_kerning", &FT2Font::get_kerning,
    +                       FT2Font::get_kerning__doc__);
    +    add_varargs_method("get_sfnt", &FT2Font::get_sfnt,
    +                       FT2Font::get_sfnt__doc__);
    +    add_varargs_method("get_name_index", &FT2Font::get_name_index,
    +                       FT2Font::get_name_index__doc__);
    +    add_varargs_method("get_ps_font_info", &FT2Font::get_ps_font_info,
    +                       FT2Font::get_ps_font_info__doc__);
    +    add_varargs_method("get_sfnt_table", &FT2Font::get_sfnt_table,
    +                       FT2Font::get_sfnt_table__doc__);
    +    add_varargs_method("get_image", &FT2Font::get_image,
    +                       FT2Font::get_image__doc__);
    +    add_varargs_method("attach_file", &FT2Font::attach_file,
    +                       FT2Font::attach_file__doc__);
     
    -  behaviors().supportGetattr();
    -  behaviors().supportSetattr();
    +    behaviors().supportGetattr();
    +    behaviors().supportSetattr();
     }
     
     //todo add module docs strings
     
     char ft2font__doc__[] =
    -"ft2font\n"
    -"\n"
    -"Methods:\n"
    -"  FT2Font(ttffile)\n"
    -"Face Constants\n"
    -"  SCALABLE               scalable\n"
    -"  FIXED_SIZES            \n"
    -"  FIXED_WIDTH            \n"
    -"  SFNT                   \n"
    -"  HORIZONTAL             \n"
    -"  VERTICAL               \n"
    -"  KERNING                \n"
    -"  FAST_GLYPHS            \n"
    -"  MULTIPLE_MASTERS       \n"
    -"  GLYPH_NAMES            \n"
    -"  EXTERNAL_STREAM        \n"
    -"Style Constants\n"
    -"  ITALIC                 \n"
    -"  BOLD                   \n"
    -;
    +    "ft2font\n"
    +    "\n"
    +    "Methods:\n"
    +    "  FT2Font(ttffile)\n"
    +    "Face Constants\n"
    +    "  SCALABLE               scalable\n"
    +    "  FIXED_SIZES            \n"
    +    "  FIXED_WIDTH            \n"
    +    "  SFNT                   \n"
    +    "  HORIZONTAL             \n"
    +    "  VERTICAL               \n"
    +    "  KERNING                \n"
    +    "  FAST_GLYPHS            \n"
    +    "  MULTIPLE_MASTERS       \n"
    +    "  GLYPH_NAMES            \n"
    +    "  EXTERNAL_STREAM        \n"
    +    "Style Constants\n"
    +    "  ITALIC                 \n"
    +    "  BOLD                   \n"
    +    ;
     
     /* Function of no arguments returning new FT2Font object */
     char ft2font_new__doc__[] =
    -"FT2Font(ttffile)\n"
    -"\n"
    -"Create a new FT2Font object\n"
    -"The following global font attributes are defined:\n"
    -"  num_faces              number of faces in file\n"
    -"  face_flags             face flags  (int type); see the ft2font constants\n"
    -"  style_flags            style flags  (int type); see the ft2font constants\n"
    -"  num_glyphs             number of glyphs in the face\n"
    -"  family_name            face family name\n"
    -"  style_name             face syle name\n"
    -"  num_fixed_sizes        number of bitmap in the face\n"
    -"  scalable               face is scalable\n"
    -"\n"
    -"The following are available, if scalable is true:\n"
    -"  bbox                   face global bounding box (xmin, ymin, xmax, ymax)\n"
    -"  units_per_EM           number of font units covered by the EM\n"
    -"  ascender               ascender in 26.6 units\n"
    -"  descender              descender in 26.6 units\n"
    -"  height                 height in 26.6 units; used to compute a default\n"
    -"                         line spacing (baseline-to-baseline distance)\n"
    -"  max_advance_width      maximum horizontal cursor advance for all glyphs\n"
    -"  max_advance_height     same for vertical layout\n"
    -"  underline_position     vertical position of the underline bar\n"
    -"  underline_thickness    vertical thickness of the underline\n"
    -"  postscript_name        PostScript name of the font\n"
    -;
    +    "FT2Font(ttffile)\n"
    +    "\n"
    +    "Create a new FT2Font object\n"
    +    "The following global font attributes are defined:\n"
    +    "  num_faces              number of faces in file\n"
    +    "  face_flags             face flags  (int type); see the ft2font constants\n"
    +    "  style_flags            style flags  (int type); see the ft2font constants\n"
    +    "  num_glyphs             number of glyphs in the face\n"
    +    "  family_name            face family name\n"
    +    "  style_name             face syle name\n"
    +    "  num_fixed_sizes        number of bitmap in the face\n"
    +    "  scalable               face is scalable\n"
    +    "\n"
    +    "The following are available, if scalable is true:\n"
    +    "  bbox                   face global bounding box (xmin, ymin, xmax, ymax)\n"
    +    "  units_per_EM           number of font units covered by the EM\n"
    +    "  ascender               ascender in 26.6 units\n"
    +    "  descender              descender in 26.6 units\n"
    +    "  height                 height in 26.6 units; used to compute a default\n"
    +    "                         line spacing (baseline-to-baseline distance)\n"
    +    "  max_advance_width      maximum horizontal cursor advance for all glyphs\n"
    +    "  max_advance_height     same for vertical layout\n"
    +    "  underline_position     vertical position of the underline bar\n"
    +    "  underline_thickness    vertical thickness of the underline\n"
    +    "  postscript_name        PostScript name of the font\n"
    +    ;
     
     #if defined(_MSC_VER)
     DL_EXPORT(void)
     #elif defined(__cplusplus)
    -  extern "C" void
    +extern "C" void
     #else
     void
     #endif
     initft2font(void)
     {
    -  static ft2font_module* ft2font = new ft2font_module;
    -  import_array();
    +    static ft2font_module* ft2font = new ft2font_module;
    +    import_array();
     
    -  Py::Dict d = ft2font->moduleDictionary();
    -  d["SCALABLE"]         = Py::Int(FT_FACE_FLAG_SCALABLE);
    -  d["FIXED_SIZES"]      = Py::Int(FT_FACE_FLAG_FIXED_SIZES);
    -  d["FIXED_WIDTH"]      = Py::Int(FT_FACE_FLAG_FIXED_WIDTH);
    -  d["SFNT"]             = Py::Int(FT_FACE_FLAG_SFNT);
    -  d["HORIZONTAL"]       = Py::Int(FT_FACE_FLAG_HORIZONTAL);
    -  d["VERTICAL"]         = Py::Int(FT_FACE_FLAG_SCALABLE);
    -  d["KERNING"]          = Py::Int(FT_FACE_FLAG_KERNING);
    -  d["FAST_GLYPHS"]      = Py::Int(FT_FACE_FLAG_FAST_GLYPHS);
    -  d["MULTIPLE_MASTERS"] = Py::Int(FT_FACE_FLAG_MULTIPLE_MASTERS);
    -  d["GLYPH_NAMES"]      = Py::Int(FT_FACE_FLAG_GLYPH_NAMES);
    -  d["EXTERNAL_STREAM"]  = Py::Int(FT_FACE_FLAG_EXTERNAL_STREAM);
    -  d["ITALIC"]           = Py::Int(FT_STYLE_FLAG_ITALIC);
    -  d["BOLD"]             = Py::Int(FT_STYLE_FLAG_BOLD);
    -  d["KERNING_DEFAULT"]  = Py::Int(FT_KERNING_DEFAULT);
    -  d["KERNING_UNFITTED"]  = Py::Int(FT_KERNING_UNFITTED);
    -  d["KERNING_UNSCALED"]  = Py::Int(FT_KERNING_UNSCALED);
    -
    -  d["LOAD_DEFAULT"]          = Py::Long(FT_LOAD_DEFAULT);
    -  d["LOAD_NO_SCALE"]         = Py::Long(FT_LOAD_NO_SCALE);
    -  d["LOAD_NO_HINTING"]       = Py::Long(FT_LOAD_NO_HINTING);
    -  d["LOAD_RENDER"]           = Py::Long(FT_LOAD_RENDER);
    -  d["LOAD_NO_BITMAP"]        = Py::Long(FT_LOAD_NO_BITMAP);
    -  d["LOAD_VERTICAL_LAYOUT"]  = Py::Long(FT_LOAD_VERTICAL_LAYOUT);
    -  d["LOAD_FORCE_AUTOHINT"]   = Py::Long(FT_LOAD_FORCE_AUTOHINT);
    -  d["LOAD_CROP_BITMAP"]      = Py::Long(FT_LOAD_CROP_BITMAP);
    -  d["LOAD_PEDANTIC"]         = Py::Long(FT_LOAD_PEDANTIC);
    -  d["LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH"] =
    -    Py::Long(FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH);
    -  d["LOAD_NO_RECURSE"]       = Py::Long(FT_LOAD_NO_RECURSE);
    -  d["LOAD_IGNORE_TRANSFORM"] = Py::Long(FT_LOAD_IGNORE_TRANSFORM);
    -  d["LOAD_MONOCHROME"]       = Py::Long(FT_LOAD_MONOCHROME);
    -  d["LOAD_LINEAR_DESIGN"]    = Py::Long(FT_LOAD_LINEAR_DESIGN);
    -  // These need casting because large-valued numeric literals could
    -  // be either longs or unsigned longs:
    -  d["LOAD_NO_AUTOHINT"]      = Py::Long((unsigned long)FT_LOAD_NO_AUTOHINT);
    -  d["LOAD_TARGET_NORMAL"]    = Py::Long((unsigned long)FT_LOAD_TARGET_NORMAL);
    -  d["LOAD_TARGET_LIGHT"]     = Py::Long((unsigned long)FT_LOAD_TARGET_LIGHT);
    -  d["LOAD_TARGET_MONO"]      = Py::Long((unsigned long)FT_LOAD_TARGET_MONO);
    -  d["LOAD_TARGET_LCD"]       = Py::Long((unsigned long)FT_LOAD_TARGET_LCD);
    -  d["LOAD_TARGET_LCD_V"]     = Py::Long((unsigned long)FT_LOAD_TARGET_LCD_V);
    -
    -  //initialize library
    -  int error = FT_Init_FreeType( &_ft2Library );
    +    Py::Dict d = ft2font->moduleDictionary();
    +    d["SCALABLE"]         = Py::Int(FT_FACE_FLAG_SCALABLE);
    +    d["FIXED_SIZES"]      = Py::Int(FT_FACE_FLAG_FIXED_SIZES);
    +    d["FIXED_WIDTH"]      = Py::Int(FT_FACE_FLAG_FIXED_WIDTH);
    +    d["SFNT"]             = Py::Int(FT_FACE_FLAG_SFNT);
    +    d["HORIZONTAL"]       = Py::Int(FT_FACE_FLAG_HORIZONTAL);
    +    d["VERTICAL"]         = Py::Int(FT_FACE_FLAG_SCALABLE);
    +    d["KERNING"]          = Py::Int(FT_FACE_FLAG_KERNING);
    +    d["FAST_GLYPHS"]      = Py::Int(FT_FACE_FLAG_FAST_GLYPHS);
    +    d["MULTIPLE_MASTERS"] = Py::Int(FT_FACE_FLAG_MULTIPLE_MASTERS);
    +    d["GLYPH_NAMES"]      = Py::Int(FT_FACE_FLAG_GLYPH_NAMES);
    +    d["EXTERNAL_STREAM"]  = Py::Int(FT_FACE_FLAG_EXTERNAL_STREAM);
    +    d["ITALIC"]           = Py::Int(FT_STYLE_FLAG_ITALIC);
    +    d["BOLD"]             = Py::Int(FT_STYLE_FLAG_BOLD);
    +    d["KERNING_DEFAULT"]  = Py::Int(FT_KERNING_DEFAULT);
    +    d["KERNING_UNFITTED"]  = Py::Int(FT_KERNING_UNFITTED);
    +    d["KERNING_UNSCALED"]  = Py::Int(FT_KERNING_UNSCALED);
    +
    +    d["LOAD_DEFAULT"]          = Py::Long(FT_LOAD_DEFAULT);
    +    d["LOAD_NO_SCALE"]         = Py::Long(FT_LOAD_NO_SCALE);
    +    d["LOAD_NO_HINTING"]       = Py::Long(FT_LOAD_NO_HINTING);
    +    d["LOAD_RENDER"]           = Py::Long(FT_LOAD_RENDER);
    +    d["LOAD_NO_BITMAP"]        = Py::Long(FT_LOAD_NO_BITMAP);
    +    d["LOAD_VERTICAL_LAYOUT"]  = Py::Long(FT_LOAD_VERTICAL_LAYOUT);
    +    d["LOAD_FORCE_AUTOHINT"]   = Py::Long(FT_LOAD_FORCE_AUTOHINT);
    +    d["LOAD_CROP_BITMAP"]      = Py::Long(FT_LOAD_CROP_BITMAP);
    +    d["LOAD_PEDANTIC"]         = Py::Long(FT_LOAD_PEDANTIC);
    +    d["LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH"] =
    +        Py::Long(FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH);
    +    d["LOAD_NO_RECURSE"]       = Py::Long(FT_LOAD_NO_RECURSE);
    +    d["LOAD_IGNORE_TRANSFORM"] = Py::Long(FT_LOAD_IGNORE_TRANSFORM);
    +    d["LOAD_MONOCHROME"]       = Py::Long(FT_LOAD_MONOCHROME);
    +    d["LOAD_LINEAR_DESIGN"]    = Py::Long(FT_LOAD_LINEAR_DESIGN);
    +    // These need casting because large-valued numeric literals could
    +    // be either longs or unsigned longs:
    +    d["LOAD_NO_AUTOHINT"]      = Py::Long((unsigned long)FT_LOAD_NO_AUTOHINT);
    +    d["LOAD_TARGET_NORMAL"]    = Py::Long((unsigned long)FT_LOAD_TARGET_NORMAL);
    +    d["LOAD_TARGET_LIGHT"]     = Py::Long((unsigned long)FT_LOAD_TARGET_LIGHT);
    +    d["LOAD_TARGET_MONO"]      = Py::Long((unsigned long)FT_LOAD_TARGET_MONO);
    +    d["LOAD_TARGET_LCD"]       = Py::Long((unsigned long)FT_LOAD_TARGET_LCD);
    +    d["LOAD_TARGET_LCD_V"]     = Py::Long((unsigned long)FT_LOAD_TARGET_LCD_V);
     
    -  if (error)
    -    throw Py::RuntimeError("Could not find initialize the freetype2 library");
    +    //initialize library
    +    int error = FT_Init_FreeType(&_ft2Library);
    +
    +    if (error)
    +    {
    +        throw Py::RuntimeError("Could not find initialize the freetype2 library");
    +    }
     }
     
    -ft2font_module::~ft2font_module() {
    +ft2font_module::~ft2font_module()
    +{
     
    -  FT_Done_FreeType( _ft2Library );
    +    FT_Done_FreeType(_ft2Library);
     }
    diff -Nru matplotlib-0.99.3/src/ft2font.h matplotlib-1.0.1/src/ft2font.h
    --- matplotlib-0.99.3/src/ft2font.h	2009-07-31 15:14:23.000000000 +0000
    +++ matplotlib-1.0.1/src/ft2font.h	2010-07-07 01:41:45.000000000 +0000
    @@ -9,7 +9,8 @@
     #include 
     #include 
     
    -extern "C" {
    +extern "C"
    +{
     #include 
     #include FT_FREETYPE_H
     #include FT_GLYPH_H
    @@ -20,140 +21,156 @@
     
     
     // the freetype string rendered into a width, height buffer
    -class FT2Image : public Py::PythonExtension {
    +class FT2Image : public Py::PythonExtension
    +{
     public:
    -  // FT2Image();
    -  FT2Image(unsigned long width, unsigned long height);
    -  ~FT2Image();
    -
    -  static void init_type();
    -
    -  void draw_bitmap(FT_Bitmap* bitmap, FT_Int x, FT_Int y);
    -  void write_bitmap(const char* filename) const;
    -  void draw_rect(unsigned long x0, unsigned long y0,
    -		 unsigned long x1, unsigned long y1);
    -  void draw_rect_filled(unsigned long x0, unsigned long y0,
    -			unsigned long x1, unsigned long y1);
    -
    -  unsigned int get_width() const { return _width; };
    -  unsigned int get_height() const { return _height; };
    -  const unsigned char *const get_buffer() const { return _buffer; };
    -
    -  static char write_bitmap__doc__ [];
    -  Py::Object py_write_bitmap(const Py::Tuple & args);
    -  static char draw_rect__doc__ [];
    -  Py::Object py_draw_rect(const Py::Tuple & args);
    -  static char draw_rect_filled__doc__ [];
    -  Py::Object py_draw_rect_filled(const Py::Tuple & args);
    -  static char as_array__doc__ [];
    -  Py::Object py_as_array(const Py::Tuple & args);
    -  static char as_str__doc__ [];
    -  Py::Object py_as_str(const Py::Tuple & args);
    -  static char as_rgb_str__doc__ [];
    -  Py::Object py_as_rgb_str(const Py::Tuple & args);
    -  static char as_rgba_str__doc__ [];
    -  Py::Object py_as_rgba_str(const Py::Tuple & args);
    -
    -  Py::Object py_get_width(const Py::Tuple & args);
    -  Py::Object py_get_height(const Py::Tuple & args);
    -
    - private:
    -  bool _isDirty;
    -  unsigned char *_buffer;
    -  unsigned long _width;
    -  unsigned long _height;
    -  FT2Image* _rgbCopy;
    -  FT2Image* _rgbaCopy;
    +    // FT2Image();
    +    FT2Image(unsigned long width, unsigned long height);
    +    ~FT2Image();
    +
    +    static void init_type();
    +
    +    void draw_bitmap(FT_Bitmap* bitmap, FT_Int x, FT_Int y);
    +    void write_bitmap(const char* filename) const;
    +    void draw_rect(unsigned long x0, unsigned long y0,
    +                   unsigned long x1, unsigned long y1);
    +    void draw_rect_filled(unsigned long x0, unsigned long y0,
    +                          unsigned long x1, unsigned long y1);
    +
    +    unsigned int get_width() const
    +    {
    +        return _width;
    +    };
    +    unsigned int get_height() const
    +    {
    +        return _height;
    +    };
    +    const unsigned char *const get_buffer() const
    +    {
    +        return _buffer;
    +    };
    +
    +    static char write_bitmap__doc__ [];
    +    Py::Object py_write_bitmap(const Py::Tuple & args);
    +    static char draw_rect__doc__ [];
    +    Py::Object py_draw_rect(const Py::Tuple & args);
    +    static char draw_rect_filled__doc__ [];
    +    Py::Object py_draw_rect_filled(const Py::Tuple & args);
    +    static char as_array__doc__ [];
    +    Py::Object py_as_array(const Py::Tuple & args);
    +    static char as_str__doc__ [];
    +    Py::Object py_as_str(const Py::Tuple & args);
    +    static char as_rgb_str__doc__ [];
    +    Py::Object py_as_rgb_str(const Py::Tuple & args);
    +    static char as_rgba_str__doc__ [];
    +    Py::Object py_as_rgba_str(const Py::Tuple & args);
    +
    +    Py::Object py_get_width(const Py::Tuple & args);
    +    Py::Object py_get_height(const Py::Tuple & args);
    +
    +private:
    +    bool _isDirty;
    +    unsigned char *_buffer;
    +    unsigned long _width;
    +    unsigned long _height;
    +    FT2Image* _rgbCopy;
    +    FT2Image* _rgbaCopy;
     
    -  void makeRgbCopy();
    -  void makeRgbaCopy();
    +    void makeRgbCopy();
    +    void makeRgbaCopy();
     
    -  void resize(long width, long height);
    +    void resize(long width, long height);
     };
     
     
    -class Glyph : public Py::PythonExtension {
    +class Glyph : public Py::PythonExtension
    +{
     public:
    -  Glyph( const FT_Face&, const FT_Glyph&, size_t);
    -  ~Glyph();
    -  int setattr( const char *_name, const Py::Object &value );
    -  Py::Object getattr( const char *_name );
    -  static void init_type(void);
    -  size_t glyphInd;
    -  Py::Object get_path( const FT_Face& face );
    +    Glyph(const FT_Face&, const FT_Glyph&, size_t);
    +    ~Glyph();
    +    int setattr(const char *_name, const Py::Object &value);
    +    Py::Object getattr(const char *_name);
    +    static void init_type(void);
    +    size_t glyphInd;
    +    Py::Object get_path(const FT_Face& face);
     private:
    -  Py::Dict __dict__;
    -  static char get_path__doc__[];
    +    Py::Dict __dict__;
    +    static char get_path__doc__[];
     };
     
    -class FT2Font : public Py::PythonExtension {
    +class FT2Font : public Py::PythonExtension
    +{
     
     public:
    -  FT2Font(std::string);
    -  ~FT2Font();
    -  static void init_type(void);
    -  Py::Object clear(const Py::Tuple & args);
    -  Py::Object set_size(const Py::Tuple & args);
    -  Py::Object set_charmap(const Py::Tuple & args);
    -  Py::Object set_text(const Py::Tuple & args, const Py::Dict & kwargs);
    -  Py::Object get_kerning(const Py::Tuple & args);
    -  Py::Object get_num_glyphs(const Py::Tuple & args);
    -  Py::Object load_char(const Py::Tuple & args, const Py::Dict & kws);
    -  Py::Object get_width_height(const Py::Tuple & args);
    -  Py::Object get_descent(const Py::Tuple & args);
    -  Py::Object draw_rect_filled(const Py::Tuple & args);
    -  Py::Object get_xys(const Py::Tuple & args);
    -  Py::Object draw_glyphs_to_bitmap(const Py::Tuple & args);
    -  Py::Object draw_glyph_to_bitmap(const Py::Tuple & args);
    -  Py::Object get_glyph_name(const Py::Tuple & args);
    -  Py::Object get_charmap(const Py::Tuple & args);
    -  Py::Object get_sfnt(const Py::Tuple & args);
    -  Py::Object get_name_index(const Py::Tuple & args);
    -  Py::Object get_ps_font_info(const Py::Tuple & args);
    -  Py::Object get_sfnt_table(const Py::Tuple & args);
    -  Py::Object get_image(const Py::Tuple & args);
    -  Py::Object attach_file(const Py::Tuple & args);
    -  int setattr( const char *_name, const Py::Object &value );
    -  Py::Object getattr( const char *_name );
    -  FT2Image* image;
    +    FT2Font(std::string);
    +    ~FT2Font();
    +    static void init_type(void);
    +    Py::Object clear(const Py::Tuple & args);
    +    Py::Object set_size(const Py::Tuple & args);
    +    Py::Object set_charmap(const Py::Tuple & args);
    +    Py::Object select_charmap(const Py::Tuple & args);
    +    Py::Object set_text(const Py::Tuple & args, const Py::Dict & kwargs);
    +    Py::Object get_kerning(const Py::Tuple & args);
    +    Py::Object get_num_glyphs(const Py::Tuple & args);
    +    Py::Object load_char(const Py::Tuple & args, const Py::Dict & kws);
    +    Py::Object load_glyph(const Py::Tuple & args, const Py::Dict & kws);
    +    Py::Object get_width_height(const Py::Tuple & args);
    +    Py::Object get_descent(const Py::Tuple & args);
    +    Py::Object draw_rect_filled(const Py::Tuple & args);
    +    Py::Object get_xys(const Py::Tuple & args);
    +    Py::Object draw_glyphs_to_bitmap(const Py::Tuple & args);
    +    Py::Object draw_glyph_to_bitmap(const Py::Tuple & args);
    +    Py::Object get_glyph_name(const Py::Tuple & args);
    +    Py::Object get_charmap(const Py::Tuple & args);
    +    Py::Object get_sfnt(const Py::Tuple & args);
    +    Py::Object get_name_index(const Py::Tuple & args);
    +    Py::Object get_ps_font_info(const Py::Tuple & args);
    +    Py::Object get_sfnt_table(const Py::Tuple & args);
    +    Py::Object get_image(const Py::Tuple & args);
    +    Py::Object attach_file(const Py::Tuple & args);
    +    int setattr(const char *_name, const Py::Object &value);
    +    Py::Object getattr(const char *_name);
    +    FT2Image* image;
     
     private:
    -  Py::Dict __dict__;
    -  FT_Face       face;
    -  FT_Matrix     matrix;                 /* transformation matrix */
    -  FT_Vector     pen;                    /* untransformed origin  */
    -  FT_Error      error;
    -  std::vector glyphs;
    -  std::vector pos;
    -  double angle;
    -  double ptsize;
    -  double dpi;
    -
    -
    -  FT_BBox compute_string_bbox();
    -  void set_scalable_attributes();
    -
    -  static char clear__doc__ [];
    -  static char set_size__doc__ [];
    -  static char set_charmap__doc__ [];
    -  static char set_text__doc__ [];
    -  static char get_glyph__doc__ [];
    -  static char get_num_glyphs__doc__ [];
    -  static char load_char__doc__ [];
    -  static char get_width_height__doc__ [];
    -  static char get_descent__doc__ [];
    -  static char get_kerning__doc__ [];
    -  static char draw_glyphs_to_bitmap__doc__ [];
    -  static char get_xys__doc__ [];
    -  static char draw_glyph_to_bitmap__doc__ [];
    -  static char get_glyph_name__doc__[];
    -  static char get_charmap__doc__[];
    -  static char get_sfnt__doc__ [];
    -  static char get_name_index__doc__[];
    -  static char get_ps_font_info__doc__[];
    -  static char get_sfnt_table__doc__[];
    -  static char get_image__doc__[];
    -  static char attach_file__doc__[];
    +    Py::Dict __dict__;
    +    FT_Face       face;
    +    FT_Matrix     matrix;                 /* transformation matrix */
    +    FT_Vector     pen;                    /* untransformed origin  */
    +    FT_Error      error;
    +    std::vector glyphs;
    +    std::vector pos;
    +    double angle;
    +    double ptsize;
    +    double dpi;
    +
    +
    +    FT_BBox compute_string_bbox();
    +    void set_scalable_attributes();
    +
    +    static char clear__doc__ [];
    +    static char set_size__doc__ [];
    +    static char set_charmap__doc__ [];
    +    static char select_charmap__doc__ [];
    +    static char set_text__doc__ [];
    +    static char get_glyph__doc__ [];
    +    static char get_num_glyphs__doc__ [];
    +    static char load_char__doc__ [];
    +    static char load_glyph__doc__ [];
    +    static char get_width_height__doc__ [];
    +    static char get_descent__doc__ [];
    +    static char get_kerning__doc__ [];
    +    static char draw_glyphs_to_bitmap__doc__ [];
    +    static char get_xys__doc__ [];
    +    static char draw_glyph_to_bitmap__doc__ [];
    +    static char get_glyph_name__doc__[];
    +    static char get_charmap__doc__[];
    +    static char get_sfnt__doc__ [];
    +    static char get_name_index__doc__[];
    +    static char get_ps_font_info__doc__[];
    +    static char get_sfnt_table__doc__[];
    +    static char get_image__doc__[];
    +    static char attach_file__doc__[];
     };
     
     // the extension module
    @@ -161,29 +178,27 @@
     
     {
     public:
    -  ft2font_module()
    -    : Py::ExtensionModule( "ft2font" )
    -  {
    -    FT2Image::init_type();
    -    Glyph::init_type();
    -    FT2Font::init_type();
    -
    -    add_varargs_method("FT2Font", &ft2font_module::new_ft2font,
    -		       "FT2Font");
    -    add_varargs_method("FT2Image", &ft2font_module::new_ft2image,
    -		       "FT2Image");
    -    initialize( "The ft2font module" );
    -  }
    +    ft2font_module()
    +            : Py::ExtensionModule("ft2font")
    +    {
    +        FT2Image::init_type();
    +        Glyph::init_type();
    +        FT2Font::init_type();
    +
    +        add_varargs_method("FT2Font", &ft2font_module::new_ft2font,
    +                           "FT2Font");
    +        add_varargs_method("FT2Image", &ft2font_module::new_ft2image,
    +                           "FT2Image");
    +        initialize("The ft2font module");
    +    }
     
    -  ~ft2font_module();
    -  //static FT_Library ft2Library;
    +    ~ft2font_module();
    +    //static FT_Library ft2Library;
     
     private:
     
    -  Py::Object new_ft2font (const Py::Tuple &args);
    -  Py::Object new_ft2image (const Py::Tuple &args);
    +    Py::Object new_ft2font(const Py::Tuple &args);
    +    Py::Object new_ft2image(const Py::Tuple &args);
     };
     
    -
    -
     #endif
    diff -Nru matplotlib-0.99.3/src/_gtkagg.cpp matplotlib-1.0.1/src/_gtkagg.cpp
    --- matplotlib-0.99.3/src/_gtkagg.cpp	2009-07-31 15:14:23.000000000 +0000
    +++ matplotlib-1.0.1/src/_gtkagg.cpp	2011-01-05 15:59:55.000000000 +0000
    @@ -18,122 +18,130 @@
     class _gtkagg_module : public Py::ExtensionModule<_gtkagg_module>
     {
     public:
    -  _gtkagg_module()
    -    : Py::ExtensionModule<_gtkagg_module>( "_gtkagg" )
    -  {
    -    add_varargs_method("agg_to_gtk_drawable",
    -		       &_gtkagg_module::agg_to_gtk_drawable,
    -		       "Draw to a gtk drawable from a agg buffer.");
    -    initialize( "The _gtkagg module" );
    -  }
    -
    -  virtual ~_gtkagg_module() {}
    -
    -private:
    -
    -  Py::Object agg_to_gtk_drawable(const Py::Tuple &args) {
    -    // args are gc, renderer, bbox where bbox is a transforms BBox
    -    // (possibly None).  If bbox is None, blit the entire agg buffer
    -    // to gtk.  If bbox is not None, blit only the region defined by
    -    // the bbox
    -    args.verify_length(3);
    -
    -    PyGObject *py_drawable = (PyGObject *)(args[0].ptr());
    -    RendererAgg* aggRenderer = static_cast(args[1].ptr());
    -
    -    GdkDrawable *drawable = GDK_DRAWABLE(py_drawable->obj);
    -    GdkGC* gc = gdk_gc_new(drawable);
    -
    -    int srcstride = aggRenderer->get_width()*4;
    -    int srcwidth = (int)aggRenderer->get_width();
    -    int srcheight = (int)aggRenderer->get_height();
    -
    -    // these three will be overridden below
    -    int destx = 0;
    -    int desty = 0;
    -    int destwidth = 1;
    -    int destheight = 1;
    -    int deststride = 1;
    -
    -
    -    bool needfree = false;
    -
    -    agg::int8u *destbuffer = NULL;
    -
    -    if (args[2].ptr() == Py_None) {
    -      //bbox is None; copy the entire image
    -      destbuffer = aggRenderer->pixBuffer;
    -      destwidth = srcwidth;
    -      destheight = srcheight;
    -      deststride = srcstride;
    -    }
    -    else {
    -      //bbox is not None; copy the image in the bbox
    -      PyObject* clipbox = args[2].ptr();
    -      double l, b, r, t;
    -
    -      if (!py_convert_bbox(clipbox, l, b, r, t)) {
    -	throw Py::TypeError
    -	  ("Argument 3 to agg_to_gtk_drawable must be a Bbox object.");
    -      }
    -
    -      destx = (int)l;
    -      desty = srcheight-(int)t;
    -      destwidth = (int)(r-l);
    -      destheight = (int)(t-b);
    -      deststride = destwidth*4;
    -
    -      needfree = true;
    -      destbuffer = new agg::int8u[deststride*destheight];
    -      if (destbuffer ==NULL) {
    -	throw Py::MemoryError("_gtkagg could not allocate memory for destbuffer");
    -      }
    -
    -      agg::rendering_buffer destrbuf;
    -      destrbuf.attach(destbuffer, destwidth, destheight, deststride);
    -      pixfmt destpf(destrbuf);
    -      renderer_base destrb(destpf);
    -
    -      //destrb.clear(agg::rgba(1, 1, 1, 0));
    -
    -      agg::rect_base region(destx, desty, (int)r, srcheight-(int)b);
    -      destrb.copy_from(aggRenderer->renderingBuffer, ®ion,
    -		       -destx, -desty);
    +    _gtkagg_module()
    +        : Py::ExtensionModule<_gtkagg_module>("_gtkagg")
    +    {
    +        add_varargs_method("agg_to_gtk_drawable",
    +                           &_gtkagg_module::agg_to_gtk_drawable,
    +                           "Draw to a gtk drawable from a agg buffer.");
    +        initialize("The _gtkagg module");
         }
     
    -    /*std::cout << desty << " "
    -	      << destheight << " "
    -	      << srcheight << std::endl;*/
    +    virtual ~_gtkagg_module() {}
     
    +private:
     
    -    //gdk_rgb_init();
    -    gdk_draw_rgb_32_image(drawable, gc, destx, desty,
    -			  destwidth,
    -			  destheight,
    -			  GDK_RGB_DITHER_NORMAL,
    -			  destbuffer,
    -			  deststride);
    -
    -    if (needfree) delete [] destbuffer;
    +    Py::Object agg_to_gtk_drawable(const Py::Tuple &args)
    +    {
    +        // args are gc, renderer, bbox where bbox is a transforms BBox
    +        // (possibly None).  If bbox is None, blit the entire agg buffer
    +        // to gtk.  If bbox is not None, blit only the region defined by
    +        // the bbox
    +        args.verify_length(3);
    +
    +        PyGObject *py_drawable = (PyGObject *)(args[0].ptr());
    +        RendererAgg* aggRenderer = static_cast(args[1].ptr());
    +
    +        GdkDrawable *drawable = GDK_DRAWABLE(py_drawable->obj);
    +        GdkGC* gc = gdk_gc_new(drawable);
    +
    +        int srcstride = aggRenderer->get_width() * 4;
    +        int srcwidth = (int)aggRenderer->get_width();
    +        int srcheight = (int)aggRenderer->get_height();
    +
    +        // these three will be overridden below
    +        int destx = 0;
    +        int desty = 0;
    +        int destwidth = 1;
    +        int destheight = 1;
    +        int deststride = 1;
    +
    +
    +        bool needfree = false;
    +
    +        agg::int8u *destbuffer = NULL;
    +
    +        if (args[2].ptr() == Py_None)
    +        {
    +            //bbox is None; copy the entire image
    +            destbuffer = aggRenderer->pixBuffer;
    +            destwidth = srcwidth;
    +            destheight = srcheight;
    +            deststride = srcstride;
    +        }
    +        else
    +        {
    +            //bbox is not None; copy the image in the bbox
    +            PyObject* clipbox = args[2].ptr();
    +            double l, b, r, t;
    +
    +            if (!py_convert_bbox(clipbox, l, b, r, t))
    +            {
    +                throw Py::TypeError
    +                ("Argument 3 to agg_to_gtk_drawable must be a Bbox object.");
    +            }
    +
    +            destx = (int)l;
    +            desty = srcheight - (int)t;
    +            destwidth = (int)(r - l);
    +            destheight = (int)(t - b);
    +            deststride = destwidth * 4;
    +
    +            needfree = true;
    +            destbuffer = new agg::int8u[deststride*destheight];
    +            if (destbuffer == NULL)
    +            {
    +                throw Py::MemoryError("_gtkagg could not allocate memory for destbuffer");
    +            }
    +
    +            agg::rendering_buffer destrbuf;
    +            destrbuf.attach(destbuffer, destwidth, destheight, deststride);
    +            pixfmt destpf(destrbuf);
    +            renderer_base destrb(destpf);
    +
    +            //destrb.clear(agg::rgba(1, 1, 1, 0));
    +
    +            agg::rect_base region(destx, desty, (int)r, srcheight - (int)b);
    +            destrb.copy_from(aggRenderer->renderingBuffer, ®ion,
    +                             -destx, -desty);
    +        }
    +
    +        /*std::cout << desty << " "
    +              << destheight << " "
    +              << srcheight << std::endl;*/
    +
    +
    +        //gdk_rgb_init();
    +        gdk_draw_rgb_32_image(drawable, gc, destx, desty,
    +                              destwidth,
    +                              destheight,
    +                              GDK_RGB_DITHER_NORMAL,
    +                              destbuffer,
    +                              deststride);
    +
    +        if (needfree)
    +        {
    +            delete [] destbuffer;
    +        }
     
    -    return Py::Object();
    +        return Py::Object();
     
    -  }
    +    }
     };
     
     
     extern "C"
     DL_EXPORT(void)
    -  init_gtkagg(void)
    +init_gtkagg(void)
     {
    -  init_pygobject();
    -  init_pygtk();
    -  import_array();
    -  //suppress unused warning by creating in two lines
    -  static _gtkagg_module* _gtkagg = NULL;
    -  _gtkagg = new _gtkagg_module;
    +    init_pygobject();
    +    init_pygtk();
     
    -};
    +    import_array();
    +    //suppress unused warning by creating in two lines
    +    static _gtkagg_module* _gtkagg = NULL;
    +    _gtkagg = new _gtkagg_module;
    +}
     
     
     
    diff -Nru matplotlib-0.99.3/src/_image.cpp matplotlib-1.0.1/src/_image.cpp
    --- matplotlib-0.99.3/src/_image.cpp	2009-07-31 15:14:23.000000000 +0000
    +++ matplotlib-1.0.1/src/_image.cpp	2010-09-23 19:54:48.000000000 +0000
    @@ -1,8 +1,4 @@
    -// To remove a gcc warning
    -#ifdef _POSIX_C_SOURCE
    -#undef _POSIX_C_SOURCE
    -#endif
    -
    +/* Python API mandates Python.h is included *first* */
     #include "Python.h"
     #include 
     
    @@ -29,409 +25,439 @@
     #include "agg_span_image_filter_rgb.h"
     #include "agg_span_image_filter_rgba.h"
     #include "agg_span_interpolator_linear.h"
    +#include "agg_rasterizer_sl_clip.h"
     #include "util/agg_color_conv_rgb8.h"
     #include "_image.h"
     #include "mplutils.h"
     
     
    -
     typedef agg::pixfmt_rgba32 pixfmt;
     typedef agg::renderer_base renderer_base;
     typedef agg::span_interpolator_linear<> interpolator_type;
    -typedef agg::rasterizer_scanline_aa<> rasterizer;
    +typedef agg::rasterizer_scanline_aa rasterizer;
     
     
     Image::Image() :
    -  bufferIn(NULL), rbufIn(NULL), colsIn(0), rowsIn(0),
    -  bufferOut(NULL), rbufOut(NULL), colsOut(0), rowsOut(0),  BPP(4),
    -  interpolation(BILINEAR), aspect(ASPECT_FREE), bg(1,1,1,0) {
    -  _VERBOSE("Image::Image");
    +        bufferIn(NULL), rbufIn(NULL), colsIn(0), rowsIn(0),
    +        bufferOut(NULL), rbufOut(NULL), colsOut(0), rowsOut(0),  BPP(4),
    +        interpolation(BILINEAR), aspect(ASPECT_FREE), bg(1, 1, 1, 0), resample(true)
    +{
    +    _VERBOSE("Image::Image");
     }
     
    -Image::~Image() {
    -  _VERBOSE("Image::~Image");
    -  delete [] bufferIn; bufferIn = NULL;
    -  delete rbufIn; rbufIn=NULL;
    -  delete rbufOut; rbufOut = NULL;
    -  delete [] bufferOut; bufferOut=NULL;
    +Image::~Image()
    +{
    +    _VERBOSE("Image::~Image");
    +    delete [] bufferIn;
    +    bufferIn = NULL;
    +    delete rbufIn;
    +    rbufIn = NULL;
    +    delete rbufOut;
    +    rbufOut = NULL;
    +    delete [] bufferOut;
    +    bufferOut = NULL;
     }
     
     int
    -Image::setattr( const char * name, const Py::Object & value ) {
    -  _VERBOSE("Image::setattr");
    -  __dict__[name] = value;
    -  return 0;
    +Image::setattr(const char * name, const Py::Object & value)
    +{
    +    _VERBOSE("Image::setattr");
    +    __dict__[name] = value;
    +    return 0;
     }
     
     Py::Object
    -Image::getattr( const char * name ) {
    -  _VERBOSE("Image::getattro");
    -  if ( __dict__.hasKey(name) ) return __dict__[name];
    -  else return getattr_default( name );
    -
    +Image::getattr(const char * name)
    +{
    +    _VERBOSE("Image::getattro");
    +    if (__dict__.hasKey(name)) return __dict__[name];
    +    else return getattr_default(name);
     }
     
     char Image::apply_rotation__doc__[] =
    -"apply_rotation(angle)\n"
    -"\n"
    -"Apply the rotation (degrees) to image"
    -;
    -Py::Object
    -Image::apply_rotation(const Py::Tuple& args) {
    -  _VERBOSE("Image::apply_rotation");
    -
    -  args.verify_length(1);
    -  double r = Py::Float(args[0]);
    -
    -
    -  agg::trans_affine M = agg::trans_affine_rotation( r * agg::pi / 180.0);
    -  srcMatrix *= M;
    -  imageMatrix *= M;
    -  return Py::Object();
    -}
    +    "apply_rotation(angle)\n"
    +    "\n"
    +    "Apply the rotation (degrees) to image"
    +    ;
    +Py::Object
    +Image::apply_rotation(const Py::Tuple& args)
    +{
    +    _VERBOSE("Image::apply_rotation");
     
    +    args.verify_length(1);
    +    double r = Py::Float(args[0]);
     
     
    +    agg::trans_affine M = agg::trans_affine_rotation(r * agg::pi / 180.0);
    +    srcMatrix *= M;
    +    imageMatrix *= M;
    +    return Py::Object();
    +}
    +
     char Image::flipud_out__doc__[] =
    -"flipud()\n"
    -"\n"
    -"Flip the output image upside down"
    -;
    +    "flipud()\n"
    +    "\n"
    +    "Flip the output image upside down"
    +    ;
     
     char Image::flipud_in__doc__[] =
    -"flipud()\n"
    -"\n"
    -"Flip the input image upside down"
    -;
    -Py::Object
    -Image::flipud_in(const Py::Tuple& args) {
    -  _VERBOSE("Image::flipud_in");
    -
    -  args.verify_length(0);
    -  int stride = rbufIn->stride();
    -  rbufIn->attach(bufferIn, colsIn, rowsIn, -stride);
    +    "flipud()\n"
    +    "\n"
    +    "Flip the input image upside down"
    +    ;
    +Py::Object
    +Image::flipud_in(const Py::Tuple& args)
    +{
    +    _VERBOSE("Image::flipud_in");
    +
    +    args.verify_length(0);
    +    int stride = rbufIn->stride();
    +    rbufIn->attach(bufferIn, colsIn, rowsIn, -stride);
     
    -  return Py::Object();
    +    return Py::Object();
     }
     
     char Image::set_bg__doc__[] =
    -"set_bg(r,g,b,a)\n"
    -"\n"
    -"Set the background color"
    -;
    +    "set_bg(r,g,b,a)\n"
    +    "\n"
    +    "Set the background color"
    +    ;
     
     Py::Object
    -Image::set_bg(const Py::Tuple& args) {
    -  _VERBOSE("Image::set_bg");
    -
    -  args.verify_length(4);
    -  bg.r = Py::Float(args[0]);
    -  bg.g = Py::Float(args[1]);
    -  bg.b = Py::Float(args[2]);
    -  bg.a = Py::Float(args[3]);
    -  return Py::Object();
    +Image::set_bg(const Py::Tuple& args)
    +{
    +    _VERBOSE("Image::set_bg");
    +
    +    args.verify_length(4);
    +    bg.r = Py::Float(args[0]);
    +    bg.g = Py::Float(args[1]);
    +    bg.b = Py::Float(args[2]);
    +    bg.a = Py::Float(args[3]);
    +    return Py::Object();
     }
     
     char Image::apply_scaling__doc__[] =
    -"apply_scaling(sx, sy)\n"
    -"\n"
    -"Apply the scale factors sx, sy to the transform matrix"
    -;
    +    "apply_scaling(sx, sy)\n"
    +    "\n"
    +    "Apply the scale factors sx, sy to the transform matrix"
    +    ;
     
     Py::Object
    -Image::apply_scaling(const Py::Tuple& args) {
    -  _VERBOSE("Image::apply_scaling");
    -
    -  args.verify_length(2);
    -  double sx = Py::Float(args[0]);
    -  double sy = Py::Float(args[1]);
    -
    -  //printf("applying scaling %1.2f, %1.2f\n", sx, sy);
    -  agg::trans_affine M = agg::trans_affine_scaling(sx, sy);
    -  srcMatrix *= M;
    -  imageMatrix *= M;
    -
    -  return Py::Object();
    +Image::apply_scaling(const Py::Tuple& args)
    +{
    +    _VERBOSE("Image::apply_scaling");
     
    +    args.verify_length(2);
    +    double sx = Py::Float(args[0]);
    +    double sy = Py::Float(args[1]);
    +
    +    //printf("applying scaling %1.2f, %1.2f\n", sx, sy);
    +    agg::trans_affine M = agg::trans_affine_scaling(sx, sy);
    +    srcMatrix *= M;
    +    imageMatrix *= M;
     
    +    return Py::Object();
     }
     
     char Image::apply_translation__doc__[] =
    -"apply_translation(tx, ty)\n"
    -"\n"
    -"Apply the translation tx, ty to the transform matrix"
    -;
    +    "apply_translation(tx, ty)\n"
    +    "\n"
    +    "Apply the translation tx, ty to the transform matrix"
    +    ;
     
     Py::Object
    -Image::apply_translation(const Py::Tuple& args) {
    -  _VERBOSE("Image::apply_translation");
    -
    -  args.verify_length(2);
    -  double tx = Py::Float(args[0]);
    -  double ty = Py::Float(args[1]);
    -
    -  //printf("applying translation %1.2f, %1.2f\n", tx, ty);
    -  agg::trans_affine M = agg::trans_affine_translation(tx, ty);
    -  srcMatrix *= M;
    -  imageMatrix *= M;
    -
    -  return Py::Object();
    +Image::apply_translation(const Py::Tuple& args)
    +{
    +    _VERBOSE("Image::apply_translation");
     
    +    args.verify_length(2);
    +    double tx = Py::Float(args[0]);
    +    double ty = Py::Float(args[1]);
    +
    +    //printf("applying translation %1.2f, %1.2f\n", tx, ty);
    +    agg::trans_affine M = agg::trans_affine_translation(tx, ty);
    +    srcMatrix *= M;
    +    imageMatrix *= M;
     
    +    return Py::Object();
     }
     
     char Image::as_rgba_str__doc__[] =
    -"numrows, numcols, s = as_rgba_str()"
    -"\n"
    -"Call this function after resize to get the data as string\n"
    -"The string is a numrows by numcols x 4 (RGBA) unsigned char buffer\n"
    -;
    +    "numrows, numcols, s = as_rgba_str()"
    +    "\n"
    +    "Call this function after resize to get the data as string\n"
    +    "The string is a numrows by numcols x 4 (RGBA) unsigned char buffer\n"
    +    ;
     
     Py::Object
    -Image::as_rgba_str(const Py::Tuple& args, const Py::Dict& kwargs) {
    -  _VERBOSE("Image::as_rgba_str");
    +Image::as_rgba_str(const Py::Tuple& args, const Py::Dict& kwargs)
    +{
    +    _VERBOSE("Image::as_rgba_str");
     
    -  args.verify_length(0);
    +    args.verify_length(0);
     
    -  std::pair bufpair = _get_output_buffer();
    +    std::pair bufpair = _get_output_buffer();
     
    -  Py::Object ret =  Py::asObject(Py_BuildValue("lls#", rowsOut, colsOut,
    -					       bufpair.first, colsOut*rowsOut*4));
    +    Py::Object ret =  Py::asObject(Py_BuildValue("lls#", rowsOut, colsOut,
    +                                   bufpair.first, colsOut * rowsOut * 4));
     
    -  if (bufpair.second) delete [] bufpair.first;
    -  return ret;
    +    if (bufpair.second) delete [] bufpair.first;
    +    return ret;
     }
     
     
     char Image::color_conv__doc__[] =
    -"numrows, numcols, buffer = color_conv(format)"
    -"\n"
    -"format 0(BGRA) or 1(ARGB)\n"
    -"Convert image to format and return in a writable buffer\n"
    -;
    -Py::Object
    -Image::color_conv(const Py::Tuple& args) {
    -  _VERBOSE("Image::color_conv");
    -
    -  args.verify_length(1);
    -  int format = Py::Int(args[0]);
    -
    -  int row_len = colsOut * 4;
    -  PyObject* py_buffer = PyBuffer_New(row_len * rowsOut);
    -  if (py_buffer ==NULL)
    -    throw Py::MemoryError("Image::color_conv could not allocate memory");
    -
    -  void* buf;
    -  Py_ssize_t buffer_len;
    -  int ret = PyObject_AsWriteBuffer(py_buffer, &buf, &buffer_len);
    -  if (ret !=0)
    -    throw Py::MemoryError("Image::color_conv could not allocate memory");
    -
    -  agg::rendering_buffer rtmp;
    -  rtmp.attach(reinterpret_cast(buf), colsOut, rowsOut,
    -	      row_len);
    -
    -  switch (format) {
    -  case 0:
    -    agg::color_conv(&rtmp, rbufOut, agg::color_conv_rgba32_to_bgra32());
    -    break;
    -  case 1:
    -    agg::color_conv(&rtmp, rbufOut, agg::color_conv_rgba32_to_argb32());
    -    break;
    -  default:
    -    throw Py::ValueError("Image::color_conv unknown format");
    -  }
    -  PyObject* o = Py_BuildValue("llN", rowsOut, colsOut, py_buffer);
    -  return Py::asObject(o);
    -}
    -
    -char Image::buffer_rgba__doc__[] =
    -"buffer = buffer_rgba()"
    -"\n"
    -"Return the image buffer as rgba32\n"
    -;
    -Py::Object
    -Image::buffer_rgba(const Py::Tuple& args) {
    -  //"Return the image object as rgba";
    -
    -  _VERBOSE("RendererAgg::buffer_rgba");
    -
    -  args.verify_length(0);
    -  int row_len = colsOut * 4;
    -  PyObject* o = Py_BuildValue("lls#", rowsOut, colsOut,
    -			      rbufOut, row_len * rowsOut);
    -  return Py::asObject(o);
    -}
    -
    -char Image::reset_matrix__doc__[] =
    -"reset_matrix()"
    -"\n"
    -"Reset the transformation matrix"
    -;
    -
    +    "numrows, numcols, buffer = color_conv(format)"
    +    "\n"
    +    "format 0(BGRA) or 1(ARGB)\n"
    +    "Convert image to format and return in a writable buffer\n"
    +    ;
     Py::Object
    -Image::reset_matrix(const Py::Tuple& args) {
    -  _VERBOSE("Image::reset_matrix");
    -
    -  args.verify_length(0);
    -  srcMatrix.reset();
    -  imageMatrix.reset();
    +Image::color_conv(const Py::Tuple& args)
    +{
    +    _VERBOSE("Image::color_conv");
     
    -  return Py::Object();
    +    args.verify_length(1);
    +    int format = Py::Int(args[0]);
     
    +    int row_len = colsOut * 4;
    +    PyObject* py_buffer = PyBuffer_New(row_len * rowsOut);
    +    if (py_buffer == NULL)
    +        throw Py::MemoryError("Image::color_conv could not allocate memory");
    +
    +    void* buf;
    +    Py_ssize_t buffer_len;
    +    int ret = PyObject_AsWriteBuffer(py_buffer, &buf, &buffer_len);
    +    if (ret != 0)
    +        throw Py::MemoryError("Image::color_conv could not allocate memory");
    +
    +    agg::rendering_buffer rtmp;
    +    rtmp.attach(reinterpret_cast(buf), colsOut, rowsOut,
    +                row_len);
     
    -}
    +    switch (format)
    +    {
    +    case 0:
    +        agg::color_conv(&rtmp, rbufOut, agg::color_conv_rgba32_to_bgra32());
    +        break;
    +    case 1:
    +        agg::color_conv(&rtmp, rbufOut, agg::color_conv_rgba32_to_argb32());
    +        break;
    +    default:
    +        throw Py::ValueError("Image::color_conv unknown format");
    +    }
     
    -char Image::get_matrix__doc__[] =
    -"(m11,m21,m12,m22,m13,m23) = get_matrix()\n"
    -"\n"
    -"Get the affine transformation matrix\n"
    -"  /m11,m12,m13\\\n"
    -"  /m21,m22,m23|\n"
    -"  \\ 0 , 0 , 1 /"
    -;
    -
    -Py::Object
    -Image::get_matrix(const Py::Tuple& args) {
    -  _VERBOSE("Image::get_matrix");
    -
    -  args.verify_length(0);
    -
    -  double m[6];
    -  srcMatrix.store_to(m);
    -  Py::Tuple ret(6);
    -  for(int i=0;i<6;i++)
    -    ret[i] = Py::Float(m[i]);
    -  return ret;
    +    PyObject* o = Py_BuildValue("llN", rowsOut, colsOut, py_buffer);
    +    return Py::asObject(o);
     }
     
    -char Image::resize__doc__[] =
    -"resize(width, height, norm=1, radius=4.0)\n"
    -"\n"
    -"Resize the image to width, height using interpolation\n"
    -"norm and radius are optional args for some of the filters and must be\n"
    -"passed as kwargs\n"
    -;
    -
    +char Image::buffer_rgba__doc__[] =
    +    "buffer = buffer_rgba()"
    +    "\n"
    +    "Return the image buffer as rgba32\n"
    +    ;
     Py::Object
    -Image::resize(const Py::Tuple& args, const Py::Dict& kwargs) {
    -  _VERBOSE("Image::resize");
    +Image::buffer_rgba(const Py::Tuple& args)
    +{
    +    //"Return the image object as rgba";
     
    -  args.verify_length(2);
    +    _VERBOSE("RendererAgg::buffer_rgba");
     
    -  int norm = 1;
    -  if ( kwargs.hasKey("norm") ) norm = Py::Int( kwargs["norm"] );
    +    args.verify_length(0);
    +    int row_len = colsOut * 4;
    +    PyObject* o = Py_BuildValue("lls#", rowsOut, colsOut,
    +                                rbufOut, row_len * rowsOut);
    +    return Py::asObject(o);
    +}
     
    -  double radius = 4.0;
    -  if ( kwargs.hasKey("radius") ) radius = Py::Float( kwargs["radius"] );
    +char Image::reset_matrix__doc__[] =
    +    "reset_matrix()"
    +    "\n"
    +    "Reset the transformation matrix"
    +    ;
     
    -  if (bufferIn ==NULL)
    -    throw Py::RuntimeError("You must first load the image");
    +Py::Object
    +Image::reset_matrix(const Py::Tuple& args)
    +{
    +    _VERBOSE("Image::reset_matrix");
     
    -  int numcols = Py::Int(args[0]);
    -  int numrows = Py::Int(args[1]);
    +    args.verify_length(0);
    +    srcMatrix.reset();
    +    imageMatrix.reset();
     
    -  colsOut = numcols;
    -  rowsOut = numrows;
    +    return Py::Object();
    +}
     
    +char Image::get_matrix__doc__[] =
    +    "(m11,m21,m12,m22,m13,m23) = get_matrix()\n"
    +    "\n"
    +    "Get the affine transformation matrix\n"
    +    "  /m11,m12,m13\\\n"
    +    "  /m21,m22,m23|\n"
    +    "  \\ 0 , 0 , 1 /"
    +    ;
     
    -  size_t NUMBYTES(numrows * numcols * BPP);
    +Py::Object
    +Image::get_matrix(const Py::Tuple& args)
    +{
    +    _VERBOSE("Image::get_matrix");
     
    -  delete [] bufferOut;
    -  bufferOut = new agg::int8u[NUMBYTES];
    -  if (bufferOut ==NULL) //todo: also handle allocation throw
    -    throw Py::MemoryError("Image::resize could not allocate memory");
    +    args.verify_length(0);
     
    -  delete rbufOut;
    -  rbufOut = new agg::rendering_buffer;
    -  rbufOut->attach(bufferOut, numcols, numrows, numcols * BPP);
    +    double m[6];
    +    srcMatrix.store_to(m);
    +    Py::Tuple ret(6);
    +    for (int i = 0;i < 6;i++)
    +    {
    +        ret[i] = Py::Float(m[i]);
    +    }
    +    return ret;
    +}
     
    -  // init the output rendering/rasterizing stuff
    -  pixfmt pixf(*rbufOut);
    -  renderer_base rb(pixf);
    -  rb.clear(bg);
    -  agg::rasterizer_scanline_aa<> ras;
    -  agg::scanline_u8 sl;
    +char Image::resize__doc__[] =
    +    "resize(width, height, norm=1, radius=4.0)\n"
    +    "\n"
    +    "Resize the image to width, height using interpolation\n"
    +    "norm and radius are optional args for some of the filters and must be\n"
    +    "passed as kwargs\n"
    +    ;
     
    +Py::Object
    +Image::resize(const Py::Tuple& args, const Py::Dict& kwargs)
    +{
    +    _VERBOSE("Image::resize");
    +
    +    args.verify_length(2);
     
    -  //srcMatrix *= resizingMatrix;
    -  //imageMatrix *= resizingMatrix;
    -  imageMatrix.invert();
    -  interpolator_type interpolator(imageMatrix);
    +    int norm = 1;
    +    if (kwargs.hasKey("norm"))
    +    {
    +        norm = Py::Int(kwargs["norm"]);
    +    }
     
    -  typedef agg::span_allocator span_alloc_type;
    -  span_alloc_type sa;
    -  agg::rgba8 background(agg::rgba8(int(255*bg.r),
    -				   int(255*bg.g),
    -				   int(255*bg.b),
    -				   int(255*bg.a)));
    +    double radius = 4.0;
    +    if (kwargs.hasKey("radius"))
    +    {
    +        radius = Py::Float(kwargs["radius"]);
    +    }
     
    -  // the image path
    -  agg::path_storage path;
    -  agg::int8u *bufferPad = NULL;
    -  agg::rendering_buffer rbufPad;
    +    if (bufferIn == NULL)
    +    {
    +        throw Py::RuntimeError("You must first load the image");
    +    }
     
    -  double x0, y0, x1, y1;
    +    int numcols = Py::Int(args[0]);
    +    int numrows = Py::Int(args[1]);
     
    -  x0 = 0.0;
    -  x1 = colsIn;
    -  y0 = 0.0;
    -  y1 = rowsIn;
    +    colsOut = numcols;
    +    rowsOut = numrows;
     
    -  path.move_to(x0, y0);
    -  path.line_to(x1, y0);
    -  path.line_to(x1, y1);
    -  path.line_to(x0, y1);
    -  path.close_polygon();
    -  agg::conv_transform imageBox(path, srcMatrix);
    -  ras.add_path(imageBox);
    +    size_t NUMBYTES(numrows * numcols * BPP);
     
    -  typedef agg::wrap_mode_reflect reflect_type;
    -  typedef agg::image_accessor_wrap img_accessor_type;
    +    delete [] bufferOut;
    +    bufferOut = new agg::int8u[NUMBYTES];
    +    if (bufferOut == NULL) //todo: also handle allocation throw
    +    {
    +        throw Py::MemoryError("Image::resize could not allocate memory");
    +    }
     
    -  pixfmt pixfmtin(*rbufIn);
    -  img_accessor_type ia(pixfmtin);
    -  switch(interpolation)
    +    delete rbufOut;
    +    rbufOut = new agg::rendering_buffer;
    +    rbufOut->attach(bufferOut, numcols, numrows, numcols * BPP);
    +
    +    // init the output rendering/rasterizing stuff
    +    pixfmt pixf(*rbufOut);
    +    renderer_base rb(pixf);
    +    rb.clear(bg);
    +    rasterizer ras;
    +    agg::scanline_u8 sl;
    +
    +    ras.clip_box(0, 0, numcols, numrows);
    +
    +    //srcMatrix *= resizingMatrix;
    +    //imageMatrix *= resizingMatrix;
    +    imageMatrix.invert();
    +    interpolator_type interpolator(imageMatrix);
    +
    +    typedef agg::span_allocator span_alloc_type;
    +    span_alloc_type sa;
    +    agg::rgba8 background(agg::rgba8(int(255*bg.r),
    +                                     int(255*bg.g),
    +                                     int(255*bg.b),
    +                                     int(255*bg.a)));
    +
    +    // the image path
    +    agg::path_storage path;
    +    agg::rendering_buffer rbufPad;
    +
    +    double x0, y0, x1, y1;
    +
    +    x0 = 0.0;
    +    x1 = colsIn;
    +    y0 = 0.0;
    +    y1 = rowsIn;
    +
    +    path.move_to(x0, y0);
    +    path.line_to(x1, y0);
    +    path.line_to(x1, y1);
    +    path.line_to(x0, y1);
    +    path.close_polygon();
    +    agg::conv_transform imageBox(path, srcMatrix);
    +    ras.add_path(imageBox);
    +
    +    typedef agg::wrap_mode_reflect reflect_type;
    +    typedef agg::image_accessor_wrap img_accessor_type;
    +
    +    pixfmt pixfmtin(*rbufIn);
    +    img_accessor_type ia(pixfmtin);
    +    switch (interpolation)
         {
     
         case NEAREST:
    -      {
    -	typedef agg::span_image_filter_rgba_nn span_gen_type;
    -	typedef agg::renderer_scanline_aa renderer_type;
    -	span_gen_type sg(ia, interpolator);
    -	renderer_type ri(rb, sa, sg);
    -	agg::render_scanlines(ras, sl, ri);
    -      }
    -      break;
    +    {
    +        typedef agg::span_image_filter_rgba_nn span_gen_type;
    +        typedef agg::renderer_scanline_aa renderer_type;
    +        span_gen_type sg(ia, interpolator);
    +        renderer_type ri(rb, sa, sg);
    +        agg::render_scanlines(ras, sl, ri);
    +    }
    +    break;
     
         case HANNING:
         case HAMMING:
         case HERMITE:
    -      {
    +    {
             agg::image_filter_lut filter;
    -        switch (interpolation) {
    -          case HANNING:  filter.calculate(agg::image_filter_hanning(), norm); break;
    -          case HAMMING:  filter.calculate(agg::image_filter_hamming(), norm); break;
    -          case HERMITE:  filter.calculate(agg::image_filter_hermite(), norm); break;
    -        }
    -	if (resample)
    -	  {
    -	    typedef agg::span_image_resample_rgba_affine span_gen_type;
    -	    typedef agg::renderer_scanline_aa renderer_type;
    -	    span_gen_type sg(ia, interpolator, filter);
    -	    renderer_type ri(rb, sa, sg);
    -	    agg::render_scanlines(ras, sl, ri);
    -	  }
    -	else
    -	  {
    -	    typedef agg::span_image_filter_rgba_2x2 span_gen_type;
    -	    typedef agg::renderer_scanline_aa renderer_type;
    -	    span_gen_type sg(ia, interpolator, filter);
    -	    renderer_type ri(rb, sa, sg);
    -	    agg::render_scanlines(ras, sl, ri);
    -	  }
    -      }
    -      break;
    +        switch (interpolation)
    +        {
    +        case HANNING:
    +            filter.calculate(agg::image_filter_hanning(), norm);
    +            break;
    +        case HAMMING:
    +            filter.calculate(agg::image_filter_hamming(), norm);
    +            break;
    +        case HERMITE:
    +            filter.calculate(agg::image_filter_hermite(), norm);
    +            break;
    +        }
    +        if (resample)
    +        {
    +            typedef agg::span_image_resample_rgba_affine span_gen_type;
    +            typedef agg::renderer_scanline_aa renderer_type;
    +            span_gen_type sg(ia, interpolator, filter);
    +            renderer_type ri(rb, sa, sg);
    +            agg::render_scanlines(ras, sl, ri);
    +        }
    +        else
    +        {
    +            typedef agg::span_image_filter_rgba_2x2 span_gen_type;
    +            typedef agg::renderer_scanline_aa renderer_type;
    +            span_gen_type sg(ia, interpolator, filter);
    +            renderer_type ri(rb, sa, sg);
    +            agg::render_scanlines(ras, sl, ri);
    +        }
    +    }
    +    break;
         case BILINEAR:
         case BICUBIC:
         case SPLINE16:
    @@ -445,767 +471,851 @@
         case SINC:
         case LANCZOS:
         case BLACKMAN:
    -      {
    +    {
             agg::image_filter_lut filter;
    -        switch(interpolation)
    -          {
    -          case BILINEAR:  filter.calculate(agg::image_filter_bilinear(), norm); break;
    -          case BICUBIC:  filter.calculate(agg::image_filter_bicubic(), norm); break;
    -          case SPLINE16:  filter.calculate(agg::image_filter_spline16(), norm); break;
    -          case SPLINE36:  filter.calculate(agg::image_filter_spline36(), norm); break;
    -          case KAISER:  filter.calculate(agg::image_filter_kaiser(), norm); break;
    -          case QUADRIC:  filter.calculate(agg::image_filter_quadric(), norm); break;
    -          case CATROM: filter.calculate(agg::image_filter_catrom(), norm); break;
    -          case GAUSSIAN: filter.calculate(agg::image_filter_gaussian(), norm); break;
    -          case BESSEL: filter.calculate(agg::image_filter_bessel(), norm); break;
    -          case MITCHELL: filter.calculate(agg::image_filter_mitchell(), norm); break;
    -          case SINC: filter.calculate(agg::image_filter_sinc(radius), norm); break;
    -          case LANCZOS: filter.calculate(agg::image_filter_lanczos(radius), norm); break;
    -          case BLACKMAN: filter.calculate(agg::image_filter_blackman(radius), norm); break;
    -          }
    -	if (resample)
    -	  {
    -	    typedef agg::span_image_resample_rgba_affine span_gen_type;
    -	    typedef agg::renderer_scanline_aa renderer_type;
    -	    span_gen_type sg(ia, interpolator, filter);
    -	    renderer_type ri(rb, sa, sg);
    -	    agg::render_scanlines(ras, sl, ri);
    -	  }
    -	else
    -	  {
    -	    typedef agg::span_image_filter_rgba span_gen_type;
    -	    typedef agg::renderer_scanline_aa renderer_type;
    -	    span_gen_type sg(ia, interpolator, filter);
    -	    renderer_type ri(rb, sa, sg);
    -	    agg::render_scanlines(ras, sl, ri);
    -	  }
    -      }
    -      break;
    -
    +        switch (interpolation)
    +        {
    +        case BILINEAR:
    +            filter.calculate(agg::image_filter_bilinear(), norm);
    +            break;
    +        case BICUBIC:
    +            filter.calculate(agg::image_filter_bicubic(), norm);
    +            break;
    +        case SPLINE16:
    +            filter.calculate(agg::image_filter_spline16(), norm);
    +            break;
    +        case SPLINE36:
    +            filter.calculate(agg::image_filter_spline36(), norm);
    +            break;
    +        case KAISER:
    +            filter.calculate(agg::image_filter_kaiser(), norm);
    +            break;
    +        case QUADRIC:
    +            filter.calculate(agg::image_filter_quadric(), norm);
    +            break;
    +        case CATROM:
    +            filter.calculate(agg::image_filter_catrom(), norm);
    +            break;
    +        case GAUSSIAN:
    +            filter.calculate(agg::image_filter_gaussian(), norm);
    +            break;
    +        case BESSEL:
    +            filter.calculate(agg::image_filter_bessel(), norm);
    +            break;
    +        case MITCHELL:
    +            filter.calculate(agg::image_filter_mitchell(), norm);
    +            break;
    +        case SINC:
    +            filter.calculate(agg::image_filter_sinc(radius), norm);
    +            break;
    +        case LANCZOS:
    +            filter.calculate(agg::image_filter_lanczos(radius), norm);
    +            break;
    +        case BLACKMAN:
    +            filter.calculate(agg::image_filter_blackman(radius), norm);
    +            break;
    +        }
    +        if (resample)
    +        {
    +            typedef agg::span_image_resample_rgba_affine span_gen_type;
    +            typedef agg::renderer_scanline_aa renderer_type;
    +            span_gen_type sg(ia, interpolator, filter);
    +            renderer_type ri(rb, sa, sg);
    +            agg::render_scanlines(ras, sl, ri);
    +        }
    +        else
    +        {
    +            typedef agg::span_image_filter_rgba span_gen_type;
    +            typedef agg::renderer_scanline_aa renderer_type;
    +            span_gen_type sg(ia, interpolator, filter);
    +            renderer_type ri(rb, sa, sg);
    +            agg::render_scanlines(ras, sl, ri);
    +        }
         }
    +    break;
     
    -  delete [] bufferPad;
    -  return Py::Object();
    +    }
     
    +    return Py::Object();
     }
     
     
     
     char Image::get_interpolation__doc__[] =
    -"get_interpolation()\n"
    -"\n"
    -"Get the interpolation scheme to one of the module constants, "
    -"one of image.NEAREST, image.BILINEAR, etc..."
    -;
    +    "get_interpolation()\n"
    +    "\n"
    +    "Get the interpolation scheme to one of the module constants, "
    +    "one of image.NEAREST, image.BILINEAR, etc..."
    +    ;
     
     Py::Object
    -Image::get_interpolation(const Py::Tuple& args) {
    -  _VERBOSE("Image::get_interpolation");
    +Image::get_interpolation(const Py::Tuple& args)
    +{
    +    _VERBOSE("Image::get_interpolation");
     
    -  args.verify_length(0);
    -  return Py::Int((int)interpolation);
    +    args.verify_length(0);
    +    return Py::Int((int)interpolation);
     }
     
     
     char Image::get_aspect__doc__[] =
    -"get_aspect()\n"
    -"\n"
    -"Get the aspect constraint constants"
    -;
    +    "get_aspect()\n"
    +    "\n"
    +    "Get the aspect constraint constants"
    +    ;
     
     Py::Object
    -Image::get_aspect(const Py::Tuple& args) {
    -  _VERBOSE("Image::get_aspect");
    +Image::get_aspect(const Py::Tuple& args)
    +{
    +    _VERBOSE("Image::get_aspect");
     
    -  args.verify_length(0);
    -  return Py::Int((int)aspect);
    +    args.verify_length(0);
    +    return Py::Int((int)aspect);
     }
     
     char Image::get_size__doc__[] =
    -"numrows, numcols = get_size()\n"
    -"\n"
    -"Get the number or rows and columns of the input image"
    -;
    +    "numrows, numcols = get_size()\n"
    +    "\n"
    +    "Get the number or rows and columns of the input image"
    +    ;
     
     Py::Object
    -Image::get_size(const Py::Tuple& args) {
    -  _VERBOSE("Image::get_size");
    +Image::get_size(const Py::Tuple& args)
    +{
    +    _VERBOSE("Image::get_size");
     
    -  args.verify_length(0);
    +    args.verify_length(0);
     
    -  Py::Tuple ret(2);
    -  ret[0] = Py::Int((long)rowsIn);
    -  ret[1] = Py::Int((long)colsIn);
    -  return ret;
    +    Py::Tuple ret(2);
    +    ret[0] = Py::Int((long)rowsIn);
    +    ret[1] = Py::Int((long)colsIn);
    +    return ret;
     
     }
     
     char Image::get_resample__doc__[] =
    -"get_resample()\n"
    -"\n"
    -"Get the resample flag."
    -;
    +    "get_resample()\n"
    +    "\n"
    +    "Get the resample flag."
    +    ;
     
     Py::Object
    -Image::get_resample(const Py::Tuple& args) {
    -  _VERBOSE("Image::get_resample");
    +Image::get_resample(const Py::Tuple& args)
    +{
    +    _VERBOSE("Image::get_resample");
     
    -  args.verify_length(0);
    -  return Py::Int((int)resample);
    +    args.verify_length(0);
    +    return Py::Int((int)resample);
     }
     
     char Image::get_size_out__doc__[] =
    -"numrows, numcols = get_size()\n"
    -"\n"
    -"Get the number or rows and columns of the output image"
    -;
    +    "numrows, numcols = get_size()\n"
    +    "\n"
    +    "Get the number or rows and columns of the output image"
    +    ;
     
     Py::Object
    -Image::get_size_out(const Py::Tuple& args) {
    -  _VERBOSE("Image::get_size_out");
    -
    -  args.verify_length(0);
    +Image::get_size_out(const Py::Tuple& args)
    +{
    +    _VERBOSE("Image::get_size_out");
     
    -  Py::Tuple ret(2);
    -  ret[0] = Py::Int((long)rowsOut);
    -  ret[1] = Py::Int((long)colsOut);
    -  return ret;
    +    args.verify_length(0);
     
    +    Py::Tuple ret(2);
    +    ret[0] = Py::Int((long)rowsOut);
    +    ret[1] = Py::Int((long)colsOut);
    +    return ret;
     }
     
     //get the output buffer, flipped if necessary.  The second element of
     //the pair is a bool that indicates whether you need to free the
     //memory
     std::pair
    -Image::_get_output_buffer() {
    -  _VERBOSE("Image::_get_output_buffer");
    -  std::pair ret;
    -  bool flipy = rbufOut->stride()<0;
    -  if (flipy) {
    -    agg::int8u* buffer = new agg::int8u[rowsOut*colsOut*4];
    -    agg::rendering_buffer rb;
    -    rb.attach(buffer, colsOut, rowsOut, colsOut*4);
    -    rb.copy_from(*rbufOut);
    -    ret.first = buffer;
    -    ret.second = true;
    -  }
    -  else {
    -    ret.first = bufferOut;
    -    ret.second = false;
    -  }
    -  return ret;
    +Image::_get_output_buffer()
    +{
    +    _VERBOSE("Image::_get_output_buffer");
    +    std::pair ret;
    +    bool flipy = rbufOut->stride() < 0;
    +    if (flipy)
    +    {
    +        agg::int8u* buffer = new agg::int8u[rowsOut*colsOut*4];
    +        agg::rendering_buffer rb;
    +        rb.attach(buffer, colsOut, rowsOut, colsOut*4);
    +        rb.copy_from(*rbufOut);
    +        ret.first = buffer;
    +        ret.second = true;
    +    }
    +    else
    +    {
    +        ret.first = bufferOut;
    +        ret.second = false;
    +    }
    +    return ret;
     
     }
     
    -
     char Image::set_interpolation__doc__[] =
    -"set_interpolation(scheme)\n"
    -"\n"
    -"Set the interpolation scheme to one of the module constants, "
    -"eg, image.NEAREST, image.BILINEAR, etc..."
    -;
    +    "set_interpolation(scheme)\n"
    +    "\n"
    +    "Set the interpolation scheme to one of the module constants, "
    +    "eg, image.NEAREST, image.BILINEAR, etc..."
    +    ;
     
     Py::Object
    -Image::set_interpolation(const Py::Tuple& args) {
    -  _VERBOSE("Image::set_interpolation");
    -
    -  args.verify_length(1);
    +Image::set_interpolation(const Py::Tuple& args)
    +{
    +    _VERBOSE("Image::set_interpolation");
     
    -  size_t method = Py::Int(args[0]);
    -  interpolation = (unsigned)method;
    -  return Py::Object();
    +    args.verify_length(1);
     
    +    size_t method = Py::Int(args[0]);
    +    interpolation = (unsigned)method;
    +    return Py::Object();
     }
     
     char Image::set_resample__doc__[] =
    -"set_resample(boolean)\n"
    -"\n"
    -"Set the resample flag."
    -;
    +    "set_resample(boolean)\n"
    +    "\n"
    +    "Set the resample flag."
    +    ;
     
     Py::Object
    -Image::set_resample(const Py::Tuple& args) {
    -  _VERBOSE("Image::set_resample");
    -  args.verify_length(1);
    -  int flag = Py::Int(args[0]);
    -  resample = (bool)flag;
    -  return Py::Object();
    +Image::set_resample(const Py::Tuple& args)
    +{
    +    _VERBOSE("Image::set_resample");
    +    args.verify_length(1);
    +    int flag = Py::Int(args[0]);
    +    resample = (bool)flag;
    +    return Py::Object();
     }
     
     
     char Image::set_aspect__doc__[] =
    -"set_aspect(scheme)\n"
    -"\n"
    -"Set the aspect ration to one of the image module constant."
    -"eg, one of image.ASPECT_PRESERVE, image.ASPECT_FREE"
    -;
    -Py::Object
    -Image::set_aspect(const Py::Tuple& args) {
    -  _VERBOSE("Image::set_aspect");
    -
    -  args.verify_length(1);
    -  size_t method = Py::Int(args[0]);
    -  aspect = (unsigned)method;
    -  return Py::Object();
    +    "set_aspect(scheme)\n"
    +    "\n"
    +    "Set the aspect ration to one of the image module constant."
    +    "eg, one of image.ASPECT_PRESERVE, image.ASPECT_FREE"
    +    ;
    +Py::Object
    +Image::set_aspect(const Py::Tuple& args)
    +{
    +    _VERBOSE("Image::set_aspect");
    +
    +    args.verify_length(1);
    +    size_t method = Py::Int(args[0]);
    +    aspect = (unsigned)method;
    +    return Py::Object();
     
     }
     
     void
    -Image::init_type() {
    -  _VERBOSE("Image::init_type");
    -
    -  behaviors().name("Image");
    -  behaviors().doc("Image");
    -  behaviors().supportGetattr();
    -  behaviors().supportSetattr();
    -
    -  add_varargs_method( "apply_rotation", &Image::apply_rotation, Image::apply_rotation__doc__);
    -  add_varargs_method( "apply_scaling",	&Image::apply_scaling, Image::apply_scaling__doc__);
    -  add_varargs_method( "apply_translation", &Image::apply_translation, Image::apply_translation__doc__);
    -  add_keyword_method( "as_rgba_str", &Image::as_rgba_str, Image::as_rgba_str__doc__);
    -  add_varargs_method( "color_conv", &Image::color_conv, Image::color_conv__doc__);
    -  add_varargs_method( "buffer_rgba", &Image::buffer_rgba, Image::buffer_rgba__doc__);
    -  add_varargs_method( "get_aspect", &Image::get_aspect, Image::get_aspect__doc__);
    -  add_varargs_method( "get_interpolation", &Image::get_interpolation, Image::get_interpolation__doc__);
    -  add_varargs_method( "get_resample", &Image::get_resample, Image::get_resample__doc__);
    -  add_varargs_method( "get_size", &Image::get_size, Image::get_size__doc__);
    -  add_varargs_method( "get_size_out", &Image::get_size_out, Image::get_size_out__doc__);
    -  add_varargs_method( "reset_matrix", &Image::reset_matrix, Image::reset_matrix__doc__);
    -  add_varargs_method( "get_matrix", &Image::get_matrix, Image::get_matrix__doc__);
    -  add_keyword_method( "resize", &Image::resize, Image::resize__doc__);
    -  add_varargs_method( "set_interpolation", &Image::set_interpolation, Image::set_interpolation__doc__);
    -  add_varargs_method( "set_resample", &Image::set_resample, Image::set_resample__doc__);
    -  add_varargs_method( "set_aspect", &Image::set_aspect, Image::set_aspect__doc__);
    -  add_varargs_method( "set_bg", &Image::set_bg, Image::set_bg__doc__);
    -  add_varargs_method( "flipud_out", &Image::flipud_out, Image::flipud_out__doc__);
    -  add_varargs_method( "flipud_in", &Image::flipud_in, Image::flipud_in__doc__);
    -
    +Image::init_type()
    +{
    +    _VERBOSE("Image::init_type");
     
    +    behaviors().name("Image");
    +    behaviors().doc("Image");
    +    behaviors().supportGetattr();
    +    behaviors().supportSetattr();
    +
    +    add_varargs_method("apply_rotation", &Image::apply_rotation, Image::apply_rotation__doc__);
    +    add_varargs_method("apply_scaling",  &Image::apply_scaling, Image::apply_scaling__doc__);
    +    add_varargs_method("apply_translation", &Image::apply_translation, Image::apply_translation__doc__);
    +    add_keyword_method("as_rgba_str", &Image::as_rgba_str, Image::as_rgba_str__doc__);
    +    add_varargs_method("color_conv", &Image::color_conv, Image::color_conv__doc__);
    +    add_varargs_method("buffer_rgba", &Image::buffer_rgba, Image::buffer_rgba__doc__);
    +    add_varargs_method("get_aspect", &Image::get_aspect, Image::get_aspect__doc__);
    +    add_varargs_method("get_interpolation", &Image::get_interpolation, Image::get_interpolation__doc__);
    +    add_varargs_method("get_resample", &Image::get_resample, Image::get_resample__doc__);
    +    add_varargs_method("get_size", &Image::get_size, Image::get_size__doc__);
    +    add_varargs_method("get_size_out", &Image::get_size_out, Image::get_size_out__doc__);
    +    add_varargs_method("reset_matrix", &Image::reset_matrix, Image::reset_matrix__doc__);
    +    add_varargs_method("get_matrix", &Image::get_matrix, Image::get_matrix__doc__);
    +    add_keyword_method("resize", &Image::resize, Image::resize__doc__);
    +    add_varargs_method("set_interpolation", &Image::set_interpolation, Image::set_interpolation__doc__);
    +    add_varargs_method("set_resample", &Image::set_resample, Image::set_resample__doc__);
    +    add_varargs_method("set_aspect", &Image::set_aspect, Image::set_aspect__doc__);
    +    add_varargs_method("set_bg", &Image::set_bg, Image::set_bg__doc__);
    +    add_varargs_method("flipud_out", &Image::flipud_out, Image::flipud_out__doc__);
    +    add_varargs_method("flipud_in", &Image::flipud_in, Image::flipud_in__doc__);
     }
     
     
     
     
     char _image_module_from_images__doc__[] =
    -"from_images(numrows, numcols, seq)\n"
    -"\n"
    -"return an image instance with numrows, numcols from a seq of image\n"
    -"instances using alpha blending.  seq is a list of (Image, ox, oy)"
    -;
    -Py::Object
    -_image_module::from_images(const Py::Tuple& args) {
    -  _VERBOSE("_image_module::from_images");
    -
    -  args.verify_length(3);
    -
    -  size_t numrows = (size_t)Py::Int(args[0]);
    -  size_t numcols = (size_t)Py::Int(args[1]);
    -
    -  if (numrows >= 32768 || numcols >= 32768) {
    -    throw Py::RuntimeError("numrows and numcols must both be less than 32768");
    -  }
    -
    -  Py::SeqBase tups = args[2];
    -  size_t N = tups.length();
    -
    -  if (N==0)
    -    throw Py::RuntimeError("Empty list of images");
    -
    -  Py::Tuple tup;
    -
    -  size_t ox(0), oy(0), thisx(0), thisy(0);
    -
    -  //copy image 0 output buffer into return images output buffer
    -  Image* imo = new Image;
    -  imo->rowsOut  = numrows;
    -  imo->colsOut  = numcols;
    -
    -  size_t NUMBYTES(numrows * numcols * imo->BPP);
    -  imo->bufferOut = new agg::int8u[NUMBYTES];
    -  if (imo->bufferOut==NULL) //todo: also handle allocation throw
    -    throw Py::MemoryError("_image_module::from_images could not allocate memory");
    -
    -  delete imo->rbufOut;
    -  imo->rbufOut = new agg::rendering_buffer;
    -  imo->rbufOut->attach(imo->bufferOut, imo->colsOut, imo->rowsOut, imo->colsOut * imo->BPP);
    -
    -  pixfmt pixf(*imo->rbufOut);
    -  renderer_base rb(pixf);
    -
    -
    -  rb.clear(agg::rgba(1, 1, 1, 1));
    -  for (size_t imnum=0; imnum< N; imnum++) {
    -    tup = Py::Tuple(tups[imnum]);
    -    Image* thisim = static_cast(tup[0].ptr());
    -    ox = Py::Int(tup[1]);
    -    oy = Py::Int(tup[2]);
    -    bool isflip = (thisim->rbufOut->stride())<0;
    -    //std::cout << "from images " << isflip << "; stride=" << thisim->rbufOut->stride() << std::endl;
    -    size_t ind=0;
    -    for (size_t j=0; jrowsOut; j++) {
    -      for (size_t i=0; icolsOut; i++) {
    -	thisx = i+ox;
    -
    -	if (isflip)
    -	  thisy = thisim->rowsOut - j + oy;
    -	else
    -	  thisy = j+oy;
    -
    -
    -	if (thisx>=numcols || thisy>=numrows) {
    -	  ind +=4;
    -	  continue;
    -	}
    -
    -	pixfmt::color_type p;
    -	p.r = *(thisim->bufferOut+ind++);
    -	p.g = *(thisim->bufferOut+ind++);
    -	p.b = *(thisim->bufferOut+ind++);
    -	p.a = *(thisim->bufferOut+ind++);
    -	pixf.blend_pixel(thisx, thisy, p, 255);
    -      }
    +    "from_images(numrows, numcols, seq)\n"
    +    "\n"
    +    "return an image instance with numrows, numcols from a seq of image\n"
    +    "instances using alpha blending.  seq is a list of (Image, ox, oy)"
    +    ;
    +Py::Object
    +_image_module::from_images(const Py::Tuple& args)
    +{
    +    _VERBOSE("_image_module::from_images");
    +
    +    args.verify_length(3);
    +
    +    size_t numrows = (size_t)Py::Int(args[0]);
    +    size_t numcols = (size_t)Py::Int(args[1]);
    +
    +    if (numrows >= 32768 || numcols >= 32768)
    +    {
    +        throw Py::RuntimeError("numrows and numcols must both be less than 32768");
         }
    -  }
     
    -  return Py::asObject(imo);
    +    Py::SeqBase tups = args[2];
    +    size_t N = tups.length();
     
    +    if (N == 0)
    +    {
    +        throw Py::RuntimeError("Empty list of images");
    +    }
     
    +    Py::Tuple tup;
     
    -}
    +    size_t ox(0), oy(0), thisx(0), thisy(0);
     
    +    //copy image 0 output buffer into return images output buffer
    +    Image* imo = new Image;
    +    imo->rowsOut  = numrows;
    +    imo->colsOut  = numcols;
     
    -char _image_module_fromarray__doc__[] =
    -"fromarray(A, isoutput)\n"
    -"\n"
    -"Load the image from a numpy array\n"
    -"By default this function fills the input buffer, which can subsequently\n"
    -"be resampled using resize.  If isoutput=1, fill the output buffer.\n"
    -"This is used to support raw pixel images w/o resampling"
    -;
    -Py::Object
    -_image_module::fromarray(const Py::Tuple& args) {
    -  _VERBOSE("_image_module::fromarray");
    +    size_t NUMBYTES(numrows * numcols * imo->BPP);
    +    imo->bufferOut = new agg::int8u[NUMBYTES];
    +    if (imo->bufferOut == NULL) //todo: also handle allocation throw
    +    {
    +        throw Py::MemoryError("_image_module::from_images could not allocate memory");
    +    }
    +
    +    delete imo->rbufOut;
    +    imo->rbufOut = new agg::rendering_buffer;
    +    imo->rbufOut->attach(imo->bufferOut, imo->colsOut, imo->rowsOut, imo->colsOut * imo->BPP);
     
    -  args.verify_length(2);
    +    pixfmt pixf(*imo->rbufOut);
    +    renderer_base rb(pixf);
     
    -  Py::Object x = args[0];
    -  int isoutput = Py::Int(args[1]);
    -  //PyArrayObject *A = (PyArrayObject *) PyArray_ContiguousFromObject(x.ptr(), PyArray_DOUBLE, 2, 3);
    -  PyArrayObject *A = (PyArrayObject *) PyArray_FromObject(x.ptr(), PyArray_DOUBLE, 2, 3);
    +    rb.clear(agg::rgba(1, 1, 1, 1));
    +    for (size_t imnum = 0; imnum < N; imnum++)
    +    {
    +        tup = Py::Tuple(tups[imnum]);
    +        Image* thisim = static_cast(tup[0].ptr());
    +        ox = Py::Int(tup[1]);
    +        oy = Py::Int(tup[2]);
    +        bool isflip = (thisim->rbufOut->stride()) < 0;
    +        //std::cout << "from images " << isflip << "; stride=" << thisim->rbufOut->stride() << std::endl;
    +        size_t ind = 0;
    +        for (size_t j = 0; j < thisim->rowsOut; j++)
    +        {
    +            for (size_t i = 0; i < thisim->colsOut; i++)
    +            {
    +                thisx = i + ox;
    +
    +                if (isflip)
    +                {
    +                    thisy = thisim->rowsOut - j + oy;
    +                }
    +                else
    +                {
    +                    thisy = j + oy;
    +                }
    +
    +                if (thisx >= numcols || thisy >= numrows)
    +                {
    +                    ind += 4;
    +                    continue;
    +                }
    +
    +                pixfmt::color_type p;
    +                p.r = *(thisim->bufferOut + ind++);
    +                p.g = *(thisim->bufferOut + ind++);
    +                p.b = *(thisim->bufferOut + ind++);
    +                p.a = *(thisim->bufferOut + ind++);
    +                pixf.blend_pixel(thisx, thisy, p, 255);
    +            }
    +        }
    +    }
     
    -  if (A==NULL)
    -    throw Py::ValueError("Array must be rank 2 or 3 of doubles");
    +    return Py::asObject(imo);
    +}
     
     
    -  Image* imo = new Image;
    +char _image_module_fromarray__doc__[] =
    +    "fromarray(A, isoutput)\n"
    +    "\n"
    +    "Load the image from a numpy array\n"
    +    "By default this function fills the input buffer, which can subsequently\n"
    +    "be resampled using resize.  If isoutput=1, fill the output buffer.\n"
    +    "This is used to support raw pixel images w/o resampling"
    +    ;
    +Py::Object
    +_image_module::fromarray(const Py::Tuple& args)
    +{
    +    _VERBOSE("_image_module::fromarray");
     
    -  imo->rowsIn  = A->dimensions[0];
    -  imo->colsIn  = A->dimensions[1];
    +    args.verify_length(2);
     
    +    Py::Object x = args[0];
    +    int isoutput = Py::Int(args[1]);
    +    PyArrayObject *A = (PyArrayObject *) PyArray_FromObject(x.ptr(), PyArray_DOUBLE, 2, 3);
    +    if (A == NULL)
    +    {
    +        throw Py::ValueError("Array must be rank 2 or 3 of doubles");
    +    }
    +    Py::Object A_obj((PyObject *)A, true);
     
    -  size_t NUMBYTES(imo->colsIn * imo->rowsIn * imo->BPP);
    -  agg::int8u *buffer = new agg::int8u[NUMBYTES];
    -  if (buffer==NULL) //todo: also handle allocation throw
    -    throw Py::MemoryError("_image_module::fromarray could not allocate memory");
    +    Image* imo = new Image;
     
    -  if (isoutput) {
    -    // make the output buffer point to the input buffer
    +    imo->rowsIn  = A->dimensions[0];
    +    imo->colsIn  = A->dimensions[1];
     
    -    imo->rowsOut  = imo->rowsIn;
    -    imo->colsOut  = imo->colsIn;
    +    size_t NUMBYTES(imo->colsIn * imo->rowsIn * imo->BPP);
    +    agg::int8u *buffer = new agg::int8u[NUMBYTES];
    +    if (buffer == NULL) //todo: also handle allocation throw
    +    {
    +        throw Py::MemoryError("_image_module::fromarray could not allocate memory");
    +    }
     
    -    imo->rbufOut = new agg::rendering_buffer;
    -    imo->bufferOut = buffer;
    -    imo->rbufOut->attach(imo->bufferOut, imo->colsOut, imo->rowsOut, imo->colsOut * imo->BPP);
    +    if (isoutput)
    +    {
    +        // make the output buffer point to the input buffer
    +        imo->rowsOut  = imo->rowsIn;
    +        imo->colsOut  = imo->colsIn;
    +
    +        imo->rbufOut = new agg::rendering_buffer;
    +        imo->bufferOut = buffer;
    +        imo->rbufOut->attach(imo->bufferOut, imo->colsOut, imo->rowsOut, imo->colsOut * imo->BPP);
    +    }
    +    else
    +    {
    +        imo->bufferIn = buffer;
    +        imo->rbufIn = new agg::rendering_buffer;
    +        imo->rbufIn->attach(buffer, imo->colsIn, imo->rowsIn, imo->colsIn*imo->BPP);
    +    }
     
    -  }
    -  else {
    -    imo->bufferIn = buffer;
    -    imo->rbufIn = new agg::rendering_buffer;
    -    imo->rbufIn->attach(buffer, imo->colsIn, imo->rowsIn, imo->colsIn*imo->BPP);
    -  }
    -
    -  if   (A->nd == 2) { //assume luminance for now;
    -
    -    agg::int8u gray;
    -    for (size_t rownum=0; rownumrowsIn; rownum++) {
    -     for (size_t colnum=0; colnumcolsIn; colnum++) {
    -       double val = *(double *)(A->data + rownum*A->strides[0] + colnum*A->strides[1]);
    -
    -       gray = int(255 * val);
    -       *buffer++ = gray;       // red
    -       *buffer++ = gray;       // green
    -       *buffer++ = gray;       // blue
    -       *buffer++   = 255;        // alpha
    -     }
    -    }
    -  }
    -  else if   (A->nd == 3) { // assume RGB
    -
    -    if (A->dimensions[2] != 3 && A->dimensions[2] != 4 ) {
    -      Py_XDECREF(A);
    -      throw Py::ValueError(Printf("3rd dimension must be length 3 (RGB) or 4 (RGBA); found %d", A->dimensions[2]).str());
    +    if (A->nd == 2)     //assume luminance for now;
    +    {
    +        agg::int8u gray;
    +        for (size_t rownum = 0; rownum < imo->rowsIn; rownum++)
    +        {
    +            for (size_t colnum = 0; colnum < imo->colsIn; colnum++)
    +            {
    +                double val = *(double *)(A->data + rownum * A->strides[0] + colnum * A->strides[1]);
     
    +                gray = int(255 * val);
    +                *buffer++ = gray;       // red
    +                *buffer++ = gray;       // green
    +                *buffer++ = gray;       // blue
    +                *buffer++   = 255;        // alpha
    +            }
    +        }
         }
    +    else if (A->nd == 3)     // assume RGB
    +    {
    +
    +        if (A->dimensions[2] != 3 && A->dimensions[2] != 4)
    +        {
    +            throw Py::ValueError(Printf("3rd dimension must be length 3 (RGB) or 4 (RGBA); found %d", A->dimensions[2]).str());
    +        }
     
    -    int rgba = A->dimensions[2]==4;
    -    double r,g,b,alpha;
    -    int offset =0;
    -
    -    for (size_t rownum=0; rownumrowsIn; rownum++) {
    -      for (size_t colnum=0; colnumcolsIn; colnum++) {
    -	offset = rownum*A->strides[0] + colnum*A->strides[1];
    -	r = *(double *)(A->data + offset);
    -	g = *(double *)(A->data + offset + A->strides[2] );
    -	b = *(double *)(A->data + offset + 2*A->strides[2] );
    -
    -	if (rgba)
    -	  alpha = *(double *)(A->data + offset + 3*A->strides[2] );
    -	else
    -	  alpha = 1.0;
    -
    -	*buffer++ = int(255*r);         // red
    -	*buffer++ = int(255*g);         // green
    -	*buffer++ = int(255*b);         // blue
    -	*buffer++ = int(255*alpha);     // alpha
    -
    -      }
    -    }
    -
    -  }
    -  else   { // error
    -    Py_XDECREF(A);
    -    throw Py::ValueError("Illegal array rank; must be rank; must 2 or 3");
    -  }
    -  buffer -= NUMBYTES;
    -  Py_XDECREF(A);
    +        int rgba = A->dimensions[2] == 4;
    +        double r, g, b, alpha;
    +        size_t offset = 0;
    +
    +        for (size_t rownum = 0; rownum < imo->rowsIn; rownum++)
    +        {
    +            for (size_t colnum = 0; colnum < imo->colsIn; colnum++)
    +            {
    +                offset = rownum * A->strides[0] + colnum * A->strides[1];
    +                r = *(double *)(A->data + offset);
    +                g = *(double *)(A->data + offset + A->strides[2]);
    +                b = *(double *)(A->data + offset + 2 * A->strides[2]);
    +
    +                if (rgba)
    +                {
    +                    alpha = *(double *)(A->data + offset + 3 * A->strides[2]);
    +                }
    +                else
    +                {
    +                    alpha = 1.0;
    +                }
    +
    +                *buffer++ = int(255 * r);       // red
    +                *buffer++ = int(255 * g);       // green
    +                *buffer++ = int(255 * b);       // blue
    +                *buffer++ = int(255 * alpha);   // alpha
    +            }
    +        }
    +    }
    +    else     // error
    +    {
    +        throw Py::ValueError("Illegal array rank; must be rank; must 2 or 3");
    +    }
    +    buffer -= NUMBYTES;
     
    -  return Py::asObject( imo );
    +    return Py::asObject(imo);
     }
     
     char _image_module_fromarray2__doc__[] =
    -"fromarray2(A, isoutput)\n"
    -"\n"
    -"Load the image from a numpy array\n"
    -"By default this function fills the input buffer, which can subsequently\n"
    -"be resampled using resize.  If isoutput=1, fill the output buffer.\n"
    -"This is used to support raw pixel images w/o resampling"
    -;
    +    "fromarray2(A, isoutput)\n"
    +    "\n"
    +    "Load the image from a numpy array\n"
    +    "By default this function fills the input buffer, which can subsequently\n"
    +    "be resampled using resize.  If isoutput=1, fill the output buffer.\n"
    +    "This is used to support raw pixel images w/o resampling"
    +    ;
     Py::Object
    -_image_module::fromarray2(const Py::Tuple& args) {
    -  _VERBOSE("_image_module::fromarray2");
    +_image_module::fromarray2(const Py::Tuple& args)
    +{
    +    _VERBOSE("_image_module::fromarray2");
     
    -  args.verify_length(2);
    +    args.verify_length(2);
     
    -  Py::Object x = args[0];
    -  int isoutput = Py::Int(args[1]);
    -  PyArrayObject *A = (PyArrayObject *) PyArray_ContiguousFromObject(x.ptr(), PyArray_DOUBLE, 2, 3);
    -  //PyArrayObject *A = (PyArrayObject *) PyArray_FromObject(x.ptr(), PyArray_DOUBLE, 2, 3);
    +    Py::Object x = args[0];
    +    int isoutput = Py::Int(args[1]);
    +    PyArrayObject *A = (PyArrayObject *) PyArray_ContiguousFromObject(x.ptr(), PyArray_DOUBLE, 2, 3);
    +    if (A == NULL)
    +    {
    +        throw Py::ValueError("Array must be rank 2 or 3 of doubles");
    +    }
    +    Py::Object A_obj((PyObject*)A, true);
     
    -  if (A==NULL)
    -    throw Py::ValueError("Array must be rank 2 or 3 of doubles");
    +    Image* imo = new Image;
    +
    +    imo->rowsIn  = A->dimensions[0];
    +    imo->colsIn  = A->dimensions[1];
     
    +    size_t NUMBYTES(imo->colsIn * imo->rowsIn * imo->BPP);
    +    agg::int8u *buffer = new agg::int8u[NUMBYTES];
    +    if (buffer == NULL) //todo: also handle allocation throw
    +    {
    +        throw Py::MemoryError("_image_module::fromarray could not allocate memory");
    +    }
    +
    +    if (isoutput)
    +    {
    +        // make the output buffer point to the input buffer
    +        imo->rowsOut  = imo->rowsIn;
    +        imo->colsOut  = imo->colsIn;
    +
    +        imo->rbufOut = new agg::rendering_buffer;
    +        imo->bufferOut = buffer;
    +        imo->rbufOut->attach(imo->bufferOut, imo->colsOut, imo->rowsOut, imo->colsOut * imo->BPP);
    +    }
    +    else
    +    {
    +        imo->bufferIn = buffer;
    +        imo->rbufIn = new agg::rendering_buffer;
    +        imo->rbufIn->attach(buffer, imo->colsIn, imo->rowsIn, imo->colsIn*imo->BPP);
    +    }
    +
    +    if (A->nd == 2)     //assume luminance for now;
    +    {
    +        agg::int8u gray;
    +        const size_t N = imo->rowsIn * imo->colsIn;
    +        size_t i = 0;
    +        while (i++ < N)
    +        {
    +            double val = *(double *)(A->data++);
     
    -  Image* imo = new Image;
    +            gray = int(255 * val);
    +            *buffer++ = gray;       // red
    +            *buffer++ = gray;       // green
    +            *buffer++ = gray;       // blue
    +            *buffer++   = 255;        // alpha
    +        }
     
    -  imo->rowsIn  = A->dimensions[0];
    -  imo->colsIn  = A->dimensions[1];
    +    }
    +    else if (A->nd == 3)     // assume RGB
    +    {
    +        if (A->dimensions[2] != 3 && A->dimensions[2] != 4)
    +        {
    +            throw Py::ValueError(Printf("3rd dimension must be length 3 (RGB) or 4 (RGBA); found %d", A->dimensions[2]).str());
     
    +        }
     
    -  size_t NUMBYTES(imo->colsIn * imo->rowsIn * imo->BPP);
    -  agg::int8u *buffer = new agg::int8u[NUMBYTES];
    -  if (buffer==NULL) //todo: also handle allocation throw
    -    throw Py::MemoryError("_image_module::fromarray could not allocate memory");
    +        int rgba = A->dimensions[2] == 4;
    +        double r, g, b, alpha;
    +        const size_t N = imo->rowsIn * imo->colsIn;
    +        size_t i = 0;
    +        while (i < N)
    +        {
    +            r = *(double *)(A->data++);
    +            g = *(double *)(A->data++);
    +            b = *(double *)(A->data++);
    +
    +            if (rgba)
    +                alpha = *(double *)(A->data++);
    +            else
    +                alpha = 1.0;
    +
    +            *buffer++ = int(255 * r);       // red
    +            *buffer++ = int(255 * g);       // green
    +            *buffer++ = int(255 * b);       // blue
    +            *buffer++ = int(255 * alpha);   // alpha
     
    -  if (isoutput) {
    -    // make the output buffer point to the input buffer
    +        }
    +    }
    +    else     // error
    +    {
    +        throw Py::ValueError("Illegal array rank; must be rank; must 2 or 3");
    +    }
    +    buffer -= NUMBYTES;
     
    -    imo->rowsOut  = imo->rowsIn;
    -    imo->colsOut  = imo->colsIn;
    +    return Py::asObject(imo);
    +}
     
    -    imo->rbufOut = new agg::rendering_buffer;
    -    imo->bufferOut = buffer;
    -    imo->rbufOut->attach(imo->bufferOut, imo->colsOut, imo->rowsOut, imo->colsOut * imo->BPP);
    +char _image_module_frombyte__doc__[] =
    +    "frombyte(A, isoutput)\n"
    +    "\n"
    +    "Load the image from a byte array.\n"
    +    "By default this function fills the input buffer, which can subsequently\n"
    +    "be resampled using resize.  If isoutput=1, fill the output buffer.\n"
    +    "This is used to support raw pixel images w/o resampling."
    +    ;
    +Py::Object
    +_image_module::frombyte(const Py::Tuple& args)
    +{
    +    _VERBOSE("_image_module::frombyte");
     
    -  }
    -  else {
    -    imo->bufferIn = buffer;
    -    imo->rbufIn = new agg::rendering_buffer;
    -    imo->rbufIn->attach(buffer, imo->colsIn, imo->rowsIn, imo->colsIn*imo->BPP);
    -  }
    +    args.verify_length(2);
     
    -  if   (A->nd == 2) { //assume luminance for now;
    +    Py::Object x = args[0];
    +    int isoutput = Py::Int(args[1]);
     
    -    agg::int8u gray;
    -    const size_t N = imo->rowsIn * imo->colsIn;
    -    size_t i = 0;
    -    while (i++data++);
    +    PyArrayObject *A = (PyArrayObject *) PyArray_ContiguousFromObject(x.ptr(), PyArray_UBYTE, 3, 3);
    +    if (A == NULL)
    +    {
    +        throw Py::ValueError("Array must have 3 dimensions");
    +    }
    +    Py::Object A_obj((PyObject*)A, true);
     
    -      gray = int(255 * val);
    -      *buffer++ = gray;       // red
    -      *buffer++ = gray;       // green
    -      *buffer++ = gray;       // blue
    -      *buffer++   = 255;        // alpha
    +    if (A->dimensions[2] < 3 || A->dimensions[2] > 4)
    +    {
    +        throw Py::ValueError("Array dimension 3 must have size 3 or 4");
         }
     
    -  }
    -  else if   (A->nd == 3) { // assume RGB
    +    Image* imo = new Image;
    +
    +    imo->rowsIn = A->dimensions[0];
    +    imo->colsIn = A->dimensions[1];
    +
    +    agg::int8u *arrbuf;
    +    agg::int8u *buffer;
    +
    +    arrbuf = reinterpret_cast(A->data);
     
    -    if (A->dimensions[2] != 3 && A->dimensions[2] != 4 ) {
    -      Py_XDECREF(A);
    -      throw Py::ValueError(Printf("3rd dimension must be length 3 (RGB) or 4 (RGBA); found %d", A->dimensions[2]).str());
    +    size_t NUMBYTES(imo->colsIn * imo->rowsIn * imo->BPP);
    +    buffer = new agg::int8u[NUMBYTES];
     
    +    if (buffer == NULL) //todo: also handle allocation throw
    +    {
    +        throw Py::MemoryError("_image_module::frombyte could not allocate memory");
         }
     
    -    int rgba = A->dimensions[2]==4;
    -    double r,g,b,alpha;
    -    const size_t N = imo->rowsIn * imo->colsIn;
    +    const size_t N = imo->rowsIn * imo->colsIn * imo->BPP;
         size_t i = 0;
    -    while (idata++);
    -	g = *(double *)(A->data++);
    -	b = *(double *)(A->data++);
    -
    -	if (rgba)
    -	  alpha = *(double *)(A->data++);
    -	else
    -	  alpha = 1.0;
    -
    -	*buffer++ = int(255*r);         // red
    -	*buffer++ = int(255*g);         // green
    -	*buffer++ = int(255*b);         // blue
    -	*buffer++ = int(255*alpha);     // alpha
    -
    -      }
    -
    -  }
    -  else   { // error
    -    Py_XDECREF(A);
    -    throw Py::ValueError("Illegal array rank; must be rank; must 2 or 3");
    -  }
    -  buffer -= NUMBYTES;
    -  Py_XDECREF(A);
    +    if (A->dimensions[2] == 4)
    +    {
    +        memmove(buffer, arrbuf, N);
    +    }
    +    else
    +    {
    +        while (i < N)
    +        {
    +            memmove(buffer, arrbuf, 3);
    +            buffer += 3;
    +            arrbuf += 3;
    +            *buffer++ = 255;
    +            i += 4;
    +        }
    +        buffer -= N;
    +        arrbuf -= imo->rowsIn * imo->colsIn;
    +    }
    +
    +    if (isoutput)
    +    {
    +        // make the output buffer point to the input buffer
    +
    +        imo->rowsOut  = imo->rowsIn;
    +        imo->colsOut  = imo->colsIn;
    +
    +        imo->rbufOut = new agg::rendering_buffer;
    +        imo->bufferOut = buffer;
    +        imo->rbufOut->attach(imo->bufferOut, imo->colsOut, imo->rowsOut, imo->colsOut * imo->BPP);
    +
    +    }
    +    else
    +    {
    +        imo->bufferIn = buffer;
    +        imo->rbufIn = new agg::rendering_buffer;
    +        imo->rbufIn->attach(buffer, imo->colsIn, imo->rowsIn, imo->colsIn*imo->BPP);
    +    }
     
    -  return Py::asObject( imo );
    +    return Py::asObject(imo);
     }
     
    -char _image_module_frombyte__doc__[] =
    -"frombyte(A, isoutput)\n"
    -"\n"
    -"Load the image from a byte array.\n"
    -"By default this function fills the input buffer, which can subsequently\n"
    -"be resampled using resize.  If isoutput=1, fill the output buffer.\n"
    -"This is used to support raw pixel images w/o resampling."
    -;
    -Py::Object
    -_image_module::frombyte(const Py::Tuple& args) {
    -  _VERBOSE("_image_module::frombyte");
    -
    -  args.verify_length(2);
    -
    -  Py::Object x = args[0];
    -  int isoutput = Py::Int(args[1]);
    -
    -  PyArrayObject *A = (PyArrayObject *) PyArray_ContiguousFromObject(x.ptr(), PyArray_UBYTE, 3, 3);
    -  if (A == NULL)
    -      throw Py::ValueError("Array must have 3 dimensions");
    -  if (A->dimensions[2]<3 || A->dimensions[2]>4)
    -      throw Py::ValueError("Array dimension 3 must have size 3 or 4");
    -
    -  Image* imo = new Image;
    -
    -  imo->rowsIn = A->dimensions[0];
    -  imo->colsIn = A->dimensions[1];
    -
    -  agg::int8u *arrbuf;
    -  agg::int8u *buffer;
    -
    -  arrbuf = reinterpret_cast(A->data);
    -
    -  size_t NUMBYTES(imo->colsIn * imo->rowsIn * imo->BPP);
    -  buffer = new agg::int8u[NUMBYTES];
    -
    -  if (buffer==NULL) //todo: also handle allocation throw
    -      throw Py::MemoryError("_image_module::frombyte could not allocate memory");
    -
    -  const size_t N = imo->rowsIn * imo->colsIn * imo->BPP;
    -  size_t i = 0;
    -  if (A->dimensions[2] == 4) {
    -      memmove(buffer, arrbuf, N);
    -  } else {
    -      while (i < N) {
    -          memmove(buffer, arrbuf, 3);
    -          buffer += 3;
    -          arrbuf += 3;
    -          *buffer++ = 255;
    -          i += 4;
    -      }
    -      buffer -= N;
    -      arrbuf -= imo->rowsIn * imo->colsIn;
    -  }
    -  Py_XDECREF(A);
    +char _image_module_frombuffer__doc__[] =
    +    "frombuffer(buffer, width, height, isoutput)\n"
    +    "\n"
    +    "Load the image from a character buffer\n"
    +    "By default this function fills the input buffer, which can subsequently\n"
    +    "be resampled using resize.  If isoutput=1, fill the output buffer.\n"
    +    "This is used to support raw pixel images w/o resampling."
    +    ;
    +Py::Object
    +_image_module::frombuffer(const Py::Tuple& args)
    +{
    +    _VERBOSE("_image_module::frombuffer");
     
    -  if (isoutput) {
    -    // make the output buffer point to the input buffer
    +    args.verify_length(4);
     
    -    imo->rowsOut  = imo->rowsIn;
    -    imo->colsOut  = imo->colsIn;
    +    PyObject *bufin = new_reference_to(args[0]);
    +    size_t x = Py::Int(args[1]);
    +    size_t y = Py::Int(args[2]);
     
    -    imo->rbufOut = new agg::rendering_buffer;
    -    imo->bufferOut = buffer;
    -    imo->rbufOut->attach(imo->bufferOut, imo->colsOut, imo->rowsOut, imo->colsOut * imo->BPP);
    +    if (x >= 32768 || y >= 32768)
    +    {
    +        throw Py::ValueError("x and y must both be less than 32768");
    +    }
     
    -  }
    -  else {
    -    imo->bufferIn = buffer;
    -    imo->rbufIn = new agg::rendering_buffer;
    -    imo->rbufIn->attach(buffer, imo->colsIn, imo->rowsIn, imo->colsIn*imo->BPP);
    -  }
    +    int isoutput = Py::Int(args[3]);
     
    -  return Py::asObject( imo );
    -}
    +    if (PyObject_CheckReadBuffer(bufin) != 1)
    +        throw Py::ValueError("First argument must be a buffer.");
     
    -char _image_module_frombuffer__doc__[] =
    -"frombuffer(buffer, width, height, isoutput)\n"
    -"\n"
    -"Load the image from a character buffer\n"
    -"By default this function fills the input buffer, which can subsequently\n"
    -"be resampled using resize.  If isoutput=1, fill the output buffer.\n"
    -"This is used to support raw pixel images w/o resampling."
    -;
    -Py::Object
    -_image_module::frombuffer(const Py::Tuple& args) {
    -  _VERBOSE("_image_module::frombuffer");
    -
    -  args.verify_length(4);
    -
    -  PyObject *bufin = new_reference_to(args[0]);
    -  size_t x = Py::Int(args[1]);
    -  size_t y = Py::Int(args[2]);
    -
    -  if (x >= 32768 || y >= 32768) {
    -    throw Py::ValueError("x and y must both be less than 32768");
    -  }
    -
    -  int isoutput = Py::Int(args[3]);
    -
    -  if (PyObject_CheckReadBuffer(bufin) != 1)
    -    throw Py::ValueError("First argument must be a buffer.");
    -
    -  Image* imo = new Image;
    -
    -  imo->rowsIn = y;
    -  imo->colsIn = x;
    -  Py_ssize_t NUMBYTES(imo->colsIn * imo->rowsIn * imo->BPP);
    -
    -  Py_ssize_t buflen;
    -  const agg::int8u *rawbuf;
    -  if (PyObject_AsReadBuffer(bufin, reinterpret_cast(&rawbuf), &buflen) != 0)
    -    throw Py::ValueError("Cannot get buffer from object.");
    -
    -  // Check buffer is required size.
    -  if (buflen != NUMBYTES)
    -    throw Py::ValueError("Buffer length must be width * height * 4.");
    -
    -  // Copy from input buffer to new buffer for agg.
    -  agg::int8u* buffer = new agg::int8u[NUMBYTES];
    -  if (buffer==NULL) //todo: also handle allocation throw
    -    throw Py::MemoryError("_image_module::frombuffer could not allocate memory");
    -  memmove(buffer, rawbuf, NUMBYTES);
    +    Image* imo = new Image;
     
    -  if (isoutput) {
    -    // make the output buffer point to the input buffer
    +    imo->rowsIn = y;
    +    imo->colsIn = x;
    +    Py_ssize_t NUMBYTES(imo->colsIn * imo->rowsIn * imo->BPP);
    +
    +    Py_ssize_t buflen;
    +    const agg::int8u *rawbuf;
    +    if (PyObject_AsReadBuffer(bufin, reinterpret_cast(&rawbuf), &buflen) != 0)
    +    {
    +        throw Py::ValueError("Cannot get buffer from object.");
    +    }
     
    -    imo->rowsOut  = imo->rowsIn;
    -    imo->colsOut  = imo->colsIn;
    +    // Check buffer is required size.
    +    if (buflen != NUMBYTES)
    +    {
    +        throw Py::ValueError("Buffer length must be width * height * 4.");
    +    }
     
    -    imo->rbufOut = new agg::rendering_buffer;
    -    imo->bufferOut = buffer;
    -    imo->rbufOut->attach(imo->bufferOut, imo->colsOut, imo->rowsOut, imo->colsOut * imo->BPP);
    +    // Copy from input buffer to new buffer for agg.
    +    agg::int8u* buffer = new agg::int8u[NUMBYTES];
    +    if (buffer == NULL) //todo: also handle allocation throw
    +    {
    +        throw Py::MemoryError("_image_module::frombuffer could not allocate memory");
    +    }
    +    memmove(buffer, rawbuf, NUMBYTES);
     
    -  }
    -  else {
    -    imo->bufferIn = buffer;
    -    imo->rbufIn = new agg::rendering_buffer;
    -    imo->rbufIn->attach(buffer, imo->colsIn, imo->rowsIn, imo->colsIn*imo->BPP);
    -  }
    +    if (isoutput)
    +    {
    +        // make the output buffer point to the input buffer
    +        imo->rowsOut  = imo->rowsIn;
    +        imo->colsOut  = imo->colsIn;
    +
    +        imo->rbufOut = new agg::rendering_buffer;
    +        imo->bufferOut = buffer;
    +        imo->rbufOut->attach(imo->bufferOut, imo->colsOut, imo->rowsOut, imo->colsOut * imo->BPP);
     
    -  return Py::asObject(imo);
    +    }
    +    else
    +    {
    +        imo->bufferIn = buffer;
    +        imo->rbufIn = new agg::rendering_buffer;
    +        imo->rbufIn->attach(buffer, imo->colsIn, imo->rowsIn, imo->colsIn*imo->BPP);
    +    }
    +
    +    return Py::asObject(imo);
     }
     
     // utilities for irregular grids
    -void _bin_indices_middle(unsigned int *irows, int nrows, float *ys1, int ny,float dy, float y_min)
    -{ int  i,j, j_last;
    -   unsigned  int * rowstart = irows;
    -  float *ys2 = ys1+1;
    -  float *yl = ys1 + ny ;
    -  float yo = y_min + dy/2.0;
    -  float ym = 0.5f*(*ys1 + *ys2);
    -  // y/rows
    -   j = 0;
    -   j_last = j;
    -  for (i=0;i ym) {
    -          ys1 = ys2;
    -          ys2 = ys1+1;
    -          ym = 0.5f*(*ys1 + *ys2);
    -          j++;
    -      }
    -      *rowstart = j - j_last;
    -      j_last = j;
    -  }
    +void _bin_indices_middle(unsigned int *irows, int nrows, float *ys1, int ny, float dy, float y_min)
    +{
    +    int  i, j, j_last;
    +    unsigned  int * rowstart = irows;
    +    float *ys2 = ys1 + 1;
    +    float *yl = ys1 + ny ;
    +    float yo = y_min + dy / 2.0;
    +    float ym = 0.5f * (*ys1 + *ys2);
    +    // y/rows
    +    j = 0;
    +    j_last = j;
    +    for (i = 0;i < nrows;i++, yo += dy, rowstart++)
    +    {
    +        while (ys2 != yl && yo > ym)
    +        {
    +            ys1 = ys2;
    +            ys2 = ys1 + 1;
    +            ym = 0.5f * (*ys1 + *ys2);
    +            j++;
    +        }
    +        *rowstart = j - j_last;
    +        j_last = j;
    +    }
     }
     
    -void _bin_indices_middle_linear(float *arows, unsigned int *irows, int nrows, float *y, int ny,float dy, float y_min)
    -{ int i;
    +void _bin_indices_middle_linear(float *arows, unsigned int *irows, int nrows, float *y, int ny, float dy, float y_min)
    +{
    +    int i;
         int ii = 0;
    -    int iilast = ny-1;
    -    float sc = 1/dy;
    -    int iy0 = (int)floor(sc * (y[ii]  - y_min) );
    -    int iy1 = (int)floor(sc * (y[ii+1]  - y_min) );
    -    float invgap=1.0f/(iy1-iy0);
    -    for (i=0; i= 32768 || cols >= 32768)
    +    {
    +        throw Py::ValueError("rows and cols must both be less than 32768");
    +    }
    +
    +    if (bounds.length() != 4)
    +    {
    +        throw Py::TypeError("Incorrect number of bounds (4 expected)");
    +    }
    +
    +    float x_min = Py::Float(bounds[0]);
    +    float x_max = Py::Float(bounds[1]);
    +    float y_min = Py::Float(bounds[2]);
    +    float y_max = Py::Float(bounds[3]);
    +    float width = x_max - x_min;
    +    float height = y_max - y_min;
    +    float dx = width / ((float) cols);
    +    float dy = height / ((float) rows);
    +
    +    // Check we have something to output to
    +    if (rows == 0 || cols == 0)
    +    {
    +        throw Py::ValueError("Cannot scale to zero size");
    +    }
     
    -  if (args.length() != 7)
    -      throw Py::TypeError("Incorrect number of arguments (7 expected)");
    +    PyArrayObject *x = NULL;
    +    PyArrayObject *y = NULL;
    +    PyArrayObject *d = NULL;
    +    unsigned int *rowstarts = NULL;
    +    unsigned int *colstarts = NULL;
    +    float *acols = NULL;
    +    float *arows = NULL;
     
    -  Py::Object xp = args[0];
    -  Py::Object yp = args[1];
    -  Py::Object dp = args[2];
    -  unsigned int rows = Py::Int(args[3]);
    -  unsigned int cols = Py::Int(args[4]);
    -  Py::Tuple bounds = args[5];
    -  unsigned int interpolation = Py::Int(args[6]);
    -
    -  if (rows >= 32768 || cols >= 32768) {
    -    throw Py::ValueError("rows and cols must both be less than 32768");
    -  }
    -
    -  if (bounds.length() !=4)
    -      throw Py::TypeError("Incorrect number of bounds (4 expected)");
    -  float x_min = Py::Float(bounds[0]);
    -  float x_max = Py::Float(bounds[1]);
    -  float y_min = Py::Float(bounds[2]);
    -  float y_max = Py::Float(bounds[3]);
    -  float width = x_max - x_min;
    -  float height = y_max - y_min;
    -  float dx = width / ((float) cols);
    -  float dy = height / ((float) rows);
    -
    -  // Check we have something to output to
    -  if (rows == 0 || cols ==0)
    -      throw Py::ValueError("Cannot scale to zero size");
    -
    -  PyArrayObject *x = NULL; PyArrayObject *y = NULL; PyArrayObject *d = NULL;
    -  unsigned int * rowstarts = NULL; unsigned int*colstarts = NULL;
    -  float *acols = NULL; float *arows = NULL;
    -
    -  // Get numpy arrays
    -  x = (PyArrayObject *) PyArray_ContiguousFromObject(xp.ptr(), PyArray_FLOAT, 1, 1);
    -  if (x == NULL) {
    -      _pcolor_cleanup(x,y,d,rowstarts,colstarts,acols,arows);
    -      throw Py::ValueError("x is of incorrect type (wanted 1D float)");
    -  }
    -  y = (PyArrayObject *) PyArray_ContiguousFromObject(yp.ptr(), PyArray_FLOAT, 1, 1);
    -  if (y == NULL) {
    -     _pcolor_cleanup(x,y,d,rowstarts,colstarts,acols,arows);
    -     throw Py::ValueError("y is of incorrect type (wanted 1D float)");
    -  }
    -  d = (PyArrayObject *) PyArray_ContiguousFromObject(dp.ptr(), PyArray_UBYTE, 3, 3);
    -  if (d == NULL) {
    -     _pcolor_cleanup(x,y,d,rowstarts,colstarts,acols,arows);
    -      throw Py::ValueError("data is of incorrect type (wanted 3D UInt8)");
    -  }
    -  if (d->dimensions[2] != 4) {
    -     _pcolor_cleanup(x,y,d,rowstarts,colstarts,acols,arows);
    -      throw Py::ValueError("data must be in RGBA format");
    -  }
    -
    -  // Check dimensions match
    -  int nx = x->dimensions[0];
    -  int ny = y->dimensions[0];
    -  if (nx != d->dimensions[1] || ny != d->dimensions[0]) {
    -     _pcolor_cleanup(x,y,d,rowstarts,colstarts,acols,arows);
    -      throw Py::ValueError("data and axis dimensions do not match");
    -  }
    -
    -  // Allocate memory for pointer arrays
    -  rowstarts = reinterpret_cast(PyMem_Malloc(sizeof(unsigned int)*rows));
    -  if (rowstarts == NULL) {
    -     _pcolor_cleanup(x,y,d,rowstarts,colstarts,acols,arows);
    -      throw Py::MemoryError("Cannot allocate memory for lookup table");
    -  }
    -  colstarts = reinterpret_cast(PyMem_Malloc(sizeof(unsigned int)*cols));
    -  if (colstarts == NULL) {
    -     _pcolor_cleanup(x,y,d,rowstarts,colstarts,acols,arows);
    -      throw Py::MemoryError("Cannot allocate memory for lookup table");
    -  }
    -
    -  // Create output
    -  Image* imo = new Image;
    -  imo->rowsIn = rows;
    -  imo->colsIn = cols;
    -  imo->rowsOut = rows;
    -  imo->colsOut = cols;
    -  size_t NUMBYTES(rows * cols * 4);
    -  agg::int8u *buffer = new agg::int8u[NUMBYTES];
    -  if (buffer == NULL) {
    -     _pcolor_cleanup(x,y,d,rowstarts,colstarts,acols,arows);
    -      throw Py::MemoryError("Could not allocate memory for image");
    -  }
    -
    -
    -  // Calculate the pointer arrays to map input x to output x
    -  unsigned int i, j;
    -  unsigned int * colstart = colstarts;
    -  unsigned int * rowstart = rowstarts;
    -  float *xs1 = reinterpret_cast(x->data);
    -  float *ys1 = reinterpret_cast(y->data);
    -
    -
    -  // Copy data to output buffer
    -  unsigned char *start;
    -  unsigned char *inposition;
    -  size_t inrowsize(nx*4);
    -  size_t rowsize(cols*4);
    -  rowstart = rowstarts;
    -  agg::int8u * position = buffer;
    -  agg::int8u * oldposition = NULL;
    -  start = reinterpret_cast(d->data);
    +    // Get numpy arrays
    +    x = (PyArrayObject *) PyArray_ContiguousFromObject(xp.ptr(), PyArray_FLOAT, 1, 1);
    +    if (x == NULL)
    +    {
    +        _pcolor_cleanup(x, y, d, rowstarts, colstarts, acols, arows);
    +        throw Py::ValueError("x is of incorrect type (wanted 1D float)");
    +    }
    +    y = (PyArrayObject *) PyArray_ContiguousFromObject(yp.ptr(), PyArray_FLOAT, 1, 1);
    +    if (y == NULL)
    +    {
    +        _pcolor_cleanup(x, y, d, rowstarts, colstarts, acols, arows);
    +        throw Py::ValueError("y is of incorrect type (wanted 1D float)");
    +    }
    +    d = (PyArrayObject *) PyArray_ContiguousFromObject(dp.ptr(), PyArray_UBYTE, 3, 3);
    +    if (d == NULL)
    +    {
    +        _pcolor_cleanup(x, y, d, rowstarts, colstarts, acols, arows);
    +        throw Py::ValueError("data is of incorrect type (wanted 3D UInt8)");
    +    }
    +    if (d->dimensions[2] != 4)
    +    {
    +        _pcolor_cleanup(x, y, d, rowstarts, colstarts, acols, arows);
    +        throw Py::ValueError("data must be in RGBA format");
    +    }
    +
    +    // Check dimensions match
    +    int nx = x->dimensions[0];
    +    int ny = y->dimensions[0];
    +    if (nx != d->dimensions[1] || ny != d->dimensions[0])
    +    {
    +        _pcolor_cleanup(x, y, d, rowstarts, colstarts, acols, arows);
    +        throw Py::ValueError("data and axis dimensions do not match");
    +    }
    +
    +    // Allocate memory for pointer arrays
    +    rowstarts = reinterpret_cast(PyMem_Malloc(sizeof(unsigned int) * rows));
    +    if (rowstarts == NULL)
    +    {
    +        _pcolor_cleanup(x, y, d, rowstarts, colstarts, acols, arows);
    +        throw Py::MemoryError("Cannot allocate memory for lookup table");
    +    }
    +    colstarts = reinterpret_cast(PyMem_Malloc(sizeof(unsigned int) * cols));
    +    if (colstarts == NULL)
    +    {
    +        _pcolor_cleanup(x, y, d, rowstarts, colstarts, acols, arows);
    +        throw Py::MemoryError("Cannot allocate memory for lookup table");
    +    }
    +
    +    // Create output
    +    Image* imo = new Image;
    +    imo->rowsIn = rows;
    +    imo->colsIn = cols;
    +    imo->rowsOut = rows;
    +    imo->colsOut = cols;
    +    size_t NUMBYTES(rows * cols * 4);
    +    agg::int8u *buffer = new agg::int8u[NUMBYTES];
    +    if (buffer == NULL)
    +    {
    +        _pcolor_cleanup(x, y, d, rowstarts, colstarts, acols, arows);
    +        throw Py::MemoryError("Could not allocate memory for image");
    +    }
    +
    +
    +    // Calculate the pointer arrays to map input x to output x
    +    unsigned int i, j;
    +    unsigned int * colstart = colstarts;
    +    unsigned int * rowstart = rowstarts;
    +    float *xs1 = reinterpret_cast(x->data);
    +    float *ys1 = reinterpret_cast(y->data);
    +
    +
    +    // Copy data to output buffer
    +    unsigned char *start;
    +    unsigned char *inposition;
    +    size_t inrowsize(nx*4);
    +    size_t rowsize(cols*4);
    +    rowstart = rowstarts;
    +    agg::int8u * position = buffer;
    +    agg::int8u * oldposition = NULL;
    +    start = reinterpret_cast(d->data);
         int s0 = d->strides[0];
         int s1 = d->strides[1];
     
    -  if(interpolation == Image::NEAREST) {
    -      _bin_indices_middle(colstart, cols, xs1,  nx,dx,x_min);
    -      _bin_indices_middle(rowstart, rows, ys1,  ny, dy,y_min);
    -      for(i=0;i 0 && *rowstart == 0) {
    -              memcpy(position, oldposition, rowsize*sizeof(agg::int8u));
    -              oldposition = position;
    -              position += rowsize;
    -          } else {
    -              oldposition = position;
    -              start += *rowstart * inrowsize;
    -              inposition = start;
    -              for(j=0,colstart=colstarts;j(PyMem_Malloc(sizeof(float)*rows));
    -      if (arows == NULL ) {
    -         _pcolor_cleanup(x,y,d,rowstarts,colstarts,acols,arows);
    -          throw Py::MemoryError("Cannot allocate memory for lookup table");
    -      }
    -      acols = reinterpret_cast(PyMem_Malloc(sizeof(float)*cols));
    -      if (acols == NULL) {
    -         _pcolor_cleanup(x,y,d,rowstarts,colstarts,acols,arows);
    -          throw Py::MemoryError("Cannot allocate memory for lookup table");
    -      }
    -
    -      _bin_indices_middle_linear(acols, colstart, cols, xs1,  nx,dx,x_min);
    -      _bin_indices_middle_linear(arows, rowstart, rows, ys1,  ny, dy,y_min);
    -      double a00,a01,a10,a11,alpha,beta;
    +    if (interpolation == Image::NEAREST)
    +    {
    +        _bin_indices_middle(colstart, cols, xs1,  nx, dx, x_min);
    +        _bin_indices_middle(rowstart, rows, ys1,  ny, dy, y_min);
    +        for (i = 0;i < rows;i++, rowstart++)
    +        {
    +            if (i > 0 && *rowstart == 0)
    +            {
    +                memcpy(position, oldposition, rowsize*sizeof(agg::int8u));
    +                oldposition = position;
    +                position += rowsize;
    +            }
    +            else
    +            {
    +                oldposition = position;
    +                start += *rowstart * inrowsize;
    +                inposition = start;
    +                for (j = 0, colstart = colstarts;j < cols;j++, position += 4, colstart++)
    +                {
    +                    inposition += *colstart * 4;
    +                    memcpy(position, inposition, 4*sizeof(agg::int8u));
    +                }
    +            }
    +        }
    +    }
    +    else if (interpolation == Image::BILINEAR)
    +    {
    +        arows = reinterpret_cast(PyMem_Malloc(sizeof(float) * rows));
    +        if (arows == NULL)
    +        {
    +            _pcolor_cleanup(x, y, d, rowstarts, colstarts, acols, arows);
    +            throw Py::MemoryError("Cannot allocate memory for lookup table");
    +        }
    +        acols = reinterpret_cast(PyMem_Malloc(sizeof(float) * cols));
    +        if (acols == NULL)
    +        {
    +            _pcolor_cleanup(x, y, d, rowstarts, colstarts, acols, arows);
    +            throw Py::MemoryError("Cannot allocate memory for lookup table");
    +        }
    +
    +        _bin_indices_middle_linear(acols, colstart, cols, xs1,  nx, dx, x_min);
    +        _bin_indices_middle_linear(arows, rowstart, rows, ys1,  ny, dy, y_min);
    +        double a00, a01, a10, a11, alpha, beta;
     
     
             agg::int8u * start00;
             agg::int8u * start01;
             agg::int8u * start10;
             agg::int8u * start11;
    -      // Copy data to output buffer
    -      for (i=0; irbufOut = new agg::rendering_buffer;
    -  imo->bufferOut = buffer;
    -  imo->rbufOut->attach(imo->bufferOut, imo->colsOut, imo->rowsOut, imo->colsOut * imo->BPP);
    +    // Attach output buffer to output buffer
    +    imo->rbufOut = new agg::rendering_buffer;
    +    imo->bufferOut = buffer;
    +    imo->rbufOut->attach(imo->bufferOut, imo->colsOut, imo->rowsOut, imo->colsOut * imo->BPP);
     
    -   _pcolor_cleanup(x,y,d,rowstarts,colstarts,acols,arows);
    +    _pcolor_cleanup(x, y, d, rowstarts, colstarts, acols, arows);
     
    -  return Py::asObject(imo);
    +    return Py::asObject(imo);
     
     }
     
    +void _pcolor2_cleanup(PyArrayObject* x, PyArrayObject* y, PyArrayObject *d,
    +                      PyArrayObject* bg, int *irows, int*jcols)
    +{
    +    Py_XDECREF(x);
    +    Py_XDECREF(y);
    +    Py_XDECREF(d);
    +    Py_XDECREF(bg);
    +    if (irows)
    +    {
    +        PyMem_Free(irows);
    +    }
    +    if (jcols)
    +    {
    +        PyMem_Free(jcols);
    +    }
    +}
    +
     
     char __image_module_pcolor2__doc__[] =
    -"pcolor2(x, y, data, rows, cols, bounds, bg)\n"
    -"\n"
    -"Generate a pseudo-color image from data on a non-uniform grid\n"
    -"specified by its cell boundaries.\n"
    -"bounds = (x_left, x_right, y_bot, y_top)\n"
    -"bg = ndarray of 4 uint8 representing background rgba\n"
    -;
    +    "pcolor2(x, y, data, rows, cols, bounds, bg)\n"
    +    "\n"
    +    "Generate a pseudo-color image from data on a non-uniform grid\n"
    +    "specified by its cell boundaries.\n"
    +    "bounds = (x_left, x_right, y_bot, y_top)\n"
    +    "bg = ndarray of 4 uint8 representing background rgba\n"
    +    ;
     Py::Object
    -_image_module::pcolor2(const Py::Tuple& args) {
    +_image_module::pcolor2(const Py::Tuple& args)
    +{
         _VERBOSE("_image_module::pcolor2");
     
         if (args.length() != 7)
    +    {
             throw Py::TypeError("Incorrect number of arguments (6 expected)");
    +    }
     
         Py::Object xp = args[0];
         Py::Object yp = args[1];
    @@ -1556,89 +1729,91 @@
         Py::Tuple bounds = args[5];
         Py::Object bgp = args[6];
     
    -    if (rows >= 32768 || cols >= 32768) {
    -      throw Py::ValueError("rows and cols must both be less than 32768");
    +    if (rows >= 32768 || cols >= 32768)
    +    {
    +        throw Py::ValueError("rows and cols must both be less than 32768");
         }
     
    -    if (bounds.length() !=4)
    +    if (bounds.length() != 4)
    +    {
             throw Py::TypeError("Incorrect number of bounds (4 expected)");
    +    }
    +
         double x_left = Py::Float(bounds[0]);
         double x_right = Py::Float(bounds[1]);
         double y_bot = Py::Float(bounds[2]);
         double y_top = Py::Float(bounds[3]);
     
         // Check we have something to output to
    -    if (rows == 0 || cols ==0)
    +    if (rows == 0 || cols == 0)
    +    {
             throw Py::ValueError("rows or cols is zero; there are no pixels");
    +    }
    +
    +    PyArrayObject* x = NULL;
    +    PyArrayObject* y = NULL;
    +    PyArrayObject* d = NULL;
    +    PyArrayObject* bg = NULL;
    +    int* irows = NULL;
    +    int* jcols = NULL;
     
         // Get numpy arrays
    -    PyArrayObject *x = (PyArrayObject *) PyArray_ContiguousFromObject(xp.ptr(),
    -                                                          PyArray_DOUBLE, 1, 1);
    +    x = (PyArrayObject *) PyArray_ContiguousFromObject(xp.ptr(), PyArray_DOUBLE, 1, 1);
         if (x == NULL)
    +    {
    +        _pcolor2_cleanup(x, y, d, bg, irows, jcols);
             throw Py::ValueError("x is of incorrect type (wanted 1D double)");
    -    PyArrayObject *y = (PyArrayObject *) PyArray_ContiguousFromObject(yp.ptr(),
    -                                                          PyArray_DOUBLE, 1, 1);
    -    if (y == NULL) {
    -        Py_XDECREF(x);
    +    }
    +    y = (PyArrayObject *) PyArray_ContiguousFromObject(yp.ptr(), PyArray_DOUBLE, 1, 1);
    +    if (y == NULL)
    +    {
    +        _pcolor2_cleanup(x, y, d, bg, irows, jcols);
             throw Py::ValueError("y is of incorrect type (wanted 1D double)");
         }
    -    PyArrayObject *d = (PyArrayObject *) PyArray_ContiguousFromObject(dp.ptr(),
    -                                                          PyArray_UBYTE, 3, 3);
    -    if (d == NULL) {
    -        Py_XDECREF(x);
    -        Py_XDECREF(y);
    +    d = (PyArrayObject *) PyArray_ContiguousFromObject(dp.ptr(), PyArray_UBYTE, 3, 3);
    +    if (d == NULL)
    +    {
    +        _pcolor2_cleanup(x, y, d, bg, irows, jcols);
             throw Py::ValueError("data is of incorrect type (wanted 3D uint8)");
         }
    -    if (d->dimensions[2] != 4) {
    -        Py_XDECREF(x);
    -        Py_XDECREF(y);
    -        Py_XDECREF(d);
    +    if (d->dimensions[2] != 4)
    +    {
    +        _pcolor2_cleanup(x, y, d, bg, irows, jcols);
             throw Py::ValueError("data must be in RGBA format");
         }
     
         // Check dimensions match
         int nx = x->dimensions[0];
         int ny = y->dimensions[0];
    -    if (nx != d->dimensions[1]+1 || ny != d->dimensions[0]+1) {
    -        Py_XDECREF(x);
    -        Py_XDECREF(y);
    -        Py_XDECREF(d);
    +    if (nx != d->dimensions[1] + 1 || ny != d->dimensions[0] + 1)
    +    {
    +        _pcolor2_cleanup(x, y, d, bg, irows, jcols);
             throw Py::ValueError("data and axis bin boundary dimensions are incompatible");
         }
     
    -    PyArrayObject *bg = (PyArrayObject *) PyArray_ContiguousFromObject(bgp.ptr(),
    -                                                          PyArray_UBYTE, 1, 1);
    -    if (bg == NULL) {
    -        Py_XDECREF(x);
    -        Py_XDECREF(y);
    -        Py_XDECREF(d);
    +    bg = (PyArrayObject *) PyArray_ContiguousFromObject(bgp.ptr(), PyArray_UBYTE, 1, 1);
    +    if (bg == NULL)
    +    {
    +        _pcolor2_cleanup(x, y, d, bg, irows, jcols);
             throw Py::ValueError("bg is of incorrect type (wanted 1D uint8)");
         }
    -    if (bg->dimensions[0] != 4) {
    -        Py_XDECREF(x);
    -        Py_XDECREF(y);
    -        Py_XDECREF(d);
    -        Py_XDECREF(bg);
    +    if (bg->dimensions[0] != 4)
    +    {
    +        _pcolor2_cleanup(x, y, d, bg, irows, jcols);
             throw Py::ValueError("bg must be in RGBA format");
         }
     
    -
         // Allocate memory for pointer arrays
    -    int * irows = reinterpret_cast(PyMem_Malloc(sizeof(int)*rows));
    -    if (irows == NULL) {
    -        Py_XDECREF(x);
    -        Py_XDECREF(y);
    -        Py_XDECREF(d);
    -        Py_XDECREF(bg);
    +    irows = reinterpret_cast(PyMem_Malloc(sizeof(int) * rows));
    +    if (irows == NULL)
    +    {
    +        _pcolor2_cleanup(x, y, d, bg, irows, jcols);
             throw Py::MemoryError("Cannot allocate memory for lookup table");
         }
    -    int * jcols = reinterpret_cast(PyMem_Malloc(sizeof(int)*cols));
    -    if (jcols == NULL) {
    -        Py_XDECREF(x);
    -        Py_XDECREF(y);
    -        Py_XDECREF(d);
    -        Py_XDECREF(bg);
    -        PyMem_Free(irows);
    +    jcols = reinterpret_cast(PyMem_Malloc(sizeof(int) * cols));
    +    if (jcols == NULL)
    +    {
    +        _pcolor2_cleanup(x, y, d, bg, irows, jcols);
             throw Py::MemoryError("Cannot allocate memory for lookup table");
         }
     
    @@ -1650,13 +1825,9 @@
         imo->colsOut = cols;
         size_t NUMBYTES(rows * cols * 4);
         agg::int8u *buffer = new agg::int8u[NUMBYTES];
    -    if (buffer == NULL) {
    -        Py_XDECREF(x);
    -        Py_XDECREF(y);
    -        Py_XDECREF(d);
    -        Py_XDECREF(bg);
    -        PyMem_Free(irows);
    -        PyMem_Free(jcols);
    +    if (buffer == NULL)
    +    {
    +        _pcolor2_cleanup(x, y, d, bg, irows, jcols);
             throw Py::MemoryError("Could not allocate memory for image");
         }
     
    @@ -1664,8 +1835,8 @@
         int i, j;
         double *x0 = reinterpret_cast(x->data);
         double *y0 = reinterpret_cast(y->data);
    -    double sx = cols/(x_right - x_left);
    -    double sy = rows/(y_top - y_bot);
    +    double sx = cols / (x_right - x_left);
    +    double sy = rows / (y_top - y_bot);
         _bin_indices(jcols, cols, x0, nx, sx, x_left);
         _bin_indices(irows, rows, y0, ny, sy, y_bot);
     
    @@ -1676,16 +1847,18 @@
         int s0 = d->strides[0];
         int s1 = d->strides[1];
     
    -    for (i=0; ibufferOut = buffer;
         imo->rbufOut->attach(imo->bufferOut, imo->colsOut, imo->rowsOut, imo->colsOut * imo->BPP);
     
    -    Py_XDECREF(x);
    -    Py_XDECREF(y);
    -    Py_XDECREF(d);
    -    Py_XDECREF(bg);
    -    PyMem_Free(irows);
    -    PyMem_Free(jcols);
    +    _pcolor2_cleanup(x, y, d, bg, irows, jcols);
     
         return Py::asObject(imo);
     }
    @@ -1711,39 +1879,40 @@
     #if defined(_MSC_VER)
     DL_EXPORT(void)
     #elif defined(__cplusplus)
    -  extern "C" void
    +extern "C" void
     #else
     void
     #endif
     
    -init_image(void) {
    -  _VERBOSE("init_image");
    +init_image(void)
    +{
    +    _VERBOSE("init_image");
     
    -  static _image_module* _image = new _image_module;
    +    static _image_module* _image = new _image_module;
     
    -  import_array();
    -  Py::Dict d = _image->moduleDictionary();
    +    import_array();
    +    Py::Dict d = _image->moduleDictionary();
     
    -  d["NEAREST"] = Py::Int(Image::NEAREST);
    -  d["BILINEAR"] = Py::Int(Image::BILINEAR);
    -  d["BICUBIC"] = Py::Int(Image::BICUBIC);
    -  d["SPLINE16"] = Py::Int(Image::SPLINE16);
    -  d["SPLINE36"] = Py::Int(Image::SPLINE36);
    -  d["HANNING"] = Py::Int(Image::HANNING);
    -  d["HAMMING"] = Py::Int(Image::HAMMING);
    -  d["HERMITE"] = Py::Int(Image::HERMITE);
    -  d["KAISER"]   = Py::Int(Image::KAISER);
    -  d["QUADRIC"]   = Py::Int(Image::QUADRIC);
    -  d["CATROM"]  = Py::Int(Image::CATROM);
    -  d["GAUSSIAN"]  = Py::Int(Image::GAUSSIAN);
    -  d["BESSEL"]  = Py::Int(Image::BESSEL);
    -  d["MITCHELL"]  = Py::Int(Image::MITCHELL);
    -  d["SINC"]  = Py::Int(Image::SINC);
    -  d["LANCZOS"]  = Py::Int(Image::LANCZOS);
    -  d["BLACKMAN"] = Py::Int(Image::BLACKMAN);
    +    d["NEAREST"] = Py::Int(Image::NEAREST);
    +    d["BILINEAR"] = Py::Int(Image::BILINEAR);
    +    d["BICUBIC"] = Py::Int(Image::BICUBIC);
    +    d["SPLINE16"] = Py::Int(Image::SPLINE16);
    +    d["SPLINE36"] = Py::Int(Image::SPLINE36);
    +    d["HANNING"] = Py::Int(Image::HANNING);
    +    d["HAMMING"] = Py::Int(Image::HAMMING);
    +    d["HERMITE"] = Py::Int(Image::HERMITE);
    +    d["KAISER"]   = Py::Int(Image::KAISER);
    +    d["QUADRIC"]   = Py::Int(Image::QUADRIC);
    +    d["CATROM"]  = Py::Int(Image::CATROM);
    +    d["GAUSSIAN"]  = Py::Int(Image::GAUSSIAN);
    +    d["BESSEL"]  = Py::Int(Image::BESSEL);
    +    d["MITCHELL"]  = Py::Int(Image::MITCHELL);
    +    d["SINC"]  = Py::Int(Image::SINC);
    +    d["LANCZOS"]  = Py::Int(Image::LANCZOS);
    +    d["BLACKMAN"] = Py::Int(Image::BLACKMAN);
     
    -  d["ASPECT_FREE"] = Py::Int(Image::ASPECT_FREE);
    -  d["ASPECT_PRESERVE"] = Py::Int(Image::ASPECT_PRESERVE);
    +    d["ASPECT_FREE"] = Py::Int(Image::ASPECT_FREE);
    +    d["ASPECT_PRESERVE"] = Py::Int(Image::ASPECT_PRESERVE);
     }
     
     
    diff -Nru matplotlib-0.99.3/src/image.cpp matplotlib-1.0.1/src/image.cpp
    --- matplotlib-0.99.3/src/image.cpp	2009-07-31 15:14:23.000000000 +0000
    +++ matplotlib-1.0.1/src/image.cpp	2010-09-23 19:54:48.000000000 +0000
    @@ -1,8 +1,4 @@
    -// To remove a gcc warning
    -#ifdef _POSIX_C_SOURCE
    -#undef _POSIX_C_SOURCE
    -#endif
    -
    +/* Python API mandates Python.h is included *first* */
     #include "Python.h"
     #include 
     
    @@ -29,409 +25,439 @@
     #include "agg_span_image_filter_rgb.h"
     #include "agg_span_image_filter_rgba.h"
     #include "agg_span_interpolator_linear.h"
    +#include "agg_rasterizer_sl_clip.h"
     #include "util/agg_color_conv_rgb8.h"
     #include "_image.h"
     #include "mplutils.h"
     
     
    -
     typedef agg::pixfmt_rgba32 pixfmt;
     typedef agg::renderer_base renderer_base;
     typedef agg::span_interpolator_linear<> interpolator_type;
    -typedef agg::rasterizer_scanline_aa<> rasterizer;
    +typedef agg::rasterizer_scanline_aa rasterizer;
     
     
     Image::Image() :
    -  bufferIn(NULL), rbufIn(NULL), colsIn(0), rowsIn(0),
    -  bufferOut(NULL), rbufOut(NULL), colsOut(0), rowsOut(0),  BPP(4),
    -  interpolation(BILINEAR), aspect(ASPECT_FREE), bg(1,1,1,0) {
    -  _VERBOSE("Image::Image");
    +        bufferIn(NULL), rbufIn(NULL), colsIn(0), rowsIn(0),
    +        bufferOut(NULL), rbufOut(NULL), colsOut(0), rowsOut(0),  BPP(4),
    +        interpolation(BILINEAR), aspect(ASPECT_FREE), bg(1, 1, 1, 0), resample(true)
    +{
    +    _VERBOSE("Image::Image");
     }
     
    -Image::~Image() {
    -  _VERBOSE("Image::~Image");
    -  delete [] bufferIn; bufferIn = NULL;
    -  delete rbufIn; rbufIn=NULL;
    -  delete rbufOut; rbufOut = NULL;
    -  delete [] bufferOut; bufferOut=NULL;
    +Image::~Image()
    +{
    +    _VERBOSE("Image::~Image");
    +    delete [] bufferIn;
    +    bufferIn = NULL;
    +    delete rbufIn;
    +    rbufIn = NULL;
    +    delete rbufOut;
    +    rbufOut = NULL;
    +    delete [] bufferOut;
    +    bufferOut = NULL;
     }
     
     int
    -Image::setattr( const char * name, const Py::Object & value ) {
    -  _VERBOSE("Image::setattr");
    -  __dict__[name] = value;
    -  return 0;
    +Image::setattr(const char * name, const Py::Object & value)
    +{
    +    _VERBOSE("Image::setattr");
    +    __dict__[name] = value;
    +    return 0;
     }
     
     Py::Object
    -Image::getattr( const char * name ) {
    -  _VERBOSE("Image::getattro");
    -  if ( __dict__.hasKey(name) ) return __dict__[name];
    -  else return getattr_default( name );
    -
    +Image::getattr(const char * name)
    +{
    +    _VERBOSE("Image::getattro");
    +    if (__dict__.hasKey(name)) return __dict__[name];
    +    else return getattr_default(name);
     }
     
     char Image::apply_rotation__doc__[] =
    -"apply_rotation(angle)\n"
    -"\n"
    -"Apply the rotation (degrees) to image"
    -;
    -Py::Object
    -Image::apply_rotation(const Py::Tuple& args) {
    -  _VERBOSE("Image::apply_rotation");
    -
    -  args.verify_length(1);
    -  double r = Py::Float(args[0]);
    -
    -
    -  agg::trans_affine M = agg::trans_affine_rotation( r * agg::pi / 180.0);
    -  srcMatrix *= M;
    -  imageMatrix *= M;
    -  return Py::Object();
    -}
    +    "apply_rotation(angle)\n"
    +    "\n"
    +    "Apply the rotation (degrees) to image"
    +    ;
    +Py::Object
    +Image::apply_rotation(const Py::Tuple& args)
    +{
    +    _VERBOSE("Image::apply_rotation");
     
    +    args.verify_length(1);
    +    double r = Py::Float(args[0]);
     
     
    +    agg::trans_affine M = agg::trans_affine_rotation(r * agg::pi / 180.0);
    +    srcMatrix *= M;
    +    imageMatrix *= M;
    +    return Py::Object();
    +}
    +
     char Image::flipud_out__doc__[] =
    -"flipud()\n"
    -"\n"
    -"Flip the output image upside down"
    -;
    +    "flipud()\n"
    +    "\n"
    +    "Flip the output image upside down"
    +    ;
     
     char Image::flipud_in__doc__[] =
    -"flipud()\n"
    -"\n"
    -"Flip the input image upside down"
    -;
    -Py::Object
    -Image::flipud_in(const Py::Tuple& args) {
    -  _VERBOSE("Image::flipud_in");
    -
    -  args.verify_length(0);
    -  int stride = rbufIn->stride();
    -  rbufIn->attach(bufferIn, colsIn, rowsIn, -stride);
    +    "flipud()\n"
    +    "\n"
    +    "Flip the input image upside down"
    +    ;
    +Py::Object
    +Image::flipud_in(const Py::Tuple& args)
    +{
    +    _VERBOSE("Image::flipud_in");
    +
    +    args.verify_length(0);
    +    int stride = rbufIn->stride();
    +    rbufIn->attach(bufferIn, colsIn, rowsIn, -stride);
     
    -  return Py::Object();
    +    return Py::Object();
     }
     
     char Image::set_bg__doc__[] =
    -"set_bg(r,g,b,a)\n"
    -"\n"
    -"Set the background color"
    -;
    +    "set_bg(r,g,b,a)\n"
    +    "\n"
    +    "Set the background color"
    +    ;
     
     Py::Object
    -Image::set_bg(const Py::Tuple& args) {
    -  _VERBOSE("Image::set_bg");
    -
    -  args.verify_length(4);
    -  bg.r = Py::Float(args[0]);
    -  bg.g = Py::Float(args[1]);
    -  bg.b = Py::Float(args[2]);
    -  bg.a = Py::Float(args[3]);
    -  return Py::Object();
    +Image::set_bg(const Py::Tuple& args)
    +{
    +    _VERBOSE("Image::set_bg");
    +
    +    args.verify_length(4);
    +    bg.r = Py::Float(args[0]);
    +    bg.g = Py::Float(args[1]);
    +    bg.b = Py::Float(args[2]);
    +    bg.a = Py::Float(args[3]);
    +    return Py::Object();
     }
     
     char Image::apply_scaling__doc__[] =
    -"apply_scaling(sx, sy)\n"
    -"\n"
    -"Apply the scale factors sx, sy to the transform matrix"
    -;
    +    "apply_scaling(sx, sy)\n"
    +    "\n"
    +    "Apply the scale factors sx, sy to the transform matrix"
    +    ;
     
     Py::Object
    -Image::apply_scaling(const Py::Tuple& args) {
    -  _VERBOSE("Image::apply_scaling");
    -
    -  args.verify_length(2);
    -  double sx = Py::Float(args[0]);
    -  double sy = Py::Float(args[1]);
    -
    -  //printf("applying scaling %1.2f, %1.2f\n", sx, sy);
    -  agg::trans_affine M = agg::trans_affine_scaling(sx, sy);
    -  srcMatrix *= M;
    -  imageMatrix *= M;
    -
    -  return Py::Object();
    +Image::apply_scaling(const Py::Tuple& args)
    +{
    +    _VERBOSE("Image::apply_scaling");
     
    +    args.verify_length(2);
    +    double sx = Py::Float(args[0]);
    +    double sy = Py::Float(args[1]);
    +
    +    //printf("applying scaling %1.2f, %1.2f\n", sx, sy);
    +    agg::trans_affine M = agg::trans_affine_scaling(sx, sy);
    +    srcMatrix *= M;
    +    imageMatrix *= M;
     
    +    return Py::Object();
     }
     
     char Image::apply_translation__doc__[] =
    -"apply_translation(tx, ty)\n"
    -"\n"
    -"Apply the translation tx, ty to the transform matrix"
    -;
    +    "apply_translation(tx, ty)\n"
    +    "\n"
    +    "Apply the translation tx, ty to the transform matrix"
    +    ;
     
     Py::Object
    -Image::apply_translation(const Py::Tuple& args) {
    -  _VERBOSE("Image::apply_translation");
    -
    -  args.verify_length(2);
    -  double tx = Py::Float(args[0]);
    -  double ty = Py::Float(args[1]);
    -
    -  //printf("applying translation %1.2f, %1.2f\n", tx, ty);
    -  agg::trans_affine M = agg::trans_affine_translation(tx, ty);
    -  srcMatrix *= M;
    -  imageMatrix *= M;
    -
    -  return Py::Object();
    +Image::apply_translation(const Py::Tuple& args)
    +{
    +    _VERBOSE("Image::apply_translation");
     
    +    args.verify_length(2);
    +    double tx = Py::Float(args[0]);
    +    double ty = Py::Float(args[1]);
    +
    +    //printf("applying translation %1.2f, %1.2f\n", tx, ty);
    +    agg::trans_affine M = agg::trans_affine_translation(tx, ty);
    +    srcMatrix *= M;
    +    imageMatrix *= M;
     
    +    return Py::Object();
     }
     
     char Image::as_rgba_str__doc__[] =
    -"numrows, numcols, s = as_rgba_str()"
    -"\n"
    -"Call this function after resize to get the data as string\n"
    -"The string is a numrows by numcols x 4 (RGBA) unsigned char buffer\n"
    -;
    +    "numrows, numcols, s = as_rgba_str()"
    +    "\n"
    +    "Call this function after resize to get the data as string\n"
    +    "The string is a numrows by numcols x 4 (RGBA) unsigned char buffer\n"
    +    ;
     
     Py::Object
    -Image::as_rgba_str(const Py::Tuple& args, const Py::Dict& kwargs) {
    -  _VERBOSE("Image::as_rgba_str");
    +Image::as_rgba_str(const Py::Tuple& args, const Py::Dict& kwargs)
    +{
    +    _VERBOSE("Image::as_rgba_str");
     
    -  args.verify_length(0);
    +    args.verify_length(0);
     
    -  std::pair bufpair = _get_output_buffer();
    +    std::pair bufpair = _get_output_buffer();
     
    -  Py::Object ret =  Py::asObject(Py_BuildValue("lls#", rowsOut, colsOut,
    -					       bufpair.first, colsOut*rowsOut*4));
    +    Py::Object ret =  Py::asObject(Py_BuildValue("lls#", rowsOut, colsOut,
    +                                   bufpair.first, colsOut * rowsOut * 4));
     
    -  if (bufpair.second) delete [] bufpair.first;
    -  return ret;
    +    if (bufpair.second) delete [] bufpair.first;
    +    return ret;
     }
     
     
     char Image::color_conv__doc__[] =
    -"numrows, numcols, buffer = color_conv(format)"
    -"\n"
    -"format 0(BGRA) or 1(ARGB)\n"
    -"Convert image to format and return in a writable buffer\n"
    -;
    -Py::Object
    -Image::color_conv(const Py::Tuple& args) {
    -  _VERBOSE("Image::color_conv");
    -
    -  args.verify_length(1);
    -  int format = Py::Int(args[0]);
    -
    -  int row_len = colsOut * 4;
    -  PyObject* py_buffer = PyBuffer_New(row_len * rowsOut);
    -  if (py_buffer ==NULL)
    -    throw Py::MemoryError("Image::color_conv could not allocate memory");
    -
    -  void* buf;
    -  Py_ssize_t buffer_len;
    -  int ret = PyObject_AsWriteBuffer(py_buffer, &buf, &buffer_len);
    -  if (ret !=0)
    -    throw Py::MemoryError("Image::color_conv could not allocate memory");
    -
    -  agg::rendering_buffer rtmp;
    -  rtmp.attach(reinterpret_cast(buf), colsOut, rowsOut,
    -	      row_len);
    -
    -  switch (format) {
    -  case 0:
    -    agg::color_conv(&rtmp, rbufOut, agg::color_conv_rgba32_to_bgra32());
    -    break;
    -  case 1:
    -    agg::color_conv(&rtmp, rbufOut, agg::color_conv_rgba32_to_argb32());
    -    break;
    -  default:
    -    throw Py::ValueError("Image::color_conv unknown format");
    -  }
    -  PyObject* o = Py_BuildValue("llN", rowsOut, colsOut, py_buffer);
    -  return Py::asObject(o);
    -}
    -
    -char Image::buffer_rgba__doc__[] =
    -"buffer = buffer_rgba()"
    -"\n"
    -"Return the image buffer as rgba32\n"
    -;
    -Py::Object
    -Image::buffer_rgba(const Py::Tuple& args) {
    -  //"Return the image object as rgba";
    -
    -  _VERBOSE("RendererAgg::buffer_rgba");
    -
    -  args.verify_length(0);
    -  int row_len = colsOut * 4;
    -  PyObject* o = Py_BuildValue("lls#", rowsOut, colsOut,
    -			      rbufOut, row_len * rowsOut);
    -  return Py::asObject(o);
    -}
    -
    -char Image::reset_matrix__doc__[] =
    -"reset_matrix()"
    -"\n"
    -"Reset the transformation matrix"
    -;
    -
    +    "numrows, numcols, buffer = color_conv(format)"
    +    "\n"
    +    "format 0(BGRA) or 1(ARGB)\n"
    +    "Convert image to format and return in a writable buffer\n"
    +    ;
     Py::Object
    -Image::reset_matrix(const Py::Tuple& args) {
    -  _VERBOSE("Image::reset_matrix");
    -
    -  args.verify_length(0);
    -  srcMatrix.reset();
    -  imageMatrix.reset();
    +Image::color_conv(const Py::Tuple& args)
    +{
    +    _VERBOSE("Image::color_conv");
     
    -  return Py::Object();
    +    args.verify_length(1);
    +    int format = Py::Int(args[0]);
     
    +    int row_len = colsOut * 4;
    +    PyObject* py_buffer = PyBuffer_New(row_len * rowsOut);
    +    if (py_buffer == NULL)
    +        throw Py::MemoryError("Image::color_conv could not allocate memory");
    +
    +    void* buf;
    +    Py_ssize_t buffer_len;
    +    int ret = PyObject_AsWriteBuffer(py_buffer, &buf, &buffer_len);
    +    if (ret != 0)
    +        throw Py::MemoryError("Image::color_conv could not allocate memory");
    +
    +    agg::rendering_buffer rtmp;
    +    rtmp.attach(reinterpret_cast(buf), colsOut, rowsOut,
    +                row_len);
     
    -}
    +    switch (format)
    +    {
    +    case 0:
    +        agg::color_conv(&rtmp, rbufOut, agg::color_conv_rgba32_to_bgra32());
    +        break;
    +    case 1:
    +        agg::color_conv(&rtmp, rbufOut, agg::color_conv_rgba32_to_argb32());
    +        break;
    +    default:
    +        throw Py::ValueError("Image::color_conv unknown format");
    +    }
     
    -char Image::get_matrix__doc__[] =
    -"(m11,m21,m12,m22,m13,m23) = get_matrix()\n"
    -"\n"
    -"Get the affine transformation matrix\n"
    -"  /m11,m12,m13\\\n"
    -"  /m21,m22,m23|\n"
    -"  \\ 0 , 0 , 1 /"
    -;
    -
    -Py::Object
    -Image::get_matrix(const Py::Tuple& args) {
    -  _VERBOSE("Image::get_matrix");
    -
    -  args.verify_length(0);
    -
    -  double m[6];
    -  srcMatrix.store_to(m);
    -  Py::Tuple ret(6);
    -  for(int i=0;i<6;i++)
    -    ret[i] = Py::Float(m[i]);
    -  return ret;
    +    PyObject* o = Py_BuildValue("llN", rowsOut, colsOut, py_buffer);
    +    return Py::asObject(o);
     }
     
    -char Image::resize__doc__[] =
    -"resize(width, height, norm=1, radius=4.0)\n"
    -"\n"
    -"Resize the image to width, height using interpolation\n"
    -"norm and radius are optional args for some of the filters and must be\n"
    -"passed as kwargs\n"
    -;
    -
    +char Image::buffer_rgba__doc__[] =
    +    "buffer = buffer_rgba()"
    +    "\n"
    +    "Return the image buffer as rgba32\n"
    +    ;
     Py::Object
    -Image::resize(const Py::Tuple& args, const Py::Dict& kwargs) {
    -  _VERBOSE("Image::resize");
    +Image::buffer_rgba(const Py::Tuple& args)
    +{
    +    //"Return the image object as rgba";
     
    -  args.verify_length(2);
    +    _VERBOSE("RendererAgg::buffer_rgba");
     
    -  int norm = 1;
    -  if ( kwargs.hasKey("norm") ) norm = Py::Int( kwargs["norm"] );
    +    args.verify_length(0);
    +    int row_len = colsOut * 4;
    +    PyObject* o = Py_BuildValue("lls#", rowsOut, colsOut,
    +                                rbufOut, row_len * rowsOut);
    +    return Py::asObject(o);
    +}
     
    -  double radius = 4.0;
    -  if ( kwargs.hasKey("radius") ) radius = Py::Float( kwargs["radius"] );
    +char Image::reset_matrix__doc__[] =
    +    "reset_matrix()"
    +    "\n"
    +    "Reset the transformation matrix"
    +    ;
     
    -  if (bufferIn ==NULL)
    -    throw Py::RuntimeError("You must first load the image");
    +Py::Object
    +Image::reset_matrix(const Py::Tuple& args)
    +{
    +    _VERBOSE("Image::reset_matrix");
     
    -  int numcols = Py::Int(args[0]);
    -  int numrows = Py::Int(args[1]);
    +    args.verify_length(0);
    +    srcMatrix.reset();
    +    imageMatrix.reset();
     
    -  colsOut = numcols;
    -  rowsOut = numrows;
    +    return Py::Object();
    +}
     
    +char Image::get_matrix__doc__[] =
    +    "(m11,m21,m12,m22,m13,m23) = get_matrix()\n"
    +    "\n"
    +    "Get the affine transformation matrix\n"
    +    "  /m11,m12,m13\\\n"
    +    "  /m21,m22,m23|\n"
    +    "  \\ 0 , 0 , 1 /"
    +    ;
     
    -  size_t NUMBYTES(numrows * numcols * BPP);
    +Py::Object
    +Image::get_matrix(const Py::Tuple& args)
    +{
    +    _VERBOSE("Image::get_matrix");
     
    -  delete [] bufferOut;
    -  bufferOut = new agg::int8u[NUMBYTES];
    -  if (bufferOut ==NULL) //todo: also handle allocation throw
    -    throw Py::MemoryError("Image::resize could not allocate memory");
    +    args.verify_length(0);
     
    -  delete rbufOut;
    -  rbufOut = new agg::rendering_buffer;
    -  rbufOut->attach(bufferOut, numcols, numrows, numcols * BPP);
    +    double m[6];
    +    srcMatrix.store_to(m);
    +    Py::Tuple ret(6);
    +    for (int i = 0;i < 6;i++)
    +    {
    +        ret[i] = Py::Float(m[i]);
    +    }
    +    return ret;
    +}
     
    -  // init the output rendering/rasterizing stuff
    -  pixfmt pixf(*rbufOut);
    -  renderer_base rb(pixf);
    -  rb.clear(bg);
    -  agg::rasterizer_scanline_aa<> ras;
    -  agg::scanline_u8 sl;
    +char Image::resize__doc__[] =
    +    "resize(width, height, norm=1, radius=4.0)\n"
    +    "\n"
    +    "Resize the image to width, height using interpolation\n"
    +    "norm and radius are optional args for some of the filters and must be\n"
    +    "passed as kwargs\n"
    +    ;
     
    +Py::Object
    +Image::resize(const Py::Tuple& args, const Py::Dict& kwargs)
    +{
    +    _VERBOSE("Image::resize");
    +
    +    args.verify_length(2);
     
    -  //srcMatrix *= resizingMatrix;
    -  //imageMatrix *= resizingMatrix;
    -  imageMatrix.invert();
    -  interpolator_type interpolator(imageMatrix);
    +    int norm = 1;
    +    if (kwargs.hasKey("norm"))
    +    {
    +        norm = Py::Int(kwargs["norm"]);
    +    }
     
    -  typedef agg::span_allocator span_alloc_type;
    -  span_alloc_type sa;
    -  agg::rgba8 background(agg::rgba8(int(255*bg.r),
    -				   int(255*bg.g),
    -				   int(255*bg.b),
    -				   int(255*bg.a)));
    +    double radius = 4.0;
    +    if (kwargs.hasKey("radius"))
    +    {
    +        radius = Py::Float(kwargs["radius"]);
    +    }
     
    -  // the image path
    -  agg::path_storage path;
    -  agg::int8u *bufferPad = NULL;
    -  agg::rendering_buffer rbufPad;
    +    if (bufferIn == NULL)
    +    {
    +        throw Py::RuntimeError("You must first load the image");
    +    }
     
    -  double x0, y0, x1, y1;
    +    int numcols = Py::Int(args[0]);
    +    int numrows = Py::Int(args[1]);
     
    -  x0 = 0.0;
    -  x1 = colsIn;
    -  y0 = 0.0;
    -  y1 = rowsIn;
    +    colsOut = numcols;
    +    rowsOut = numrows;
     
    -  path.move_to(x0, y0);
    -  path.line_to(x1, y0);
    -  path.line_to(x1, y1);
    -  path.line_to(x0, y1);
    -  path.close_polygon();
    -  agg::conv_transform imageBox(path, srcMatrix);
    -  ras.add_path(imageBox);
    +    size_t NUMBYTES(numrows * numcols * BPP);
     
    -  typedef agg::wrap_mode_reflect reflect_type;
    -  typedef agg::image_accessor_wrap img_accessor_type;
    +    delete [] bufferOut;
    +    bufferOut = new agg::int8u[NUMBYTES];
    +    if (bufferOut == NULL) //todo: also handle allocation throw
    +    {
    +        throw Py::MemoryError("Image::resize could not allocate memory");
    +    }
     
    -  pixfmt pixfmtin(*rbufIn);
    -  img_accessor_type ia(pixfmtin);
    -  switch(interpolation)
    +    delete rbufOut;
    +    rbufOut = new agg::rendering_buffer;
    +    rbufOut->attach(bufferOut, numcols, numrows, numcols * BPP);
    +
    +    // init the output rendering/rasterizing stuff
    +    pixfmt pixf(*rbufOut);
    +    renderer_base rb(pixf);
    +    rb.clear(bg);
    +    rasterizer ras;
    +    agg::scanline_u8 sl;
    +
    +    ras.clip_box(0, 0, numcols, numrows);
    +
    +    //srcMatrix *= resizingMatrix;
    +    //imageMatrix *= resizingMatrix;
    +    imageMatrix.invert();
    +    interpolator_type interpolator(imageMatrix);
    +
    +    typedef agg::span_allocator span_alloc_type;
    +    span_alloc_type sa;
    +    agg::rgba8 background(agg::rgba8(int(255*bg.r),
    +                                     int(255*bg.g),
    +                                     int(255*bg.b),
    +                                     int(255*bg.a)));
    +
    +    // the image path
    +    agg::path_storage path;
    +    agg::rendering_buffer rbufPad;
    +
    +    double x0, y0, x1, y1;
    +
    +    x0 = 0.0;
    +    x1 = colsIn;
    +    y0 = 0.0;
    +    y1 = rowsIn;
    +
    +    path.move_to(x0, y0);
    +    path.line_to(x1, y0);
    +    path.line_to(x1, y1);
    +    path.line_to(x0, y1);
    +    path.close_polygon();
    +    agg::conv_transform imageBox(path, srcMatrix);
    +    ras.add_path(imageBox);
    +
    +    typedef agg::wrap_mode_reflect reflect_type;
    +    typedef agg::image_accessor_wrap img_accessor_type;
    +
    +    pixfmt pixfmtin(*rbufIn);
    +    img_accessor_type ia(pixfmtin);
    +    switch (interpolation)
         {
     
         case NEAREST:
    -      {
    -	typedef agg::span_image_filter_rgba_nn span_gen_type;
    -	typedef agg::renderer_scanline_aa renderer_type;
    -	span_gen_type sg(ia, interpolator);
    -	renderer_type ri(rb, sa, sg);
    -	agg::render_scanlines(ras, sl, ri);
    -      }
    -      break;
    +    {
    +        typedef agg::span_image_filter_rgba_nn span_gen_type;
    +        typedef agg::renderer_scanline_aa renderer_type;
    +        span_gen_type sg(ia, interpolator);
    +        renderer_type ri(rb, sa, sg);
    +        agg::render_scanlines(ras, sl, ri);
    +    }
    +    break;
     
         case HANNING:
         case HAMMING:
         case HERMITE:
    -      {
    +    {
             agg::image_filter_lut filter;
    -        switch (interpolation) {
    -          case HANNING:  filter.calculate(agg::image_filter_hanning(), norm); break;
    -          case HAMMING:  filter.calculate(agg::image_filter_hamming(), norm); break;
    -          case HERMITE:  filter.calculate(agg::image_filter_hermite(), norm); break;
    -        }
    -	if (resample)
    -	  {
    -	    typedef agg::span_image_resample_rgba_affine span_gen_type;
    -	    typedef agg::renderer_scanline_aa renderer_type;
    -	    span_gen_type sg(ia, interpolator, filter);
    -	    renderer_type ri(rb, sa, sg);
    -	    agg::render_scanlines(ras, sl, ri);
    -	  }
    -	else
    -	  {
    -	    typedef agg::span_image_filter_rgba_2x2 span_gen_type;
    -	    typedef agg::renderer_scanline_aa renderer_type;
    -	    span_gen_type sg(ia, interpolator, filter);
    -	    renderer_type ri(rb, sa, sg);
    -	    agg::render_scanlines(ras, sl, ri);
    -	  }
    -      }
    -      break;
    +        switch (interpolation)
    +        {
    +        case HANNING:
    +            filter.calculate(agg::image_filter_hanning(), norm);
    +            break;
    +        case HAMMING:
    +            filter.calculate(agg::image_filter_hamming(), norm);
    +            break;
    +        case HERMITE:
    +            filter.calculate(agg::image_filter_hermite(), norm);
    +            break;
    +        }
    +        if (resample)
    +        {
    +            typedef agg::span_image_resample_rgba_affine span_gen_type;
    +            typedef agg::renderer_scanline_aa renderer_type;
    +            span_gen_type sg(ia, interpolator, filter);
    +            renderer_type ri(rb, sa, sg);
    +            agg::render_scanlines(ras, sl, ri);
    +        }
    +        else
    +        {
    +            typedef agg::span_image_filter_rgba_2x2 span_gen_type;
    +            typedef agg::renderer_scanline_aa renderer_type;
    +            span_gen_type sg(ia, interpolator, filter);
    +            renderer_type ri(rb, sa, sg);
    +            agg::render_scanlines(ras, sl, ri);
    +        }
    +    }
    +    break;
         case BILINEAR:
         case BICUBIC:
         case SPLINE16:
    @@ -445,767 +471,851 @@
         case SINC:
         case LANCZOS:
         case BLACKMAN:
    -      {
    +    {
             agg::image_filter_lut filter;
    -        switch(interpolation)
    -          {
    -          case BILINEAR:  filter.calculate(agg::image_filter_bilinear(), norm); break;
    -          case BICUBIC:  filter.calculate(agg::image_filter_bicubic(), norm); break;
    -          case SPLINE16:  filter.calculate(agg::image_filter_spline16(), norm); break;
    -          case SPLINE36:  filter.calculate(agg::image_filter_spline36(), norm); break;
    -          case KAISER:  filter.calculate(agg::image_filter_kaiser(), norm); break;
    -          case QUADRIC:  filter.calculate(agg::image_filter_quadric(), norm); break;
    -          case CATROM: filter.calculate(agg::image_filter_catrom(), norm); break;
    -          case GAUSSIAN: filter.calculate(agg::image_filter_gaussian(), norm); break;
    -          case BESSEL: filter.calculate(agg::image_filter_bessel(), norm); break;
    -          case MITCHELL: filter.calculate(agg::image_filter_mitchell(), norm); break;
    -          case SINC: filter.calculate(agg::image_filter_sinc(radius), norm); break;
    -          case LANCZOS: filter.calculate(agg::image_filter_lanczos(radius), norm); break;
    -          case BLACKMAN: filter.calculate(agg::image_filter_blackman(radius), norm); break;
    -          }
    -	if (resample)
    -	  {
    -	    typedef agg::span_image_resample_rgba_affine span_gen_type;
    -	    typedef agg::renderer_scanline_aa renderer_type;
    -	    span_gen_type sg(ia, interpolator, filter);
    -	    renderer_type ri(rb, sa, sg);
    -	    agg::render_scanlines(ras, sl, ri);
    -	  }
    -	else
    -	  {
    -	    typedef agg::span_image_filter_rgba span_gen_type;
    -	    typedef agg::renderer_scanline_aa renderer_type;
    -	    span_gen_type sg(ia, interpolator, filter);
    -	    renderer_type ri(rb, sa, sg);
    -	    agg::render_scanlines(ras, sl, ri);
    -	  }
    -      }
    -      break;
    -
    +        switch (interpolation)
    +        {
    +        case BILINEAR:
    +            filter.calculate(agg::image_filter_bilinear(), norm);
    +            break;
    +        case BICUBIC:
    +            filter.calculate(agg::image_filter_bicubic(), norm);
    +            break;
    +        case SPLINE16:
    +            filter.calculate(agg::image_filter_spline16(), norm);
    +            break;
    +        case SPLINE36:
    +            filter.calculate(agg::image_filter_spline36(), norm);
    +            break;
    +        case KAISER:
    +            filter.calculate(agg::image_filter_kaiser(), norm);
    +            break;
    +        case QUADRIC:
    +            filter.calculate(agg::image_filter_quadric(), norm);
    +            break;
    +        case CATROM:
    +            filter.calculate(agg::image_filter_catrom(), norm);
    +            break;
    +        case GAUSSIAN:
    +            filter.calculate(agg::image_filter_gaussian(), norm);
    +            break;
    +        case BESSEL:
    +            filter.calculate(agg::image_filter_bessel(), norm);
    +            break;
    +        case MITCHELL:
    +            filter.calculate(agg::image_filter_mitchell(), norm);
    +            break;
    +        case SINC:
    +            filter.calculate(agg::image_filter_sinc(radius), norm);
    +            break;
    +        case LANCZOS:
    +            filter.calculate(agg::image_filter_lanczos(radius), norm);
    +            break;
    +        case BLACKMAN:
    +            filter.calculate(agg::image_filter_blackman(radius), norm);
    +            break;
    +        }
    +        if (resample)
    +        {
    +            typedef agg::span_image_resample_rgba_affine span_gen_type;
    +            typedef agg::renderer_scanline_aa renderer_type;
    +            span_gen_type sg(ia, interpolator, filter);
    +            renderer_type ri(rb, sa, sg);
    +            agg::render_scanlines(ras, sl, ri);
    +        }
    +        else
    +        {
    +            typedef agg::span_image_filter_rgba span_gen_type;
    +            typedef agg::renderer_scanline_aa renderer_type;
    +            span_gen_type sg(ia, interpolator, filter);
    +            renderer_type ri(rb, sa, sg);
    +            agg::render_scanlines(ras, sl, ri);
    +        }
         }
    +    break;
     
    -  delete [] bufferPad;
    -  return Py::Object();
    +    }
     
    +    return Py::Object();
     }
     
     
     
     char Image::get_interpolation__doc__[] =
    -"get_interpolation()\n"
    -"\n"
    -"Get the interpolation scheme to one of the module constants, "
    -"one of image.NEAREST, image.BILINEAR, etc..."
    -;
    +    "get_interpolation()\n"
    +    "\n"
    +    "Get the interpolation scheme to one of the module constants, "
    +    "one of image.NEAREST, image.BILINEAR, etc..."
    +    ;
     
     Py::Object
    -Image::get_interpolation(const Py::Tuple& args) {
    -  _VERBOSE("Image::get_interpolation");
    +Image::get_interpolation(const Py::Tuple& args)
    +{
    +    _VERBOSE("Image::get_interpolation");
     
    -  args.verify_length(0);
    -  return Py::Int((int)interpolation);
    +    args.verify_length(0);
    +    return Py::Int((int)interpolation);
     }
     
     
     char Image::get_aspect__doc__[] =
    -"get_aspect()\n"
    -"\n"
    -"Get the aspect constraint constants"
    -;
    +    "get_aspect()\n"
    +    "\n"
    +    "Get the aspect constraint constants"
    +    ;
     
     Py::Object
    -Image::get_aspect(const Py::Tuple& args) {
    -  _VERBOSE("Image::get_aspect");
    +Image::get_aspect(const Py::Tuple& args)
    +{
    +    _VERBOSE("Image::get_aspect");
     
    -  args.verify_length(0);
    -  return Py::Int((int)aspect);
    +    args.verify_length(0);
    +    return Py::Int((int)aspect);
     }
     
     char Image::get_size__doc__[] =
    -"numrows, numcols = get_size()\n"
    -"\n"
    -"Get the number or rows and columns of the input image"
    -;
    +    "numrows, numcols = get_size()\n"
    +    "\n"
    +    "Get the number or rows and columns of the input image"
    +    ;
     
     Py::Object
    -Image::get_size(const Py::Tuple& args) {
    -  _VERBOSE("Image::get_size");
    +Image::get_size(const Py::Tuple& args)
    +{
    +    _VERBOSE("Image::get_size");
     
    -  args.verify_length(0);
    +    args.verify_length(0);
     
    -  Py::Tuple ret(2);
    -  ret[0] = Py::Int((long)rowsIn);
    -  ret[1] = Py::Int((long)colsIn);
    -  return ret;
    +    Py::Tuple ret(2);
    +    ret[0] = Py::Int((long)rowsIn);
    +    ret[1] = Py::Int((long)colsIn);
    +    return ret;
     
     }
     
     char Image::get_resample__doc__[] =
    -"get_resample()\n"
    -"\n"
    -"Get the resample flag."
    -;
    +    "get_resample()\n"
    +    "\n"
    +    "Get the resample flag."
    +    ;
     
     Py::Object
    -Image::get_resample(const Py::Tuple& args) {
    -  _VERBOSE("Image::get_resample");
    +Image::get_resample(const Py::Tuple& args)
    +{
    +    _VERBOSE("Image::get_resample");
     
    -  args.verify_length(0);
    -  return Py::Int((int)resample);
    +    args.verify_length(0);
    +    return Py::Int((int)resample);
     }
     
     char Image::get_size_out__doc__[] =
    -"numrows, numcols = get_size()\n"
    -"\n"
    -"Get the number or rows and columns of the output image"
    -;
    +    "numrows, numcols = get_size()\n"
    +    "\n"
    +    "Get the number or rows and columns of the output image"
    +    ;
     
     Py::Object
    -Image::get_size_out(const Py::Tuple& args) {
    -  _VERBOSE("Image::get_size_out");
    -
    -  args.verify_length(0);
    +Image::get_size_out(const Py::Tuple& args)
    +{
    +    _VERBOSE("Image::get_size_out");
     
    -  Py::Tuple ret(2);
    -  ret[0] = Py::Int((long)rowsOut);
    -  ret[1] = Py::Int((long)colsOut);
    -  return ret;
    +    args.verify_length(0);
     
    +    Py::Tuple ret(2);
    +    ret[0] = Py::Int((long)rowsOut);
    +    ret[1] = Py::Int((long)colsOut);
    +    return ret;
     }
     
     //get the output buffer, flipped if necessary.  The second element of
     //the pair is a bool that indicates whether you need to free the
     //memory
     std::pair
    -Image::_get_output_buffer() {
    -  _VERBOSE("Image::_get_output_buffer");
    -  std::pair ret;
    -  bool flipy = rbufOut->stride()<0;
    -  if (flipy) {
    -    agg::int8u* buffer = new agg::int8u[rowsOut*colsOut*4];
    -    agg::rendering_buffer rb;
    -    rb.attach(buffer, colsOut, rowsOut, colsOut*4);
    -    rb.copy_from(*rbufOut);
    -    ret.first = buffer;
    -    ret.second = true;
    -  }
    -  else {
    -    ret.first = bufferOut;
    -    ret.second = false;
    -  }
    -  return ret;
    +Image::_get_output_buffer()
    +{
    +    _VERBOSE("Image::_get_output_buffer");
    +    std::pair ret;
    +    bool flipy = rbufOut->stride() < 0;
    +    if (flipy)
    +    {
    +        agg::int8u* buffer = new agg::int8u[rowsOut*colsOut*4];
    +        agg::rendering_buffer rb;
    +        rb.attach(buffer, colsOut, rowsOut, colsOut*4);
    +        rb.copy_from(*rbufOut);
    +        ret.first = buffer;
    +        ret.second = true;
    +    }
    +    else
    +    {
    +        ret.first = bufferOut;
    +        ret.second = false;
    +    }
    +    return ret;
     
     }
     
    -
     char Image::set_interpolation__doc__[] =
    -"set_interpolation(scheme)\n"
    -"\n"
    -"Set the interpolation scheme to one of the module constants, "
    -"eg, image.NEAREST, image.BILINEAR, etc..."
    -;
    +    "set_interpolation(scheme)\n"
    +    "\n"
    +    "Set the interpolation scheme to one of the module constants, "
    +    "eg, image.NEAREST, image.BILINEAR, etc..."
    +    ;
     
     Py::Object
    -Image::set_interpolation(const Py::Tuple& args) {
    -  _VERBOSE("Image::set_interpolation");
    -
    -  args.verify_length(1);
    +Image::set_interpolation(const Py::Tuple& args)
    +{
    +    _VERBOSE("Image::set_interpolation");
     
    -  size_t method = Py::Int(args[0]);
    -  interpolation = (unsigned)method;
    -  return Py::Object();
    +    args.verify_length(1);
     
    +    size_t method = Py::Int(args[0]);
    +    interpolation = (unsigned)method;
    +    return Py::Object();
     }
     
     char Image::set_resample__doc__[] =
    -"set_resample(boolean)\n"
    -"\n"
    -"Set the resample flag."
    -;
    +    "set_resample(boolean)\n"
    +    "\n"
    +    "Set the resample flag."
    +    ;
     
     Py::Object
    -Image::set_resample(const Py::Tuple& args) {
    -  _VERBOSE("Image::set_resample");
    -  args.verify_length(1);
    -  int flag = Py::Int(args[0]);
    -  resample = (bool)flag;
    -  return Py::Object();
    +Image::set_resample(const Py::Tuple& args)
    +{
    +    _VERBOSE("Image::set_resample");
    +    args.verify_length(1);
    +    int flag = Py::Int(args[0]);
    +    resample = (bool)flag;
    +    return Py::Object();
     }
     
     
     char Image::set_aspect__doc__[] =
    -"set_aspect(scheme)\n"
    -"\n"
    -"Set the aspect ration to one of the image module constant."
    -"eg, one of image.ASPECT_PRESERVE, image.ASPECT_FREE"
    -;
    -Py::Object
    -Image::set_aspect(const Py::Tuple& args) {
    -  _VERBOSE("Image::set_aspect");
    -
    -  args.verify_length(1);
    -  size_t method = Py::Int(args[0]);
    -  aspect = (unsigned)method;
    -  return Py::Object();
    +    "set_aspect(scheme)\n"
    +    "\n"
    +    "Set the aspect ration to one of the image module constant."
    +    "eg, one of image.ASPECT_PRESERVE, image.ASPECT_FREE"
    +    ;
    +Py::Object
    +Image::set_aspect(const Py::Tuple& args)
    +{
    +    _VERBOSE("Image::set_aspect");
    +
    +    args.verify_length(1);
    +    size_t method = Py::Int(args[0]);
    +    aspect = (unsigned)method;
    +    return Py::Object();
     
     }
     
     void
    -Image::init_type() {
    -  _VERBOSE("Image::init_type");
    -
    -  behaviors().name("Image");
    -  behaviors().doc("Image");
    -  behaviors().supportGetattr();
    -  behaviors().supportSetattr();
    -
    -  add_varargs_method( "apply_rotation", &Image::apply_rotation, Image::apply_rotation__doc__);
    -  add_varargs_method( "apply_scaling",	&Image::apply_scaling, Image::apply_scaling__doc__);
    -  add_varargs_method( "apply_translation", &Image::apply_translation, Image::apply_translation__doc__);
    -  add_keyword_method( "as_rgba_str", &Image::as_rgba_str, Image::as_rgba_str__doc__);
    -  add_varargs_method( "color_conv", &Image::color_conv, Image::color_conv__doc__);
    -  add_varargs_method( "buffer_rgba", &Image::buffer_rgba, Image::buffer_rgba__doc__);
    -  add_varargs_method( "get_aspect", &Image::get_aspect, Image::get_aspect__doc__);
    -  add_varargs_method( "get_interpolation", &Image::get_interpolation, Image::get_interpolation__doc__);
    -  add_varargs_method( "get_resample", &Image::get_resample, Image::get_resample__doc__);
    -  add_varargs_method( "get_size", &Image::get_size, Image::get_size__doc__);
    -  add_varargs_method( "get_size_out", &Image::get_size_out, Image::get_size_out__doc__);
    -  add_varargs_method( "reset_matrix", &Image::reset_matrix, Image::reset_matrix__doc__);
    -  add_varargs_method( "get_matrix", &Image::get_matrix, Image::get_matrix__doc__);
    -  add_keyword_method( "resize", &Image::resize, Image::resize__doc__);
    -  add_varargs_method( "set_interpolation", &Image::set_interpolation, Image::set_interpolation__doc__);
    -  add_varargs_method( "set_resample", &Image::set_resample, Image::set_resample__doc__);
    -  add_varargs_method( "set_aspect", &Image::set_aspect, Image::set_aspect__doc__);
    -  add_varargs_method( "set_bg", &Image::set_bg, Image::set_bg__doc__);
    -  add_varargs_method( "flipud_out", &Image::flipud_out, Image::flipud_out__doc__);
    -  add_varargs_method( "flipud_in", &Image::flipud_in, Image::flipud_in__doc__);
    -
    +Image::init_type()
    +{
    +    _VERBOSE("Image::init_type");
     
    +    behaviors().name("Image");
    +    behaviors().doc("Image");
    +    behaviors().supportGetattr();
    +    behaviors().supportSetattr();
    +
    +    add_varargs_method("apply_rotation", &Image::apply_rotation, Image::apply_rotation__doc__);
    +    add_varargs_method("apply_scaling",  &Image::apply_scaling, Image::apply_scaling__doc__);
    +    add_varargs_method("apply_translation", &Image::apply_translation, Image::apply_translation__doc__);
    +    add_keyword_method("as_rgba_str", &Image::as_rgba_str, Image::as_rgba_str__doc__);
    +    add_varargs_method("color_conv", &Image::color_conv, Image::color_conv__doc__);
    +    add_varargs_method("buffer_rgba", &Image::buffer_rgba, Image::buffer_rgba__doc__);
    +    add_varargs_method("get_aspect", &Image::get_aspect, Image::get_aspect__doc__);
    +    add_varargs_method("get_interpolation", &Image::get_interpolation, Image::get_interpolation__doc__);
    +    add_varargs_method("get_resample", &Image::get_resample, Image::get_resample__doc__);
    +    add_varargs_method("get_size", &Image::get_size, Image::get_size__doc__);
    +    add_varargs_method("get_size_out", &Image::get_size_out, Image::get_size_out__doc__);
    +    add_varargs_method("reset_matrix", &Image::reset_matrix, Image::reset_matrix__doc__);
    +    add_varargs_method("get_matrix", &Image::get_matrix, Image::get_matrix__doc__);
    +    add_keyword_method("resize", &Image::resize, Image::resize__doc__);
    +    add_varargs_method("set_interpolation", &Image::set_interpolation, Image::set_interpolation__doc__);
    +    add_varargs_method("set_resample", &Image::set_resample, Image::set_resample__doc__);
    +    add_varargs_method("set_aspect", &Image::set_aspect, Image::set_aspect__doc__);
    +    add_varargs_method("set_bg", &Image::set_bg, Image::set_bg__doc__);
    +    add_varargs_method("flipud_out", &Image::flipud_out, Image::flipud_out__doc__);
    +    add_varargs_method("flipud_in", &Image::flipud_in, Image::flipud_in__doc__);
     }
     
     
     
     
     char _image_module_from_images__doc__[] =
    -"from_images(numrows, numcols, seq)\n"
    -"\n"
    -"return an image instance with numrows, numcols from a seq of image\n"
    -"instances using alpha blending.  seq is a list of (Image, ox, oy)"
    -;
    -Py::Object
    -_image_module::from_images(const Py::Tuple& args) {
    -  _VERBOSE("_image_module::from_images");
    -
    -  args.verify_length(3);
    -
    -  size_t numrows = (size_t)Py::Int(args[0]);
    -  size_t numcols = (size_t)Py::Int(args[1]);
    -
    -  if (numrows >= 32768 || numcols >= 32768) {
    -    throw Py::RuntimeError("numrows and numcols must both be less than 32768");
    -  }
    -
    -  Py::SeqBase tups = args[2];
    -  size_t N = tups.length();
    -
    -  if (N==0)
    -    throw Py::RuntimeError("Empty list of images");
    -
    -  Py::Tuple tup;
    -
    -  size_t ox(0), oy(0), thisx(0), thisy(0);
    -
    -  //copy image 0 output buffer into return images output buffer
    -  Image* imo = new Image;
    -  imo->rowsOut  = numrows;
    -  imo->colsOut  = numcols;
    -
    -  size_t NUMBYTES(numrows * numcols * imo->BPP);
    -  imo->bufferOut = new agg::int8u[NUMBYTES];
    -  if (imo->bufferOut==NULL) //todo: also handle allocation throw
    -    throw Py::MemoryError("_image_module::from_images could not allocate memory");
    -
    -  delete imo->rbufOut;
    -  imo->rbufOut = new agg::rendering_buffer;
    -  imo->rbufOut->attach(imo->bufferOut, imo->colsOut, imo->rowsOut, imo->colsOut * imo->BPP);
    -
    -  pixfmt pixf(*imo->rbufOut);
    -  renderer_base rb(pixf);
    -
    -
    -  rb.clear(agg::rgba(1, 1, 1, 1));
    -  for (size_t imnum=0; imnum< N; imnum++) {
    -    tup = Py::Tuple(tups[imnum]);
    -    Image* thisim = static_cast(tup[0].ptr());
    -    ox = Py::Int(tup[1]);
    -    oy = Py::Int(tup[2]);
    -    bool isflip = (thisim->rbufOut->stride())<0;
    -    //std::cout << "from images " << isflip << "; stride=" << thisim->rbufOut->stride() << std::endl;
    -    size_t ind=0;
    -    for (size_t j=0; jrowsOut; j++) {
    -      for (size_t i=0; icolsOut; i++) {
    -	thisx = i+ox;
    -
    -	if (isflip)
    -	  thisy = thisim->rowsOut - j + oy;
    -	else
    -	  thisy = j+oy;
    -
    -
    -	if (thisx>=numcols || thisy>=numrows) {
    -	  ind +=4;
    -	  continue;
    -	}
    -
    -	pixfmt::color_type p;
    -	p.r = *(thisim->bufferOut+ind++);
    -	p.g = *(thisim->bufferOut+ind++);
    -	p.b = *(thisim->bufferOut+ind++);
    -	p.a = *(thisim->bufferOut+ind++);
    -	pixf.blend_pixel(thisx, thisy, p, 255);
    -      }
    +    "from_images(numrows, numcols, seq)\n"
    +    "\n"
    +    "return an image instance with numrows, numcols from a seq of image\n"
    +    "instances using alpha blending.  seq is a list of (Image, ox, oy)"
    +    ;
    +Py::Object
    +_image_module::from_images(const Py::Tuple& args)
    +{
    +    _VERBOSE("_image_module::from_images");
    +
    +    args.verify_length(3);
    +
    +    size_t numrows = (size_t)Py::Int(args[0]);
    +    size_t numcols = (size_t)Py::Int(args[1]);
    +
    +    if (numrows >= 32768 || numcols >= 32768)
    +    {
    +        throw Py::RuntimeError("numrows and numcols must both be less than 32768");
         }
    -  }
     
    -  return Py::asObject(imo);
    +    Py::SeqBase tups = args[2];
    +    size_t N = tups.length();
     
    +    if (N == 0)
    +    {
    +        throw Py::RuntimeError("Empty list of images");
    +    }
     
    +    Py::Tuple tup;
     
    -}
    +    size_t ox(0), oy(0), thisx(0), thisy(0);
     
    +    //copy image 0 output buffer into return images output buffer
    +    Image* imo = new Image;
    +    imo->rowsOut  = numrows;
    +    imo->colsOut  = numcols;
     
    -char _image_module_fromarray__doc__[] =
    -"fromarray(A, isoutput)\n"
    -"\n"
    -"Load the image from a numpy array\n"
    -"By default this function fills the input buffer, which can subsequently\n"
    -"be resampled using resize.  If isoutput=1, fill the output buffer.\n"
    -"This is used to support raw pixel images w/o resampling"
    -;
    -Py::Object
    -_image_module::fromarray(const Py::Tuple& args) {
    -  _VERBOSE("_image_module::fromarray");
    +    size_t NUMBYTES(numrows * numcols * imo->BPP);
    +    imo->bufferOut = new agg::int8u[NUMBYTES];
    +    if (imo->bufferOut == NULL) //todo: also handle allocation throw
    +    {
    +        throw Py::MemoryError("_image_module::from_images could not allocate memory");
    +    }
    +
    +    delete imo->rbufOut;
    +    imo->rbufOut = new agg::rendering_buffer;
    +    imo->rbufOut->attach(imo->bufferOut, imo->colsOut, imo->rowsOut, imo->colsOut * imo->BPP);
     
    -  args.verify_length(2);
    +    pixfmt pixf(*imo->rbufOut);
    +    renderer_base rb(pixf);
     
    -  Py::Object x = args[0];
    -  int isoutput = Py::Int(args[1]);
    -  //PyArrayObject *A = (PyArrayObject *) PyArray_ContiguousFromObject(x.ptr(), PyArray_DOUBLE, 2, 3);
    -  PyArrayObject *A = (PyArrayObject *) PyArray_FromObject(x.ptr(), PyArray_DOUBLE, 2, 3);
    +    rb.clear(agg::rgba(1, 1, 1, 1));
    +    for (size_t imnum = 0; imnum < N; imnum++)
    +    {
    +        tup = Py::Tuple(tups[imnum]);
    +        Image* thisim = static_cast(tup[0].ptr());
    +        ox = Py::Int(tup[1]);
    +        oy = Py::Int(tup[2]);
    +        bool isflip = (thisim->rbufOut->stride()) < 0;
    +        //std::cout << "from images " << isflip << "; stride=" << thisim->rbufOut->stride() << std::endl;
    +        size_t ind = 0;
    +        for (size_t j = 0; j < thisim->rowsOut; j++)
    +        {
    +            for (size_t i = 0; i < thisim->colsOut; i++)
    +            {
    +                thisx = i + ox;
    +
    +                if (isflip)
    +                {
    +                    thisy = thisim->rowsOut - j + oy;
    +                }
    +                else
    +                {
    +                    thisy = j + oy;
    +                }
    +
    +                if (thisx >= numcols || thisy >= numrows)
    +                {
    +                    ind += 4;
    +                    continue;
    +                }
    +
    +                pixfmt::color_type p;
    +                p.r = *(thisim->bufferOut + ind++);
    +                p.g = *(thisim->bufferOut + ind++);
    +                p.b = *(thisim->bufferOut + ind++);
    +                p.a = *(thisim->bufferOut + ind++);
    +                pixf.blend_pixel(thisx, thisy, p, 255);
    +            }
    +        }
    +    }
     
    -  if (A==NULL)
    -    throw Py::ValueError("Array must be rank 2 or 3 of doubles");
    +    return Py::asObject(imo);
    +}
     
     
    -  Image* imo = new Image;
    +char _image_module_fromarray__doc__[] =
    +    "fromarray(A, isoutput)\n"
    +    "\n"
    +    "Load the image from a numpy array\n"
    +    "By default this function fills the input buffer, which can subsequently\n"
    +    "be resampled using resize.  If isoutput=1, fill the output buffer.\n"
    +    "This is used to support raw pixel images w/o resampling"
    +    ;
    +Py::Object
    +_image_module::fromarray(const Py::Tuple& args)
    +{
    +    _VERBOSE("_image_module::fromarray");
     
    -  imo->rowsIn  = A->dimensions[0];
    -  imo->colsIn  = A->dimensions[1];
    +    args.verify_length(2);
     
    +    Py::Object x = args[0];
    +    int isoutput = Py::Int(args[1]);
    +    PyArrayObject *A = (PyArrayObject *) PyArray_FromObject(x.ptr(), PyArray_DOUBLE, 2, 3);
    +    if (A == NULL)
    +    {
    +        throw Py::ValueError("Array must be rank 2 or 3 of doubles");
    +    }
    +    Py::Object A_obj((PyObject *)A, true);
     
    -  size_t NUMBYTES(imo->colsIn * imo->rowsIn * imo->BPP);
    -  agg::int8u *buffer = new agg::int8u[NUMBYTES];
    -  if (buffer==NULL) //todo: also handle allocation throw
    -    throw Py::MemoryError("_image_module::fromarray could not allocate memory");
    +    Image* imo = new Image;
     
    -  if (isoutput) {
    -    // make the output buffer point to the input buffer
    +    imo->rowsIn  = A->dimensions[0];
    +    imo->colsIn  = A->dimensions[1];
     
    -    imo->rowsOut  = imo->rowsIn;
    -    imo->colsOut  = imo->colsIn;
    +    size_t NUMBYTES(imo->colsIn * imo->rowsIn * imo->BPP);
    +    agg::int8u *buffer = new agg::int8u[NUMBYTES];
    +    if (buffer == NULL) //todo: also handle allocation throw
    +    {
    +        throw Py::MemoryError("_image_module::fromarray could not allocate memory");
    +    }
     
    -    imo->rbufOut = new agg::rendering_buffer;
    -    imo->bufferOut = buffer;
    -    imo->rbufOut->attach(imo->bufferOut, imo->colsOut, imo->rowsOut, imo->colsOut * imo->BPP);
    +    if (isoutput)
    +    {
    +        // make the output buffer point to the input buffer
    +        imo->rowsOut  = imo->rowsIn;
    +        imo->colsOut  = imo->colsIn;
    +
    +        imo->rbufOut = new agg::rendering_buffer;
    +        imo->bufferOut = buffer;
    +        imo->rbufOut->attach(imo->bufferOut, imo->colsOut, imo->rowsOut, imo->colsOut * imo->BPP);
    +    }
    +    else
    +    {
    +        imo->bufferIn = buffer;
    +        imo->rbufIn = new agg::rendering_buffer;
    +        imo->rbufIn->attach(buffer, imo->colsIn, imo->rowsIn, imo->colsIn*imo->BPP);
    +    }
     
    -  }
    -  else {
    -    imo->bufferIn = buffer;
    -    imo->rbufIn = new agg::rendering_buffer;
    -    imo->rbufIn->attach(buffer, imo->colsIn, imo->rowsIn, imo->colsIn*imo->BPP);
    -  }
    -
    -  if   (A->nd == 2) { //assume luminance for now;
    -
    -    agg::int8u gray;
    -    for (size_t rownum=0; rownumrowsIn; rownum++) {
    -     for (size_t colnum=0; colnumcolsIn; colnum++) {
    -       double val = *(double *)(A->data + rownum*A->strides[0] + colnum*A->strides[1]);
    -
    -       gray = int(255 * val);
    -       *buffer++ = gray;       // red
    -       *buffer++ = gray;       // green
    -       *buffer++ = gray;       // blue
    -       *buffer++   = 255;        // alpha
    -     }
    -    }
    -  }
    -  else if   (A->nd == 3) { // assume RGB
    -
    -    if (A->dimensions[2] != 3 && A->dimensions[2] != 4 ) {
    -      Py_XDECREF(A);
    -      throw Py::ValueError(Printf("3rd dimension must be length 3 (RGB) or 4 (RGBA); found %d", A->dimensions[2]).str());
    +    if (A->nd == 2)     //assume luminance for now;
    +    {
    +        agg::int8u gray;
    +        for (size_t rownum = 0; rownum < imo->rowsIn; rownum++)
    +        {
    +            for (size_t colnum = 0; colnum < imo->colsIn; colnum++)
    +            {
    +                double val = *(double *)(A->data + rownum * A->strides[0] + colnum * A->strides[1]);
     
    +                gray = int(255 * val);
    +                *buffer++ = gray;       // red
    +                *buffer++ = gray;       // green
    +                *buffer++ = gray;       // blue
    +                *buffer++   = 255;        // alpha
    +            }
    +        }
         }
    +    else if (A->nd == 3)     // assume RGB
    +    {
    +
    +        if (A->dimensions[2] != 3 && A->dimensions[2] != 4)
    +        {
    +            throw Py::ValueError(Printf("3rd dimension must be length 3 (RGB) or 4 (RGBA); found %d", A->dimensions[2]).str());
    +        }
     
    -    int rgba = A->dimensions[2]==4;
    -    double r,g,b,alpha;
    -    int offset =0;
    -
    -    for (size_t rownum=0; rownumrowsIn; rownum++) {
    -      for (size_t colnum=0; colnumcolsIn; colnum++) {
    -	offset = rownum*A->strides[0] + colnum*A->strides[1];
    -	r = *(double *)(A->data + offset);
    -	g = *(double *)(A->data + offset + A->strides[2] );
    -	b = *(double *)(A->data + offset + 2*A->strides[2] );
    -
    -	if (rgba)
    -	  alpha = *(double *)(A->data + offset + 3*A->strides[2] );
    -	else
    -	  alpha = 1.0;
    -
    -	*buffer++ = int(255*r);         // red
    -	*buffer++ = int(255*g);         // green
    -	*buffer++ = int(255*b);         // blue
    -	*buffer++ = int(255*alpha);     // alpha
    -
    -      }
    -    }
    -
    -  }
    -  else   { // error
    -    Py_XDECREF(A);
    -    throw Py::ValueError("Illegal array rank; must be rank; must 2 or 3");
    -  }
    -  buffer -= NUMBYTES;
    -  Py_XDECREF(A);
    +        int rgba = A->dimensions[2] == 4;
    +        double r, g, b, alpha;
    +        size_t offset = 0;
    +
    +        for (size_t rownum = 0; rownum < imo->rowsIn; rownum++)
    +        {
    +            for (size_t colnum = 0; colnum < imo->colsIn; colnum++)
    +            {
    +                offset = rownum * A->strides[0] + colnum * A->strides[1];
    +                r = *(double *)(A->data + offset);
    +                g = *(double *)(A->data + offset + A->strides[2]);
    +                b = *(double *)(A->data + offset + 2 * A->strides[2]);
    +
    +                if (rgba)
    +                {
    +                    alpha = *(double *)(A->data + offset + 3 * A->strides[2]);
    +                }
    +                else
    +                {
    +                    alpha = 1.0;
    +                }
    +
    +                *buffer++ = int(255 * r);       // red
    +                *buffer++ = int(255 * g);       // green
    +                *buffer++ = int(255 * b);       // blue
    +                *buffer++ = int(255 * alpha);   // alpha
    +            }
    +        }
    +    }
    +    else     // error
    +    {
    +        throw Py::ValueError("Illegal array rank; must be rank; must 2 or 3");
    +    }
    +    buffer -= NUMBYTES;
     
    -  return Py::asObject( imo );
    +    return Py::asObject(imo);
     }
     
     char _image_module_fromarray2__doc__[] =
    -"fromarray2(A, isoutput)\n"
    -"\n"
    -"Load the image from a numpy array\n"
    -"By default this function fills the input buffer, which can subsequently\n"
    -"be resampled using resize.  If isoutput=1, fill the output buffer.\n"
    -"This is used to support raw pixel images w/o resampling"
    -;
    +    "fromarray2(A, isoutput)\n"
    +    "\n"
    +    "Load the image from a numpy array\n"
    +    "By default this function fills the input buffer, which can subsequently\n"
    +    "be resampled using resize.  If isoutput=1, fill the output buffer.\n"
    +    "This is used to support raw pixel images w/o resampling"
    +    ;
     Py::Object
    -_image_module::fromarray2(const Py::Tuple& args) {
    -  _VERBOSE("_image_module::fromarray2");
    +_image_module::fromarray2(const Py::Tuple& args)
    +{
    +    _VERBOSE("_image_module::fromarray2");
     
    -  args.verify_length(2);
    +    args.verify_length(2);
     
    -  Py::Object x = args[0];
    -  int isoutput = Py::Int(args[1]);
    -  PyArrayObject *A = (PyArrayObject *) PyArray_ContiguousFromObject(x.ptr(), PyArray_DOUBLE, 2, 3);
    -  //PyArrayObject *A = (PyArrayObject *) PyArray_FromObject(x.ptr(), PyArray_DOUBLE, 2, 3);
    +    Py::Object x = args[0];
    +    int isoutput = Py::Int(args[1]);
    +    PyArrayObject *A = (PyArrayObject *) PyArray_ContiguousFromObject(x.ptr(), PyArray_DOUBLE, 2, 3);
    +    if (A == NULL)
    +    {
    +        throw Py::ValueError("Array must be rank 2 or 3 of doubles");
    +    }
    +    Py::Object A_obj((PyObject*)A, true);
     
    -  if (A==NULL)
    -    throw Py::ValueError("Array must be rank 2 or 3 of doubles");
    +    Image* imo = new Image;
    +
    +    imo->rowsIn  = A->dimensions[0];
    +    imo->colsIn  = A->dimensions[1];
     
    +    size_t NUMBYTES(imo->colsIn * imo->rowsIn * imo->BPP);
    +    agg::int8u *buffer = new agg::int8u[NUMBYTES];
    +    if (buffer == NULL) //todo: also handle allocation throw
    +    {
    +        throw Py::MemoryError("_image_module::fromarray could not allocate memory");
    +    }
    +
    +    if (isoutput)
    +    {
    +        // make the output buffer point to the input buffer
    +        imo->rowsOut  = imo->rowsIn;
    +        imo->colsOut  = imo->colsIn;
    +
    +        imo->rbufOut = new agg::rendering_buffer;
    +        imo->bufferOut = buffer;
    +        imo->rbufOut->attach(imo->bufferOut, imo->colsOut, imo->rowsOut, imo->colsOut * imo->BPP);
    +    }
    +    else
    +    {
    +        imo->bufferIn = buffer;
    +        imo->rbufIn = new agg::rendering_buffer;
    +        imo->rbufIn->attach(buffer, imo->colsIn, imo->rowsIn, imo->colsIn*imo->BPP);
    +    }
    +
    +    if (A->nd == 2)     //assume luminance for now;
    +    {
    +        agg::int8u gray;
    +        const size_t N = imo->rowsIn * imo->colsIn;
    +        size_t i = 0;
    +        while (i++ < N)
    +        {
    +            double val = *(double *)(A->data++);
     
    -  Image* imo = new Image;
    +            gray = int(255 * val);
    +            *buffer++ = gray;       // red
    +            *buffer++ = gray;       // green
    +            *buffer++ = gray;       // blue
    +            *buffer++   = 255;        // alpha
    +        }
     
    -  imo->rowsIn  = A->dimensions[0];
    -  imo->colsIn  = A->dimensions[1];
    +    }
    +    else if (A->nd == 3)     // assume RGB
    +    {
    +        if (A->dimensions[2] != 3 && A->dimensions[2] != 4)
    +        {
    +            throw Py::ValueError(Printf("3rd dimension must be length 3 (RGB) or 4 (RGBA); found %d", A->dimensions[2]).str());
     
    +        }
     
    -  size_t NUMBYTES(imo->colsIn * imo->rowsIn * imo->BPP);
    -  agg::int8u *buffer = new agg::int8u[NUMBYTES];
    -  if (buffer==NULL) //todo: also handle allocation throw
    -    throw Py::MemoryError("_image_module::fromarray could not allocate memory");
    +        int rgba = A->dimensions[2] == 4;
    +        double r, g, b, alpha;
    +        const size_t N = imo->rowsIn * imo->colsIn;
    +        size_t i = 0;
    +        while (i < N)
    +        {
    +            r = *(double *)(A->data++);
    +            g = *(double *)(A->data++);
    +            b = *(double *)(A->data++);
    +
    +            if (rgba)
    +                alpha = *(double *)(A->data++);
    +            else
    +                alpha = 1.0;
    +
    +            *buffer++ = int(255 * r);       // red
    +            *buffer++ = int(255 * g);       // green
    +            *buffer++ = int(255 * b);       // blue
    +            *buffer++ = int(255 * alpha);   // alpha
     
    -  if (isoutput) {
    -    // make the output buffer point to the input buffer
    +        }
    +    }
    +    else     // error
    +    {
    +        throw Py::ValueError("Illegal array rank; must be rank; must 2 or 3");
    +    }
    +    buffer -= NUMBYTES;
     
    -    imo->rowsOut  = imo->rowsIn;
    -    imo->colsOut  = imo->colsIn;
    +    return Py::asObject(imo);
    +}
     
    -    imo->rbufOut = new agg::rendering_buffer;
    -    imo->bufferOut = buffer;
    -    imo->rbufOut->attach(imo->bufferOut, imo->colsOut, imo->rowsOut, imo->colsOut * imo->BPP);
    +char _image_module_frombyte__doc__[] =
    +    "frombyte(A, isoutput)\n"
    +    "\n"
    +    "Load the image from a byte array.\n"
    +    "By default this function fills the input buffer, which can subsequently\n"
    +    "be resampled using resize.  If isoutput=1, fill the output buffer.\n"
    +    "This is used to support raw pixel images w/o resampling."
    +    ;
    +Py::Object
    +_image_module::frombyte(const Py::Tuple& args)
    +{
    +    _VERBOSE("_image_module::frombyte");
     
    -  }
    -  else {
    -    imo->bufferIn = buffer;
    -    imo->rbufIn = new agg::rendering_buffer;
    -    imo->rbufIn->attach(buffer, imo->colsIn, imo->rowsIn, imo->colsIn*imo->BPP);
    -  }
    +    args.verify_length(2);
     
    -  if   (A->nd == 2) { //assume luminance for now;
    +    Py::Object x = args[0];
    +    int isoutput = Py::Int(args[1]);
     
    -    agg::int8u gray;
    -    const size_t N = imo->rowsIn * imo->colsIn;
    -    size_t i = 0;
    -    while (i++data++);
    +    PyArrayObject *A = (PyArrayObject *) PyArray_ContiguousFromObject(x.ptr(), PyArray_UBYTE, 3, 3);
    +    if (A == NULL)
    +    {
    +        throw Py::ValueError("Array must have 3 dimensions");
    +    }
    +    Py::Object A_obj((PyObject*)A, true);
     
    -      gray = int(255 * val);
    -      *buffer++ = gray;       // red
    -      *buffer++ = gray;       // green
    -      *buffer++ = gray;       // blue
    -      *buffer++   = 255;        // alpha
    +    if (A->dimensions[2] < 3 || A->dimensions[2] > 4)
    +    {
    +        throw Py::ValueError("Array dimension 3 must have size 3 or 4");
         }
     
    -  }
    -  else if   (A->nd == 3) { // assume RGB
    +    Image* imo = new Image;
    +
    +    imo->rowsIn = A->dimensions[0];
    +    imo->colsIn = A->dimensions[1];
    +
    +    agg::int8u *arrbuf;
    +    agg::int8u *buffer;
    +
    +    arrbuf = reinterpret_cast(A->data);
     
    -    if (A->dimensions[2] != 3 && A->dimensions[2] != 4 ) {
    -      Py_XDECREF(A);
    -      throw Py::ValueError(Printf("3rd dimension must be length 3 (RGB) or 4 (RGBA); found %d", A->dimensions[2]).str());
    +    size_t NUMBYTES(imo->colsIn * imo->rowsIn * imo->BPP);
    +    buffer = new agg::int8u[NUMBYTES];
     
    +    if (buffer == NULL) //todo: also handle allocation throw
    +    {
    +        throw Py::MemoryError("_image_module::frombyte could not allocate memory");
         }
     
    -    int rgba = A->dimensions[2]==4;
    -    double r,g,b,alpha;
    -    const size_t N = imo->rowsIn * imo->colsIn;
    +    const size_t N = imo->rowsIn * imo->colsIn * imo->BPP;
         size_t i = 0;
    -    while (idata++);
    -	g = *(double *)(A->data++);
    -	b = *(double *)(A->data++);
    -
    -	if (rgba)
    -	  alpha = *(double *)(A->data++);
    -	else
    -	  alpha = 1.0;
    -
    -	*buffer++ = int(255*r);         // red
    -	*buffer++ = int(255*g);         // green
    -	*buffer++ = int(255*b);         // blue
    -	*buffer++ = int(255*alpha);     // alpha
    -
    -      }
    -
    -  }
    -  else   { // error
    -    Py_XDECREF(A);
    -    throw Py::ValueError("Illegal array rank; must be rank; must 2 or 3");
    -  }
    -  buffer -= NUMBYTES;
    -  Py_XDECREF(A);
    +    if (A->dimensions[2] == 4)
    +    {
    +        memmove(buffer, arrbuf, N);
    +    }
    +    else
    +    {
    +        while (i < N)
    +        {
    +            memmove(buffer, arrbuf, 3);
    +            buffer += 3;
    +            arrbuf += 3;
    +            *buffer++ = 255;
    +            i += 4;
    +        }
    +        buffer -= N;
    +        arrbuf -= imo->rowsIn * imo->colsIn;
    +    }
    +
    +    if (isoutput)
    +    {
    +        // make the output buffer point to the input buffer
    +
    +        imo->rowsOut  = imo->rowsIn;
    +        imo->colsOut  = imo->colsIn;
    +
    +        imo->rbufOut = new agg::rendering_buffer;
    +        imo->bufferOut = buffer;
    +        imo->rbufOut->attach(imo->bufferOut, imo->colsOut, imo->rowsOut, imo->colsOut * imo->BPP);
    +
    +    }
    +    else
    +    {
    +        imo->bufferIn = buffer;
    +        imo->rbufIn = new agg::rendering_buffer;
    +        imo->rbufIn->attach(buffer, imo->colsIn, imo->rowsIn, imo->colsIn*imo->BPP);
    +    }
     
    -  return Py::asObject( imo );
    +    return Py::asObject(imo);
     }
     
    -char _image_module_frombyte__doc__[] =
    -"frombyte(A, isoutput)\n"
    -"\n"
    -"Load the image from a byte array.\n"
    -"By default this function fills the input buffer, which can subsequently\n"
    -"be resampled using resize.  If isoutput=1, fill the output buffer.\n"
    -"This is used to support raw pixel images w/o resampling."
    -;
    -Py::Object
    -_image_module::frombyte(const Py::Tuple& args) {
    -  _VERBOSE("_image_module::frombyte");
    -
    -  args.verify_length(2);
    -
    -  Py::Object x = args[0];
    -  int isoutput = Py::Int(args[1]);
    -
    -  PyArrayObject *A = (PyArrayObject *) PyArray_ContiguousFromObject(x.ptr(), PyArray_UBYTE, 3, 3);
    -  if (A == NULL)
    -      throw Py::ValueError("Array must have 3 dimensions");
    -  if (A->dimensions[2]<3 || A->dimensions[2]>4)
    -      throw Py::ValueError("Array dimension 3 must have size 3 or 4");
    -
    -  Image* imo = new Image;
    -
    -  imo->rowsIn = A->dimensions[0];
    -  imo->colsIn = A->dimensions[1];
    -
    -  agg::int8u *arrbuf;
    -  agg::int8u *buffer;
    -
    -  arrbuf = reinterpret_cast(A->data);
    -
    -  size_t NUMBYTES(imo->colsIn * imo->rowsIn * imo->BPP);
    -  buffer = new agg::int8u[NUMBYTES];
    -
    -  if (buffer==NULL) //todo: also handle allocation throw
    -      throw Py::MemoryError("_image_module::frombyte could not allocate memory");
    -
    -  const size_t N = imo->rowsIn * imo->colsIn * imo->BPP;
    -  size_t i = 0;
    -  if (A->dimensions[2] == 4) {
    -      memmove(buffer, arrbuf, N);
    -  } else {
    -      while (i < N) {
    -          memmove(buffer, arrbuf, 3);
    -          buffer += 3;
    -          arrbuf += 3;
    -          *buffer++ = 255;
    -          i += 4;
    -      }
    -      buffer -= N;
    -      arrbuf -= imo->rowsIn * imo->colsIn;
    -  }
    -  Py_XDECREF(A);
    +char _image_module_frombuffer__doc__[] =
    +    "frombuffer(buffer, width, height, isoutput)\n"
    +    "\n"
    +    "Load the image from a character buffer\n"
    +    "By default this function fills the input buffer, which can subsequently\n"
    +    "be resampled using resize.  If isoutput=1, fill the output buffer.\n"
    +    "This is used to support raw pixel images w/o resampling."
    +    ;
    +Py::Object
    +_image_module::frombuffer(const Py::Tuple& args)
    +{
    +    _VERBOSE("_image_module::frombuffer");
     
    -  if (isoutput) {
    -    // make the output buffer point to the input buffer
    +    args.verify_length(4);
     
    -    imo->rowsOut  = imo->rowsIn;
    -    imo->colsOut  = imo->colsIn;
    +    PyObject *bufin = new_reference_to(args[0]);
    +    size_t x = Py::Int(args[1]);
    +    size_t y = Py::Int(args[2]);
     
    -    imo->rbufOut = new agg::rendering_buffer;
    -    imo->bufferOut = buffer;
    -    imo->rbufOut->attach(imo->bufferOut, imo->colsOut, imo->rowsOut, imo->colsOut * imo->BPP);
    +    if (x >= 32768 || y >= 32768)
    +    {
    +        throw Py::ValueError("x and y must both be less than 32768");
    +    }
     
    -  }
    -  else {
    -    imo->bufferIn = buffer;
    -    imo->rbufIn = new agg::rendering_buffer;
    -    imo->rbufIn->attach(buffer, imo->colsIn, imo->rowsIn, imo->colsIn*imo->BPP);
    -  }
    +    int isoutput = Py::Int(args[3]);
     
    -  return Py::asObject( imo );
    -}
    +    if (PyObject_CheckReadBuffer(bufin) != 1)
    +        throw Py::ValueError("First argument must be a buffer.");
     
    -char _image_module_frombuffer__doc__[] =
    -"frombuffer(buffer, width, height, isoutput)\n"
    -"\n"
    -"Load the image from a character buffer\n"
    -"By default this function fills the input buffer, which can subsequently\n"
    -"be resampled using resize.  If isoutput=1, fill the output buffer.\n"
    -"This is used to support raw pixel images w/o resampling."
    -;
    -Py::Object
    -_image_module::frombuffer(const Py::Tuple& args) {
    -  _VERBOSE("_image_module::frombuffer");
    -
    -  args.verify_length(4);
    -
    -  PyObject *bufin = new_reference_to(args[0]);
    -  size_t x = Py::Int(args[1]);
    -  size_t y = Py::Int(args[2]);
    -
    -  if (x >= 32768 || y >= 32768) {
    -    throw Py::ValueError("x and y must both be less than 32768");
    -  }
    -
    -  int isoutput = Py::Int(args[3]);
    -
    -  if (PyObject_CheckReadBuffer(bufin) != 1)
    -    throw Py::ValueError("First argument must be a buffer.");
    -
    -  Image* imo = new Image;
    -
    -  imo->rowsIn = y;
    -  imo->colsIn = x;
    -  Py_ssize_t NUMBYTES(imo->colsIn * imo->rowsIn * imo->BPP);
    -
    -  Py_ssize_t buflen;
    -  const agg::int8u *rawbuf;
    -  if (PyObject_AsReadBuffer(bufin, reinterpret_cast(&rawbuf), &buflen) != 0)
    -    throw Py::ValueError("Cannot get buffer from object.");
    -
    -  // Check buffer is required size.
    -  if (buflen != NUMBYTES)
    -    throw Py::ValueError("Buffer length must be width * height * 4.");
    -
    -  // Copy from input buffer to new buffer for agg.
    -  agg::int8u* buffer = new agg::int8u[NUMBYTES];
    -  if (buffer==NULL) //todo: also handle allocation throw
    -    throw Py::MemoryError("_image_module::frombuffer could not allocate memory");
    -  memmove(buffer, rawbuf, NUMBYTES);
    +    Image* imo = new Image;
     
    -  if (isoutput) {
    -    // make the output buffer point to the input buffer
    +    imo->rowsIn = y;
    +    imo->colsIn = x;
    +    Py_ssize_t NUMBYTES(imo->colsIn * imo->rowsIn * imo->BPP);
    +
    +    Py_ssize_t buflen;
    +    const agg::int8u *rawbuf;
    +    if (PyObject_AsReadBuffer(bufin, reinterpret_cast(&rawbuf), &buflen) != 0)
    +    {
    +        throw Py::ValueError("Cannot get buffer from object.");
    +    }
     
    -    imo->rowsOut  = imo->rowsIn;
    -    imo->colsOut  = imo->colsIn;
    +    // Check buffer is required size.
    +    if (buflen != NUMBYTES)
    +    {
    +        throw Py::ValueError("Buffer length must be width * height * 4.");
    +    }
     
    -    imo->rbufOut = new agg::rendering_buffer;
    -    imo->bufferOut = buffer;
    -    imo->rbufOut->attach(imo->bufferOut, imo->colsOut, imo->rowsOut, imo->colsOut * imo->BPP);
    +    // Copy from input buffer to new buffer for agg.
    +    agg::int8u* buffer = new agg::int8u[NUMBYTES];
    +    if (buffer == NULL) //todo: also handle allocation throw
    +    {
    +        throw Py::MemoryError("_image_module::frombuffer could not allocate memory");
    +    }
    +    memmove(buffer, rawbuf, NUMBYTES);
     
    -  }
    -  else {
    -    imo->bufferIn = buffer;
    -    imo->rbufIn = new agg::rendering_buffer;
    -    imo->rbufIn->attach(buffer, imo->colsIn, imo->rowsIn, imo->colsIn*imo->BPP);
    -  }
    +    if (isoutput)
    +    {
    +        // make the output buffer point to the input buffer
    +        imo->rowsOut  = imo->rowsIn;
    +        imo->colsOut  = imo->colsIn;
    +
    +        imo->rbufOut = new agg::rendering_buffer;
    +        imo->bufferOut = buffer;
    +        imo->rbufOut->attach(imo->bufferOut, imo->colsOut, imo->rowsOut, imo->colsOut * imo->BPP);
     
    -  return Py::asObject(imo);
    +    }
    +    else
    +    {
    +        imo->bufferIn = buffer;
    +        imo->rbufIn = new agg::rendering_buffer;
    +        imo->rbufIn->attach(buffer, imo->colsIn, imo->rowsIn, imo->colsIn*imo->BPP);
    +    }
    +
    +    return Py::asObject(imo);
     }
     
     // utilities for irregular grids
    -void _bin_indices_middle(unsigned int *irows, int nrows, float *ys1, int ny,float dy, float y_min)
    -{ int  i,j, j_last;
    -   unsigned  int * rowstart = irows;
    -  float *ys2 = ys1+1;
    -  float *yl = ys1 + ny ;
    -  float yo = y_min + dy/2.0;
    -  float ym = 0.5f*(*ys1 + *ys2);
    -  // y/rows
    -   j = 0;
    -   j_last = j;
    -  for (i=0;i ym) {
    -          ys1 = ys2;
    -          ys2 = ys1+1;
    -          ym = 0.5f*(*ys1 + *ys2);
    -          j++;
    -      }
    -      *rowstart = j - j_last;
    -      j_last = j;
    -  }
    +void _bin_indices_middle(unsigned int *irows, int nrows, float *ys1, int ny, float dy, float y_min)
    +{
    +    int  i, j, j_last;
    +    unsigned  int * rowstart = irows;
    +    float *ys2 = ys1 + 1;
    +    float *yl = ys1 + ny ;
    +    float yo = y_min + dy / 2.0;
    +    float ym = 0.5f * (*ys1 + *ys2);
    +    // y/rows
    +    j = 0;
    +    j_last = j;
    +    for (i = 0;i < nrows;i++, yo += dy, rowstart++)
    +    {
    +        while (ys2 != yl && yo > ym)
    +        {
    +            ys1 = ys2;
    +            ys2 = ys1 + 1;
    +            ym = 0.5f * (*ys1 + *ys2);
    +            j++;
    +        }
    +        *rowstart = j - j_last;
    +        j_last = j;
    +    }
     }
     
    -void _bin_indices_middle_linear(float *arows, unsigned int *irows, int nrows, float *y, int ny,float dy, float y_min)
    -{ int i;
    +void _bin_indices_middle_linear(float *arows, unsigned int *irows, int nrows, float *y, int ny, float dy, float y_min)
    +{
    +    int i;
         int ii = 0;
    -    int iilast = ny-1;
    -    float sc = 1/dy;
    -    int iy0 = (int)floor(sc * (y[ii]  - y_min) );
    -    int iy1 = (int)floor(sc * (y[ii+1]  - y_min) );
    -    float invgap=1.0f/(iy1-iy0);
    -    for (i=0; i= 32768 || cols >= 32768)
    +    {
    +        throw Py::ValueError("rows and cols must both be less than 32768");
    +    }
    +
    +    if (bounds.length() != 4)
    +    {
    +        throw Py::TypeError("Incorrect number of bounds (4 expected)");
    +    }
    +
    +    float x_min = Py::Float(bounds[0]);
    +    float x_max = Py::Float(bounds[1]);
    +    float y_min = Py::Float(bounds[2]);
    +    float y_max = Py::Float(bounds[3]);
    +    float width = x_max - x_min;
    +    float height = y_max - y_min;
    +    float dx = width / ((float) cols);
    +    float dy = height / ((float) rows);
    +
    +    // Check we have something to output to
    +    if (rows == 0 || cols == 0)
    +    {
    +        throw Py::ValueError("Cannot scale to zero size");
    +    }
     
    -  if (args.length() != 7)
    -      throw Py::TypeError("Incorrect number of arguments (7 expected)");
    +    PyArrayObject *x = NULL;
    +    PyArrayObject *y = NULL;
    +    PyArrayObject *d = NULL;
    +    unsigned int *rowstarts = NULL;
    +    unsigned int *colstarts = NULL;
    +    float *acols = NULL;
    +    float *arows = NULL;
     
    -  Py::Object xp = args[0];
    -  Py::Object yp = args[1];
    -  Py::Object dp = args[2];
    -  unsigned int rows = Py::Int(args[3]);
    -  unsigned int cols = Py::Int(args[4]);
    -  Py::Tuple bounds = args[5];
    -  unsigned int interpolation = Py::Int(args[6]);
    -
    -  if (rows >= 32768 || cols >= 32768) {
    -    throw Py::ValueError("rows and cols must both be less than 32768");
    -  }
    -
    -  if (bounds.length() !=4)
    -      throw Py::TypeError("Incorrect number of bounds (4 expected)");
    -  float x_min = Py::Float(bounds[0]);
    -  float x_max = Py::Float(bounds[1]);
    -  float y_min = Py::Float(bounds[2]);
    -  float y_max = Py::Float(bounds[3]);
    -  float width = x_max - x_min;
    -  float height = y_max - y_min;
    -  float dx = width / ((float) cols);
    -  float dy = height / ((float) rows);
    -
    -  // Check we have something to output to
    -  if (rows == 0 || cols ==0)
    -      throw Py::ValueError("Cannot scale to zero size");
    -
    -  PyArrayObject *x = NULL; PyArrayObject *y = NULL; PyArrayObject *d = NULL;
    -  unsigned int * rowstarts = NULL; unsigned int*colstarts = NULL;
    -  float *acols = NULL; float *arows = NULL;
    -
    -  // Get numpy arrays
    -  x = (PyArrayObject *) PyArray_ContiguousFromObject(xp.ptr(), PyArray_FLOAT, 1, 1);
    -  if (x == NULL) {
    -      _pcolor_cleanup(x,y,d,rowstarts,colstarts,acols,arows);
    -      throw Py::ValueError("x is of incorrect type (wanted 1D float)");
    -  }
    -  y = (PyArrayObject *) PyArray_ContiguousFromObject(yp.ptr(), PyArray_FLOAT, 1, 1);
    -  if (y == NULL) {
    -     _pcolor_cleanup(x,y,d,rowstarts,colstarts,acols,arows);
    -     throw Py::ValueError("y is of incorrect type (wanted 1D float)");
    -  }
    -  d = (PyArrayObject *) PyArray_ContiguousFromObject(dp.ptr(), PyArray_UBYTE, 3, 3);
    -  if (d == NULL) {
    -     _pcolor_cleanup(x,y,d,rowstarts,colstarts,acols,arows);
    -      throw Py::ValueError("data is of incorrect type (wanted 3D UInt8)");
    -  }
    -  if (d->dimensions[2] != 4) {
    -     _pcolor_cleanup(x,y,d,rowstarts,colstarts,acols,arows);
    -      throw Py::ValueError("data must be in RGBA format");
    -  }
    -
    -  // Check dimensions match
    -  int nx = x->dimensions[0];
    -  int ny = y->dimensions[0];
    -  if (nx != d->dimensions[1] || ny != d->dimensions[0]) {
    -     _pcolor_cleanup(x,y,d,rowstarts,colstarts,acols,arows);
    -      throw Py::ValueError("data and axis dimensions do not match");
    -  }
    -
    -  // Allocate memory for pointer arrays
    -  rowstarts = reinterpret_cast(PyMem_Malloc(sizeof(unsigned int)*rows));
    -  if (rowstarts == NULL) {
    -     _pcolor_cleanup(x,y,d,rowstarts,colstarts,acols,arows);
    -      throw Py::MemoryError("Cannot allocate memory for lookup table");
    -  }
    -  colstarts = reinterpret_cast(PyMem_Malloc(sizeof(unsigned int)*cols));
    -  if (colstarts == NULL) {
    -     _pcolor_cleanup(x,y,d,rowstarts,colstarts,acols,arows);
    -      throw Py::MemoryError("Cannot allocate memory for lookup table");
    -  }
    -
    -  // Create output
    -  Image* imo = new Image;
    -  imo->rowsIn = rows;
    -  imo->colsIn = cols;
    -  imo->rowsOut = rows;
    -  imo->colsOut = cols;
    -  size_t NUMBYTES(rows * cols * 4);
    -  agg::int8u *buffer = new agg::int8u[NUMBYTES];
    -  if (buffer == NULL) {
    -     _pcolor_cleanup(x,y,d,rowstarts,colstarts,acols,arows);
    -      throw Py::MemoryError("Could not allocate memory for image");
    -  }
    -
    -
    -  // Calculate the pointer arrays to map input x to output x
    -  unsigned int i, j;
    -  unsigned int * colstart = colstarts;
    -  unsigned int * rowstart = rowstarts;
    -  float *xs1 = reinterpret_cast(x->data);
    -  float *ys1 = reinterpret_cast(y->data);
    -
    -
    -  // Copy data to output buffer
    -  unsigned char *start;
    -  unsigned char *inposition;
    -  size_t inrowsize(nx*4);
    -  size_t rowsize(cols*4);
    -  rowstart = rowstarts;
    -  agg::int8u * position = buffer;
    -  agg::int8u * oldposition = NULL;
    -  start = reinterpret_cast(d->data);
    +    // Get numpy arrays
    +    x = (PyArrayObject *) PyArray_ContiguousFromObject(xp.ptr(), PyArray_FLOAT, 1, 1);
    +    if (x == NULL)
    +    {
    +        _pcolor_cleanup(x, y, d, rowstarts, colstarts, acols, arows);
    +        throw Py::ValueError("x is of incorrect type (wanted 1D float)");
    +    }
    +    y = (PyArrayObject *) PyArray_ContiguousFromObject(yp.ptr(), PyArray_FLOAT, 1, 1);
    +    if (y == NULL)
    +    {
    +        _pcolor_cleanup(x, y, d, rowstarts, colstarts, acols, arows);
    +        throw Py::ValueError("y is of incorrect type (wanted 1D float)");
    +    }
    +    d = (PyArrayObject *) PyArray_ContiguousFromObject(dp.ptr(), PyArray_UBYTE, 3, 3);
    +    if (d == NULL)
    +    {
    +        _pcolor_cleanup(x, y, d, rowstarts, colstarts, acols, arows);
    +        throw Py::ValueError("data is of incorrect type (wanted 3D UInt8)");
    +    }
    +    if (d->dimensions[2] != 4)
    +    {
    +        _pcolor_cleanup(x, y, d, rowstarts, colstarts, acols, arows);
    +        throw Py::ValueError("data must be in RGBA format");
    +    }
    +
    +    // Check dimensions match
    +    int nx = x->dimensions[0];
    +    int ny = y->dimensions[0];
    +    if (nx != d->dimensions[1] || ny != d->dimensions[0])
    +    {
    +        _pcolor_cleanup(x, y, d, rowstarts, colstarts, acols, arows);
    +        throw Py::ValueError("data and axis dimensions do not match");
    +    }
    +
    +    // Allocate memory for pointer arrays
    +    rowstarts = reinterpret_cast(PyMem_Malloc(sizeof(unsigned int) * rows));
    +    if (rowstarts == NULL)
    +    {
    +        _pcolor_cleanup(x, y, d, rowstarts, colstarts, acols, arows);
    +        throw Py::MemoryError("Cannot allocate memory for lookup table");
    +    }
    +    colstarts = reinterpret_cast(PyMem_Malloc(sizeof(unsigned int) * cols));
    +    if (colstarts == NULL)
    +    {
    +        _pcolor_cleanup(x, y, d, rowstarts, colstarts, acols, arows);
    +        throw Py::MemoryError("Cannot allocate memory for lookup table");
    +    }
    +
    +    // Create output
    +    Image* imo = new Image;
    +    imo->rowsIn = rows;
    +    imo->colsIn = cols;
    +    imo->rowsOut = rows;
    +    imo->colsOut = cols;
    +    size_t NUMBYTES(rows * cols * 4);
    +    agg::int8u *buffer = new agg::int8u[NUMBYTES];
    +    if (buffer == NULL)
    +    {
    +        _pcolor_cleanup(x, y, d, rowstarts, colstarts, acols, arows);
    +        throw Py::MemoryError("Could not allocate memory for image");
    +    }
    +
    +
    +    // Calculate the pointer arrays to map input x to output x
    +    unsigned int i, j;
    +    unsigned int * colstart = colstarts;
    +    unsigned int * rowstart = rowstarts;
    +    float *xs1 = reinterpret_cast(x->data);
    +    float *ys1 = reinterpret_cast(y->data);
    +
    +
    +    // Copy data to output buffer
    +    unsigned char *start;
    +    unsigned char *inposition;
    +    size_t inrowsize(nx*4);
    +    size_t rowsize(cols*4);
    +    rowstart = rowstarts;
    +    agg::int8u * position = buffer;
    +    agg::int8u * oldposition = NULL;
    +    start = reinterpret_cast(d->data);
         int s0 = d->strides[0];
         int s1 = d->strides[1];
     
    -  if(interpolation == Image::NEAREST) {
    -      _bin_indices_middle(colstart, cols, xs1,  nx,dx,x_min);
    -      _bin_indices_middle(rowstart, rows, ys1,  ny, dy,y_min);
    -      for(i=0;i 0 && *rowstart == 0) {
    -              memcpy(position, oldposition, rowsize*sizeof(agg::int8u));
    -              oldposition = position;
    -              position += rowsize;
    -          } else {
    -              oldposition = position;
    -              start += *rowstart * inrowsize;
    -              inposition = start;
    -              for(j=0,colstart=colstarts;j(PyMem_Malloc(sizeof(float)*rows));
    -      if (arows == NULL ) {
    -         _pcolor_cleanup(x,y,d,rowstarts,colstarts,acols,arows);
    -          throw Py::MemoryError("Cannot allocate memory for lookup table");
    -      }
    -      acols = reinterpret_cast(PyMem_Malloc(sizeof(float)*cols));
    -      if (acols == NULL) {
    -         _pcolor_cleanup(x,y,d,rowstarts,colstarts,acols,arows);
    -          throw Py::MemoryError("Cannot allocate memory for lookup table");
    -      }
    -
    -      _bin_indices_middle_linear(acols, colstart, cols, xs1,  nx,dx,x_min);
    -      _bin_indices_middle_linear(arows, rowstart, rows, ys1,  ny, dy,y_min);
    -      double a00,a01,a10,a11,alpha,beta;
    +    if (interpolation == Image::NEAREST)
    +    {
    +        _bin_indices_middle(colstart, cols, xs1,  nx, dx, x_min);
    +        _bin_indices_middle(rowstart, rows, ys1,  ny, dy, y_min);
    +        for (i = 0;i < rows;i++, rowstart++)
    +        {
    +            if (i > 0 && *rowstart == 0)
    +            {
    +                memcpy(position, oldposition, rowsize*sizeof(agg::int8u));
    +                oldposition = position;
    +                position += rowsize;
    +            }
    +            else
    +            {
    +                oldposition = position;
    +                start += *rowstart * inrowsize;
    +                inposition = start;
    +                for (j = 0, colstart = colstarts;j < cols;j++, position += 4, colstart++)
    +                {
    +                    inposition += *colstart * 4;
    +                    memcpy(position, inposition, 4*sizeof(agg::int8u));
    +                }
    +            }
    +        }
    +    }
    +    else if (interpolation == Image::BILINEAR)
    +    {
    +        arows = reinterpret_cast(PyMem_Malloc(sizeof(float) * rows));
    +        if (arows == NULL)
    +        {
    +            _pcolor_cleanup(x, y, d, rowstarts, colstarts, acols, arows);
    +            throw Py::MemoryError("Cannot allocate memory for lookup table");
    +        }
    +        acols = reinterpret_cast(PyMem_Malloc(sizeof(float) * cols));
    +        if (acols == NULL)
    +        {
    +            _pcolor_cleanup(x, y, d, rowstarts, colstarts, acols, arows);
    +            throw Py::MemoryError("Cannot allocate memory for lookup table");
    +        }
    +
    +        _bin_indices_middle_linear(acols, colstart, cols, xs1,  nx, dx, x_min);
    +        _bin_indices_middle_linear(arows, rowstart, rows, ys1,  ny, dy, y_min);
    +        double a00, a01, a10, a11, alpha, beta;
     
     
             agg::int8u * start00;
             agg::int8u * start01;
             agg::int8u * start10;
             agg::int8u * start11;
    -      // Copy data to output buffer
    -      for (i=0; irbufOut = new agg::rendering_buffer;
    -  imo->bufferOut = buffer;
    -  imo->rbufOut->attach(imo->bufferOut, imo->colsOut, imo->rowsOut, imo->colsOut * imo->BPP);
    +    // Attach output buffer to output buffer
    +    imo->rbufOut = new agg::rendering_buffer;
    +    imo->bufferOut = buffer;
    +    imo->rbufOut->attach(imo->bufferOut, imo->colsOut, imo->rowsOut, imo->colsOut * imo->BPP);
     
    -   _pcolor_cleanup(x,y,d,rowstarts,colstarts,acols,arows);
    +    _pcolor_cleanup(x, y, d, rowstarts, colstarts, acols, arows);
     
    -  return Py::asObject(imo);
    +    return Py::asObject(imo);
     
     }
     
    +void _pcolor2_cleanup(PyArrayObject* x, PyArrayObject* y, PyArrayObject *d,
    +                      PyArrayObject* bg, int *irows, int*jcols)
    +{
    +    Py_XDECREF(x);
    +    Py_XDECREF(y);
    +    Py_XDECREF(d);
    +    Py_XDECREF(bg);
    +    if (irows)
    +    {
    +        PyMem_Free(irows);
    +    }
    +    if (jcols)
    +    {
    +        PyMem_Free(jcols);
    +    }
    +}
    +
     
     char __image_module_pcolor2__doc__[] =
    -"pcolor2(x, y, data, rows, cols, bounds, bg)\n"
    -"\n"
    -"Generate a pseudo-color image from data on a non-uniform grid\n"
    -"specified by its cell boundaries.\n"
    -"bounds = (x_left, x_right, y_bot, y_top)\n"
    -"bg = ndarray of 4 uint8 representing background rgba\n"
    -;
    +    "pcolor2(x, y, data, rows, cols, bounds, bg)\n"
    +    "\n"
    +    "Generate a pseudo-color image from data on a non-uniform grid\n"
    +    "specified by its cell boundaries.\n"
    +    "bounds = (x_left, x_right, y_bot, y_top)\n"
    +    "bg = ndarray of 4 uint8 representing background rgba\n"
    +    ;
     Py::Object
    -_image_module::pcolor2(const Py::Tuple& args) {
    +_image_module::pcolor2(const Py::Tuple& args)
    +{
         _VERBOSE("_image_module::pcolor2");
     
         if (args.length() != 7)
    +    {
             throw Py::TypeError("Incorrect number of arguments (6 expected)");
    +    }
     
         Py::Object xp = args[0];
         Py::Object yp = args[1];
    @@ -1556,89 +1729,91 @@
         Py::Tuple bounds = args[5];
         Py::Object bgp = args[6];
     
    -    if (rows >= 32768 || cols >= 32768) {
    -      throw Py::ValueError("rows and cols must both be less than 32768");
    +    if (rows >= 32768 || cols >= 32768)
    +    {
    +        throw Py::ValueError("rows and cols must both be less than 32768");
         }
     
    -    if (bounds.length() !=4)
    +    if (bounds.length() != 4)
    +    {
             throw Py::TypeError("Incorrect number of bounds (4 expected)");
    +    }
    +
         double x_left = Py::Float(bounds[0]);
         double x_right = Py::Float(bounds[1]);
         double y_bot = Py::Float(bounds[2]);
         double y_top = Py::Float(bounds[3]);
     
         // Check we have something to output to
    -    if (rows == 0 || cols ==0)
    +    if (rows == 0 || cols == 0)
    +    {
             throw Py::ValueError("rows or cols is zero; there are no pixels");
    +    }
    +
    +    PyArrayObject* x = NULL;
    +    PyArrayObject* y = NULL;
    +    PyArrayObject* d = NULL;
    +    PyArrayObject* bg = NULL;
    +    int* irows = NULL;
    +    int* jcols = NULL;
     
         // Get numpy arrays
    -    PyArrayObject *x = (PyArrayObject *) PyArray_ContiguousFromObject(xp.ptr(),
    -                                                          PyArray_DOUBLE, 1, 1);
    +    x = (PyArrayObject *) PyArray_ContiguousFromObject(xp.ptr(), PyArray_DOUBLE, 1, 1);
         if (x == NULL)
    +    {
    +        _pcolor2_cleanup(x, y, d, bg, irows, jcols);
             throw Py::ValueError("x is of incorrect type (wanted 1D double)");
    -    PyArrayObject *y = (PyArrayObject *) PyArray_ContiguousFromObject(yp.ptr(),
    -                                                          PyArray_DOUBLE, 1, 1);
    -    if (y == NULL) {
    -        Py_XDECREF(x);
    +    }
    +    y = (PyArrayObject *) PyArray_ContiguousFromObject(yp.ptr(), PyArray_DOUBLE, 1, 1);
    +    if (y == NULL)
    +    {
    +        _pcolor2_cleanup(x, y, d, bg, irows, jcols);
             throw Py::ValueError("y is of incorrect type (wanted 1D double)");
         }
    -    PyArrayObject *d = (PyArrayObject *) PyArray_ContiguousFromObject(dp.ptr(),
    -                                                          PyArray_UBYTE, 3, 3);
    -    if (d == NULL) {
    -        Py_XDECREF(x);
    -        Py_XDECREF(y);
    +    d = (PyArrayObject *) PyArray_ContiguousFromObject(dp.ptr(), PyArray_UBYTE, 3, 3);
    +    if (d == NULL)
    +    {
    +        _pcolor2_cleanup(x, y, d, bg, irows, jcols);
             throw Py::ValueError("data is of incorrect type (wanted 3D uint8)");
         }
    -    if (d->dimensions[2] != 4) {
    -        Py_XDECREF(x);
    -        Py_XDECREF(y);
    -        Py_XDECREF(d);
    +    if (d->dimensions[2] != 4)
    +    {
    +        _pcolor2_cleanup(x, y, d, bg, irows, jcols);
             throw Py::ValueError("data must be in RGBA format");
         }
     
         // Check dimensions match
         int nx = x->dimensions[0];
         int ny = y->dimensions[0];
    -    if (nx != d->dimensions[1]+1 || ny != d->dimensions[0]+1) {
    -        Py_XDECREF(x);
    -        Py_XDECREF(y);
    -        Py_XDECREF(d);
    +    if (nx != d->dimensions[1] + 1 || ny != d->dimensions[0] + 1)
    +    {
    +        _pcolor2_cleanup(x, y, d, bg, irows, jcols);
             throw Py::ValueError("data and axis bin boundary dimensions are incompatible");
         }
     
    -    PyArrayObject *bg = (PyArrayObject *) PyArray_ContiguousFromObject(bgp.ptr(),
    -                                                          PyArray_UBYTE, 1, 1);
    -    if (bg == NULL) {
    -        Py_XDECREF(x);
    -        Py_XDECREF(y);
    -        Py_XDECREF(d);
    +    bg = (PyArrayObject *) PyArray_ContiguousFromObject(bgp.ptr(), PyArray_UBYTE, 1, 1);
    +    if (bg == NULL)
    +    {
    +        _pcolor2_cleanup(x, y, d, bg, irows, jcols);
             throw Py::ValueError("bg is of incorrect type (wanted 1D uint8)");
         }
    -    if (bg->dimensions[0] != 4) {
    -        Py_XDECREF(x);
    -        Py_XDECREF(y);
    -        Py_XDECREF(d);
    -        Py_XDECREF(bg);
    +    if (bg->dimensions[0] != 4)
    +    {
    +        _pcolor2_cleanup(x, y, d, bg, irows, jcols);
             throw Py::ValueError("bg must be in RGBA format");
         }
     
    -
         // Allocate memory for pointer arrays
    -    int * irows = reinterpret_cast(PyMem_Malloc(sizeof(int)*rows));
    -    if (irows == NULL) {
    -        Py_XDECREF(x);
    -        Py_XDECREF(y);
    -        Py_XDECREF(d);
    -        Py_XDECREF(bg);
    +    irows = reinterpret_cast(PyMem_Malloc(sizeof(int) * rows));
    +    if (irows == NULL)
    +    {
    +        _pcolor2_cleanup(x, y, d, bg, irows, jcols);
             throw Py::MemoryError("Cannot allocate memory for lookup table");
         }
    -    int * jcols = reinterpret_cast(PyMem_Malloc(sizeof(int)*cols));
    -    if (jcols == NULL) {
    -        Py_XDECREF(x);
    -        Py_XDECREF(y);
    -        Py_XDECREF(d);
    -        Py_XDECREF(bg);
    -        PyMem_Free(irows);
    +    jcols = reinterpret_cast(PyMem_Malloc(sizeof(int) * cols));
    +    if (jcols == NULL)
    +    {
    +        _pcolor2_cleanup(x, y, d, bg, irows, jcols);
             throw Py::MemoryError("Cannot allocate memory for lookup table");
         }
     
    @@ -1650,13 +1825,9 @@
         imo->colsOut = cols;
         size_t NUMBYTES(rows * cols * 4);
         agg::int8u *buffer = new agg::int8u[NUMBYTES];
    -    if (buffer == NULL) {
    -        Py_XDECREF(x);
    -        Py_XDECREF(y);
    -        Py_XDECREF(d);
    -        Py_XDECREF(bg);
    -        PyMem_Free(irows);
    -        PyMem_Free(jcols);
    +    if (buffer == NULL)
    +    {
    +        _pcolor2_cleanup(x, y, d, bg, irows, jcols);
             throw Py::MemoryError("Could not allocate memory for image");
         }
     
    @@ -1664,8 +1835,8 @@
         int i, j;
         double *x0 = reinterpret_cast(x->data);
         double *y0 = reinterpret_cast(y->data);
    -    double sx = cols/(x_right - x_left);
    -    double sy = rows/(y_top - y_bot);
    +    double sx = cols / (x_right - x_left);
    +    double sy = rows / (y_top - y_bot);
         _bin_indices(jcols, cols, x0, nx, sx, x_left);
         _bin_indices(irows, rows, y0, ny, sy, y_bot);
     
    @@ -1676,16 +1847,18 @@
         int s0 = d->strides[0];
         int s1 = d->strides[1];
     
    -    for (i=0; ibufferOut = buffer;
         imo->rbufOut->attach(imo->bufferOut, imo->colsOut, imo->rowsOut, imo->colsOut * imo->BPP);
     
    -    Py_XDECREF(x);
    -    Py_XDECREF(y);
    -    Py_XDECREF(d);
    -    Py_XDECREF(bg);
    -    PyMem_Free(irows);
    -    PyMem_Free(jcols);
    +    _pcolor2_cleanup(x, y, d, bg, irows, jcols);
     
         return Py::asObject(imo);
     }
    @@ -1711,39 +1879,40 @@
     #if defined(_MSC_VER)
     DL_EXPORT(void)
     #elif defined(__cplusplus)
    -  extern "C" void
    +extern "C" void
     #else
     void
     #endif
     
    -init_image(void) {
    -  _VERBOSE("init_image");
    +init_image(void)
    +{
    +    _VERBOSE("init_image");
     
    -  static _image_module* _image = new _image_module;
    +    static _image_module* _image = new _image_module;
     
    -  import_array();
    -  Py::Dict d = _image->moduleDictionary();
    +    import_array();
    +    Py::Dict d = _image->moduleDictionary();
     
    -  d["NEAREST"] = Py::Int(Image::NEAREST);
    -  d["BILINEAR"] = Py::Int(Image::BILINEAR);
    -  d["BICUBIC"] = Py::Int(Image::BICUBIC);
    -  d["SPLINE16"] = Py::Int(Image::SPLINE16);
    -  d["SPLINE36"] = Py::Int(Image::SPLINE36);
    -  d["HANNING"] = Py::Int(Image::HANNING);
    -  d["HAMMING"] = Py::Int(Image::HAMMING);
    -  d["HERMITE"] = Py::Int(Image::HERMITE);
    -  d["KAISER"]   = Py::Int(Image::KAISER);
    -  d["QUADRIC"]   = Py::Int(Image::QUADRIC);
    -  d["CATROM"]  = Py::Int(Image::CATROM);
    -  d["GAUSSIAN"]  = Py::Int(Image::GAUSSIAN);
    -  d["BESSEL"]  = Py::Int(Image::BESSEL);
    -  d["MITCHELL"]  = Py::Int(Image::MITCHELL);
    -  d["SINC"]  = Py::Int(Image::SINC);
    -  d["LANCZOS"]  = Py::Int(Image::LANCZOS);
    -  d["BLACKMAN"] = Py::Int(Image::BLACKMAN);
    +    d["NEAREST"] = Py::Int(Image::NEAREST);
    +    d["BILINEAR"] = Py::Int(Image::BILINEAR);
    +    d["BICUBIC"] = Py::Int(Image::BICUBIC);
    +    d["SPLINE16"] = Py::Int(Image::SPLINE16);
    +    d["SPLINE36"] = Py::Int(Image::SPLINE36);
    +    d["HANNING"] = Py::Int(Image::HANNING);
    +    d["HAMMING"] = Py::Int(Image::HAMMING);
    +    d["HERMITE"] = Py::Int(Image::HERMITE);
    +    d["KAISER"]   = Py::Int(Image::KAISER);
    +    d["QUADRIC"]   = Py::Int(Image::QUADRIC);
    +    d["CATROM"]  = Py::Int(Image::CATROM);
    +    d["GAUSSIAN"]  = Py::Int(Image::GAUSSIAN);
    +    d["BESSEL"]  = Py::Int(Image::BESSEL);
    +    d["MITCHELL"]  = Py::Int(Image::MITCHELL);
    +    d["SINC"]  = Py::Int(Image::SINC);
    +    d["LANCZOS"]  = Py::Int(Image::LANCZOS);
    +    d["BLACKMAN"] = Py::Int(Image::BLACKMAN);
     
    -  d["ASPECT_FREE"] = Py::Int(Image::ASPECT_FREE);
    -  d["ASPECT_PRESERVE"] = Py::Int(Image::ASPECT_PRESERVE);
    +    d["ASPECT_FREE"] = Py::Int(Image::ASPECT_FREE);
    +    d["ASPECT_PRESERVE"] = Py::Int(Image::ASPECT_PRESERVE);
     }
     
     
    diff -Nru matplotlib-0.99.3/src/_image.h matplotlib-1.0.1/src/_image.h
    --- matplotlib-0.99.3/src/_image.h	2009-07-31 15:14:23.000000000 +0000
    +++ matplotlib-1.0.1/src/_image.h	2010-07-07 01:41:45.000000000 +0000
    @@ -14,104 +14,107 @@
     
     
     
    -class Image : public Py::PythonExtension {
    +class Image : public Py::PythonExtension
    +{
     public:
    -  Image();
    -  virtual ~Image();
    +    Image();
    +    virtual ~Image();
     
    -  static void init_type(void);
    -  int setattr( const char*, const Py::Object & );
    -  Py::Object getattr( const char * name );
    -
    -  Py::Object apply_rotation(const Py::Tuple& args);
    -  Py::Object apply_scaling(const Py::Tuple& args);
    -  Py::Object apply_translation(const Py::Tuple& args);
    -  Py::Object as_rgba_str(const Py::Tuple& args, const Py::Dict& kwargs);
    -  Py::Object color_conv(const Py::Tuple& args);
    -  Py::Object buffer_rgba(const Py::Tuple& args);
    -  Py::Object reset_matrix(const Py::Tuple& args);
    -  Py::Object get_matrix(const Py::Tuple& args);
    -  Py::Object resize(const Py::Tuple& args, const Py::Dict& kwargs);
    -  Py::Object get_aspect(const Py::Tuple& args);
    -  Py::Object get_size(const Py::Tuple& args);
    -  Py::Object get_size_out(const Py::Tuple& args);
    -  Py::Object get_interpolation(const Py::Tuple& args);
    -  Py::Object set_interpolation(const Py::Tuple& args);
    -  Py::Object set_aspect(const Py::Tuple& args);
    -  Py::Object set_bg(const Py::Tuple& args);
    -  inline Py::Object flipud_out(const Py::Tuple& args) {
    -    args.verify_length(0);
    -    int stride = rbufOut->stride();
    -    //std::cout << "flip before: " << rbufOut->stride() << std::endl;
    -    rbufOut->attach(bufferOut, colsOut, rowsOut, -stride);
    -    //std::cout << "flip after: " << rbufOut->stride() << std::endl;
    -    return Py::Object();
    -  }
    -
    -  Py::Object flipud_in(const Py::Tuple& args);
    -  Py::Object set_resample(const Py::Tuple& args);
    -  Py::Object get_resample(const Py::Tuple& args);
    -
    -
    -  std::pair _get_output_buffer();
    -  enum {NEAREST,
    -	BILINEAR,
    -        BICUBIC,
    -        SPLINE16,
    -        SPLINE36,
    -        HANNING,
    -        HAMMING,
    -        HERMITE,
    -        KAISER,
    -        QUADRIC,
    -        CATROM,
    -        GAUSSIAN,
    -        BESSEL,
    -        MITCHELL,
    -        SINC,
    -        LANCZOS,
    -        BLACKMAN};
    -
    -  //enum { BICUBIC=0, BILINEAR, BLACKMAN100, BLACKMAN256, BLACKMAN64,
    -  //	 NEAREST, SINC144, SINC256, SINC64, SPLINE16, SPLINE36};
    -  enum { ASPECT_PRESERVE=0, ASPECT_FREE};
    -
    -  agg::int8u *bufferIn;
    -  agg::rendering_buffer *rbufIn;
    -  size_t colsIn, rowsIn;
    -
    -  agg::int8u *bufferOut;
    -  agg::rendering_buffer *rbufOut;
    -  size_t colsOut, rowsOut;
    -  unsigned BPP;
    -
    -  unsigned interpolation, aspect;
    -  agg::rgba bg;
    -  bool resample;
    +    static void init_type(void);
    +    int setattr(const char*, const Py::Object &);
    +    Py::Object getattr(const char * name);
    +
    +    Py::Object apply_rotation(const Py::Tuple& args);
    +    Py::Object apply_scaling(const Py::Tuple& args);
    +    Py::Object apply_translation(const Py::Tuple& args);
    +    Py::Object as_rgba_str(const Py::Tuple& args, const Py::Dict& kwargs);
    +    Py::Object color_conv(const Py::Tuple& args);
    +    Py::Object buffer_rgba(const Py::Tuple& args);
    +    Py::Object reset_matrix(const Py::Tuple& args);
    +    Py::Object get_matrix(const Py::Tuple& args);
    +    Py::Object resize(const Py::Tuple& args, const Py::Dict& kwargs);
    +    Py::Object get_aspect(const Py::Tuple& args);
    +    Py::Object get_size(const Py::Tuple& args);
    +    Py::Object get_size_out(const Py::Tuple& args);
    +    Py::Object get_interpolation(const Py::Tuple& args);
    +    Py::Object set_interpolation(const Py::Tuple& args);
    +    Py::Object set_aspect(const Py::Tuple& args);
    +    Py::Object set_bg(const Py::Tuple& args);
    +    inline Py::Object flipud_out(const Py::Tuple& args)
    +    {
    +        args.verify_length(0);
    +        int stride = rbufOut->stride();
    +        //std::cout << "flip before: " << rbufOut->stride() << std::endl;
    +        rbufOut->attach(bufferOut, colsOut, rowsOut, -stride);
    +        //std::cout << "flip after: " << rbufOut->stride() << std::endl;
    +        return Py::Object();
    +    }
    +
    +    Py::Object flipud_in(const Py::Tuple& args);
    +    Py::Object set_resample(const Py::Tuple& args);
    +    Py::Object get_resample(const Py::Tuple& args);
    +
    +
    +    std::pair _get_output_buffer();
    +    enum {NEAREST,
    +          BILINEAR,
    +          BICUBIC,
    +          SPLINE16,
    +          SPLINE36,
    +          HANNING,
    +          HAMMING,
    +          HERMITE,
    +          KAISER,
    +          QUADRIC,
    +          CATROM,
    +          GAUSSIAN,
    +          BESSEL,
    +          MITCHELL,
    +          SINC,
    +          LANCZOS,
    +          BLACKMAN
    +         };
    +
    +    //enum { BICUBIC=0, BILINEAR, BLACKMAN100, BLACKMAN256, BLACKMAN64,
    +    //	 NEAREST, SINC144, SINC256, SINC64, SPLINE16, SPLINE36};
    +    enum { ASPECT_PRESERVE = 0, ASPECT_FREE};
    +
    +    agg::int8u *bufferIn;
    +    agg::rendering_buffer *rbufIn;
    +    size_t colsIn, rowsIn;
    +
    +    agg::int8u *bufferOut;
    +    agg::rendering_buffer *rbufOut;
    +    size_t colsOut, rowsOut;
    +    unsigned BPP;
    +
    +    unsigned interpolation, aspect;
    +    agg::rgba bg;
    +    bool resample;
     private:
    -  Py::Dict __dict__;
    -  agg::trans_affine srcMatrix, imageMatrix;
    +    Py::Dict __dict__;
    +    agg::trans_affine srcMatrix, imageMatrix;
     
    -  static char apply_rotation__doc__[];
    -  static char apply_scaling__doc__[];
    -  static char apply_translation__doc__[];
    -  static char as_rgba_str__doc__[];
    -  static char color_conv__doc__[];
    -  static char buffer_rgba__doc__[];
    -  static char reset_matrix__doc__[];
    -  static char get_matrix__doc__[];
    -  static char resize__doc__[];
    -  static char get_aspect__doc__[];
    -  static char get_size__doc__[];
    -  static char get_size_out__doc__[];
    -  static char get_interpolation__doc__[];
    -  static char set_interpolation__doc__[];
    -  static char set_aspect__doc__[];
    -  static char set_bg__doc__[];
    -  static char flipud_out__doc__[];
    -  static char flipud_in__doc__[];
    -  static char get_resample__doc__[];
    -  static char set_resample__doc__[];
    +    static char apply_rotation__doc__[];
    +    static char apply_scaling__doc__[];
    +    static char apply_translation__doc__[];
    +    static char as_rgba_str__doc__[];
    +    static char color_conv__doc__[];
    +    static char buffer_rgba__doc__[];
    +    static char reset_matrix__doc__[];
    +    static char get_matrix__doc__[];
    +    static char resize__doc__[];
    +    static char get_aspect__doc__[];
    +    static char get_size__doc__[];
    +    static char get_size_out__doc__[];
    +    static char get_interpolation__doc__[];
    +    static char set_interpolation__doc__[];
    +    static char set_aspect__doc__[];
    +    static char set_bg__doc__[];
    +    static char flipud_out__doc__[];
    +    static char flipud_in__doc__[];
    +    static char get_resample__doc__[];
    +    static char set_resample__doc__[];
     
     };
     
    @@ -127,44 +130,44 @@
     class _image_module : public Py::ExtensionModule<_image_module>
     {
     public:
    -  _image_module() : Py::ExtensionModule<_image_module>( "_image" )
    -  {
    -    Image::init_type();
    -
    -    add_varargs_method("fromarray", &_image_module::fromarray,
    -		       "fromarray");
    -    add_varargs_method("fromarray2", &_image_module::fromarray2,
    -		       "fromarray2");
    -    add_varargs_method("frombyte", &_image_module::frombyte,
    -		       "frombyte");
    -    add_varargs_method("frombuffer", &_image_module::frombuffer,
    -		       "frombuffer");
    -    add_varargs_method("from_images", &_image_module::from_images,
    -		       "from_images");
    -    add_varargs_method("pcolor", &_image_module::pcolor,
    -               "pcolor");
    -    add_varargs_method("pcolor2", &_image_module::pcolor2,
    -               "pcolor2");
    -    initialize( "The _image module" );
    -  }
    +    _image_module() : Py::ExtensionModule<_image_module>("_image")
    +    {
    +        Image::init_type();
    +
    +        add_varargs_method("fromarray", &_image_module::fromarray,
    +                           "fromarray");
    +        add_varargs_method("fromarray2", &_image_module::fromarray2,
    +                           "fromarray2");
    +        add_varargs_method("frombyte", &_image_module::frombyte,
    +                           "frombyte");
    +        add_varargs_method("frombuffer", &_image_module::frombuffer,
    +                           "frombuffer");
    +        add_varargs_method("from_images", &_image_module::from_images,
    +                           "from_images");
    +        add_varargs_method("pcolor", &_image_module::pcolor,
    +                           "pcolor");
    +        add_varargs_method("pcolor2", &_image_module::pcolor2,
    +                           "pcolor2");
    +        initialize("The _image module");
    +    }
     
    -  ~_image_module() {}
    +    ~_image_module() {}
     
     private:
    -  Py::Object frombyte (const Py::Tuple &args);
    -  Py::Object frombuffer (const Py::Tuple &args);
    -  Py::Object fromarray (const Py::Tuple &args);
    -  Py::Object fromarray2 (const Py::Tuple &args);
    -  Py::Object pcolor (const Py::Tuple &args);
    -  Py::Object pcolor2 (const Py::Tuple &args);
    -  Py::Object from_images (const Py::Tuple &args);
    -
    -  static char _image_module_fromarray__doc__[];
    -  static char _image_module_pcolor__doc__[];
    -  static char _image_module_pcolor2__doc__[];
    -  static char _image_module_fromarray2__doc__[];
    -  static char _image_module_frombyte__doc__[];
    -  static char _image_module_frombuffer__doc__[];
    +    Py::Object frombyte(const Py::Tuple &args);
    +    Py::Object frombuffer(const Py::Tuple &args);
    +    Py::Object fromarray(const Py::Tuple &args);
    +    Py::Object fromarray2(const Py::Tuple &args);
    +    Py::Object pcolor(const Py::Tuple &args);
    +    Py::Object pcolor2(const Py::Tuple &args);
    +    Py::Object from_images(const Py::Tuple &args);
    +
    +    static char _image_module_fromarray__doc__[];
    +    static char _image_module_pcolor__doc__[];
    +    static char _image_module_pcolor2__doc__[];
    +    static char _image_module_fromarray2__doc__[];
    +    static char _image_module_frombyte__doc__[];
    +    static char _image_module_frombuffer__doc__[];
     };
     
     
    diff -Nru matplotlib-0.99.3/src/_macosx.m matplotlib-1.0.1/src/_macosx.m
    --- matplotlib-0.99.3/src/_macosx.m	2010-03-09 14:20:17.000000000 +0000
    +++ matplotlib-1.0.1/src/_macosx.m	2011-01-05 15:59:55.000000000 +0000
    @@ -288,7 +288,8 @@
                                             0,
                                             0,
                                             rect,
    -                                        QUANTIZE_FALSE,
    +                                        SNAP_FALSE,
    +                                        1.0,
                                             0);
         Py_DECREF(transform);
         if (!iterator)
    @@ -320,6 +321,7 @@
     {   PyObject* manager;
     }
     - (Window*)initWithContentRect:(NSRect)rect styleMask:(unsigned int)mask backing:(NSBackingStoreType)bufferingType defer:(BOOL)deferCreation withManager: (PyObject*)theManager;
    +- (NSRect)constrainFrameRect:(NSRect)rect toScreen:(NSScreen*)screen;
     - (BOOL)closeButtonPressed;
     - (void)close;
     - (void)dealloc;
    @@ -336,21 +338,28 @@
     @interface View : NSView
     {   PyObject* canvas;
         NSRect rubberband;
    +    BOOL inside;
    +    NSTrackingRectTag tracking;
     }
     - (void)dealloc;
     - (void)drawRect:(NSRect)rect;
     - (void)windowDidResize:(NSNotification*)notification;
    -- (View*)initWithFrame:(NSRect)rect canvas:(PyObject*)fc;
    +- (View*)initWithFrame:(NSRect)rect;
    +- (void)setCanvas: (PyObject*)newCanvas;
     - (BOOL)windowShouldClose:(NSNotification*)notification;
     - (BOOL)isFlipped;
    +- (void)mouseEntered:(NSEvent*)event;
    +- (void)mouseExited:(NSEvent*)event;
     - (void)mouseDown:(NSEvent*)event;
     - (void)mouseUp:(NSEvent*)event;
     - (void)mouseDragged:(NSEvent*)event;
     - (void)mouseMoved:(NSEvent*)event;
     - (void)rightMouseDown:(NSEvent*)event;
     - (void)rightMouseUp:(NSEvent*)event;
    +- (void)rightMouseDragged:(NSEvent*)event;
     - (void)otherMouseDown:(NSEvent*)event;
     - (void)otherMouseUp:(NSEvent*)event;
    +- (void)otherMouseDragged:(NSEvent*)event;
     - (void)setRubberband:(NSRect)rect;
     - (void)removeRubberband;
     - (const char*)convertKeyEvent:(NSEvent*)event;
    @@ -437,13 +446,13 @@
         return p;
     }
     
    -static int _get_snap(GraphicsContext* self, enum e_quantize_mode* mode)
    +static int _get_snap(GraphicsContext* self, enum e_snap_mode* mode)
     {
         PyObject* snap = PyObject_CallMethod((PyObject*)self, "get_snap", "");
         if(!snap) return 0;
    -    if(snap==Py_None) *mode = QUANTIZE_AUTO;
    -    else if (PyBool_Check(snap)) *mode = QUANTIZE_TRUE;
    -    else *mode = QUANTIZE_FALSE;
    +    if(snap==Py_None) *mode = SNAP_AUTO;
    +    else if (PyBool_Check(snap)) *mode = SNAP_TRUE;
    +    else *mode = SNAP_FALSE;
         Py_DECREF(snap);
         return 1;
     }
    @@ -653,7 +662,8 @@
                                             0,
                                             0,
                                             rect,
    -                                        QUANTIZE_AUTO,
    +                                        SNAP_AUTO,
    +                                        1.0,
                                             0);
         Py_DECREF(transform);
         if (!iterator)
    @@ -854,6 +864,7 @@
         PyObject* path;
         PyObject* transform;
         PyObject* rgbFace;
    +    float linewidth;
     
         int n;
     
    @@ -868,9 +879,10 @@
             return NULL;
         }
     
    -    if(!PyArg_ParseTuple(args, "OO|O",
    +    if(!PyArg_ParseTuple(args, "OOf|O",
                                    &path,
                                    &transform,
    +                               &linewidth,
                                    &rgbFace)) return NULL;
     
         if(rgbFace==Py_None) rgbFace = NULL;
    @@ -880,7 +892,8 @@
                                       1,
                                       0,
                                       rect,
    -                                  QUANTIZE_AUTO,
    +                                  SNAP_AUTO,
    +                                  linewidth,
                                       rgbFace == NULL);
         if (!iterator)
         {
    @@ -957,7 +970,8 @@
                                               1,
                                               0,
                                               rect,
    -                                          QUANTIZE_AUTO,
    +                                          SNAP_AUTO,
    +                                          linewidth,
                                               0);
                 if (!iterator)
                 {
    @@ -983,6 +997,7 @@
         PyObject* marker_transform;
         PyObject* path;
         PyObject* transform;
    +    float linewidth;
         PyObject* rgbFace;
     
         int ok;
    @@ -991,7 +1006,7 @@
         CGMutablePathRef marker;
         void* iterator;
         double rect[4] = {0.0, 0.0, self->size.width, self->size.height};
    -    enum e_quantize_mode mode;
    +    enum e_snap_mode mode;
         double xc, yc;
         unsigned code;
     
    @@ -1003,11 +1018,12 @@
             return NULL;
         }
     
    -    if(!PyArg_ParseTuple(args, "OOOO|O",
    +    if(!PyArg_ParseTuple(args, "OOOOf|O",
                                    &marker_path,
                                    &marker_transform,
                                    &path,
                                    &transform,
    +                               &linewidth,
                                    &rgbFace)) return NULL;
     
         if(rgbFace==Py_None) rgbFace = NULL;
    @@ -1034,6 +1050,7 @@
                                      0,
                                      rect,
                                      mode,
    +                                 linewidth,
                                      0);
         if (!iterator)
         {
    @@ -1054,7 +1071,8 @@
                                      1,
                                      1,
                                      rect,
    -                                 QUANTIZE_TRUE,
    +                                 SNAP_TRUE,
    +                                 1.0,
                                      0);
         if (!iterator)
         {
    @@ -1162,7 +1180,6 @@
     static PyObject*
     GraphicsContext_draw_path_collection (GraphicsContext* self, PyObject* args)
     {
    -    PyObject* master_transform;
         PyObject* cliprect;
         PyObject* clippath;
         PyObject* clippath_transform;
    @@ -1184,19 +1201,18 @@
             return NULL;
         }
     
    -    if(!PyArg_ParseTuple(args, "OOOOOOOOOOOOO", &master_transform,
    -                                                &cliprect,
    -                                                &clippath,
    -                                                &clippath_transform,
    -                                                &paths,
    -                                                &transforms,
    -                                                &offsets,
    -                                                &offset_transform,
    -                                                &facecolors,
    -                                                &edgecolors,
    -                                                &linewidths,
    -                                                &linestyles,
    -                                                &antialiaseds))
    +    if(!PyArg_ParseTuple(args, "OOOOOOOOOOOO", &cliprect,
    +                                               &clippath,
    +                                               &clippath_transform,
    +                                               &paths,
    +                                               &transforms,
    +                                               &offsets,
    +                                               &offset_transform,
    +                                               &facecolors,
    +                                               &edgecolors,
    +                                               &linewidths,
    +                                               &linestyles,
    +                                               &antialiaseds))
             return NULL;
     
         int ok = 1;
    @@ -1209,7 +1225,7 @@
         /* --------- Prepare some variables for the path iterator ------------- */
         void* iterator;
         double rect[4] = {0.0, 0.0, self->size.width, self->size.height};
    -    enum e_quantize_mode mode;
    +    enum e_snap_mode mode;
         ok = _get_snap(self, &mode);
         if (!ok)
         {
    @@ -1232,43 +1248,22 @@
             PyErr_SetString(PyExc_ValueError, "transforms must be a sequence object");
             return NULL;
         }
    -    Py_ssize_t Ntransforms = PySequence_Size(transforms);
    -
    -    CGContextSaveGState(cr);
    -    /* ------------------- Set master transform --------------------------- */
    -
    -    if (Ntransforms)
    +    const Py_ssize_t Ntransforms = PySequence_Size(transforms);
    +    if (Ntransforms==0)
         {
    -        CGAffineTransform master;
    -        double a, b, c, d, tx, ty;
    -        PyObject* values = PyObject_CallMethod(master_transform, "to_values", "");
    -        if (!values)
    -        {
    -            ok = 0;
    -            goto exit;
    -        }
    -        if (!PyTuple_Check(values))
    -        {
    -            Py_DECREF(values);
    -            ok = 0;
    -            goto exit;
    -        }
    -        /* CGAffineTransform contains CGFloat; cannot use master directly */
    -        ok = PyArg_ParseTuple(values, "dddddd", &a, &b, &c, &d, &tx, &ty);
    -        Py_DECREF(values);
    -        master.a = a;
    -        master.b = b;
    -        master.c = c;
    -        master.d = d;
    -        master.tx = tx;
    -        master.ty = ty;
    -        if (!ok) goto exit;
    -        CGContextConcatCTM(cr, master);
    +        PyErr_SetString(PyExc_ValueError, "transforms should contain at least one item");
    +        return NULL;
         }
     
    -    /* ------------------- Check offsets array ---------------------------- */
    +    /* ------------------- Read drawing arrays ---------------------------- */
     
    +    CGContextSaveGState(cr);
         offsets = PyArray_FromObject(offsets, NPY_DOUBLE, 0, 2);
    +    facecolors = PyArray_FromObject(facecolors, NPY_DOUBLE, 1, 2);
    +    edgecolors = PyArray_FromObject(edgecolors, NPY_DOUBLE, 1, 2);
    +
    +    /* ------------------- Check offsets array ---------------------------- */
    +
         if (!offsets ||
             (PyArray_NDIM(offsets)==2 && PyArray_DIM(offsets, 1)!=2) ||
             (PyArray_NDIM(offsets)==1 && PyArray_DIM(offsets, 0)!=0))
    @@ -1279,11 +1274,36 @@
         }
         const Py_ssize_t Noffsets = PyArray_DIM(offsets, 0);
     
    +    /* ------------------- Check facecolors array ------------------------- */
    +
    +    if (!facecolors ||
    +        (PyArray_NDIM(facecolors)==1 && PyArray_DIM(facecolors, 0)!=0) ||
    +        (PyArray_NDIM(facecolors)==2 && PyArray_DIM(facecolors, 1)!=4))
    +    {
    +        PyErr_SetString(PyExc_ValueError, "Facecolors must by a Nx4 numpy array or empty");
    +        ok = 0;
    +        goto exit;
    +    }
    +
    +    /* ------------------- Check edgecolors array ------------------------- */
    +
    +    if (!edgecolors ||
    +        (PyArray_NDIM(edgecolors)==1 && PyArray_DIM(edgecolors, 0)!=0) ||
    +        (PyArray_NDIM(edgecolors)==2 && PyArray_DIM(edgecolors, 1)!=4))
    +    {
    +        PyErr_SetString(PyExc_ValueError, "Edgecolors must by a Nx4 numpy array or empty");
    +        ok = 0;
    +        goto exit;
    +    }
    +
    +    /* -------------------------------------------------------------------- */
    +
    +    if (Npaths==0) goto exit; /* Nothing to do */
    +
         /* -------------------------------------------------------------------- */
     
         Np = Npaths > Ntransforms ? Npaths : Ntransforms;
         N = Np > Noffsets ? Np : Noffsets;
    -    if (N < Ntransforms) Ntransforms = N;
     
         p = malloc(Np*sizeof(CGMutablePathRef));
         if (!p)
    @@ -1302,35 +1322,33 @@
                 ok = 0;
                 goto exit;
             }
    -        if (Ntransforms)
    +        transform = PySequence_ITEM(transforms, i % Ntransforms);
    +        if (!transform)
             {
    -            transform = PySequence_ITEM(transforms, i % Ntransforms);
    -            if (!transform)
    -            {
    -                PyErr_SetString(PyExc_RuntimeError,
    -                                "failed to obtain transform");
    -                ok = 0;
    -                goto exit;
    -            }
    -            iterator = get_path_iterator(path,
    -                                         transform,
    -                                         1,
    -                                         0,
    -                                         rect,
    -                                         mode,
    -                                         0);
    -            Py_DECREF(transform);
    -        }
    -        else
    -        {
    -            iterator = get_path_iterator(path,
    -                                         master_transform,
    -                                         1,
    -                                         0,
    -                                         rect,
    -                                         mode,
    -                                         0);
    +            PyErr_SetString(PyExc_RuntimeError, "failed to obtain transform");
    +            Py_DECREF(path);
    +            ok = 0;
    +            goto exit;
             }
    +        iterator = get_path_iterator(path,
    +                                     transform,
    +                                     1,
    +                                     0,
    +                                     rect,
    +                                     mode,
    +                                     1.0,
    +                                     /* Hardcoding stroke width to 1.0
    +                                        here, but for true
    +                                        correctness, the paths would
    +                                        need to be set up for each
    +                                        different linewidth that may
    +                                        be applied below.  This
    +                                        difference is very minute in
    +                                        practice, so this hardcoding
    +                                        is probably ok for now.  --
    +                                        MGD */
    +                                     0);
    +        Py_DECREF(transform);
             Py_DECREF(path);
             if (!iterator)
             {
    @@ -1364,7 +1382,8 @@
                                           0,
                                           0,
                                           rect,
    -                                      QUANTIZE_AUTO,
    +                                      SNAP_AUTO,
    +                                      1.0,
                                           0);
             if (!iterator)
             {
    @@ -1378,30 +1397,6 @@
             if (n > 0) CGContextClip(cr);
         }
     
    -    /* ------------------- Check facecolors array ------------------------- */
    -
    -    facecolors = PyArray_FromObject(facecolors, NPY_DOUBLE, 1, 2);
    -    if (!facecolors ||
    -        (PyArray_NDIM(facecolors)==1 && PyArray_DIM(facecolors, 0)!=0) ||
    -        (PyArray_NDIM(facecolors)==2 && PyArray_DIM(facecolors, 1)!=4))
    -    {
    -        PyErr_SetString(PyExc_ValueError, "Facecolors must by a Nx4 numpy array or empty");
    -        ok = 0;
    -        goto exit;
    -    }
    -
    -    /* ------------------- Check edgecolors array ------------------------- */
    -
    -    edgecolors = PyArray_FromObject(edgecolors, NPY_DOUBLE, 1, 2);
    -    if (!edgecolors ||
    -        (PyArray_NDIM(edgecolors)==1 && PyArray_DIM(edgecolors, 0)!=0) ||
    -        (PyArray_NDIM(edgecolors)==2 && PyArray_DIM(edgecolors, 1)!=4))
    -    {
    -        PyErr_SetString(PyExc_ValueError, "Edgecolors must by a Nx4 numpy array or empty");
    -        ok = 0;
    -        goto exit;
    -    }
    -
         /* ------------------- Check the other arguments ---------------------- */
     
         if (!PySequence_Check(linewidths))
    @@ -1607,7 +1602,6 @@
             free(p);
         }
         if (!ok) return NULL;
    -
         Py_INCREF(Py_None);
         return Py_None;
     }
    @@ -1696,7 +1690,8 @@
                                                 0,
                                                 0,
                                                 rect,
    -                                            QUANTIZE_AUTO,
    +                                            SNAP_AUTO,
    +                                            1.0,
                                                 0);
             if (iterator)
             {
    @@ -2387,7 +2382,6 @@
             PyErr_SetString(PyExc_RuntimeError, "ATSUDrawText failed");
             return NULL;
         }
    -
         Py_INCREF(Py_None);
         return Py_None;
     }
    @@ -2682,7 +2676,8 @@
                                                 0,
                                                 0,
                                                 rect,
    -                                            QUANTIZE_AUTO,
    +                                            SNAP_AUTO,
    +                                            1.0,
                                                 0);
             if (iterator)
             {
    @@ -2894,10 +2889,22 @@
         if(!PyArg_ParseTuple(args, "ii", &width, &height)) return -1;
     
         NSRect rect = NSMakeRect(0.0, 0.0, width, height);
    -    self->view = [self->view initWithFrame: rect canvas: (PyObject*)self];
    +    self->view = [self->view initWithFrame: rect];
    +    [self->view setCanvas: (PyObject*)self];
         return 0;
     }
     
    +static void
    +FigureCanvas_dealloc(FigureCanvas* self)
    +{
    +    if (self->view)
    +    {
    +        [self->view setCanvas: NULL];
    +        [self->view release];
    +    }
    +    self->ob_type->tp_free((PyObject*)self);
    +}
    +
     static PyObject*
     FigureCanvas_repr(FigureCanvas* self)
     {
    @@ -3241,7 +3248,7 @@
         "_macosx.FigureCanvas",    /*tp_name*/
         sizeof(FigureCanvas),      /*tp_basicsize*/
         0,                         /*tp_itemsize*/
    -    0,                         /*tp_dealloc*/
    +    (destructor)FigureCanvas_dealloc,     /*tp_dealloc*/
         0,                         /*tp_print*/
         0,                         /*tp_getattr*/
         0,                         /*tp_setattr*/
    @@ -4392,16 +4399,6 @@
         return Py_None;
     }
     
    -static char show__doc__[] = "Show all the figures and enter the main loop.\nThis function does not return until all Matplotlib windows are closed,\nand is normally not needed in interactive sessions.";
    -
    -static PyObject*
    -show(PyObject* self)
    -{
    -    if(nwin > 0) [NSApp run];
    -    Py_INCREF(Py_None);
    -    return Py_None;
    -}
    -
     @implementation Window
     - (Window*)initWithContentRect:(NSRect)rect styleMask:(unsigned int)mask backing:(NSBackingStoreType)bufferingType defer:(BOOL)deferCreation withManager: (PyObject*)theManager
     {
    @@ -4414,6 +4411,16 @@
         return self;
     }
     
    +- (NSRect)constrainFrameRect:(NSRect)rect toScreen:(NSScreen*)screen
    +{
    +    /* Allow window sizes larger than the screen */
    +    NSRect suggested = [super constrainFrameRect: rect toScreen: screen];
    +    const CGFloat difference = rect.size.height - suggested.size.height;
    +    suggested.origin.y -= difference;
    +    suggested.size.height += difference;
    +    return suggested;
    +}
    +
     - (BOOL)closeButtonPressed
     {
         PyObject* result;
    @@ -4481,27 +4488,28 @@
         return NO;
     }
     
    -- (View*)initWithFrame:(NSRect)rect canvas: (PyObject*)fc
    +- (View*)initWithFrame:(NSRect)rect
     {
         self = [super initWithFrame: rect];
         rubberband = NSZeroRect;
    -    if (canvas)
    -    {
    -        Py_DECREF(canvas);
    -    }
    -    canvas = fc;
    -    Py_INCREF(canvas);
    +    inside = false;
    +    tracking = 0;
         return self;
     }
     
     - (void)dealloc
     {
         FigureCanvas* fc = (FigureCanvas*)canvas;
    -    fc->view = NULL;
    -    Py_DECREF(canvas);
    +    if (fc) fc->view = NULL;
    +    [self removeTrackingRect: tracking];
         [super dealloc];
     }
     
    +- (void)setCanvas: (PyObject*)newCanvas
    +{
    +    canvas = newCanvas;
    +}
    +
     -(void)drawRect:(NSRect)rect
     {
         PyObject* result;
    @@ -4575,6 +4583,11 @@
         else
             PyErr_Print();
         PyGILState_Release(gstate);
    +    if (tracking) [self removeTrackingRect: tracking];
    +    tracking = [self addTrackingRect: [self bounds]
    +                               owner: self
    +                            userData: nil
    +                        assumeInside: NO];
         [self setNeedsDisplay: YES];
     }
     
    @@ -4599,6 +4612,45 @@
         return YES;
     }
     
    +- (void)mouseEntered:(NSEvent *)event
    +{
    +    PyGILState_STATE gstate;
    +    PyObject* result;
    +    NSWindow* window = [self window];
    +    if ([window isKeyWindow]==false) return;
    +
    +    gstate = PyGILState_Ensure();
    +    result = PyObject_CallMethod(canvas, "enter_notify_event", "");
    +    if(result)
    +        Py_DECREF(result);
    +    else
    +        PyErr_Print();
    +    PyGILState_Release(gstate);
    +
    +    [window setAcceptsMouseMovedEvents: YES];
    +    inside = true;
    +}
    +
    +- (void)mouseExited:(NSEvent *)event
    +{
    +    PyGILState_STATE gstate;
    +    PyObject* result;
    +    NSWindow* window = [self window];
    +    if ([window isKeyWindow]==false) return;
    +
    +    if (inside==false) return;
    +    gstate = PyGILState_Ensure();
    +    result = PyObject_CallMethod(canvas, "leave_notify_event", "");
    +    if(result)
    +        Py_DECREF(result);
    +    else
    +        PyErr_Print();
    +    PyGILState_Release(gstate);
    +
    +    [[self window] setAcceptsMouseMovedEvents: NO];
    +    inside = false;
    +}
    +
     - (void)mouseDown:(NSEvent *)event
     {
         int x, y;
    @@ -4744,6 +4796,23 @@
         PyGILState_Release(gstate);
     }
     
    +- (void)rightMouseDragged:(NSEvent *)event
    +{
    +    int x, y;
    +    NSPoint location = [event locationInWindow];
    +    location = [self convertPoint: location fromView: nil];
    +    x = location.x;
    +    y = location.y;
    +    PyGILState_STATE gstate = PyGILState_Ensure();
    +    PyObject* result = PyObject_CallMethod(canvas, "motion_notify_event", "ii", x, y);
    +    if(result)
    +        Py_DECREF(result);
    +    else
    +        PyErr_Print();
    +
    +    PyGILState_Release(gstate);
    +}
    +
     - (void)otherMouseDown:(NSEvent *)event
     {
         int x, y;
    @@ -4784,6 +4853,23 @@
         PyGILState_Release(gstate);
     }
     
    +- (void)otherMouseDragged:(NSEvent *)event
    +{
    +    int x, y;
    +    NSPoint location = [event locationInWindow];
    +    location = [self convertPoint: location fromView: nil];
    +    x = location.x;
    +    y = location.y;
    +    PyGILState_STATE gstate = PyGILState_Ensure();
    +    PyObject* result = PyObject_CallMethod(canvas, "motion_notify_event", "ii", x, y);
    +    if(result)
    +        Py_DECREF(result);
    +    else
    +        PyErr_Print();
    +
    +    PyGILState_Release(gstate);
    +}
    +
     - (void)setRubberband:(NSRect)rect
     {
         if (!NSIsEmptyRect(rubberband)) [self setNeedsDisplayInRect: rubberband];
    @@ -5043,11 +5129,32 @@
     }
     @end
     
    +
    +static PyObject*
    +show(PyObject* self)
    +{
    +    if(nwin > 0) [NSApp run];
    +    Py_INCREF(Py_None);
    +    return Py_None;
    +}
    +
    +static PyObject*
    +verify_main_display(PyObject* self)
    +{
    +    CGDirectDisplayID display = CGMainDisplayID();
    +    if (display == 0) {
    +        PyErr_SetString(PyExc_RuntimeError, "Failed to obtain the display ID of the main display");
    +        return NULL;
    +    }
    +    Py_INCREF(Py_True);
    +    return Py_True;
    +}
    +
     static struct PyMethodDef methods[] = {
        {"show",
         (PyCFunction)show,
         METH_NOARGS,
    -    show__doc__
    +    "Show all the figures and enter the main loop.\nThis function does not return until all Matplotlib windows are closed,\nand is normally not needed in interactive sessions."
        },
        {"choose_save_file",
         (PyCFunction)choose_save_file,
    @@ -5059,11 +5166,17 @@
         METH_VARARGS,
         "Sets the active cursor."
        },
    +   {"verify_main_display",
    +    (PyCFunction)verify_main_display,
    +    METH_NOARGS,
    +    "Verifies if the main display can be found. This function fails if Python is not built as a framework."
    +   },
        {NULL,          NULL, 0, NULL}/* sentinel */
     };
     
     void init_macosx(void)
     {   PyObject *m;
    +
         import_array();
     
         if (PyType_Ready(&GraphicsContextType) < 0) return;
    diff -Nru matplotlib-0.99.3/src/mplutils.cpp matplotlib-1.0.1/src/mplutils.cpp
    --- matplotlib-0.99.3/src/mplutils.cpp	2009-07-31 15:14:23.000000000 +0000
    +++ matplotlib-1.0.1/src/mplutils.cpp	2010-07-07 01:41:45.000000000 +0000
    @@ -3,29 +3,30 @@
     #include 
     #include "mplutils.h"
     
    -void _VERBOSE(const std::string& s) {
    +void _VERBOSE(const std::string& s)
    +{
     #ifdef VERBOSE
    -  std::cout << s << std::endl;
    +    std::cout << s << std::endl;
     #endif
     }
     
     
     Printf::Printf(const char *fmt, ...)
    -  : buffer(new char[1024]) // some reasonably large number
    +    : buffer(new char[1024]) // some reasonably large number
     {
    -  va_list ap;
    -  va_start(ap, fmt);
    -  vsprintf(buffer, fmt, ap);
    -  va_end(ap);  // look ma - I rememberd it this time
    +    va_list ap;
    +    va_start(ap, fmt);
    +    vsprintf(buffer, fmt, ap);
    +    va_end(ap);  // look ma - I rememberd it this time
     }
     
     Printf::~Printf()
     {
    -  delete [] buffer;
    +    delete [] buffer;
     }
     
     
     std::ostream &operator<<(std::ostream &o, const Printf &p)
     {
    -  return o << p.buffer;
    +    return o << p.buffer;
     }
    diff -Nru matplotlib-0.99.3/src/mplutils.h matplotlib-1.0.1/src/mplutils.h
    --- matplotlib-0.99.3/src/mplutils.h	2009-07-31 15:14:23.000000000 +0000
    +++ matplotlib-1.0.1/src/mplutils.h	2010-09-23 19:54:48.000000000 +0000
    @@ -1,4 +1,4 @@
    -/* mplutils.h	--
    +/* mplutils.h   --
      *
      * $Header$
      * $Log$
    @@ -20,25 +20,52 @@
     void _VERBOSE(const std::string&);
     
     
    -#undef	CLAMP
    +#undef  CLAMP
     #define CLAMP(x, low, high)  (((x) > (high)) ? (high) : (((x) < (low)) ? (low) : (x)))
     
     #undef  MAX
     #define MAX(a, b) (((a) > (b)) ? (a) : (b))
     
    -inline double mpl_round(double v) {
    -  return (double)(int)(v + ((v >= 0.0) ? 0.5 : -0.5));
    +inline double mpl_round(double v)
    +{
    +    return (double)(int)(v + ((v >= 0.0) ? 0.5 : -0.5));
     }
     
     class Printf
     {
     private :
    -  char *buffer;
    +    char *buffer;
     public :
    -  Printf(const char *, ...);
    -  ~Printf();
    -  std::string str() {return buffer;}
    -  friend std::ostream &operator <<(std::ostream &, const Printf &);
    +    Printf(const char *, ...);
    +    ~Printf();
    +    std::string str()
    +    {
    +        return buffer;
    +    }
    +    friend std::ostream &operator <<(std::ostream &, const Printf &);
     };
     
    +#if defined(_MSC_VER) && (_MSC_VER == 1400)
    +
    +/* Required by libpng and zlib */
    +#pragma comment(lib, "bufferoverflowU")
    +
    +/* std::max and std::min are missing in Windows Server 2003 R2
    +   Platform SDK compiler.  See matplotlib bug #3067191 */
    +namespace std {
    +
    +    template  inline T max(const T& a, const T& b)
    +    {
    +        return (a > b) ? a : b;
    +    }
    +
    +    template  inline T min(const T& a, const T& b)
    +    {
    +        return (a < b) ? a : b;
    +    }
    +
    +}
    +
    +#endif
    +
     #endif
    diff -Nru matplotlib-0.99.3/src/path_cleanup.cpp matplotlib-1.0.1/src/path_cleanup.cpp
    --- matplotlib-0.99.3/src/path_cleanup.cpp	2009-07-31 15:14:23.000000000 +0000
    +++ matplotlib-1.0.1/src/path_cleanup.cpp	2010-07-07 01:41:45.000000000 +0000
    @@ -12,8 +12,8 @@
         typedef agg::conv_transform  transformed_path_t;
         typedef PathNanRemover nan_removal_t;
         typedef PathClipper         clipped_t;
    -    typedef PathQuantizer           quantized_t;
    -    typedef PathSimplifier        simplify_t;
    +    typedef PathSnapper             snapped_t;
    +    typedef PathSimplifier          simplify_t;
     
         Py::Object         m_path_obj;
         PathIterator       m_path_iter;
    @@ -21,22 +21,24 @@
         transformed_path_t m_transformed;
         nan_removal_t      m_nan_removed;
         clipped_t          m_clipped;
    -    quantized_t        m_quantized;
    +    snapped_t          m_snapped;
         simplify_t         m_simplify;
     
     public:
         PathCleanupIterator(PyObject* path, agg::trans_affine trans,
                             bool remove_nans, bool do_clip,
                             const agg::rect_base& rect,
    -                        e_quantize_mode quantize_mode, bool do_simplify) :
    +                        e_snap_mode snap_mode, double stroke_width,
    +                        bool do_simplify) :
             m_path_obj(path, true),
             m_path_iter(m_path_obj),
             m_transform(trans),
             m_transformed(m_path_iter, m_transform),
             m_nan_removed(m_transformed, remove_nans, m_path_iter.has_curves()),
             m_clipped(m_nan_removed, do_clip, rect),
    -        m_quantized(m_clipped, quantize_mode, m_path_iter.total_vertices()),
    -        m_simplify(m_quantized, do_simplify && m_path_iter.should_simplify(),
    +        m_snapped(m_clipped, snap_mode, m_path_iter.total_vertices(),
    +                  stroke_width),
    +        m_simplify(m_snapped, do_simplify && m_path_iter.should_simplify(),
                        m_path_iter.simplify_threshold())
         {
             Py_INCREF(path);
    @@ -49,18 +51,20 @@
         }
     };
     
    -extern "C" {
    +extern "C"
    +{
         void*
         get_path_iterator(
             PyObject* path, PyObject* trans, int remove_nans, int do_clip,
    -        double rect[4], e_quantize_mode quantize_mode, int do_simplify)
    +        double rect[4], e_snap_mode snap_mode, double stroke_width,
    +        int do_simplify)
         {
             agg::trans_affine agg_trans = py_to_agg_transformation_matrix(trans, false);
             agg::rect_base clip_rect(rect[0], rect[1], rect[2], rect[3]);
     
             PathCleanupIterator* pipeline = new PathCleanupIterator(
                 path, agg_trans, remove_nans != 0, do_clip != 0,
    -            clip_rect, quantize_mode, do_simplify != 0);
    +            clip_rect, snap_mode, stroke_width, do_simplify != 0);
     
             return (void*)pipeline;
         }
    diff -Nru matplotlib-0.99.3/src/path_cleanup.h matplotlib-1.0.1/src/path_cleanup.h
    --- matplotlib-0.99.3/src/path_cleanup.h	2009-07-31 15:14:23.000000000 +0000
    +++ matplotlib-1.0.1/src/path_cleanup.h	2010-07-07 01:41:45.000000000 +0000
    @@ -3,17 +3,18 @@
     
     #include 
     
    -enum e_quantize_mode
    +enum e_snap_mode
     {
    -    QUANTIZE_AUTO,
    -    QUANTIZE_FALSE,
    -    QUANTIZE_TRUE
    +    SNAP_AUTO,
    +    SNAP_FALSE,
    +    SNAP_TRUE
     };
     
     void*
     get_path_iterator(
         PyObject* path, PyObject* trans, int remove_nans, int do_clip,
    -    double rect[4], enum e_quantize_mode quantize_mode, int do_simplify);
    +    double rect[4], enum e_snap_mode snap_mode, double stroke_width,
    +    int do_simplify);
     
     unsigned
     get_vertex(void* pipeline, double* x, double* y);
    diff -Nru matplotlib-0.99.3/src/path_converters.h matplotlib-1.0.1/src/path_converters.h
    --- matplotlib-0.99.3/src/path_converters.h	2010-03-09 14:20:17.000000000 +0000
    +++ matplotlib-1.0.1/src/path_converters.h	2010-09-23 19:54:48.000000000 +0000
    @@ -26,7 +26,7 @@
           Agg where coordinates can not be larger than 24-bit signed
           integers.
     
    -   4. PathQuantizer: Rounds the path to the nearest center-pixels.
    +   4. PathSnapper: Rounds the path to the nearest center-pixels.
           This makes rectilinear curves look much better.
     
        5. PathSimplifier: Removes line segments from highly dense paths
    @@ -46,7 +46,7 @@
     template
     class EmbeddedQueue
     {
    - protected:
    +protected:
         EmbeddedQueue() :
             m_queue_read(0), m_queue_write(0)
         {
    @@ -55,8 +55,13 @@
     
         struct item
         {
    -        item() {}
    -        inline void set(const unsigned cmd_, const double& x_, const double& y_)
    +        item()
    +        {
    +
    +        }
    +
    +        inline void
    +        set(const unsigned cmd_, const double& x_, const double& y_)
             {
                 cmd = cmd_;
                 x = x_;
    @@ -70,17 +75,20 @@
         int  m_queue_write;
         item m_queue[QueueSize];
     
    -    inline void queue_push(const unsigned cmd, const double& x, const double& y)
    +    inline void
    +    queue_push(const unsigned cmd, const double& x, const double& y)
         {
             m_queue[m_queue_write++].set(cmd, x, y);
         }
     
    -    inline bool queue_nonempty()
    +    inline bool
    +    queue_nonempty()
         {
             return m_queue_read < m_queue_write;
         }
     
    -    inline bool queue_flush(unsigned *cmd, double *x, double *y)
    +    inline bool
    +    queue_pop(unsigned *cmd, double *x, double *y)
         {
             if (queue_nonempty())
             {
    @@ -98,7 +106,8 @@
             return false;
         }
     
    -    inline void queue_clear()
    +    inline void
    +    queue_clear()
         {
             m_queue_read = 0;
             m_queue_write = 0;
    @@ -112,13 +121,14 @@
       value, the entire curve segment will be skipped.
      */
     template
    -class PathNanRemover : protected EmbeddedQueue<4> {
    +class PathNanRemover : protected EmbeddedQueue<4>
    +{
         VertexSource* m_source;
         bool m_remove_nans;
         bool m_has_curves;
         static const unsigned char num_extra_points_map[16];
     
    - public:
    +public:
         /* has_curves should be true if the path contains bezier curve
            segments, as this requires a slower algorithm to remove the
            NaNs.  When in doubt, set to true.
    @@ -129,35 +139,41 @@
             // empty
         }
     
    -    inline void rewind(unsigned path_id)
    +    inline void
    +    rewind(unsigned path_id)
         {
             queue_clear();
             m_source->rewind(path_id);
         }
     
    -    inline unsigned vertex(double* x, double *y) {
    +    inline unsigned
    +    vertex(double* x, double *y)
    +    {
             unsigned code;
     
    -        if (!m_remove_nans) {
    +        if (!m_remove_nans)
    +        {
                 return m_source->vertex(x, y);
             }
     
    -        if (m_has_curves) {
    +        if (m_has_curves)
    +        {
                 /* This is the slow method for when there might be curves. */
    -            if (queue_flush(&code, x, y))
    +            if (queue_pop(&code, x, y))
                 {
                     return code;
                 }
     
                 bool needs_move_to = false;
    -            while (true) {
    +            while (true)
    +            {
                     /* The approach here is to push each full curve
                        segment into the queue.  If any non-finite values
                        are found along the way, the queue is emptied, and
                        the next curve segment is handled. */
                     code = m_source->vertex(x, y);
                     if (code == agg::path_cmd_stop ||
    -                    code == (agg::path_cmd_end_poly | agg::path_flags_close))
    +                        code == (agg::path_cmd_end_poly | agg::path_flags_close))
                     {
                         return code;
                     }
    @@ -200,7 +216,7 @@
                     }
                 }
     
    -            if (queue_flush(&code, x, y))
    +            if (queue_pop(&code, x, y))
                 {
                     return code;
                 }
    @@ -230,12 +246,13 @@
                         {
                             return code;
                         }
    -                } while (MPL_notisfinite64(*x) || MPL_notisfinite64(*y));
    +                }
    +                while (MPL_notisfinite64(*x) || MPL_notisfinite64(*y));
                     return agg::path_cmd_move_to;
                 }
    -        }
     
    -        return code;
    +            return code;
    +        }
         }
     };
     
    @@ -245,7 +262,8 @@
         {0, 0, 0, 1,
          2, 0, 0, 0,
          0, 0, 0, 0,
    -     0, 0, 0, 0};
    +     0, 0, 0, 0
    +    };
     
     /************************************************************
      PathClipper uses the Liang-Barsky line clipping algorithm (as
    @@ -266,11 +284,11 @@
         double                 m_nextY;
         bool                   m_has_next;
     
    - public:
    +public:
         PathClipper(VertexSource& source, bool do_clipping,
                     double width, double height) :
             m_source(&source), m_do_clipping(do_clipping),
    -        m_cliprect(0.0, 0.0, width, height), m_moveto(true),
    +        m_cliprect(-1.0, -1.0, width + 1.0, height + 1.0), m_moveto(true),
             m_has_next(false)
         {
             // empty
    @@ -281,31 +299,39 @@
             m_source(&source), m_do_clipping(do_clipping),
             m_cliprect(rect), m_moveto(true), m_has_next(false)
         {
    -        // empty
    +        m_cliprect.x1 -= 1.0;
    +        m_cliprect.y1 -= 1.0;
    +        m_cliprect.x2 += 1.0;
    +        m_cliprect.y2 += 1.0;
         }
     
    -    inline void rewind(unsigned path_id)
    +    inline void
    +    rewind(unsigned path_id)
         {
             m_has_next = false;
             m_moveto = true;
             m_source->rewind(path_id);
         }
     
    -    unsigned vertex(double* x, double* y)
    +    unsigned
    +    vertex(double* x, double* y)
         {
             unsigned code;
     
    -        if (m_do_clipping) {
    +        if (m_do_clipping)
    +        {
                 /* This is the slow path where we actually do clipping */
     
    -            if (m_has_next) {
    +            if (m_has_next)
    +            {
                     m_has_next = false;
                     *x = m_nextX;
                     *y = m_nextY;
                     return agg::path_cmd_line_to;
                 }
     
    -            while ((code = m_source->vertex(x, y)) != agg::path_cmd_stop) {
    +            while ((code = m_source->vertex(x, y)) != agg::path_cmd_stop)
    +            {
                     if (m_moveto)
                     {
                         m_moveto = false;
    @@ -361,35 +387,38 @@
     };
     
     /************************************************************
    - PathQuantizer rounds vertices to their nearest center-pixels.  This
    + PathSnapper rounds vertices to their nearest center-pixels.  This
      makes rectilinear paths (rectangles, horizontal and vertical lines
      etc.) look much cleaner.
     */
    -enum e_quantize_mode
    +enum e_snap_mode
     {
    -    QUANTIZE_AUTO,
    -    QUANTIZE_FALSE,
    -    QUANTIZE_TRUE
    +    SNAP_AUTO,
    +    SNAP_FALSE,
    +    SNAP_TRUE
     };
     
     template
    -class PathQuantizer
    +class PathSnapper
     {
    - private:
    +private:
         VertexSource* m_source;
    -    bool          m_quantize;
    +    bool          m_snap;
    +    double        m_snap_value;
     
    -    static bool should_quantize(VertexSource& path,
    -                                e_quantize_mode quantize_mode,
    -                                unsigned total_vertices) {
    +    static bool
    +    should_snap(VertexSource& path,
    +                e_snap_mode snap_mode,
    +                unsigned total_vertices)
    +    {
             // If this contains only straight horizontal or vertical lines, it should be
    -        // quantized to the nearest pixels
    +        // snapped to the nearest pixels
             double x0, y0, x1, y1;
             unsigned code;
     
    -        switch (quantize_mode)
    +        switch (snap_mode)
             {
    -        case QUANTIZE_AUTO:
    +        case SNAP_AUTO:
                 if (total_vertices > 1024)
                 {
                     return false;
    @@ -419,50 +448,60 @@
                 }
     
                 return true;
    -        case QUANTIZE_FALSE:
    +        case SNAP_FALSE:
                 return false;
    -        case QUANTIZE_TRUE:
    +        case SNAP_TRUE:
                 return true;
             }
     
             return false;
         }
     
    - public:
    +public:
         /*
    -      quantize_mode should be one of:
    -        - QUANTIZE_AUTO: Examine the path to determine if it should be quantized
    -        - QUANTIZE_TRUE: Force quantization
    -        - QUANTIZE_FALSE: No quantization
    +      snap_mode should be one of:
    +        - SNAP_AUTO: Examine the path to determine if it should be snapped
    +        - SNAP_TRUE: Force snapping
    +        - SNAP_FALSE: No snapping
         */
    -    PathQuantizer(VertexSource& source, e_quantize_mode quantize_mode,
    -                  unsigned total_vertices=15) :
    +    PathSnapper(VertexSource& source, e_snap_mode snap_mode,
    +                unsigned total_vertices = 15, double stroke_width = 0.0) :
             m_source(&source)
         {
    -        m_quantize = should_quantize(source, quantize_mode, total_vertices);
    +        m_snap = should_snap(source, snap_mode, total_vertices);
    +
    +        if (m_snap)
    +        {
    +            int is_odd = (int)mpl_round(stroke_width) % 2;
    +            m_snap_value = (is_odd) ? 0.5 : 0.0;
    +        }
    +
             source.rewind(0);
         }
     
    -    inline void rewind(unsigned path_id)
    +    inline void
    +    rewind(unsigned path_id)
         {
             m_source->rewind(path_id);
         }
     
    -    inline unsigned vertex(double* x, double* y)
    +    inline unsigned
    +    vertex(double* x, double* y)
         {
             unsigned code;
             code = m_source->vertex(x, y);
    -        if (m_quantize && agg::is_vertex(code))
    +        if (m_snap && agg::is_vertex(code))
             {
    -            *x = mpl_round(*x) + 0.5;
    -            *y = mpl_round(*y) + 0.5;
    +            *x = mpl_round(*x) + m_snap_value;
    +            *y = mpl_round(*y) + m_snap_value;
             }
             return code;
         }
     
    -    inline bool is_quantizing()
    +    inline bool
    +    is_snapping()
         {
    -        return m_quantize;
    +        return m_snap;
         }
     };
     
    @@ -477,25 +516,27 @@
         /* Set simplify to true to perform simplification */
         PathSimplifier(VertexSource& source, bool do_simplify, double simplify_threshold) :
             m_source(&source), m_simplify(do_simplify),
    -        m_simplify_threshold(simplify_threshold),
    +        m_simplify_threshold(simplify_threshold*simplify_threshold),
             m_moveto(true), m_after_moveto(false),
             m_lastx(0.0), m_lasty(0.0), m_clipped(false),
             m_origdx(0.0), m_origdy(0.0),
    -        m_origdNorm2(0.0), m_dnorm2Max(0.0), m_dnorm2Min(0.0),
    +        m_origdNorm2(0.0), m_dnorm2Max(0.0),
             m_lastMax(false), m_nextX(0.0), m_nextY(0.0),
             m_lastWrittenX(0.0), m_lastWrittenY(0.0)
         {
             // empty
         }
     
    -    inline void rewind(unsigned path_id)
    +    inline void
    +    rewind(unsigned path_id)
         {
             queue_clear();
             m_moveto = true;
             m_source->rewind(path_id);
         }
     
    -    unsigned vertex(double* x, double* y)
    +    unsigned
    +    vertex(double* x, double* y)
         {
             unsigned cmd;
     
    @@ -526,7 +567,8 @@
                the queue before proceeding to the main loop below.
                -- Michael Droettboom */
     
    -        if (queue_flush(&cmd, x, y)) {
    +        if (queue_pop(&cmd, x, y))
    +        {
                 return cmd;
             }
     
    @@ -551,7 +593,7 @@
                         /* m_origdNorm2 is nonzero only if we have a
                            vector; the m_after_moveto check ensures we
                            push this vector to the queue only once. */
    -                    _push(x,y);
    +                    _push(x, y);
                     }
                     m_after_moveto = true;
                     m_lastx = *x;
    @@ -591,11 +633,10 @@
     
                     m_origdx = *x - m_lastx;
                     m_origdy = *y - m_lasty;
    -                m_origdNorm2 = m_origdx*m_origdx + m_origdy*m_origdy;
    +                m_origdNorm2 = m_origdx * m_origdx + m_origdy * m_origdy;
     
                     //set all the variables to reflect this new orig vector
                     m_dnorm2Max = m_origdNorm2;
    -                m_dnorm2Min = 0.0;
                     m_lastMax = true;
     
                     m_nextX = m_lastWrittenX = m_lastx = *x;
    @@ -617,16 +658,16 @@
                 /* get the v vector */
                 double totdx = *x - m_lastWrittenX;
                 double totdy = *y - m_lastWrittenY;
    -            double totdot = m_origdx*totdx + m_origdy*totdy;
    +            double totdot = m_origdx * totdx + m_origdy * totdy;
     
                 /* get the para vector ( = (o.v)o/(o.o)) */
    -            double paradx = totdot*m_origdx/m_origdNorm2;
    -            double parady = totdot*m_origdy/m_origdNorm2;
    +            double paradx = totdot * m_origdx / m_origdNorm2;
    +            double parady = totdot * m_origdy / m_origdNorm2;
     
                 /* get the perp vector ( = v - para) */
                 double perpdx = totdx - paradx;
                 double perpdy = totdy - parady;
    -            double perpdNorm2 = perpdx*perpdx + perpdy*perpdy;
    +            double perpdNorm2 = perpdx * perpdx + perpdy * perpdy;
     
                 /* If the perp vector is less than some number of (squared)
                    pixels in size, then merge the current vector */
    @@ -635,13 +676,11 @@
                     /* check if the current vector is parallel or
                        anti-parallel to the orig vector. If it is
                        parallel, test if it is the longest of the vectors
    -                   we are merging in that direction. If anti-p, test
    -                   if it is the longest in the opposite direction (the
    -                   min of our final line) */
    -                double paradNorm2 = paradx*paradx + parady*parady;
    +                   we are merging in that direction. */
    +                double paradNorm2 = paradx * paradx + parady * parady;
     
                     m_lastMax = false;
    -                if (totdot >= 0.0)
    +                if (totdot > 0.0)
                     {
                         if (paradNorm2 > m_dnorm2Max)
                         {
    @@ -653,12 +692,9 @@
                     }
                     else
                     {
    -                    if (paradNorm2 < m_dnorm2Min)
    -                    {
    -                        m_dnorm2Min = paradNorm2;
    -                        m_nextX = *x;
    -                        m_nextY = *y;
    -                    }
    +                    _push(&m_lastx, &m_lasty);
    +                    _push(x, y);
    +                    break;
                     }
     
                     m_lastx = *x;
    @@ -684,10 +720,10 @@
             {
                 if (m_origdNorm2 != 0.0)
                 {
    -              queue_push((m_moveto || m_after_moveto) ?
    -                         agg::path_cmd_move_to : agg::path_cmd_line_to,
    -                         m_nextX, m_nextY);
    -              m_moveto = false;
    +                queue_push((m_moveto || m_after_moveto) ?
    +                           agg::path_cmd_move_to : agg::path_cmd_line_to,
    +                           m_nextX, m_nextY);
    +                m_moveto = false;
                 }
                 queue_push((m_moveto || m_after_moveto) ?
                            agg::path_cmd_move_to : agg::path_cmd_line_to,
    @@ -698,7 +734,8 @@
     
             /* Return the first item in the queue, if any, otherwise
                indicate that we're done. */
    -        if (queue_flush(&cmd, x, y)) {
    +        if (queue_pop(&cmd, x, y))
    +        {
                 return cmd;
             }
             else
    @@ -721,14 +758,14 @@
         double m_origdy;
         double m_origdNorm2;
         double m_dnorm2Max;
    -    double m_dnorm2Min;
         bool   m_lastMax;
         double m_nextX;
         double m_nextY;
         double m_lastWrittenX;
         double m_lastWrittenY;
     
    -    inline void _push(double* x, double* y)
    +    inline void
    +    _push(double* x, double* y)
         {
             queue_push(agg::path_cmd_line_to, m_nextX, m_nextY);
     
    @@ -752,10 +789,9 @@
             /* Now reset all the variables to get ready for the next line */
             m_origdx = *x - m_lastx;
             m_origdy = *y - m_lasty;
    -        m_origdNorm2 = m_origdx*m_origdx + m_origdy*m_origdy;
    +        m_origdNorm2 = m_origdx * m_origdx + m_origdy * m_origdy;
     
             m_dnorm2Max = m_origdNorm2;
    -        m_dnorm2Min = 0.0;
             m_lastMax = true;
             m_lastWrittenX = m_queue[m_queue_write-1].x;
             m_lastWrittenY = m_queue[m_queue_write-1].y;
    @@ -764,7 +800,6 @@
     
             m_clipped = false;
         }
    -
     };
     
     #endif // __PATH_CONVERTERS_H__
    diff -Nru matplotlib-0.99.3/src/_path.cpp matplotlib-1.0.1/src/_path.cpp
    --- matplotlib-0.99.3/src/_path.cpp	2010-03-09 14:20:17.000000000 +0000
    +++ matplotlib-1.0.1/src/_path.cpp	2010-08-25 16:53:10.000000000 +0000
    @@ -13,8 +13,6 @@
     #include "agg_path_storage.h"
     #include "agg_trans_affine.h"
     
    -// MGDTODO: Un-CXX-ify this module
    -
     struct XY
     {
         double x;
    @@ -28,7 +26,7 @@
     {
     public:
         _path_module()
    -            : Py::ExtensionModule<_path_module>( "_path" )
    +            : Py::ExtensionModule<_path_module>("_path")
         {
             add_varargs_method("point_in_path", &_path_module::point_in_path,
                                "point_in_path(x, y, path, trans)");
    @@ -55,7 +53,7 @@
             add_varargs_method("convert_path_to_polygons", &_path_module::convert_path_to_polygons,
                                "convert_path_to_polygons(path, trans, width, height)");
             add_varargs_method("cleanup_path", &_path_module::cleanup_path,
    -                           "cleanup_path(path, trans, remove_nans, clip, quantize, simplify, curves)");
    +                           "cleanup_path(path, trans, remove_nans, clip, snap, simplify, curves)");
             initialize("Helper functions for paths");
         }
     
    @@ -115,7 +113,8 @@
     // Input 2D polygon _pgon_ with _numverts_ number of vertices and test point
     // _point_, returns 1 if inside, 0 if outside.
     template
    -bool point_in_path_impl(const double tx, const double ty, T& path)
    +bool
    +point_in_path_impl(const double tx, const double ty, T& path)
     {
         int yflag0, yflag1, inside_flag;
         double vtx0, vty0, vtx1, vty1, sx, sy;
    @@ -129,7 +128,9 @@
         do
         {
             if (code != agg::path_cmd_move_to)
    +        {
                 code = path.vertex(&x, &y);
    +        }
     
             sx = vtx0 = x;
             sy = vty0 = y;
    @@ -147,41 +148,47 @@
     
                 // The following cases denote the beginning on a new subpath
                 if (code == agg::path_cmd_stop ||
    -                (code & agg::path_cmd_end_poly) == agg::path_cmd_end_poly)
    +                    (code & agg::path_cmd_end_poly) == agg::path_cmd_end_poly)
                 {
                     x = sx;
                     y = sy;
                 }
                 else if (code == agg::path_cmd_move_to)
    +            {
                     break;
    +            }
     
                 yflag1 = (vty1 >= ty);
    -            // Check if endpoints straddle (are on opposite sides) of X axis
    -            // (i.e. the Y's differ); if so, +X ray could intersect this edge.
    -            // The old test also checked whether the endpoints are both to the
    -            // right or to the left of the test point.  However, given the faster
    -            // intersection point computation used below, this test was found to
    -            // be a break-even proposition for most polygons and a loser for
    -            // triangles (where 50% or more of the edges which survive this test
    -            // will cross quadrants and so have to have the X intersection computed
    -            // anyway).  I credit Joseph Samosky with inspiring me to try dropping
    -            // the "both left or both right" part of my code.
    +            // Check if endpoints straddle (are on opposite sides) of
    +            // X axis (i.e. the Y's differ); if so, +X ray could
    +            // intersect this edge.  The old test also checked whether
    +            // the endpoints are both to the right or to the left of
    +            // the test point.  However, given the faster intersection
    +            // point computation used below, this test was found to be
    +            // a break-even proposition for most polygons and a loser
    +            // for triangles (where 50% or more of the edges which
    +            // survive this test will cross quadrants and so have to
    +            // have the X intersection computed anyway).  I credit
    +            // Joseph Samosky with inspiring me to try dropping the
    +            // "both left or both right" part of my code.
                 if (yflag0 != yflag1)
                 {
                     // Check intersection of pgon segment with +X ray.
    -                // Note if >= point's X; if so, the ray hits it.
    -                // The division operation is avoided for the ">=" test by checking
    -                // the sign of the first vertex wrto the test point; idea inspired
    -                // by Joseph Samosky's and Mark Haigh-Hutchinson's different
    -                // polygon inclusion tests.
    -                if ( ((vty1-ty) * (vtx0-vtx1) >=
    -                      (vtx1-tx) * (vty0-vty1)) == yflag1 )
    +                // Note if >= point's X; if so, the ray hits it.  The
    +                // division operation is avoided for the ">=" test by
    +                // checking the sign of the first vertex wrto the test
    +                // point; idea inspired by Joseph Samosky's and Mark
    +                // Haigh-Hutchinson's different polygon inclusion
    +                // tests.
    +                if (((vty1 - ty) * (vtx0 - vtx1) >=
    +                        (vtx1 - tx) * (vty0 - vty1)) == yflag1)
                     {
                         inside_flag ^= 1;
                     }
                 }
     
    -            // Move to the next pair of vertices, retaining info as possible.
    +            // Move to the next pair of vertices, retaining info as
    +            // possible.
                 yflag0 = yflag1;
                 vtx0 = vtx1;
                 vty0 = vty1;
    @@ -195,48 +202,61 @@
             yflag1 = (vty1 >= ty);
             if (yflag0 != yflag1)
             {
    -            if ( ((vty1-ty) * (vtx0-vtx1) >=
    -                  (vtx1-tx) * (vty0-vty1)) == yflag1 )
    +            if (((vty1 - ty) * (vtx0 - vtx1) >=
    +                    (vtx1 - tx) * (vty0 - vty1)) == yflag1)
                 {
                     inside_flag ^= 1;
                 }
             }
     
             if (inside_flag != 0)
    +        {
                 return true;
    +        }
         }
         while (code != agg::path_cmd_stop);
     
         return (inside_flag != 0);
     }
     
    -inline bool point_in_path(double x, double y, PathIterator& path, const agg::trans_affine& trans)
    +inline bool
    +point_in_path(double x, double y, PathIterator& path,
    +              const agg::trans_affine& trans)
     {
         typedef agg::conv_transform transformed_path_t;
    -    typedef agg::conv_curve curve_t;
    +    typedef PathNanRemover no_nans_t;
    +    typedef agg::conv_curve curve_t;
     
         if (path.total_vertices() < 3)
    +    {
             return false;
    +    }
     
         transformed_path_t trans_path(path, trans);
    -    curve_t curved_path(trans_path);
    +    no_nans_t no_nans_path(trans_path, true, path.has_curves());
    +    curve_t curved_path(no_nans_path);
         return point_in_path_impl(x, y, curved_path);
     }
     
    -inline bool point_on_path(double x, double y, double r, PathIterator& path, const agg::trans_affine& trans)
    +inline bool
    +point_on_path(double x, double y, double r, PathIterator& path,
    +              const agg::trans_affine& trans)
     {
         typedef agg::conv_transform transformed_path_t;
    -    typedef agg::conv_curve curve_t;
    +    typedef PathNanRemover no_nans_t;
    +    typedef agg::conv_curve curve_t;
         typedef agg::conv_stroke stroke_t;
     
         transformed_path_t trans_path(path, trans);
    -    curve_t curved_path(trans_path);
    +    no_nans_t nan_removed_path(trans_path, true, path.has_curves());
    +    curve_t curved_path(nan_removed_path);
         stroke_t stroked_path(curved_path);
         stroked_path.width(r * 2.0);
         return point_in_path_impl(x, y, stroked_path);
     }
     
    -Py::Object _path_module::point_in_path(const Py::Tuple& args)
    +Py::Object
    +_path_module::point_in_path(const Py::Tuple& args)
     {
         args.verify_length(4);
     
    @@ -246,11 +266,14 @@
         agg::trans_affine trans = py_to_agg_transformation_matrix(args[3].ptr(), false);
     
         if (::point_in_path(x, y, path, trans))
    +    {
             return Py::Int(1);
    +    }
         return Py::Int(0);
     }
     
    -Py::Object _path_module::point_on_path(const Py::Tuple& args)
    +Py::Object
    +_path_module::point_on_path(const Py::Tuple& args)
     {
         args.verify_length(5);
     
    @@ -261,13 +284,16 @@
         agg::trans_affine trans = py_to_agg_transformation_matrix(args[4].ptr());
     
         if (::point_on_path(x, y, r, path, trans))
    +    {
             return Py::Int(1);
    +    }
         return Py::Int(0);
     }
     
    -void get_path_extents(PathIterator& path, const agg::trans_affine& trans,
    -                      double* x0, double* y0, double* x1, double* y1,
    -                      double* xm, double* ym)
    +void
    +get_path_extents(PathIterator& path, const agg::trans_affine& trans,
    +                 double* x0, double* y0, double* x1, double* y1,
    +                 double* xm, double* ym)
     {
         typedef agg::conv_transform transformed_path_t;
         typedef PathNanRemover nan_removed_t;
    @@ -284,7 +310,9 @@
         while ((code = curved_path.vertex(&x, &y)) != agg::path_cmd_stop)
         {
             if ((code & agg::path_cmd_end_poly) == agg::path_cmd_end_poly)
    +        {
                 continue;
    +        }
             if (x < *x0) *x0 = x;
             if (y < *y0) *y0 = y;
             if (x > *x1) *x1 = x;
    @@ -296,7 +324,8 @@
         }
     }
     
    -Py::Object _path_module::get_path_extents(const Py::Tuple& args)
    +Py::Object
    +_path_module::get_path_extents(const Py::Tuple& args)
     {
         args.verify_length(2);
     
    @@ -312,7 +341,9 @@
             extents = (PyArrayObject*)PyArray_SimpleNew
                       (2, extent_dims, PyArray_DOUBLE);
             if (extents == NULL)
    +        {
                 throw Py::MemoryError("Could not allocate result array");
    +        }
             extents_data = (double*)PyArray_DATA(extents);
     
             extents_data[0] = std::numeric_limits::infinity();
    @@ -324,9 +355,8 @@
             xm = std::numeric_limits::infinity();
             ym = std::numeric_limits::infinity();
     
    -        ::get_path_extents(path, trans,
    -                           &extents_data[0], &extents_data[1], &extents_data[2], &extents_data[3],
    -                           &xm, &ym);
    +        ::get_path_extents(path, trans, &extents_data[0], &extents_data[1],
    +                           &extents_data[2], &extents_data[3], &xm, &ym);
         }
         catch (...)
         {
    @@ -337,16 +367,20 @@
         return Py::Object((PyObject*)extents, true);
     }
     
    -Py::Object _path_module::update_path_extents(const Py::Tuple& args)
    +Py::Object
    +_path_module::update_path_extents(const Py::Tuple& args)
     {
         args.verify_length(5);
     
         double x0, y0, x1, y1;
         PathIterator path(args[0]);
    -    agg::trans_affine trans = py_to_agg_transformation_matrix(args[1].ptr(), false);
    +    agg::trans_affine trans = py_to_agg_transformation_matrix(
    +        args[1].ptr(), false);
    +
         if (!py_convert_bbox(args[2].ptr(), x0, y0, x1, y1))
         {
    -        throw Py::ValueError("Must pass Bbox object as arg 3 of update_path_extents");
    +        throw Py::ValueError(
    +            "Must pass Bbox object as arg 3 of update_path_extents");
         }
         Py::Object minpos_obj = args[3];
         bool ignore = bool(Py::Int(args[4]));
    @@ -355,10 +389,12 @@
         PyArrayObject* input_minpos = NULL;
         try
         {
    -        input_minpos = (PyArrayObject*)PyArray_FromObject(minpos_obj.ptr(), PyArray_DOUBLE, 1, 1);
    +        input_minpos = (PyArrayObject*)PyArray_FromObject(
    +            minpos_obj.ptr(), PyArray_DOUBLE, 1, 1);
             if (!input_minpos || PyArray_DIM(input_minpos, 0) != 2)
             {
    -            throw Py::TypeError("Argument 4 to update_path_extents must be a length-2 numpy array.");
    +            throw Py::TypeError(
    +                "Argument 4 to update_path_extents must be a length-2 numpy array.");
             }
             xm = *(double*)PyArray_GETPTR1(input_minpos, 0);
             ym = *(double*)PyArray_GETPTR1(input_minpos, 1);
    @@ -381,13 +417,17 @@
         try
         {
             extents = (PyArrayObject*)PyArray_SimpleNew
    -            (2, extent_dims, PyArray_DOUBLE);
    +                  (2, extent_dims, PyArray_DOUBLE);
             if (extents == NULL)
    +        {
                 throw Py::MemoryError("Could not allocate result array");
    +        }
             minpos = (PyArrayObject*)PyArray_SimpleNew
    -            (1, minpos_dims, PyArray_DOUBLE);
    +                 (1, minpos_dims, PyArray_DOUBLE);
             if (minpos == NULL)
    +        {
                 throw Py::MemoryError("Could not allocate result array");
    +        }
     
             extents_data = (double*)PyArray_DATA(extents);
             minpos_data = (double*)PyArray_DATA(minpos);
    @@ -413,7 +453,8 @@
                     extents_data[0] = x0;
                     extents_data[2] = x1;
                 }
    -            if (y0 > y1) {
    +            if (y0 > y1)
    +            {
                     extents_data[1] = std::numeric_limits::infinity();
                     extents_data[3] = -std::numeric_limits::infinity();
                 }
    @@ -426,9 +467,9 @@
                 minpos_data[1] = ym;
             }
     
    -        ::get_path_extents(path, trans,
    -                           &extents_data[0], &extents_data[1], &extents_data[2], &extents_data[3],
    -                           &minpos_data[0], &minpos_data[1]);
    +        ::get_path_extents(path, trans, &extents_data[0], &extents_data[1],
    +                           &extents_data[2], &extents_data[3], &minpos_data[0],
    +                           &minpos_data[1]);
     
             changed = (extents_data[0] != x0 ||
                        extents_data[1] != y0 ||
    @@ -456,7 +497,8 @@
         return result;
     }
     
    -Py::Object _path_module::get_path_collection_extents(const Py::Tuple& args)
    +Py::Object
    +_path_module::get_path_collection_extents(const Py::Tuple& args)
     {
         args.verify_length(5);
     
    @@ -472,7 +514,8 @@
     
         try
         {
    -        offsets = (PyArrayObject*)PyArray_FromObject(offsets_obj.ptr(), PyArray_DOUBLE, 0, 2);
    +        offsets = (PyArrayObject*)PyArray_FromObject(
    +            offsets_obj.ptr(), PyArray_DOUBLE, 0, 2);
             if (!offsets ||
                 (PyArray_NDIM(offsets) == 2 && PyArray_DIM(offsets, 1) != 2) ||
                 (PyArray_NDIM(offsets) == 1 && PyArray_DIM(offsets, 0) != 0))
    @@ -521,8 +564,8 @@
     
                 if (Noffsets)
                 {
    -                double xo                = *(double*)PyArray_GETPTR2(offsets, i % Noffsets, 0);
    -                double yo                = *(double*)PyArray_GETPTR2(offsets, i % Noffsets, 1);
    +                double xo = *(double*)PyArray_GETPTR2(offsets, i % Noffsets, 0);
    +                double yo = *(double*)PyArray_GETPTR2(offsets, i % Noffsets, 1);
                     offset_trans.transform(&xo, &yo);
                     trans *= agg::trans_affine_translation(xo, yo);
                 }
    @@ -546,7 +589,8 @@
         return result;
     }
     
    -Py::Object _path_module::point_in_path_collection(const Py::Tuple& args)
    +Py::Object
    +_path_module::point_in_path_collection(const Py::Tuple& args)
     {
         args.verify_length(9);
     
    @@ -561,10 +605,11 @@
         agg::trans_affine       offset_trans     = py_to_agg_transformation_matrix(args[7].ptr());
         bool                    filled           = Py::Int(args[8]);
     
    -    PyArrayObject* offsets = (PyArrayObject*)PyArray_FromObject(offsets_obj.ptr(), PyArray_DOUBLE, 0, 2);
    +    PyArrayObject* offsets = (PyArrayObject*)PyArray_FromObject(
    +        offsets_obj.ptr(), PyArray_DOUBLE, 0, 2);
         if (!offsets ||
    -        (PyArray_NDIM(offsets) == 2 && PyArray_DIM(offsets, 1) != 2) ||
    -        (PyArray_NDIM(offsets) == 1 && PyArray_DIM(offsets, 0) != 0))
    +            (PyArray_NDIM(offsets) == 2 && PyArray_DIM(offsets, 1) != 2) ||
    +            (PyArray_NDIM(offsets) == 1 && PyArray_DIM(offsets, 0) != 0))
         {
             Py_XDECREF(offsets);
             throw Py::ValueError("Offsets array must be Nx2");
    @@ -583,7 +628,7 @@
         for (i = 0; i < Ntransforms; ++i)
         {
             agg::trans_affine trans = py_to_agg_transformation_matrix
    -            (transforms_obj[i].ptr(), false);
    +                                  (transforms_obj[i].ptr(), false);
             trans *= master_transform;
             transforms.push_back(trans);
         }
    @@ -627,17 +672,20 @@
         return result;
     }
     
    -bool path_in_path(PathIterator& a, const agg::trans_affine& atrans,
    -                  PathIterator& b, const agg::trans_affine& btrans)
    +bool
    +path_in_path(PathIterator& a, const agg::trans_affine& atrans,
    +             PathIterator& b, const agg::trans_affine& btrans)
     {
         typedef agg::conv_transform transformed_path_t;
    -    typedef agg::conv_curve curve_t;
    +    typedef PathNanRemover no_nans_t;
    +    typedef agg::conv_curve curve_t;
     
         if (a.total_vertices() < 3)
             return false;
     
         transformed_path_t b_path_trans(b, btrans);
    -    curve_t b_curved(b_path_trans);
    +    no_nans_t b_no_nans(b_path_trans, true, b.has_curves());
    +    curve_t b_curved(b_no_nans);
     
         double x, y;
         b_curved.rewind(0);
    @@ -650,20 +698,23 @@
         return true;
     }
     
    -Py::Object _path_module::path_in_path(const Py::Tuple& args)
    +Py::Object
    +_path_module::path_in_path(const Py::Tuple& args)
     {
         args.verify_length(4);
     
         PathIterator a(args[0]);
    -    agg::trans_affine atrans = py_to_agg_transformation_matrix(args[1].ptr(), false);
    +    agg::trans_affine atrans = py_to_agg_transformation_matrix(
    +        args[1].ptr(), false);
         PathIterator b(args[2]);
    -    agg::trans_affine btrans = py_to_agg_transformation_matrix(args[3].ptr(), false);
    +    agg::trans_affine btrans = py_to_agg_transformation_matrix(
    +        args[3].ptr(), false);
     
         return Py::Int(::path_in_path(a, atrans, b, btrans));
     }
     
    -/** The clip_path_to_rect code here is a clean-room implementation of the
    -    Sutherland-Hodgman clipping algorithm described here:
    +/** The clip_path_to_rect code here is a clean-room implementation of
    +    the Sutherland-Hodgman clipping algorithm described here:
     
       http://en.wikipedia.org/wiki/Sutherland-Hodgman_clipping_algorithm
     */
    @@ -672,91 +723,101 @@
     
     namespace clip_to_rect_filters
     {
    -/* There are four different passes needed to create/remove vertices
    -   (one for each side of the rectangle).  The differences between those
    -   passes are encapsulated in these functor classes.
    -*/
    -struct bisectx
    -{
    -    double m_x;
    +    /* There are four different passes needed to create/remove
    +       vertices (one for each side of the rectangle).  The differences
    +       between those passes are encapsulated in these functor classes.
    +    */
    +    struct bisectx
    +    {
    +        double m_x;
    +
    +        bisectx(double x) : m_x(x) {}
     
    -    bisectx(double x) : m_x(x) {}
    +        inline void
    +        bisect(double sx, double sy, double px, double py, double* bx,
    +               double* by) const
    +        {
    +            *bx = m_x;
    +            double dx = px - sx;
    +            double dy = py - sy;
    +            *by = sy + dy * ((m_x - sx) / dx);
    +        }
    +    };
     
    -    inline void bisect(double sx, double sy, double px, double py,
    -                       double* bx, double* by) const
    +    struct xlt : public bisectx
         {
    -        *bx = m_x;
    -        double dx = px - sx;
    -        double dy = py - sy;
    -        *by = sy + dy * ((m_x - sx) / dx);
    -    }
    -};
    +        xlt(double x) : bisectx(x) {}
     
    -struct xlt : public bisectx
    -{
    -    xlt(double x) : bisectx(x) {}
    +        inline bool
    +        is_inside(double x, double y) const
    +        {
    +            return x <= m_x;
    +        }
    +    };
     
    -    inline bool is_inside(double x, double y) const
    +    struct xgt : public bisectx
         {
    -        return x <= m_x;
    -    }
    -};
    +        xgt(double x) : bisectx(x) {}
     
    -struct xgt : public bisectx
    -{
    -    xgt(double x) : bisectx(x) {}
    +        inline bool
    +        is_inside(double x, double y) const
    +        {
    +            return x >= m_x;
    +        }
    +    };
     
    -    inline bool is_inside(double x, double y) const
    +    struct bisecty
         {
    -        return x >= m_x;
    -    }
    -};
    +        double m_y;
     
    -struct bisecty
    -{
    -    double m_y;
    +        bisecty(double y) : m_y(y) {}
     
    -    bisecty(double y) : m_y(y) {}
    +        inline void
    +        bisect(double sx, double sy, double px, double py, double* bx,
    +               double* by) const
    +        {
    +            *by = m_y;
    +            double dx = px - sx;
    +            double dy = py - sy;
    +            *bx = sx + dx * ((m_y - sy) / dy);
    +        }
    +    };
     
    -    inline void bisect(double sx, double sy, double px, double py, double* bx, double* by) const
    +    struct ylt : public bisecty
         {
    -        *by = m_y;
    -        double dx = px - sx;
    -        double dy = py - sy;
    -        *bx = sx + dx * ((m_y - sy) / dy);
    -    }
    -};
    +        ylt(double y) : bisecty(y) {}
     
    -struct ylt : public bisecty
    -{
    -    ylt(double y) : bisecty(y) {}
    +        inline bool
    +        is_inside(double x, double y) const
    +        {
    +            return y <= m_y;
    +        }
    +    };
     
    -    inline bool is_inside(double x, double y) const
    +    struct ygt : public bisecty
         {
    -        return y <= m_y;
    -    }
    -};
    +        ygt(double y) : bisecty(y) {}
     
    -struct ygt : public bisecty
    -{
    -    ygt(double y) : bisecty(y) {}
    -
    -    inline bool is_inside(double x, double y) const
    -    {
    -        return y >= m_y;
    -    }
    -};
    +        inline bool
    +        is_inside(double x, double y) const
    +        {
    +            return y >= m_y;
    +        }
    +    };
     }
     
     template
    -inline void clip_to_rect_one_step(const Polygon& polygon, Polygon& result, const Filter& filter)
    +inline void
    +clip_to_rect_one_step(const Polygon& polygon, Polygon& result, const Filter& filter)
     {
         double sx, sy, px, py, bx, by;
         bool sinside, pinside;
         result.clear();
     
         if (polygon.size() == 0)
    +    {
             return;
    +    }
     
         sx = polygon.back().x;
         sy = polygon.back().y;
    @@ -784,9 +845,10 @@
         }
     }
     
    -void clip_to_rect(PathIterator& path,
    -                  double x0, double y0, double x1, double y1,
    -                  bool inside, std::vector& results)
    +void
    +clip_to_rect(PathIterator& path,
    +             double x0, double y0, double x1, double y1,
    +             bool inside, std::vector& results)
     {
         double xmin, ymin, xmax, ymax;
         if (x0 < x1)
    @@ -818,7 +880,7 @@
         }
     
         Polygon polygon1, polygon2;
    -    double x, y;
    +    double x = 0, y = 0;
         unsigned code = 0;
         path.rewind(0);
     
    @@ -829,15 +891,21 @@
             do
             {
                 if (code == agg::path_cmd_move_to)
    +            {
                     polygon1.push_back(XY(x, y));
    +            }
     
                 code = path.vertex(&x, &y);
     
                 if (code == agg::path_cmd_stop)
    +            {
                     break;
    +            }
     
                 if (code != agg::path_cmd_move_to)
    +            {
                     polygon1.push_back(XY(x, y));
    +            }
             }
             while ((code & agg::path_cmd_end_poly) != agg::path_cmd_end_poly);
     
    @@ -850,12 +918,15 @@
     
             // Empty polygons aren't very useful, so skip them
             if (polygon1.size())
    +        {
                 results.push_back(polygon1);
    +        }
         }
         while (code != agg::path_cmd_stop);
     }
     
    -Py::Object _path_module::clip_path_to_rect(const Py::Tuple &args)
    +Py::Object
    +_path_module::clip_path_to_rect(const Py::Tuple &args)
     {
         args.verify_length(3);
     
    @@ -865,7 +936,9 @@
     
         double x0, y0, x1, y1;
         if (!py_convert_bbox(bbox_obj.ptr(), x0, y0, x1, y1))
    +    {
             throw Py::TypeError("Argument 2 to clip_to_rect must be a Bbox object.");
    +    }
     
         std::vector results;
     
    @@ -875,7 +948,10 @@
         dims[1] = 2;
         PyObject* py_results = PyList_New(results.size());
         if (!py_results)
    +    {
             throw Py::RuntimeError("Error creating results list");
    +    }
    +
         try
         {
             for (std::vector::const_iterator p = results.begin(); p != results.end(); ++p)
    @@ -883,7 +959,8 @@
                 size_t size = p->size();
                 dims[0] = p->size();
                 PyArrayObject* pyarray = (PyArrayObject*)PyArray_SimpleNew(2, dims, PyArray_DOUBLE);
    -            if (pyarray == NULL) {
    +            if (pyarray == NULL)
    +            {
                     throw Py::MemoryError("Could not allocate result array");
                 }
                 for (size_t i = 0; i < size; ++i)
    @@ -906,7 +983,8 @@
         return Py::Object(py_results, true);
     }
     
    -Py::Object _path_module::affine_transform(const Py::Tuple& args)
    +Py::Object
    +_path_module::affine_transform(const Py::Tuple& args)
     {
         args.verify_length(2);
     
    @@ -922,16 +1000,22 @@
             vertices = (PyArrayObject*)PyArray_FromObject
                        (vertices_obj.ptr(), PyArray_DOUBLE, 1, 2);
             if (!vertices ||
    -            (PyArray_NDIM(vertices) == 2 && PyArray_DIM(vertices, 1) != 2) ||
    -            (PyArray_NDIM(vertices) == 1 && PyArray_DIM(vertices, 0) != 2))
    +            (PyArray_NDIM(vertices) == 2 && PyArray_DIM(vertices, 0) != 0 &&
    +             PyArray_DIM(vertices, 1) != 2) ||
    +            (PyArray_NDIM(vertices) == 1 &&
    +             PyArray_DIM(vertices, 0) != 2 && PyArray_DIM(vertices, 0) != 0))
    +        {
                 throw Py::ValueError("Invalid vertices array.");
    +        }
     
             transform = (PyArrayObject*) PyArray_FromObject
                         (transform_obj.ptr(), PyArray_DOUBLE, 2, 2);
             if (!transform ||
                 PyArray_DIM(transform, 0) != 3 ||
                 PyArray_DIM(transform, 1) != 3)
    +        {
                 throw Py::ValueError("Invalid transform.");
    +        }
     
             double a, b, c, d, e, f;
             {
    @@ -954,8 +1038,9 @@
             }
     
             result = (PyArrayObject*)PyArray_SimpleNew
    -          (PyArray_NDIM(vertices), PyArray_DIMS(vertices), PyArray_DOUBLE);
    -        if (result == NULL) {
    +                 (PyArray_NDIM(vertices), PyArray_DIMS(vertices), PyArray_DOUBLE);
    +        if (result == NULL)
    +        {
                 throw Py::MemoryError("Could not allocate memory for path");
             }
             if (PyArray_NDIM(vertices) == 2)
    @@ -973,13 +1058,13 @@
                     x = *(double*)(vertex_in);
                     y = *(double*)(vertex_in + stride1);
     
    -                *vertex_out++ = a*x + c*y + e;
    -                *vertex_out++ = b*x + d*y + f;
    +                *vertex_out++ = a * x + c * y + e;
    +                *vertex_out++ = b * x + d * y + f;
     
                     vertex_in += stride0;
                 }
             }
    -        else
    +        else if (PyArray_DIM(vertices, 0) != 0)
             {
                 char* vertex_in = PyArray_BYTES(vertices);
                 double* vertex_out = (double*)PyArray_DATA(result);
    @@ -988,8 +1073,8 @@
                 double y;
                 x = *(double*)(vertex_in);
                 y = *(double*)(vertex_in + stride0);
    -            *vertex_out++ = a*x + c*y + e;
    -            *vertex_out++ = b*x + d*y + f;
    +            *vertex_out++ = a * x + c * y + e;
    +            *vertex_out++ = b * x + d * y + f;
             }
         }
         catch (...)
    @@ -1006,7 +1091,8 @@
         return Py::Object((PyObject*)result, true);
     }
     
    -Py::Object _path_module::count_bboxes_overlapping_bbox(const Py::Tuple& args)
    +Py::Object
    +_path_module::count_bboxes_overlapping_bbox(const Py::Tuple& args)
     {
         args.verify_length(2);
     
    @@ -1020,9 +1106,13 @@
         if (py_convert_bbox(bbox.ptr(), ax0, ay0, ax1, ay1))
         {
             if (ax1 < ax0)
    +        {
                 std::swap(ax0, ax1);
    +        }
             if (ay1 < ay0)
    +        {
                 std::swap(ay0, ay1);
    +        }
     
             size_t num_bboxes = bboxes.size();
             for (size_t i = 0; i < num_bboxes; ++i)
    @@ -1031,14 +1121,20 @@
                 if (py_convert_bbox(bbox_b.ptr(), bx0, by0, bx1, by1))
                 {
                     if (bx1 < bx0)
    +                {
                         std::swap(bx0, bx1);
    +                }
                     if (by1 < by0)
    +                {
                         std::swap(by0, by1);
    +                }
                     if (!((bx1 <= ax0) ||
                           (by1 <= ay0) ||
                           (bx0 >= ax1) ||
                           (by0 >= ay1)))
    +                {
                         ++count;
    +                }
                 }
                 else
                 {
    @@ -1054,34 +1150,44 @@
         return Py::Int(count);
     }
     
    -inline bool segments_intersect(const double& x1, const double& y1,
    -                               const double& x2, const double& y2,
    -                               const double& x3, const double& y3,
    -                               const double& x4, const double& y4)
    +inline bool
    +segments_intersect(const double& x1, const double& y1,
    +                   const double& x2, const double& y2,
    +                   const double& x3, const double& y3,
    +                   const double& x4, const double& y4)
     {
    -    double den = ((y4-y3)*(x2-x1)) - ((x4-x3)*(y2-y1));
    +    double den = ((y4 - y3) * (x2 - x1)) - ((x4 - x3) * (y2 - y1));
         if (den == 0.0)
    +    {
             return false;
    +    }
     
    -    double n1 = ((x4-x3)*(y1-y3)) - ((y4-y3)*(x1-x3));
    -    double n2 = ((x2-x1)*(y1-y3)) - ((y2-y1)*(x1-x3));
    +    double n1 = ((x4 - x3) * (y1 - y3)) - ((y4 - y3) * (x1 - x3));
    +    double n2 = ((x2 - x1) * (y1 - y3)) - ((y2 - y1) * (x1 - x3));
     
    -    double u1 = n1/den;
    -    double u2 = n2/den;
    +    double u1 = n1 / den;
    +    double u2 = n2 / den;
     
         return (u1 >= 0.0 && u1 <= 1.0 &&
                 u2 >= 0.0 && u2 <= 1.0);
     }
     
    -bool path_intersects_path(PathIterator& p1, PathIterator& p2)
    +bool
    +path_intersects_path(PathIterator& p1, PathIterator& p2)
     {
    -    typedef agg::conv_curve curve_t;
    +    typedef PathNanRemover no_nans_t;
    +    typedef agg::conv_curve curve_t;
     
         if (p1.total_vertices() < 2 || p2.total_vertices() < 2)
    +    {
             return false;
    +    }
    +
    +    no_nans_t n1(p1, true, p1.has_curves());
    +    no_nans_t n2(p2, true, p2.has_curves());
     
    -    curve_t c1(p1);
    -    curve_t c2(p2);
    +    curve_t c1(n1);
    +    curve_t c2(n2);
     
         double x11, y11, x12, y12;
         double x21, y21, x22, y22;
    @@ -1094,7 +1200,9 @@
             while (c2.vertex(&x22, &y22) != agg::path_cmd_stop)
             {
                 if (segments_intersect(x11, y11, x12, y12, x21, y21, x22, y22))
    +            {
                     return true;
    +            }
                 x21 = x22;
                 y21 = y22;
             }
    @@ -1105,13 +1213,15 @@
         return false;
     }
     
    -Py::Object _path_module::path_intersects_path(const Py::Tuple& args)
    +Py::Object
    +_path_module::path_intersects_path(const Py::Tuple& args)
     {
         args.verify_length(2, 3);
     
         PathIterator p1(args[0]);
         PathIterator p2(args[1]);
         bool filled = false;
    +
         if (args.size() == 3)
         {
             filled = args[2].isTrue();
    @@ -1129,21 +1239,28 @@
         }
     }
     
    -void _add_polygon(Py::List& polygons, const std::vector& polygon) {
    +void
    +_add_polygon(Py::List& polygons, const std::vector& polygon)
    +{
         if (polygon.size() == 0)
    +    {
             return;
    +    }
         npy_intp polygon_dims[] = { polygon.size() / 2, 2, 0 };
         PyArrayObject* polygon_array = NULL;
         polygon_array = (PyArrayObject*)PyArray_SimpleNew
    -        (2, polygon_dims, PyArray_DOUBLE);
    +                    (2, polygon_dims, PyArray_DOUBLE);
         if (!polygon_array)
    +    {
             throw Py::MemoryError("Error creating polygon array");
    +    }
         double* polygon_data = (double*)PyArray_DATA(polygon_array);
         memcpy(polygon_data, &polygon[0], polygon.size() * sizeof(double));
         polygons.append(Py::Object((PyObject*)polygon_array, true));
     }
     
    -Py::Object _path_module::convert_path_to_polygons(const Py::Tuple& args)
    +Py::Object
    +_path_module::convert_path_to_polygons(const Py::Tuple& args)
     {
         typedef agg::conv_transform  transformed_path_t;
         typedef PathNanRemover nan_removal_t;
    @@ -1207,9 +1324,11 @@
     }
     
     template
    -void __cleanup_path(VertexSource& source,
    -                    std::vector& vertices,
    -                    std::vector& codes) {
    +void
    +__cleanup_path(VertexSource& source,
    +               std::vector& vertices,
    +               std::vector& codes)
    +{
         unsigned code;
         double x, y;
         do
    @@ -1218,27 +1337,31 @@
             vertices.push_back(x);
             vertices.push_back(y);
             codes.push_back((npy_uint8)code);
    -    } while (code != agg::path_cmd_stop);
    +    }
    +    while (code != agg::path_cmd_stop);
     }
     
    -void _cleanup_path(PathIterator& path, const agg::trans_affine& trans,
    -                   bool remove_nans, bool do_clip,
    -                   const agg::rect_base& rect,
    -                   e_quantize_mode quantize_mode, bool do_simplify,
    -                   bool return_curves, std::vector& vertices,
    -                   std::vector& codes) {
    +void
    +_cleanup_path(PathIterator& path, const agg::trans_affine& trans,
    +              bool remove_nans, bool do_clip,
    +              const agg::rect_base& rect,
    +              e_snap_mode snap_mode, double stroke_width,
    +              bool do_simplify, bool return_curves,
    +              std::vector& vertices,
    +              std::vector& codes)
    +{
         typedef agg::conv_transform  transformed_path_t;
         typedef PathNanRemover nan_removal_t;
         typedef PathClipper         clipped_t;
    -    typedef PathQuantizer           quantized_t;
    -    typedef PathSimplifier        simplify_t;
    +    typedef PathSnapper             snapped_t;
    +    typedef PathSimplifier          simplify_t;
         typedef agg::conv_curve        curve_t;
     
         transformed_path_t tpath(path, trans);
         nan_removal_t      nan_removed(tpath, remove_nans, path.has_curves());
         clipped_t          clipped(nan_removed, do_clip, rect);
    -    quantized_t        quantized(clipped, quantize_mode, path.total_vertices());
    -    simplify_t         simplified(quantized, do_simplify, path.simplify_threshold());
    +    snapped_t          snapped(clipped, snap_mode, path.total_vertices(), stroke_width);
    +    simplify_t         simplified(snapped, do_simplify, path.simplify_threshold());
     
         vertices.reserve(path.total_vertices() * 2);
         codes.reserve(path.total_vertices());
    @@ -1254,9 +1377,10 @@
         }
     }
     
    -Py::Object _path_module::cleanup_path(const Py::Tuple& args)
    +Py::Object
    +_path_module::cleanup_path(const Py::Tuple& args)
     {
    -    args.verify_length(7);
    +    args.verify_length(8);
     
         PathIterator path(args[0]);
         agg::trans_affine trans = py_to_agg_transformation_matrix(args[1].ptr(), false);
    @@ -1281,23 +1405,25 @@
             do_clip = true;
         }
     
    -    Py::Object quantize_obj = args[4];
    -    e_quantize_mode quantize_mode;
    -    if (quantize_obj.isNone())
    +    Py::Object snap_obj = args[4];
    +    e_snap_mode snap_mode;
    +    if (snap_obj.isNone())
         {
    -        quantize_mode = QUANTIZE_AUTO;
    +        snap_mode = SNAP_AUTO;
         }
    -    else if (quantize_obj.isTrue())
    +    else if (snap_obj.isTrue())
         {
    -        quantize_mode = QUANTIZE_TRUE;
    +        snap_mode = SNAP_TRUE;
         }
         else
         {
    -        quantize_mode = QUANTIZE_FALSE;
    +        snap_mode = SNAP_FALSE;
         }
     
    +    double stroke_width = Py::Float(args[5]);
    +
         bool simplify;
    -    Py::Object simplify_obj = args[5];
    +    Py::Object simplify_obj = args[6];
         if (simplify_obj.isNone())
         {
             simplify = path.should_simplify();
    @@ -1307,13 +1433,13 @@
             simplify = simplify_obj.isTrue();
         }
     
    -    bool return_curves = args[6].isTrue();
    +    bool return_curves = args[7].isTrue();
     
         std::vector vertices;
         std::vector codes;
     
    -    _cleanup_path(path, trans, remove_nans, do_clip, clip_rect, quantize_mode,
    -                  simplify, return_curves, vertices, codes);
    +    _cleanup_path(path, trans, remove_nans, do_clip, clip_rect, snap_mode,
    +                  stroke_width, simplify, return_curves, vertices, codes);
     
         npy_intp length = codes.size();
         npy_intp dims[] = { length, 2, 0 };
    @@ -1321,16 +1447,17 @@
         PyArrayObject* vertices_obj = NULL;
         PyArrayObject* codes_obj = NULL;
         Py::Tuple result(2);
    -    try {
    +    try
    +    {
             vertices_obj = (PyArrayObject*)PyArray_SimpleNew
    -            (2, dims, PyArray_DOUBLE);
    +                       (2, dims, PyArray_DOUBLE);
             if (vertices_obj == NULL)
             {
                 throw Py::MemoryError("Could not allocate result array");
             }
     
             codes_obj = (PyArrayObject*)PyArray_SimpleNew
    -            (1, dims, PyArray_UINT8);
    +                    (1, dims, PyArray_UINT8);
             if (codes_obj == NULL)
             {
                 throw Py::MemoryError("Could not allocate result array");
    diff -Nru matplotlib-0.99.3/src/path.cpp matplotlib-1.0.1/src/path.cpp
    --- matplotlib-0.99.3/src/path.cpp	2010-03-09 14:20:17.000000000 +0000
    +++ matplotlib-1.0.1/src/path.cpp	2010-08-25 16:53:10.000000000 +0000
    @@ -13,8 +13,6 @@
     #include "agg_path_storage.h"
     #include "agg_trans_affine.h"
     
    -// MGDTODO: Un-CXX-ify this module
    -
     struct XY
     {
         double x;
    @@ -28,7 +26,7 @@
     {
     public:
         _path_module()
    -            : Py::ExtensionModule<_path_module>( "_path" )
    +            : Py::ExtensionModule<_path_module>("_path")
         {
             add_varargs_method("point_in_path", &_path_module::point_in_path,
                                "point_in_path(x, y, path, trans)");
    @@ -55,7 +53,7 @@
             add_varargs_method("convert_path_to_polygons", &_path_module::convert_path_to_polygons,
                                "convert_path_to_polygons(path, trans, width, height)");
             add_varargs_method("cleanup_path", &_path_module::cleanup_path,
    -                           "cleanup_path(path, trans, remove_nans, clip, quantize, simplify, curves)");
    +                           "cleanup_path(path, trans, remove_nans, clip, snap, simplify, curves)");
             initialize("Helper functions for paths");
         }
     
    @@ -115,7 +113,8 @@
     // Input 2D polygon _pgon_ with _numverts_ number of vertices and test point
     // _point_, returns 1 if inside, 0 if outside.
     template
    -bool point_in_path_impl(const double tx, const double ty, T& path)
    +bool
    +point_in_path_impl(const double tx, const double ty, T& path)
     {
         int yflag0, yflag1, inside_flag;
         double vtx0, vty0, vtx1, vty1, sx, sy;
    @@ -129,7 +128,9 @@
         do
         {
             if (code != agg::path_cmd_move_to)
    +        {
                 code = path.vertex(&x, &y);
    +        }
     
             sx = vtx0 = x;
             sy = vty0 = y;
    @@ -147,41 +148,47 @@
     
                 // The following cases denote the beginning on a new subpath
                 if (code == agg::path_cmd_stop ||
    -                (code & agg::path_cmd_end_poly) == agg::path_cmd_end_poly)
    +                    (code & agg::path_cmd_end_poly) == agg::path_cmd_end_poly)
                 {
                     x = sx;
                     y = sy;
                 }
                 else if (code == agg::path_cmd_move_to)
    +            {
                     break;
    +            }
     
                 yflag1 = (vty1 >= ty);
    -            // Check if endpoints straddle (are on opposite sides) of X axis
    -            // (i.e. the Y's differ); if so, +X ray could intersect this edge.
    -            // The old test also checked whether the endpoints are both to the
    -            // right or to the left of the test point.  However, given the faster
    -            // intersection point computation used below, this test was found to
    -            // be a break-even proposition for most polygons and a loser for
    -            // triangles (where 50% or more of the edges which survive this test
    -            // will cross quadrants and so have to have the X intersection computed
    -            // anyway).  I credit Joseph Samosky with inspiring me to try dropping
    -            // the "both left or both right" part of my code.
    +            // Check if endpoints straddle (are on opposite sides) of
    +            // X axis (i.e. the Y's differ); if so, +X ray could
    +            // intersect this edge.  The old test also checked whether
    +            // the endpoints are both to the right or to the left of
    +            // the test point.  However, given the faster intersection
    +            // point computation used below, this test was found to be
    +            // a break-even proposition for most polygons and a loser
    +            // for triangles (where 50% or more of the edges which
    +            // survive this test will cross quadrants and so have to
    +            // have the X intersection computed anyway).  I credit
    +            // Joseph Samosky with inspiring me to try dropping the
    +            // "both left or both right" part of my code.
                 if (yflag0 != yflag1)
                 {
                     // Check intersection of pgon segment with +X ray.
    -                // Note if >= point's X; if so, the ray hits it.
    -                // The division operation is avoided for the ">=" test by checking
    -                // the sign of the first vertex wrto the test point; idea inspired
    -                // by Joseph Samosky's and Mark Haigh-Hutchinson's different
    -                // polygon inclusion tests.
    -                if ( ((vty1-ty) * (vtx0-vtx1) >=
    -                      (vtx1-tx) * (vty0-vty1)) == yflag1 )
    +                // Note if >= point's X; if so, the ray hits it.  The
    +                // division operation is avoided for the ">=" test by
    +                // checking the sign of the first vertex wrto the test
    +                // point; idea inspired by Joseph Samosky's and Mark
    +                // Haigh-Hutchinson's different polygon inclusion
    +                // tests.
    +                if (((vty1 - ty) * (vtx0 - vtx1) >=
    +                        (vtx1 - tx) * (vty0 - vty1)) == yflag1)
                     {
                         inside_flag ^= 1;
                     }
                 }
     
    -            // Move to the next pair of vertices, retaining info as possible.
    +            // Move to the next pair of vertices, retaining info as
    +            // possible.
                 yflag0 = yflag1;
                 vtx0 = vtx1;
                 vty0 = vty1;
    @@ -195,48 +202,61 @@
             yflag1 = (vty1 >= ty);
             if (yflag0 != yflag1)
             {
    -            if ( ((vty1-ty) * (vtx0-vtx1) >=
    -                  (vtx1-tx) * (vty0-vty1)) == yflag1 )
    +            if (((vty1 - ty) * (vtx0 - vtx1) >=
    +                    (vtx1 - tx) * (vty0 - vty1)) == yflag1)
                 {
                     inside_flag ^= 1;
                 }
             }
     
             if (inside_flag != 0)
    +        {
                 return true;
    +        }
         }
         while (code != agg::path_cmd_stop);
     
         return (inside_flag != 0);
     }
     
    -inline bool point_in_path(double x, double y, PathIterator& path, const agg::trans_affine& trans)
    +inline bool
    +point_in_path(double x, double y, PathIterator& path,
    +              const agg::trans_affine& trans)
     {
         typedef agg::conv_transform transformed_path_t;
    -    typedef agg::conv_curve curve_t;
    +    typedef PathNanRemover no_nans_t;
    +    typedef agg::conv_curve curve_t;
     
         if (path.total_vertices() < 3)
    +    {
             return false;
    +    }
     
         transformed_path_t trans_path(path, trans);
    -    curve_t curved_path(trans_path);
    +    no_nans_t no_nans_path(trans_path, true, path.has_curves());
    +    curve_t curved_path(no_nans_path);
         return point_in_path_impl(x, y, curved_path);
     }
     
    -inline bool point_on_path(double x, double y, double r, PathIterator& path, const agg::trans_affine& trans)
    +inline bool
    +point_on_path(double x, double y, double r, PathIterator& path,
    +              const agg::trans_affine& trans)
     {
         typedef agg::conv_transform transformed_path_t;
    -    typedef agg::conv_curve curve_t;
    +    typedef PathNanRemover no_nans_t;
    +    typedef agg::conv_curve curve_t;
         typedef agg::conv_stroke stroke_t;
     
         transformed_path_t trans_path(path, trans);
    -    curve_t curved_path(trans_path);
    +    no_nans_t nan_removed_path(trans_path, true, path.has_curves());
    +    curve_t curved_path(nan_removed_path);
         stroke_t stroked_path(curved_path);
         stroked_path.width(r * 2.0);
         return point_in_path_impl(x, y, stroked_path);
     }
     
    -Py::Object _path_module::point_in_path(const Py::Tuple& args)
    +Py::Object
    +_path_module::point_in_path(const Py::Tuple& args)
     {
         args.verify_length(4);
     
    @@ -246,11 +266,14 @@
         agg::trans_affine trans = py_to_agg_transformation_matrix(args[3].ptr(), false);
     
         if (::point_in_path(x, y, path, trans))
    +    {
             return Py::Int(1);
    +    }
         return Py::Int(0);
     }
     
    -Py::Object _path_module::point_on_path(const Py::Tuple& args)
    +Py::Object
    +_path_module::point_on_path(const Py::Tuple& args)
     {
         args.verify_length(5);
     
    @@ -261,13 +284,16 @@
         agg::trans_affine trans = py_to_agg_transformation_matrix(args[4].ptr());
     
         if (::point_on_path(x, y, r, path, trans))
    +    {
             return Py::Int(1);
    +    }
         return Py::Int(0);
     }
     
    -void get_path_extents(PathIterator& path, const agg::trans_affine& trans,
    -                      double* x0, double* y0, double* x1, double* y1,
    -                      double* xm, double* ym)
    +void
    +get_path_extents(PathIterator& path, const agg::trans_affine& trans,
    +                 double* x0, double* y0, double* x1, double* y1,
    +                 double* xm, double* ym)
     {
         typedef agg::conv_transform transformed_path_t;
         typedef PathNanRemover nan_removed_t;
    @@ -284,7 +310,9 @@
         while ((code = curved_path.vertex(&x, &y)) != agg::path_cmd_stop)
         {
             if ((code & agg::path_cmd_end_poly) == agg::path_cmd_end_poly)
    +        {
                 continue;
    +        }
             if (x < *x0) *x0 = x;
             if (y < *y0) *y0 = y;
             if (x > *x1) *x1 = x;
    @@ -296,7 +324,8 @@
         }
     }
     
    -Py::Object _path_module::get_path_extents(const Py::Tuple& args)
    +Py::Object
    +_path_module::get_path_extents(const Py::Tuple& args)
     {
         args.verify_length(2);
     
    @@ -312,7 +341,9 @@
             extents = (PyArrayObject*)PyArray_SimpleNew
                       (2, extent_dims, PyArray_DOUBLE);
             if (extents == NULL)
    +        {
                 throw Py::MemoryError("Could not allocate result array");
    +        }
             extents_data = (double*)PyArray_DATA(extents);
     
             extents_data[0] = std::numeric_limits::infinity();
    @@ -324,9 +355,8 @@
             xm = std::numeric_limits::infinity();
             ym = std::numeric_limits::infinity();
     
    -        ::get_path_extents(path, trans,
    -                           &extents_data[0], &extents_data[1], &extents_data[2], &extents_data[3],
    -                           &xm, &ym);
    +        ::get_path_extents(path, trans, &extents_data[0], &extents_data[1],
    +                           &extents_data[2], &extents_data[3], &xm, &ym);
         }
         catch (...)
         {
    @@ -337,16 +367,20 @@
         return Py::Object((PyObject*)extents, true);
     }
     
    -Py::Object _path_module::update_path_extents(const Py::Tuple& args)
    +Py::Object
    +_path_module::update_path_extents(const Py::Tuple& args)
     {
         args.verify_length(5);
     
         double x0, y0, x1, y1;
         PathIterator path(args[0]);
    -    agg::trans_affine trans = py_to_agg_transformation_matrix(args[1].ptr(), false);
    +    agg::trans_affine trans = py_to_agg_transformation_matrix(
    +        args[1].ptr(), false);
    +
         if (!py_convert_bbox(args[2].ptr(), x0, y0, x1, y1))
         {
    -        throw Py::ValueError("Must pass Bbox object as arg 3 of update_path_extents");
    +        throw Py::ValueError(
    +            "Must pass Bbox object as arg 3 of update_path_extents");
         }
         Py::Object minpos_obj = args[3];
         bool ignore = bool(Py::Int(args[4]));
    @@ -355,10 +389,12 @@
         PyArrayObject* input_minpos = NULL;
         try
         {
    -        input_minpos = (PyArrayObject*)PyArray_FromObject(minpos_obj.ptr(), PyArray_DOUBLE, 1, 1);
    +        input_minpos = (PyArrayObject*)PyArray_FromObject(
    +            minpos_obj.ptr(), PyArray_DOUBLE, 1, 1);
             if (!input_minpos || PyArray_DIM(input_minpos, 0) != 2)
             {
    -            throw Py::TypeError("Argument 4 to update_path_extents must be a length-2 numpy array.");
    +            throw Py::TypeError(
    +                "Argument 4 to update_path_extents must be a length-2 numpy array.");
             }
             xm = *(double*)PyArray_GETPTR1(input_minpos, 0);
             ym = *(double*)PyArray_GETPTR1(input_minpos, 1);
    @@ -381,13 +417,17 @@
         try
         {
             extents = (PyArrayObject*)PyArray_SimpleNew
    -            (2, extent_dims, PyArray_DOUBLE);
    +                  (2, extent_dims, PyArray_DOUBLE);
             if (extents == NULL)
    +        {
                 throw Py::MemoryError("Could not allocate result array");
    +        }
             minpos = (PyArrayObject*)PyArray_SimpleNew
    -            (1, minpos_dims, PyArray_DOUBLE);
    +                 (1, minpos_dims, PyArray_DOUBLE);
             if (minpos == NULL)
    +        {
                 throw Py::MemoryError("Could not allocate result array");
    +        }
     
             extents_data = (double*)PyArray_DATA(extents);
             minpos_data = (double*)PyArray_DATA(minpos);
    @@ -413,7 +453,8 @@
                     extents_data[0] = x0;
                     extents_data[2] = x1;
                 }
    -            if (y0 > y1) {
    +            if (y0 > y1)
    +            {
                     extents_data[1] = std::numeric_limits::infinity();
                     extents_data[3] = -std::numeric_limits::infinity();
                 }
    @@ -426,9 +467,9 @@
                 minpos_data[1] = ym;
             }
     
    -        ::get_path_extents(path, trans,
    -                           &extents_data[0], &extents_data[1], &extents_data[2], &extents_data[3],
    -                           &minpos_data[0], &minpos_data[1]);
    +        ::get_path_extents(path, trans, &extents_data[0], &extents_data[1],
    +                           &extents_data[2], &extents_data[3], &minpos_data[0],
    +                           &minpos_data[1]);
     
             changed = (extents_data[0] != x0 ||
                        extents_data[1] != y0 ||
    @@ -456,7 +497,8 @@
         return result;
     }
     
    -Py::Object _path_module::get_path_collection_extents(const Py::Tuple& args)
    +Py::Object
    +_path_module::get_path_collection_extents(const Py::Tuple& args)
     {
         args.verify_length(5);
     
    @@ -472,7 +514,8 @@
     
         try
         {
    -        offsets = (PyArrayObject*)PyArray_FromObject(offsets_obj.ptr(), PyArray_DOUBLE, 0, 2);
    +        offsets = (PyArrayObject*)PyArray_FromObject(
    +            offsets_obj.ptr(), PyArray_DOUBLE, 0, 2);
             if (!offsets ||
                 (PyArray_NDIM(offsets) == 2 && PyArray_DIM(offsets, 1) != 2) ||
                 (PyArray_NDIM(offsets) == 1 && PyArray_DIM(offsets, 0) != 0))
    @@ -521,8 +564,8 @@
     
                 if (Noffsets)
                 {
    -                double xo                = *(double*)PyArray_GETPTR2(offsets, i % Noffsets, 0);
    -                double yo                = *(double*)PyArray_GETPTR2(offsets, i % Noffsets, 1);
    +                double xo = *(double*)PyArray_GETPTR2(offsets, i % Noffsets, 0);
    +                double yo = *(double*)PyArray_GETPTR2(offsets, i % Noffsets, 1);
                     offset_trans.transform(&xo, &yo);
                     trans *= agg::trans_affine_translation(xo, yo);
                 }
    @@ -546,7 +589,8 @@
         return result;
     }
     
    -Py::Object _path_module::point_in_path_collection(const Py::Tuple& args)
    +Py::Object
    +_path_module::point_in_path_collection(const Py::Tuple& args)
     {
         args.verify_length(9);
     
    @@ -561,10 +605,11 @@
         agg::trans_affine       offset_trans     = py_to_agg_transformation_matrix(args[7].ptr());
         bool                    filled           = Py::Int(args[8]);
     
    -    PyArrayObject* offsets = (PyArrayObject*)PyArray_FromObject(offsets_obj.ptr(), PyArray_DOUBLE, 0, 2);
    +    PyArrayObject* offsets = (PyArrayObject*)PyArray_FromObject(
    +        offsets_obj.ptr(), PyArray_DOUBLE, 0, 2);
         if (!offsets ||
    -        (PyArray_NDIM(offsets) == 2 && PyArray_DIM(offsets, 1) != 2) ||
    -        (PyArray_NDIM(offsets) == 1 && PyArray_DIM(offsets, 0) != 0))
    +            (PyArray_NDIM(offsets) == 2 && PyArray_DIM(offsets, 1) != 2) ||
    +            (PyArray_NDIM(offsets) == 1 && PyArray_DIM(offsets, 0) != 0))
         {
             Py_XDECREF(offsets);
             throw Py::ValueError("Offsets array must be Nx2");
    @@ -583,7 +628,7 @@
         for (i = 0; i < Ntransforms; ++i)
         {
             agg::trans_affine trans = py_to_agg_transformation_matrix
    -            (transforms_obj[i].ptr(), false);
    +                                  (transforms_obj[i].ptr(), false);
             trans *= master_transform;
             transforms.push_back(trans);
         }
    @@ -627,17 +672,20 @@
         return result;
     }
     
    -bool path_in_path(PathIterator& a, const agg::trans_affine& atrans,
    -                  PathIterator& b, const agg::trans_affine& btrans)
    +bool
    +path_in_path(PathIterator& a, const agg::trans_affine& atrans,
    +             PathIterator& b, const agg::trans_affine& btrans)
     {
         typedef agg::conv_transform transformed_path_t;
    -    typedef agg::conv_curve curve_t;
    +    typedef PathNanRemover no_nans_t;
    +    typedef agg::conv_curve curve_t;
     
         if (a.total_vertices() < 3)
             return false;
     
         transformed_path_t b_path_trans(b, btrans);
    -    curve_t b_curved(b_path_trans);
    +    no_nans_t b_no_nans(b_path_trans, true, b.has_curves());
    +    curve_t b_curved(b_no_nans);
     
         double x, y;
         b_curved.rewind(0);
    @@ -650,20 +698,23 @@
         return true;
     }
     
    -Py::Object _path_module::path_in_path(const Py::Tuple& args)
    +Py::Object
    +_path_module::path_in_path(const Py::Tuple& args)
     {
         args.verify_length(4);
     
         PathIterator a(args[0]);
    -    agg::trans_affine atrans = py_to_agg_transformation_matrix(args[1].ptr(), false);
    +    agg::trans_affine atrans = py_to_agg_transformation_matrix(
    +        args[1].ptr(), false);
         PathIterator b(args[2]);
    -    agg::trans_affine btrans = py_to_agg_transformation_matrix(args[3].ptr(), false);
    +    agg::trans_affine btrans = py_to_agg_transformation_matrix(
    +        args[3].ptr(), false);
     
         return Py::Int(::path_in_path(a, atrans, b, btrans));
     }
     
    -/** The clip_path_to_rect code here is a clean-room implementation of the
    -    Sutherland-Hodgman clipping algorithm described here:
    +/** The clip_path_to_rect code here is a clean-room implementation of
    +    the Sutherland-Hodgman clipping algorithm described here:
     
       http://en.wikipedia.org/wiki/Sutherland-Hodgman_clipping_algorithm
     */
    @@ -672,91 +723,101 @@
     
     namespace clip_to_rect_filters
     {
    -/* There are four different passes needed to create/remove vertices
    -   (one for each side of the rectangle).  The differences between those
    -   passes are encapsulated in these functor classes.
    -*/
    -struct bisectx
    -{
    -    double m_x;
    +    /* There are four different passes needed to create/remove
    +       vertices (one for each side of the rectangle).  The differences
    +       between those passes are encapsulated in these functor classes.
    +    */
    +    struct bisectx
    +    {
    +        double m_x;
    +
    +        bisectx(double x) : m_x(x) {}
     
    -    bisectx(double x) : m_x(x) {}
    +        inline void
    +        bisect(double sx, double sy, double px, double py, double* bx,
    +               double* by) const
    +        {
    +            *bx = m_x;
    +            double dx = px - sx;
    +            double dy = py - sy;
    +            *by = sy + dy * ((m_x - sx) / dx);
    +        }
    +    };
     
    -    inline void bisect(double sx, double sy, double px, double py,
    -                       double* bx, double* by) const
    +    struct xlt : public bisectx
         {
    -        *bx = m_x;
    -        double dx = px - sx;
    -        double dy = py - sy;
    -        *by = sy + dy * ((m_x - sx) / dx);
    -    }
    -};
    +        xlt(double x) : bisectx(x) {}
     
    -struct xlt : public bisectx
    -{
    -    xlt(double x) : bisectx(x) {}
    +        inline bool
    +        is_inside(double x, double y) const
    +        {
    +            return x <= m_x;
    +        }
    +    };
     
    -    inline bool is_inside(double x, double y) const
    +    struct xgt : public bisectx
         {
    -        return x <= m_x;
    -    }
    -};
    +        xgt(double x) : bisectx(x) {}
     
    -struct xgt : public bisectx
    -{
    -    xgt(double x) : bisectx(x) {}
    +        inline bool
    +        is_inside(double x, double y) const
    +        {
    +            return x >= m_x;
    +        }
    +    };
     
    -    inline bool is_inside(double x, double y) const
    +    struct bisecty
         {
    -        return x >= m_x;
    -    }
    -};
    +        double m_y;
     
    -struct bisecty
    -{
    -    double m_y;
    +        bisecty(double y) : m_y(y) {}
     
    -    bisecty(double y) : m_y(y) {}
    +        inline void
    +        bisect(double sx, double sy, double px, double py, double* bx,
    +               double* by) const
    +        {
    +            *by = m_y;
    +            double dx = px - sx;
    +            double dy = py - sy;
    +            *bx = sx + dx * ((m_y - sy) / dy);
    +        }
    +    };
     
    -    inline void bisect(double sx, double sy, double px, double py, double* bx, double* by) const
    +    struct ylt : public bisecty
         {
    -        *by = m_y;
    -        double dx = px - sx;
    -        double dy = py - sy;
    -        *bx = sx + dx * ((m_y - sy) / dy);
    -    }
    -};
    +        ylt(double y) : bisecty(y) {}
     
    -struct ylt : public bisecty
    -{
    -    ylt(double y) : bisecty(y) {}
    +        inline bool
    +        is_inside(double x, double y) const
    +        {
    +            return y <= m_y;
    +        }
    +    };
     
    -    inline bool is_inside(double x, double y) const
    +    struct ygt : public bisecty
         {
    -        return y <= m_y;
    -    }
    -};
    +        ygt(double y) : bisecty(y) {}
     
    -struct ygt : public bisecty
    -{
    -    ygt(double y) : bisecty(y) {}
    -
    -    inline bool is_inside(double x, double y) const
    -    {
    -        return y >= m_y;
    -    }
    -};
    +        inline bool
    +        is_inside(double x, double y) const
    +        {
    +            return y >= m_y;
    +        }
    +    };
     }
     
     template
    -inline void clip_to_rect_one_step(const Polygon& polygon, Polygon& result, const Filter& filter)
    +inline void
    +clip_to_rect_one_step(const Polygon& polygon, Polygon& result, const Filter& filter)
     {
         double sx, sy, px, py, bx, by;
         bool sinside, pinside;
         result.clear();
     
         if (polygon.size() == 0)
    +    {
             return;
    +    }
     
         sx = polygon.back().x;
         sy = polygon.back().y;
    @@ -784,9 +845,10 @@
         }
     }
     
    -void clip_to_rect(PathIterator& path,
    -                  double x0, double y0, double x1, double y1,
    -                  bool inside, std::vector& results)
    +void
    +clip_to_rect(PathIterator& path,
    +             double x0, double y0, double x1, double y1,
    +             bool inside, std::vector& results)
     {
         double xmin, ymin, xmax, ymax;
         if (x0 < x1)
    @@ -818,7 +880,7 @@
         }
     
         Polygon polygon1, polygon2;
    -    double x, y;
    +    double x = 0, y = 0;
         unsigned code = 0;
         path.rewind(0);
     
    @@ -829,15 +891,21 @@
             do
             {
                 if (code == agg::path_cmd_move_to)
    +            {
                     polygon1.push_back(XY(x, y));
    +            }
     
                 code = path.vertex(&x, &y);
     
                 if (code == agg::path_cmd_stop)
    +            {
                     break;
    +            }
     
                 if (code != agg::path_cmd_move_to)
    +            {
                     polygon1.push_back(XY(x, y));
    +            }
             }
             while ((code & agg::path_cmd_end_poly) != agg::path_cmd_end_poly);
     
    @@ -850,12 +918,15 @@
     
             // Empty polygons aren't very useful, so skip them
             if (polygon1.size())
    +        {
                 results.push_back(polygon1);
    +        }
         }
         while (code != agg::path_cmd_stop);
     }
     
    -Py::Object _path_module::clip_path_to_rect(const Py::Tuple &args)
    +Py::Object
    +_path_module::clip_path_to_rect(const Py::Tuple &args)
     {
         args.verify_length(3);
     
    @@ -865,7 +936,9 @@
     
         double x0, y0, x1, y1;
         if (!py_convert_bbox(bbox_obj.ptr(), x0, y0, x1, y1))
    +    {
             throw Py::TypeError("Argument 2 to clip_to_rect must be a Bbox object.");
    +    }
     
         std::vector results;
     
    @@ -875,7 +948,10 @@
         dims[1] = 2;
         PyObject* py_results = PyList_New(results.size());
         if (!py_results)
    +    {
             throw Py::RuntimeError("Error creating results list");
    +    }
    +
         try
         {
             for (std::vector::const_iterator p = results.begin(); p != results.end(); ++p)
    @@ -883,7 +959,8 @@
                 size_t size = p->size();
                 dims[0] = p->size();
                 PyArrayObject* pyarray = (PyArrayObject*)PyArray_SimpleNew(2, dims, PyArray_DOUBLE);
    -            if (pyarray == NULL) {
    +            if (pyarray == NULL)
    +            {
                     throw Py::MemoryError("Could not allocate result array");
                 }
                 for (size_t i = 0; i < size; ++i)
    @@ -906,7 +983,8 @@
         return Py::Object(py_results, true);
     }
     
    -Py::Object _path_module::affine_transform(const Py::Tuple& args)
    +Py::Object
    +_path_module::affine_transform(const Py::Tuple& args)
     {
         args.verify_length(2);
     
    @@ -922,16 +1000,22 @@
             vertices = (PyArrayObject*)PyArray_FromObject
                        (vertices_obj.ptr(), PyArray_DOUBLE, 1, 2);
             if (!vertices ||
    -            (PyArray_NDIM(vertices) == 2 && PyArray_DIM(vertices, 1) != 2) ||
    -            (PyArray_NDIM(vertices) == 1 && PyArray_DIM(vertices, 0) != 2))
    +            (PyArray_NDIM(vertices) == 2 && PyArray_DIM(vertices, 0) != 0 &&
    +             PyArray_DIM(vertices, 1) != 2) ||
    +            (PyArray_NDIM(vertices) == 1 &&
    +             PyArray_DIM(vertices, 0) != 2 && PyArray_DIM(vertices, 0) != 0))
    +        {
                 throw Py::ValueError("Invalid vertices array.");
    +        }
     
             transform = (PyArrayObject*) PyArray_FromObject
                         (transform_obj.ptr(), PyArray_DOUBLE, 2, 2);
             if (!transform ||
                 PyArray_DIM(transform, 0) != 3 ||
                 PyArray_DIM(transform, 1) != 3)
    +        {
                 throw Py::ValueError("Invalid transform.");
    +        }
     
             double a, b, c, d, e, f;
             {
    @@ -954,8 +1038,9 @@
             }
     
             result = (PyArrayObject*)PyArray_SimpleNew
    -          (PyArray_NDIM(vertices), PyArray_DIMS(vertices), PyArray_DOUBLE);
    -        if (result == NULL) {
    +                 (PyArray_NDIM(vertices), PyArray_DIMS(vertices), PyArray_DOUBLE);
    +        if (result == NULL)
    +        {
                 throw Py::MemoryError("Could not allocate memory for path");
             }
             if (PyArray_NDIM(vertices) == 2)
    @@ -973,13 +1058,13 @@
                     x = *(double*)(vertex_in);
                     y = *(double*)(vertex_in + stride1);
     
    -                *vertex_out++ = a*x + c*y + e;
    -                *vertex_out++ = b*x + d*y + f;
    +                *vertex_out++ = a * x + c * y + e;
    +                *vertex_out++ = b * x + d * y + f;
     
                     vertex_in += stride0;
                 }
             }
    -        else
    +        else if (PyArray_DIM(vertices, 0) != 0)
             {
                 char* vertex_in = PyArray_BYTES(vertices);
                 double* vertex_out = (double*)PyArray_DATA(result);
    @@ -988,8 +1073,8 @@
                 double y;
                 x = *(double*)(vertex_in);
                 y = *(double*)(vertex_in + stride0);
    -            *vertex_out++ = a*x + c*y + e;
    -            *vertex_out++ = b*x + d*y + f;
    +            *vertex_out++ = a * x + c * y + e;
    +            *vertex_out++ = b * x + d * y + f;
             }
         }
         catch (...)
    @@ -1006,7 +1091,8 @@
         return Py::Object((PyObject*)result, true);
     }
     
    -Py::Object _path_module::count_bboxes_overlapping_bbox(const Py::Tuple& args)
    +Py::Object
    +_path_module::count_bboxes_overlapping_bbox(const Py::Tuple& args)
     {
         args.verify_length(2);
     
    @@ -1020,9 +1106,13 @@
         if (py_convert_bbox(bbox.ptr(), ax0, ay0, ax1, ay1))
         {
             if (ax1 < ax0)
    +        {
                 std::swap(ax0, ax1);
    +        }
             if (ay1 < ay0)
    +        {
                 std::swap(ay0, ay1);
    +        }
     
             size_t num_bboxes = bboxes.size();
             for (size_t i = 0; i < num_bboxes; ++i)
    @@ -1031,14 +1121,20 @@
                 if (py_convert_bbox(bbox_b.ptr(), bx0, by0, bx1, by1))
                 {
                     if (bx1 < bx0)
    +                {
                         std::swap(bx0, bx1);
    +                }
                     if (by1 < by0)
    +                {
                         std::swap(by0, by1);
    +                }
                     if (!((bx1 <= ax0) ||
                           (by1 <= ay0) ||
                           (bx0 >= ax1) ||
                           (by0 >= ay1)))
    +                {
                         ++count;
    +                }
                 }
                 else
                 {
    @@ -1054,34 +1150,44 @@
         return Py::Int(count);
     }
     
    -inline bool segments_intersect(const double& x1, const double& y1,
    -                               const double& x2, const double& y2,
    -                               const double& x3, const double& y3,
    -                               const double& x4, const double& y4)
    +inline bool
    +segments_intersect(const double& x1, const double& y1,
    +                   const double& x2, const double& y2,
    +                   const double& x3, const double& y3,
    +                   const double& x4, const double& y4)
     {
    -    double den = ((y4-y3)*(x2-x1)) - ((x4-x3)*(y2-y1));
    +    double den = ((y4 - y3) * (x2 - x1)) - ((x4 - x3) * (y2 - y1));
         if (den == 0.0)
    +    {
             return false;
    +    }
     
    -    double n1 = ((x4-x3)*(y1-y3)) - ((y4-y3)*(x1-x3));
    -    double n2 = ((x2-x1)*(y1-y3)) - ((y2-y1)*(x1-x3));
    +    double n1 = ((x4 - x3) * (y1 - y3)) - ((y4 - y3) * (x1 - x3));
    +    double n2 = ((x2 - x1) * (y1 - y3)) - ((y2 - y1) * (x1 - x3));
     
    -    double u1 = n1/den;
    -    double u2 = n2/den;
    +    double u1 = n1 / den;
    +    double u2 = n2 / den;
     
         return (u1 >= 0.0 && u1 <= 1.0 &&
                 u2 >= 0.0 && u2 <= 1.0);
     }
     
    -bool path_intersects_path(PathIterator& p1, PathIterator& p2)
    +bool
    +path_intersects_path(PathIterator& p1, PathIterator& p2)
     {
    -    typedef agg::conv_curve curve_t;
    +    typedef PathNanRemover no_nans_t;
    +    typedef agg::conv_curve curve_t;
     
         if (p1.total_vertices() < 2 || p2.total_vertices() < 2)
    +    {
             return false;
    +    }
    +
    +    no_nans_t n1(p1, true, p1.has_curves());
    +    no_nans_t n2(p2, true, p2.has_curves());
     
    -    curve_t c1(p1);
    -    curve_t c2(p2);
    +    curve_t c1(n1);
    +    curve_t c2(n2);
     
         double x11, y11, x12, y12;
         double x21, y21, x22, y22;
    @@ -1094,7 +1200,9 @@
             while (c2.vertex(&x22, &y22) != agg::path_cmd_stop)
             {
                 if (segments_intersect(x11, y11, x12, y12, x21, y21, x22, y22))
    +            {
                     return true;
    +            }
                 x21 = x22;
                 y21 = y22;
             }
    @@ -1105,13 +1213,15 @@
         return false;
     }
     
    -Py::Object _path_module::path_intersects_path(const Py::Tuple& args)
    +Py::Object
    +_path_module::path_intersects_path(const Py::Tuple& args)
     {
         args.verify_length(2, 3);
     
         PathIterator p1(args[0]);
         PathIterator p2(args[1]);
         bool filled = false;
    +
         if (args.size() == 3)
         {
             filled = args[2].isTrue();
    @@ -1129,21 +1239,28 @@
         }
     }
     
    -void _add_polygon(Py::List& polygons, const std::vector& polygon) {
    +void
    +_add_polygon(Py::List& polygons, const std::vector& polygon)
    +{
         if (polygon.size() == 0)
    +    {
             return;
    +    }
         npy_intp polygon_dims[] = { polygon.size() / 2, 2, 0 };
         PyArrayObject* polygon_array = NULL;
         polygon_array = (PyArrayObject*)PyArray_SimpleNew
    -        (2, polygon_dims, PyArray_DOUBLE);
    +                    (2, polygon_dims, PyArray_DOUBLE);
         if (!polygon_array)
    +    {
             throw Py::MemoryError("Error creating polygon array");
    +    }
         double* polygon_data = (double*)PyArray_DATA(polygon_array);
         memcpy(polygon_data, &polygon[0], polygon.size() * sizeof(double));
         polygons.append(Py::Object((PyObject*)polygon_array, true));
     }
     
    -Py::Object _path_module::convert_path_to_polygons(const Py::Tuple& args)
    +Py::Object
    +_path_module::convert_path_to_polygons(const Py::Tuple& args)
     {
         typedef agg::conv_transform  transformed_path_t;
         typedef PathNanRemover nan_removal_t;
    @@ -1207,9 +1324,11 @@
     }
     
     template
    -void __cleanup_path(VertexSource& source,
    -                    std::vector& vertices,
    -                    std::vector& codes) {
    +void
    +__cleanup_path(VertexSource& source,
    +               std::vector& vertices,
    +               std::vector& codes)
    +{
         unsigned code;
         double x, y;
         do
    @@ -1218,27 +1337,31 @@
             vertices.push_back(x);
             vertices.push_back(y);
             codes.push_back((npy_uint8)code);
    -    } while (code != agg::path_cmd_stop);
    +    }
    +    while (code != agg::path_cmd_stop);
     }
     
    -void _cleanup_path(PathIterator& path, const agg::trans_affine& trans,
    -                   bool remove_nans, bool do_clip,
    -                   const agg::rect_base& rect,
    -                   e_quantize_mode quantize_mode, bool do_simplify,
    -                   bool return_curves, std::vector& vertices,
    -                   std::vector& codes) {
    +void
    +_cleanup_path(PathIterator& path, const agg::trans_affine& trans,
    +              bool remove_nans, bool do_clip,
    +              const agg::rect_base& rect,
    +              e_snap_mode snap_mode, double stroke_width,
    +              bool do_simplify, bool return_curves,
    +              std::vector& vertices,
    +              std::vector& codes)
    +{
         typedef agg::conv_transform  transformed_path_t;
         typedef PathNanRemover nan_removal_t;
         typedef PathClipper         clipped_t;
    -    typedef PathQuantizer           quantized_t;
    -    typedef PathSimplifier        simplify_t;
    +    typedef PathSnapper             snapped_t;
    +    typedef PathSimplifier          simplify_t;
         typedef agg::conv_curve        curve_t;
     
         transformed_path_t tpath(path, trans);
         nan_removal_t      nan_removed(tpath, remove_nans, path.has_curves());
         clipped_t          clipped(nan_removed, do_clip, rect);
    -    quantized_t        quantized(clipped, quantize_mode, path.total_vertices());
    -    simplify_t         simplified(quantized, do_simplify, path.simplify_threshold());
    +    snapped_t          snapped(clipped, snap_mode, path.total_vertices(), stroke_width);
    +    simplify_t         simplified(snapped, do_simplify, path.simplify_threshold());
     
         vertices.reserve(path.total_vertices() * 2);
         codes.reserve(path.total_vertices());
    @@ -1254,9 +1377,10 @@
         }
     }
     
    -Py::Object _path_module::cleanup_path(const Py::Tuple& args)
    +Py::Object
    +_path_module::cleanup_path(const Py::Tuple& args)
     {
    -    args.verify_length(7);
    +    args.verify_length(8);
     
         PathIterator path(args[0]);
         agg::trans_affine trans = py_to_agg_transformation_matrix(args[1].ptr(), false);
    @@ -1281,23 +1405,25 @@
             do_clip = true;
         }
     
    -    Py::Object quantize_obj = args[4];
    -    e_quantize_mode quantize_mode;
    -    if (quantize_obj.isNone())
    +    Py::Object snap_obj = args[4];
    +    e_snap_mode snap_mode;
    +    if (snap_obj.isNone())
         {
    -        quantize_mode = QUANTIZE_AUTO;
    +        snap_mode = SNAP_AUTO;
         }
    -    else if (quantize_obj.isTrue())
    +    else if (snap_obj.isTrue())
         {
    -        quantize_mode = QUANTIZE_TRUE;
    +        snap_mode = SNAP_TRUE;
         }
         else
         {
    -        quantize_mode = QUANTIZE_FALSE;
    +        snap_mode = SNAP_FALSE;
         }
     
    +    double stroke_width = Py::Float(args[5]);
    +
         bool simplify;
    -    Py::Object simplify_obj = args[5];
    +    Py::Object simplify_obj = args[6];
         if (simplify_obj.isNone())
         {
             simplify = path.should_simplify();
    @@ -1307,13 +1433,13 @@
             simplify = simplify_obj.isTrue();
         }
     
    -    bool return_curves = args[6].isTrue();
    +    bool return_curves = args[7].isTrue();
     
         std::vector vertices;
         std::vector codes;
     
    -    _cleanup_path(path, trans, remove_nans, do_clip, clip_rect, quantize_mode,
    -                  simplify, return_curves, vertices, codes);
    +    _cleanup_path(path, trans, remove_nans, do_clip, clip_rect, snap_mode,
    +                  stroke_width, simplify, return_curves, vertices, codes);
     
         npy_intp length = codes.size();
         npy_intp dims[] = { length, 2, 0 };
    @@ -1321,16 +1447,17 @@
         PyArrayObject* vertices_obj = NULL;
         PyArrayObject* codes_obj = NULL;
         Py::Tuple result(2);
    -    try {
    +    try
    +    {
             vertices_obj = (PyArrayObject*)PyArray_SimpleNew
    -            (2, dims, PyArray_DOUBLE);
    +                       (2, dims, PyArray_DOUBLE);
             if (vertices_obj == NULL)
             {
                 throw Py::MemoryError("Could not allocate result array");
             }
     
             codes_obj = (PyArrayObject*)PyArray_SimpleNew
    -            (1, dims, PyArray_UINT8);
    +                    (1, dims, PyArray_UINT8);
             if (codes_obj == NULL)
             {
                 throw Py::MemoryError("Could not allocate result array");
    diff -Nru matplotlib-0.99.3/src/_png.cpp matplotlib-1.0.1/src/_png.cpp
    --- matplotlib-0.99.3/src/_png.cpp	2010-03-09 14:20:17.000000000 +0000
    +++ matplotlib-1.0.1/src/_png.cpp	2010-10-12 16:14:42.000000000 +0000
    @@ -1,8 +1,25 @@
    -#include 
     
    -// To remove a gcc warning
    -#ifdef _POSIX_C_SOURCE
    -#undef _POSIX_C_SOURCE
    +/* For linux, png.h must be imported before Python.h because
    +   png.h needs to be the one to define setjmp.
    +   Undefining _POSIX_C_SOURCE and _XOPEN_SOURCE stops a couple
    +   of harmless warnings.
    +*/
    +
    +#ifdef __linux__
    +#   include 
    +#   ifdef _POSIX_C_SOURCE
    +#       undef _POSIX_C_SOURCE
    +#   endif
    +#   ifdef _XOPEN_SOURCE
    +#       undef _XOPEN_SOURCE
    +#   endif
    +#   include "Python.h"
    +#else
    +
    +/* Python API mandates Python.h is included *first* */
    +#   include "Python.h"
    +
    +#   include 
     #endif
     
     // TODO: Un CXX-ify this module
    @@ -10,12 +27,17 @@
     #include "numpy/arrayobject.h"
     #include "mplutils.h"
     
    +// As reported in [3082058] build _png.so on aix
    +#ifdef _AIX
    +#undef jmpbuf
    +#endif
    +
     // the extension module
     class _png_module : public Py::ExtensionModule<_png_module>
     {
     public:
         _png_module()
    -            : Py::ExtensionModule<_png_module>( "_png" )
    +            : Py::ExtensionModule<_png_module>("_png")
         {
             add_varargs_method("write_png", &_png_module::write_png,
                                "write_png(buffer, width, height, fileobj, dpi=None)");
    @@ -31,24 +53,31 @@
         Py::Object read_png(const Py::Tuple& args);
     };
     
    -static void write_png_data(png_structp png_ptr, png_bytep data, png_size_t length) {
    -  PyObject* py_file_obj = (PyObject*)png_get_io_ptr(png_ptr);
    -  PyObject* write_method = PyObject_GetAttrString(py_file_obj, "write");
    -  PyObject* result = NULL;
    -  if (write_method)
    -    result = PyObject_CallFunction(write_method, (char *)"s#", data, length);
    -  Py_XDECREF(write_method);
    -  Py_XDECREF(result);
    +static void write_png_data(png_structp png_ptr, png_bytep data, png_size_t length)
    +{
    +    PyObject* py_file_obj = (PyObject*)png_get_io_ptr(png_ptr);
    +    PyObject* write_method = PyObject_GetAttrString(py_file_obj, "write");
    +    PyObject* result = NULL;
    +    if (write_method)
    +    {
    +        result = PyObject_CallFunction(write_method, (char *)"s#", data,
    +                                       length);
    +    }
    +    Py_XDECREF(write_method);
    +    Py_XDECREF(result);
     }
     
    -static void flush_png_data(png_structp png_ptr) {
    -  PyObject* py_file_obj = (PyObject*)png_get_io_ptr(png_ptr);
    -  PyObject* flush_method = PyObject_GetAttrString(py_file_obj, "flush");
    -  PyObject* result = NULL;
    -  if (flush_method)
    -    result = PyObject_CallFunction(flush_method, (char *)"");
    -  Py_XDECREF(flush_method);
    -  Py_XDECREF(result);
    +static void flush_png_data(png_structp png_ptr)
    +{
    +    PyObject* py_file_obj = (PyObject*)png_get_io_ptr(png_ptr);
    +    PyObject* flush_method = PyObject_GetAttrString(py_file_obj, "flush");
    +    PyObject* result = NULL;
    +    if (flush_method)
    +    {
    +        result = PyObject_CallFunction(flush_method, (char *)"");
    +    }
    +    Py_XDECREF(flush_method);
    +    Py_XDECREF(result);
     }
     
     // this code is heavily adapted from the paint license, which is in
    @@ -56,250 +85,395 @@
     // distribution.  TODO, add license file to MANIFEST.in and CVS
     Py::Object _png_module::write_png(const Py::Tuple& args)
     {
    -  args.verify_length(4, 5);
    +    args.verify_length(4, 5);
     
    -  FILE *fp = NULL;
    -  bool close_file = false;
    -  Py::Object buffer_obj = Py::Object(args[0]);
    -  PyObject* buffer = buffer_obj.ptr();
    -  if (!PyObject_CheckReadBuffer(buffer)) {
    -    throw Py::TypeError("First argument must be an rgba buffer.");
    -  }
    -
    -  const void* pixBufferPtr = NULL;
    -  Py_ssize_t pixBufferLength = 0;
    -  if (PyObject_AsReadBuffer(buffer, &pixBufferPtr, &pixBufferLength)) {
    -    throw Py::ValueError("Couldn't get data from read buffer.");
    -  }
    -
    -  png_byte* pixBuffer = (png_byte*)pixBufferPtr;
    -  int width = (int)Py::Int(args[1]);
    -  int height = (int)Py::Int(args[2]);
    -
    -  if (pixBufferLength < width * height * 4) {
    -    throw Py::ValueError("Buffer and width, height don't seem to match.");
    -  }
    -
    -  Py::Object py_fileobj = Py::Object(args[3]);
    -  if (py_fileobj.isString()) {
    -    std::string fileName = Py::String(py_fileobj);
    -    const char *file_name = fileName.c_str();
    -    if ((fp = fopen(file_name, "wb")) == NULL)
    -      throw Py::RuntimeError( Printf("Could not open file %s", file_name).str() );
    -    close_file = true;
    -  } else if (PyFile_CheckExact(py_fileobj.ptr())) {
    -    fp = PyFile_AsFile(py_fileobj.ptr());
    -  }
    -  else {
    -    PyObject* write_method = PyObject_GetAttrString(py_fileobj.ptr(), "write");
    -    if (!(write_method && PyCallable_Check(write_method))) {
    -      Py_XDECREF(write_method);
    -      throw Py::TypeError("Object does not appear to be a 8-bit string path or a Python file-like object");
    +    FILE *fp = NULL;
    +    bool close_file = false;
    +    Py::Object buffer_obj = Py::Object(args[0]);
    +    PyObject* buffer = buffer_obj.ptr();
    +    if (!PyObject_CheckReadBuffer(buffer))
    +    {
    +        throw Py::TypeError("First argument must be an rgba buffer.");
         }
    -    Py_XDECREF(write_method);
    -  }
     
    -  png_bytep *row_pointers = NULL;
    -  png_structp png_ptr = NULL;
    -  png_infop info_ptr = NULL;
    +    const void* pixBufferPtr = NULL;
    +    Py_ssize_t pixBufferLength = 0;
    +    if (PyObject_AsReadBuffer(buffer, &pixBufferPtr, &pixBufferLength))
    +    {
    +        throw Py::ValueError("Couldn't get data from read buffer.");
    +    }
     
    -  try {
    -    struct png_color_8_struct sig_bit;
    -    png_uint_32 row;
    +    png_byte* pixBuffer = (png_byte*)pixBufferPtr;
    +    int width = (int)Py::Int(args[1]);
    +    int height = (int)Py::Int(args[2]);
    +
    +    if (pixBufferLength < width * height * 4)
    +    {
    +        throw Py::ValueError("Buffer and width, height don't seem to match.");
    +    }
    +
    +    Py::Object py_fileobj = Py::Object(args[3]);
    +    if (py_fileobj.isString())
    +    {
    +        std::string fileName = Py::String(py_fileobj);
    +        const char *file_name = fileName.c_str();
    +        if ((fp = fopen(file_name, "wb")) == NULL)
    +        {
    +            throw Py::RuntimeError(
    +                Printf("Could not open file %s", file_name).str());
    +        }
    +        close_file = true;
    +    }
    +    else if (PyFile_CheckExact(py_fileobj.ptr()))
    +    {
    +        fp = PyFile_AsFile(py_fileobj.ptr());
    +    }
    +    else
    +    {
    +        PyObject* write_method = PyObject_GetAttrString(
    +            py_fileobj.ptr(), "write");
    +        if (!(write_method && PyCallable_Check(write_method)))
    +        {
    +            Py_XDECREF(write_method);
    +            throw Py::TypeError(
    +                "Object does not appear to be a 8-bit string path or a Python file-like object");
    +        }
    +        Py_XDECREF(write_method);
    +    }
    +
    +    png_bytep *row_pointers = NULL;
    +    png_structp png_ptr = NULL;
    +    png_infop info_ptr = NULL;
    +
    +    try
    +    {
    +        struct png_color_8_struct sig_bit;
    +        png_uint_32 row;
    +
    +        row_pointers = new png_bytep[height];
    +        for (row = 0; row < (png_uint_32)height; ++row)
    +        {
    +            row_pointers[row] = pixBuffer + row * width * 4;
    +        }
    +
    +        png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
    +        if (png_ptr == NULL)
    +        {
    +            throw Py::RuntimeError("Could not create write struct");
    +        }
    +
    +        info_ptr = png_create_info_struct(png_ptr);
    +        if (info_ptr == NULL)
    +        {
    +            throw Py::RuntimeError("Could not create info struct");
    +        }
    +
    +        if (setjmp(png_jmpbuf(png_ptr)))
    +        {
    +            throw Py::RuntimeError("Error building image");
    +        }
    +
    +        if (fp)
    +        {
    +            png_init_io(png_ptr, fp);
    +        }
    +        else
    +        {
    +            png_set_write_fn(png_ptr, (void*)py_fileobj.ptr(),
    +                             &write_png_data, &flush_png_data);
    +        }
    +        png_set_IHDR(png_ptr, info_ptr,
    +                     width, height, 8,
    +                     PNG_COLOR_TYPE_RGB_ALPHA, PNG_INTERLACE_NONE,
    +                     PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);
    +
    +        // Save the dpi of the image in the file
    +        if (args.size() == 5)
    +        {
    +            double dpi = Py::Float(args[4]);
    +            size_t dots_per_meter = (size_t)(dpi / (2.54 / 100.0));
    +            png_set_pHYs(png_ptr, info_ptr, dots_per_meter, dots_per_meter, PNG_RESOLUTION_METER);
    +        }
    +
    +        // this a a color image!
    +        sig_bit.gray = 0;
    +        sig_bit.red = 8;
    +        sig_bit.green = 8;
    +        sig_bit.blue = 8;
    +        /* if the image has an alpha channel then */
    +        sig_bit.alpha = 8;
    +        png_set_sBIT(png_ptr, info_ptr, &sig_bit);
    +
    +        png_write_info(png_ptr, info_ptr);
    +        png_write_image(png_ptr, row_pointers);
    +        png_write_end(png_ptr, info_ptr);
    +    }
    +    catch (...)
    +    {
    +        if (fp && close_file)
    +        {
    +            fclose(fp);
    +        }
    +        delete [] row_pointers;
    +        /* Changed calls to png_destroy_write_struct to follow
    +           http://www.libpng.org/pub/png/libpng-manual.txt.
    +           This ensures the info_ptr memory is released.
    +        */
    +        if (png_ptr && info_ptr)
    +        {
    +            png_destroy_write_struct(&png_ptr, &info_ptr);
    +        }
    +        throw;
    +    }
     
    -    row_pointers = new png_bytep[height];
    -    for (row = 0; row < (png_uint_32)height; ++row) {
    -      row_pointers[row] = pixBuffer + row * width * 4;
    -    }
    -
    -    png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
    -    if (png_ptr == NULL) {
    -      throw Py::RuntimeError("Could not create write struct");
    -    }
    -
    -    info_ptr = png_create_info_struct(png_ptr);
    -    if (info_ptr == NULL) {
    -      throw Py::RuntimeError("Could not create info struct");
    -    }
    -
    -    if (setjmp(png_ptr->jmpbuf)) {
    -      throw Py::RuntimeError("Error building image");
    -    }
    -
    -    if (fp) {
    -      png_init_io(png_ptr, fp);
    -    } else {
    -      png_set_write_fn(png_ptr, (void*)py_fileobj.ptr(),
    -                       &write_png_data, &flush_png_data);
    -    }
    -    png_set_IHDR(png_ptr, info_ptr,
    -                 width, height, 8,
    -                 PNG_COLOR_TYPE_RGB_ALPHA, PNG_INTERLACE_NONE,
    -                 PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);
    -
    -    // Save the dpi of the image in the file
    -    if (args.size() == 5) {
    -      double dpi = Py::Float(args[4]);
    -      size_t dots_per_meter = (size_t)(dpi / (2.54 / 100.0));
    -      png_set_pHYs(png_ptr, info_ptr, dots_per_meter, dots_per_meter, PNG_RESOLUTION_METER);
    -    }
    -
    -    // this a a color image!
    -    sig_bit.gray = 0;
    -    sig_bit.red = 8;
    -    sig_bit.green = 8;
    -    sig_bit.blue = 8;
    -    /* if the image has an alpha channel then */
    -    sig_bit.alpha = 8;
    -    png_set_sBIT(png_ptr, info_ptr, &sig_bit);
    -
    -    png_write_info(png_ptr, info_ptr);
    -    png_write_image(png_ptr, row_pointers);
    -    png_write_end(png_ptr, info_ptr);
    -  } catch (...) {
    -      if (fp && close_file) fclose(fp);
    -      delete [] row_pointers;
    -      /* Changed calls to png_destroy_write_struct to follow
    -         http://www.libpng.org/pub/png/libpng-manual.txt.
    -         This ensures the info_ptr memory is released.
    -      */
    -      if (png_ptr && info_ptr) png_destroy_write_struct(&png_ptr, &info_ptr);
    -      throw;
    -  }
    -
    -  png_destroy_write_struct(&png_ptr, &info_ptr);
    -  delete [] row_pointers;
    -  if (fp && close_file) fclose(fp);
    +    png_destroy_write_struct(&png_ptr, &info_ptr);
    +    delete [] row_pointers;
    +    if (fp && close_file)
    +    {
    +        fclose(fp);
    +    }
     
    -  return Py::Object();
    +    return Py::Object();
     }
     
    +static void _read_png_data(PyObject* py_file_obj, png_bytep data, png_size_t length)
    +{
    +    PyObject* read_method = PyObject_GetAttrString(py_file_obj, "read");
    +    PyObject* result = NULL;
    +    char *buffer;
    +    Py_ssize_t bufflen;
    +    if (read_method)
    +    {
    +        result = PyObject_CallFunction(read_method, (char *)"i", length);
    +    }
    +    if (PyString_AsStringAndSize(result, &buffer, &bufflen) == 0)
    +    {
    +        if (bufflen == (Py_ssize_t)length)
    +        {
    +            memcpy(data, buffer, length);
    +        }
    +    }
    +    Py_XDECREF(read_method);
    +    Py_XDECREF(result);
    +}
    +
    +static void read_png_data(png_structp png_ptr, png_bytep data, png_size_t length)
    +{
    +    PyObject* py_file_obj = (PyObject*)png_get_io_ptr(png_ptr);
    +    _read_png_data(py_file_obj, data, length);
    +}
     
     Py::Object
    -_png_module::read_png(const Py::Tuple& args) {
    +_png_module::read_png(const Py::Tuple& args)
    +{
    +
    +    args.verify_length(1);
    +    png_byte header[8];   // 8 is the maximum size that can be checked
    +    FILE* fp = NULL;
    +    bool close_file = false;
    +
    +    Py::Object py_fileobj = Py::Object(args[0]);
    +    if (py_fileobj.isString())
    +    {
    +        std::string fileName = Py::String(py_fileobj);
    +        const char *file_name = fileName.c_str();
    +        if ((fp = fopen(file_name, "rb")) == NULL)
    +        {
    +            throw Py::RuntimeError(
    +                Printf("Could not open file %s for reading", file_name).str());
    +        }
    +        close_file = true;
    +    }
    +    else if (PyFile_CheckExact(py_fileobj.ptr()))
    +    {
    +        fp = PyFile_AsFile(py_fileobj.ptr());
    +    }
    +    else
    +    {
    +        PyObject* read_method = PyObject_GetAttrString(py_fileobj.ptr(), "read");
    +        if (!(read_method && PyCallable_Check(read_method)))
    +        {
    +            Py_XDECREF(read_method);
    +            throw Py::TypeError("Object does not appear to be a 8-bit string path or a Python file-like object");
    +        }
    +        Py_XDECREF(read_method);
    +    }
    +
    +    if (fp)
    +    {
    +        if (fread(header, 1, 8, fp) != 8)
    +        {
    +            throw Py::RuntimeError(
    +                "_image_module::readpng: error reading PNG header");
    +        }
    +    }
    +    else
    +    {
    +        _read_png_data(py_fileobj.ptr(), header, 8);
    +    }
    +    if (png_sig_cmp(header, 0, 8))
    +    {
    +        throw Py::RuntimeError(
    +            "_image_module::readpng: file not recognized as a PNG file");
    +    }
    +
    +    /* initialize stuff */
    +    png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
    +
    +    if (!png_ptr)
    +    {
    +        throw Py::RuntimeError(
    +            "_image_module::readpng:  png_create_read_struct failed");
    +    }
    +
    +    png_infop info_ptr = png_create_info_struct(png_ptr);
    +    if (!info_ptr)
    +    {
    +        throw Py::RuntimeError(
    +            "_image_module::readpng:  png_create_info_struct failed");
    +    }
    +
    +    if (setjmp(png_jmpbuf(png_ptr)))
    +    {
    +        throw Py::RuntimeError(
    +            "_image_module::readpng:  error during init_io");
    +    }
    +
    +    if (fp)
    +    {
    +        png_init_io(png_ptr, fp);
    +    }
    +    else
    +    {
    +        png_set_read_fn(png_ptr, (void*)py_fileobj.ptr(), &read_png_data);
    +    }
    +    png_set_sig_bytes(png_ptr, 8);
    +    png_read_info(png_ptr, info_ptr);
    +
    +    png_uint_32 width = info_ptr->width;
    +    png_uint_32 height = info_ptr->height;
    +
    +    int bit_depth = info_ptr->bit_depth;
    +
    +    // Unpack 1, 2, and 4-bit images
    +    if (bit_depth < 8)
    +        png_set_packing(png_ptr);
    +
    +    // If sig bits are set, shift data
    +    png_color_8p sig_bit;
    +    if ((info_ptr->color_type != PNG_COLOR_TYPE_PALETTE) &&
    +        png_get_sBIT(png_ptr, info_ptr, &sig_bit))
    +    {
    +        png_set_shift(png_ptr, sig_bit);
    +    }
    +
    +    // Convert big endian to little
    +    if (bit_depth == 16)
    +    {
    +        png_set_swap(png_ptr);
    +    }
    +
    +    // Convert palletes to full RGB
    +    if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
    +    {
    +        png_set_palette_to_rgb(png_ptr);
    +    }
     
    -  args.verify_length(1);
    -  std::string fname = Py::String(args[0]);
    +    // If there's an alpha channel convert gray to RGB
    +    if (info_ptr->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
    +    {
    +        png_set_gray_to_rgb(png_ptr);
    +    }
    +
    +    png_set_interlace_handling(png_ptr);
    +    png_read_update_info(png_ptr, info_ptr);
    +
    +    /* read file */
    +    if (setjmp(png_jmpbuf(png_ptr)))
    +    {
    +        throw Py::RuntimeError(
    +            "_image_module::readpng: error during read_image");
    +    }
     
    -  png_byte header[8];   // 8 is the maximum size that can be checked
    +    png_bytep *row_pointers = new png_bytep[height];
    +    png_uint_32 row;
     
    -  FILE *fp = fopen(fname.c_str(), "rb");
    -  if (!fp)
    -    throw Py::RuntimeError(Printf("_image_module::readpng could not open PNG file %s for reading", fname.c_str()).str());
    -
    -  if (fread(header, 1, 8, fp) != 8)
    -    throw Py::RuntimeError("_image_module::readpng: error reading PNG header");
    -  if (png_sig_cmp(header, 0, 8))
    -    throw Py::RuntimeError("_image_module::readpng: file not recognized as a PNG file");
    -
    -
    -  /* initialize stuff */
    -  png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
    -
    -  if (!png_ptr)
    -    throw Py::RuntimeError("_image_module::readpng:  png_create_read_struct failed");
    -
    -  png_infop info_ptr = png_create_info_struct(png_ptr);
    -  if (!info_ptr)
    -    throw Py::RuntimeError("_image_module::readpng:  png_create_info_struct failed");
    -
    -  if (setjmp(png_jmpbuf(png_ptr)))
    -    throw Py::RuntimeError("_image_module::readpng:  error during init_io");
    -
    -  png_init_io(png_ptr, fp);
    -  png_set_sig_bytes(png_ptr, 8);
    -  png_read_info(png_ptr, info_ptr);
    -
    -  png_uint_32 width = info_ptr->width;
    -  png_uint_32 height = info_ptr->height;
    -
    -  int bit_depth = info_ptr->bit_depth;
    -
    -  // Unpack 1, 2, and 4-bit images
    -  if (bit_depth < 8)
    -    png_set_packing(png_ptr);
    -
    -  // If sig bits are set, shift data
    -  png_color_8p sig_bit;
    -  if ((info_ptr->color_type != PNG_COLOR_TYPE_PALETTE) && png_get_sBIT(png_ptr, info_ptr, &sig_bit))
    -    png_set_shift(png_ptr, sig_bit);
    -
    -  // Convert big endian to little
    -  if (bit_depth == 16)
    -    png_set_swap(png_ptr);
    -
    -  // Convert palletes to full RGB
    -  if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
    -    png_set_palette_to_rgb(png_ptr);
    -
    -  // If there's an alpha channel convert gray to RGB
    -  if (info_ptr->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
    -    png_set_gray_to_rgb(png_ptr);
    -
    -  png_set_interlace_handling(png_ptr);
    -  png_read_update_info(png_ptr, info_ptr);
    -
    -  /* read file */
    -  if (setjmp(png_jmpbuf(png_ptr)))
    -    throw Py::RuntimeError("_image_module::readpng: error during read_image");
    -
    -  png_bytep *row_pointers = new png_bytep[height];
    -  png_uint_32 row;
    -
    -  for (row = 0; row < height; row++)
    -    row_pointers[row] = new png_byte[png_get_rowbytes(png_ptr,info_ptr)];
    -
    -  png_read_image(png_ptr, row_pointers);
    -
    -  npy_intp dimensions[3];
    -  dimensions[0] = height;  //numrows
    -  dimensions[1] = width;   //numcols
    -  if (info_ptr->color_type & PNG_COLOR_MASK_ALPHA)
    -    dimensions[2] = 4;     //RGBA images
    -  else if (info_ptr->color_type & PNG_COLOR_MASK_COLOR)
    -    dimensions[2] = 3;     //RGB images
    -  else
    -    dimensions[2] = 1;     //Greyscale images
    -  //For gray, return an x by y array, not an x by y by 1
    -  int num_dims  = (info_ptr->color_type & PNG_COLOR_MASK_COLOR) ? 3 : 2;
    -
    -  double max_value = (1 << ((bit_depth < 8) ? 8 : bit_depth)) - 1;
    -  PyArrayObject *A = (PyArrayObject *) PyArray_SimpleNew(num_dims, dimensions, PyArray_FLOAT);
    -
    -  if (A == NULL) {
    -    throw Py::MemoryError("Could not allocate image array");
    -  }
    -
    -  for (png_uint_32 y = 0; y < height; y++) {
    -    png_byte* row = row_pointers[y];
    -        for (png_uint_32 x = 0; x < width; x++) {
    -          size_t offset = y*A->strides[0] + x*A->strides[1];
    -          if (bit_depth == 16) {
    -            png_uint_16* ptr = &reinterpret_cast (row)[x * dimensions[2]];
    -            for (png_uint_32 p = 0; p < (png_uint_32)dimensions[2]; p++)
    -              *(float*)(A->data + offset + p*A->strides[2]) = (float)(ptr[p]) / max_value;
    -          } else {
    -            png_byte* ptr = &(row[x * dimensions[2]]);
    -            for (png_uint_32 p = 0; p < (png_uint_32)dimensions[2]; p++)
    +    for (row = 0; row < height; row++)
    +    {
    +        row_pointers[row] = new png_byte[png_get_rowbytes(png_ptr,info_ptr)];
    +    }
    +
    +    png_read_image(png_ptr, row_pointers);
    +
    +    npy_intp dimensions[3];
    +    dimensions[0] = height;  //numrows
    +    dimensions[1] = width;   //numcols
    +    if (info_ptr->color_type & PNG_COLOR_MASK_ALPHA)
    +    {
    +        dimensions[2] = 4;     //RGBA images
    +    }
    +    else if (info_ptr->color_type & PNG_COLOR_MASK_COLOR)
    +    {
    +        dimensions[2] = 3;     //RGB images
    +    }
    +    else
    +    {
    +        dimensions[2] = 1;     //Greyscale images
    +    }
    +    //For gray, return an x by y array, not an x by y by 1
    +    int num_dims  = (info_ptr->color_type & PNG_COLOR_MASK_COLOR) ? 3 : 2;
    +
    +    double max_value = (1 << ((bit_depth < 8) ? 8 : bit_depth)) - 1;
    +    PyArrayObject *A = (PyArrayObject *) PyArray_SimpleNew(
    +        num_dims, dimensions, PyArray_FLOAT);
    +
    +    if (A == NULL)
    +    {
    +        throw Py::MemoryError("Could not allocate image array");
    +    }
    +
    +    for (png_uint_32 y = 0; y < height; y++)
    +    {
    +        png_byte* row = row_pointers[y];
    +        for (png_uint_32 x = 0; x < width; x++)
    +        {
    +            size_t offset = y * A->strides[0] + x * A->strides[1];
    +            if (bit_depth == 16)
    +            {
    +                png_uint_16* ptr = &reinterpret_cast(row)[x * dimensions[2]];
    +                for (png_uint_32 p = 0; p < (png_uint_32)dimensions[2]; p++)
    +                {
    +                    *(float*)(A->data + offset + p*A->strides[2]) = (float)(ptr[p]) / max_value;
    +                }
    +            }
    +            else
    +            {
    +                png_byte* ptr = &(row[x * dimensions[2]]);
    +                for (png_uint_32 p = 0; p < (png_uint_32)dimensions[2]; p++)
                     {
    -              *(float*)(A->data + offset + p*A->strides[2]) = (float)(ptr[p]) / max_value;
    +                    *(float*)(A->data + offset + p*A->strides[2]) = (float)(ptr[p]) / max_value;
    +                }
                 }
    -          }
    +        }
         }
    -  }
     
    -  //free the png memory
    -  png_read_end(png_ptr, info_ptr);
    +    //free the png memory
    +    png_read_end(png_ptr, info_ptr);
     #ifndef png_infopp_NULL
    -  png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
    +    png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
     #else
    -  png_destroy_read_struct(&png_ptr, &info_ptr, png_infopp_NULL);
    +    png_destroy_read_struct(&png_ptr, &info_ptr, png_infopp_NULL);
     #endif
    -  fclose(fp);
    -  for (row = 0; row < height; row++)
    -    delete [] row_pointers[row];
    -  delete [] row_pointers;
    -  return Py::asObject((PyObject*)A);
    +    if (close_file)
    +    {
    +        fclose(fp);
    +    }
    +    for (row = 0; row < height; row++)
    +    {
    +        delete [] row_pointers[row];
    +    }
    +    delete [] row_pointers;
    +    return Py::asObject((PyObject*)A);
     }
     
     extern "C"
    diff -Nru matplotlib-0.99.3/src/_tkagg.cpp matplotlib-1.0.1/src/_tkagg.cpp
    --- matplotlib-0.99.3/src/_tkagg.cpp	2009-07-31 15:14:23.000000000 +0000
    +++ matplotlib-1.0.1/src/_tkagg.cpp	2010-07-07 01:41:45.000000000 +0000
    @@ -1,6 +1,6 @@
     /*
      * The Python Imaging Library.
    - * $Id: _tkagg.cpp 6341 2008-10-28 12:51:39Z mdboom $
    + * $Id: _tkagg.cpp 8460 2010-06-24 13:06:03Z mdboom $
      *
      */
     
    @@ -18,7 +18,8 @@
     #include "_backend_agg.h"
     #include "agg_py_transforms.h"
     
    -extern "C" {
    +extern "C"
    +{
     #ifdef __APPLE__
     #  ifdef TK_FRAMEWORK
     #     include 
    @@ -33,14 +34,15 @@
     
     
     
    -typedef struct {
    +typedef struct
    +{
         PyObject_HEAD
         Tcl_Interp* interp;
     } TkappObject;
     
     static int
     PyAggImagePhoto(ClientData clientdata, Tcl_Interp* interp,
    -               int argc, char **argv)
    +                int argc, char **argv)
     {
         Tk_PhotoHandle photo;
         Tk_PhotoImageBlock block;
    @@ -52,18 +54,20 @@
         unsigned long aggl, bboxl;
         bool has_bbox;
         agg::int8u *destbuffer;
    -    double l,b,r,t;
    +    double l, b, r, t;
         int destx, desty, destwidth, destheight, deststride;
         //unsigned long tmp_ptr;
     
         long mode;
         long nval;
    -    if (Tk_MainWindow(interp) == NULL) {
    +    if (Tk_MainWindow(interp) == NULL)
    +    {
             // Will throw a _tkinter.TclError with "this isn't a Tk application"
             return TCL_ERROR;
         }
     
    -    if (argc != 5) {
    +    if (argc != 5)
    +    {
             Tcl_AppendResult(interp, "usage: ", argv[0],
                              " destPhoto srcImage", (char *) NULL);
             return TCL_ERROR;
    @@ -71,12 +75,14 @@
     
         /* get Tcl PhotoImage handle */
         photo = Tk_FindPhoto(interp, argv[1]);
    -    if (photo == NULL) {
    +    if (photo == NULL)
    +    {
             Tcl_AppendResult(interp, "destination photo must exist", (char *) NULL);
             return TCL_ERROR;
         }
         /* get array (or object that can be converted to array) pointer */
    -    if (sscanf (argv[2],"%lu",&aggl) != 1) {
    +    if (sscanf(argv[2], "%lu", &aggl) != 1)
    +    {
             Tcl_AppendResult(interp, "error casting pointer", (char *) NULL);
             return TCL_ERROR;
         }
    @@ -94,13 +100,15 @@
     
         /* get array mode (0=mono, 1=rgb, 2=rgba) */
         mode = atol(argv[3]);
    -    if ((mode != 0) && (mode != 1) && (mode != 2)) {
    +    if ((mode != 0) && (mode != 1) && (mode != 2))
    +    {
             Tcl_AppendResult(interp, "illegal image mode", (char *) NULL);
             return TCL_ERROR;
         }
     
         /* check for bbox/blitting */
    -    if (sscanf (argv[4],"%lu",&bboxl) != 1) {
    +    if (sscanf(argv[4], "%lu", &bboxl) != 1)
    +    {
             Tcl_AppendResult(interp, "error casting pointer", (char *) NULL);
             return TCL_ERROR;
         }
    @@ -111,73 +119,86 @@
         //bbox_ptr_ss.str(argv[4]);
         //bbox_ptr_ss >> tmp_ptr;
         //bboxo = (PyObject*)tmp_ptr;
    -    if (py_convert_bbox(bboxo, l, b, r, t)) {
    -      has_bbox = true;
    +    if (py_convert_bbox(bboxo, l, b, r, t))
    +    {
    +        has_bbox = true;
    +
    +        destx = (int)l;
    +        desty = srcheight - (int)t;
    +        destwidth = (int)(r - l);
    +        destheight = (int)(t - b);
    +        deststride = 4 * destwidth;
    +
    +        destbuffer = new agg::int8u[deststride*destheight];
    +        if (destbuffer == NULL)
    +        {
    +            throw Py::MemoryError("_tkagg could not allocate memory for destbuffer");
    +        }
     
    -      destx = (int)l;
    -      desty = srcheight-(int)t;
    -      destwidth = (int)(r-l);
    -      destheight = (int)(t-b);
    -      deststride = 4*destwidth;
    -
    -      destbuffer = new agg::int8u[deststride*destheight];
    -      if (destbuffer == NULL) {
    -	throw Py::MemoryError("_tkagg could not allocate memory for destbuffer");
    -      }
    -
    -      agg::rendering_buffer destrbuf;
    -      destrbuf.attach(destbuffer, destwidth, destheight, deststride);
    -      pixfmt destpf(destrbuf);
    -      renderer_base destrb(destpf);
    -
    -      agg::rect_base region(destx, desty, (int)r, srcheight-(int)b);
    -      destrb.copy_from(aggRenderer->renderingBuffer, ®ion,
    -		       -destx, -desty);
    -    } else {
    -      has_bbox = false;
    -      destbuffer = NULL;
    -      destx = desty = destwidth = destheight = deststride = 0;
    +        agg::rendering_buffer destrbuf;
    +        destrbuf.attach(destbuffer, destwidth, destheight, deststride);
    +        pixfmt destpf(destrbuf);
    +        renderer_base destrb(destpf);
    +
    +        agg::rect_base region(destx, desty, (int)r, srcheight - (int)b);
    +        destrb.copy_from(aggRenderer->renderingBuffer, ®ion,
    +                         -destx, -desty);
    +    }
    +    else
    +    {
    +        has_bbox = false;
    +        destbuffer = NULL;
    +        destx = desty = destwidth = destheight = deststride = 0;
         }
     
         /* setup tkblock */
         block.pixelSize = 1;
    -    if (mode == 0) {
    -        block.offset[0]= block.offset[1] = block.offset[2] =0;
    +    if (mode == 0)
    +    {
    +        block.offset[0] = block.offset[1] = block.offset[2] = 0;
             nval = 1;
    -    } else {
    +    }
    +    else
    +    {
             block.offset[0] = 0;
             block.offset[1] = 1;
             block.offset[2] = 2;
    -        if (mode == 1) {
    +        if (mode == 1)
    +        {
                 block.offset[3] = 0;
                 block.pixelSize = 3;
                 nval = 3;
    -        } else {
    +        }
    +        else
    +        {
                 block.offset[3] = 3;
                 block.pixelSize = 4;
                 nval = 4;
             }
         }
     
    -    if (has_bbox) {
    -      block.width  = destwidth;
    -      block.height = destheight;
    -      block.pitch = deststride;
    -      block.pixelPtr = destbuffer;
    -
    -      Tk_PhotoPutBlock(photo, &block, destx, desty, destwidth, destheight);
    -      delete [] destbuffer;
    -
    -    } else {
    -      block.width  = aggRenderer->get_width();
    -      block.height = aggRenderer->get_height();
    -      block.pitch = block.width * nval;
    -      block.pixelPtr =  aggRenderer->pixBuffer;
    -
    -      /* Clear current contents */
    -      Tk_PhotoBlank(photo);
    -      /* Copy opaque block to photo image, and leave the rest to TK */
    -      Tk_PhotoPutBlock(photo, &block, 0, 0, block.width, block.height);
    +    if (has_bbox)
    +    {
    +        block.width  = destwidth;
    +        block.height = destheight;
    +        block.pitch = deststride;
    +        block.pixelPtr = destbuffer;
    +
    +        Tk_PhotoPutBlock(photo, &block, destx, desty, destwidth, destheight);
    +        delete [] destbuffer;
    +
    +    }
    +    else
    +    {
    +        block.width  = aggRenderer->get_width();
    +        block.height = aggRenderer->get_height();
    +        block.pitch = block.width * nval;
    +        block.pixelPtr =  aggRenderer->pixBuffer;
    +
    +        /* Clear current contents */
    +        Tk_PhotoBlank(photo);
    +        /* Copy opaque block to photo image, and leave the rest to TK */
    +        Tk_PhotoPutBlock(photo, &block, 0, 0, block.width, block.height);
         }
     
         return TCL_OK;
    @@ -187,10 +208,12 @@
     static PyObject *
     _pyobj_addr(PyObject* self, PyObject* args)
     {
    -  PyObject *pyobj;
    -  if (!PyArg_ParseTuple(args, "O", &pyobj))
    -      return NULL;
    -  return Py_BuildValue("l", (long) pyobj);
    +    PyObject *pyobj;
    +    if (!PyArg_ParseTuple(args, "O", &pyobj))
    +    {
    +        return NULL;
    +    }
    +    return Py_BuildValue("l", (long) pyobj);
     }
     
     static PyObject*
    @@ -202,11 +225,16 @@
         long arg;
         int is_interp;
         if (!PyArg_ParseTuple(args, "li", &arg, &is_interp))
    +    {
             return NULL;
    +    }
     
    -    if (is_interp) {
    +    if (is_interp)
    +    {
             interp = (Tcl_Interp*) arg;
    -    } else {
    +    }
    +    else
    +    {
             /* Do it the hard way.  This will break if the TkappObject
                layout changes */
             app = (TkappObject*) arg;
    @@ -216,14 +244,15 @@
         /* This will bomb if interp is invalid... */
     
         Tcl_CreateCommand(interp, "PyAggImagePhoto",
    -		      (Tcl_CmdProc *) PyAggImagePhoto,
    +                      (Tcl_CmdProc *) PyAggImagePhoto,
                           (ClientData) 0, (Tcl_CmdDeleteProc*) NULL);
     
         Py_INCREF(Py_None);
         return Py_None;
     }
     
    -static PyMethodDef functions[] = {
    +static PyMethodDef functions[] =
    +{
         /* Tkinter interface stuff */
         {"_pyobj_addr", (PyCFunction)_pyobj_addr, 1},
         {"tkinit", (PyCFunction)_tkinit, 1},
    @@ -231,9 +260,9 @@
     };
     
     extern "C"
    -DL_EXPORT(void) init_tkagg(void)
    +    DL_EXPORT(void) init_tkagg(void)
     {
    -  import_array();
    +    import_array();
     
    -  Py_InitModule("_tkagg", functions);
    +    Py_InitModule("_tkagg", functions);
     }
    diff -Nru matplotlib-0.99.3/src/_ttconv.cpp matplotlib-1.0.1/src/_ttconv.cpp
    --- matplotlib-0.99.3/src/_ttconv.cpp	2009-07-31 15:14:23.000000000 +0000
    +++ matplotlib-1.0.1/src/_ttconv.cpp	2010-07-07 01:41:45.000000000 +0000
    @@ -8,7 +8,8 @@
     #include "ttconv/pprdrv.h"
     #include 
     
    -class PythonExceptionOccurred {
    +class PythonExceptionOccurred
    +{
     
     };
     
    @@ -16,210 +17,259 @@
      * An implementation of TTStreamWriter that writes to a Python
      * file-like object.
      */
    -class PythonFileWriter : public TTStreamWriter {
    -  PyObject* _write_method;
    +class PythonFileWriter : public TTStreamWriter
    +{
    +    PyObject* _write_method;
     
     public:
    -  PythonFileWriter() {
    -    _write_method = NULL;
    -  }
    -
    -  ~PythonFileWriter() {
    -    Py_XDECREF(_write_method);
    -  }
    -
    -  void set(PyObject* write_method) {
    -    Py_XDECREF(_write_method);
    -    _write_method = write_method;
    -    Py_XINCREF(_write_method);
    -  }
    -
    -  virtual void write(const char* a) {
    -    PyObject* result = NULL;
    -    if (_write_method) {
    -      result = PyObject_CallFunction(_write_method, (char *)"s", a);
    -      if (! result)
    -	throw PythonExceptionOccurred();
    -      Py_DECREF(result);
    +    PythonFileWriter()
    +    {
    +        _write_method = NULL;
    +    }
    +
    +    ~PythonFileWriter()
    +    {
    +        Py_XDECREF(_write_method);
    +    }
    +
    +    void set(PyObject* write_method)
    +    {
    +        Py_XDECREF(_write_method);
    +        _write_method = write_method;
    +        Py_XINCREF(_write_method);
    +    }
    +
    +    virtual void write(const char* a)
    +    {
    +        PyObject* result = NULL;
    +        if (_write_method)
    +        {
    +            result = PyObject_CallFunction(_write_method, (char *)"s", a);
    +            if (! result)
    +            {
    +                throw PythonExceptionOccurred();
    +            }
    +            Py_DECREF(result);
    +        }
         }
    -  }
     };
     
    -int fileobject_to_PythonFileWriter(PyObject* object, void* address) {
    -  PythonFileWriter* file_writer = (PythonFileWriter*)address;
    +int fileobject_to_PythonFileWriter(PyObject* object, void* address)
    +{
    +    PythonFileWriter* file_writer = (PythonFileWriter*)address;
     
    -  PyObject* write_method = PyObject_GetAttrString(object, "write");
    -  if (write_method == NULL || ! PyCallable_Check(write_method)) {
    -    PyErr_SetString(PyExc_TypeError, "Expected a file-like object with a write method.");
    -    return 0;
    -  }
    +    PyObject* write_method = PyObject_GetAttrString(object, "write");
    +    if (write_method == NULL || ! PyCallable_Check(write_method))
    +    {
    +        PyErr_SetString(PyExc_TypeError, "Expected a file-like object with a write method.");
    +        return 0;
    +    }
     
    -  file_writer->set(write_method);
    -  Py_DECREF(write_method);
    +    file_writer->set(write_method);
    +    Py_DECREF(write_method);
     
    -  return 1;
    +    return 1;
     }
     
    -int pyiterable_to_vector_int(PyObject* object, void* address) {
    -  std::vector* result = (std::vector*)address;
    +int pyiterable_to_vector_int(PyObject* object, void* address)
    +{
    +    std::vector* result = (std::vector*)address;
     
    -  PyObject* iterator = PyObject_GetIter(object);
    -  if (! iterator)
    -    return 0;
    -
    -  PyObject* item;
    -  while ( (item = PyIter_Next(iterator)) ) {
    -    long value = PyInt_AsLong(item);
    -    Py_DECREF(item);
    -    if (value == -1 && PyErr_Occurred())
    -      return 0;
    -    result->push_back(value);
    -  }
    +    PyObject* iterator = PyObject_GetIter(object);
    +    if (! iterator)
    +    {
    +        return 0;
    +    }
     
    -  Py_DECREF(iterator);
    +    PyObject* item;
    +    while ((item = PyIter_Next(iterator)))
    +    {
    +        long value = PyInt_AsLong(item);
    +        Py_DECREF(item);
    +        if (value == -1 && PyErr_Occurred())
    +        {
    +            return 0;
    +        }
    +        result->push_back(value);
    +    }
     
    -  return 1;
    +    Py_DECREF(iterator);
    +
    +    return 1;
     }
     
     static PyObject*
    -convert_ttf_to_ps(PyObject* self, PyObject* args, PyObject* kwds) {
    -  const char*		filename;
    -  PythonFileWriter	output;
    -  int			fonttype;
    -  std::vector	glyph_ids;
    -
    -  static const char *kwlist[] = {
    -    "filename", "output", "fonttype", "glyph_ids", NULL };
    -  if (! PyArg_ParseTupleAndKeywords
    -      (args, kwds,
    -       "sO&i|O&:convert_ttf_to_ps",
    -       (char**)kwlist,
    -       &filename,
    -       fileobject_to_PythonFileWriter,
    -       &output,
    -       &fonttype,
    -       pyiterable_to_vector_int,
    -       &glyph_ids))
    -    return NULL;
    -
    -  if (fonttype != 3 && fonttype != 42) {
    -    PyErr_SetString(PyExc_ValueError,
    -		    "fonttype must be either 3 (raw Postscript) or 42 "
    -		    "(embedded Truetype)");
    -    return NULL;
    -  }
    -
    -  try {
    -    insert_ttfont( filename, output, (font_type_enum)fonttype, glyph_ids );
    -  } catch (TTException& e) {
    -    PyErr_SetString(PyExc_RuntimeError, e.getMessage());
    -    return NULL;
    -  } catch (PythonExceptionOccurred& ) {
    -    return NULL;
    -  } catch (...) {
    -    PyErr_SetString(PyExc_RuntimeError, "Unknown C++ exception");
    -    return NULL;
    -  }
    +convert_ttf_to_ps(PyObject* self, PyObject* args, PyObject* kwds)
    +{
    +    const char*         filename;
    +    PythonFileWriter    output;
    +    int                 fonttype;
    +    std::vector    glyph_ids;
    +
    +    static const char *kwlist[] =
    +    {
    +        "filename", "output", "fonttype", "glyph_ids", NULL
    +    };
    +    if (! PyArg_ParseTupleAndKeywords
    +        (args, kwds,
    +         "sO&i|O&:convert_ttf_to_ps",
    +         (char**)kwlist,
    +         &filename,
    +         fileobject_to_PythonFileWriter,
    +         &output,
    +         &fonttype,
    +         pyiterable_to_vector_int,
    +         &glyph_ids))
    +    {
    +        return NULL;
    +    }
    +
    +    if (fonttype != 3 && fonttype != 42)
    +    {
    +        PyErr_SetString(PyExc_ValueError,
    +                        "fonttype must be either 3 (raw Postscript) or 42 "
    +                        "(embedded Truetype)");
    +        return NULL;
    +    }
     
    -  Py_INCREF(Py_None);
    -  return Py_None;
    +    try
    +    {
    +        insert_ttfont(filename, output, (font_type_enum)fonttype, glyph_ids);
    +    }
    +    catch (TTException& e)
    +    {
    +        PyErr_SetString(PyExc_RuntimeError, e.getMessage());
    +        return NULL;
    +    }
    +    catch (PythonExceptionOccurred&)
    +    {
    +        return NULL;
    +    }
    +    catch (...)
    +    {
    +        PyErr_SetString(PyExc_RuntimeError, "Unknown C++ exception");
    +        return NULL;
    +    }
    +
    +    Py_INCREF(Py_None);
    +    return Py_None;
     }
     
    -class PythonDictionaryCallback : public TTDictionaryCallback {
    -  PyObject* _dict;
    +class PythonDictionaryCallback : public TTDictionaryCallback
    +{
    +    PyObject* _dict;
     
     public:
    -  PythonDictionaryCallback(PyObject* dict) {
    -    _dict = dict;
    -  }
    -
    -  virtual void add_pair(const char* a, const char* b) {
    -    PyObject* value = PyString_FromString(b);
    -    if (value) {
    -      if (PyDict_SetItemString(_dict, a, value)) {
    +    PythonDictionaryCallback(PyObject* dict)
    +    {
    +        _dict = dict;
    +    }
    +
    +    virtual void add_pair(const char* a, const char* b)
    +    {
    +        PyObject* value = PyString_FromString(b);
    +        if (value)
    +        {
    +            if (PyDict_SetItemString(_dict, a, value))
    +            {
    +                Py_DECREF(value);
    +                throw PythonExceptionOccurred();
    +            }
    +        }
             Py_DECREF(value);
    -	throw PythonExceptionOccurred();
    -      }
         }
    -    Py_DECREF(value);
    -  }
     };
     
     static PyObject*
    -py_get_pdf_charprocs(PyObject* self, PyObject* args, PyObject* kwds) {
    -  const char*		filename;
    -  std::vector	glyph_ids;
    -  PyObject*             result;
    -
    -  static const char *kwlist[] = { "filename", "glyph_ids", NULL };
    -  if (! PyArg_ParseTupleAndKeywords
    -      (args, kwds,
    -       "s|O&:get_pdf_charprocs",
    -       (char **)kwlist,
    -       &filename,
    -       pyiterable_to_vector_int,
    -       &glyph_ids))
    -    return NULL;
    -
    -  result = PyDict_New();
    -  if (!result)
    -    return NULL;
    -
    -  PythonDictionaryCallback dict(result);
    -
    -  try {
    -    ::get_pdf_charprocs( filename, glyph_ids, dict );
    -  } catch (TTException& e) {
    -    Py_DECREF(result);
    -    PyErr_SetString(PyExc_RuntimeError, e.getMessage());
    -    return NULL;
    -  } catch (PythonExceptionOccurred& ) {
    -    Py_DECREF(result);
    -    return NULL;
    -  } catch (...) {
    -    Py_DECREF(result);
    -    PyErr_SetString(PyExc_RuntimeError, "Unknown C++ exception");
    -    return NULL;
    -  }
    +py_get_pdf_charprocs(PyObject* self, PyObject* args, PyObject* kwds)
    +{
    +    const char*         filename;
    +    std::vector    glyph_ids;
    +    PyObject*             result;
    +
    +    static const char *kwlist[] = { "filename", "glyph_ids", NULL };
    +    if (! PyArg_ParseTupleAndKeywords
    +            (args, kwds,
    +             "s|O&:get_pdf_charprocs",
    +             (char **)kwlist,
    +             &filename,
    +             pyiterable_to_vector_int,
    +             &glyph_ids))
    +    {
    +        return NULL;
    +    }
     
    -  return result;
    +    result = PyDict_New();
    +    if (!result)
    +    {
    +        return NULL;
    +    }
    +
    +    PythonDictionaryCallback dict(result);
    +
    +    try
    +    {
    +        ::get_pdf_charprocs(filename, glyph_ids, dict);
    +    }
    +    catch (TTException& e)
    +    {
    +        Py_DECREF(result);
    +        PyErr_SetString(PyExc_RuntimeError, e.getMessage());
    +        return NULL;
    +    }
    +    catch (PythonExceptionOccurred&)
    +    {
    +        Py_DECREF(result);
    +        return NULL;
    +    }
    +    catch (...)
    +    {
    +        Py_DECREF(result);
    +        PyErr_SetString(PyExc_RuntimeError, "Unknown C++ exception");
    +        return NULL;
    +    }
    +
    +    return result;
     }
     
    -static PyMethodDef ttconv_methods[] = {
    -  {"convert_ttf_to_ps", (PyCFunction)convert_ttf_to_ps, METH_KEYWORDS,
    -   "convert_ttf_to_ps(filename, output, fonttype, glyph_ids)\n"
    -   "\n"
    -   "Converts the Truetype font into a Type 3 or Type 42 Postscript font, "
    -   "optionally subsetting the font to only the desired set of characters.\n"
    -   "\n"
    -   "filename is the path to a TTF font file.\n"
    -   "output is a Python file-like object with a write method that the Postscript "
    -   "font data will be written to.\n"
    -   "fonttype may be either 3 or 42.  Type 3 is a \"raw Postscript\" font. "
    -   "Type 42 is an embedded Truetype font.  Glyph subsetting is not supported "
    -   "for Type 42 fonts.\n"
    -   "glyph_ids (optional) is a list of glyph ids (integers) to keep when "
    -   "subsetting to a Type 3 font.  If glyph_ids is not provided or is None, "
    -   "then all glyphs will be included.  If any of the glyphs specified are "
    -   "composite glyphs, then the component glyphs will also be included."
    -  },
    -  {"get_pdf_charprocs", (PyCFunction)py_get_pdf_charprocs, METH_KEYWORDS,
    -   "get_pdf_charprocs(filename, glyph_ids)\n"
    -   "\n"
    -   "Given a Truetype font file, returns a dictionary containing the PDF Type 3\n"
    -   "representation of its paths.  Useful for subsetting a Truetype font inside\n"
    -   "of a PDF file.\n"
    -   "\n"
    -   "filename is the path to a TTF font file.\n"
    -   "glyph_ids is a list of the numeric glyph ids to include.\n"
    -   "The return value is a dictionary where the keys are glyph names and\n"
    -   "the values are the stream content needed to render that glyph.  This\n"
    -   "is useful to generate the CharProcs dictionary in a PDF Type 3 font.\n"
    -  },
    -  {0, 0, 0, 0}  /* Sentinel */
    +static PyMethodDef ttconv_methods[] =
    +{
    +    {
    +        "convert_ttf_to_ps", (PyCFunction)convert_ttf_to_ps, METH_KEYWORDS,
    +        "convert_ttf_to_ps(filename, output, fonttype, glyph_ids)\n"
    +        "\n"
    +        "Converts the Truetype font into a Type 3 or Type 42 Postscript font, "
    +        "optionally subsetting the font to only the desired set of characters.\n"
    +        "\n"
    +        "filename is the path to a TTF font file.\n"
    +        "output is a Python file-like object with a write method that the Postscript "
    +        "font data will be written to.\n"
    +        "fonttype may be either 3 or 42.  Type 3 is a \"raw Postscript\" font. "
    +        "Type 42 is an embedded Truetype font.  Glyph subsetting is not supported "
    +        "for Type 42 fonts.\n"
    +        "glyph_ids (optional) is a list of glyph ids (integers) to keep when "
    +        "subsetting to a Type 3 font.  If glyph_ids is not provided or is None, "
    +        "then all glyphs will be included.  If any of the glyphs specified are "
    +        "composite glyphs, then the component glyphs will also be included."
    +    },
    +    {
    +        "get_pdf_charprocs", (PyCFunction)py_get_pdf_charprocs, METH_KEYWORDS,
    +        "get_pdf_charprocs(filename, glyph_ids)\n"
    +        "\n"
    +        "Given a Truetype font file, returns a dictionary containing the PDF Type 3\n"
    +        "representation of its paths.  Useful for subsetting a Truetype font inside\n"
    +        "of a PDF file.\n"
    +        "\n"
    +        "filename is the path to a TTF font file.\n"
    +        "glyph_ids is a list of the numeric glyph ids to include.\n"
    +        "The return value is a dictionary where the keys are glyph names and\n"
    +        "the values are the stream content needed to render that glyph.  This\n"
    +        "is useful to generate the CharProcs dictionary in a PDF Type 3 font.\n"
    +    },
    +    {0, 0, 0, 0}  /* Sentinel */
     };
     
    -#ifndef PyMODINIT_FUNC	/* declarations for DLL import/export */
    +#ifndef PyMODINIT_FUNC  /* declarations for DLL import/export */
     #define PyMODINIT_FUNC void
     #endif
     PyMODINIT_FUNC
    @@ -229,7 +279,7 @@
     
         m = Py_InitModule3("ttconv", ttconv_methods,
                            "Module to handle converting and subsetting TrueType "
    -		       "fonts to Postscript Type 3, Postscript Type 42 and "
    -		       "Pdf Type 3 fonts.");
    +                       "fonts to Postscript Type 3, Postscript Type 42 and "
    +                       "Pdf Type 3 fonts.");
     }
     
    diff -Nru matplotlib-0.99.3/src/_windowing.cpp matplotlib-1.0.1/src/_windowing.cpp
    --- matplotlib-0.99.3/src/_windowing.cpp	2009-07-31 15:14:23.000000000 +0000
    +++ matplotlib-1.0.1/src/_windowing.cpp	2010-07-07 01:41:45.000000000 +0000
    @@ -4,32 +4,39 @@
     static PyObject *
     _GetForegroundWindow(PyObject *module, PyObject *args)
     {
    -	HWND handle = GetForegroundWindow();
    -	if (!PyArg_ParseTuple(args, ":GetForegroundWindow"))
    -		return NULL;
    -	return PyInt_FromLong((long) handle);
    +    HWND handle = GetForegroundWindow();
    +    if (!PyArg_ParseTuple(args, ":GetForegroundWindow"))
    +    {
    +        return NULL;
    +    }
    +    return PyInt_FromLong((long) handle);
     }
     
     static PyObject *
     _SetForegroundWindow(PyObject *module, PyObject *args)
     {
    -	HWND handle;
    -	if (!PyArg_ParseTuple(args, "l:SetForegroundWindow", &handle))
    -		return NULL;
    -	if (!SetForegroundWindow(handle))
    -		return PyErr_Format(PyExc_RuntimeError,
    -				    "Error setting window");
    -	Py_INCREF(Py_None);
    -	return Py_None;
    +    HWND handle;
    +    if (!PyArg_ParseTuple(args, "l:SetForegroundWindow", &handle))
    +    {
    +        return NULL;
    +    }
    +    if (!SetForegroundWindow(handle))
    +    {
    +        return PyErr_Format(PyExc_RuntimeError,
    +                            "Error setting window");
    +    }
    +    Py_INCREF(Py_None);
    +    return Py_None;
     }
     
    -static PyMethodDef _windowing_methods[] = {
    -{"GetForegroundWindow", _GetForegroundWindow, METH_VARARGS},
    -{"SetForegroundWindow", _SetForegroundWindow, METH_VARARGS},
    -{NULL, NULL}
    +static PyMethodDef _windowing_methods[] =
    +{
    +    {"GetForegroundWindow", _GetForegroundWindow, METH_VARARGS},
    +    {"SetForegroundWindow", _SetForegroundWindow, METH_VARARGS},
    +    {NULL, NULL}
     };
     
     extern "C" DL_EXPORT(void) init_windowing()
     {
    -	Py_InitModule("_windowing", _windowing_methods);
    +    Py_InitModule("_windowing", _windowing_methods);
     }
    diff -Nru matplotlib-0.99.3/src/_wxagg.cpp matplotlib-1.0.1/src/_wxagg.cpp
    --- matplotlib-0.99.3/src/_wxagg.cpp	2009-07-31 15:14:23.000000000 +0000
    +++ matplotlib-1.0.1/src/_wxagg.cpp	2010-07-07 01:41:45.000000000 +0000
    @@ -65,71 +65,74 @@
     {
     public:
     
    -  _wxagg_module()
    -    : Py::ExtensionModule<_wxagg_module>( "_wxkagg" )
    -  {
    -    add_varargs_method("convert_agg_to_wx_image",
    -        &_wxagg_module::convert_agg_to_wx_image,
    -        "Convert the region of the agg buffer bounded by bbox to a wx.Image."
    -        "  If bbox\nis None, the entire buffer is converted.\n\nNote: agg must"
    -        " be a backend_agg.RendererAgg instance.");
    -
    -    add_varargs_method("convert_agg_to_wx_bitmap",
    -        &_wxagg_module::convert_agg_to_wx_bitmap,
    -        "Convert the region of the agg buffer bounded by bbox to a wx.Bitmap."
    -        "  If bbox\nis None, the entire buffer is converted.\n\nNote: agg must"
    -        " be a backend_agg.RendererAgg instance.");
    +    _wxagg_module()
    +            : Py::ExtensionModule<_wxagg_module>("_wxkagg")
    +    {
    +        add_varargs_method("convert_agg_to_wx_image",
    +                           &_wxagg_module::convert_agg_to_wx_image,
    +                           "Convert the region of the agg buffer bounded by bbox to a wx.Image."
    +                           "  If bbox\nis None, the entire buffer is converted.\n\nNote: agg must"
    +                           " be a backend_agg.RendererAgg instance.");
    +
    +        add_varargs_method("convert_agg_to_wx_bitmap",
    +                           &_wxagg_module::convert_agg_to_wx_bitmap,
    +                           "Convert the region of the agg buffer bounded by bbox to a wx.Bitmap."
    +                           "  If bbox\nis None, the entire buffer is converted.\n\nNote: agg must"
    +                           " be a backend_agg.RendererAgg instance.");
     
    -    initialize( "The _wxagg module" );
    -  }
    +        initialize("The _wxagg module");
    +    }
     
    -  virtual ~_wxagg_module() {}
    +    virtual ~_wxagg_module() {}
     
     private:
     
    -  Py::Object convert_agg_to_wx_image(const Py::Tuple &args)
    -  {
    -    args.verify_length(2);
    -
    -    RendererAgg* aggRenderer = static_cast(
    -        args[0].getAttr("_renderer").ptr());
    -
    -    Py::Object clipbox = args[1];
    -
    -    // convert the buffer
    -    wxImage *image = convert_agg2image(aggRenderer, clipbox);
    +    Py::Object convert_agg_to_wx_image(const Py::Tuple &args)
    +    {
    +        args.verify_length(2);
    +
    +        RendererAgg* aggRenderer = static_cast(
    +                                       args[0].getAttr("_renderer").ptr());
    +
    +        Py::Object clipbox = args[1];
    +
    +        // convert the buffer
    +        wxImage *image = convert_agg2image(aggRenderer, clipbox);
    +
    +        // wrap a wx.Image around the result and return it
    +        PyObject *pyWxImage = wxPyConstructObject(image, _T("wxImage"), 1);
    +        if (pyWxImage == NULL)
    +        {
    +            throw Py::MemoryError(
    +                "_wxagg.convert_agg_to_wx_image(): could not create the wx.Image");
    +        }
     
    -    // wrap a wx.Image around the result and return it
    -    PyObject *pyWxImage = wxPyConstructObject(image, _T("wxImage"), 1);
    -    if (pyWxImage == NULL) {
    -        throw Py::MemoryError(
    -            "_wxagg.convert_agg_to_wx_image(): could not create the wx.Image");
    +        return Py::asObject(pyWxImage);
         }
     
    -    return Py::asObject(pyWxImage);
    -  }
     
    +    Py::Object convert_agg_to_wx_bitmap(const Py::Tuple &args)
    +    {
    +        args.verify_length(2);
     
    -  Py::Object convert_agg_to_wx_bitmap(const Py::Tuple &args) {
    -    args.verify_length(2);
    +        RendererAgg* aggRenderer = static_cast(
    +            args[0].getAttr("_renderer").ptr());
     
    -    RendererAgg* aggRenderer = static_cast(
    -       args[0].getAttr("_renderer").ptr());
    +        Py::Object clipbox = args[1];
     
    -    Py::Object clipbox = args[1];
    +        // convert the buffer
    +        wxBitmap *bitmap = convert_agg2bitmap(aggRenderer, clipbox);
     
    -    // convert the buffer
    -    wxBitmap *bitmap = convert_agg2bitmap(aggRenderer, clipbox);
    +        // wrap a wx.Bitmap around the result and return it
    +        PyObject *pyWxBitmap = wxPyConstructObject(bitmap, _T("wxBitmap"), 1);
    +        if (pyWxBitmap == NULL)
    +        {
    +            throw Py::MemoryError(
    +                "_wxagg.convert_agg_to_wx_bitmap(): could not create the wx.Bitmap");
    +        }
     
    -    // wrap a wx.Bitmap around the result and return it
    -    PyObject *pyWxBitmap = wxPyConstructObject(bitmap, _T("wxBitmap"), 1);
    -    if (pyWxBitmap == NULL) {
    -        throw Py::MemoryError(
    -          "_wxagg.convert_agg_to_wx_bitmap(): could not create the wx.Bitmap");
    +        return Py::asObject(pyWxBitmap);
         }
    -
    -    return Py::asObject(pyWxBitmap);
    -  }
     };
     
     
    @@ -148,21 +151,25 @@
     
         double l, b, r, t;
     
    -    if (!py_convert_bbox(clipbox.ptr(), l, b, r, t)) {
    +    if (!py_convert_bbox(clipbox.ptr(), l, b, r, t))
    +    {
             // Convert everything: rgba => rgb -> image
             srcBuffer = aggRenderer->pixBuffer;
             srcWidth  = (int) aggRenderer->get_width();
             srcHeight = (int) aggRenderer->get_height();
    -        srcStride = (int) aggRenderer->get_width()*4;
    -    } else {
    +        srcStride = (int) aggRenderer->get_width() * 4;
    +    }
    +    else
    +    {
             // Convert a region: rgba => clipped rgba => rgb -> image
    -        srcWidth = (int) (r-l);
    -        srcHeight = (int) (t-b);
    -        srcStride = srcWidth*4;
    +        srcWidth = (int)(r - l);
    +        srcHeight = (int)(t - b);
    +        srcStride = srcWidth * 4;
     
             deleteSrcBuffer = true;
             srcBuffer = new agg::int8u[srcStride*srcHeight];
    -        if (srcBuffer == NULL) {
    +        if (srcBuffer == NULL)
    +        {
                 throw Py::MemoryError(
                     "_wxagg::convert_agg2image(): could not allocate `srcBuffer'");
             }
    @@ -179,18 +186,21 @@
             pixfmt pf(rbuf);
             renderer_base rndr(pf);
             rndr.copy_from(aggRenderer->renderingBuffer, ®ion,
    -            (int)-l, (int)(t-h));
    +                       (int) - l, (int)(t - h));
         }
     
         // allocate the RGB data array
     
         // use malloc(3) because wxImage will use free(3)
         agg::int8u *destBuffer = (agg::int8u *) malloc(
    -        sizeof(agg::int8u)*srcWidth*3*srcHeight);
    +                                 sizeof(agg::int8u) * srcWidth * 3 * srcHeight);
     
    -    if (destBuffer == NULL) {
    +    if (destBuffer == NULL)
    +    {
             if (deleteSrcBuffer)
    +        {
                 delete [] srcBuffer;
    +        }
     
             throw Py::MemoryError(
                 "_wxagg::convert_agg2image(): could not allocate `destBuffer'");
    @@ -207,9 +217,12 @@
     
         // Create a wxImage using the RGB data
         wxImage *image = new wxImage(srcWidth, srcHeight, destBuffer);
    -    if (image == NULL) {
    +    if (image == NULL)
    +    {
             if (deleteSrcBuffer)
    +        {
                 delete [] srcBuffer;
    +        }
     
             free(destBuffer);
             throw Py::MemoryError(
    @@ -217,7 +230,9 @@
         }
     
         if (deleteSrcBuffer)
    +    {
             delete [] srcBuffer;
    +    }
     
         return image;
     }
    @@ -233,7 +248,8 @@
         image->Destroy();
         delete image;
     
    -    if (bitmap == NULL) {
    +    if (bitmap == NULL)
    +    {
             throw Py::MemoryError(
                 "_wxagg::convert_agg2bitmap(): could not allocate `bitmap'");
         }
    @@ -247,11 +263,11 @@
     //
     
     extern "C"
    -DL_EXPORT(void)
    -  init_wxagg(void)
    +    DL_EXPORT(void)
    +    init_wxagg(void)
     {
    -  wxPyCoreAPI_IMPORT();
    -  //suppress an unused variable warning by creating _wxagg_module in two lines
    -  static _wxagg_module* _wxagg = NULL;
    -  _wxagg = new _wxagg_module;
    +    wxPyCoreAPI_IMPORT();
    +    //suppress an unused variable warning by creating _wxagg_module in two lines
    +    static _wxagg_module* _wxagg = NULL;
    +    _wxagg = new _wxagg_module;
     };
    diff -Nru matplotlib-0.99.3/ttconv/pprdrv.h matplotlib-1.0.1/ttconv/pprdrv.h
    --- matplotlib-0.99.3/ttconv/pprdrv.h	2009-07-31 15:14:43.000000000 +0000
    +++ matplotlib-1.0.1/ttconv/pprdrv.h	2010-12-13 15:27:29.000000000 +0000
    @@ -1,3 +1,5 @@
    +/* -*- mode: c++; c-basic-offset: 4 -*- */
    +
     /*
      * Modified for use within matplotlib
      * 5 July 2007
    @@ -27,35 +29,37 @@
      * function.  This both removes the hardcoding of output to go to stdout
      * and makes output thread-safe.  Michael Droettboom [06-07-07]
      */
    -class TTStreamWriter {
    +class TTStreamWriter
    +{
      private:
    -  // Private copy and assignment
    -  TTStreamWriter& operator=(const TTStreamWriter& other);
    -  TTStreamWriter(const TTStreamWriter& other);
    +    // Private copy and assignment
    +    TTStreamWriter& operator=(const TTStreamWriter& other);
    +    TTStreamWriter(const TTStreamWriter& other);
     
      public:
    -  TTStreamWriter() { }
    -  virtual ~TTStreamWriter() { }
    +    TTStreamWriter() { }
    +    virtual ~TTStreamWriter() { }
     
    -  virtual void write(const char*) = 0;
    +    virtual void write(const char*) = 0;
     
    -  virtual void printf(const char* format, ...);
    -  virtual void put_char(int val);
    -  virtual void puts(const char* a);
    -  virtual void putline(const char* a);
    +    virtual void printf(const char* format, ...);
    +    virtual void put_char(int val);
    +    virtual void puts(const char* a);
    +    virtual void putline(const char* a);
     };
     
    -class TTDictionaryCallback {
    - private:
    -  // Private copy and assignment
    -  TTDictionaryCallback& operator=(const TTStreamWriter& other);
    -  TTDictionaryCallback(const TTStreamWriter& other);
    -
    - public:
    -  TTDictionaryCallback() { }
    -  virtual ~TTDictionaryCallback() { }
    +class TTDictionaryCallback
    +{
    +private:
    +    // Private copy and assignment
    +    TTDictionaryCallback& operator=(const TTStreamWriter& other);
    +    TTDictionaryCallback(const TTStreamWriter& other);
    +
    +public:
    +    TTDictionaryCallback() { }
    +    virtual ~TTDictionaryCallback() { }
     
    -  virtual void add_pair(const char* key, const char* value) = 0;
    +    virtual void add_pair(const char* key, const char* value) = 0;
     };
     
     void replace_newlines_with_spaces(char* a);
    @@ -63,14 +67,18 @@
     /*
      * A simple class for all ttconv exceptions.
      */
    -class TTException {
    -  const char* message;
    -  TTException& operator=(const TTStreamWriter& other);
    -  TTException(const TTStreamWriter& other);
    -
    - public:
    -  TTException(const char* message_) : message(message_) { }
    -  const char* getMessage() { return message; }
    +class TTException
    +{
    +    const char* message;
    +    TTException& operator=(const TTStreamWriter& other);
    +    TTException(const TTStreamWriter& other);
    +
    +public:
    +    TTException(const char* message_) : message(message_) { }
    +    const char* getMessage()
    +    {
    +        return message;
    +    }
     };
     
     /*
    @@ -84,15 +92,17 @@
     ** code you want to have included.
     */
     #ifdef DEBUG
    -#define DEBUG_TRUETYPE 		/* truetype fonts, conversion to Postscript */
    +#define DEBUG_TRUETYPE          /* truetype fonts, conversion to Postscript */
     #endif
     
     /* Do not change anything below this line. */
     
    -enum font_type_enum {
    -  PS_TYPE_3  = 3,
    -  PS_TYPE_42 = 42,
    -  PDF_TYPE_3 = -3
    +enum font_type_enum
    +{
    +    PS_TYPE_3  = 3,
    +    PS_TYPE_42 = 42,
    +    PS_TYPE_42_3_HYBRID = 43,
    +    PDF_TYPE_3 = -3
     };
     
     /* routines in pprdrv_tt.c */
    diff -Nru matplotlib-0.99.3/ttconv/pprdrv_tt2.cpp matplotlib-1.0.1/ttconv/pprdrv_tt2.cpp
    --- matplotlib-0.99.3/ttconv/pprdrv_tt2.cpp	2009-07-31 15:14:43.000000000 +0000
    +++ matplotlib-1.0.1/ttconv/pprdrv_tt2.cpp	2010-12-13 15:27:29.000000000 +0000
    @@ -1,3 +1,5 @@
    +/* -*- mode: c++; c-basic-offset: 4 -*- */
    +
     /*
      * Modified for use within matplotlib
      * 5 July 2007
    @@ -40,7 +42,8 @@
     #include 
     #include 
     
    -class GlyphToType3 {
    +class GlyphToType3
    +{
     private:
         GlyphToType3& operator=(const GlyphToType3& other);
         GlyphToType3(const GlyphToType3& other);
    @@ -50,13 +53,13 @@
         int advance_width;
     
         /* Variables to hold the character data. */
    -    int *epts_ctr;			/* array of contour endpoints */
    -    int num_pts, num_ctr;		/* number of points, number of coutours */
    -    FWord *xcoor, *ycoor;		/* arrays of x and y coordinates */
    -    BYTE *tt_flags;			/* array of TrueType flags */
    +    int *epts_ctr;                      /* array of contour endpoints */
    +    int num_pts, num_ctr;               /* number of points, number of coutours */
    +    FWord *xcoor, *ycoor;               /* arrays of x and y coordinates */
    +    BYTE *tt_flags;                     /* array of TrueType flags */
         double *area_ctr;
         char *check_ctr;
    -    int *ctrset;  		/* in contour index followed by out contour index */
    +    int *ctrset;                /* in contour index followed by out contour index */
     
         int stack_depth;            /* A book-keeping variable for keeping track of the depth of the PS stack */
     
    @@ -99,53 +102,54 @@
     ** are perfectly accurate, but they do the job.
     */
     void GlyphToType3::stack(TTStreamWriter& stream, int new_elem)
    +{
    +    if ( !pdf_mode && num_pts > 25 )                    /* Only do something of we will */
         {
    -    if( !pdf_mode && num_pts > 25 )			/* Only do something of we will */
    -	{				/* have a log of points. */
    -	if(stack_depth == 0)
    -	    {
    -    	    stream.put_char('{');
    -    	    stack_depth=1;
    -    	    }
    -
    -	stack_depth += new_elem;		/* Account for what we propose to add */
    -
    -	if(stack_depth > 100)
    -    	    {
    -    	    stream.puts("}_e{");
    -    	    stack_depth = 3 + new_elem;	/* A rough estimate */
    -    	    }
    -    	}
    -    } /* end of stack() */
    -
    -void GlyphToType3::stack_end(TTStreamWriter& stream)			/* called at end */
    -    {
    -    if( !pdf_mode && stack_depth )
    -    	{
    -    	stream.puts("}_e");
    -    	stack_depth=0;
    -    	}
    -    } /* end of stack_end() */
    +        /* have a log of points. */
    +        if (stack_depth == 0)
    +        {
    +            stream.put_char('{');
    +            stack_depth=1;
    +        }
    +
    +        stack_depth += new_elem;                /* Account for what we propose to add */
    +
    +        if (stack_depth > 100)
    +        {
    +            stream.puts("}_e{");
    +            stack_depth = 3 + new_elem; /* A rough estimate */
    +        }
    +    }
    +} /* end of stack() */
    +
    +void GlyphToType3::stack_end(TTStreamWriter& stream)                    /* called at end */
    +{
    +    if ( !pdf_mode && stack_depth )
    +    {
    +        stream.puts("}_e");
    +        stack_depth=0;
    +    }
    +} /* end of stack_end() */
     
     /*
     ** Find the area of a contour?
     */
     double area(FWord *x, FWord *y, int n)
    -     {
    -     int i;
    -     double sum;
    -
    -     sum=x[n-1]*y[0]-y[n-1]*x[0];
    -     for (i=0; i<=n-2; i++) sum += x[i]*y[i+1] - y[i]*x[i+1];
    -     return sum;
    -     }
    +{
    +    int i;
    +    double sum;
    +
    +    sum=x[n-1]*y[0]-y[n-1]*x[0];
    +    for (i=0; i<=n-2; i++) sum += x[i]*y[i+1] - y[i]*x[i+1];
    +    return sum;
    +}
     
     /*
     ** We call this routine to emmit the PostScript code
     ** for the character we have loaded with load_char().
     */
     void GlyphToType3::PSConvert(TTStreamWriter& stream)
    -    {
    +{
         int i,j,k,fst,start_offpt;
         int end_offpt = 0;
     
    @@ -163,79 +167,94 @@
         area_ctr[0]=area(xcoor, ycoor, epts_ctr[0]+1);
     
         for (i=1; i0)
    -	    {
    -	    ctrset[2*i]=i; ctrset[2*i+1]=nearout(i);
    -	    }
    -	else
    -	    {
    -	    ctrset[2*i]=-1; ctrset[2*i+1]=-1;
    -	    }
    -	}
    +    {
    +        if (area_ctr[i]>0)
    +        {
    +            ctrset[2*i]=i;
    +            ctrset[2*i+1]=nearout(i);
    +        }
    +        else
    +        {
    +            ctrset[2*i]=-1;
    +            ctrset[2*i+1]=-1;
    +        }
    +    }
     
         /* Step thru the coutours. */
         /* I believe that a contour is a detatched */
         /* set of curves and lines. */
         i=j=k=0;
    -    while( i < num_ctr )
    -	{
    -	fst = j = (k==0) ? 0 : (epts_ctr[k-1]+1);
    -
    -	/* Move to the first point on the contour. */
    -	stack(stream, 3);
    -	PSMoveto(stream,xcoor[j],ycoor[j]);
    -
    -	start_offpt = 0;		/* No off curve points yet. */
    -
    -	/* Step thru the remaining points of this contour. */
    -	for(j++; j <= epts_ctr[k]; j++)
    -	    {
    -	    if (!(tt_flags[j]&1))	/* Off curve */
    -		{
    -		if (!start_offpt)
    -		    { start_offpt = end_offpt = j; }
    -		else
    -		    end_offpt++;
    -		}
    -	    else
    -		{			/* On Curve */
    -		if (start_offpt)
    -		    {
    -		    stack(stream, 7);
    -		    PSCurveto(stream, xcoor[j],ycoor[j],start_offpt,end_offpt);
    -		    start_offpt = 0;
    -		    }
    -		else
    -		    {
    +    while ( i < num_ctr )
    +    {
    +        fst = j = (k==0) ? 0 : (epts_ctr[k-1]+1);
    +
    +        /* Move to the first point on the contour. */
    +        stack(stream, 3);
    +        PSMoveto(stream,xcoor[j],ycoor[j]);
    +
    +        start_offpt = 0;                /* No off curve points yet. */
    +
    +        /* Step thru the remaining points of this contour. */
    +        for (j++; j <= epts_ctr[k]; j++)
    +        {
    +            if (!(tt_flags[j]&1))       /* Off curve */
    +            {
    +                if (!start_offpt)
    +                {
    +                    start_offpt = end_offpt = j;
    +                }
    +                else
    +                {
    +                    end_offpt++;
    +                }
    +            }
    +            else
    +            {
    +                /* On Curve */
    +                if (start_offpt)
    +                {
    +                    stack(stream, 7);
    +                    PSCurveto(stream, xcoor[j],ycoor[j],start_offpt,end_offpt);
    +                    start_offpt = 0;
    +                }
    +                else
    +                {
                         stack(stream, 3);
    -		    PSLineto(stream, xcoor[j], ycoor[j]);
    -		    }
    -		}
    -	    }
    -
    -	/* Do the final curve or line */
    -	/* of this coutour. */
    -	if (start_offpt)
    -	    {
    -	      stack(stream, 7); PSCurveto(stream, xcoor[fst],ycoor[fst],start_offpt,end_offpt);
    -	    }
    -	else
    -	    {
    -	      stack(stream, 3); PSLineto(stream, xcoor[fst],ycoor[fst]);
    -	    }
    -
    -	k=nextinctr(i,k);
    -
    -	if (k==NOMOREINCTR)
    -	    i=k=nextoutctr(i);
    -
    -	 if (i==NOMOREOUTCTR)
    -	     break;
    -	 }
    +                    PSLineto(stream, xcoor[j], ycoor[j]);
    +                }
    +            }
    +        }
    +
    +        /* Do the final curve or line */
    +        /* of this coutour. */
    +        if (start_offpt)
    +        {
    +            stack(stream, 7);
    +            PSCurveto(stream, xcoor[fst],ycoor[fst],start_offpt,end_offpt);
    +        }
    +        else
    +        {
    +            stack(stream, 3);
    +            PSLineto(stream, xcoor[fst],ycoor[fst]);
    +        }
    +
    +        k=nextinctr(i,k);
    +
    +        if (k==NOMOREINCTR)
    +        {
    +            i=k=nextoutctr(i);
    +        }
    +
    +        if (i==NOMOREOUTCTR)
    +        {
    +            break;
    +        }
    +    }
     
         /* Now, we can fill the whole thing. */
         stack(stream, 1);
    @@ -248,149 +267,177 @@
         area_ctr = NULL;
         check_ctr = NULL;
         ctrset = NULL;
    -    } /* end of PSConvert() */
    +} /* end of PSConvert() */
     
     int GlyphToType3::nextoutctr(int co)
    -	{
    -	int j;
    +{
    +    int j;
     
    -	for(j=0; ja1)
    -		{
    -		k=co;
    -		a1=a;
    -		}
    -	    }
    -	}
    +    {
    +        if (area_ctr[co] < 0)
    +        {
    +            a=intest(co,ci);
    +            if (a<0 && a1==0)
    +            {
    +                k=co;
    +                a1=a;
    +            }
    +            if (a<0 && a1!=0 && a>a1)
    +            {
    +                k=co;
    +                a1=a;
    +            }
    +        }
    +    }
     
         return k;
    -    } /* end of nearout() */
    +} /* end of nearout() */
     
     double GlyphToType3::intest(int co, int ci)
    -	{
    -	int i, j, start, end;
    -	double r1, r2, a;
    -	FWord xi[3], yi[3];
    -
    -	j=start=(co==0)?0:(epts_ctr[co-1]+1);
    -	end=epts_ctr[co];
    -	i=(ci==0)?0:(epts_ctr[ci-1]+1);
    -	xi[0] = xcoor[i];
    -	yi[0] = ycoor[i];
    -	r1=sqr(xcoor[start] - xi[0]) + sqr(ycoor[start] - yi[0]);
    -
    -	for (i=start; i<=end; i++) {
    -		r2 = sqr(xcoor[i] - xi[0])+sqr(ycoor[i] - yi[0]);
    -		if (r2 < r1) {
    -			r1=r2; j=i;
    -		}
    -	}
    -	xi[1]=xcoor[j-1]; yi[1]=ycoor[j-1];
    -	xi[2]=xcoor[j+1]; yi[2]=ycoor[j+1];
    -        if (j==start) { xi[1]=xcoor[end]; yi[1]=ycoor[end]; }
    -	if (j==end) { xi[2]=xcoor[start]; yi[2]=ycoor[start]; }
    -	a=area(xi, yi, 3);
    +{
    +    int i, j, start, end;
    +    double r1, r2, a;
    +    FWord xi[3], yi[3];
    +
    +    j=start=(co==0)?0:(epts_ctr[co-1]+1);
    +    end=epts_ctr[co];
    +    i=(ci==0)?0:(epts_ctr[ci-1]+1);
    +    xi[0] = xcoor[i];
    +    yi[0] = ycoor[i];
    +    r1=sqr(xcoor[start] - xi[0]) + sqr(ycoor[start] - yi[0]);
    +
    +    for (i=start; i<=end; i++)
    +    {
    +        r2 = sqr(xcoor[i] - xi[0])+sqr(ycoor[i] - yi[0]);
    +        if (r2 < r1)
    +        {
    +            r1=r2;
    +            j=i;
    +        }
    +    }
    +    if (j==start)
    +    {
    +        xi[1]=xcoor[end];
    +        yi[1]=ycoor[end];
    +    }
    +    else
    +    {
    +        xi[1]=xcoor[j-1];
    +        yi[1]=ycoor[j-1];
    +    }
    +    if (j==end)
    +    {
    +        xi[2]=xcoor[start];
    +        yi[2]=ycoor[start];
    +    }
    +    else
    +    {
    +        xi[2]=xcoor[j+1];
    +        yi[2]=ycoor[j+1];
    +    }
    +    a=area(xi, yi, 3);
     
    -	return a;
    -	} /* end of intest() */
    +    return a;
    +} /* end of intest() */
     
    -void GlyphToType3::PSMoveto(TTStreamWriter& stream, int x, int y) {
    +void GlyphToType3::PSMoveto(TTStreamWriter& stream, int x, int y)
    +{
         stream.printf(pdf_mode ? "%d %d m\n" : "%d %d _m\n",
    -		  x, y);
    +                  x, y);
     }
     
    -void GlyphToType3::PSLineto(TTStreamWriter& stream, int x, int y) {
    +void GlyphToType3::PSLineto(TTStreamWriter& stream, int x, int y)
    +{
         stream.printf(pdf_mode ? "%d %d l\n" : "%d %d _l\n",
    -		  x, y);
    +                  x, y);
     }
     
     /*
     ** Emmit a PostScript "curveto" command.
     */
     void GlyphToType3::PSCurveto(TTStreamWriter& stream, FWord x, FWord y, int s, int t)
    -     {
    -     int N, i;
    -     double sx[3], sy[3], cx[4], cy[4];
    -
    -     N = t-s+2;
    -     for(i=0; i num_pts )
    -		throw TTException("Error in TT flags");
    -
    -	    while (ct--)
    -		tt_flags[x++] = c;
    -	    }
    -	}
    +        if (c&8)                /* If next byte is repeat count, */
    +        {
    +            ct = *(glyph++);
    +
    +            if ( (x + ct) > num_pts )
    +            {
    +                throw TTException("Error in TT flags");
    +            }
    +
    +            while (ct--)
    +            {
    +                tt_flags[x++] = c;
    +            }
    +        }
    +    }
     
         /* Read the x coordinates */
         for (x = 0; x < num_pts; x++)
    -	{
    -	if (tt_flags[x] & 2)		/* one byte value with */
    -	    {				/* external sign */
    -	    c = *(glyph++);
    -	    xcoor[x] = (tt_flags[x] & 0x10) ? c : (-1 * (int)c);
    -	    }
    -	else if(tt_flags[x] & 0x10)	/* repeat last */
    -	    {
    -	    xcoor[x] = 0;
    -	    }
    -	else				/* two byte signed value */
    -	    {
    -	    xcoor[x] = getFWord(glyph);
    -	    glyph+=2;
    -	    }
    -	}
    +    {
    +        if (tt_flags[x] & 2)            /* one byte value with */
    +        {
    +            /* external sign */
    +            c = *(glyph++);
    +            xcoor[x] = (tt_flags[x] & 0x10) ? c : (-1 * (int)c);
    +        }
    +        else if (tt_flags[x] & 0x10)    /* repeat last */
    +        {
    +            xcoor[x] = 0;
    +        }
    +        else                            /* two byte signed value */
    +        {
    +            xcoor[x] = getFWord(glyph);
    +            glyph+=2;
    +        }
    +    }
     
         /* Read the y coordinates */
    -    for(x = 0; x < num_pts; x++)
    -	{
    -	if (tt_flags[x] & 4)		/* one byte value with */
    -	    {				/* external sign */
    -	    c = *(glyph++);
    -	    ycoor[x] = (tt_flags[x] & 0x20) ? c : (-1 * (int)c);
    -	    }
    -	else if (tt_flags[x] & 0x20)	/* repeat last value */
    -	     {
    -	     ycoor[x] = 0;
    -	     }
    -	else				/* two byte signed value */
    -	     {
    -	     ycoor[x] = getUSHORT(glyph);
    -	     glyph+=2;
    -	     }
    -	 }
    -
    -     /* Convert delta values to absolute values. */
    -     for(x = 1; x < num_pts; x++)
    -	{
    -	xcoor[x] += xcoor[x-1];
    -	ycoor[x] += ycoor[x-1];
    -	}
    -
    -     for(x=0; x < num_pts; x++)
    -	{
    -	xcoor[x] = topost(xcoor[x]);
    -	ycoor[x] = topost(ycoor[x]);
    -	}
    +    for (x = 0; x < num_pts; x++)
    +    {
    +        if (tt_flags[x] & 4)            /* one byte value with */
    +        {
    +            /* external sign */
    +            c = *(glyph++);
    +            ycoor[x] = (tt_flags[x] & 0x20) ? c : (-1 * (int)c);
    +        }
    +        else if (tt_flags[x] & 0x20)    /* repeat last value */
    +        {
    +            ycoor[x] = 0;
    +        }
    +        else                            /* two byte signed value */
    +        {
    +            ycoor[x] = getUSHORT(glyph);
    +            glyph+=2;
    +        }
    +    }
     
    -     } /* end of load_char() */
    +    /* Convert delta values to absolute values. */
    +    for (x = 1; x < num_pts; x++)
    +    {
    +        xcoor[x] += xcoor[x-1];
    +        ycoor[x] += ycoor[x-1];
    +    }
    +
    +    for (x=0; x < num_pts; x++)
    +    {
    +        xcoor[x] = topost(xcoor[x]);
    +        ycoor[x] = topost(ycoor[x]);
    +    }
    +
    +} /* end of load_char() */
     
     /*
     ** Emmit PostScript code for a composite character.
     */
     void GlyphToType3::do_composite(TTStreamWriter& stream, struct TTFONT *font, BYTE *glyph)
    -    {
    +{
         USHORT flags;
         USHORT glyphIndex;
         int arg1;
    @@ -515,136 +568,153 @@
         USHORT scale10;
     
         /* Once around this loop for each component. */
    -    do	{
    -	flags = getUSHORT(glyph);	/* read the flags word */
    -	glyph += 2;
    -
    -	glyphIndex = getUSHORT(glyph);	/* read the glyphindex word */
    -	glyph += 2;
    -
    -	if(flags & ARG_1_AND_2_ARE_WORDS)
    -	    {			/* The tt spec. seems to say these are signed. */
    -	    arg1 = getSHORT(glyph);
    -	    glyph += 2;
    -	    arg2 = getSHORT(glyph);
    -	    glyph += 2;
    -	    }
    -    	else			/* The tt spec. does not clearly indicate */
    -    	    {			/* whether these values are signed or not. */
    -              arg1 = *(signed char *)(glyph++);
    -              arg2 = *(signed char *)(glyph++);
    -	    }
    -
    -	if(flags & WE_HAVE_A_SCALE)
    -	    {
    -	    xscale = yscale = getUSHORT(glyph);
    -	    glyph += 2;
    -	    scale01 = scale10 = 0;
    -	    }
    -	else if(flags & WE_HAVE_AN_X_AND_Y_SCALE)
    -	    {
    -	    xscale = getUSHORT(glyph);
    -	    glyph += 2;
    -	    yscale = getUSHORT(glyph);
    -	    glyph += 2;
    -	    scale01 = scale10 = 0;
    -	    }
    -	else if(flags & WE_HAVE_A_TWO_BY_TWO)
    -	    {
    -	    xscale = getUSHORT(glyph);
    -	    glyph += 2;
    -	    scale01 = getUSHORT(glyph);
    -	    glyph += 2;
    -	    scale10 = getUSHORT(glyph);
    -	    glyph += 2;
    -	    yscale = getUSHORT(glyph);
    -	    glyph += 2;
    -	    }
    -	else
    -	    {
    -	    xscale = yscale = scale01 = scale10 = 0;
    -	    }
    -
    -	/* Debugging */
    -	#ifdef DEBUG_TRUETYPE
    -	stream.printf("%% flags=%d, arg1=%d, arg2=%d, xscale=%d, yscale=%d, scale01=%d, scale10=%d\n",
    -		(int)flags,arg1,arg2,(int)xscale,(int)yscale,(int)scale01,(int)scale10);
    -	#endif
    -
    -	if (pdf_mode) {
    -	    if ( flags & ARGS_ARE_XY_VALUES ) {
    -		/* We should have been able to use 'Do' to reference the
    -		   subglyph here.  However, that doesn't seem to work with
    -		   xpdf or gs (only acrobat), so instead, this just includes
    -		   the subglyph here inline. */
    -		stream.printf("q 1 0 0 1 %d %d cm\n", topost(arg1), topost(arg2));
    -	    } else {
    -		    stream.printf("%% unimplemented shift, arg1=%d, arg2=%d\n",arg1,arg2);
    -	    }
    -	    GlyphToType3(stream, font, glyphIndex, true);
    -	    if ( flags & ARGS_ARE_XY_VALUES ) {
    -		stream.printf("\nQ\n");
    -	    }
    -	} else {
    -	    /* If we have an (X,Y) shif and it is non-zero, */
    -	    /* translate the coordinate system. */
    -	    if( flags & ARGS_ARE_XY_VALUES )
    -		{
    -		    if( arg1 != 0 || arg2 != 0 )
    -			stream.printf("gsave %d %d translate\n", topost(arg1), topost(arg2) );
    -		}
    -	    else
    -		{
    -		    stream.printf("%% unimplemented shift, arg1=%d, arg2=%d\n",arg1,arg2);
    -		}
    -
    -	    /* Invoke the CharStrings procedure to print the component. */
    -	    stream.printf("false CharStrings /%s get exec\n",
    -			  ttfont_CharStrings_getname(font,glyphIndex));
    -
    -	    /* If we translated the coordinate system, */
    -	    /* put it back the way it was. */
    -	    if( flags & ARGS_ARE_XY_VALUES && (arg1 != 0 || arg2 != 0) ) {
    -		stream.puts("grestore ");
    -	    }
    -	}
    +    do
    +    {
    +        flags = getUSHORT(glyph);       /* read the flags word */
    +        glyph += 2;
     
    -	} while(flags & MORE_COMPONENTS);
    +        glyphIndex = getUSHORT(glyph);  /* read the glyphindex word */
    +        glyph += 2;
     
    -    } /* end of do_composite() */
    +        if (flags & ARG_1_AND_2_ARE_WORDS)
    +        {
    +            /* The tt spec. seems to say these are signed. */
    +            arg1 = getSHORT(glyph);
    +            glyph += 2;
    +            arg2 = getSHORT(glyph);
    +            glyph += 2;
    +        }
    +        else                    /* The tt spec. does not clearly indicate */
    +        {
    +            /* whether these values are signed or not. */
    +            arg1 = *(signed char *)(glyph++);
    +            arg2 = *(signed char *)(glyph++);
    +        }
    +
    +        if (flags & WE_HAVE_A_SCALE)
    +        {
    +            xscale = yscale = getUSHORT(glyph);
    +            glyph += 2;
    +            scale01 = scale10 = 0;
    +        }
    +        else if (flags & WE_HAVE_AN_X_AND_Y_SCALE)
    +        {
    +            xscale = getUSHORT(glyph);
    +            glyph += 2;
    +            yscale = getUSHORT(glyph);
    +            glyph += 2;
    +            scale01 = scale10 = 0;
    +        }
    +        else if (flags & WE_HAVE_A_TWO_BY_TWO)
    +        {
    +            xscale = getUSHORT(glyph);
    +            glyph += 2;
    +            scale01 = getUSHORT(glyph);
    +            glyph += 2;
    +            scale10 = getUSHORT(glyph);
    +            glyph += 2;
    +            yscale = getUSHORT(glyph);
    +            glyph += 2;
    +        }
    +        else
    +        {
    +            xscale = yscale = scale01 = scale10 = 0;
    +        }
    +
    +        /* Debugging */
    +#ifdef DEBUG_TRUETYPE
    +        stream.printf("%% flags=%d, arg1=%d, arg2=%d, xscale=%d, yscale=%d, scale01=%d, scale10=%d\n",
    +                      (int)flags,arg1,arg2,(int)xscale,(int)yscale,(int)scale01,(int)scale10);
    +#endif
    +
    +        if (pdf_mode)
    +        {
    +            if ( flags & ARGS_ARE_XY_VALUES )
    +            {
    +                /* We should have been able to use 'Do' to reference the
    +                   subglyph here.  However, that doesn't seem to work with
    +                   xpdf or gs (only acrobat), so instead, this just includes
    +                   the subglyph here inline. */
    +                stream.printf("q 1 0 0 1 %d %d cm\n", topost(arg1), topost(arg2));
    +            }
    +            else
    +            {
    +                stream.printf("%% unimplemented shift, arg1=%d, arg2=%d\n",arg1,arg2);
    +            }
    +            GlyphToType3(stream, font, glyphIndex, true);
    +            if ( flags & ARGS_ARE_XY_VALUES )
    +            {
    +                stream.printf("\nQ\n");
    +            }
    +        }
    +        else
    +        {
    +            /* If we have an (X,Y) shif and it is non-zero, */
    +            /* translate the coordinate system. */
    +            if ( flags & ARGS_ARE_XY_VALUES )
    +            {
    +                if ( arg1 != 0 || arg2 != 0 )
    +                    stream.printf("gsave %d %d translate\n", topost(arg1), topost(arg2) );
    +            }
    +            else
    +            {
    +                stream.printf("%% unimplemented shift, arg1=%d, arg2=%d\n",arg1,arg2);
    +            }
    +
    +            /* Invoke the CharStrings procedure to print the component. */
    +            stream.printf("false CharStrings /%s get exec\n",
    +                          ttfont_CharStrings_getname(font,glyphIndex));
    +
    +            /* If we translated the coordinate system, */
    +            /* put it back the way it was. */
    +            if ( flags & ARGS_ARE_XY_VALUES && (arg1 != 0 || arg2 != 0) )
    +            {
    +                stream.puts("grestore ");
    +            }
    +        }
    +
    +    }
    +    while (flags & MORE_COMPONENTS);
    +
    +} /* end of do_composite() */
     
     /*
     ** Return a pointer to a specific glyph's data.
     */
     BYTE *find_glyph_data(struct TTFONT *font, int charindex)
    -    {
    +{
         ULONG off;
         ULONG length;
     
         /* Read the glyph offset from the index to location table. */
    -    if(font->indexToLocFormat == 0)
    -	{
    -	off = getUSHORT( font->loca_table + (charindex * 2) );
    -	off *= 2;
    -	length = getUSHORT( font->loca_table + ((charindex+1) * 2) );
    -	length *= 2;
    -	length -= off;
    -	}
    +    if (font->indexToLocFormat == 0)
    +    {
    +        off = getUSHORT( font->loca_table + (charindex * 2) );
    +        off *= 2;
    +        length = getUSHORT( font->loca_table + ((charindex+1) * 2) );
    +        length *= 2;
    +        length -= off;
    +    }
         else
    -	{
    -	off = getULONG( font->loca_table + (charindex * 4) );
    -	length = getULONG( font->loca_table + ((charindex+1) * 4) );
    -	length -= off;
    -	}
    +    {
    +        off = getULONG( font->loca_table + (charindex * 4) );
    +        length = getULONG( font->loca_table + ((charindex+1) * 4) );
    +        length -= off;
    +    }
     
    -    if(length > 0)
    -    	return font->glyf_table + off;
    +    if (length > 0)
    +    {
    +        return font->glyf_table + off;
    +    }
         else
    -    	return (BYTE*)NULL;
    +    {
    +        return (BYTE*)NULL;
    +    }
     
    -    } /* end of find_glyph_data() */
    +} /* end of find_glyph_data() */
     
    -GlyphToType3::GlyphToType3(TTStreamWriter& stream, struct TTFONT *font, int charindex, bool embedded /* = false */) {
    +GlyphToType3::GlyphToType3(TTStreamWriter& stream, struct TTFONT *font, int charindex, bool embedded /* = false */)
    +{
         BYTE *glyph;
     
         tt_flags = NULL;
    @@ -662,62 +732,86 @@
     
         /* If the character is blank, it has no bounding box, */
         /* otherwise read the bounding box. */
    -    if( glyph == (BYTE*)NULL )
    -    	{
    -	llx=lly=urx=ury=0;	/* A blank char has an all zero BoundingBox */
    -	num_ctr=0;		/* Set this for later if()s */
    -    	}
    +    if ( glyph == (BYTE*)NULL )
    +    {
    +        llx=lly=urx=ury=0;      /* A blank char has an all zero BoundingBox */
    +        num_ctr=0;              /* Set this for later if()s */
    +    }
         else
    -	{
    -	/* Read the number of contours. */
    -	num_ctr = getSHORT(glyph);
    -
    -	/* Read PostScript bounding box. */
    -	llx = getFWord(glyph + 2);
    -	lly = getFWord(glyph + 4);
    -	urx = getFWord(glyph + 6);
    -	ury = getFWord(glyph + 8);
    -
    -	/* Advance the pointer. */
    -	glyph += 10;
    -	}
    +    {
    +        /* Read the number of contours. */
    +        num_ctr = getSHORT(glyph);
    +
    +        /* Read PostScript bounding box. */
    +        llx = getFWord(glyph + 2);
    +        lly = getFWord(glyph + 4);
    +        urx = getFWord(glyph + 6);
    +        ury = getFWord(glyph + 8);
    +
    +        /* Advance the pointer. */
    +        glyph += 10;
    +    }
     
         /* If it is a simple character, load its data. */
         if (num_ctr > 0)
    -	load_char(font, glyph);
    +    {
    +        load_char(font, glyph);
    +    }
         else
    +    {
             num_pts=0;
    +    }
     
         /* Consult the horizontal metrics table to determine */
         /* the character width. */
    -    if( charindex < font->numberOfHMetrics )
    -	advance_width = getuFWord( font->hmtx_table + (charindex * 4) );
    +    if ( charindex < font->numberOfHMetrics )
    +    {
    +        advance_width = getuFWord( font->hmtx_table + (charindex * 4) );
    +    }
         else
    -    	advance_width = getuFWord( font->hmtx_table + ((font->numberOfHMetrics-1) * 4) );
    +    {
    +        advance_width = getuFWord( font->hmtx_table + ((font->numberOfHMetrics-1) * 4) );
    +    }
     
         /* Execute setcachedevice in order to inform the font machinery */
         /* of the character bounding box and advance width. */
         stack(stream, 7);
    -    if (pdf_mode) {
    -	if (!embedded)
    -	    stream.printf("%d 0 %d %d %d %d d1\n",
    -			  topost(advance_width),
    -			  topost(llx), topost(lly), topost(urx), topost(ury) );
    -    } else
    -	stream.printf("%d 0 %d %d %d %d _sc\n",
    -		      topost(advance_width),
    -		      topost(llx), topost(lly), topost(urx), topost(ury) );
    +    if (pdf_mode)
    +    {
    +        if (!embedded) {
    +            stream.printf("%d 0 %d %d %d %d d1\n",
    +                          topost(advance_width),
    +                          topost(llx), topost(lly), topost(urx), topost(ury) );
    +        }
    +    }
    +    else if (font->target_type == PS_TYPE_42_3_HYBRID)
    +    {
    +        stream.printf("pop gsave .001 .001 scale %d 0 %d %d %d %d setcachedevice\n",
    +                      topost(advance_width),
    +                      topost(llx), topost(lly), topost(urx), topost(ury) );
    +    }
    +    else
    +    {
    +        stream.printf("%d 0 %d %d %d %d _sc\n",
    +                      topost(advance_width),
    +                      topost(llx), topost(lly), topost(urx), topost(ury) );
    +    }
     
         /* If it is a simple glyph, convert it, */
         /* otherwise, close the stack business. */
    -    if( num_ctr > 0 )		/* simple */
    -	{
    +    if ( num_ctr > 0 )          /* simple */
    +    {
             PSConvert(stream);
    -	}
    -    else if( num_ctr < 0 )	/* composite */
    -	{
    -	  do_composite(stream, font, glyph);
    -	}
    +    }
    +    else if ( num_ctr < 0 )     /* composite */
    +    {
    +        do_composite(stream, font, glyph);
    +    }
    +
    +    if (font->target_type == PS_TYPE_42_3_HYBRID)
    +    {
    +        stream.printf("\ngrestore\n");
    +    }
     
         stack_end(stream);
     }
    @@ -726,8 +820,8 @@
     ** This is the routine which is called from pprdrv_tt.c.
     */
     void tt_type3_charproc(TTStreamWriter& stream, struct TTFONT *font, int charindex)
    -    {
    -      GlyphToType3 glyph(stream, font, charindex);
    +{
    +    GlyphToType3 glyph(stream, font, charindex);
     } /* end of tt_type3_charproc() */
     
     /*
    @@ -735,55 +829,73 @@
     ** This function adds all of the dependencies of those composite
     ** glyphs to the glyph id vector.  Michael Droettboom [06-07-07]
     */
    -void ttfont_add_glyph_dependencies(struct TTFONT *font, std::vector& glyph_ids) {
    +void ttfont_add_glyph_dependencies(struct TTFONT *font, std::vector& glyph_ids)
    +{
         std::sort(glyph_ids.begin(), glyph_ids.end());
     
         std::stack glyph_stack;
         for (std::vector::iterator i = glyph_ids.begin();
    -	 i != glyph_ids.end(); ++i) {
    -	glyph_stack.push(*i);
    +            i != glyph_ids.end(); ++i)
    +    {
    +        glyph_stack.push(*i);
         }
     
    -    while (glyph_stack.size()) {
    -	int gind = glyph_stack.top();
    -	glyph_stack.pop();
    -
    -	BYTE* glyph = find_glyph_data( font, gind );
    -	if (glyph != (BYTE*)NULL) {
    -
    -	    int num_ctr = getSHORT(glyph);
    -	    if (num_ctr <= 0) { // This is a composite glyph
    -
    -		glyph += 10;
    -		USHORT flags = 0;
    -
    -		do {
    -		    flags = getUSHORT(glyph);
    -		    glyph += 2;
    -		    gind = (int)getUSHORT(glyph);
    -		    glyph += 2;
    -
    -		    std::vector::iterator insertion =
    -			std::lower_bound(glyph_ids.begin(), glyph_ids.end(), gind);
    -		    if (*insertion != gind) {
    -			glyph_ids.insert(insertion, gind);
    -			glyph_stack.push(gind);
    -		    }
    -
    -		    if (flags & ARG_1_AND_2_ARE_WORDS)
    -			glyph += 4;
    -		    else
    -			glyph += 2;
    -
    -		    if (flags & WE_HAVE_A_SCALE)
    -			glyph += 2;
    -		    else if (flags & WE_HAVE_AN_X_AND_Y_SCALE)
    -			glyph += 4;
    -		    else if (flags & WE_HAVE_A_TWO_BY_TWO)
    -			glyph += 8;
    -		} while (flags & MORE_COMPONENTS);
    -	    }
    -	}
    +    while (glyph_stack.size())
    +    {
    +        int gind = glyph_stack.top();
    +        glyph_stack.pop();
    +
    +        BYTE* glyph = find_glyph_data( font, gind );
    +        if (glyph != (BYTE*)NULL)
    +        {
    +
    +            int num_ctr = getSHORT(glyph);
    +            if (num_ctr <= 0)   // This is a composite glyph
    +            {
    +
    +                glyph += 10;
    +                USHORT flags = 0;
    +
    +                do
    +                {
    +                    flags = getUSHORT(glyph);
    +                    glyph += 2;
    +                    gind = (int)getUSHORT(glyph);
    +                    glyph += 2;
    +
    +                    std::vector::iterator insertion =
    +                        std::lower_bound(glyph_ids.begin(), glyph_ids.end(), gind);
    +                    if (*insertion != gind)
    +                    {
    +                        glyph_ids.insert(insertion, gind);
    +                        glyph_stack.push(gind);
    +                    }
    +
    +                    if (flags & ARG_1_AND_2_ARE_WORDS)
    +                    {
    +                        glyph += 4;
    +                    }
    +                    else
    +                    {
    +                        glyph += 2;
    +                    }
    +
    +                    if (flags & WE_HAVE_A_SCALE)
    +                    {
    +                        glyph += 2;
    +                    }
    +                    else if (flags & WE_HAVE_AN_X_AND_Y_SCALE)
    +                    {
    +                        glyph += 4;
    +                    }
    +                    else if (flags & WE_HAVE_A_TWO_BY_TWO)
    +                    {
    +                        glyph += 8;
    +                    }
    +                }
    +                while (flags & MORE_COMPONENTS);
    +            }
    +        }
         }
     }
     
    diff -Nru matplotlib-0.99.3/ttconv/pprdrv_tt.cpp matplotlib-1.0.1/ttconv/pprdrv_tt.cpp
    --- matplotlib-0.99.3/ttconv/pprdrv_tt.cpp	2009-07-31 15:14:43.000000000 +0000
    +++ matplotlib-1.0.1/ttconv/pprdrv_tt.cpp	2010-12-13 15:27:29.000000000 +0000
    @@ -1,3 +1,5 @@
    +/* -*- mode: c++; c-basic-offset: 4 -*- */
    +
     /*
      * Modified for use within matplotlib
      * 5 July 2007
    @@ -53,49 +55,49 @@
     ** Get an Unsigned 32 bit number.
     */
     ULONG getULONG(BYTE *p)
    -    {
    +{
         int x;
         ULONG val=0;
     
    -    for(x=0; x<4; x++)
    -	{
    -	val *= 0x100;
    -	val += p[x];
    -	}
    +    for (x=0; x<4; x++)
    +    {
    +        val *= 0x100;
    +        val += p[x];
    +    }
     
         return val;
    -    } /* end of ftohULONG() */
    +} /* end of ftohULONG() */
     
     /*
     ** Get an unsigned 16 bit number.
     */
     USHORT getUSHORT(BYTE *p)
    -    {
    +{
         int x;
         USHORT val=0;
     
    -    for(x=0; x<2; x++)
    -	{
    -	val *= 0x100;
    -	val += p[x];
    -	}
    +    for (x=0; x<2; x++)
    +    {
    +        val *= 0x100;
    +        val += p[x];
    +    }
     
         return val;
    -    } /* end of getUSHORT() */
    +} /* end of getUSHORT() */
     
     /*
     ** Get a 32 bit fixed point (16.16) number.
     ** A special structure is used to return the value.
     */
     Fixed getFixed(BYTE *s)
    -    {
    +{
         Fixed val={0,0};
     
         val.whole = ((s[0] * 256) + s[1]);
         val.fraction = ((s[2] * 256) + s[3]);
     
         return val;
    -    } /* end of getFixed() */
    +} /* end of getFixed() */
     
     /*-----------------------------------------------------------------------
     ** Load a TrueType font table into memory and return a pointer to it.
    @@ -108,52 +110,61 @@
     ** padding spaces.
     -----------------------------------------------------------------------*/
     BYTE *GetTable(struct TTFONT *font, const char *name)
    -    {
    +{
         BYTE *ptr;
         ULONG x;
     
    -    #ifdef DEBUG_TRUETYPE
    +#ifdef DEBUG_TRUETYPE
         debug("GetTable(file,font,\"%s\")",name);
    -    #endif
    +#endif
     
         /* We must search the table directory. */
         ptr = font->offset_table + 12;
         x=0;
    -    while(TRUE)
    -    	{
    -	  if( strncmp((const char*)ptr,name,4) == 0 )
    -	    {
    -	    ULONG offset,length;
    -	    BYTE *table;
    -
    -	    offset = getULONG( ptr + 8 );
    -	    length = getULONG( ptr + 12 );
    -	    table = (BYTE*)calloc( sizeof(BYTE), length );
    +    while (TRUE)
    +    {
    +        if ( strncmp((const char*)ptr,name,4) == 0 )
    +        {
    +            ULONG offset,length;
    +            BYTE *table;
    +
    +            offset = getULONG( ptr + 8 );
    +            length = getULONG( ptr + 12 );
    +            table = (BYTE*)calloc( sizeof(BYTE), length );
     
    -	    try {
    +            try
    +            {
     #ifdef DEBUG_TRUETYPE
    -	      debug("Loading table \"%s\" from offset %d, %d bytes",name,offset,length);
    +                debug("Loading table \"%s\" from offset %d, %d bytes",name,offset,length);
     #endif
     
    -	      if( fseek( font->file, (long)offset, SEEK_SET ) )
    -	    	throw TTException("TrueType font may be corrupt (reason 3)");
    -
    -	      if( fread(table,sizeof(BYTE),length,font->file) != (sizeof(BYTE) * length))
    -		throw TTException("TrueType font may be corrupt (reason 4)");
    -	    } catch (TTException& ) {
    -	      free(table);
    -	      throw;
    -	    }
    -	    return table;
    -	    }
    -
    -    	x++;
    -    	ptr += 16;
    -    	if(x == font->numTables)
    -	    throw TTException("TrueType font is missing table");
    -    	}
    +                if ( fseek( font->file, (long)offset, SEEK_SET ) )
    +                {
    +                    throw TTException("TrueType font may be corrupt (reason 3)");
    +                }
    +
    +                if ( fread(table,sizeof(BYTE),length,font->file) != (sizeof(BYTE) * length))
    +                {
    +                    throw TTException("TrueType font may be corrupt (reason 4)");
    +                }
    +            }
    +            catch (TTException& )
    +            {
    +                free(table);
    +                throw;
    +            }
    +            return table;
    +        }
    +
    +        x++;
    +        ptr += 16;
    +        if (x == font->numTables)
    +        {
    +            throw TTException("TrueType font is missing table");
    +        }
    +    }
     
    -    } /* end of GetTable() */
    +} /* end of GetTable() */
     
     /*--------------------------------------------------------------------
     ** Load the 'name' table, get information from it,
    @@ -163,178 +174,181 @@
     ** the font, and it's PostScript name.
     --------------------------------------------------------------------*/
     void Read_name(struct TTFONT *font)
    -    {
    +{
         BYTE *table_ptr,*ptr2;
    -    int numrecords;			/* Number of strings in this table */
    -    BYTE *strings;			/* pointer to start of string storage */
    +    int numrecords;                     /* Number of strings in this table */
    +    BYTE *strings;                      /* pointer to start of string storage */
         int x;
    -    int platform,encoding;		/* Current platform id, encoding id, */
    -    int language,nameid;		/* language id, name id, */
    -    int offset,length;			/* offset and length of string. */
    +    int platform,encoding;              /* Current platform id, encoding id, */
    +    int language,nameid;                /* language id, name id, */
    +    int offset,length;                  /* offset and length of string. */
     
    -    #ifdef DEBUG_TRUETYPE
    +#ifdef DEBUG_TRUETYPE
         debug("Read_name()");
    -    #endif
    +#endif
     
         table_ptr = NULL;
     
         /* Set default values to avoid future references to undefined
          * pointers. Allocate each of PostName, FullName, FamilyName,
          * Version, and Style separately so they can be freed safely. */
    -    for (char **ptr = &(font->PostName); ptr != NULL; ) {
    -      *ptr = (char*) calloc(sizeof(char), strlen("unknown")+1);
    -      strcpy(*ptr, "unknown");
    -      if (ptr == &(font->PostName)) ptr = &(font->FullName);
    -      else if (ptr == &(font->FullName)) ptr = &(font->FamilyName);
    -      else if (ptr == &(font->FamilyName)) ptr = &(font->Version);
    -      else if (ptr == &(font->Version)) ptr = &(font->Style);
    -      else ptr = NULL;
    +    for (char **ptr = &(font->PostName); ptr != NULL; )
    +    {
    +        *ptr = (char*) calloc(sizeof(char), strlen("unknown")+1);
    +        strcpy(*ptr, "unknown");
    +        if (ptr == &(font->PostName)) ptr = &(font->FullName);
    +        else if (ptr == &(font->FullName)) ptr = &(font->FamilyName);
    +        else if (ptr == &(font->FamilyName)) ptr = &(font->Version);
    +        else if (ptr == &(font->Version)) ptr = &(font->Style);
    +        else ptr = NULL;
         }
         font->Copyright = font->Trademark = (char*)NULL;
     
    -    table_ptr = GetTable(font, "name");		/* pointer to table */
    -    try {
    -      numrecords = getUSHORT( table_ptr + 2 );	/* number of names */
    -      strings = table_ptr + getUSHORT( table_ptr + 4 );	/* start of string storage */
    -
    -      ptr2 = table_ptr + 6;
    -      for(x=0; x < numrecords; x++,ptr2+=12)
    -    	{
    -	  platform = getUSHORT(ptr2);
    -	  encoding = getUSHORT(ptr2+2);
    -	  language = getUSHORT(ptr2+4);
    -	  nameid = getUSHORT(ptr2+6);
    -	  length = getUSHORT(ptr2+8);
    -	  offset = getUSHORT(ptr2+10);
    +    table_ptr = GetTable(font, "name");         /* pointer to table */
    +    try
    +    {
    +        numrecords = getUSHORT( table_ptr + 2 );  /* number of names */
    +        strings = table_ptr + getUSHORT( table_ptr + 4 ); /* start of string storage */
    +
    +        ptr2 = table_ptr + 6;
    +        for (x=0; x < numrecords; x++,ptr2+=12)
    +        {
    +            platform = getUSHORT(ptr2);
    +            encoding = getUSHORT(ptr2+2);
    +            language = getUSHORT(ptr2+4);
    +            nameid = getUSHORT(ptr2+6);
    +            length = getUSHORT(ptr2+8);
    +            offset = getUSHORT(ptr2+10);
     
     #ifdef DEBUG_TRUETYPE
    -	  debug("platform %d, encoding %d, language 0x%x, name %d, offset %d, length %d",
    -		platform,encoding,language,nameid,offset,length);
    +            debug("platform %d, encoding %d, language 0x%x, name %d, offset %d, length %d",
    +                  platform,encoding,language,nameid,offset,length);
     #endif
     
    -	  /* Copyright notice */
    -	  if( platform == 1 && nameid == 0 )
    -	    {
    -	      font->Copyright = (char*)calloc(sizeof(char),length+1);
    -	      strncpy(font->Copyright,(const char*)strings+offset,length);
    -	      font->Copyright[length]=(char)NULL;
    -	      replace_newlines_with_spaces(font->Copyright);
    +            /* Copyright notice */
    +            if ( platform == 1 && nameid == 0 )
    +            {
    +                font->Copyright = (char*)calloc(sizeof(char),length+1);
    +                strncpy(font->Copyright,(const char*)strings+offset,length);
    +                font->Copyright[length]=(char)NULL;
    +                replace_newlines_with_spaces(font->Copyright);
     
     #ifdef DEBUG_TRUETYPE
    -	      debug("font->Copyright=\"%s\"",font->Copyright);
    +                debug("font->Copyright=\"%s\"",font->Copyright);
     #endif
    -	      continue;
    -	    }
    +                continue;
    +            }
     
     
    -	  /* Font Family name */
    -	  if( platform == 1 && nameid == 1 )
    -	    {
    -	      free(font->FamilyName);
    -	      font->FamilyName = (char*)calloc(sizeof(char),length+1);
    -	      strncpy(font->FamilyName,(const char*)strings+offset,length);
    -	      font->FamilyName[length]=(char)NULL;
    -	      replace_newlines_with_spaces(font->FamilyName);
    +            /* Font Family name */
    +            if ( platform == 1 && nameid == 1 )
    +            {
    +                free(font->FamilyName);
    +                font->FamilyName = (char*)calloc(sizeof(char),length+1);
    +                strncpy(font->FamilyName,(const char*)strings+offset,length);
    +                font->FamilyName[length]=(char)NULL;
    +                replace_newlines_with_spaces(font->FamilyName);
     
     #ifdef DEBUG_TRUETYPE
    -	      debug("font->FamilyName=\"%s\"",font->FamilyName);
    +                debug("font->FamilyName=\"%s\"",font->FamilyName);
     #endif
    -	      continue;
    -	    }
    +                continue;
    +            }
     
     
    -	  /* Font Family name */
    -	  if( platform == 1 && nameid == 2 )
    -	    {
    -	      free(font->Style);
    -	      font->Style = (char*)calloc(sizeof(char),length+1);
    -	      strncpy(font->Style,(const char*)strings+offset,length);
    -	      font->Style[length]=(char)NULL;
    -	      replace_newlines_with_spaces(font->Style);
    +            /* Font Family name */
    +            if ( platform == 1 && nameid == 2 )
    +            {
    +                free(font->Style);
    +                font->Style = (char*)calloc(sizeof(char),length+1);
    +                strncpy(font->Style,(const char*)strings+offset,length);
    +                font->Style[length]=(char)NULL;
    +                replace_newlines_with_spaces(font->Style);
     
     #ifdef DEBUG_TRUETYPE
    -	      debug("font->Style=\"%s\"",font->Style);
    +                debug("font->Style=\"%s\"",font->Style);
     #endif
    -	      continue;
    -	    }
    +                continue;
    +            }
     
     
    -	  /* Full Font name */
    -	  if( platform == 1 && nameid == 4 )
    -	    {
    -	      free(font->FullName);
    -	      font->FullName = (char*)calloc(sizeof(char),length+1);
    -	      strncpy(font->FullName,(const char*)strings+offset,length);
    -	      font->FullName[length]=(char)NULL;
    -	      replace_newlines_with_spaces(font->FullName);
    +            /* Full Font name */
    +            if ( platform == 1 && nameid == 4 )
    +            {
    +                free(font->FullName);
    +                font->FullName = (char*)calloc(sizeof(char),length+1);
    +                strncpy(font->FullName,(const char*)strings+offset,length);
    +                font->FullName[length]=(char)NULL;
    +                replace_newlines_with_spaces(font->FullName);
     
     #ifdef DEBUG_TRUETYPE
    -	      debug("font->FullName=\"%s\"",font->FullName);
    +                debug("font->FullName=\"%s\"",font->FullName);
     #endif
    -	      continue;
    -	    }
    +                continue;
    +            }
     
     
    -	  /* Version string */
    -	  if( platform == 1 && nameid == 5 )
    -	    {
    -	      free(font->Version);
    -	      font->Version = (char*)calloc(sizeof(char),length+1);
    -	      strncpy(font->Version,(const char*)strings+offset,length);
    -	      font->Version[length]=(char)NULL;
    -	      replace_newlines_with_spaces(font->Version);
    +            /* Version string */
    +            if ( platform == 1 && nameid == 5 )
    +            {
    +                free(font->Version);
    +                font->Version = (char*)calloc(sizeof(char),length+1);
    +                strncpy(font->Version,(const char*)strings+offset,length);
    +                font->Version[length]=(char)NULL;
    +                replace_newlines_with_spaces(font->Version);
     
     #ifdef DEBUG_TRUETYPE
    -	      debug("font->Version=\"%s\"",font->Version);
    +                debug("font->Version=\"%s\"",font->Version);
     #endif
    -	      continue;
    -	    }
    +                continue;
    +            }
     
     
    -	  /* PostScript name */
    -	  if( platform == 1 && nameid == 6 )
    -	    {
    -	      free(font->PostName);
    -	      font->PostName = (char*)calloc(sizeof(char),length+1);
    -	      strncpy(font->PostName,(const char*)strings+offset,length);
    -	      font->PostName[length]=(char)NULL;
    -	      replace_newlines_with_spaces(font->PostName);
    +            /* PostScript name */
    +            if ( platform == 1 && nameid == 6 )
    +            {
    +                free(font->PostName);
    +                font->PostName = (char*)calloc(sizeof(char),length+1);
    +                strncpy(font->PostName,(const char*)strings+offset,length);
    +                font->PostName[length]=(char)NULL;
    +                replace_newlines_with_spaces(font->PostName);
     
     #ifdef DEBUG_TRUETYPE
    -	      debug("font->PostName=\"%s\"",font->PostName);
    +                debug("font->PostName=\"%s\"",font->PostName);
     #endif
    -	      continue;
    -	    }
    +                continue;
    +            }
     
     
    -	  /* Trademark string */
    -	  if( platform == 1 && nameid == 7 )
    -	    {
    -	      font->Trademark = (char*)calloc(sizeof(char),length+1);
    -	      strncpy(font->Trademark,(const char*)strings+offset,length);
    -	      font->Trademark[length]=(char)NULL;
    -	      replace_newlines_with_spaces(font->Trademark);
    +            /* Trademark string */
    +            if ( platform == 1 && nameid == 7 )
    +            {
    +                font->Trademark = (char*)calloc(sizeof(char),length+1);
    +                strncpy(font->Trademark,(const char*)strings+offset,length);
    +                font->Trademark[length]=(char)NULL;
    +                replace_newlines_with_spaces(font->Trademark);
     
     #ifdef DEBUG_TRUETYPE
    -	      debug("font->Trademark=\"%s\"",font->Trademark);
    +                debug("font->Trademark=\"%s\"",font->Trademark);
     #endif
    -	      continue;
    -	    }
    -
    -    	}
    -    } catch (TTException& ) {
    -      free(table_ptr);
    -      throw;
    +                continue;
    +            }
    +        }
    +    }
    +    catch (TTException& )
    +    {
    +        free(table_ptr);
    +        throw;
         }
     
         free(table_ptr);
    -    } /* end of Read_name() */
    +} /* end of Read_name() */
     
     /*---------------------------------------------------------------------
     ** Write the header for a PostScript font.
     ---------------------------------------------------------------------*/
     void ttfont_header(TTStreamWriter& stream, struct TTFONT *font)
    -    {
    +{
         int VMMin;
         int VMMax;
     
    @@ -345,87 +359,127 @@
         ** specification on which the font is based and the
         ** font manufacturer's revision number for the font.
         */
    -    if( font->target_type == PS_TYPE_42 )
    -    	{
    -    	stream.printf("%%!PS-TrueTypeFont-%d.%d-%d.%d\n",
    -    		font->TTVersion.whole, font->TTVersion.fraction,
    -    		font->MfrRevision.whole, font->MfrRevision.fraction);
    -    	}
    +    if ( font->target_type == PS_TYPE_42 ||
    +            font->target_type == PS_TYPE_42_3_HYBRID)
    +    {
    +        stream.printf("%%!PS-TrueTypeFont-%d.%d-%d.%d\n",
    +                      font->TTVersion.whole, font->TTVersion.fraction,
    +                      font->MfrRevision.whole, font->MfrRevision.fraction);
    +    }
     
         /* If it is not a Type 42 font, we will use a different format. */
         else
    -    	{
    -    	stream.putline("%!PS-Adobe-3.0 Resource-Font");
    -    	}	/* See RBIIp 641 */
    +    {
    +        stream.putline("%!PS-Adobe-3.0 Resource-Font");
    +    }       /* See RBIIp 641 */
     
         /* We will make the title the name of the font. */
         stream.printf("%%%%Title: %s\n",font->FullName);
     
         /* If there is a Copyright notice, put it here too. */
    -    if( font->Copyright != (char*)NULL )
    -      stream.printf("%%%%Copyright: %s\n",font->Copyright);
    +    if ( font->Copyright != (char*)NULL )
    +    {
    +        stream.printf("%%%%Copyright: %s\n",font->Copyright);
    +    }
     
         /* We created this file. */
    -    if( font->target_type == PS_TYPE_42 )
    -	stream.putline("%%Creator: Converted from TrueType to type 42 by PPR");
    +    if ( font->target_type == PS_TYPE_42 )
    +    {
    +        stream.putline("%%Creator: Converted from TrueType to type 42 by PPR");
    +    }
    +    else if (font->target_type == PS_TYPE_42_3_HYBRID)
    +    {
    +        stream.putline("%%Creator: Converted from TypeType to type 42/type 3 hybrid by PPR");
    +    }
         else
    -	stream.putline("%%Creator: Converted from TrueType by PPR");
    +    {
    +        stream.putline("%%Creator: Converted from TrueType to type 3 by PPR");
    +    }
     
         /* If VM usage information is available, print it. */
    -    if( font->target_type == PS_TYPE_42 )
    -    	{
    -	VMMin = (int)getULONG( font->post_table + 16 );
    -	VMMax = (int)getULONG( font->post_table + 20 );
    -	if( VMMin > 0 && VMMax > 0 )
    -	    stream.printf("%%%%VMUsage: %d %d\n",VMMin,VMMax);
    -    	}
    +    if ( font->target_type == PS_TYPE_42 || font->target_type == PS_TYPE_42_3_HYBRID)
    +    {
    +        VMMin = (int)getULONG( font->post_table + 16 );
    +        VMMax = (int)getULONG( font->post_table + 20 );
    +        if ( VMMin > 0 && VMMax > 0 )
    +            stream.printf("%%%%VMUsage: %d %d\n",VMMin,VMMax);
    +    }
     
         /* Start the dictionary which will eventually */
         /* become the font. */
    -    if( font->target_type != PS_TYPE_3 )
    -	{
    -	stream.putline("15 dict begin");
    -	}
    +    if (font->target_type == PS_TYPE_42)
    +    {
    +        stream.putline("15 dict begin");
    +    }
         else
    -	{
    -	stream.putline("25 dict begin");
    +    {
    +        stream.putline("25 dict begin");
     
    -    	/* Type 3 fonts will need some subroutines here. */
    -	stream.putline("/_d{bind def}bind def");
    -	stream.putline("/_m{moveto}_d");
    -	stream.putline("/_l{lineto}_d");
    -	stream.putline("/_cl{closepath eofill}_d");
    -	stream.putline("/_c{curveto}_d");
    -	stream.putline("/_sc{7 -1 roll{setcachedevice}{pop pop pop pop pop pop}ifelse}_d");
    -	stream.putline("/_e{exec}_d");
    -	}
    +        /* Type 3 fonts will need some subroutines here. */
    +        stream.putline("/_d{bind def}bind def");
    +        stream.putline("/_m{moveto}_d");
    +        stream.putline("/_l{lineto}_d");
    +        stream.putline("/_cl{closepath eofill}_d");
    +        stream.putline("/_c{curveto}_d");
    +        stream.putline("/_sc{7 -1 roll{setcachedevice}{pop pop pop pop pop pop}ifelse}_d");
    +        stream.putline("/_e{exec}_d");
    +    }
     
         stream.printf("/FontName /%s def\n",font->PostName);
         stream.putline("/PaintType 0 def");
     
    -    if(font->target_type == PS_TYPE_42)
    -	stream.putline("/FontMatrix[1 0 0 1 0 0]def");
    +    if (font->target_type == PS_TYPE_42 || font->target_type == PS_TYPE_42_3_HYBRID)
    +    {
    +        stream.putline("/FontMatrix[1 0 0 1 0 0]def");
    +    }
         else
    -	stream.putline("/FontMatrix[.001 0 0 .001 0 0]def");
    +    {
    +        stream.putline("/FontMatrix[.001 0 0 .001 0 0]def");
    +    }
     
         stream.printf("/FontBBox[%d %d %d %d]def\n",font->llx,font->lly,font->urx,font->ury);
    -    stream.printf("/FontType %d def\n", font->target_type );
    -    } /* end of ttfont_header() */
    +    if (font->target_type == PS_TYPE_42 || font->target_type == PS_TYPE_42_3_HYBRID)
    +    {
    +        stream.printf("/FontType 42 def\n", font->target_type );
    +    }
    +    else
    +    {
    +        stream.printf("/FontType 3 def\n", font->target_type );
    +    }
    +} /* end of ttfont_header() */
     
     /*-------------------------------------------------------------
     ** Define the encoding array for this font.
    -** It seems best to just use "Standard".
    +** Since we don't really want to deal with converting all of
    +** the possible font encodings in the wild to a standard PS
    +** one, we just explicitly create one for each font.
     -------------------------------------------------------------*/
    -void ttfont_encoding(TTStreamWriter& stream)
    +void ttfont_encoding(TTStreamWriter& stream, struct TTFONT *font, std::vector& glyph_ids, font_type_enum target_type)
    +{
    +    if (target_type == PS_TYPE_3 || target_type == PS_TYPE_42_3_HYBRID)
    +    {
    +        stream.printf("/Encoding [ ");
    +
    +        for (std::vector::const_iterator i = glyph_ids.begin();
    +                i != glyph_ids.end(); ++i)
    +        {
    +            const char* name = ttfont_CharStrings_getname(font, *i);
    +            stream.printf("/%s ", name);
    +        }
    +
    +        stream.printf("] def\n");
    +    }
    +    else
         {
    -    stream.putline("/Encoding StandardEncoding def");
    -    } /* end of ttfont_encoding() */
    +        stream.putline("/Encoding StandardEncoding def");
    +    }
    +} /* end of ttfont_encoding() */
     
     /*-----------------------------------------------------------
     ** Create the optional "FontInfo" sub-dictionary.
     -----------------------------------------------------------*/
     void ttfont_FontInfo(TTStreamWriter& stream, struct TTFONT *font)
    -    {
    +{
         Fixed ItalicAngle;
     
         /* We create a sub dictionary named "FontInfo" where we */
    @@ -438,14 +492,14 @@
         stream.printf("/FamilyName (%s) def\n",font->FamilyName);
         stream.printf("/FullName (%s) def\n",font->FullName);
     
    -    if( font->Copyright != (char*)NULL || font->Trademark != (char*)NULL )
    -    	{
    -    	stream.printf("/Notice (%s",
    -    		font->Copyright != (char*)NULL ? font->Copyright : "");
    -    	stream.printf("%s%s) def\n",
    -    		font->Trademark != (char*)NULL ? " " : "",
    -    		font->Trademark != (char*)NULL ? font->Trademark : "");
    -    	}
    +    if ( font->Copyright != (char*)NULL || font->Trademark != (char*)NULL )
    +    {
    +        stream.printf("/Notice (%s",
    +                      font->Copyright != (char*)NULL ? font->Copyright : "");
    +        stream.printf("%s%s) def\n",
    +                      font->Trademark != (char*)NULL ? " " : "",
    +                      font->Trademark != (char*)NULL ? font->Trademark : "");
    +    }
     
         /* This information is not quite correct. */
         stream.printf("/Weight (%s) def\n",font->Style);
    @@ -460,7 +514,7 @@
         stream.printf("/UnderlinePosition %d def\n", (int)getFWord( font->post_table + 8 ) );
         stream.printf("/UnderlineThickness %d def\n", (int)getFWord( font->post_table + 10 ) );
         stream.putline("end readonly def");
    -    } /* end of ttfont_FontInfo() */
    +} /* end of ttfont_FontInfo() */
     
     /*-------------------------------------------------------------------
     ** sfnts routines
    @@ -479,55 +533,55 @@
     ** This is called once at the start.
     */
     void sfnts_start(TTStreamWriter& stream)
    -    {
    +{
         stream.puts("/sfnts[<");
         in_string=TRUE;
         string_len=0;
         line_len=8;
    -    } /* end of sfnts_start() */
    +} /* end of sfnts_start() */
     
     /*
     ** Write a BYTE as a hexadecimal value as part of the sfnts array.
     */
     void sfnts_pputBYTE(TTStreamWriter& stream, BYTE n)
    -    {
    +{
         static const char hexdigits[]="0123456789ABCDEF";
     
    -    if(!in_string)
    -    	{
    -	stream.put_char('<');
    -    	string_len=0;
    -    	line_len++;
    -    	in_string=TRUE;
    -    	}
    +    if (!in_string)
    +    {
    +        stream.put_char('<');
    +        string_len=0;
    +        line_len++;
    +        in_string=TRUE;
    +    }
     
         stream.put_char( hexdigits[ n / 16 ] );
         stream.put_char( hexdigits[ n % 16 ] );
         string_len++;
         line_len+=2;
     
    -    if(line_len > 70)
    -   	{
    -   	stream.put_char('\n');
    -   	line_len=0;
    -   	}
    +    if (line_len > 70)
    +    {
    +        stream.put_char('\n');
    +        line_len=0;
    +    }
     
    -    } /* end of sfnts_pputBYTE() */
    +} /* end of sfnts_pputBYTE() */
     
     /*
     ** Write a USHORT as a hexadecimal value as part of the sfnts array.
     */
     void sfnts_pputUSHORT(TTStreamWriter& stream, USHORT n)
    -    {
    +{
         sfnts_pputBYTE(stream, n / 256);
         sfnts_pputBYTE(stream, n % 256);
    -    } /* end of sfnts_pputUSHORT() */
    +} /* end of sfnts_pputUSHORT() */
     
     /*
     ** Write a ULONG as part of the sfnts array.
     */
     void sfnts_pputULONG(TTStreamWriter& stream, ULONG n)
    -    {
    +{
         int x1,x2,x3;
     
         x1 = n % 256;
    @@ -541,7 +595,7 @@
         sfnts_pputBYTE(stream, x3);
         sfnts_pputBYTE(stream, x2);
         sfnts_pputBYTE(stream, x1);
    -    } /* end of sfnts_pputULONG() */
    +} /* end of sfnts_pputULONG() */
     
     /*
     ** This is called whenever it is
    @@ -551,21 +605,21 @@
     ** no longer than 64K characters.)
     */
     void sfnts_end_string(TTStreamWriter& stream)
    +{
    +    if (in_string)
         {
    -    if(in_string)
    -    	{
    -	string_len=0;		/* fool sfnts_pputBYTE() */
    -
    -	#ifdef DEBUG_TRUETYPE_INLINE
    -	puts("\n% dummy byte:\n");
    -	#endif
    -
    -	sfnts_pputBYTE(stream, 0);	/* extra byte for pre-2013 compatibility */
    -	stream.put_char('>');
    -	line_len++;
    -    	}
    +        string_len=0;           /* fool sfnts_pputBYTE() */
    +
    +#ifdef DEBUG_TRUETYPE_INLINE
    +        puts("\n% dummy byte:\n");
    +#endif
    +
    +        sfnts_pputBYTE(stream, 0);      /* extra byte for pre-2013 compatibility */
    +        stream.put_char('>');
    +        line_len++;
    +    }
         in_string=FALSE;
    -    } /* end of sfnts_end_string() */
    +} /* end of sfnts_end_string() */
     
     /*
     ** This is called at the start of each new table.
    @@ -574,10 +628,10 @@
     ** in the current string, a new one is started.
     */
     void sfnts_new_table(TTStreamWriter& stream, ULONG length)
    -    {
    -    if( (string_len + length) > 65528 )
    -      sfnts_end_string(stream);
    -    } /* end of sfnts_new_table() */
    +{
    +    if ( (string_len + length) > 65528 )
    +        sfnts_end_string(stream);
    +} /* end of sfnts_new_table() */
     
     /*
     ** We may have to break up the 'glyf' table.  That is the reason
    @@ -585,79 +639,88 @@
     ** array.
     */
     void sfnts_glyf_table(TTStreamWriter& stream, struct TTFONT *font, ULONG oldoffset, ULONG correct_total_length)
    -    {
    +{
         ULONG off;
         ULONG length;
         int c;
    -    ULONG total=0;		/* running total of bytes written to table */
    +    ULONG total=0;              /* running total of bytes written to table */
         int x;
    +    bool loca_is_local=false;
     
    -    #ifdef DEBUG_TRUETYPE
    +#ifdef DEBUG_TRUETYPE
         debug("sfnts_glyf_table(font,%d)", (int)correct_total_length);
    -    #endif
    +#endif
     
    -    assert(font->loca_table == NULL);
    -    font->loca_table = GetTable(font,"loca");
    +    if (font->loca_table == NULL)
    +    {
    +        font->loca_table = GetTable(font,"loca");
    +        loca_is_local = true;
    +    }
     
         /* Seek to proper position in the file. */
         fseek( font->file, oldoffset, SEEK_SET );
     
         /* Copy the glyphs one by one */
    -    for(x=0; x < font->numGlyphs; x++)
    -	{
    -	/* Read the glyph offset from the index-to-location table. */
    -	if(font->indexToLocFormat == 0)
    -	    {
    -	    off = getUSHORT( font->loca_table + (x * 2) );
    -	    off *= 2;
    -	    length = getUSHORT( font->loca_table + ((x+1) * 2) );
    -	    length *= 2;
    -	    length -= off;
    -	    }
    -	else
    -	    {
    -	    off = getULONG( font->loca_table + (x * 4) );
    -	    length = getULONG( font->loca_table + ((x+1) * 4) );
    -	    length -= off;
    -	    }
    -
    -	#ifdef DEBUG_TRUETYPE
    -	debug("glyph length=%d",(int)length);
    -	#endif
    -
    -	/* Start new string if necessary. */
    -	sfnts_new_table( stream, (int)length );
    -
    -	/*
    -	** Make sure the glyph is padded out to a
    -	** two byte boundary.
    -	*/
    -	if( length % 2 )
    -	    throw TTException("TrueType font contains a 'glyf' table without 2 byte padding");
    -
    -	/* Copy the bytes of the glyph. */
    -	while( length-- )
    -	    {
    -	    if( (c = fgetc(font->file)) == EOF )
    -	    	throw TTException("TrueType font may be corrupt (reason 6)");
    -
    -	    sfnts_pputBYTE(stream, c);
    -	    total++;		/* add to running total */
    -	    }
    +    for (x=0; x < font->numGlyphs; x++)
    +    {
    +        /* Read the glyph offset from the index-to-location table. */
    +        if (font->indexToLocFormat == 0)
    +        {
    +            off = getUSHORT( font->loca_table + (x * 2) );
    +            off *= 2;
    +            length = getUSHORT( font->loca_table + ((x+1) * 2) );
    +            length *= 2;
    +            length -= off;
    +        }
    +        else
    +        {
    +            off = getULONG( font->loca_table + (x * 4) );
    +            length = getULONG( font->loca_table + ((x+1) * 4) );
    +            length -= off;
    +        }
    +
    +#ifdef DEBUG_TRUETYPE
    +        debug("glyph length=%d",(int)length);
    +#endif
     
    -	}
    +        /* Start new string if necessary. */
    +        sfnts_new_table( stream, (int)length );
     
    -    free(font->loca_table);
    -    font->loca_table = NULL;
    +        /*
    +        ** Make sure the glyph is padded out to a
    +        ** two byte boundary.
    +        */
    +        if ( length % 2 ) {
    +            throw TTException("TrueType font contains a 'glyf' table without 2 byte padding");
    +        }
    +
    +        /* Copy the bytes of the glyph. */
    +        while ( length-- )
    +        {
    +            if ( (c = fgetc(font->file)) == EOF ) {
    +                throw TTException("TrueType font may be corrupt (reason 6)");
    +            }
    +
    +            sfnts_pputBYTE(stream, c);
    +            total++;            /* add to running total */
    +        }
    +
    +    }
    +
    +    if (loca_is_local)
    +    {
    +        free(font->loca_table);
    +        font->loca_table = NULL;
    +    }
     
         /* Pad out to full length from table directory */
    -    while( total < correct_total_length )
    -    	{
    -	  sfnts_pputBYTE(stream, 0);
    -    	total++;
    -    	}
    +    while ( total < correct_total_length )
    +    {
    +        sfnts_pputBYTE(stream, 0);
    +        total++;
    +    }
     
    -    } /* end of sfnts_glyf_table() */
    +} /* end of sfnts_glyf_table() */
     
     /*
     ** Here is the routine which ties it all together.
    @@ -666,33 +729,35 @@
     ** holds the actual TrueType data.
     */
     void ttfont_sfnts(TTStreamWriter& stream, struct TTFONT *font)
    +{
    +    static const char *table_names[] =  /* The names of all tables */
         {
    -    static const char *table_names[] =	/* The names of all tables */
    -      {			                /* which it is worth while */
    -    	"cvt ",			        /* to include in a Type 42 */
    -    	"fpgm",			        /* PostScript font. */
    -    	"glyf",
    -    	"head",
    -    	"hhea",
    -    	"hmtx",
    -    	"loca",
    -    	"maxp",
    -    	"prep"
    -    	} ;
    -
    -    struct {			/* The location of each of */
    -    	ULONG oldoffset;	/* the above tables. */
    -    	ULONG newoffset;
    -    	ULONG length;
    -    	ULONG checksum;
    -    	} tables[9];
    -
    -    BYTE *ptr;			/* A pointer into the origional table directory. */
    -    ULONG x,y;			/* General use loop countes. */
    -    int c;			/* Input character. */
    +        /* which it is worth while */
    +        "cvt ",                         /* to include in a Type 42 */
    +        "fpgm",                         /* PostScript font. */
    +        "glyf",
    +        "head",
    +        "hhea",
    +        "hmtx",
    +        "loca",
    +        "maxp",
    +        "prep"
    +    } ;
    +
    +    struct                      /* The location of each of */
    +    {
    +        ULONG oldoffset;        /* the above tables. */
    +        ULONG newoffset;
    +        ULONG length;
    +        ULONG checksum;
    +    } tables[9];
    +
    +    BYTE *ptr;                  /* A pointer into the origional table directory. */
    +    ULONG x,y;                  /* General use loop countes. */
    +    int c;                      /* Input character. */
         int diff;
         ULONG nextoffset;
    -    int count;			/* How many `important' tables did we find? */
    +    int count;                  /* How many `important' tables did we find? */
     
         ptr = font->offset_table + 12;
         nextoffset=0;
    @@ -702,33 +767,35 @@
         ** Find the tables we want and store there vital
         ** statistics in tables[].
         */
    -    for(x=0; x < 9; x++ )
    -    	{
    -    	do  {
    -    	    diff = strncmp( (char*)ptr, table_names[x], 4 );
    -
    -	    if( diff > 0 )		/* If we are past it. */
    -	    	{
    -		tables[x].length = 0;
    -		diff = 0;
    -	    	}
    -	    else if( diff < 0 )		/* If we haven't hit it yet. */
    -	        {
    -	        ptr += 16;
    -	        }
    -	    else if( diff == 0 )	/* Here it is! */
    -	    	{
    -		tables[x].newoffset = nextoffset;
    -		tables[x].checksum = getULONG( ptr + 4 );
    -		tables[x].oldoffset = getULONG( ptr + 8 );
    -		tables[x].length = getULONG( ptr + 12 );
    -		nextoffset += ( ((tables[x].length + 3) / 4) * 4 );
    -		count++;
    -		ptr += 16;
    -	    	}
    -    	    } while(diff != 0);
    +    for (x=0; x < 9; x++ )
    +    {
    +        do
    +        {
    +            diff = strncmp( (char*)ptr, table_names[x], 4 );
    +
    +            if ( diff > 0 )             /* If we are past it. */
    +            {
    +                tables[x].length = 0;
    +                diff = 0;
    +            }
    +            else if ( diff < 0 )        /* If we haven't hit it yet. */
    +            {
    +                ptr += 16;
    +            }
    +            else if ( diff == 0 )       /* Here it is! */
    +            {
    +                tables[x].newoffset = nextoffset;
    +                tables[x].checksum = getULONG( ptr + 4 );
    +                tables[x].oldoffset = getULONG( ptr + 8 );
    +                tables[x].length = getULONG( ptr + 12 );
    +                nextoffset += ( ((tables[x].length + 3) / 4) * 4 );
    +                count++;
    +                ptr += 16;
    +            }
    +        }
    +        while (diff != 0);
     
    -    	} /* end of for loop which passes over the table directory */
    +    } /* end of for loop which passes over the table directory */
     
         /* Begin the sfnts array. */
         sfnts_start(stream);
    @@ -736,101 +803,110 @@
         /* Generate the offset table header */
         /* Start by copying the TrueType version number. */
         ptr = font->offset_table;
    -    for(x=0; x < 4; x++)
    -	{
    -	  sfnts_pputBYTE( stream,  *(ptr++) );
    -   	}
    +    for (x=0; x < 4; x++)
    +    {
    +        sfnts_pputBYTE( stream,  *(ptr++) );
    +    }
     
         /* Now, generate those silly numTables numbers. */
    -    sfnts_pputUSHORT(stream, count);		/* number of tables */
    -    if( count == 9 )
    -    	{
    -	  sfnts_pputUSHORT(stream, 7);		/* searchRange */
    -	  sfnts_pputUSHORT(stream, 3);		/* entrySelector */
    -	  sfnts_pputUSHORT(stream, 81);		/* rangeShift */
    -    	}
    -    #ifdef DEBUG_TRUETYPE
    +    sfnts_pputUSHORT(stream, count);            /* number of tables */
    +    if ( count == 9 )
    +    {
    +        sfnts_pputUSHORT(stream, 7);          /* searchRange */
    +        sfnts_pputUSHORT(stream, 3);          /* entrySelector */
    +        sfnts_pputUSHORT(stream, 81);         /* rangeShift */
    +    }
    +#ifdef DEBUG_TRUETYPE
         else
    -    	{
    -	debug("only %d tables selected",count);
    -    	}
    -    #endif
    +    {
    +        debug("only %d tables selected",count);
    +    }
    +#endif
     
         /* Now, emmit the table directory. */
    -    for(x=0; x < 9; x++)
    -    	{
    -	if( tables[x].length == 0 )	/* Skip missing tables */
    -	    continue;
    -
    -	/* Name */
    -	sfnts_pputBYTE( stream, table_names[x][0] );
    -	sfnts_pputBYTE( stream, table_names[x][1] );
    -	sfnts_pputBYTE( stream, table_names[x][2] );
    -	sfnts_pputBYTE( stream, table_names[x][3] );
    -
    -	/* Checksum */
    -	sfnts_pputULONG( stream, tables[x].checksum );
    -
    -	/* Offset */
    -	sfnts_pputULONG( stream, tables[x].newoffset + 12 + (count * 16) );
    -
    -	/* Length */
    -	sfnts_pputULONG( stream, tables[x].length );
    -    	}
    +    for (x=0; x < 9; x++)
    +    {
    +        if ( tables[x].length == 0 )    /* Skip missing tables */
    +        {
    +            continue;
    +        }
    +
    +        /* Name */
    +        sfnts_pputBYTE( stream, table_names[x][0] );
    +        sfnts_pputBYTE( stream, table_names[x][1] );
    +        sfnts_pputBYTE( stream, table_names[x][2] );
    +        sfnts_pputBYTE( stream, table_names[x][3] );
    +
    +        /* Checksum */
    +        sfnts_pputULONG( stream, tables[x].checksum );
    +
    +        /* Offset */
    +        sfnts_pputULONG( stream, tables[x].newoffset + 12 + (count * 16) );
    +
    +        /* Length */
    +        sfnts_pputULONG( stream, tables[x].length );
    +    }
     
         /* Now, send the tables */
    -    for(x=0; x < 9; x++)
    -    	{
    -    	if( tables[x].length == 0 )	/* skip tables that aren't there */
    -    	    continue;
    -
    -	#ifdef DEBUG_TRUETYPE
    -	debug("emmiting table '%s'",table_names[x]);
    -	#endif
    -
    -	/* 'glyf' table gets special treatment */
    -	if( strcmp(table_names[x],"glyf")==0 )
    -	    {
    -	      sfnts_glyf_table(stream,font,tables[x].oldoffset,tables[x].length);
    -	    }
    -	else			/* Other tables may not exceed */
    -	    {			/* 65535 bytes in length. */
    -	    if( tables[x].length > 65535 )
    -	    	throw TTException("TrueType font has a table which is too long");
    -
    -	    /* Start new string if necessary. */
    -	    sfnts_new_table(stream, tables[x].length);
    -
    -	    /* Seek to proper position in the file. */
    -    	    fseek( font->file, tables[x].oldoffset, SEEK_SET );
    -
    -	    /* Copy the bytes of the table. */
    -	    for( y=0; y < tables[x].length; y++ )
    -	        {
    -	        if( (c = fgetc(font->file)) == EOF )
    -	    	    throw TTException("TrueType font may be corrupt (reason 7)");
    -
    -	        sfnts_pputBYTE(stream, c);
    -	        }
    -	    }
    -
    -	/* Padd it out to a four byte boundary. */
    -	y=tables[x].length;
    -	while( (y % 4) != 0 )
    -	    {
    -	    sfnts_pputBYTE(stream, 0);
    -	    y++;
    -	    #ifdef DEBUG_TRUETYPE_INLINE
    -	    puts("\n% pad byte:\n");
    -	    #endif
    -	    }
    +    for (x=0; x < 9; x++)
    +    {
    +        if ( tables[x].length == 0 )    /* skip tables that aren't there */
    +        {
    +            continue;
    +        }
     
    -    	} /* End of loop for all tables */
    +#ifdef DEBUG_TRUETYPE
    +        debug("emmiting table '%s'",table_names[x]);
    +#endif
    +
    +        /* 'glyf' table gets special treatment */
    +        if ( strcmp(table_names[x],"glyf")==0 )
    +        {
    +            sfnts_glyf_table(stream,font,tables[x].oldoffset,tables[x].length);
    +        }
    +        else                    /* Other tables may not exceed */
    +        {
    +            /* 65535 bytes in length. */
    +            if ( tables[x].length > 65535 )
    +            {
    +                throw TTException("TrueType font has a table which is too long");
    +            }
    +
    +            /* Start new string if necessary. */
    +            sfnts_new_table(stream, tables[x].length);
    +
    +            /* Seek to proper position in the file. */
    +            fseek( font->file, tables[x].oldoffset, SEEK_SET );
    +
    +            /* Copy the bytes of the table. */
    +            for ( y=0; y < tables[x].length; y++ )
    +            {
    +                if ( (c = fgetc(font->file)) == EOF )
    +                {
    +                    throw TTException("TrueType font may be corrupt (reason 7)");
    +                }
    +
    +                sfnts_pputBYTE(stream, c);
    +            }
    +        }
    +
    +        /* Padd it out to a four byte boundary. */
    +        y=tables[x].length;
    +        while ( (y % 4) != 0 )
    +        {
    +            sfnts_pputBYTE(stream, 0);
    +            y++;
    +#ifdef DEBUG_TRUETYPE_INLINE
    +            puts("\n% pad byte:\n");
    +#endif
    +        }
    +
    +    } /* End of loop for all tables */
     
         /* Close the array. */
         sfnts_end_string(stream);
         stream.putline("]def");
    -    } /* end of ttfont_sfnts() */
    +} /* end of ttfont_sfnts() */
     
     /*--------------------------------------------------------------
     ** Create the CharStrings dictionary which will translate
    @@ -841,51 +917,53 @@
     ** this array will instead convert PostScript character names
     ** to executable proceedures.
     --------------------------------------------------------------*/
    -const char *Apple_CharStrings[]={
    -".notdef",".null","nonmarkingreturn","space","exclam","quotedbl","numbersign",
    -"dollar","percent","ampersand","quotesingle","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","asciicircum","underscore","grave",
    -"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","asciitilde",
    -"Adieresis","Aring","Ccedilla","Eacute","Ntilde","Odieresis","Udieresis",
    -"aacute","agrave","acircumflex","adieresis","atilde","aring","ccedilla",
    -"eacute","egrave","ecircumflex","edieresis","iacute","igrave","icircumflex",
    -"idieresis","ntilde","oacute","ograve","ocircumflex","odieresis","otilde",
    -"uacute","ugrave","ucircumflex","udieresis","dagger","degree","cent",
    -"sterling","section","bullet","paragraph","germandbls","registered",
    -"copyright","trademark","acute","dieresis","notequal","AE","Oslash",
    -"infinity","plusminus","lessequal","greaterequal","yen","mu","partialdiff",
    -"summation","product","pi","integral","ordfeminine","ordmasculine","Omega",
    -"ae","oslash","questiondown","exclamdown","logicalnot","radical","florin",
    -"approxequal","Delta","guillemotleft","guillemotright","ellipsis",
    -"nobreakspace","Agrave","Atilde","Otilde","OE","oe","endash","emdash",
    -"quotedblleft","quotedblright","quoteleft","quoteright","divide","lozenge",
    -"ydieresis","Ydieresis","fraction","currency","guilsinglleft","guilsinglright",
    -"fi","fl","daggerdbl","periodcentered","quotesinglbase","quotedblbase",
    -"perthousand","Acircumflex","Ecircumflex","Aacute","Edieresis","Egrave",
    -"Iacute","Icircumflex","Idieresis","Igrave","Oacute","Ocircumflex","apple",
    -"Ograve","Uacute","Ucircumflex","Ugrave","dotlessi","circumflex","tilde",
    -"macron","breve","dotaccent","ring","cedilla","hungarumlaut","ogonek","caron",
    -"Lslash","lslash","Scaron","scaron","Zcaron","zcaron","brokenbar","Eth","eth",
    -"Yacute","yacute","Thorn","thorn","minus","multiply","onesuperior",
    -"twosuperior","threesuperior","onehalf","onequarter","threequarters","franc",
    -"Gbreve","gbreve","Idot","Scedilla","scedilla","Cacute","cacute","Ccaron",
    -"ccaron","dmacron","markingspace","capslock","shift","propeller","enter",
    -"markingtabrtol","markingtabltor","control","markingdeleteltor",
    -"markingdeletertol","option","escape","parbreakltor","parbreakrtol",
    -"newpage","checkmark","linebreakltor","linebreakrtol","markingnobreakspace",
    -"diamond","appleoutline"};
    +const char *Apple_CharStrings[]=
    +{
    +    ".notdef",".null","nonmarkingreturn","space","exclam","quotedbl","numbersign",
    +    "dollar","percent","ampersand","quotesingle","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","asciicircum","underscore","grave",
    +    "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","asciitilde",
    +    "Adieresis","Aring","Ccedilla","Eacute","Ntilde","Odieresis","Udieresis",
    +    "aacute","agrave","acircumflex","adieresis","atilde","aring","ccedilla",
    +    "eacute","egrave","ecircumflex","edieresis","iacute","igrave","icircumflex",
    +    "idieresis","ntilde","oacute","ograve","ocircumflex","odieresis","otilde",
    +    "uacute","ugrave","ucircumflex","udieresis","dagger","degree","cent",
    +    "sterling","section","bullet","paragraph","germandbls","registered",
    +    "copyright","trademark","acute","dieresis","notequal","AE","Oslash",
    +    "infinity","plusminus","lessequal","greaterequal","yen","mu","partialdiff",
    +    "summation","product","pi","integral","ordfeminine","ordmasculine","Omega",
    +    "ae","oslash","questiondown","exclamdown","logicalnot","radical","florin",
    +    "approxequal","Delta","guillemotleft","guillemotright","ellipsis",
    +    "nobreakspace","Agrave","Atilde","Otilde","OE","oe","endash","emdash",
    +    "quotedblleft","quotedblright","quoteleft","quoteright","divide","lozenge",
    +    "ydieresis","Ydieresis","fraction","currency","guilsinglleft","guilsinglright",
    +    "fi","fl","daggerdbl","periodcentered","quotesinglbase","quotedblbase",
    +    "perthousand","Acircumflex","Ecircumflex","Aacute","Edieresis","Egrave",
    +    "Iacute","Icircumflex","Idieresis","Igrave","Oacute","Ocircumflex","apple",
    +    "Ograve","Uacute","Ucircumflex","Ugrave","dotlessi","circumflex","tilde",
    +    "macron","breve","dotaccent","ring","cedilla","hungarumlaut","ogonek","caron",
    +    "Lslash","lslash","Scaron","scaron","Zcaron","zcaron","brokenbar","Eth","eth",
    +    "Yacute","yacute","Thorn","thorn","minus","multiply","onesuperior",
    +    "twosuperior","threesuperior","onehalf","onequarter","threequarters","franc",
    +    "Gbreve","gbreve","Idot","Scedilla","scedilla","Cacute","cacute","Ccaron",
    +    "ccaron","dmacron","markingspace","capslock","shift","propeller","enter",
    +    "markingtabrtol","markingtabltor","control","markingdeleteltor",
    +    "markingdeletertol","option","escape","parbreakltor","parbreakrtol",
    +    "newpage","checkmark","linebreakltor","linebreakrtol","markingnobreakspace",
    +    "diamond","appleoutline"
    +};
     
     /*
     ** This routine is called by the one below.
     ** It is also called from pprdrv_tt2.c
     */
     const char *ttfont_CharStrings_getname(struct TTFONT *font, int charindex)
    -    {
    +{
         int GlyphIndex;
         static char temp[80];
         char *ptr;
    @@ -893,101 +971,110 @@
     
         GlyphIndex = (int)getUSHORT( font->post_table + 34 + (charindex * 2) );
     
    -    if( GlyphIndex <= 257 )		/* If a standard Apple name, */
    -	{
    -	return Apple_CharStrings[GlyphIndex];
    -	}
    -    else				/* Otherwise, use one */
    -	{				/* of the pascal strings. */
    -	GlyphIndex -= 258;
    -
    -	/* Set pointer to start of Pascal strings. */
    -	ptr = (char*)(font->post_table + 34 + (font->numGlyphs * 2));
    -
    -	len = (ULONG)*(ptr++);	/* Step thru the strings */
    -	while(GlyphIndex--)		/* until we get to the one */
    -	    {			/* that we want. */
    -	    ptr += len;
    -	    len = (ULONG)*(ptr++);
    -	    }
    -
    -	if( len >= sizeof(temp) )
    -	    throw TTException("TrueType font file contains a very long PostScript name");
    -
    -	strncpy(temp,ptr,len);	/* Copy the pascal string into */
    -	temp[len]=(char)NULL;	/* a buffer and make it ASCIIz. */
    -
    -	return temp;
    -	}
    -    } /* end of ttfont_CharStrings_getname() */
    +    if ( GlyphIndex <= 257 )            /* If a standard Apple name, */
    +    {
    +        return Apple_CharStrings[GlyphIndex];
    +    }
    +    else                                /* Otherwise, use one */
    +    {
    +        /* of the pascal strings. */
    +        GlyphIndex -= 258;
    +
    +        /* Set pointer to start of Pascal strings. */
    +        ptr = (char*)(font->post_table + 34 + (font->numGlyphs * 2));
    +
    +        len = (ULONG)*(ptr++);  /* Step thru the strings */
    +        while (GlyphIndex--)            /* until we get to the one */
    +        {
    +            /* that we want. */
    +            ptr += len;
    +            len = (ULONG)*(ptr++);
    +        }
    +
    +        if ( len >= sizeof(temp) )
    +        {
    +            throw TTException("TrueType font file contains a very long PostScript name");
    +        }
    +
    +        strncpy(temp,ptr,len);  /* Copy the pascal string into */
    +        temp[len]=(char)NULL;   /* a buffer and make it ASCIIz. */
    +
    +        return temp;
    +    }
    +} /* end of ttfont_CharStrings_getname() */
     
     /*
     ** This is the central routine of this section.
     */
     void ttfont_CharStrings(TTStreamWriter& stream, struct TTFONT *font, std::vector& glyph_ids)
    -    {
    +{
         Fixed post_format;
     
         /* The 'post' table format number. */
         post_format = getFixed( font->post_table );
     
    -    if( post_format.whole != 2 || post_format.fraction != 0 )
    -    	throw TTException("TrueType fontdoes not have a format 2.0 'post' table");
    +    if ( post_format.whole != 2 || post_format.fraction != 0 )
    +    {
    +        throw TTException("TrueType fontdoes not have a format 2.0 'post' table");
    +    }
     
         /* Emmit the start of the PostScript code to define the dictionary. */
         stream.printf("/CharStrings %d dict dup begin\n", glyph_ids.size());
     
         /* Emmit one key-value pair for each glyph. */
    -    for(std::vector::const_iterator i = glyph_ids.begin();
    -	i != glyph_ids.end(); ++i)
    -    	{
    -	if(font->target_type == PS_TYPE_42)	/* type 42 */
    - 	    {
    - 	    stream.printf("/%s %d def\n",ttfont_CharStrings_getname(font, *i), *i);
    -	    }
    -	else				/* type 3 */
    - 	    {
    - 	    stream.printf("/%s{",ttfont_CharStrings_getname(font, *i));
    -
    -	    tt_type3_charproc(stream, font, *i);
    -
    -	    stream.putline("}_d");	/* "} bind def" */
    - 	    }
    -    	}
    +    for (std::vector::const_iterator i = glyph_ids.begin();
    +            i != glyph_ids.end(); ++i)
    +    {
    +        if ((font->target_type == PS_TYPE_42 ||
    +             font->target_type == PS_TYPE_42_3_HYBRID)
    +            && *i < 256) /* type 42 */
    +        {
    +            stream.printf("/%s %d def\n",ttfont_CharStrings_getname(font, *i), *i);
    +        }
    +        else                            /* type 3 */
    +        {
    +            stream.printf("/%s{",ttfont_CharStrings_getname(font, *i));
    +
    +            tt_type3_charproc(stream, font, *i);
    +
    +            stream.putline("}_d");      /* "} bind def" */
    +        }
    +    }
     
         stream.putline("end readonly def");
    -    } /* end of ttfont_CharStrings() */
    +} /* end of ttfont_CharStrings() */
     
     /*----------------------------------------------------------------
     ** Emmit the code to finish up the dictionary and turn
     ** it into a font.
     ----------------------------------------------------------------*/
     void ttfont_trailer(TTStreamWriter& stream, struct TTFONT *font)
    -    {
    +{
         /* If we are generating a type 3 font, we need to provide */
         /* a BuildGlyph and BuildChar proceedures. */
    -    if( font->target_type == PS_TYPE_3 )
    -    	{
    -	stream.put_char('\n');
    -
    -	stream.putline("/BuildGlyph");
    -	stream.putline(" {exch begin");		/* start font dictionary */
    -	stream.putline(" CharStrings exch");
    -	stream.putline(" 2 copy known not{pop /.notdef}if");
    -	stream.putline(" true 3 1 roll get exec");
    -	stream.putline(" end}_d");
    -
    -	stream.put_char('\n');
    -
    -	/* This proceedure is for compatiblity with */
    -	/* level 1 interpreters. */
    -	stream.putline("/BuildChar {");
    -	stream.putline(" 1 index /Encoding get exch get");
    -	stream.putline(" 1 index /BuildGlyph get exec");
    -	stream.putline("}_d");
    +    if (font->target_type == PS_TYPE_3 ||
    +        font->target_type == PS_TYPE_42_3_HYBRID)
    +    {
    +        stream.put_char('\n');
     
    -	stream.put_char('\n');
    -    	}
    +        stream.putline("/BuildGlyph");
    +        stream.putline(" {exch begin");         /* start font dictionary */
    +        stream.putline(" CharStrings exch");
    +        stream.putline(" 2 copy known not{pop /.notdef}if");
    +        stream.putline(" true 3 1 roll get exec");
    +        stream.putline(" end}_d");
    +
    +        stream.put_char('\n');
    +
    +        /* This proceedure is for compatiblity with */
    +        /* level 1 interpreters. */
    +        stream.putline("/BuildChar {");
    +        stream.putline(" 1 index /Encoding get exch get");
    +        stream.putline(" 1 index /BuildGlyph get exec");
    +        stream.putline("}_d");
    +
    +        stream.put_char('\n');
    +    }
     
         /* If we are generating a type 42 font, we need to check to see */
         /* if this PostScript interpreter understands type 42 fonts.  If */
    @@ -996,159 +1083,203 @@
         /* I found out how to do this by examining a TrueType font */
         /* generated by a Macintosh.  That is where the TrueType interpreter */
         /* setup instructions and part of BuildGlyph came from. */
    -    else if( font->target_type == PS_TYPE_42 )
    -    	{
    -	stream.put_char('\n');
    -
    -	/* If we have no "resourcestatus" command, or FontType 42 */
    -	/* is unknown, leave "true" on the stack. */
    -	stream.putline("systemdict/resourcestatus known");
    -	stream.putline(" {42 /FontType resourcestatus");
    -	stream.putline("   {pop pop false}{true}ifelse}");
    -	stream.putline(" {true}ifelse");
    -
    -	/* If true, execute code to produce an error message if */
    -	/* we can't find Apple's TrueDict in VM. */
    -	stream.putline("{/TrueDict where{pop}{(%%[ Error: no TrueType rasterizer ]%%)= flush}ifelse");
    -
    -	/* Since we are expected to use Apple's TrueDict TrueType */
    -	/* reasterizer, change the font type to 3. */
    -    	stream.putline("/FontType 3 def");
    -
    -	/* Define a string to hold the state of the Apple */
    -	/* TrueType interpreter. */
    -    	stream.putline(" /TrueState 271 string def");
    -
    -	/* It looks like we get information about the resolution */
    -	/* of the printer and store it in the TrueState string. */
    -    	stream.putline(" TrueDict begin sfnts save");
    -    	stream.putline(" 72 0 matrix defaultmatrix dtransform dup");
    -    	stream.putline(" mul exch dup mul add sqrt cvi 0 72 matrix");
    -    	stream.putline(" defaultmatrix dtransform dup mul exch dup");
    -    	stream.putline(" mul add sqrt cvi 3 -1 roll restore");
    -    	stream.putline(" TrueState initer end");
    -
    -	/* This BuildGlyph procedure will look the name up in the */
    -	/* CharStrings array, and then check to see if what it gets */
    -	/* is a procedure.  If it is, it executes it, otherwise, it */
    -	/* lets the TrueType rasterizer loose on it. */
    -
    -	/* When this proceedure is executed the stack contains */
    -	/* the font dictionary and the character name.  We */
    -	/* exchange arguments and move the dictionary to the */
    -	/* dictionary stack. */
    -	stream.putline(" /BuildGlyph{exch begin");
    -		/* stack: charname */
    -
    -	/* Put two copies of CharStrings on the stack and consume */
    -	/* one testing to see if the charname is defined in it, */
    -	/* leave the answer on the stack. */
    -	stream.putline("  CharStrings dup 2 index known");
    -		/* stack: charname CharStrings bool */
    -
    -	/* Exchange the CharStrings dictionary and the charname, */
    -	/* but if the answer was false, replace the character name */
    -	/* with ".notdef". */
    -	stream.putline("    {exch}{exch pop /.notdef}ifelse");
    -		/* stack: CharStrings charname */
    -
    -	/* Get the value from the CharStrings dictionary and see */
    -	/* if it is executable. */
    -	stream.putline("  get dup xcheck");
    -		/* stack: CharStrings_entry */
    -
    -	/* If is a proceedure.  Execute according to RBIIp 277-278. */
    -	stream.putline("    {currentdict systemdict begin begin exec end end}");
    -
    -	/* Is a TrueType character index, let the rasterizer at it. */
    -	stream.putline("    {TrueDict begin /bander load cvlit exch TrueState render end}");
    -
    -	stream.putline("    ifelse");
    -
    -	/* Pop the font's dictionary off the stack. */
    -	stream.putline(" end}bind def");
    -
    -	/* This is the level 1 compatibility BuildChar procedure. */
    -	/* See RBIIp 281. */
    -	stream.putline(" /BuildChar{");
    -	stream.putline("  1 index /Encoding get exch get");
    -	stream.putline("  1 index /BuildGlyph get exec");
    -	stream.putline(" }bind def");
    -
    -	/* Here we close the condition which is true */
    -	/* if the printer has no built-in TrueType */
    -	/* rasterizer. */
    -	stream.putline("}if");
    -	stream.put_char('\n');
    -    	} /* end of if Type 42 not understood. */
    +    if (font->target_type == PS_TYPE_42 ||
    +        font->target_type == PS_TYPE_42_3_HYBRID)
    +    {
    +        stream.put_char('\n');
    +
    +        /* If we have no "resourcestatus" command, or FontType 42 */
    +        /* is unknown, leave "true" on the stack. */
    +        stream.putline("systemdict/resourcestatus known");
    +        stream.putline(" {42 /FontType resourcestatus");
    +        stream.putline("   {pop pop false}{true}ifelse}");
    +        stream.putline(" {true}ifelse");
    +
    +        /* If true, execute code to produce an error message if */
    +        /* we can't find Apple's TrueDict in VM. */
    +        stream.putline("{/TrueDict where{pop}{(%%[ Error: no TrueType rasterizer ]%%)= flush}ifelse");
    +
    +        /* Since we are expected to use Apple's TrueDict TrueType */
    +        /* reasterizer, change the font type to 3. */
    +        stream.putline("/FontType 3 def");
    +
    +        /* Define a string to hold the state of the Apple */
    +        /* TrueType interpreter. */
    +        stream.putline(" /TrueState 271 string def");
    +
    +        /* It looks like we get information about the resolution */
    +        /* of the printer and store it in the TrueState string. */
    +        stream.putline(" TrueDict begin sfnts save");
    +        stream.putline(" 72 0 matrix defaultmatrix dtransform dup");
    +        stream.putline(" mul exch dup mul add sqrt cvi 0 72 matrix");
    +        stream.putline(" defaultmatrix dtransform dup mul exch dup");
    +        stream.putline(" mul add sqrt cvi 3 -1 roll restore");
    +        stream.putline(" TrueState initer end");
    +
    +        /* This BuildGlyph procedure will look the name up in the */
    +        /* CharStrings array, and then check to see if what it gets */
    +        /* is a procedure.  If it is, it executes it, otherwise, it */
    +        /* lets the TrueType rasterizer loose on it. */
    +
    +        /* When this proceedure is executed the stack contains */
    +        /* the font dictionary and the character name.  We */
    +        /* exchange arguments and move the dictionary to the */
    +        /* dictionary stack. */
    +        stream.putline(" /BuildGlyph{exch begin");
    +        /* stack: charname */
    +
    +        /* Put two copies of CharStrings on the stack and consume */
    +        /* one testing to see if the charname is defined in it, */
    +        /* leave the answer on the stack. */
    +        stream.putline("  CharStrings dup 2 index known");
    +        /* stack: charname CharStrings bool */
    +
    +        /* Exchange the CharStrings dictionary and the charname, */
    +        /* but if the answer was false, replace the character name */
    +        /* with ".notdef". */
    +        stream.putline("    {exch}{exch pop /.notdef}ifelse");
    +        /* stack: CharStrings charname */
    +
    +        /* Get the value from the CharStrings dictionary and see */
    +        /* if it is executable. */
    +        stream.putline("  get dup xcheck");
    +        /* stack: CharStrings_entry */
    +
    +        /* If is a proceedure.  Execute according to RBIIp 277-278. */
    +        stream.putline("    {currentdict systemdict begin begin exec end end}");
    +
    +        /* Is a TrueType character index, let the rasterizer at it. */
    +        stream.putline("    {TrueDict begin /bander load cvlit exch TrueState render end}");
    +
    +        stream.putline("    ifelse");
    +
    +        /* Pop the font's dictionary off the stack. */
    +        stream.putline(" end}bind def");
    +
    +        /* This is the level 1 compatibility BuildChar procedure. */
    +        /* See RBIIp 281. */
    +        stream.putline(" /BuildChar{");
    +        stream.putline("  1 index /Encoding get exch get");
    +        stream.putline("  1 index /BuildGlyph get exec");
    +        stream.putline(" }bind def");
    +
    +        /* Here we close the condition which is true */
    +        /* if the printer has no built-in TrueType */
    +        /* rasterizer. */
    +        stream.putline("}if");
    +        stream.put_char('\n');
    +    } /* end of if Type 42 not understood. */
     
         stream.putline("FontName currentdict end definefont pop");
         /* stream.putline("%%EOF"); */
    -    } /* end of ttfont_trailer() */
    +} /* end of ttfont_trailer() */
     
     /*------------------------------------------------------------------
     ** This is the externally callable routine which inserts the font.
     ------------------------------------------------------------------*/
     
     void read_font(const char *filename, font_type_enum target_type, std::vector& glyph_ids, TTFONT& font)
    -    {
    +{
         BYTE *ptr;
     
         /* Decide what type of PostScript font we will be generating. */
         font.target_type = target_type;
     
    +    if (font.target_type == PS_TYPE_42)
    +    {
    +        bool has_low = false;
    +        bool has_high = false;
    +
    +        for (std::vector::const_iterator i = glyph_ids.begin();
    +                i != glyph_ids.end(); ++i)
    +        {
    +            if (*i > 255)
    +            {
    +                has_high = true;
    +                if (has_low) break;
    +            }
    +            else
    +            {
    +                has_low = true;
    +                if (has_high) break;
    +            }
    +        }
    +
    +        if (has_high && has_low)
    +        {
    +            font.target_type = PS_TYPE_42_3_HYBRID;
    +        }
    +        else if (has_high && !has_low)
    +        {
    +            font.target_type = PS_TYPE_3;
    +        }
    +    }
    +
         /* Save the file name for error messages. */
         font.filename=filename;
     
         /* Open the font file */
    -    if( (font.file = fopen(filename,"rb")) == (FILE*)NULL )
    -    	throw TTException("Failed to open TrueType font");
    +    if ( (font.file = fopen(filename,"rb")) == (FILE*)NULL )
    +    {
    +        throw TTException("Failed to open TrueType font");
    +    }
     
         /* Allocate space for the unvarying part of the offset table. */
         assert(font.offset_table == NULL);
         font.offset_table = (BYTE*)calloc( 12, sizeof(BYTE) );
     
         /* Read the first part of the offset table. */
    -    if( fread( font.offset_table, sizeof(BYTE), 12, font.file ) != 12 )
    -    	throw TTException("TrueType font may be corrupt (reason 1)");
    +    if ( fread( font.offset_table, sizeof(BYTE), 12, font.file ) != 12 )
    +    {
    +        throw TTException("TrueType font may be corrupt (reason 1)");
    +    }
     
         /* Determine how many directory entries there are. */
         font.numTables = getUSHORT( font.offset_table + 4 );
    -    #ifdef DEBUG_TRUETYPE
    +#ifdef DEBUG_TRUETYPE
         debug("numTables=%d",(int)font.numTables);
    -    #endif
    +#endif
     
         /* Expand the memory block to hold the whole thing. */
         font.offset_table = (BYTE*)realloc( font.offset_table, sizeof(BYTE) * (12 + font.numTables * 16) );
     
         /* Read the rest of the table directory. */
    -    if( fread( font.offset_table + 12, sizeof(BYTE), (font.numTables*16), font.file ) != (font.numTables*16) )
    -    	throw TTException("TrueType font may be corrupt (reason 2)");
    +    if ( fread( font.offset_table + 12, sizeof(BYTE), (font.numTables*16), font.file ) != (font.numTables*16) )
    +    {
    +        throw TTException("TrueType font may be corrupt (reason 2)");
    +    }
     
         /* Extract information from the "Offset" table. */
         font.TTVersion = getFixed( font.offset_table );
     
         /* Load the "head" table and extract information from it. */
         ptr = GetTable(&font, "head");
    -    try {
    -      font.MfrRevision = getFixed( ptr + 4 );		/* font revision number */
    -      font.unitsPerEm = getUSHORT( ptr + 18 );
    -      font.HUPM = font.unitsPerEm / 2;
    +    try
    +    {
    +        font.MfrRevision = getFixed( ptr + 4 );           /* font revision number */
    +        font.unitsPerEm = getUSHORT( ptr + 18 );
    +        font.HUPM = font.unitsPerEm / 2;
     #ifdef DEBUG_TRUETYPE
    -      debug("unitsPerEm=%d",(int)font.unitsPerEm);
    +        debug("unitsPerEm=%d",(int)font.unitsPerEm);
     #endif
    -      font.llx = topost2( getFWord( ptr + 36 ) );		/* bounding box info */
    -      font.lly = topost2( getFWord( ptr + 38 ) );
    -      font.urx = topost2( getFWord( ptr + 40 ) );
    -      font.ury = topost2( getFWord( ptr + 42 ) );
    -      font.indexToLocFormat = getSHORT( ptr + 50 );	/* size of 'loca' data */
    -      if(font.indexToLocFormat != 0 && font.indexToLocFormat != 1)
    -    	throw TTException("TrueType font is unusable because indexToLocFormat != 0");
    -      if( getSHORT(ptr+52) != 0 )
    -    	throw TTException("TrueType font is unusable because glyphDataFormat != 0");
    -    } catch (TTException& ) {
    -      free(ptr);
    -      throw;
    +        font.llx = topost2( getFWord( ptr + 36 ) );               /* bounding box info */
    +        font.lly = topost2( getFWord( ptr + 38 ) );
    +        font.urx = topost2( getFWord( ptr + 40 ) );
    +        font.ury = topost2( getFWord( ptr + 42 ) );
    +        font.indexToLocFormat = getSHORT( ptr + 50 );     /* size of 'loca' data */
    +        if (font.indexToLocFormat != 0 && font.indexToLocFormat != 1)
    +        {
    +            throw TTException("TrueType font is unusable because indexToLocFormat != 0");
    +        }
    +        if ( getSHORT(ptr+52) != 0 )
    +        {
    +            throw TTException("TrueType font is unusable because glyphDataFormat != 0");
    +        }
    +    }
    +    catch (TTException& )
    +    {
    +        free(ptr);
    +        throw;
         }
         free(ptr);
     
    @@ -1163,36 +1294,42 @@
         /* If we are generating a Type 3 font, we will need to */
         /* have the 'loca' and 'glyf' tables arround while */
         /* we are generating the CharStrings. */
    -    if(font.target_type == PS_TYPE_3 || font.target_type == PDF_TYPE_3)
    -    	{
    -	BYTE *ptr;			/* We need only one value */
    -	ptr = GetTable(&font, "hhea");
    -	font.numberOfHMetrics = getUSHORT(ptr + 34);
    -	free(ptr);
    -
    -	assert(font.loca_table == NULL);
    -	font.loca_table = GetTable(&font,"loca");
    -	assert(font.glyf_table == NULL);
    -	font.glyf_table = GetTable(&font,"glyf");
    -	assert(font.hmtx_table == NULL);
    -	font.hmtx_table = GetTable(&font,"hmtx");
    -    }
    -
    -    if (glyph_ids.size() == 0) {
    -	glyph_ids.clear();
    -	glyph_ids.reserve(font.numGlyphs);
    -	for (int x = 0; x < font.numGlyphs; ++x) {
    -	    glyph_ids.push_back(x);
    -	}
    -    } else if (font.target_type == PS_TYPE_3) {
    -	ttfont_add_glyph_dependencies(&font, glyph_ids);
    +    if (font.target_type == PS_TYPE_3 || font.target_type == PDF_TYPE_3 ||
    +            font.target_type == PS_TYPE_42_3_HYBRID)
    +    {
    +        BYTE *ptr;                      /* We need only one value */
    +        ptr = GetTable(&font, "hhea");
    +        font.numberOfHMetrics = getUSHORT(ptr + 34);
    +        free(ptr);
    +
    +        assert(font.loca_table == NULL);
    +        font.loca_table = GetTable(&font,"loca");
    +        assert(font.glyf_table == NULL);
    +        font.glyf_table = GetTable(&font,"glyf");
    +        assert(font.hmtx_table == NULL);
    +        font.hmtx_table = GetTable(&font,"hmtx");
    +    }
    +
    +    if (glyph_ids.size() == 0)
    +    {
    +        glyph_ids.clear();
    +        glyph_ids.reserve(font.numGlyphs);
    +        for (int x = 0; x < font.numGlyphs; ++x)
    +        {
    +            glyph_ids.push_back(x);
    +        }
    +    }
    +    else if (font.target_type == PS_TYPE_3 ||
    +             font.target_type == PS_TYPE_42_3_HYBRID)
    +    {
    +        ttfont_add_glyph_dependencies(&font, glyph_ids);
         }
     
    -    } /* end of insert_ttfont() */
    +} /* end of insert_ttfont() */
     
     void insert_ttfont(const char *filename, TTStreamWriter& stream,
    -		   font_type_enum target_type, std::vector& glyph_ids)
    -    {
    +                   font_type_enum target_type, std::vector& glyph_ids)
    +{
         struct TTFONT font;
     
         read_font(filename, target_type, glyph_ids, font);
    @@ -1201,15 +1338,18 @@
         ttfont_header(stream, &font);
     
         /* Define the encoding. */
    -    ttfont_encoding(stream);
    +    ttfont_encoding(stream, &font, glyph_ids, target_type);
     
         /* Insert FontInfo dictionary. */
         ttfont_FontInfo(stream, &font);
     
         /* If we are generating a type 42 font, */
         /* emmit the sfnts array. */
    -    if( font.target_type == PS_TYPE_42 )
    -      ttfont_sfnts(stream, &font);
    +    if (font.target_type == PS_TYPE_42 ||
    +        font.target_type == PS_TYPE_42_3_HYBRID)
    +    {
    +        ttfont_sfnts(stream, &font);
    +    }
     
         /* Emmit the CharStrings array. */
         ttfont_CharStrings(stream, &font, glyph_ids);
    @@ -1217,31 +1357,37 @@
         /* Send the font trailer. */
         ttfont_trailer(stream, &font);
     
    -    } /* end of insert_ttfont() */
    +} /* end of insert_ttfont() */
     
    -class StringStreamWriter : public TTStreamWriter {
    +class StringStreamWriter : public TTStreamWriter
    +{
         std::ostringstream oss;
     
     public:
    -    void write(const char* a) {
    -	oss << a;
    +    void write(const char* a)
    +    {
    +        oss << a;
         }
    -    std::string str() {
    -	return oss.str();
    +
    +    std::string str()
    +    {
    +        return oss.str();
         }
     };
     
    -void get_pdf_charprocs(const char *filename, std::vector& glyph_ids, TTDictionaryCallback& dict) {
    +void get_pdf_charprocs(const char *filename, std::vector& glyph_ids, TTDictionaryCallback& dict)
    +{
         struct TTFONT font;
     
         read_font(filename, PDF_TYPE_3, glyph_ids, font);
     
         for (std::vector::const_iterator i = glyph_ids.begin();
    -	 i != glyph_ids.end(); ++i) {
    -	StringStreamWriter writer;
    -	tt_type3_charproc(writer, &font, *i);
    -	const char* name = ttfont_CharStrings_getname(&font, *i);
    -	dict.add_pair(name, writer.str().c_str());
    +            i != glyph_ids.end(); ++i)
    +    {
    +        StringStreamWriter writer;
    +        tt_type3_charproc(writer, &font, *i);
    +        const char* name = ttfont_CharStrings_getname(&font, *i);
    +        dict.add_pair(name, writer.str().c_str());
         }
     }
     
    @@ -1259,11 +1405,16 @@
         loca_table(NULL),
         glyf_table(NULL),
         hmtx_table(NULL)
    -{ }
    +{
    +
    +}
     
    -TTFONT::~TTFONT() {
    +TTFONT::~TTFONT()
    +{
         if (file)
    -	fclose(file);
    +    {
    +        fclose(file);
    +    }
         free(PostName);
         free(FullName);
         free(FamilyName);